Bug 1279563 - Clone unified Firefox repository; r=glandium

https://hg.mozilla.org/firefox now exists. It is a unified Firefox
repository containing the heads of all the major Firefox repos
(mozilla-central, inbound, aurora, beta, release, esrs, etc).

Having 1 unified repository is more useful and incurs less overhead
than N separate repos. We want to encourage the use of the unified
repository. So, we start cloning from it.

The unified repo on the server is configured in such a way that
manifest delta chains can become very long - over 30,000 deltas. This
can make manifest reading very slow and slow down many Mercurial
operations. The server compensates for this by setting
format.maxchainlen=10000 to limit the delta chains to 10,000.
Unfortunately, this setting is not preserved when clients do a
traditional clone: the changegroup consists of a single delta chain
and the client will use its own settings (often the default) to
break the chain. This will result in the client re-creating very long
delta chains. So, as part of initializing the new repo we configure
format.maxchainlen in its .hg/hgrc so it doesn't suffer from this
performance issue.

We could achieve the same result by passing the --config option to
`hg clone`. However, the option won't be preserved in the repo's
.hg/hgrc and subsequent `hg pull` operations could result in the
creation of very long delta chains. So we need to write the config
option in the .hg/hgrc. `hg clone` is equivalent to `hg init` +
`hg pull` anyway, so we just separate out the steps and insert a
write to .hg/hgrc in between.

We also set the "default" path (like `hg clone` would do).

DONTBUILD (NPOTB)

MozReview-Commit-ID: Fs4cz9YvdCv
This commit is contained in:
Gregory Szorc
2016-06-16 09:46:24 +01:00
parent 9862e342da
commit 2e68a22a74

View File

@@ -88,7 +88,7 @@ Your system should be ready to build %s!
SOURCE_ADVERTISE = '''
Source code can be obtained by running
hg clone https://hg.mozilla.org/mozilla-central
hg clone https://hg.mozilla.org/firefox
Or, if you prefer Git, you should install git-cinnabar, and follow the
instruction here to clone from the Mercurial repository:
@@ -348,19 +348,49 @@ def clone_firefox(hg, dest):
"""Clone the Firefox repository to a specified destination."""
print('Cloning Firefox Mercurial repository to %s' % dest)
# We create an empty repo then modify the config before adding data.
# This is necessary to ensure storage settings are optimally
# configured.
args = [
hg,
'clone',
'https://hg.mozilla.org/mozilla-central',
dest,
# The unified repo is generaldelta, so ensure the client is as
# well.
'--config', 'format.generaldelta=true',
'init',
dest
]
res = subprocess.call(args)
if res:
print('unable to create destination repo; please try cloning manually')
return False
# Strictly speaking, this could overwrite a config based on a template
# the user has installed. Let's pretend this problem doesn't exist
# unless someone complains about it.
with open(os.path.join(dest, '.hg', 'hgrc'), 'ab') as fh:
fh.write('[paths]\n')
fh.write('default = https://hg.mozilla.org/firefox\n')
fh.write('\n')
# The server uses aggressivemergedeltas which can blow up delta chain
# length. This can cause performance to tank due to delta chains being
# too long. Limit the delta chain length to something reasonable
# to bound revlog read time.
fh.write('[format]\n')
fh.write('# This is necessary to keep performance in check\n')
fh.write('maxchainlen = 10000\n')
res = subprocess.call([hg, 'pull', 'https://hg.mozilla.org/firefox'], cwd=dest)
print('')
if res:
print('error cloning; please try again')
print('error pulling; try running `hg pull https://hg.mozilla.org/firefox` manually')
return False
else:
print('updating to "central" - the development head of Gecko and Firefox')
res = subprocess.call([hg, 'update', '-r', 'central'], cwd=dest)
if res:
print('error updating; you will need to `hg update` manually')
print('Firefox source code available at %s' % dest)
return True