--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-obsolete-distributed.t Fri Sep 29 19:59:15 2017 +0100
@@ -0,0 +1,207 @@
+=============================
+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'}