sapling/tests/test-pushrebase.t
Durham Goode 49e649fba6 pushrebase: add pre-lock hook
Summary:
This adds a hook before we take the lock that allows us to run some expensive
hooks without blocking the entire repo. This is useful for hooks that check the
contents of the bundle for certain info (like conflict markers), that won't be
affected by rebases.

Test Plan:
Added a test. Verified it passed when hg had lazy locks enabled for
unbundle, and failed with mercurial did not have lazy locks for unbundle.

Reviewers: pyd, #sourcecontrol

Differential Revision: https://phabricator.fb.com/D2511561
2015-10-05 18:56:46 -07:00

578 lines
16 KiB
Perl

$ cat >> $HGRCPATH <<EOF
> [ui]
> ssh = python "$RUNTESTDIR/dummyssh"
> username = nobody <no.reply@fb.com>
> [extensions]
> strip =
> EOF
$ alias commit='hg commit -d "0 0" -A -m'
$ alias log='hg log -G -T "{desc} [{phase}:{node|short}] {bookmarks}"'
Set up server repository
$ hg init server
$ cd server
$ echo foo > a
$ echo foo > b
$ commit 'initial'
adding a
adding b
Set up client repository
$ cd ..
$ hg clone ssh://user@dummy/server client -q
$ cd client
$ echo "[extensions]" >> .hg/hgrc
$ echo "pushrebase = $TESTDIR/../pushrebase.py" >> .hg/hgrc
Without server extension
$ cd ../server
$ echo 'bar' > a
$ commit 'a => bar'
$ cd ../client
$ hg rm b
$ commit 'b => xxx'
$ echo 'baz' > b
$ hg add b
$ commit 'b => baz'
$ hg push
pushing to ssh://user@dummy/server
searching for changes
remote has heads on branch 'default' that are not known locally: add0c792bfce
abort: push creates new remote head 0e3997dc0733!
(pull and merge or see "hg help push" for details about pushing new heads)
[255]
$ hg --config experimental.bundle2-exp=False push --to default
pushing to ssh://user@dummy/server
searching for changes
abort: bundle2 needs to be enabled on client
[255]
$ echo "[experimental]" >> .hg/hgrc
$ echo "bundle2-exp = True" >> .hg/hgrc
$ hg push --to default
pushing to ssh://user@dummy/server
searching for changes
abort: no server support for 'b2x:rebase'
[255]
$ echo "[experimental]" >> ../server/.hg/hgrc
$ echo "bundle2-exp = True" >> ../server/.hg/hgrc
$ hg push --to default
pushing to ssh://user@dummy/server
searching for changes
abort: no server support for 'b2x:rebase'
[255]
Stack of non-conflicting commits should be accepted
$ cd ../server
$ echo "[extensions]" >> .hg/hgrc
$ echo "pushrebase = $TESTDIR/../pushrebase.py" >> .hg/hgrc
$ log
@ a => bar [draft:add0c792bfce]
|
o initial [draft:2bb9d20e471c]
$ cd ../client
$ log
@ b => baz [draft:0e3997dc0733]
|
o b => xxx [draft:46a2df24e272]
|
o initial [public:2bb9d20e471c]
$ hg push --to default --config devel.bundle2.debug=1 --debug | tee stuff | grep -v bundle2-
pushing to ssh://user@dummy/server
running python * user@dummy 'hg -R server serve --stdio' (glob)
sending hello command
sending between command
remote: 362
remote: capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream bundle2=HG20%0Ab2x%253Arebase%0Achangegroup%3D01%2C02%0Adigests%3Dmd5%2Csha1%2Csha512%0Aerror%3Dabort%2Cunsupportedcontent%2Cpushraced%2Cpushkey%0Ahgtagsfnodes%0Alistkeys%0Apushkey%0Aremote-changegroup%3Dhttp%2Chttps unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024
remote: 1
query 1; heads
sending batch command
searching for changes
taking quick initial sample
query 2; still undecided: 2, sample size is: 2
sending known command
2 total queries
preparing listkeys for "phases"
sending listkeys command
received listkey for "phases": 58 bytes
checking for updated bookmarks
preparing listkeys for "bookmarks"
sending listkeys command
received listkey for "bookmarks": 0 bytes
validated revset for rebase
2 changesets found
list of changesets:
46a2df24e27273bb06dbf28b085fcc2e911bf986
0e3997dc073308e42715a44d345466690abfd09a
sending unbundle command
adding changesets
add changeset add0c792bfce
add changeset 6a6d9484552c
add changeset 4cfedb0dc25f
adding manifests
adding file changes
adding a revisions
adding b revisions
added 3 changesets with 1 changes to 2 files (+1 heads)
preparing listkeys for "phases"
sending listkeys command
received listkey for "phases": 15 bytes
updating the branch cache
Check that we did not generate any check:heads parts
$ grep check:heads stuff
[1]
$ rm stuff
$ cd ../server
$ hg update default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ log
@ b => baz [public:4cfedb0dc25f]
|
o b => xxx [public:6a6d9484552c]
|
o a => bar [public:add0c792bfce]
|
o initial [public:2bb9d20e471c]
$ cd ../client
$ hg strip 1
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
saved backup bundle to $TESTTMP/client/.hg/strip-backup/46a2df24e272-1b034f5b-backup.hg (glob)
$ hg pull
pulling from ssh://user@dummy/server
searching for changes
no changes found
$ hg update default
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
Regular commits should go through without changing hash
$ cd ../client
$ echo '[experimental]' >> .hg/hgrc
$ echo 'bundle2.pushback = True' >> .hg/hgrc
$ echo 'quux' > b
$ commit 'b => quux'
$ log -r tip
@ b => quux [draft:741fd2094512]
|
$ hg push --to default
pushing to ssh://user@dummy/server
searching for changes
$ cd ../server
$ hg update default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ log
@ b => quux [public:741fd2094512]
|
o b => baz [public:4cfedb0dc25f]
|
o b => xxx [public:6a6d9484552c]
|
o a => bar [public:add0c792bfce]
|
o initial [public:2bb9d20e471c]
Stack with conflict in tail should abort
$ cd ../server
$ echo 'baz' > a
$ commit 'a => baz'
$ cd ../client
$ echo 'quux' > a
$ commit 'a => quux'
$ echo 'foofoo' > b
$ commit 'b => foofoo'
$ hg push --to default
pushing to ssh://user@dummy/server
searching for changes
abort: conflicting changes in ['a']
[255]
$ hg strip 5
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
saved backup bundle to $TESTTMP/client/.hg/strip-backup/11a6a93eb344-7140e689-backup.hg (glob)
$ cd ../server
$ log
@ a => baz [draft:fb983dc509b6]
|
o b => quux [public:741fd2094512]
|
o b => baz [public:4cfedb0dc25f]
|
o b => xxx [public:6a6d9484552c]
|
o a => bar [public:add0c792bfce]
|
o initial [public:2bb9d20e471c]
Stack with conflict in head should abort
$ cd ../client
$ echo 'foofoo' > b
$ commit 'b => foofoo'
$ echo 'quux' > a
$ commit 'a => quux'
$ hg push --to default
pushing to ssh://user@dummy/server
searching for changes
abort: conflicting changes in ['a']
[255]
$ hg strip 5
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
saved backup bundle to $TESTTMP/client/.hg/strip-backup/98788efd81b0-93572e45-backup.hg (glob)
$ cd ../server
$ log
@ a => baz [draft:fb983dc509b6]
|
o b => quux [public:741fd2094512]
|
o b => baz [public:4cfedb0dc25f]
|
o b => xxx [public:6a6d9484552c]
|
o a => bar [public:add0c792bfce]
|
o initial [public:2bb9d20e471c]
Pushing a merge should rebase only the latest side of the merge
$ hg book master -r tip
$ cd ../client
$ hg pull -q > /dev/null
$ hg strip -q -r tip
$ hg up 741fd2094512
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ echo "tux" > other
$ hg add other
$ hg commit -qm "branch left"
$ hg book master -r tip
moving bookmark 'master' forward from 741fd2094512
$ hg up -q 2
$ echo branched > c
$ hg commit -Aqm "branch start"
$ echo branched2 > c
$ hg commit -qm "branch middle"
$ hg merge -q master
$ hg commit -qm "merge"
$ echo ontopofmerge > c
$ hg commit -qm "on top of merge"
$ hg book master -r tip
moving bookmark 'master' forward from e6b7549904cd
$ log
@ on top of merge [draft:9007d6a204f8] master
|
o merge [draft:2c0c699d7086]
|\
| o branch middle [draft:5a0cbf3df4ef]
| |
| o branch start [draft:add5ec74853d]
| |
o | branch left [draft:e6b7549904cd]
| |
o | b => quux [public:741fd2094512]
| |
o | b => baz [public:4cfedb0dc25f]
|/
o b => xxx [public:6a6d9484552c]
|
o a => bar [public:add0c792bfce]
|
o initial [public:2bb9d20e471c]
$ hg push --to master -B master
pushing to ssh://user@dummy/server
searching for changes
adding changesets
adding manifests
adding file changes
added 4 changesets with 1 changes to 3 files (+1 heads)
updating bookmark master
$ cd ../server
$ log
o on top of merge [public:7548c79a5591] master
|
o merge [public:93a3cc822f6a]
|\
| o branch middle [public:5a0cbf3df4ef]
| |
| o branch start [public:add5ec74853d]
| |
o | branch left [public:cf07bdf4226e]
| |
@ | a => baz [public:fb983dc509b6]
| |
o | b => quux [public:741fd2094512]
| |
o | b => baz [public:4cfedb0dc25f]
|/
o b => xxx [public:6a6d9484552c]
|
o a => bar [public:add0c792bfce]
|
o initial [public:2bb9d20e471c]
- Verify the content of the merge files is correct
$ hg cat -r master^ c
branched2
$ hg cat -r master^ other
tux
$ hg strip -r add5ec74853d -q
$ cd ../client
$ hg strip -r add5ec74853d -q
$ hg book -d master
$ hg -R ../server book -d master
With evolution enabled, should set obsolescence markers
$ cat >> $HGRCPATH << EOF
> [extensions]
> rebase =
>
> [experimental]
> evolution = all
> EOF
$ cd ../client
$ hg strip -qr fb983dc509b6
$ hg strip -qr e6b7549904cd2a7991ef25bc2e0fd910801af2cd
$ hg up -q 741fd2094512
$ hg mv b k
$ commit 'b => k'
$ hg mv k b
$ echo 'foobar' > b
$ commit 'b => foobar'
$ log
@ b => foobar [draft:e73acfaeee82]
|
o b => k [draft:9467a8ee5d0d]
|
o b => quux [public:741fd2094512]
|
o b => baz [public:4cfedb0dc25f]
|
o b => xxx [public:6a6d9484552c]
|
o a => bar [public:add0c792bfce]
|
o initial [public:2bb9d20e471c]
$ hg push --to default
pushing to ssh://user@dummy/server
searching for changes
adding changesets
adding manifests
adding file changes
added 4 changesets with 2 changes to 4 files (+1 heads)
2 new obsolescence markers
$ hg pull
pulling from ssh://user@dummy/server
searching for changes
no changes found
$ hg debugobsolete | sort
9467a8ee5d0d993ba68d94946c9d4a3cae8d31ff 0d76868c25e6789734c06e056f235e1fa223da74 * (glob)
e73acfaeee82005b2379f82efb73123cbb74a733 d53a62ed14be0980584e1f92f9c47031ef806a62 * (glob)
$ hg up d53a62ed14be
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ log
@ b => foobar [public:d53a62ed14be]
|
o b => k [public:0d76868c25e6]
|
o branch left [public:cf07bdf4226e]
|
o a => baz [public:fb983dc509b6]
|
o b => quux [public:741fd2094512]
|
o b => baz [public:4cfedb0dc25f]
|
o b => xxx [public:6a6d9484552c]
|
o a => bar [public:add0c792bfce]
|
o initial [public:2bb9d20e471c]
$ cd ../server
$ hg log -r 0d76868c25e6 -T '{file_copies}\n'
k (b)
$ log
o b => foobar [public:d53a62ed14be]
|
o b => k [public:0d76868c25e6]
|
o branch left [public:cf07bdf4226e]
|
@ a => baz [public:fb983dc509b6]
|
o b => quux [public:741fd2094512]
|
o b => baz [public:4cfedb0dc25f]
|
o b => xxx [public:6a6d9484552c]
|
o a => bar [public:add0c792bfce]
|
o initial [public:2bb9d20e471c]
Test pushing master bookmark, fast forward
$ hg book -r fb983dc509b6 master
$ cd ../client
$ hg book master
$ echo 'babar' > b
$ commit 'b => babar'
$ hg log -r master -T"{node}\n"
56b2e094996609874ae1c9aae1626bfba61d07d8
$ hg push --to master
pushing to ssh://user@dummy/server
searching for changes
updating bookmark master
$ hg log -r master -R ../server -T"{node}\n"
56b2e094996609874ae1c9aae1626bfba61d07d8
Test pushing bookmark with no new commit
$ hg book stable -r fb983dc509b6
$ hg book stable -r fb983dc509b6^ -R ../server
$ hg push -r stable --to stable
pushing to ssh://user@dummy/server
searching for changes
no changes found
updating bookmark stable
[1]
$ hg log -r stable -R ../server
changeset: 5:fb983dc509b6
bookmark: stable
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: a => baz
$ cd ..
Test that the prepushrebase hook can run against the bundle repo
$ cat >> $TESTTMP/prerebase.sh <<EOF
> hg log -r tip
> echo "Checking if lock exists (it should not):"
> ls -l .hg/store/lock
> EOF
$ chmod a+x $TESTTMP/prerebase.sh
$ hg init prepushrebaseserver
$ cd prepushrebaseserver
$ cat >> .hg/hgrc <<EOF
> [hooks]
> prepushrebase = $TESTTMP/prerebase.sh
> [extensions]
> pushrebase = $TESTDIR/../pushrebase.py
> [experimental]
> bundle2lazylocking = True
> EOF
$ touch a && hg add a && hg commit -qm a
$ hg book master
$ cd ..
$ hg clone ssh://user@dummy/prepushrebaseserver prepushrebaseclient
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cd prepushrebaseclient
$ cat >> .hg/hgrc <<EOF
> [extensions]
> pushrebase = $TESTDIR/../pushrebase.py
> EOF
$ touch b && hg add b && hg commit -qm b
$ hg push --to master
pushing to ssh://user@dummy/prepushrebaseserver
searching for changes
remote: changeset: 1:0e067c57feba
remote: tag: tip
remote: user: test
remote: date: Thu Jan 01 00:00:00 1970 +0000
remote: summary: b
remote:
remote: Checking if lock exists (it should not):
remote: ls: cannot access .hg/store/lock: No such file or directory
remote: warning: prepushrebase hook exited with status 2
$ cd ..
Test that hooks are fired with the correct variables
$ hg init hookserver
$ cd hookserver
$ cat >> .hg/hgrc <<EOF
> [hooks]
> changegroup = python "$RUNTESTDIR/printenv.py" changegroup
> incoming = python "$RUNTESTDIR/printenv.py" incoming
> outgoing = python "$RUNTESTDIR/printenv.py" outgoing
> prechangegroup = python "$RUNTESTDIR/printenv.py" prechangegroup
> preoutgoing = python "$RUNTESTDIR/printenv.py" preoutgoing
> pretxnchangegroup = python "$RUNTESTDIR/printenv.py" pretxnchangegroup
> txnclose = python "$RUNTESTDIR/printenv.py" txnclose
> pretxnclose = python "$RUNTESTDIR/printenv.py" pretxnclose
> prepushrebase = python "$RUNTESTDIR/printenv.py" prepushrebase
> [extensions]
> pushrebase = $TESTDIR/../pushrebase.py
> EOF
$ touch file && hg ci -Aqm initial
pretxnclose hook: HG_PENDING=$TESTTMP/hookserver HG_PHASES_MOVED=1 HG_TXNID=TXN:* HG_TXNNAME=commit (glob)
txnclose hook: HG_PHASES_MOVED=1 HG_TXNID=TXN:* HG_TXNNAME=commit (glob)
$ hg bookmark master
pretxnclose hook: HG_BOOKMARK_MOVED=1 HG_PENDING=$TESTTMP/hookserver HG_TXNID=TXN:* HG_TXNNAME=bookmark (glob)
txnclose hook: HG_BOOKMARK_MOVED=1 HG_TXNID=TXN:* HG_TXNNAME=bookmark (glob)
$ cd ../
$ hg clone hookserver hookclient
preoutgoing hook: HG_SOURCE=clone
outgoing hook: HG_NODE=0000000000000000000000000000000000000000 HG_SOURCE=clone
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cd hookclient
$ cat >> .hg/hgrc <<EOF
> [extensions]
> pushrebase = $TESTDIR/../pushrebase.py
> EOF
$ echo >> file && hg ci -Aqm first
$ hg push --to master
pushing to $TESTTMP/hookserver
searching for changes
prepushrebase hook: HG_BUNDLE2=1 HG_HOOK_BUNDLEPATH=* HG_NODE=4fcee35c508c1019667f72cae9b843efa8908701 HG_SOURCE=push (glob)
prechangegroup hook: HG_BUNDLE2=1 HG_SOURCE=push HG_TXNID=TXN:* HG_URL=push (glob)
pretxnchangegroup hook: HG_BUNDLE2=1 HG_NODE=4fcee35c508c1019667f72cae9b843efa8908701 HG_PENDING=$TESTTMP/hookserver HG_SOURCE=push HG_TXNID=TXN:* HG_URL=push (glob)
pretxnclose hook: HG_BUNDLE2=1 HG_NODE=4fcee35c508c1019667f72cae9b843efa8908701 HG_PENDING=$TESTTMP/hookserver HG_PHASES_MOVED=1 HG_SOURCE=push HG_TXNID=TXN:* HG_TXNNAME=push HG_URL=push (glob)
txnclose hook: HG_BUNDLE2=1 HG_NODE=4fcee35c508c1019667f72cae9b843efa8908701 HG_PHASES_MOVED=1 HG_SOURCE=push HG_TXNID=TXN:* HG_TXNNAME=push HG_URL=push (glob)
changegroup hook: HG_BUNDLE2=1 HG_NODE=4fcee35c508c1019667f72cae9b843efa8908701 HG_SOURCE=push HG_TXNID=TXN:* HG_URL=push (glob)
incoming hook: HG_BUNDLE2=1 HG_NODE=4fcee35c508c1019667f72cae9b843efa8908701 HG_SOURCE=push HG_TXNID=TXN:* HG_URL=push (glob)
$ cd ../