largefiles: introduce push --lfrev to control which revisions are pushed

The default of pushing all largefiles referenced in outgoing revisions is safe,
but also expensive and sometimes not what is needed. We thus introduce a
--lfrev option, similar to what pull already has.

By specifying an empty set of revisions (or null), it is possible to get lazy
(and insecure!) pushes of revisions without referenced largefiles, similar to
how pull works.
This commit is contained in:
Mads Kiilerich 2016-03-27 13:00:28 -07:00
parent 66a29f6996
commit 069bac6a3e
4 changed files with 46 additions and 3 deletions

View File

@ -801,6 +801,21 @@ def overridepull(orig, ui, repo, source=None, **opts):
ui.status(_("%d largefiles cached\n") % numcached)
return result
def overridepush(orig, ui, repo, *args, **kwargs):
"""Override push command and store --lfrev parameters in opargs"""
lfrevs = kwargs.pop('lfrev', None)
if lfrevs:
opargs = kwargs.setdefault('opargs', {})
opargs['lfrevs'] = scmutil.revrange(repo, lfrevs)
return orig(ui, repo, *args, **kwargs)
def exchangepushoperation(orig, *args, **kwargs):
"""Override pushoperation constructor and store lfrevs parameter"""
lfrevs = kwargs.pop('lfrevs', None)
pushop = orig(*args, **kwargs)
pushop.lfrevs = lfrevs
return pushop
revsetpredicate = registrar.revsetpredicate()
@revsetpredicate('pulled()')

View File

@ -353,10 +353,14 @@ def reposetup(ui, repo):
repo._lfstatuswriters = [ui.status]
def prepushoutgoinghook(pushop):
if pushop.outgoing.missing:
"""Push largefiles for pushop before pushing revisions."""
lfrevs = pushop.lfrevs
if lfrevs is None:
lfrevs = pushop.outgoing.missing
if lfrevs:
toupload = set()
addfunc = lambda fn, lfhash: toupload.add(lfhash)
lfutil.getlfilestoupload(pushop.repo, pushop.outgoing.missing,
lfutil.getlfilestoupload(pushop.repo, lfrevs,
addfunc)
lfcommands.uploadlfiles(ui, pushop.repo, pushop.remote, toupload)
repo.prepushoutgoinghooks.add("largefiles", prepushoutgoinghook)

View File

@ -9,7 +9,7 @@
'''setup for largefiles extension: uisetup'''
from mercurial import archival, cmdutil, commands, extensions, filemerge, hg, \
httppeer, merge, scmutil, sshpeer, wireproto, subrepo, copies
httppeer, merge, scmutil, sshpeer, wireproto, subrepo, copies, exchange
from mercurial.i18n import _
from mercurial.hgweb import hgweb_mod, webcommands
@ -84,6 +84,14 @@ def uisetup(ui):
_('download largefiles for these revisions'), _('REV'))]
entry[1].extend(pullopt)
entry = extensions.wrapcommand(commands.table, 'push',
overrides.overridepush)
pushopt = [('', 'lfrev', [],
_('upload largefiles for these revisions'), _('REV'))]
entry[1].extend(pushopt)
entry = extensions.wrapfunction(exchange, 'pushoperation',
overrides.exchangepushoperation)
entry = extensions.wrapcommand(commands.table, 'clone',
overrides.overrideclone)
cloneopt = [('', 'all-largefiles', None,

View File

@ -235,4 +235,20 @@ Test coverage of 'missing from store':
abort: largefile e2fb5f2139d086ded2cb600d5a91a196e76bf020 missing from store (needs to be uploaded)
[255]
Verify that --lfrev controls which revisions are checked for largefiles to push
$ hg push http://localhost:$HGPORT2 -f --config largefiles.usercache=nocache --lfrev tip
pushing to http://localhost:$HGPORT2/
searching for changes
abort: largefile e2fb5f2139d086ded2cb600d5a91a196e76bf020 missing from store (needs to be uploaded)
[255]
$ hg push http://localhost:$HGPORT2 -f --config largefiles.usercache=nocache --lfrev null
pushing to http://localhost:$HGPORT2/
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 1 changesets with 1 changes to 1 files (+1 heads)
#endif