gecko-dev/tools/mercurial/hgsetup/update.py
Andrew Halberstadt b458452297 Bug 1101773 - Add an --update-only option to |mach mercurial-setup| for updating extensions without running the wizard, r=gps
--HG--
extra : rebase_source : 93de55544f2f907255a286b1074ed201de62a46b
2014-11-19 15:01:04 -05:00

93 lines
2.8 KiB
Python

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this,
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
from __future__ import unicode_literals
import errno
import os
import which
from configobj import ConfigObjError
from mozversioncontrol.repoupdate import update_mercurial_repo
from .config import (
HgIncludeException,
MercurialConfig,
HOST_FINGERPRINTS,
)
FINISHED = '''
Your Mercurial recommended extensions are now up to date!
'''.lstrip()
class MercurialUpdater(object):
def __init__(self, state_dir):
self.state_dir = os.path.normpath(state_dir)
self.ext_dir = os.path.join(self.state_dir, 'mercurial', 'extensions')
self.vcs_tools_dir = os.path.join(self.state_dir, 'version-control-tools')
def update_all(self, config_paths):
try:
os.makedirs(self.ext_dir)
except OSError as e:
if e.errno != errno.EEXIST:
raise
try:
hg = which.which('hg')
except which.WhichError as e:
print(e)
print('Try running |mach bootstrap| to ensure your environment is '
'up to date.')
return 1
try:
c = MercurialConfig(config_paths)
except ConfigObjError as e:
print('Error importing existing Mercurial config!\n')
for error in e.errors:
print(error.message)
return 1
except HgIncludeException as e:
print(e.message)
return 1
if 'mqext' in c.extensions:
self.update_mercurial_repo(
hg,
'https://bitbucket.org/sfink/mqext',
os.path.join(self.ext_dir, 'mqext'),
'default',
'Ensuring mqext is up to date...')
if os.path.isdir(self.vcs_tools_dir):
self.update_mercurial_repo(
hg,
'https://hg.mozilla.org/hgcustom/version-control-tools',
self.vcs_tools_dir,
'default',
'Ensuring version-control-tools is up to date...')
print(FINISHED)
return 0
def update_mercurial_repo(self, hg, url, dest, branch, msg):
# We always pass the host fingerprints that we "know" to be canonical
# because the existing config may have outdated fingerprints and this
# may cause Mercurial to abort.
return self._update_repo(hg, url, dest, branch, msg,
update_mercurial_repo, hostfingerprints=HOST_FINGERPRINTS)
def _update_repo(self, binary, url, dest, branch, msg, fn, *args, **kwargs):
print('=' * 80)
print(msg)
try:
fn(binary, url, dest, branch, *args, **kwargs)
finally:
print('=' * 80)
print('')