infinitepush: re-enable lfs support

Summary:
D17 was reverted because it broke creating bundle for non-general delta repos.
The reason is the following: D17 made infinitepush extension override
changegroup.supportedoutgoingversion() function and discard '01' version.
For non-general delta repositories it resulted in broken `hg bundle ...`
command.
`abort: repository does not support bundle version 01`

This diff fixes it by not overriding supportedoutgoingversion(). Instead
getscratchbranchpart() has its own logic of selecting changegroup version.

Test Plan:
Run unit-test
Run `hg bundle -r . --base .^ somefile` in non-general delta repo,
make sure it works fine.

Reviewers: #fbhgext, durham

Reviewed By: #fbhgext, durham

Subscribers: durham

Differential Revision: https://phab.mercurial-scm.org/D81
This commit is contained in:
Stanislau Hlebik 2017-07-20 01:14:35 -07:00
parent 782636d475
commit 214387fb21
3 changed files with 95 additions and 9 deletions

View File

@ -179,6 +179,16 @@ def _canskipupload(repo):
# if remotestore is a null store, upload is a no-op and can be skipped
return isinstance(repo.svfs.lfsremoteblobstore, blobstore._nullremote)
def uploadblobsfromrevs(repo, revs):
'''upload lfs blobs introduced by revs
Note: also used by other extensions e. g. infinitepush. avoid renaming.
'''
if _canskipupload(repo):
return
pointers = extractpointers(repo, revs)
uploadblobs(repo, pointers)
def prepush(pushop):
"""Prepush hook.
@ -186,18 +196,12 @@ def prepush(pushop):
deserialized into metadata so that we can block the push on their upload to
the remote blobstore.
"""
if _canskipupload(pushop.repo):
return
pointers = extractpointers(pushop.repo, pushop.outgoing.missing)
uploadblobs(pushop.repo, pointers)
return uploadblobsfromrevs(pushop.repo, pushop.outgoing.missing)
def writenewbundle(orig, ui, repo, source, filename, bundletype, outgoing,
*args, **kwargs):
"""upload LFS blobs added by outgoing revisions on 'hg bundle'"""
if _canskipupload(repo):
return
pointers = extractpointers(repo, outgoing.missing)
uploadblobs(repo, pointers)
uploadblobsfromrevs(repo, outgoing.missing)
return orig(ui, repo, source, filename, bundletype, outgoing, *args,
**kwargs)

View File

@ -11,6 +11,7 @@ from mercurial import (
bundle2,
changegroup,
error,
extensions,
revsetlang,
)
from mercurial.i18n import _
@ -29,7 +30,12 @@ def getscratchbranchpart(repo, peer, outgoing, confignonforwardmove,
_validaterevset(repo, revsetlang.formatspec('%ln', outgoing.missing),
bookmark)
cgversion = '02'
supportedversions = changegroup.supportedoutgoingversions(repo)
# Explicitly avoid using '01' changegroup version in infinitepush to
# support general delta
supportedversions.discard('01')
cgversion = min(supportedversions)
_handlelfs(repo, outgoing.missing)
cg = changegroup.getlocalchangegroupraw(repo, 'push',
outgoing, version=cgversion)
@ -77,3 +83,16 @@ def _validaterevset(repo, revset, bookmark):
if len(heads) > 1:
raise error.Abort(
_('cannot push more than one head to a scratch branch'))
def _handlelfs(repo, missing):
'''Special case if lfs is enabled
If lfs is enabled then we need to call prepush hook
to make sure large files are uploaded to lfs
'''
try:
lfsmod = extensions.find('lfs')
lfsmod.wrapper.uploadblobsfromrevs(repo, missing)
except KeyError:
# Ignore if lfs extension is not enabled
return

View File

@ -0,0 +1,63 @@
Setup common infinitepush
$ . "$TESTDIR/library.sh"
$ . "$TESTDIR/library-infinitepush.sh"
$ setupcommon
Setup lfs
$ cat >> $HGRCPATH << EOF
> [experimental]
> changegroup3=True
> [extensions]
> lfs=$TESTDIR/../hgext3rd/lfs/
> [lfs]
> threshold=10B
> url=file:$TESTTMP/dummy-remote/
> EOF
Setup server repo
$ hg init repo
$ cd repo
$ setupserver
$ echo 1 > 1
$ hg add 1
$ hg ci -m initial
Setup client
$ cd ..
$ hg clone ssh://user@dummy/repo client -q
$ cd client
$ echo aaaaaaaaaaa > largefile
$ hg ci -Aqm commit
$ hg debugdata largefile 0
version https://git-lfs.github.com/spec/v1
oid sha256:ab483e1d855ad0ea27a68eeea02a04c1de6ccd2dc2c05e3a48c9a1ebb8af5f99
size 12
x-is-binary 0
$ hg push -r . --to scratch/lfscommit --create
pushing to ssh://user@dummy/repo
searching for changes
remote: pushing 1 commit:
remote: 0da81a72db1a commit
$ scratchbookmarks
scratch/lfscommit 0da81a72db1a2d8256845e3808971f33e73d24c4
$ cd ..
Setup another client
$ hg clone ssh://user@dummy/repo client2 -q
$ cd client2
$ hg update scratch/lfscommit
'scratch/lfscommit' does not exist locally - looking for it remotely...
pulling from ssh://user@dummy/repo
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
(run 'hg update' to get a working copy)
'scratch/lfscommit' found remotely
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(activating bookmark scratch/lfscommit)