test-push-race.t
897 lines
| 21.6 KiB
| text/troff
|
Tads3Lexer
/ tests / test-push-race.t
r32630 | ============================================================================================ | |||
Test cases where there are race condition between two clients pushing to the same repository | ||||
============================================================================================ | ||||
This file tests cases where two clients push to a server at the same time. The | ||||
"raced" client is done preparing it push bundle when the "racing" client | ||||
perform its push. The "raced" client starts its actual push after the "racing" | ||||
client push is fully complete. | ||||
A set of extension and shell functions ensures this scheduling. | ||||
$ cat >> delaypush.py << EOF | ||||
> """small extension orchestrate push race | ||||
> | ||||
> Client with the extensions will create a file when ready and get stuck until | ||||
> a file is created.""" | ||||
> | ||||
> import atexit | ||||
> import errno | ||||
> import os | ||||
> import time | ||||
> | ||||
> from mercurial import ( | ||||
> exchange, | ||||
> extensions, | ||||
> ) | ||||
> | ||||
> def delaypush(orig, pushop): | ||||
> # notify we are done preparing | ||||
> readypath = pushop.repo.ui.config('delaypush', 'ready-path', None) | ||||
> if readypath is not None: | ||||
> with open(readypath, 'w') as r: | ||||
> r.write('foo') | ||||
> pushop.repo.ui.status('wrote ready: %s\n' % readypath) | ||||
> # now wait for the other process to be done | ||||
> watchpath = pushop.repo.ui.config('delaypush', 'release-path', None) | ||||
> if watchpath is not None: | ||||
> pushop.repo.ui.status('waiting on: %s\n' % watchpath) | ||||
> limit = 100 | ||||
> while 0 < limit and not os.path.exists(watchpath): | ||||
> limit -= 1 | ||||
> time.sleep(0.1) | ||||
> if limit <= 0: | ||||
> repo.ui.warn('exiting without watchfile: %s' % watchpath) | ||||
> else: | ||||
> # delete the file at the end of the push | ||||
> def delete(): | ||||
> try: | ||||
> os.unlink(watchpath) | ||||
> except OSError as exc: | ||||
> if exc.errno != errno.ENOENT: | ||||
> raise | ||||
> atexit.register(delete) | ||||
> return orig(pushop) | ||||
> | ||||
> def uisetup(ui): | ||||
> extensions.wrapfunction(exchange, '_pushbundle2', delaypush) | ||||
> EOF | ||||
$ waiton () { | ||||
> # wait for a file to be created (then delete it) | ||||
> count=100 | ||||
> while [ ! -f $1 ] ; | ||||
> do | ||||
> sleep 0.1; | ||||
> count=`expr $count - 1`; | ||||
> if [ $count -lt 0 ]; | ||||
> then | ||||
> break | ||||
> fi; | ||||
> done | ||||
> [ -f $1 ] || echo "ready file still missing: $1" | ||||
> rm -f $1 | ||||
> } | ||||
$ release () { | ||||
> # create a file and wait for it be deleted | ||||
> count=100 | ||||
> touch $1 | ||||
> while [ -f $1 ] ; | ||||
> do | ||||
> sleep 0.1; | ||||
> count=`expr $count - 1`; | ||||
> if [ $count -lt 0 ]; | ||||
> then | ||||
> break | ||||
> fi; | ||||
> done | ||||
> [ ! -f $1 ] || echo "delay file still exist: $1" | ||||
> } | ||||
$ cat >> $HGRCPATH << EOF | ||||
> [ui] | ||||
> ssh = python "$TESTDIR/dummyssh" | ||||
> # simplify output | ||||
> logtemplate = {node|short} {desc} ({branch}) | ||||
> [alias] | ||||
> graph = log -G --rev 'sort(all(), "topo")' | ||||
> EOF | ||||
Setup | ||||
----- | ||||
create a repo with one root | ||||
$ hg init server | ||||
$ cd server | ||||
$ echo root > root | ||||
$ hg ci -Am "C-ROOT" | ||||
adding root | ||||
$ cd .. | ||||
clone it in two clients | ||||
$ hg clone ssh://user@dummy/server client-racy | ||||
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 | ||||
$ hg clone ssh://user@dummy/server client-other | ||||
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 | ||||
setup one to allow race on push | ||||
$ cat >> client-racy/.hg/hgrc << EOF | ||||
> [extensions] | ||||
> delaypush = $TESTTMP/delaypush.py | ||||
> [delaypush] | ||||
> ready-path = $TESTTMP/readyfile | ||||
> release-path = $TESTTMP/watchfile | ||||
> EOF | ||||
Simple race, both try to push to the server at the same time | ||||
------------------------------------------------------------ | ||||
Both try to replace the same head | ||||
# a | ||||
# | b | ||||
# |/ | ||||
# * | ||||
Creating changesets | ||||
$ echo b > client-other/a | ||||
$ hg -R client-other/ add client-other/a | ||||
$ hg -R client-other/ commit -m "C-A" | ||||
$ echo b > client-racy/b | ||||
$ hg -R client-racy/ add client-racy/b | ||||
$ hg -R client-racy/ commit -m "C-B" | ||||
Pushing | ||||
$ hg -R client-racy push -r 'tip' > ./push-log 2>&1 & | ||||
$ waiton $TESTTMP/readyfile | ||||
$ hg -R client-other push -r 'tip' | ||||
pushing to ssh://user@dummy/server | ||||
searching for changes | ||||
remote: adding changesets | ||||
remote: adding manifests | ||||
remote: adding file changes | ||||
remote: added 1 changesets with 1 changes to 1 files | ||||
$ release $TESTTMP/watchfile | ||||
Check the result of the push | ||||
$ cat ./push-log | ||||
pushing to ssh://user@dummy/server | ||||
searching for changes | ||||
wrote ready: $TESTTMP/readyfile | ||||
waiting on: $TESTTMP/watchfile | ||||
abort: push failed: | ||||
'repository changed while pushing - please try again' | ||||
$ hg -R server graph | ||||
o 98217d5a1659 C-A (default) | ||||
| | ||||
@ 842e2fac6304 C-ROOT (default) | ||||
r32631 | ||||
Pushing on two different heads | ||||
------------------------------ | ||||
Both try to replace a different head | ||||
# a b | ||||
# | | | ||||
# * * | ||||
# |/ | ||||
# * | ||||
(resync-all) | ||||
$ hg -R ./server pull ./client-racy | ||||
pulling from ./client-racy | ||||
searching for changes | ||||
adding changesets | ||||
adding manifests | ||||
adding file changes | ||||
added 1 changesets with 1 changes to 1 files (+1 heads) | ||||
(run 'hg heads' to see heads, 'hg merge' to merge) | ||||
$ hg -R ./client-other pull | ||||
pulling from ssh://user@dummy/server | ||||
searching for changes | ||||
adding changesets | ||||
adding manifests | ||||
adding file changes | ||||
added 1 changesets with 1 changes to 1 files (+1 heads) | ||||
(run 'hg heads' to see heads, 'hg merge' to merge) | ||||
$ hg -R ./client-racy pull | ||||
pulling from ssh://user@dummy/server | ||||
searching for changes | ||||
adding changesets | ||||
adding manifests | ||||
adding file changes | ||||
added 1 changesets with 1 changes to 1 files (+1 heads) | ||||
(run 'hg heads' to see heads, 'hg merge' to merge) | ||||
$ hg -R server graph | ||||
o a9149a1428e2 C-B (default) | ||||
| | ||||
| o 98217d5a1659 C-A (default) | ||||
|/ | ||||
@ 842e2fac6304 C-ROOT (default) | ||||
Creating changesets | ||||
$ echo aa >> client-other/a | ||||
$ hg -R client-other/ commit -m "C-C" | ||||
$ echo bb >> client-racy/b | ||||
$ hg -R client-racy/ commit -m "C-D" | ||||
Pushing | ||||
$ hg -R client-racy push -r 'tip' > ./push-log 2>&1 & | ||||
$ waiton $TESTTMP/readyfile | ||||
$ hg -R client-other push -r 'tip' | ||||
pushing to ssh://user@dummy/server | ||||
searching for changes | ||||
remote: adding changesets | ||||
remote: adding manifests | ||||
remote: adding file changes | ||||
remote: added 1 changesets with 1 changes to 1 files | ||||
$ release $TESTTMP/watchfile | ||||
Check the result of the push | ||||
$ cat ./push-log | ||||
pushing to ssh://user@dummy/server | ||||
searching for changes | ||||
wrote ready: $TESTTMP/readyfile | ||||
waiting on: $TESTTMP/watchfile | ||||
abort: push failed: | ||||
'repository changed while pushing - please try again' | ||||
$ hg -R server graph | ||||
o 51c544a58128 C-C (default) | ||||
| | ||||
o 98217d5a1659 C-A (default) | ||||
| | ||||
| o a9149a1428e2 C-B (default) | ||||
|/ | ||||
@ 842e2fac6304 C-ROOT (default) | ||||
r32632 | Pushing while someone creates a new head | |||
----------------------------------------- | ||||
Pushing a new changeset while someone creates a new branch. | ||||
# a (raced) | ||||
# | | ||||
# * b | ||||
# |/ | ||||
# * | ||||
(resync-all) | ||||
$ hg -R ./server pull ./client-racy | ||||
pulling from ./client-racy | ||||
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 -R ./client-other pull | ||||
pulling from ssh://user@dummy/server | ||||
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 -R ./client-racy pull | ||||
pulling from ssh://user@dummy/server | ||||
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 -R server graph | ||||
o 59e76faf78bd C-D (default) | ||||
| | ||||
o a9149a1428e2 C-B (default) | ||||
| | ||||
| o 51c544a58128 C-C (default) | ||||
| | | ||||
| o 98217d5a1659 C-A (default) | ||||
|/ | ||||
@ 842e2fac6304 C-ROOT (default) | ||||
Creating changesets | ||||
(new head) | ||||
$ hg -R client-other/ up 'desc("C-A")' | ||||
1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
$ echo aaa >> client-other/a | ||||
$ hg -R client-other/ commit -m "C-E" | ||||
created new head | ||||
(children of existing head) | ||||
$ hg -R client-racy/ up 'desc("C-C")' | ||||
1 files updated, 0 files merged, 1 files removed, 0 files unresolved | ||||
$ echo bbb >> client-racy/a | ||||
$ hg -R client-racy/ commit -m "C-F" | ||||
Pushing | ||||
$ hg -R client-racy push -r 'tip' > ./push-log 2>&1 & | ||||
$ waiton $TESTTMP/readyfile | ||||
$ hg -R client-other push -fr 'tip' | ||||
pushing to ssh://user@dummy/server | ||||
searching for changes | ||||
remote: adding changesets | ||||
remote: adding manifests | ||||
remote: adding file changes | ||||
remote: added 1 changesets with 1 changes to 1 files (+1 heads) | ||||
$ release $TESTTMP/watchfile | ||||
Check the result of the push | ||||
$ cat ./push-log | ||||
pushing to ssh://user@dummy/server | ||||
searching for changes | ||||
wrote ready: $TESTTMP/readyfile | ||||
waiting on: $TESTTMP/watchfile | ||||
abort: push failed: | ||||
'repository changed while pushing - please try again' | ||||
$ hg -R server graph | ||||
o d603e2c0cdd7 C-E (default) | ||||
| | ||||
| o 51c544a58128 C-C (default) | ||||
|/ | ||||
o 98217d5a1659 C-A (default) | ||||
| | ||||
| o 59e76faf78bd C-D (default) | ||||
| | | ||||
| o a9149a1428e2 C-B (default) | ||||
|/ | ||||
@ 842e2fac6304 C-ROOT (default) | ||||
r32633 | ||||
Pushing touching different named branch (same topo): new branch raced | ||||
--------------------------------------------------------------------- | ||||
Pushing two children on the same head, one is a different named branch | ||||
# a (raced, branch-a) | ||||
# | | ||||
# | b (default branch) | ||||
# |/ | ||||
# * | ||||
(resync-all) | ||||
$ hg -R ./server pull ./client-racy | ||||
pulling from ./client-racy | ||||
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 -R ./client-other pull | ||||
pulling from ssh://user@dummy/server | ||||
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 -R ./client-racy pull | ||||
pulling from ssh://user@dummy/server | ||||
searching for changes | ||||
adding changesets | ||||
adding manifests | ||||
adding file changes | ||||
added 1 changesets with 1 changes to 1 files (+1 heads) | ||||
(run 'hg heads .' to see heads, 'hg merge' to merge) | ||||
$ hg -R server graph | ||||
o d9e379a8c432 C-F (default) | ||||
| | ||||
o 51c544a58128 C-C (default) | ||||
| | ||||
| o d603e2c0cdd7 C-E (default) | ||||
|/ | ||||
o 98217d5a1659 C-A (default) | ||||
| | ||||
| o 59e76faf78bd C-D (default) | ||||
| | | ||||
| o a9149a1428e2 C-B (default) | ||||
|/ | ||||
@ 842e2fac6304 C-ROOT (default) | ||||
Creating changesets | ||||
(update existing head) | ||||
$ hg -R client-other/ up 'desc("C-F")' | ||||
1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
$ echo aaa >> client-other/a | ||||
$ hg -R client-other/ commit -m "C-G" | ||||
(new named branch from that existing head) | ||||
$ hg -R client-racy/ up 'desc("C-F")' | ||||
0 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
$ echo bbb >> client-racy/a | ||||
$ hg -R client-racy/ branch my-first-test-branch | ||||
marked working directory as branch my-first-test-branch | ||||
(branches are permanent and global, did you want a bookmark?) | ||||
$ hg -R client-racy/ commit -m "C-H" | ||||
Pushing | ||||
$ hg -R client-racy push -r 'tip' --new-branch > ./push-log 2>&1 & | ||||
$ waiton $TESTTMP/readyfile | ||||
$ hg -R client-other push -fr 'tip' | ||||
pushing to ssh://user@dummy/server | ||||
searching for changes | ||||
remote: adding changesets | ||||
remote: adding manifests | ||||
remote: adding file changes | ||||
remote: added 1 changesets with 1 changes to 1 files | ||||
$ release $TESTTMP/watchfile | ||||
Check the result of the push | ||||
$ cat ./push-log | ||||
pushing to ssh://user@dummy/server | ||||
searching for changes | ||||
wrote ready: $TESTTMP/readyfile | ||||
waiting on: $TESTTMP/watchfile | ||||
abort: push failed: | ||||
'repository changed while pushing - please try again' | ||||
$ hg -R server graph | ||||
o 75d69cba5402 C-G (default) | ||||
| | ||||
o d9e379a8c432 C-F (default) | ||||
| | ||||
o 51c544a58128 C-C (default) | ||||
| | ||||
| o d603e2c0cdd7 C-E (default) | ||||
|/ | ||||
o 98217d5a1659 C-A (default) | ||||
| | ||||
| o 59e76faf78bd C-D (default) | ||||
| | | ||||
| o a9149a1428e2 C-B (default) | ||||
|/ | ||||
@ 842e2fac6304 C-ROOT (default) | ||||
r32634 | ||||
pushing touching different named branch (same topo): old branch raced | ||||
--------------------------------------------------------------------- | ||||
Pushing two children on the same head, one is a different named branch | ||||
# a (raced, default-branch) | ||||
# | | ||||
# | b (new branch) | ||||
# |/ | ||||
# * (default-branch) | ||||
(resync-all) | ||||
$ hg -R ./server pull ./client-racy | ||||
pulling from ./client-racy | ||||
searching for changes | ||||
adding changesets | ||||
adding manifests | ||||
adding file changes | ||||
added 1 changesets with 1 changes to 1 files (+1 heads) | ||||
(run 'hg heads .' to see heads, 'hg merge' to merge) | ||||
$ hg -R ./client-other pull | ||||
pulling from ssh://user@dummy/server | ||||
searching for changes | ||||
adding changesets | ||||
adding manifests | ||||
adding file changes | ||||
added 1 changesets with 1 changes to 1 files (+1 heads) | ||||
(run 'hg heads .' to see heads, 'hg merge' to merge) | ||||
$ hg -R ./client-racy pull | ||||
pulling from ssh://user@dummy/server | ||||
searching for changes | ||||
adding changesets | ||||
adding manifests | ||||
adding file changes | ||||
added 1 changesets with 1 changes to 1 files (+1 heads) | ||||
(run 'hg heads' to see heads) | ||||
$ hg -R server graph | ||||
o 833be552cfe6 C-H (my-first-test-branch) | ||||
| | ||||
| o 75d69cba5402 C-G (default) | ||||
|/ | ||||
o d9e379a8c432 C-F (default) | ||||
| | ||||
o 51c544a58128 C-C (default) | ||||
| | ||||
| o d603e2c0cdd7 C-E (default) | ||||
|/ | ||||
o 98217d5a1659 C-A (default) | ||||
| | ||||
| o 59e76faf78bd C-D (default) | ||||
| | | ||||
| o a9149a1428e2 C-B (default) | ||||
|/ | ||||
@ 842e2fac6304 C-ROOT (default) | ||||
Creating changesets | ||||
(new named branch from one head) | ||||
$ hg -R client-other/ up 'desc("C-G")' | ||||
0 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
$ echo aaa >> client-other/a | ||||
$ hg -R client-other/ branch my-second-test-branch | ||||
marked working directory as branch my-second-test-branch | ||||
$ hg -R client-other/ commit -m "C-I" | ||||
(children "updating" that same head) | ||||
$ hg -R client-racy/ up 'desc("C-G")' | ||||
1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
$ echo bbb >> client-racy/a | ||||
$ hg -R client-racy/ commit -m "C-J" | ||||
Pushing | ||||
$ hg -R client-racy push -r 'tip' > ./push-log 2>&1 & | ||||
$ waiton $TESTTMP/readyfile | ||||
$ hg -R client-other push -fr 'tip' --new-branch | ||||
pushing to ssh://user@dummy/server | ||||
searching for changes | ||||
remote: adding changesets | ||||
remote: adding manifests | ||||
remote: adding file changes | ||||
remote: added 1 changesets with 1 changes to 1 files | ||||
$ release $TESTTMP/watchfile | ||||
Check the result of the push | ||||
$ cat ./push-log | ||||
pushing to ssh://user@dummy/server | ||||
searching for changes | ||||
wrote ready: $TESTTMP/readyfile | ||||
waiting on: $TESTTMP/watchfile | ||||
abort: push failed: | ||||
'repository changed while pushing - please try again' | ||||
$ hg -R server graph | ||||
o b35ed749f288 C-I (my-second-test-branch) | ||||
| | ||||
o 75d69cba5402 C-G (default) | ||||
| | ||||
| o 833be552cfe6 C-H (my-first-test-branch) | ||||
|/ | ||||
o d9e379a8c432 C-F (default) | ||||
| | ||||
o 51c544a58128 C-C (default) | ||||
| | ||||
| o d603e2c0cdd7 C-E (default) | ||||
|/ | ||||
o 98217d5a1659 C-A (default) | ||||
| | ||||
| o 59e76faf78bd C-D (default) | ||||
| | | ||||
| o a9149a1428e2 C-B (default) | ||||
|/ | ||||
@ 842e2fac6304 C-ROOT (default) | ||||
r32635 | ||||
pushing racing push touch multiple heads | ||||
---------------------------------------- | ||||
There are multiple heads, but the racing push touch all of them | ||||
# a (raced) | ||||
# | b | ||||
# |/| | ||||
# * * | ||||
# |/ | ||||
# * | ||||
(resync-all) | ||||
$ hg -R ./server pull ./client-racy | ||||
pulling from ./client-racy | ||||
searching for changes | ||||
adding changesets | ||||
adding manifests | ||||
adding file changes | ||||
added 1 changesets with 1 changes to 1 files (+1 heads) | ||||
(run 'hg heads .' to see heads, 'hg merge' to merge) | ||||
$ hg -R ./client-other pull | ||||
pulling from ssh://user@dummy/server | ||||
searching for changes | ||||
adding changesets | ||||
adding manifests | ||||
adding file changes | ||||
added 1 changesets with 1 changes to 1 files (+1 heads) | ||||
(run 'hg heads' to see heads) | ||||
$ hg -R ./client-racy pull | ||||
pulling from ssh://user@dummy/server | ||||
searching for changes | ||||
adding changesets | ||||
adding manifests | ||||
adding file changes | ||||
added 1 changesets with 1 changes to 1 files (+1 heads) | ||||
(run 'hg heads .' to see heads, 'hg merge' to merge) | ||||
$ hg -R server graph | ||||
o 89420bf00fae C-J (default) | ||||
| | ||||
| o b35ed749f288 C-I (my-second-test-branch) | ||||
|/ | ||||
o 75d69cba5402 C-G (default) | ||||
| | ||||
| o 833be552cfe6 C-H (my-first-test-branch) | ||||
|/ | ||||
o d9e379a8c432 C-F (default) | ||||
| | ||||
o 51c544a58128 C-C (default) | ||||
| | ||||
| o d603e2c0cdd7 C-E (default) | ||||
|/ | ||||
o 98217d5a1659 C-A (default) | ||||
| | ||||
| o 59e76faf78bd C-D (default) | ||||
| | | ||||
| o a9149a1428e2 C-B (default) | ||||
|/ | ||||
@ 842e2fac6304 C-ROOT (default) | ||||
Creating changesets | ||||
(merges heads) | ||||
$ hg -R client-other/ up 'desc("C-E")' | ||||
1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
$ hg -R client-other/ merge 'desc("C-D")' | ||||
1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
(branch merge, don't forget to commit) | ||||
$ hg -R client-other/ commit -m "C-K" | ||||
(update one head) | ||||
$ hg -R client-racy/ up 'desc("C-D")' | ||||
1 files updated, 0 files merged, 1 files removed, 0 files unresolved | ||||
$ echo bbb >> client-racy/b | ||||
$ hg -R client-racy/ commit -m "C-L" | ||||
Pushing | ||||
$ hg -R client-racy push -r 'tip' > ./push-log 2>&1 & | ||||
$ waiton $TESTTMP/readyfile | ||||
$ hg -R client-other push -fr 'tip' --new-branch | ||||
pushing to ssh://user@dummy/server | ||||
searching for changes | ||||
remote: adding changesets | ||||
remote: adding manifests | ||||
remote: adding file changes | ||||
remote: added 1 changesets with 0 changes to 0 files (-1 heads) | ||||
$ release $TESTTMP/watchfile | ||||
Check the result of the push | ||||
$ cat ./push-log | ||||
pushing to ssh://user@dummy/server | ||||
searching for changes | ||||
wrote ready: $TESTTMP/readyfile | ||||
waiting on: $TESTTMP/watchfile | ||||
abort: push failed: | ||||
'repository changed while pushing - please try again' | ||||
$ hg -R server graph | ||||
o be705100c623 C-K (default) | ||||
|\ | ||||
| o d603e2c0cdd7 C-E (default) | ||||
| | | ||||
o | 59e76faf78bd C-D (default) | ||||
| | | ||||
| | o 89420bf00fae C-J (default) | ||||
| | | | ||||
| | | o b35ed749f288 C-I (my-second-test-branch) | ||||
| | |/ | ||||
| | o 75d69cba5402 C-G (default) | ||||
| | | | ||||
| | | o 833be552cfe6 C-H (my-first-test-branch) | ||||
| | |/ | ||||
| | o d9e379a8c432 C-F (default) | ||||
| | | | ||||
| | o 51c544a58128 C-C (default) | ||||
| |/ | ||||
o | a9149a1428e2 C-B (default) | ||||
| | | ||||
| o 98217d5a1659 C-A (default) | ||||
|/ | ||||
@ 842e2fac6304 C-ROOT (default) | ||||
r32636 | ||||
pushing raced push touch multiple heads | ||||
--------------------------------------- | ||||
There are multiple heads, the raced push touch all of them | ||||
# b | ||||
# | a (raced) | ||||
# |/| | ||||
# * * | ||||
# |/ | ||||
# * | ||||
(resync-all) | ||||
$ hg -R ./server pull ./client-racy | ||||
pulling from ./client-racy | ||||
searching for changes | ||||
adding changesets | ||||
adding manifests | ||||
adding file changes | ||||
added 1 changesets with 1 changes to 1 files (+1 heads) | ||||
(run 'hg heads .' to see heads, 'hg merge' to merge) | ||||
$ hg -R ./client-other pull | ||||
pulling from ssh://user@dummy/server | ||||
searching for changes | ||||
adding changesets | ||||
adding manifests | ||||
adding file changes | ||||
added 1 changesets with 1 changes to 1 files (+1 heads) | ||||
(run 'hg heads .' to see heads, 'hg merge' to merge) | ||||
$ hg -R ./client-racy pull | ||||
pulling from ssh://user@dummy/server | ||||
searching for changes | ||||
adding changesets | ||||
adding manifests | ||||
adding file changes | ||||
added 1 changesets with 0 changes to 0 files | ||||
(run 'hg update' to get a working copy) | ||||
$ hg -R server graph | ||||
o cac2cead0ff0 C-L (default) | ||||
| | ||||
| o be705100c623 C-K (default) | ||||
|/| | ||||
| o d603e2c0cdd7 C-E (default) | ||||
| | | ||||
o | 59e76faf78bd C-D (default) | ||||
| | | ||||
| | o 89420bf00fae C-J (default) | ||||
| | | | ||||
| | | o b35ed749f288 C-I (my-second-test-branch) | ||||
| | |/ | ||||
| | o 75d69cba5402 C-G (default) | ||||
| | | | ||||
| | | o 833be552cfe6 C-H (my-first-test-branch) | ||||
| | |/ | ||||
| | o d9e379a8c432 C-F (default) | ||||
| | | | ||||
| | o 51c544a58128 C-C (default) | ||||
| |/ | ||||
o | a9149a1428e2 C-B (default) | ||||
| | | ||||
| o 98217d5a1659 C-A (default) | ||||
|/ | ||||
@ 842e2fac6304 C-ROOT (default) | ||||
Creating changesets | ||||
(update existing head) | ||||
$ echo aaa >> client-other/a | ||||
$ hg -R client-other/ commit -m "C-M" | ||||
(merge heads) | ||||
$ hg -R client-racy/ merge 'desc("C-K")' | ||||
1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
(branch merge, don't forget to commit) | ||||
$ hg -R client-racy/ commit -m "C-N" | ||||
Pushing | ||||
$ hg -R client-racy push -r 'tip' > ./push-log 2>&1 & | ||||
$ waiton $TESTTMP/readyfile | ||||
$ hg -R client-other push -fr 'tip' --new-branch | ||||
pushing to ssh://user@dummy/server | ||||
searching for changes | ||||
remote: adding changesets | ||||
remote: adding manifests | ||||
remote: adding file changes | ||||
remote: added 1 changesets with 1 changes to 1 files | ||||
$ release $TESTTMP/watchfile | ||||
Check the result of the push | ||||
$ cat ./push-log | ||||
pushing to ssh://user@dummy/server | ||||
searching for changes | ||||
wrote ready: $TESTTMP/readyfile | ||||
waiting on: $TESTTMP/watchfile | ||||
abort: push failed: | ||||
'repository changed while pushing - please try again' | ||||
$ hg -R server graph | ||||
o 6fd3090135df C-M (default) | ||||
| | ||||
o be705100c623 C-K (default) | ||||
|\ | ||||
| o d603e2c0cdd7 C-E (default) | ||||
| | | ||||
+---o cac2cead0ff0 C-L (default) | ||||
| | | ||||
o | 59e76faf78bd C-D (default) | ||||
| | | ||||
| | o 89420bf00fae C-J (default) | ||||
| | | | ||||
| | | o b35ed749f288 C-I (my-second-test-branch) | ||||
| | |/ | ||||
| | o 75d69cba5402 C-G (default) | ||||
| | | | ||||
| | | o 833be552cfe6 C-H (my-first-test-branch) | ||||
| | |/ | ||||
| | o d9e379a8c432 C-F (default) | ||||
| | | | ||||
| | o 51c544a58128 C-C (default) | ||||
| |/ | ||||
o | a9149a1428e2 C-B (default) | ||||
| | | ||||
| o 98217d5a1659 C-A (default) | ||||
|/ | ||||
@ 842e2fac6304 C-ROOT (default) | ||||