mirror of
https://github.com/facebook/sapling.git
synced 2024-10-08 07:49:11 +03:00
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:
parent
66a29f6996
commit
069bac6a3e
@ -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()')
|
||||
|
@ -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)
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user