diff --git a/hgext3rd/pushrebase.py b/hgext3rd/pushrebase.py --- a/hgext3rd/pushrebase.py +++ b/hgext3rd/pushrebase.py @@ -557,14 +557,16 @@ return revs, oldonto -def _graft(repo, rev, mapping, lastdestnode): +def _graft(op, rev, mapping, lastdestnode): '''duplicate changeset "rev" with parents from "mapping"''' + repo = op.repo oldp1 = rev.p1().node() oldp2 = rev.p2().node() newp1 = mapping.get(oldp1, oldp1) newp2 = mapping.get(oldp2, oldp2) - if not repo.ui.configbool("pushrebase", "forcetreereceive"): + if (not op.records[treepackrecords] and + not repo.ui.configbool("pushrebase", "forcetreereceive")): m = rev.manifest() else: store = rev._repo.manifestlog.datastore @@ -879,7 +881,7 @@ def prefetchcaches(op, params, bundle): bundlerepocache = {} # No need to cache trees from the bundle since they are already fast - if not op.repo.ui.configbool("pushrebase", "forcetreereceive"): + if not op.records[treepackrecords]: # We will need the bundle revs after the lock is taken, so let's # precache all the bundle rev manifests. bundlectxs = list(bundle.set('bundle()')) @@ -967,7 +969,7 @@ lastdestnode = None for rev in revs: - newrev = _graft(op.repo, rev, mapping, lastdestnode) + newrev = _graft(op, rev, mapping, lastdestnode) new = op.repo[newrev] oldnode = rev.node() diff --git a/tests/test-treemanifest-treeonly.t b/tests/test-treemanifest-treeonly.t --- a/tests/test-treemanifest-treeonly.t +++ b/tests/test-treemanifest-treeonly.t @@ -36,6 +36,7 @@ $ cat >> .hg/hgrc < [extensions] > fbamend=$TESTDIR/../hgext3rd/fbamend + > pushrebase=$TESTDIR/../hgext3rd/pushrebase.py > EOF Make a flat-only draft commit @@ -316,7 +317,67 @@ | subdir/x | 1 + ~ 1 files changed, 1 insertions(+), 0 deletions(-) +Test pushing to a hybrid server w/ pushrebase w/ hooks + $ cat >> $TESTTMP/filehook.sh < set -xe + > [[ \$(hg log -r \$HG_NODE -T '{file_adds}') == 'y' ]] && exit 1 + > echo \$(hg log -r \$HG_NODE -T '{file_adds}') + > exit 2 + > EOF + $ chmod a+x $TESTTMP/filehook.sh + $ cat >> ../master/.hg/hgrc < [hooks] + > prepushrebase.fail=$TESTTMP/filehook.sh + > EOF + $ hg push -r 2 --to master + pushing to ssh://user@dummy/master + searching for changes + remote: +++ hg log -r 7ec3c5c54734448e59a0694af54c51578ee4d4de -T '{file_adds}' + remote: ++ [[ y == \y ]] + remote: ++ exit 1 + remote: prepushrebase.fail hook exited with status 1 + abort: push failed on remote + [255] + +Test pushing to a hybrid server w/ pushrebase w/o hooks + $ cat >> ../master/.hg/hgrc < [hooks] + > prepushrebase.fail=true + > EOF + $ hg push -r 2 --to master + pushing to ssh://user@dummy/master + searching for changes + remote: pushing 1 changeset: + remote: 7ec3c5c54734 add y + remote: 1 new changeset from the server will be downloaded + adding changesets + adding manifests + adding file changes + added 1 changesets with 0 changes to 0 files (+1 heads) + + $ cd ../master +- Verify the received tree was written down as a flat + $ hg debugindex -m + rev offset length delta linkrev nodeid p1 p2 + 0 0 51 -1 0 85b359fdb09e 000000000000 000000000000 + 1 51 51 -1 1 d9920715ba88 85b359fdb09e 000000000000 + 2 102 55 1 2 83b03df1c9d6 d9920715ba88 000000000000 + $ hg debugindex .hg/store/00manifesttree.i + rev offset length delta linkrev nodeid p1 p2 + 0 0 50 -1 0 85b359fdb09e 000000000000 000000000000 + 1 50 50 -1 1 d9920715ba88 85b359fdb09e 000000000000 + 2 100 55 1 2 83b03df1c9d6 d9920715ba88 000000000000 +- Verify the manifest data is accessible + $ hg log -r tip --stat + changeset: 2:4f84204095e0 + tag: tip + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: add y + + y | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + TODO -# Access the pre-tree commit # log -T "{manifest}" #TODO: edit templatekw.showmanifest