diff --git a/infinitepush/__init__.py b/infinitepush/__init__.py --- a/infinitepush/__init__.py +++ b/infinitepush/__init__.py @@ -100,7 +100,7 @@ import time from .bundleparts import ( - getscratchbranchpart, + getscratchbranchparts, scratchbookmarksparttype, scratchbranchparttype, ) @@ -897,15 +897,16 @@ nonforwardmove = pushop.force or pushop.ui.configbool(experimental, confignonforwardmove) - scratchpart = getscratchbranchpart(pushop.repo, - pushop.remote, - pushop.outgoing, - nonforwardmove, - pushop.ui, - bookmark, - create) + scratchparts = getscratchbranchparts(pushop.repo, + pushop.remote, + pushop.outgoing, + nonforwardmove, + pushop.ui, + bookmark, + create) - bundler.addpart(scratchpart) + for scratchpart in scratchparts: + bundler.addpart(scratchpart) def handlereply(op): # server either succeeds or aborts; no code to read diff --git a/infinitepush/backupcommands.py b/infinitepush/backupcommands.py --- a/infinitepush/backupcommands.py +++ b/infinitepush/backupcommands.py @@ -51,7 +51,7 @@ from .bundleparts import ( getscratchbookmarkspart, - getscratchbranchpart, + getscratchbranchparts, ) from mercurial import ( bundle2, @@ -450,10 +450,12 @@ backup = False if outgoing and outgoing.missing: backup = True - bundler.addpart(getscratchbranchpart(repo, other, outgoing, - confignonforwardmove=False, - ui=ui, bookmark=None, - create=False)) + parts = getscratchbranchparts(repo, other, outgoing, + confignonforwardmove=False, + ui=ui, bookmark=None, + create=False) + for part in parts: + bundler.addpart(part) if bookmarkstobackup: backup = True diff --git a/infinitepush/bundleparts.py b/infinitepush/bundleparts.py --- a/infinitepush/bundleparts.py +++ b/infinitepush/bundleparts.py @@ -19,7 +19,7 @@ scratchbranchparttype = 'b2x:infinitepush' scratchbookmarksparttype = 'b2x:infinitepushscratchbookmarks' -def getscratchbranchpart(repo, peer, outgoing, confignonforwardmove, +def getscratchbranchparts(repo, peer, outgoing, confignonforwardmove, ui, bookmark, create): if not outgoing.missing: raise error.Abort(_('no commits to push')) @@ -56,12 +56,23 @@ if not isremotebooksenabled(ui): params['pushbackbookmarks'] = '1' + parts = [] + # .upper() marks this as a mandatory part: server will abort if there's no # handler - return bundle2.bundlepart( + parts.append(bundle2.bundlepart( scratchbranchparttype.upper(), advisoryparams=params.iteritems(), - data=cg) + data=cg)) + + try: + treemod = extensions.find('treemanifest') + parts.append(treemod.createtreepackpart(repo, outgoing, + treemod.TREEGROUP_PARTTYPE2)) + except KeyError: + pass + + return parts def getscratchbookmarkspart(peer, bookmarks): if scratchbookmarksparttype not in bundle2.bundle2caps(peer): diff --git a/remotefilelog/shallowbundle.py b/remotefilelog/shallowbundle.py --- a/remotefilelog/shallowbundle.py +++ b/remotefilelog/shallowbundle.py @@ -72,6 +72,8 @@ """ sendflat = self._repo.ui.configbool('treemanifest', 'sendflat', True) + sendflat &= not self._repo.ui.configbool('treemanifest', 'treeonly') + if sendflat: # In this code path, generating the manifests populates fnodes for # us. diff --git a/tests/test-treemanifest-infinitepush.t b/tests/test-treemanifest-infinitepush.t new file mode 100644 --- /dev/null +++ b/tests/test-treemanifest-infinitepush.t @@ -0,0 +1,107 @@ + $ . "$TESTDIR/library.sh" + $ . "$TESTDIR/library-infinitepush.sh" + + $ PYTHONPATH=$TESTDIR/..:$PYTHONPATH + $ export PYTHONPATH + $ setupcommon + + $ hginit master + $ cd master + $ setupserver + $ cat >> .hg/hgrc < [extensions] + > pushrebase=$TESTDIR/../hgext3rd/pushrebase.py + > treemanifest=$TESTDIR/../treemanifest + > [remotefilelog] + > server=True + > [treemanifest] + > server=True + > EOF + $ echo x > x + $ hg commit -qAm 'add x' + $ cd .. + +Push a scratch branch from one client + + $ hgcloneshallow ssh://user@dummy/master client1 -q --config extensions.treemanifest=$TESTDIR/../treemanifest --config treemanifest.treeonly=True + 1 trees fetched over * (glob) + 1 trees fetched over * (glob) + 1 files fetched over 1 fetches - (1 misses, 0.00% hit ratio) over * (glob) + $ cd client1 + $ cat >> .hg/hgrc < [extensions] + > treemanifest=$TESTDIR/../treemanifest + > + > [remotefilelog] + > usefastdatapack=True + > + > [treemanifest] + > treeonly=True + > EOF + + $ mkdir subdir + $ echo "my change" >> subdir/a + $ hg commit -qAm 'add subdir/a' + $ hg push --to scratch/foo --create + pushing to ssh://user@dummy/master + searching for changes + remote: pushing 1 commit: + remote: 02c12aef64ff add subdir/a + $ cd .. + +Pull a scratch branch from another client + + $ hgcloneshallow ssh://user@dummy/master client2 -q --config extensions.treemanifest=$TESTDIR/../treemanifest --config treemanifest.treeonly=True + $ cd client2 + $ cat >> .hg/hgrc < [extensions] + > treemanifest=$TESTDIR/../treemanifest + > + > [remotefilelog] + > usefastdatapack=True + > + > [treemanifest] + > treeonly=True + > EOF + $ hg pull -r scratch/foo + pulling from ssh://user@dummy/master + 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) + $ hg log -G + o changeset: 1:02c12aef64ff + | tag: tip + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: add subdir/a + | + @ changeset: 0:085784c01c08 + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: add x + + $ hg cat -r tip subdir/a + my change + $ ls_l .hg/store + -rw-r--r-- 257 00changelog.i + -rw-r--r-- 108 00manifesttree.i + drwxr-xr-x data + drwxrwxr-x packs + -rw-r--r-- 43 phaseroots + -rw-r--r-- 18 undo + -rw-r--r-- 17 undo.backupfiles + -rw-r--r-- 0 undo.phaseroots + $ cd .. + +Verify its not on the server + $ cd master + $ hg log -G + @ changeset: 0:085784c01c08 + tag: tip + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: add x +