##// END OF EJS Templates
test: add a test file dedicated to an important distributed case...
test: add a test file dedicated to an important distributed case This test file introduces documented test case for obsolescence markers usage that are important to distributed workflow cases. In the distributed case, new changesets, markers, and phases can be added in orders that would not happen during the local only usage. Documenting these scenarios and test them is important as we make progress with various obsolescence aspects.

File last commit:

r34651:6c85f4e3 default
r34651:6c85f4e3 default
Show More
test-obsolete-distributed.t
207 lines | 7.1 KiB | text/troff | Tads3Lexer
/ tests / test-obsolete-distributed.t
=============================
Test distributed obsolescence
=============================
This file test various cases where data (changeset, phase, obsmarkers) is
added to the repository in a specific order. Usually, this order is unlikely
to happen in the local case but can easily happen in the distributed case.
$ unset HGUSER
$ unset EMAIL
$ . $TESTDIR/testlib/obsmarker-common.sh
$ cat >> $HGRCPATH << EOF
> [experimental]
> evolution = all
> [phases]
> publish = False
> [templates]
> obsfatesuccessors = "{if(successors, " as ")}{join(successors, ", ")}"
> obsfateverb = "{obsfateverb(successors)}"
> obsfateoperations = "{if(obsfateoperations(markers), " using {join(obsfateoperations(markers), ", ")}")}"
> obsfateusers = "{if(obsfateusers(markers), " by {join(obsfateusers(markers), ", ")}")}"
> obsfatedate = "{if(obsfatedate(markers), "{ifeq(min(obsfatedate(markers)), max(obsfatedate(markers)), " (at {min(obsfatedate(markers))|isodate})", " (between {min(obsfatedate(markers))|isodate} and {max(obsfatedate(markers))|isodate})")}")}"
> obsfate = "{obsfateverb}{obsfateoperations}{obsfatesuccessors}{obsfateusers}{obsfatedate}; "
> [ui]
> logtemplate= {rev}:{node|short} {desc} {if(succsandmarkers, "[{succsandmarkers % "{obsfate}"}]")}\n
> EOF
Check distributed chain building
================================
Test case where a changeset is marked as a successor of another local
changeset while the successor has already been obsoleted remotely.
The chain of evolution should seamlessly connect and all but the new version
(created remotely) should be seen as obsolete.
Initial setup
$ mkdir distributed-chain-building
$ cd distributed-chain-building
$ hg init server
$ cd server
$ cat << EOF >> .hg/hgrc
> [ui]
> username = server
> EOF
$ mkcommit ROOT
$ mkcommit c_A0
$ hg up 'desc("ROOT")'
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ mkcommit c_A1
created new head
$ hg up 'desc("ROOT")'
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ mkcommit c_B0
created new head
$ hg debugobsolete `getid 'desc("c_A0")'` `getid 'desc("c_A1")'`
obsoleted 1 changesets
$ hg log -G --hidden
@ 3:e5d7dda7cd28 c_B0
|
| o 2:7f6b0a6f5c25 c_A1
|/
| x 1:e1b46f0f979f c_A0 [rewritten as 2:7f6b0a6f5c25 by server (at 1970-01-01 00:00 +0000); ]
|/
o 0:e82fb8d02bbf ROOT
$ hg debugobsolete
e1b46f0f979f52748347ff8729c59f2ef56e6fe2 7f6b0a6f5c25345a83870963efd827c1798a5959 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'server'}
$ cd ..
duplicate the repo for the client:
$ cp -R server client
$ cat << EOF >> client/.hg/hgrc
> [paths]
> default = ../server/
> [ui]
> username = client
> EOF
server side: create new revision on the server (obsoleting another one)
$ cd server
$ hg up 'desc("ROOT")'
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ mkcommit c_B1
created new head
$ hg debugobsolete `getid 'desc("c_B0")'` `getid 'desc("c_B1")'`
obsoleted 1 changesets
$ hg log -G
@ 4:391a2bf12b1b c_B1
|
| o 2:7f6b0a6f5c25 c_A1
|/
o 0:e82fb8d02bbf ROOT
$ hg log -G --hidden
@ 4:391a2bf12b1b c_B1
|
| x 3:e5d7dda7cd28 c_B0 [rewritten as 4:391a2bf12b1b by server (at 1970-01-01 00:00 +0000); ]
|/
| o 2:7f6b0a6f5c25 c_A1
|/
| x 1:e1b46f0f979f c_A0 [rewritten as 2:7f6b0a6f5c25 by server (at 1970-01-01 00:00 +0000); ]
|/
o 0:e82fb8d02bbf ROOT
$ hg debugobsolete
e1b46f0f979f52748347ff8729c59f2ef56e6fe2 7f6b0a6f5c25345a83870963efd827c1798a5959 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'server'}
e5d7dda7cd28e6b3f79437e5b8122a38ece0255c 391a2bf12b1b8b05a72400ae36b26d50a091dc22 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'server'}
$ cd ..
client side: create a marker between two common changesets
(client is not aware of the server activity yet)
$ cd client
$ hg debugobsolete `getid 'desc("c_A1")'` `getid 'desc("c_B0")'`
obsoleted 1 changesets
$ hg log -G
@ 3:e5d7dda7cd28 c_B0
|
o 0:e82fb8d02bbf ROOT
$ hg log -G --hidden
@ 3:e5d7dda7cd28 c_B0
|
| x 2:7f6b0a6f5c25 c_A1 [rewritten as 3:e5d7dda7cd28 by client (at 1970-01-01 00:00 +0000); ]
|/
| x 1:e1b46f0f979f c_A0 [rewritten as 2:7f6b0a6f5c25 by server (at 1970-01-01 00:00 +0000); ]
|/
o 0:e82fb8d02bbf ROOT
$ hg debugobsolete
e1b46f0f979f52748347ff8729c59f2ef56e6fe2 7f6b0a6f5c25345a83870963efd827c1798a5959 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'server'}
7f6b0a6f5c25345a83870963efd827c1798a5959 e5d7dda7cd28e6b3f79437e5b8122a38ece0255c 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'client'}
client side: pull from the server
(the new successors should take over)
$ hg up 'desc("ROOT")'
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg pull
pulling from $TESTTMP/distributed-chain-building/server (glob)
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files (+1 heads)
1 new obsolescence markers
obsoleted 1 changesets
(run 'hg heads' to see heads)
$ hg log -G
o 4:391a2bf12b1b c_B1
|
@ 0:e82fb8d02bbf ROOT
$ hg log -G --hidden
o 4:391a2bf12b1b c_B1
|
| x 3:e5d7dda7cd28 c_B0 [rewritten as 4:391a2bf12b1b by server (at 1970-01-01 00:00 +0000); ]
|/
| x 2:7f6b0a6f5c25 c_A1 [rewritten as 3:e5d7dda7cd28 by client (at 1970-01-01 00:00 +0000); ]
|/
| x 1:e1b46f0f979f c_A0 [rewritten as 2:7f6b0a6f5c25 by server (at 1970-01-01 00:00 +0000); ]
|/
@ 0:e82fb8d02bbf ROOT
$ hg debugobsolete
e1b46f0f979f52748347ff8729c59f2ef56e6fe2 7f6b0a6f5c25345a83870963efd827c1798a5959 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'server'}
7f6b0a6f5c25345a83870963efd827c1798a5959 e5d7dda7cd28e6b3f79437e5b8122a38ece0255c 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'client'}
e5d7dda7cd28e6b3f79437e5b8122a38ece0255c 391a2bf12b1b8b05a72400ae36b26d50a091dc22 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'server'}
server side: receive client push
(the other way around, pushing to the server, the obsolete changesets stay
obsolete on the server side but the marker is sent out.)
$ hg rollback
repository tip rolled back to revision 3 (undo pull)
$ hg push -f
pushing to $TESTTMP/distributed-chain-building/server (glob)
searching for changes
adding changesets
adding manifests
adding file changes
added 0 changesets with 0 changes to 1 files
1 new obsolescence markers
obsoleted 1 changesets
$ hg -R ../server/ log -G
@ 4:391a2bf12b1b c_B1
|
o 0:e82fb8d02bbf ROOT
$ hg -R ../server/ log -G --hidden
@ 4:391a2bf12b1b c_B1
|
| x 3:e5d7dda7cd28 c_B0 [rewritten as 4:391a2bf12b1b by server (at 1970-01-01 00:00 +0000); ]
|/
| x 2:7f6b0a6f5c25 c_A1 [rewritten as 3:e5d7dda7cd28 by client (at 1970-01-01 00:00 +0000); ]
|/
| x 1:e1b46f0f979f c_A0 [rewritten as 2:7f6b0a6f5c25 by server (at 1970-01-01 00:00 +0000); ]
|/
o 0:e82fb8d02bbf ROOT
$ hg debugobsolete
e1b46f0f979f52748347ff8729c59f2ef56e6fe2 7f6b0a6f5c25345a83870963efd827c1798a5959 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'server'}
7f6b0a6f5c25345a83870963efd827c1798a5959 e5d7dda7cd28e6b3f79437e5b8122a38ece0255c 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'client'}