pushrebase: add a test case demonstrating the "cannot rebase public commit" issue

Summary: We want to add a test for this case before fixing it.

Reviewed By: quark-zju

Differential Revision: D10034448

fbshipit-source-id: 9244c57311d71a0bf1d75643caa31960a2f3519f
This commit is contained in:
Phil Cohen 2018-09-25 13:09:39 -07:00 committed by Facebook Github Bot
parent 25bb829e65
commit a8879d2b36
4 changed files with 124 additions and 34 deletions

19
tests/hgsql/waithook.py Normal file
View File

@ -0,0 +1,19 @@
import time, sys, os, random
def waithook(ui, repo, **kwargs):
"""This hook is used to block pushes in some pushrebase tests
It spins until `.hg/flag` exists
"""
start = time.time()
repo._wlockfreeprefix.add("hookrunning")
repo.vfs.write("hookrunning", "")
while not repo.vfs.exists("flag"):
if time.time() - start > 20:
print >>sys.stderr, "ERROR: Timeout waiting for .hg/flag"
repo.vfs.unlink("hookrunning")
return True
time.sleep(0.05)
repo.vfs.unlink("hookrunning")
return False

View File

@ -0,0 +1,103 @@
Demonstrates the "cannot rebase public commits" issue seen using hgsql and
pushrebase.
$ . "$TESTDIR/hgsql/library.sh"
$ setconfig ui.ssh='python "$RUNTESTDIR/dummyssh"'
$ commit() {
> hg commit -Aq -m "$@"
> }
$ log() {
> hg log -G -T "{desc} [{phase}:{node|short}] {bookmarks} {remotenames}" "$@"
> }
$ config() {
> setconfig experimental.bundle2lazylocking=True
> enable pushrebase
> }
$ config_server() {
> config
> configureserver . foo
> }
$ clone() { # Usage: "clone <client directory> <source directory>
> SRC=${2:-server1}
> hg clone ssh://user@dummy/$SRC $1 -q
> cd $1
> hg up -q master
> config
> }
Set up server repository.
$ newrepo server1
$ config_server
$ echo foo > base
$ commit "base"
$ hg book -r . master
$ log
@ base [draft:4ced94c0a443] master
$ cd ..
$ newrepo server2
$ config_server
Clone client1 from the server repo.
$ cd ..
$ clone client1
Make server2 wait:
$ cd ../server2
$ cp .hg/hgrc .hg/hgrc.bak
$ echo "[hooks]" >> .hg/hgrc
$ echo "prepushrebase.wait=python:$TESTDIR/hgsql/waithook.py:waithook" >> .hg/hgrc
Create two commits in client1:
$ cd ../client1
$ echo 'xxx' > c1
$ commit 'first commit'
$ echo 'xxx' > c2
$ commit 'second commit'
Copy client1 to client2:
$ cd ..
$ cp -R client1 client2
Push in both repos. Block one of the servers in the prepushrebase hook.
$ cd client1
$ hg push --to master ssh://user@dummy/server2 2>&1 | \sed "s/^/[blocked push] /" &
$ cd ../client2
$ hg push --to master ssh://user@dummy/server1 2>&1 | \sed "s/^/[unblocked push] /"
[unblocked push] pushing to ssh://user@dummy/server1
[unblocked push] searching for changes
[unblocked push] remote: pushing 2 changesets:
[unblocked push] remote: 679b2ce82944 first commit
[unblocked push] remote: aab61efd8449 second commit
[unblocked push] updating bookmark master
Check that the blocked push is still running/blocked...
$ jobs
[1]+ Running hg push --to master ssh://user@dummy/server2 2>&1 | \sed "s/^/[blocked push] /" & (wd: ~/client1)
...then allow it through.
$ cd ../server2
$ touch .hg/flag
$ wait
[blocked push] pushing to ssh://user@dummy/server2
[blocked push] searching for changes
[blocked push] remote: cannot rebase public changesets: 679b2ce82944, aab61efd8449
[blocked push] abort: push failed on remote
$ log
o second commit [public:aab61efd8449] master
|
o first commit [public:679b2ce82944]
|
o base [public:4ced94c0a443]

View File

@ -147,25 +147,9 @@ The two server repos should look identical:
Add a hook to the server to make it spin until .hg/flag exists:
$ cd ../server1
$ cat >> $TESTTMP/waithook.py <<EOF
> import time, sys, os, random
> def waithook(ui, repo, **kwargs):
> start = time.time()
> repo._wlockfreeprefix.add('hookrunning')
> repo.vfs.write('hookrunning', '')
> while not repo.vfs.exists('flag'):
> if time.time() - start > 2:
> print >> sys.stderr, "ERROR: Timeout waiting for .hg/flag"
> repo.vfs.unlink('hookrunning')
> return True
> time.sleep(0.05)
> repo.vfs.unlink('hookrunning')
> return False
> EOF
$ cp .hg/hgrc .hg/hgrc.bak
$ echo "[hooks]" >> .hg/hgrc
$ echo "prepushrebase.wait=python:$TESTTMP/waithook.py:waithook" >> .hg/hgrc
$ echo "prepushrebase.wait=python:$TESTDIR/hgsql/waithook.py:waithook" >> .hg/hgrc
Push from client1 -> server1 and detach. The background job will wait for

View File

@ -118,27 +118,11 @@ Add an extension that logs whenever `manifest.readmf()` is called when the lock
Add a hook to the server to make it spin until .hg/flag exists.
$ cd ../server
$ cat >> $TESTTMP/waithook.py <<EOF
> import time, sys, os, random
> def waithook(ui, repo, **kwargs):
> start = time.time()
> repo._wlockfreeprefix.add('hookrunning')
> repo.vfs.write('hookrunning', '')
> while not repo.vfs.exists('flag'):
> if time.time() - start > 20:
> print >> sys.stderr, "ERROR: Timeout waiting for .hg/flag"
> repo.vfs.unlink('hookrunning')
> return True
> time.sleep(0.05)
> repo.vfs.unlink('hookrunning')
> return False
> EOF
$ echo "[extensions]" >> .hg/hgrc
$ echo "manifestcheck=$TESTTMP/manifestcheck.py" >> .hg/hgrc
$ cp .hg/hgrc .hg/hgrc.bak
$ echo "[hooks]" >> .hg/hgrc
$ echo "prepushrebase.wait=python:$TESTTMP/waithook.py:waithook" >> .hg/hgrc
$ echo "prepushrebase.wait=python:$TESTDIR/hgsql/waithook.py:waithook" >> .hg/hgrc
Push from client1 -> server and detach. The background job will wait for
.hg/flag.