changeset 2277:61d885899466 stable

checkheads: update tests to match the one in core These test now exists in core, so we update the evolve version.
author Pierre-Yves David <pierre-yves.david@ens-lyon.org>
date Thu, 20 Apr 2017 12:24:43 +0200
parents 2d55ae0d6ce7
children 2db189baf8b7 812b866f193c
files tests/test-checkheads-partial-C1.t tests/test-checkheads-partial-C2.t tests/test-checkheads-partial-C3.t tests/test-checkheads-partial-C4.t tests/test-checkheads-pruned-B1.t tests/test-checkheads-pruned-B2.t tests/test-checkheads-pruned-B3.t tests/test-checkheads-pruned-B4.t tests/test-checkheads-pruned-B5.t tests/test-checkheads-pruned-B6.t tests/test-checkheads-pruned-B7.t tests/test-checkheads-pruned-B8.t tests/test-checkheads-superceed-A1.t tests/test-checkheads-superceed-A2.t tests/test-checkheads-superceed-A3.t tests/test-checkheads-superceed-A4.t tests/test-checkheads-superceed-A5.t tests/test-checkheads-superceed-A6.t tests/test-checkheads-superceed-A7.t tests/test-checkheads-superceed-A8.t tests/test-checkheads-unpushed-D1.t tests/test-checkheads-unpushed-D2.t tests/test-checkheads-unpushed-D3.t tests/test-checkheads-unpushed-D4.t tests/test-checkheads-unpushed-D5.t tests/test-checkheads-unpushed-D6.t tests/test-checkheads-unpushed-D7.t tests/test-push-checkheads-partial-C1.t tests/test-push-checkheads-partial-C2.t tests/test-push-checkheads-partial-C3.t tests/test-push-checkheads-partial-C4.t tests/test-push-checkheads-pruned-B1.t tests/test-push-checkheads-pruned-B2.t tests/test-push-checkheads-pruned-B3.t tests/test-push-checkheads-pruned-B4.t tests/test-push-checkheads-pruned-B5.t tests/test-push-checkheads-pruned-B6.t tests/test-push-checkheads-pruned-B7.t tests/test-push-checkheads-pruned-B8.t tests/test-push-checkheads-superceed-A1.t tests/test-push-checkheads-superceed-A2.t tests/test-push-checkheads-superceed-A3.t tests/test-push-checkheads-superceed-A4.t tests/test-push-checkheads-superceed-A5.t tests/test-push-checkheads-superceed-A6.t tests/test-push-checkheads-superceed-A7.t tests/test-push-checkheads-superceed-A8.t tests/test-push-checkheads-unpushed-D1.t tests/test-push-checkheads-unpushed-D2.t tests/test-push-checkheads-unpushed-D3.t tests/test-push-checkheads-unpushed-D4.t tests/test-push-checkheads-unpushed-D5.t tests/test-push-checkheads-unpushed-D6.t tests/test-push-checkheads-unpushed-D7.t tests/testlib/checkheads-util.sh tests/testlib/push-checkheads-util.sh
diffstat 56 files changed, 2385 insertions(+), 2292 deletions(-) [+]
line wrap: on
line diff
--- a/tests/test-checkheads-partial-C1.t	Thu Apr 20 11:43:57 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,79 +0,0 @@
-====================================
-Testing head checking code: Case C-1
-====================================
-
-Mercurial checks for the introduction of multiple heads on push. Evolution
-comes into play to detect if existing heads on the server are being replaced by
-some of the new heads we push.
-
-This test file is part of a series of tests checking this behavior.
-
-Category C: checking case were the branch is only partially obsoleted.
-TestCase 1: 2 changeset branch, only the head is rewritten
-
-.. old-state:
-..
-.. * 2 changeset branch
-..
-.. new-state:
-..
-.. * 1 new changesets branches superceeding only the head of the old one
-.. * base of the old branch is still alive
-..
-.. expected-result:
-..
-.. * push denied
-..
-.. graph-summary:
-..
-..   B ø⇠◔ B'
-..     | |
-..   A ○ |
-..     |/
-..     ○
-
-  $ . $TESTDIR/testlib/checkheads-util.sh
-
-Test setup
-----------
-
-  $ setuprepos
-  creating basic server and client repo
-  updating to branch default
-  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ cd server
-  $ mkcommit B0
-  $ cd ../client
-  $ hg pull
-  pulling from $TESTTMP/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 up 0
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit B1
-  created new head
-  $ hg debugobsolete `getid "desc(B0)" ` `getid "desc(B1)"`
-  $ hg log -G --hidden
-  @  25c56d33e4c4 (draft): B1
-  |
-  | x  d73caddc5533 (draft): B0
-  | |
-  | o  8aaa48160adc (draft): A0
-  |/
-  o  1e4be0697311 (public): root
-  
-
-
-Actual testing
---------------
-
-  $ hg push
-  pushing to $TESTTMP/server
-  searching for changes
-  abort: push creates new remote head 25c56d33e4c4!
-  (merge or see 'hg help push' for details about pushing new heads)
-  [255]
--- a/tests/test-checkheads-partial-C2.t	Thu Apr 20 11:43:57 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,79 +0,0 @@
-====================================
-Testing head checking code: Case C-2
-====================================
-
-Mercurial checks for the introduction of multiple heads on push. Evolution
-comes into play to detect if existing heads on the server are being replaced by
-some of the new heads we push.
-
-This test file is part of a series of tests checking this behavior.
-
-Category C: checking case were the branch is only partially obsoleted.
-TestCase 2: 2 changeset branch, only the base is rewritten
-
-.. old-state:
-..
-.. * 2 changeset branch
-..
-.. new-state:
-..
-.. * 1 new changesets branches superceeding only the base of the old one
-.. * The old branch is still alive (base is obsolete, head is alive)
-..
-.. expected-result:
-..
-.. * push denied
-..
-.. graph-summary:
-..
-..   B ○
-..     |
-..   A ø⇠◔ A'
-..     |/
-..     ○
-
-  $ . $TESTDIR/testlib/checkheads-util.sh
-
-Test setup
-----------
-
-  $ setuprepos
-  creating basic server and client repo
-  updating to branch default
-  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ cd server
-  $ mkcommit B0
-  $ cd ../client
-  $ hg pull
-  pulling from $TESTTMP/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 up 0
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit A1
-  created new head
-  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
-  $ hg log -G --hidden
-  @  f6082bc4ffef (draft): A1
-  |
-  | o  d73caddc5533 (draft): B0
-  | |
-  | x  8aaa48160adc (draft): A0
-  |/
-  o  1e4be0697311 (public): root
-  
-
-
-Actual testing
---------------
-
-  $ hg push --rev 'desc(A1)'
-  pushing to $TESTTMP/server
-  searching for changes
-  abort: push creates new remote head f6082bc4ffef!
-  (merge or see 'hg help push' for details about pushing new heads)
-  [255]
--- a/tests/test-checkheads-partial-C3.t	Thu Apr 20 11:43:57 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,78 +0,0 @@
-====================================
-Testing head checking code: Case C-3
-====================================
-
-Mercurial checks for the introduction of multiple heads on push. Evolution
-comes into play to detect if existing heads on the server are being replaced by
-some of the new heads we push.
-
-This test file is part of a series of tests checking this behavior.
-
-Category C: checking case were the branch is only partially obsoleted.
-TestCase 3: 2 changeset branch, only the head is pruned
-
-.. old-state:
-..
-.. * 2 changeset branch
-..
-.. new-state:
-..
-.. * old head is pruned
-.. * 1 new unrelated branch
-..
-.. expected-result:
-..
-.. * push denied
-..
-.. graph-summary:
-..
-..   B ⊗
-..     |
-..   A ◔ ◔ C
-..     |/
-..     ○
-
-  $ . $TESTDIR/testlib/checkheads-util.sh
-
-Test setup
-----------
-
-  $ setuprepos
-  creating basic server and client repo
-  updating to branch default
-  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ cd server
-  $ mkcommit B0
-  $ cd ../client
-  $ hg pull
-  pulling from $TESTTMP/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 up 0
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit C0
-  created new head
-  $ hg debugobsolete --record-parents `getid "desc(B0)"`
-  $ hg log -G --hidden
-  @  0f88766e02d6 (draft): C0
-  |
-  | x  d73caddc5533 (draft): B0
-  | |
-  | o  8aaa48160adc (draft): A0
-  |/
-  o  1e4be0697311 (public): root
-  
-
-Actual testing
---------------
-
-  $ hg push
-  pushing to $TESTTMP/server
-  searching for changes
-  abort: push creates new remote head 0f88766e02d6!
-  (merge or see 'hg help push' for details about pushing new heads)
-  [255]
--- a/tests/test-checkheads-partial-C4.t	Thu Apr 20 11:43:57 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,78 +0,0 @@
-====================================
-Testing head checking code: Case C-4
-====================================
-
-Mercurial checks for the introduction of multiple heads on push. Evolution
-comes into play to detect if existing heads on the server are being replaced by
-some of the new heads we push.
-
-This test file is part of a series of tests checking this behavior.
-
-Category C: checking case were the branch is only partially obsoleted.
-TestCase 4: 2 changeset branch, only the base is pruned
-
-.. old-state:
-..
-.. * 2 changeset branch
-..
-.. new-state:
-..
-.. * old base is pruned
-.. * 1 new unrelated branch
-..
-.. expected-result:
-..
-.. * push denied
-..
-.. graph-summary:
-..
-..   B ◔
-..     |
-..   A ⊗ ◔ C
-..     |/
-..     ○
-
-  $ . $TESTDIR/testlib/checkheads-util.sh
-
-Test setup
-----------
-
-  $ setuprepos
-  creating basic server and client repo
-  updating to branch default
-  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ cd server
-  $ mkcommit B0
-  $ cd ../client
-  $ hg pull
-  pulling from $TESTTMP/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 up 0
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit C0
-  created new head
-  $ hg debugobsolete --record-parents `getid "desc(A0)"`
-  $ hg log -G --hidden
-  @  0f88766e02d6 (draft): C0
-  |
-  | o  d73caddc5533 (draft): B0
-  | |
-  | x  8aaa48160adc (draft): A0
-  |/
-  o  1e4be0697311 (public): root
-  
-
-Actual testing
---------------
-
-  $ hg push --rev 'desc(C0)'
-  pushing to $TESTTMP/server
-  searching for changes
-  abort: push creates new remote head 0f88766e02d6!
-  (merge or see 'hg help push' for details about pushing new heads)
-  [255]
--- a/tests/test-checkheads-pruned-B1.t	Thu Apr 20 11:43:57 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,71 +0,0 @@
-====================================
-Testing head checking code: Case B-1
-====================================
-
-Mercurial checks for the introduction of multiple heads on push. Evolution
-comes into play to detect if existing heads on the server are being replaced by
-some of the new heads we push.
-
-This test file is part of a series of tests checking this behavior.
-
-Category B: checking simple case involving pruned changesets
-TestCase 1: single pruned changeset
-
-.. old-state:
-..
-.. * 1 changeset branch
-..
-.. new-state:
-..
-.. * old branch is pruned
-.. * 1 new unrelated branch
-..
-.. expected-result:
-..
-.. * push allowed
-..
-.. graph-summary:
-..
-..       ◔ B
-..       |
-..   A ⊗ |
-..     |/
-..     ○
-
-  $ . $TESTDIR/testlib/checkheads-util.sh
-
-Test setup
-----------
-
-  $ setuprepos
-  creating basic server and client repo
-  updating to branch default
-  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ cd client
-  $ hg up 0
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit B0
-  created new head
-  $ hg debugobsolete --record-parents `getid "desc(A0)"`
-  $ hg log -G --hidden
-  @  74ff5441d343 (draft): B0
-  |
-  | x  8aaa48160adc (draft): A0
-  |/
-  o  1e4be0697311 (public): root
-  
-
-Actual testing
---------------
-
-  $ hg push
-  pushing to $TESTTMP/server
-  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
-
-
-
--- a/tests/test-checkheads-pruned-B2.t	Thu Apr 20 11:43:57 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,82 +0,0 @@
-====================================
-Testing head checking code: Case B-2
-====================================
-
-Mercurial checks for the introduction of multiple heads on push. Evolution
-comes into play to detect if existing heads on the server are being replaced by
-some of the new heads we push.
-
-This test file is part of a series of tests checking this behavior.
-
-Category B: checking simple case involving pruned changesets
-TestCase 2: multi-changeset branch, head is pruned, rest is superceeded
-
-.. old-state:
-..
-.. * 2 changeset branch
-..
-.. new-state:
-..
-.. * old head is pruned
-.. * 1 new branch succeeding to the other changeset in the old branch
-..
-.. expected-result:
-..
-.. * push allowed
-..
-.. graph-summary:
-..
-..   B ⊗
-..     |
-..   A ø⇠◔ A'
-..     |/
-..     ○
-
-  $ . $TESTDIR/testlib/checkheads-util.sh
-
-Test setup
-----------
-
-  $ setuprepos
-  creating basic server and client repo
-  updating to branch default
-  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ cd server
-  $ mkcommit B0
-  $ cd ../client
-  $ hg pull
-  pulling from $TESTTMP/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 up 0
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit A1
-  created new head
-  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
-  $ hg debugobsolete --record-parents `getid "desc(B0)"`
-  $ hg log -G --hidden
-  @  f6082bc4ffef (draft): A1
-  |
-  | x  d73caddc5533 (draft): B0
-  | |
-  | x  8aaa48160adc (draft): A0
-  |/
-  o  1e4be0697311 (public): root
-  
-
-Actual testing
---------------
-
-  $ hg push
-  pushing to $TESTTMP/server
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files (+1 heads)
-  2 new obsolescence markers
-
--- a/tests/test-checkheads-pruned-B3.t	Thu Apr 20 11:43:57 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,82 +0,0 @@
-====================================
-Testing head checking code: Case B-3
-====================================
-
-Mercurial checks for the introduction of multiple heads on push. Evolution
-comes into play to detect if existing heads on the server are being replaced by
-some of the new heads we push.
-
-This test file is part of a series of tests checking this behavior.
-
-Category B: checking simple case involving pruned changesets
-TestCase 3: multi-changeset branch, other is pruned, rest is superceeded
-
-.. old-state:
-..
-.. * 2 changeset branch
-..
-.. new-state:
-..
-.. * old head is superceeded
-.. * old other is pruned
-..
-.. expected-result:
-..
-.. * push allowed
-..
-.. graph-summary:
-..
-..   B ø⇠◔ B'
-..     | |
-..   A ⊗ |
-..     |/
-..     ○
-
-  $ . $TESTDIR/testlib/checkheads-util.sh
-
-Test setup
-----------
-
-  $ setuprepos
-  creating basic server and client repo
-  updating to branch default
-  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ cd server
-  $ mkcommit B0
-  $ cd ../client
-  $ hg pull
-  pulling from $TESTTMP/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 up 0
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit B1
-  created new head
-  $ hg debugobsolete --record-parents `getid "desc(A0)"`
-  $ hg debugobsolete `getid "desc(B0)" ` `getid "desc(B1)"`
-  $ hg log -G --hidden
-  @  25c56d33e4c4 (draft): B1
-  |
-  | x  d73caddc5533 (draft): B0
-  | |
-  | x  8aaa48160adc (draft): A0
-  |/
-  o  1e4be0697311 (public): root
-  
-
-Actual testing
---------------
-
-  $ hg push
-  pushing to $TESTTMP/server
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files (+1 heads)
-  2 new obsolescence markers
-
--- a/tests/test-checkheads-pruned-B4.t	Thu Apr 20 11:43:57 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,83 +0,0 @@
-====================================
-Testing head checking code: Case B-4
-====================================
-
-Mercurial checks for the introduction of multiple heads on push. Evolution
-comes into play to detect if existing heads on the server are being replaced by
-some of the new heads we push.
-
-This test file is part of a series of tests checking this behavior.
-
-Category B: checking simple case involving pruned changesets
-TestCase 4: multi-changeset branch, all are pruned
-
-.. old-state:
-..
-.. * 2 changeset branch
-..
-.. new-state:
-..
-.. * old branch is pruned
-..
-.. expected-result:
-..
-.. * push allowed
-..
-.. graph-summary:
-..
-..   B ⊗
-..     |
-..   A ⊗
-..     |
-..     | ◔ C
-..     |/
-..     ○
-
-  $ . $TESTDIR/testlib/checkheads-util.sh
-
-Test setup
-----------
-
-  $ setuprepos
-  creating basic server and client repo
-  updating to branch default
-  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ cd server
-  $ mkcommit B0
-  $ cd ../client
-  $ hg pull
-  pulling from $TESTTMP/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 up 0
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit C0
-  created new head
-  $ hg debugobsolete --record-parents `getid "desc(A0)"`
-  $ hg debugobsolete --record-parents `getid "desc(B0)"`
-  $ hg log -G --hidden
-  @  0f88766e02d6 (draft): C0
-  |
-  | x  d73caddc5533 (draft): B0
-  | |
-  | x  8aaa48160adc (draft): A0
-  |/
-  o  1e4be0697311 (public): root
-  
-
-Actual testing
---------------
-
-  $ hg push
-  pushing to $TESTTMP/server
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files (+1 heads)
-  2 new obsolescence markers
-
--- a/tests/test-checkheads-pruned-B5.t	Thu Apr 20 11:43:57 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,89 +0,0 @@
-====================================
-Testing head checking code: Case B-5
-====================================
-
-Mercurial checks for the introduction of multiple heads on push. Evolution
-comes into play to detect if existing heads on the server are being replaced by
-some of the new heads we push.
-
-This test file is part of a series of tests checking this behavior.
-
-Category B: checking simple case involving pruned changesets
-TestCase 5: multi-changeset branch, mix of pruned and superceeded
-
-.. old-state:
-..
-.. * 3 changeset branch
-..
-.. new-state:
-..
-.. * old head is pruned
-.. * old mid is superceeded
-.. * old root is pruned
-..
-.. expected-result:
-..
-.. * push allowed
-..
-.. graph-summary:
-..
-..   B ⊗
-..     |
-..   A ø⇠◔ A'
-..     | |
-..   B ⊗ |
-..     |/
-..     ○
-
-  $ . $TESTDIR/testlib/checkheads-util.sh
-
-Test setup
-----------
-
-  $ setuprepos
-  creating basic server and client repo
-  updating to branch default
-  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ cd server
-  $ mkcommit B0
-  $ mkcommit C0
-  $ cd ../client
-  $ hg pull
-  pulling from $TESTTMP/server
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 2 changesets with 2 changes to 2 files
-  (run 'hg update' to get a working copy)
-  $ hg up 0
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit B1
-  created new head
-  $ hg debugobsolete --record-parents `getid "desc(A0)"`
-  $ hg debugobsolete `getid "desc(B0)"` `getid "desc(B1)"`
-  $ hg debugobsolete --record-parents `getid "desc(C0)"`
-  $ hg log -G --hidden
-  @  25c56d33e4c4 (draft): B1
-  |
-  | x  821fb21d0dd2 (draft): C0
-  | |
-  | x  d73caddc5533 (draft): B0
-  | |
-  | x  8aaa48160adc (draft): A0
-  |/
-  o  1e4be0697311 (public): root
-  
-
-Actual testing
---------------
-
-  $ hg push
-  pushing to $TESTTMP/server
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files (+1 heads)
-  3 new obsolescence markers
-
--- a/tests/test-checkheads-pruned-B6.t	Thu Apr 20 11:43:57 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,74 +0,0 @@
-====================================
-Testing head checking code: Case B-6
-====================================
-
-Mercurial checks for the introduction of multiple heads on push. Evolution
-comes into play to detect if existing heads on the server are being replaced by
-some of the new heads we push.
-
-This test file is part of a series of tests checking this behavior.
-
-Category B: checking simple case involving pruned changesets
-TestCase 6: single changesets, pruned then superseeded (on a new changeset)
-
-.. old-state:
-..
-.. * 1 changeset branch
-..
-.. new-state:
-..
-.. * old branch is rewritten onto another one,
-.. * the new version is then pruned.
-..
-.. expected-result:
-..
-.. * push allowed
-..
-.. graph-summary:
-..
-..   A ø⇠⊗ A'
-..     | |
-..     | ◔ B
-..     |/
-..     ○
-
-  $ . $TESTDIR/testlib/checkheads-util.sh
-
-Test setup
-----------
-
-  $ setuprepos
-  creating basic server and client repo
-  updating to branch default
-  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ cd client
-  $ hg up 0
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit B0
-  created new head
-  $ mkcommit A1
-  $ hg up 'desc(B0)'
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ hg debugobsolete `getid "desc(A0)"` `getid "desc(A1)"`
-  $ hg debugobsolete --record-parents `getid "desc(A1)"`
-  $ hg log -G --hidden
-  x  ba93660aff8d (draft): A1
-  |
-  @  74ff5441d343 (draft): B0
-  |
-  | x  8aaa48160adc (draft): A0
-  |/
-  o  1e4be0697311 (public): root
-  
-
-Actual testing
---------------
-
-  $ hg push
-  pushing to $TESTTMP/server
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files (+1 heads)
-  2 new obsolescence markers
--- a/tests/test-checkheads-pruned-B7.t	Thu Apr 20 11:43:57 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +0,0 @@
-====================================
-Testing head checking code: Case B-7
-====================================
-
-Mercurial checks for the introduction of multiple heads on push. Evolution
-comes into play to detect if existing heads on the server are being replaced by
-some of the new heads we push.
-
-This test file is part of a series of tests checking this behavior.
-
-Category B: checking simple case involving pruned changesets
-TestCase 7: single changesets, pruned then superseeded (on an existing changeset)
-
-.. old-state:
-..
-.. * 1 changeset branch
-..
-.. new-state:
-..
-.. * old branch is rewritten onto the common set,
-.. * the new version is then pruned.
-..
-.. expected-result:
-..
-.. * push allowed
-..
-.. graph-summary:
-..
-..   A ø⇠⊗ A'
-.. B ◔ | |
-..    \|/
-..     ●
-
-  $ . $TESTDIR/testlib/checkheads-util.sh
-
-Test setup
-----------
-
-  $ setuprepos
-  creating basic server and client repo
-  updating to branch default
-  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ cd client
-  $ hg up 0
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit B0
-  created new head
-  $ mkcommit A1
-  $ hg up 'desc(B0)'
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ hg debugobsolete `getid "desc(A0)"` `getid "desc(A1)"`
-  $ hg debugobsolete --record-parents `getid "desc(A1)"`
-  $ hg log -G --hidden
-  x  ba93660aff8d (draft): A1
-  |
-  @  74ff5441d343 (draft): B0
-  |
-  | x  8aaa48160adc (draft): A0
-  |/
-  o  1e4be0697311 (public): root
-  
-
-Actual testing
---------------
-
-  $ hg push
-  pushing to $TESTTMP/server
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files (+1 heads)
-  2 new obsolescence markers
--- a/tests/test-checkheads-pruned-B8.t	Thu Apr 20 11:43:57 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,95 +0,0 @@
-====================================
-Testing head checking code: Case B-2
-====================================
-
-Mercurial checks for the introduction of multiple heads on push. Evolution
-comes into play to detect if existing heads on the server are being replaced by
-some of the new heads we push.
-
-This test file is part of a series of tests checking this behavior.
-
-Category B: checking simple case involving pruned changesets
-TestCase 2: multi-changeset branch, head is pruned, rest is superceeded, through other
-
-.. old-state:
-..
-.. * 2 changeset branch
-..
-.. new-state:
-..
-.. * old head is rewritten then pruned
-.. * 1 new branch succeeding to the other changeset in the old branch (through another obsolete branch)
-..
-.. expected-result:
-..
-.. * push allowed
-..
-.. graph-summary:
-..
-..   B ø⇠⊗ B'
-..     | | A'
-..   A ø⇠ø⇠◔ A''
-..     |/ /
-..     | /
-..     |/
-..     ○
-
-  $ . $TESTDIR/testlib/checkheads-util.sh
-
-Test setup
-----------
-
-  $ setuprepos
-  creating basic server and client repo
-  updating to branch default
-  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ cd server
-  $ mkcommit B0
-  $ cd ../client
-  $ hg pull
-  pulling from $TESTTMP/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 up 0
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit A1
-  created new head
-  $ mkcommit B1
-  $ hg up 0
-  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
-  $ mkcommit A2
-  created new head
-  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
-  $ hg debugobsolete `getid "desc(B0)" ` `getid "desc(B1)"`
-  $ hg debugobsolete --record-parents `getid "desc(B1)"`
-  $ hg debugobsolete `getid "desc(A1)" ` `getid "desc(A2)"`
-  $ hg log -G --hidden
-  @  c1f8d089020f (draft): A2
-  |
-  | x  262c8c798096 (draft): B1
-  | |
-  | x  f6082bc4ffef (draft): A1
-  |/
-  | x  d73caddc5533 (draft): B0
-  | |
-  | x  8aaa48160adc (draft): A0
-  |/
-  o  1e4be0697311 (public): root
-  
-
-Actual testing
---------------
-
-  $ hg push
-  pushing to $TESTTMP/server
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files (+1 heads)
-  4 new obsolescence markers
-
--- a/tests/test-checkheads-superceed-A1.t	Thu Apr 20 11:43:57 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-====================================
-Testing head checking code: Case A-1
-====================================
-
-Mercurial checks for the introduction of multiple heads on push. Evolution
-comes into play to detect if existing heads on the server are being replaced by
-some of the new heads we push.
-
-This test file is part of a series of tests checking this behavior.
-
-Category A: checking simple case invoving a branch being superceeded by another.
-TestCase 1: single-changeset branch
-
-.. old-state:
-..
-.. * 1 changeset branch
-..
-.. new-state:
-..
-.. * 1 changeset branch succeeding to A
-..
-.. expected-result:
-..
-.. * push allowed
-..
-.. graph-summary:
-..
-..   A ø⇠◔ A'
-..     |/
-..     ○
-
-  $ . $TESTDIR/testlib/checkheads-util.sh
-
-Test setup
-----------
-
-  $ setuprepos
-  creating basic server and client repo
-  updating to branch default
-  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ cd client
-  $ hg up 0
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit A1
-  created new head
-  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
-  $ hg log -G --hidden
-  @  f6082bc4ffef (draft): A1
-  |
-  | x  8aaa48160adc (draft): A0
-  |/
-  o  1e4be0697311 (public): root
-  
-
-Actual testing
---------------
-
-  $ hg push
-  pushing to $TESTTMP/server
-  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
-
-
-
--- a/tests/test-checkheads-superceed-A2.t	Thu Apr 20 11:43:57 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,84 +0,0 @@
-====================================
-Testing head checking code: Case A-2
-====================================
-
-Mercurial checks for the introduction of multiple heads on push. Evolution
-comes into play to detect if existing heads on the server are being replaced by
-some of the new heads we push.
-
-This test file is part of a series of tests checking this behavior.
-
-Category A: checking simple case invoving a branch being superceeded by another.
-TestCase 2: multi-changeset branch
-
-.. old-state:
-..
-.. * 2 changeset branch
-..
-.. new-state:
-..
-.. * 2 changeset branch succeeding the old one
-..
-.. expected-result:
-..
-.. * push allowed
-..
-.. graph-summary:
-..
-..   B ø⇠◔ B'
-..     | |
-..   A ø⇠◔ A'
-..     |/
-..     ○
-
-  $ . $TESTDIR/testlib/checkheads-util.sh
-
-Test setup
-----------
-
-  $ setuprepos
-  creating basic server and client repo
-  updating to branch default
-  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ cd server
-  $ mkcommit B0
-  $ cd ../client
-  $ hg pull
-  pulling from $TESTTMP/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 up 0
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit A1
-  created new head
-  $ mkcommit B1
-  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
-  $ hg debugobsolete `getid "desc(B0)" ` `getid "desc(B1)"`
-  $ hg log -G --hidden
-  @  262c8c798096 (draft): B1
-  |
-  o  f6082bc4ffef (draft): A1
-  |
-  | x  d73caddc5533 (draft): B0
-  | |
-  | x  8aaa48160adc (draft): A0
-  |/
-  o  1e4be0697311 (public): root
-  
-
-
-Actual testing
---------------
-
-  $ hg push
-  pushing to $TESTTMP/server
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 2 changesets with 2 changes to 2 files (+1 heads)
-  2 new obsolescence markers
--- a/tests/test-checkheads-superceed-A3.t	Thu Apr 20 11:43:57 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,87 +0,0 @@
-====================================
-Testing head checking code: Case A-3
-====================================
-
-Mercurial checks for the introduction of multiple heads on push. Evolution
-comes into play to detect if existing heads on the server are being replaced by
-some of the new heads we push.
-
-This test file is part of a series of tests checking this behavior.
-
-Category A: checking simple case invoving a branch being superceeded by another.
-TestCase 3: multi-changeset branch with reordering
-
-Push should be allowed
-.. old-state:
-..
-.. * 2 changeset branch
-..
-.. new-state:
-..
-.. * 2 changeset branch succeeding the old one with reordering
-..
-.. expected-result:
-..
-.. * push allowed
-..
-.. graph-summary:
-..
-..   B ø⇠⇠
-..     | ⇡
-..   A ø⇠⇠⇠○ A'
-..     | ⇡/
-..     | ○ B'
-..     |/
-..     ● O
-
-  $ . $TESTDIR/testlib/checkheads-util.sh
-
-Test setup
-----------
-
-  $ setuprepos
-  creating basic server and client repo
-  updating to branch default
-  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ cd server
-  $ mkcommit B0
-  $ cd ../client
-  $ hg pull
-  pulling from $TESTTMP/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 up 0
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit B1
-  created new head
-  $ mkcommit A1
-  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
-  $ hg debugobsolete `getid "desc(B0)" ` `getid "desc(B1)"`
-  $ hg log -G --hidden
-  @  c1c7524e9488 (draft): A1
-  |
-  o  25c56d33e4c4 (draft): B1
-  |
-  | x  d73caddc5533 (draft): B0
-  | |
-  | x  8aaa48160adc (draft): A0
-  |/
-  o  1e4be0697311 (public): root
-  
-
-
-Actual testing
---------------
-
-  $ hg push
-  pushing to $TESTTMP/server
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 2 changesets with 2 changes to 2 files (+1 heads)
-  2 new obsolescence markers
--- a/tests/test-checkheads-superceed-A4.t	Thu Apr 20 11:43:57 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,74 +0,0 @@
-====================================
-Testing head checking code: Case A-4
-====================================
-
-Mercurial checks for the introduction of multiple heads on push. Evolution
-comes into play to detect if existing heads on the server are being replaced by
-some of the new heads we push.
-
-This test file is part of a series of tests checking this behavior.
-
-Category A: checking simple case invoving a branch being superceeded by another.
-TestCase 4: New changeset as children of the successor
-
-.. old-state:
-..
-.. * 1 changeset branch
-..
-.. new-state:
-..
-.. * 2 changeset branch, first is a successor, but head is new
-..
-.. expected-result:
-..
-.. * push allowed
-..
-.. graph-summary:
-..
-..       ◔ B
-..       |
-..   A ø⇠◔ A'
-..     |/
-..     ○
-
-  $ . $TESTDIR/testlib/checkheads-util.sh
-
-Test setup
-----------
-
-  $ setuprepos
-  creating basic server and client repo
-  updating to branch default
-  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ cd client
-  $ hg up 0
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit A1
-  created new head
-  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
-  $ mkcommit B0
-  $ hg log -G --hidden
-  @  f40ded968333 (draft): B0
-  |
-  o  f6082bc4ffef (draft): A1
-  |
-  | x  8aaa48160adc (draft): A0
-  |/
-  o  1e4be0697311 (public): root
-  
-
-
-Actual testing
---------------
-
-  $ hg push
-  pushing to $TESTTMP/server
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 2 changesets with 2 changes to 2 files (+1 heads)
-  1 new obsolescence markers
-
-
-
--- a/tests/test-checkheads-superceed-A5.t	Thu Apr 20 11:43:57 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,74 +0,0 @@
-====================================
-Testing head checking code: Case A-5
-====================================
-
-Mercurial checks for the introduction of multiple heads on push. Evolution
-comes into play to detect if existing heads on the server are being replaced by
-some of the new heads we push.
-
-This test file is part of a series of tests checking this behavior.
-
-Category A: checking simple case invoving a branch being superceeded by another.
-TestCase 5: New changeset as parent of the successor
-
-.. old-state:
-..
-.. * 1 changeset branch
-..
-.. new-state:
-..
-.. * 2 changeset branch, head is a successor, but other is new
-..
-.. expected-result:
-..
-.. * push allowed
-..
-.. graph-summary:
-..
-..   A ø⇠◔ A'
-..     | |
-..     | ◔ B
-..     |/
-..     ○
-
-  $ . $TESTDIR/testlib/checkheads-util.sh
-
-Test setup
-----------
-
-  $ setuprepos
-  creating basic server and client repo
-  updating to branch default
-  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ cd client
-  $ hg up 0
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit B0
-  created new head
-  $ mkcommit A1
-  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
-  $ hg log -G --hidden
-  @  ba93660aff8d (draft): A1
-  |
-  o  74ff5441d343 (draft): B0
-  |
-  | x  8aaa48160adc (draft): A0
-  |/
-  o  1e4be0697311 (public): root
-  
-
-
-Actual testing
---------------
-
-  $ hg push
-  pushing to $TESTTMP/server
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 2 changesets with 2 changes to 2 files (+1 heads)
-  1 new obsolescence markers
-
-
-
--- a/tests/test-checkheads-superceed-A6.t	Thu Apr 20 11:43:57 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,95 +0,0 @@
-====================================
-Testing head checking code: Case A-6
-====================================
-
-Mercurial checks for the introduction of multiple heads on push. Evolution
-comes into play to detect if existing heads on the server are being replaced by
-some of the new heads we push.
-
-This test file is part of a series of tests checking this behavior.
-
-Category A: checking simple case invoving a branch being superceeded by another.
-TestCase 6: multi-changeset branch, split on multiple other, (base on its own branch)
-
-.. old-state:
-..
-.. * 2 branch (1 changeset, and 2 changesets)
-..
-.. new-state:
-..
-.. * 1 new branch superceeding the base of the old-2-changesets-branch,
-.. * 1 new changesets on the old-1-changeset-branch superceeding the head of the other
-..
-.. expected-result:
-..
-.. * push allowed
-..
-.. graph-summary:
-..
-.. B'◔⇢ø B
-..   | |
-.. A | ø⇠◔ A'
-..   | |/
-.. C ● |
-..    \|
-..     ●
-
-  $ . $TESTDIR/testlib/checkheads-util.sh
-
-Test setup
-----------
-
-  $ setuprepos
-  creating basic server and client repo
-  updating to branch default
-  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ cd server
-  $ mkcommit B0
-  $ hg up 0
-  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
-  $ mkcommit C0
-  created new head
-  $ cd ../client
-  $ hg pull
-  pulling from $TESTTMP/server
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 2 changesets with 2 changes to 2 files (+1 heads)
-  (run 'hg heads' to see heads, 'hg merge' to merge)
-  $ hg up 0
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit A1
-  created new head
-  $ hg up 'desc(C0)'
-  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit B1
-  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
-  $ hg debugobsolete `getid "desc(B0)" ` `getid "desc(B1)"`
-  $ hg log -G --hidden
-  @  d70a1f75a020 (draft): B1
-  |
-  | o  f6082bc4ffef (draft): A1
-  | |
-  o |  0f88766e02d6 (draft): C0
-  |/
-  | x  d73caddc5533 (draft): B0
-  | |
-  | x  8aaa48160adc (draft): A0
-  |/
-  o  1e4be0697311 (public): root
-  
-
-
-Actual testing
---------------
-
-  $ hg push
-  pushing to $TESTTMP/server
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 2 changesets with 2 changes to 2 files (+1 heads)
-  2 new obsolescence markers
--- a/tests/test-checkheads-superceed-A7.t	Thu Apr 20 11:43:57 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,95 +0,0 @@
-====================================
-Testing head checking code: Case A-7
-====================================
-
-Mercurial checks for the introduction of multiple heads on push. Evolution
-comes into play to detect if existing heads on the server are being replaced by
-some of the new heads we push.
-
-This test file is part of a series of tests checking this behavior.
-
-Category A: checking simple case invoving a branch being superceeded by another.
-TestCase 7: multi-changeset branch, split on multiple other, (head on its own branch)
-
-.. old-state:
-..
-.. * 2 branch (1 changeset, and 2 changesets)
-..
-.. new-state:
-..
-.. * 1 new branch superceeding the head of the old-2-changesets-branch,
-.. * 1 new changesets on the old-1-changeset-branch superceeding the base of the other
-..
-.. expected-result:
-..
-.. * push allowed
-..
-.. graph-summary:
-..
-..   B ø⇠◔ B'
-..     | |
-.. A'◔⇢ø |
-..   | |/
-.. C ● |
-..    \|
-..     ●
-
-  $ . $TESTDIR/testlib/checkheads-util.sh
-
-Test setup
-----------
-
-  $ setuprepos
-  creating basic server and client repo
-  updating to branch default
-  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ cd server
-  $ mkcommit B0
-  $ hg up 0
-  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
-  $ mkcommit C0
-  created new head
-  $ cd ../client
-  $ hg pull
-  pulling from $TESTTMP/server
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 2 changesets with 2 changes to 2 files (+1 heads)
-  (run 'hg heads' to see heads, 'hg merge' to merge)
-  $ hg up 'desc(C0)'
-  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit A1
-  $ hg up 0
-  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
-  $ mkcommit B1
-  created new head
-  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
-  $ hg debugobsolete `getid "desc(B0)" ` `getid "desc(B1)"`
-  $ hg log -G --hidden
-  @  25c56d33e4c4 (draft): B1
-  |
-  | o  a0802eb7fc1b (draft): A1
-  | |
-  | o  0f88766e02d6 (draft): C0
-  |/
-  | x  d73caddc5533 (draft): B0
-  | |
-  | x  8aaa48160adc (draft): A0
-  |/
-  o  1e4be0697311 (public): root
-  
-
-
-Actual testing
---------------
-
-  $ hg push
-  pushing to $TESTTMP/server
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 2 changesets with 2 changes to 2 files (+1 heads)
-  2 new obsolescence markers
--- a/tests/test-checkheads-superceed-A8.t	Thu Apr 20 11:43:57 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,78 +0,0 @@
-====================================
-Testing head checking code: Case A-8
-====================================
-
-Mercurial checks for the introduction of multiple heads on push. Evolution
-comes into play to detect if existing heads on the server are being replaced by
-some of the new heads we push.
-
-This test file is part of a series of tests checking this behavior.
-
-Category A: checking simple case invoving a branch being superceeded by another.
-TestCase 8: single-changeset branch indirect rewrite
-
-.. old-state:
-..
-.. * 1 changeset branch
-..
-.. new-state:
-..
-.. * 1 changeset branch succeeding to A, through another unpushed changesets
-..
-.. expected-result:
-..
-.. * push allowed
-..
-.. graph-summary:
-..
-..       A'
-..   A ø⇠ø⇠◔ A''
-..     |/ /
-..     | /
-..     |/
-..     ○
-
-  $ . $TESTDIR/testlib/checkheads-util.sh
-
-Test setup
-----------
-
-  $ setuprepos
-  creating basic server and client repo
-  updating to branch default
-  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ cd client
-  $ hg up 0
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit A1
-  created new head
-  $ hg up 0
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit A2
-  created new head
-  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
-  $ hg debugobsolete `getid "desc(A1)" ` `getid "desc(A2)"`
-  $ hg log -G --hidden
-  @  c1f8d089020f (draft): A2
-  |
-  | x  f6082bc4ffef (draft): A1
-  |/
-  | x  8aaa48160adc (draft): A0
-  |/
-  o  1e4be0697311 (public): root
-  
-
-Actual testing
---------------
-
-  $ hg push
-  pushing to $TESTTMP/server
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files (+1 heads)
-  2 new obsolescence markers
-
-
-
--- a/tests/test-checkheads-unpushed-D1.t	Thu Apr 20 11:43:57 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-====================================
-Testing head checking code: Case D-1
-====================================
-
-Mercurial checks for the introduction of multiple heads on push. Evolution
-comes into play to detect if existing heads on the server are being replaced by
-some of the new heads we push.
-
-This test file is part of a series of tests checking this behavior.
-
-Category D: remote head is "obs-affected" locally, but result is not part of the push.
-TestCase 1: remote head is rewritten, but successors is not part of the push
-
-.. old-state:
-..
-.. * 1 changeset branch
-..
-.. new-state:
-..
-.. * 1 changeset branch succeeding the old branch
-.. * 1 new unrelated branch
-..
-.. expected-result:
-..
-.. * pushing only the unrelated branch: denied
-..
-.. graph-summary:
-..
-..   A ø⇠○ A'
-..     |/
-..     | ◔ B
-..     |/
-..     ○
-
-  $ . $TESTDIR/testlib/checkheads-util.sh
-
-Test setup
-----------
-
-  $ setuprepos
-  creating basic server and client repo
-  updating to branch default
-  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ cd client
-  $ hg up 0
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit A1
-  created new head
-  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
-  $ hg up 0
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit B0
-  created new head
-  $ hg log -G --hidden
-  @  74ff5441d343 (draft): B0
-  |
-  | o  f6082bc4ffef (draft): A1
-  |/
-  | x  8aaa48160adc (draft): A0
-  |/
-  o  1e4be0697311 (public): root
-  
-
-Actual testing
---------------
-
-  $ hg push -r 'desc(B0)'
-  pushing to $TESTTMP/server
-  searching for changes
-  abort: push creates new remote head 74ff5441d343!
-  (merge or see 'hg help push' for details about pushing new heads)
-  [255]
-
-
-
--- a/tests/test-checkheads-unpushed-D2.t	Thu Apr 20 11:43:57 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,90 +0,0 @@
-====================================
-Testing head checking code: Case D-2
-====================================
-
-Mercurial checks for the introduction of multiple heads on push. Evolution
-comes into play to detect if existing heads on the server are being replaced by
-some of the new heads we push.
-
-This test file is part of a series of tests checking this behavior.
-
-Category D: remote head is "obs-affected" locally, but result is not part of the push.
-TestCase 1: remote branch has 2 changes, head is pruned, second is rewritten but result is not pushed
-
-.. old-state:
-..
-.. * 1 changeset branch
-..
-.. new-state:
-..
-.. * old head is pruned
-.. * 1 new branch succeeding to the other changeset in the old branch
-.. * 1 new unrelated branch
-..
-.. expected-result:
-..
-.. * push allowed
-.. * pushing only the unrelated branch: denied
-..
-.. graph-summary:
-..
-..   B ⊗
-..     |
-..   A ø⇠○ A'
-..     |/
-..     | ◔ C
-..     |/
-..     ○
-
-  $ . $TESTDIR/testlib/checkheads-util.sh
-
-Test setup
-----------
-
-  $ setuprepos
-  creating basic server and client repo
-  updating to branch default
-  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ cd server
-  $ mkcommit B0
-  $ cd ../client
-  $ hg pull
-  pulling from $TESTTMP/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 up 0
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit A1
-  created new head
-  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
-  $ hg debugobsolete --record-parents `getid "desc(B0)"`
-  $ hg up 0
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit C0
-  created new head
-  $ hg log -G --hidden
-  @  0f88766e02d6 (draft): C0
-  |
-  | o  f6082bc4ffef (draft): A1
-  |/
-  | x  d73caddc5533 (draft): B0
-  | |
-  | x  8aaa48160adc (draft): A0
-  |/
-  o  1e4be0697311 (public): root
-  
-
-Actual testing
---------------
-
-  $ hg push --rev 'desc(C0)'
-  pushing to $TESTTMP/server
-  searching for changes
-  abort: push creates new remote head 0f88766e02d6!
-  (merge or see 'hg help push' for details about pushing new heads)
-  [255]
-
--- a/tests/test-checkheads-unpushed-D3.t	Thu Apr 20 11:43:57 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,107 +0,0 @@
-====================================
-Testing head checking code: Case D-3
-====================================
-
-Mercurial checks for the introduction of multiple heads on push. Evolution
-comes into play to detect if existing heads on the server are being replaced by
-some of the new heads we push.
-
-This test file is part of a series of tests checking this behavior.
-
-Category D: remote head is "obs-affected" locally, but result is not part of the push.
-TestCase 3: multi-changeset branch, split on multiple new others, only one of them is pushed
-
-.. old-state:
-..
-.. * 2 changesets branch
-..
-.. new-state:
-..
-.. * 2 new branches, each superseding one changeset in the old one.
-..
-.. expected-result:
-..
-.. * pushing only one of the resulting branch (either of them)
-.. * push denied
-..
-.. graph-summary:
-..
-.. B'◔⇢ø B
-..   | |
-.. A | ø⇠◔ A'
-..   | |/
-..    \|
-..     ●
-
-  $ . $TESTDIR/testlib/checkheads-util.sh
-
-Test setup
-----------
-
-  $ setuprepos
-  creating basic server and client repo
-  updating to branch default
-  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ cd server
-  $ mkcommit B0
-  $ hg up 0
-  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
-  $ cd ../client
-  $ hg pull
-  pulling from $TESTTMP/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 up 0
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit A1
-  created new head
-  $ hg up '0'
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit B1
-  created new head
-  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
-  $ hg debugobsolete `getid "desc(B0)" ` `getid "desc(B1)"`
-  $ hg log -G --hidden
-  @  25c56d33e4c4 (draft): B1
-  |
-  | o  f6082bc4ffef (draft): A1
-  |/
-  | x  d73caddc5533 (draft): B0
-  | |
-  | x  8aaa48160adc (draft): A0
-  |/
-  o  1e4be0697311 (public): root
-  
-
-
-Actual testing
---------------
-
-  $ hg push --rev 'desc(A1)'
-  pushing to $TESTTMP/server
-  searching for changes
-  abort: push creates new remote head f6082bc4ffef!
-  (merge or see 'hg help push' for details about pushing new heads)
-  [255]
-  $ hg push --rev 'desc(B1)'
-  pushing to $TESTTMP/server
-  searching for changes
-  abort: push creates new remote head 25c56d33e4c4!
-  (merge or see 'hg help push' for details about pushing new heads)
-  [255]
-
-Extra testing
--------------
-
-In this case, even a bare push is creating more heads
-
-  $ hg push
-  pushing to $TESTTMP/server
-  searching for changes
-  abort: push creates new remote head 25c56d33e4c4!
-  (merge or see 'hg help push' for details about pushing new heads)
-  [255]
--- a/tests/test-checkheads-unpushed-D4.t	Thu Apr 20 11:43:57 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,102 +0,0 @@
-====================================
-Testing head checking code: Case D-4
-====================================
-
-Mercurial checks for the introduction of multiple heads on push. Evolution
-comes into play to detect if existing heads on the server are being replaced by
-some of the new heads we push.
-
-This test file is part of a series of tests checking this behavior.
-
-Category D: remote head is "obs-affected" locally, but result is not part of the push.
-TestCase 4: multi-changeset branch, split on multiple other, (base on its own new branch)
-
-.. old-state:
-..
-.. * 2 branch (1 changeset, and 2 changesets)
-..
-.. new-state:
-..
-.. * 1 new branch superceeding the base of the old-2-changesets-branch,
-.. * 1 new changesets on the old-1-changeset-branch superceeding the head of the other
-..
-.. expected-result:
-..
-.. * push the new branch only -> push denied
-.. * push the existing branch only -> push allowed
-..
-.. graph-summary:
-..
-.. B'◔⇢ø B
-..   | |
-.. A | ø⇠◔ A'
-..   | |/
-.. C ● |
-..    \|
-..     ●
-
-  $ . $TESTDIR/testlib/checkheads-util.sh
-
-Test setup
-----------
-
-  $ setuprepos
-  creating basic server and client repo
-  updating to branch default
-  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ cd server
-  $ mkcommit B0
-  $ hg up 0
-  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
-  $ mkcommit C0
-  created new head
-  $ cd ../client
-  $ hg pull
-  pulling from $TESTTMP/server
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 2 changesets with 2 changes to 2 files (+1 heads)
-  (run 'hg heads' to see heads, 'hg merge' to merge)
-  $ hg up 0
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit A1
-  created new head
-  $ hg up 'desc(C0)'
-  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit B1
-  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
-  $ hg debugobsolete `getid "desc(B0)" ` `getid "desc(B1)"`
-  $ hg log -G --hidden
-  @  d70a1f75a020 (draft): B1
-  |
-  | o  f6082bc4ffef (draft): A1
-  | |
-  o |  0f88766e02d6 (draft): C0
-  |/
-  | x  d73caddc5533 (draft): B0
-  | |
-  | x  8aaa48160adc (draft): A0
-  |/
-  o  1e4be0697311 (public): root
-  
-
-
-Actual testing
---------------
-
-  $ hg push --rev 'desc(A1)'
-  pushing to $TESTTMP/server
-  searching for changes
-  abort: push creates new remote head f6082bc4ffef!
-  (merge or see 'hg help push' for details about pushing new heads)
-  [255]
-  $ hg push --rev 'desc(B1)'
-  pushing to $TESTTMP/server
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files
-  1 new obsolescence markers
--- a/tests/test-checkheads-unpushed-D5.t	Thu Apr 20 11:43:57 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,104 +0,0 @@
-====================================
-Testing head checking code: Case D-5
-====================================
-
-Mercurial checks for the introduction of multiple heads on push. Evolution
-comes into play to detect if existing heads on the server are being replaced by
-some of the new heads we push.
-
-This test file is part of a series of tests checking this behavior.
-
-Category D: remote head is "obs-affected" locally, but result is not part of the push.
-TestCase 5: multi-changeset branch, split on multiple other, (head on its own new branch)
-
-.. old-state:
-..
-.. * 2 branch (1 changeset, and 2 changesets)
-..
-.. new-state:
-..
-.. * 1 new branch superceeding the head of the old-2-changesets-branch,
-.. * 1 new changesets on the old-1-changeset-branch superceeding the base of the other
-..
-.. expected-result:
-..
-.. * push the new branch only -> push denied
-.. * push the existing branch only -> push allowed
-..   /!\ This push create unstability/orphaning on the other hand and we should
-..  probably detect/warn agains that.
-..
-.. graph-summary:
-..
-..   B ø⇠◔ B'
-..     | |
-.. A'◔⇢ø |
-..   | |/
-.. C ● |
-..    \|
-..     ●
-
-  $ . $TESTDIR/testlib/checkheads-util.sh
-
-Test setup
-----------
-
-  $ setuprepos
-  creating basic server and client repo
-  updating to branch default
-  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ cd server
-  $ mkcommit B0
-  $ hg up 0
-  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
-  $ mkcommit C0
-  created new head
-  $ cd ../client
-  $ hg pull
-  pulling from $TESTTMP/server
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 2 changesets with 2 changes to 2 files (+1 heads)
-  (run 'hg heads' to see heads, 'hg merge' to merge)
-  $ hg up 'desc(C0)'
-  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit A1
-  $ hg up 0
-  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
-  $ mkcommit B1
-  created new head
-  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
-  $ hg debugobsolete `getid "desc(B0)" ` `getid "desc(B1)"`
-  $ hg log -G --hidden
-  @  25c56d33e4c4 (draft): B1
-  |
-  | o  a0802eb7fc1b (draft): A1
-  | |
-  | o  0f88766e02d6 (draft): C0
-  |/
-  | x  d73caddc5533 (draft): B0
-  | |
-  | x  8aaa48160adc (draft): A0
-  |/
-  o  1e4be0697311 (public): root
-  
-
-
-Actual testing
---------------
-
-  $ hg push --rev 'desc(B1)'
-  pushing to $TESTTMP/server
-  searching for changes
-  abort: push creates new remote head 25c56d33e4c4!
-  (merge or see 'hg help push' for details about pushing new heads)
-  [255]
-  $ hg push --rev 'desc(A1)'
-  pushing to $TESTTMP/server
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files
-  1 new obsolescence markers
--- a/tests/test-checkheads-unpushed-D6.t	Thu Apr 20 11:43:57 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,78 +0,0 @@
-====================================
-Testing head checking code: Case D-6
-====================================
-
-Mercurial checks for the introduction of multiple heads on push. Evolution
-comes into play to detect if existing heads on the server are being replaced by
-some of the new heads we push.
-
-This test file is part of a series of tests checking this behavior.
-
-Category D: remote head is "obs-affected" locally, but result is not part of the push.
-TestCase 6: single changesets, superseeded then pruned (on a new changeset unpushed) changeset
-
-This is a partial push variation of B6
-
-.. old-state:
-..
-.. * 1 changeset branch
-..
-.. new-state:
-..
-.. * old branch is rewritten onto another one,
-.. * the new version is then pruned.
-..
-.. expected-result:
-..
-.. * push denied
-..
-.. graph-summary:
-..
-..   A ø⇠⊗ A'
-..     | |
-.. C ◔ | ◔ B
-..    \|/
-..     ●
-
-  $ . $TESTDIR/testlib/checkheads-util.sh
-
-Test setup
-----------
-
-  $ setuprepos
-  creating basic server and client repo
-  updating to branch default
-  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ cd client
-  $ hg up 0
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit B0
-  created new head
-  $ mkcommit A1
-  $ hg up '0'
-  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
-  $ mkcommit C0
-  created new head
-  $ hg debugobsolete `getid "desc(A0)"` `getid "desc(A1)"`
-  $ hg debugobsolete --record-parents `getid "desc(A1)"`
-  $ hg log -G --hidden
-  @  0f88766e02d6 (draft): C0
-  |
-  | x  ba93660aff8d (draft): A1
-  | |
-  | o  74ff5441d343 (draft): B0
-  |/
-  | x  8aaa48160adc (draft): A0
-  |/
-  o  1e4be0697311 (public): root
-  
-
-Actual testing
---------------
-
-  $ hg push --rev 'desc(C0)'
-  pushing to $TESTTMP/server
-  searching for changes
-  abort: push creates new remote head 0f88766e02d6!
-  (merge or see 'hg help push' for details about pushing new heads)
-  [255]
--- a/tests/test-checkheads-unpushed-D7.t	Thu Apr 20 11:43:57 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,92 +0,0 @@
-====================================
-Testing head checking code: Case D-7
-====================================
-
-Mercurial checks for the introduction of multiple heads on push. Evolution
-comes into play to detect if existing heads on the server are being replaced by
-some of the new heads we push.
-
-This test file is part of a series of tests checking this behavior.
-
-Category D: remote head is "obs-affected" locally, but result is not part of the push.
-TestCase 7: single changesets, superseeded multiple time then pruned (on a new changeset unpushed) changeset
-
-This is a partial push variation of B6
-
-.. old-state:
-..
-.. * 1 changeset branch
-..
-.. new-state:
-..
-.. * old branch is rewritten onto another one,
-.. * The rewriting it again rewritten on the root
-.. * the new version is then pruned.
-..
-.. expected-result:
-..
-.. * push allowed
-..
-.. graph-summary:
-..
-..       A'
-..   A ø⇠ø⇠⊗ A''
-..     | | |
-.. C ◔ | ◔ | B
-..    \|/ /
-..     | /
-..     |/
-..     |
-..     ●
-
-  $ . $TESTDIR/testlib/checkheads-util.sh
-
-Test setup
-----------
-
-  $ setuprepos
-  creating basic server and client repo
-  updating to branch default
-  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ cd client
-  $ hg up 0
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit B0
-  created new head
-  $ mkcommit A1
-  $ hg up '0'
-  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
-  $ mkcommit A2
-  created new head
-  $ hg up '0'
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit C0
-  created new head
-  $ hg debugobsolete `getid "desc(A0)"` `getid "desc(A1)"`
-  $ hg debugobsolete `getid "desc(A1)"` `getid "desc(A2)"`
-  $ hg debugobsolete --record-parents `getid "desc(A2)"`
-  $ hg log -G --hidden
-  @  0f88766e02d6 (draft): C0
-  |
-  | x  c1f8d089020f (draft): A2
-  |/
-  | x  ba93660aff8d (draft): A1
-  | |
-  | o  74ff5441d343 (draft): B0
-  |/
-  | x  8aaa48160adc (draft): A0
-  |/
-  o  1e4be0697311 (public): root
-  
-
-Actual testing
---------------
-
-  $ hg push --rev 'desc(C0)'
-  pushing to $TESTTMP/server
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files (+1 heads)
-  3 new obsolescence markers
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-push-checkheads-partial-C1.t	Thu Apr 20 12:24:43 2017 +0200
@@ -0,0 +1,79 @@
+====================================
+Testing head checking code: Case C-1
+====================================
+
+Mercurial checks for the introduction of multiple heads on push. Evolution
+comes into play to detect if existing heads on the server are being replaced by
+some of the new heads we push.
+
+This test file is part of a series of tests checking this behavior.
+
+Category C: checking case were the branch is only partially obsoleted.
+TestCase 1: 2 changeset branch, only the head is rewritten
+
+.. old-state:
+..
+.. * 2 changeset branch
+..
+.. new-state:
+..
+.. * 1 new changesets branches superceeding only the head of the old one
+.. * base of the old branch is still alive
+..
+.. expected-result:
+..
+.. * push denied
+..
+.. graph-summary:
+..
+..   B ø⇠◔ B'
+..     | |
+..   A ○ |
+..     |/
+..     ○
+
+  $ . $TESTDIR/testlib/push-checkheads-util.sh
+
+Test setup
+----------
+
+  $ setuprepos
+  creating basic server and client repo
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd server
+  $ mkcommit B0
+  $ cd ../client
+  $ hg pull
+  pulling from $TESTTMP/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 up 0
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit B1
+  created new head
+  $ hg debugobsolete `getid "desc(B0)" ` `getid "desc(B1)"`
+  $ hg log -G --hidden
+  @  25c56d33e4c4 (draft): B1
+  |
+  | x  d73caddc5533 (draft): B0
+  | |
+  | o  8aaa48160adc (draft): A0
+  |/
+  o  1e4be0697311 (public): root
+  
+
+
+Actual testing
+--------------
+
+  $ hg push
+  pushing to $TESTTMP/server
+  searching for changes
+  abort: push creates new remote head 25c56d33e4c4!
+  (merge or see 'hg help push' for details about pushing new heads)
+  [255]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-push-checkheads-partial-C2.t	Thu Apr 20 12:24:43 2017 +0200
@@ -0,0 +1,82 @@
+====================================
+Testing head checking code: Case C-2
+====================================
+
+Mercurial checks for the introduction of new heads on push. Evolution comes
+into play to detect if existing branches on the server are being replaced by
+some of the new one we push.
+
+This case is part of a series of tests checking this behavior.
+
+Category C: case were the branch is only partially obsoleted
+TestCase 2: 2 changeset branch, only the base is rewritten
+
+.. old-state:
+..
+.. * 2 changeset branch
+..
+.. new-state:
+..
+.. * 1 new changesets branches superceeding only the base of the old one
+.. * The old branch is still alive (base is obsolete, head is alive)
+..
+.. expected-result:
+..
+.. * push denied
+..
+.. graph-summary:
+..
+..   B ○
+..     |
+..   A ø⇠◔ A'
+..     |/
+..     ●
+
+  $ . $TESTDIR/testlib/push-checkheads-util.sh
+
+Test setup
+----------
+
+  $ mkdir C2
+  $ cd C2
+  $ setuprepos
+  creating basic server and client repo
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd server
+  $ mkcommit B0
+  $ cd ../client
+  $ hg pull
+  pulling from $TESTTMP/C2/server (glob)
+  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 up 0
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit A1
+  created new head
+  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
+  $ hg log -G --hidden
+  @  f6082bc4ffef (draft): A1
+  |
+  | o  d73caddc5533 (draft): B0
+  | |
+  | x  8aaa48160adc (draft): A0
+  |/
+  o  1e4be0697311 (public): root
+  
+
+Actual testing
+--------------
+
+  $ hg push --rev 'desc(A1)'
+  pushing to $TESTTMP/C2/server (glob)
+  searching for changes
+  abort: push creates new remote head f6082bc4ffef!
+  (merge or see 'hg help push' for details about pushing new heads)
+  [255]
+
+  $ cd ../..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-push-checkheads-partial-C3.t	Thu Apr 20 12:24:43 2017 +0200
@@ -0,0 +1,82 @@
+====================================
+Testing head checking code: Case C-3
+====================================
+
+Mercurial checks for the introduction of new heads on push. Evolution comes
+into play to detect if existing branches on the server are being replaced by
+some of the new one we push.
+
+This case is part of a series of tests checking this behavior.
+
+Category C: case were the branch is only partially obsoleted
+TestCase 3: 2 changeset branch, only the head is pruned
+
+.. old-state:
+..
+.. * 2 changeset branch
+..
+.. new-state:
+..
+.. * old head is pruned
+.. * 1 new unrelated branch
+..
+.. expected-result:
+..
+.. * push denied
+..
+.. graph-summary:
+..
+..   B ⊗
+..     |
+..   A ◔ ◔ C
+..     |/
+..     ●
+
+  $ . $TESTDIR/testlib/push-checkheads-util.sh
+
+Test setup
+----------
+
+  $ mkdir C3
+  $ cd C3
+  $ setuprepos
+  creating basic server and client repo
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd server
+  $ mkcommit B0
+  $ cd ../client
+  $ hg pull
+  pulling from $TESTTMP/C3/server (glob)
+  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 up 0
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit C0
+  created new head
+  $ hg debugobsolete --record-parents `getid "desc(B0)"`
+  $ hg log -G --hidden
+  @  0f88766e02d6 (draft): C0
+  |
+  | x  d73caddc5533 (draft): B0
+  | |
+  | o  8aaa48160adc (draft): A0
+  |/
+  o  1e4be0697311 (public): root
+  
+
+Actual testing
+--------------
+
+  $ hg push
+  pushing to $TESTTMP/C3/server (glob)
+  searching for changes
+  abort: push creates new remote head 0f88766e02d6!
+  (merge or see 'hg help push' for details about pushing new heads)
+  [255]
+
+  $ cd ../..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-push-checkheads-partial-C4.t	Thu Apr 20 12:24:43 2017 +0200
@@ -0,0 +1,82 @@
+====================================
+Testing head checking code: Case C-4
+====================================
+
+Mercurial checks for the introduction of new heads on push. Evolution comes
+into play to detect if existing branches on the server are being replaced by
+some of the new one we push.
+
+This case is part of a series of tests checking this behavior.
+
+Category C: case were the branch is only partially obsoleted
+TestCase 4: 2 changeset branch, only the base is pruned
+
+.. old-state:
+..
+.. * 2 changeset branch
+..
+.. new-state:
+..
+.. * old base is pruned
+.. * 1 new unrelated branch
+..
+.. expected-result:
+..
+.. * push denied
+..
+.. graph-summary:
+..
+..   B ◔
+..     |
+..   A ⊗ ◔ C
+..     |/
+..     ●
+
+  $ . $TESTDIR/testlib/push-checkheads-util.sh
+
+Test setup
+----------
+
+  $ mkdir C4
+  $ cd C4
+  $ setuprepos
+  creating basic server and client repo
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd server
+  $ mkcommit B0
+  $ cd ../client
+  $ hg pull
+  pulling from $TESTTMP/C4/server (glob)
+  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 up 0
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit C0
+  created new head
+  $ hg debugobsolete --record-parents `getid "desc(A0)"`
+  $ hg log -G --hidden
+  @  0f88766e02d6 (draft): C0
+  |
+  | o  d73caddc5533 (draft): B0
+  | |
+  | x  8aaa48160adc (draft): A0
+  |/
+  o  1e4be0697311 (public): root
+  
+
+Actual testing
+--------------
+
+  $ hg push --rev 'desc(C0)'
+  pushing to $TESTTMP/C4/server (glob)
+  searching for changes
+  abort: push creates new remote head 0f88766e02d6!
+  (merge or see 'hg help push' for details about pushing new heads)
+  [255]
+
+  $ cd ../..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-push-checkheads-pruned-B1.t	Thu Apr 20 12:24:43 2017 +0200
@@ -0,0 +1,72 @@
+====================================
+Testing head checking code: Case B-1
+====================================
+
+Mercurial checks for the introduction of new heads on push. Evolution comes
+into play to detect if existing branches on the server are being replaced by
+some of the new one we push.
+
+This case is part of a series of tests checking this behavior.
+
+Category B: simple case involving pruned changesets
+TestCase 1: single pruned changeset
+
+.. old-state:
+..
+.. * 1 changeset branch
+..
+.. new-state:
+..
+.. * old branch is pruned
+.. * 1 new unrelated branch
+..
+.. expected-result:
+..
+.. * push allowed
+..
+.. graph-summary:
+..
+..       ◔ B
+..       |
+..   A ⊗ |
+..     |/
+..     ●
+
+  $ . $TESTDIR/testlib/push-checkheads-util.sh
+
+Test setup
+----------
+
+  $ mkdir B1
+  $ cd B1
+  $ setuprepos
+  creating basic server and client repo
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd client
+  $ hg up 0
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit B0
+  created new head
+  $ hg debugobsolete --record-parents `getid "desc(A0)"`
+  $ hg log -G --hidden
+  @  74ff5441d343 (draft): B0
+  |
+  | x  8aaa48160adc (draft): A0
+  |/
+  o  1e4be0697311 (public): root
+  
+
+Actual testing
+--------------
+
+  $ hg push
+  pushing to $TESTTMP/B1/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
+
+  $ cd ../..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-push-checkheads-pruned-B2.t	Thu Apr 20 12:24:43 2017 +0200
@@ -0,0 +1,85 @@
+====================================
+Testing head checking code: Case B-2
+====================================
+
+Mercurial checks for the introduction of new heads on push. Evolution comes
+into play to detect if existing branches on the server are being replaced by
+some of the new one we push.
+
+This case is part of a series of tests checking this behavior.
+
+Category B: simple case involving pruned changesets
+TestCase 2: multi-changeset branch, head is pruned, rest is superceeded
+
+.. old-state:
+..
+.. * 2 changeset branch
+..
+.. new-state:
+..
+.. * old head is pruned
+.. * 1 new branch succeeding to the other changeset in the old branch
+..
+.. expected-result:
+..
+.. * push allowed
+..
+.. graph-summary:
+..
+..   B ⊗
+..     |
+..   A ø⇠◔ A'
+..     |/
+..     ●
+
+  $ . $TESTDIR/testlib/push-checkheads-util.sh
+
+Test setup
+----------
+
+  $ mkdir B2
+  $ cd B2
+  $ setuprepos
+  creating basic server and client repo
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd server
+  $ mkcommit B0
+  $ cd ../client
+  $ hg pull
+  pulling from $TESTTMP/B2/server (glob)
+  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 up 0
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit A1
+  created new head
+  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
+  $ hg debugobsolete --record-parents `getid "desc(B0)"`
+  $ hg log -G --hidden
+  @  f6082bc4ffef (draft): A1
+  |
+  | x  d73caddc5533 (draft): B0
+  | |
+  | x  8aaa48160adc (draft): A0
+  |/
+  o  1e4be0697311 (public): root
+  
+
+Actual testing
+--------------
+
+  $ hg push
+  pushing to $TESTTMP/B2/server (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  2 new obsolescence markers
+
+  $ cd ../..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-push-checkheads-pruned-B3.t	Thu Apr 20 12:24:43 2017 +0200
@@ -0,0 +1,86 @@
+====================================
+Testing head checking code: Case B-3
+====================================
+
+Mercurial checks for the introduction of new heads on push. Evolution comes
+into play to detect if existing branches on the server are being replaced by
+some of the new one we push.
+
+This case is part of a series of tests checking this behavior.
+
+Category B: simple case involving pruned changesets
+TestCase 3: multi-changeset branch, other is pruned, rest is superceeded
+
+.. old-state:
+..
+.. * 2 changeset branch
+..
+.. new-state:
+..
+.. * old head is superceeded
+.. * old other is pruned
+..
+.. expected-result:
+..
+.. * push allowed
+..
+.. graph-summary:
+..
+..   B ø⇠◔ B'
+..     | |
+..   A ⊗ |
+..     |/
+..     ●
+
+  $ . $TESTDIR/testlib/push-checkheads-util.sh
+
+Test setup
+----------
+
+  $ mkdir B3
+  $ cd B3
+  $ setuprepos
+  creating basic server and client repo
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd server
+  $ mkcommit B0
+  $ cd ../client
+  $ hg pull
+  pulling from $TESTTMP/B3/server (glob)
+  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 up 0
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit B1
+  created new head
+  $ hg debugobsolete --record-parents `getid "desc(A0)"`
+  $ hg debugobsolete `getid "desc(B0)" ` `getid "desc(B1)"`
+  $ hg log -G --hidden
+  @  25c56d33e4c4 (draft): B1
+  |
+  | x  d73caddc5533 (draft): B0
+  | |
+  | x  8aaa48160adc (draft): A0
+  |/
+  o  1e4be0697311 (public): root
+  
+
+Actual testing
+--------------
+
+  $ hg push
+  pushing to $TESTTMP/B3/server (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  2 new obsolescence markers
+
+  $ cd ../..
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-push-checkheads-pruned-B4.t	Thu Apr 20 12:24:43 2017 +0200
@@ -0,0 +1,86 @@
+====================================
+Testing head checking code: Case B-4
+====================================
+
+Mercurial checks for the introduction of new heads on push. Evolution comes
+into play to detect if existing branches on the server are being replaced by
+some of the new one we push.
+
+This case is part of a series of tests checking this behavior.
+
+Category B: simple case involving pruned changesets
+TestCase 4: multi-changeset branch, all are pruned
+
+.. old-state:
+..
+.. * 2 changeset branch
+..
+.. new-state:
+..
+.. * old branch is pruned
+..
+.. expected-result:
+..
+.. * push allowed
+..
+.. graph-summary:
+..
+..   B ⊗
+..     |
+..   A ⊗
+..     |
+..     | ◔ C
+..     |/
+..     ●
+
+  $ . $TESTDIR/testlib/push-checkheads-util.sh
+
+Test setup
+----------
+
+  $ mkdir B4
+  $ cd B4
+  $ setuprepos
+  creating basic server and client repo
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd server
+  $ mkcommit B0
+  $ cd ../client
+  $ hg pull
+  pulling from $TESTTMP/B4/server (glob)
+  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 up 0
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit C0
+  created new head
+  $ hg debugobsolete --record-parents `getid "desc(A0)"`
+  $ hg debugobsolete --record-parents `getid "desc(B0)"`
+  $ hg log -G --hidden
+  @  0f88766e02d6 (draft): C0
+  |
+  | x  d73caddc5533 (draft): B0
+  | |
+  | x  8aaa48160adc (draft): A0
+  |/
+  o  1e4be0697311 (public): root
+  
+
+Actual testing
+--------------
+
+  $ hg push
+  pushing to $TESTTMP/B4/server (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  2 new obsolescence markers
+
+  $ cd ../..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-push-checkheads-pruned-B5.t	Thu Apr 20 12:24:43 2017 +0200
@@ -0,0 +1,92 @@
+====================================
+Testing head checking code: Case B-5
+====================================
+
+Mercurial checks for the introduction of new heads on push. Evolution comes
+into play to detect if existing branches on the server are being replaced by
+some of the new one we push.
+
+This case is part of a series of tests checking this behavior.
+
+Category B: simple case involving pruned changesets
+TestCase 5: multi-changeset branch, mix of pruned and superceeded
+
+.. old-state:
+..
+.. * 3 changeset branch
+..
+.. new-state:
+..
+.. * old head is pruned
+.. * old mid is superceeded
+.. * old root is pruned
+..
+.. expected-result:
+..
+.. * push allowed
+..
+.. graph-summary:
+..
+..   B ⊗
+..     |
+..   A ø⇠◔ A'
+..     | |
+..   B ⊗ |
+..     |/
+..     ●
+
+  $ . $TESTDIR/testlib/push-checkheads-util.sh
+
+Test setup
+----------
+
+  $ mkdir B5
+  $ cd B5
+  $ setuprepos
+  creating basic server and client repo
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd server
+  $ mkcommit B0
+  $ mkcommit C0
+  $ cd ../client
+  $ hg pull
+  pulling from $TESTTMP/B5/server (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 2 changesets with 2 changes to 2 files
+  (run 'hg update' to get a working copy)
+  $ hg up 0
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit B1
+  created new head
+  $ hg debugobsolete --record-parents `getid "desc(A0)"`
+  $ hg debugobsolete `getid "desc(B0)"` `getid "desc(B1)"`
+  $ hg debugobsolete --record-parents `getid "desc(C0)"`
+  $ hg log -G --hidden
+  @  25c56d33e4c4 (draft): B1
+  |
+  | x  821fb21d0dd2 (draft): C0
+  | |
+  | x  d73caddc5533 (draft): B0
+  | |
+  | x  8aaa48160adc (draft): A0
+  |/
+  o  1e4be0697311 (public): root
+  
+
+Actual testing
+--------------
+
+  $ hg push
+  pushing to $TESTTMP/B5/server (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  3 new obsolescence markers
+
+  $ cd ../..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-push-checkheads-pruned-B6.t	Thu Apr 20 12:24:43 2017 +0200
@@ -0,0 +1,78 @@
+====================================
+Testing head checking code: Case B-6
+====================================
+
+Mercurial checks for the introduction of new heads on push. Evolution comes
+into play to detect if existing branches on the server are being replaced by
+some of the new one we push.
+
+This case is part of a series of tests checking this behavior.
+
+Category B: simple case involving pruned changesets
+TestCase 6: single changesets, pruned then superseeded (on a new changeset)
+
+.. old-state:
+..
+.. * 1 changeset branch
+..
+.. new-state:
+..
+.. * old branch is rewritten onto another one,
+.. * the new version is then pruned.
+..
+.. expected-result:
+..
+.. * push allowed
+..
+.. graph-summary:
+..
+..   A ø⇠⊗ A'
+..     | |
+..     | ◔ B
+..     |/
+..     ●
+
+  $ . $TESTDIR/testlib/push-checkheads-util.sh
+
+Test setup
+----------
+
+  $ mkdir B6
+  $ cd B6
+  $ setuprepos
+  creating basic server and client repo
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd client
+  $ hg up 0
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit B0
+  created new head
+  $ mkcommit A1
+  $ hg up 'desc(B0)'
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg debugobsolete `getid "desc(A0)"` `getid "desc(A1)"`
+  $ hg debugobsolete --record-parents `getid "desc(A1)"`
+  $ hg log -G --hidden
+  x  ba93660aff8d (draft): A1
+  |
+  @  74ff5441d343 (draft): B0
+  |
+  | x  8aaa48160adc (draft): A0
+  |/
+  o  1e4be0697311 (public): root
+  
+
+Actual testing
+--------------
+
+  $ hg push
+  pushing to $TESTTMP/B6/server (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  2 new obsolescence markers
+
+  $ cd ../..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-push-checkheads-pruned-B7.t	Thu Apr 20 12:24:43 2017 +0200
@@ -0,0 +1,77 @@
+====================================
+Testing head checking code: Case B-7
+====================================
+
+Mercurial checks for the introduction of new heads on push. Evolution comes
+into play to detect if existing branches on the server are being replaced by
+some of the new one we push.
+
+This case is part of a series of tests checking this behavior.
+
+Category B: simple case involving pruned changesets
+TestCase 7: single changesets, pruned then superseeded (on an existing changeset)
+
+.. old-state:
+..
+.. * 1 changeset branch
+..
+.. new-state:
+..
+.. * old branch is rewritten onto the common set,
+.. * the new version is then pruned.
+..
+.. expected-result:
+..
+.. * push allowed
+..
+.. graph-summary:
+..
+..   A ø⇠⊗ A'
+.. B ◔ | |
+..    \|/
+..     ●
+
+  $ . $TESTDIR/testlib/push-checkheads-util.sh
+
+Test setup
+----------
+
+  $ mkdir B7
+  $ cd B7
+  $ setuprepos
+  creating basic server and client repo
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd client
+  $ hg up 0
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit B0
+  created new head
+  $ mkcommit A1
+  $ hg up 'desc(B0)'
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg debugobsolete `getid "desc(A0)"` `getid "desc(A1)"`
+  $ hg debugobsolete --record-parents `getid "desc(A1)"`
+  $ hg log -G --hidden
+  x  ba93660aff8d (draft): A1
+  |
+  @  74ff5441d343 (draft): B0
+  |
+  | x  8aaa48160adc (draft): A0
+  |/
+  o  1e4be0697311 (public): root
+  
+
+Actual testing
+--------------
+
+  $ hg push
+  pushing to $TESTTMP/B7/server (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  2 new obsolescence markers
+
+  $ cd ../..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-push-checkheads-pruned-B8.t	Thu Apr 20 12:24:43 2017 +0200
@@ -0,0 +1,98 @@
+====================================
+Testing head checking code: Case B-2
+====================================
+
+Mercurial checks for the introduction of new heads on push. Evolution comes
+into play to detect if existing branches on the server are being replaced by
+some of the new one we push.
+
+This case is part of a series of tests checking this behavior.
+
+Category B: simple case involving pruned changesets
+TestCase 2: multi-changeset branch, head is pruned, rest is superceeded, through other
+
+.. old-state:
+..
+.. * 2 changeset branch
+..
+.. new-state:
+..
+.. * old head is rewritten then pruned
+.. * 1 new branch succeeding to the other changeset in the old branch (through another obsolete branch)
+..
+.. expected-result:
+..
+.. * push allowed
+..
+.. graph-summary:
+..
+..   B ø⇠⊗ B'
+..     | | A'
+..   A ø⇠ø⇠◔ A''
+..     |/ /
+..     | /
+..     |/
+..     ●
+
+  $ . $TESTDIR/testlib/push-checkheads-util.sh
+
+Test setup
+----------
+
+  $ mkdir B8
+  $ cd B8
+  $ setuprepos
+  creating basic server and client repo
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd server
+  $ mkcommit B0
+  $ cd ../client
+  $ hg pull
+  pulling from $TESTTMP/B8/server (glob)
+  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 up 0
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit A1
+  created new head
+  $ mkcommit B1
+  $ hg up 0
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ mkcommit A2
+  created new head
+  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
+  $ hg debugobsolete `getid "desc(B0)" ` `getid "desc(B1)"`
+  $ hg debugobsolete --record-parents `getid "desc(B1)"`
+  $ hg debugobsolete `getid "desc(A1)" ` `getid "desc(A2)"`
+  $ hg log -G --hidden
+  @  c1f8d089020f (draft): A2
+  |
+  | x  262c8c798096 (draft): B1
+  | |
+  | x  f6082bc4ffef (draft): A1
+  |/
+  | x  d73caddc5533 (draft): B0
+  | |
+  | x  8aaa48160adc (draft): A0
+  |/
+  o  1e4be0697311 (public): root
+  
+
+Actual testing
+--------------
+
+  $ hg push
+  pushing to $TESTTMP/B8/server (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  4 new obsolescence markers
+
+  $ cd ../..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-push-checkheads-superceed-A1.t	Thu Apr 20 12:24:43 2017 +0200
@@ -0,0 +1,69 @@
+====================================
+Testing head checking code: Case A-1
+====================================
+
+Mercurial checks for the introduction of new heads on push. Evolution comes
+into play to detect if existing branches on the server are being replaced by
+some of the new one we push.
+
+This case is part of a series of tests checking this behavior.
+
+Category A: simple case involving a branch being superceeded by another.
+TestCase 1: single-changeset branch
+
+.. old-state:
+..
+.. * 1 changeset branch
+..
+.. new-state:
+..
+.. * 1 changeset branch succeeding to A
+..
+.. expected-result:
+..
+.. * push allowed
+..
+.. graph-summary:
+..
+..   A ø⇠◔ A'
+..     |/
+..     ●
+
+  $ . $TESTDIR/testlib/push-checkheads-util.sh
+
+Test setup
+----------
+
+  $ mkdir A1
+  $ cd A1
+  $ setuprepos
+  creating basic server and client repo
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd client
+  $ hg up 0
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit A1
+  created new head
+  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
+  $ hg log -G --hidden
+  @  f6082bc4ffef (draft): A1
+  |
+  | x  8aaa48160adc (draft): A0
+  |/
+  o  1e4be0697311 (public): root
+  
+
+Actual testing
+--------------
+
+  $ hg push
+  pushing to $TESTTMP/A1/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
+
+  $ cd ../..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-push-checkheads-superceed-A2.t	Thu Apr 20 12:24:43 2017 +0200
@@ -0,0 +1,87 @@
+====================================
+Testing head checking code: Case A-2
+====================================
+
+Mercurial checks for the introduction of new heads on push. Evolution comes
+into play to detect if existing branches on the server are being replaced by
+some of the new one we push.
+
+This case is part of a series of tests checking this behavior.
+
+Category A: simple case involving a branch being superceeded by another.
+TestCase 2: multi-changeset branch
+
+.. old-state:
+..
+.. * 1 branch with 2 changesets
+..
+.. new-state:
+..
+.. * another 2-changeset branch succeeding the old one
+..
+.. expected-result:
+..
+.. * push allowed
+..
+.. graph-summary:
+..
+..   B ø⇠◔ B'
+..     | |
+..   A ø⇠◔ A'
+..     |/
+..     ●
+
+  $ . $TESTDIR/testlib/push-checkheads-util.sh
+
+Test setup
+----------
+
+  $ mkdir A2
+  $ cd A2
+  $ setuprepos
+  creating basic server and client repo
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd server
+  $ mkcommit B0
+  $ cd ../client
+  $ hg pull
+  pulling from $TESTTMP/A2/server (glob)
+  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 up 0
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit A1
+  created new head
+  $ mkcommit B1
+  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
+  $ hg debugobsolete `getid "desc(B0)" ` `getid "desc(B1)"`
+  $ hg log -G --hidden
+  @  262c8c798096 (draft): B1
+  |
+  o  f6082bc4ffef (draft): A1
+  |
+  | x  d73caddc5533 (draft): B0
+  | |
+  | x  8aaa48160adc (draft): A0
+  |/
+  o  1e4be0697311 (public): root
+  
+
+Actual testing
+--------------
+
+  $ hg push
+  pushing to $TESTTMP/A2/server (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 2 changesets with 2 changes to 2 files (+1 heads)
+  2 new obsolescence markers
+
+  $ cd ../..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-push-checkheads-superceed-A3.t	Thu Apr 20 12:24:43 2017 +0200
@@ -0,0 +1,90 @@
+====================================
+Testing head checking code: Case A-3
+====================================
+
+Mercurial checks for the introduction of new heads on push. Evolution comes
+into play to detect if existing branches on the server are being replaced by
+some of the new one we push.
+
+This case is part of a series of tests checking this behavior.
+
+Category A: simple case involving a branch being superceeded by another.
+TestCase 3: multi-changeset branch with reordering
+
+Push should be allowed
+.. old-state:
+..
+.. * 2 changeset branch
+..
+.. new-state:
+..
+.. * 2 changeset branch succeeding the old one with reordering
+..
+.. expected-result:
+..
+.. * push allowed
+..
+.. graph-summary:
+..
+..   B ø⇠⇠
+..     | ⇡
+..   A ø⇠⇠⇠○ A'
+..     | ⇡/
+..     | ○ B'
+..     |/
+..     ●
+
+  $ . $TESTDIR/testlib/push-checkheads-util.sh
+
+Test setup
+----------
+
+  $ mkdir A3
+  $ cd A3
+  $ setuprepos
+  creating basic server and client repo
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd server
+  $ mkcommit B0
+  $ cd ../client
+  $ hg pull
+  pulling from $TESTTMP/A3/server (glob)
+  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 up 0
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit B1
+  created new head
+  $ mkcommit A1
+  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
+  $ hg debugobsolete `getid "desc(B0)" ` `getid "desc(B1)"`
+  $ hg log -G --hidden
+  @  c1c7524e9488 (draft): A1
+  |
+  o  25c56d33e4c4 (draft): B1
+  |
+  | x  d73caddc5533 (draft): B0
+  | |
+  | x  8aaa48160adc (draft): A0
+  |/
+  o  1e4be0697311 (public): root
+  
+
+Actual testing
+--------------
+
+  $ hg push
+  pushing to $TESTTMP/A3/server (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 2 changesets with 2 changes to 2 files (+1 heads)
+  2 new obsolescence markers
+
+  $ cd ../..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-push-checkheads-superceed-A4.t	Thu Apr 20 12:24:43 2017 +0200
@@ -0,0 +1,74 @@
+====================================
+Testing head checking code: Case A-4
+====================================
+
+Mercurial checks for the introduction of new heads on push. Evolution comes
+into play to detect if existing branches on the server are being replaced by
+some of the new one we push.
+
+This case is part of a series of tests checking this behavior.
+
+Category A: simple case involving a branch being superceeded by another.
+TestCase 4: New changeset as children of the successor
+
+.. old-state:
+..
+.. * 1-changeset branch
+..
+.. new-state:
+..
+.. * 2-changeset branch, first is a successor, but head is new
+..
+.. expected-result:
+..
+.. * push allowed
+..
+.. graph-summary:
+..
+..       ◔ B
+..       |
+..   A ø⇠◔ A'
+..     |/
+..     ●
+
+  $ . $TESTDIR/testlib/push-checkheads-util.sh
+
+Test setup
+----------
+
+  $ mkdir A4
+  $ cd A4
+  $ setuprepos
+  creating basic server and client repo
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd client
+  $ hg up 0
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit A1
+  created new head
+  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
+  $ mkcommit B0
+  $ hg log -G --hidden
+  @  f40ded968333 (draft): B0
+  |
+  o  f6082bc4ffef (draft): A1
+  |
+  | x  8aaa48160adc (draft): A0
+  |/
+  o  1e4be0697311 (public): root
+  
+
+Actual testing
+--------------
+
+  $ hg push
+  pushing to $TESTTMP/A4/server (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 2 changesets with 2 changes to 2 files (+1 heads)
+  1 new obsolescence markers
+
+  $ cd ../../
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-push-checkheads-superceed-A5.t	Thu Apr 20 12:24:43 2017 +0200
@@ -0,0 +1,75 @@
+====================================
+Testing head checking code: Case A-5
+====================================
+
+Mercurial checks for the introduction of new heads on push. Evolution comes
+into play to detect if existing branches on the server are being replaced by
+some of the new one we push.
+
+This case is part of a series of tests checking this behavior.
+
+Category A: simple case involving a branch being superceeded by another.
+TestCase 5: New changeset as parent of the successor
+
+.. old-state:
+..
+.. * 1-changeset branch
+..
+.. new-state:
+..
+.. * 2rchangeset branch, head is a successor, but other is new
+..
+.. expected-result:
+..
+.. * push allowed
+..
+.. graph-summary:
+..
+..   A ø⇠◔ A'
+..     | |
+..     | ◔ B
+..     |/
+..     ●
+
+  $ . $TESTDIR/testlib/push-checkheads-util.sh
+
+Test setup
+----------
+
+  $ mkdir A5
+  $ cd A5
+  $ setuprepos
+  creating basic server and client repo
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd client
+  $ hg up 0
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit B0
+  created new head
+  $ mkcommit A1
+  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
+  $ hg log -G --hidden
+  @  ba93660aff8d (draft): A1
+  |
+  o  74ff5441d343 (draft): B0
+  |
+  | x  8aaa48160adc (draft): A0
+  |/
+  o  1e4be0697311 (public): root
+  
+
+Actual testing
+--------------
+
+  $ hg push
+  pushing to $TESTTMP/A5/server (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 2 changesets with 2 changes to 2 files (+1 heads)
+  1 new obsolescence markers
+
+  $ cd ../..
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-push-checkheads-superceed-A6.t	Thu Apr 20 12:24:43 2017 +0200
@@ -0,0 +1,98 @@
+====================================
+Testing head checking code: Case A-6
+====================================
+
+Mercurial checks for the introduction of new heads on push. Evolution comes
+into play to detect if existing branches on the server are being replaced by
+some of the new one we push.
+
+This case is part of a series of tests checking this behavior.
+
+Category A: simple case involving a branch being superceeded by another.
+TestCase 6: multi-changeset branch, split on multiple other, (base on its own branch), same number of head
+
+.. old-state:
+..
+.. * 2 branch (1-changeset, and 2-changesets)
+..
+.. new-state:
+..
+.. * 1 new branch superceeding the base of the old-2-changesets-branch,
+.. * 1 new changesets on the old-1-changeset-branch superceeding the head of the other
+..
+.. expected-result:
+..
+.. * push allowed
+..
+.. graph-summary:
+..
+.. B'◔⇢ø B
+..   | |
+.. A | ø⇠◔ A'
+..   | |/
+.. C ● |
+..    \|
+..     ●
+
+  $ . $TESTDIR/testlib/push-checkheads-util.sh
+
+Test setup
+----------
+
+  $ mkdir A6
+  $ cd A6
+  $ setuprepos
+  creating basic server and client repo
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd server
+  $ mkcommit B0
+  $ hg up 0
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ mkcommit C0
+  created new head
+  $ cd ../client
+  $ hg pull
+  pulling from $TESTTMP/A6/server (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 2 changesets with 2 changes to 2 files (+1 heads)
+  (run 'hg heads' to see heads, 'hg merge' to merge)
+  $ hg up 0
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit A1
+  created new head
+  $ hg up 'desc(C0)'
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit B1
+  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
+  $ hg debugobsolete `getid "desc(B0)" ` `getid "desc(B1)"`
+  $ hg log -G --hidden
+  @  d70a1f75a020 (draft): B1
+  |
+  | o  f6082bc4ffef (draft): A1
+  | |
+  o |  0f88766e02d6 (draft): C0
+  |/
+  | x  d73caddc5533 (draft): B0
+  | |
+  | x  8aaa48160adc (draft): A0
+  |/
+  o  1e4be0697311 (public): root
+  
+
+Actual testing
+--------------
+
+  $ hg push
+  pushing to $TESTTMP/A6/server (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 2 changesets with 2 changes to 2 files (+1 heads)
+  2 new obsolescence markers
+
+  $ cd ../..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-push-checkheads-superceed-A7.t	Thu Apr 20 12:24:43 2017 +0200
@@ -0,0 +1,98 @@
+====================================
+Testing head checking code: Case A-7
+====================================
+
+Mercurial checks for the introduction of new heads on push. Evolution comes
+into play to detect if existing branches on the server are being replaced by
+some of the new one we push.
+
+This case is part of a series of tests checking this behavior.
+
+Category A: simple case involving a branch being superceeded by another.
+TestCase 7: multi-changeset branch, split on multiple other, (head on its own branch), same number of head
+
+.. old-state:
+..
+.. * 2 branch (1-changeset, and 2-changesets)
+..
+.. new-state:
+..
+.. * 1 new branch superceeding the head of the old-2-changesets-branch,
+.. * 1 new changesets on the old-1-changeset-branch superceeding the base of the other
+..
+.. expected-result:
+..
+.. * push allowed
+..
+.. graph-summary:
+..
+..   B ø⇠◔ B'
+..     | |
+.. A'◔⇢ø |
+..   | |/
+.. C ● |
+..    \|
+..     ●
+
+  $ . $TESTDIR/testlib/push-checkheads-util.sh
+
+Test setup
+----------
+
+  $ mkdir A7
+  $ cd A7
+  $ setuprepos
+  creating basic server and client repo
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd server
+  $ mkcommit B0
+  $ hg up 0
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ mkcommit C0
+  created new head
+  $ cd ../client
+  $ hg pull
+  pulling from $TESTTMP/A7/server (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 2 changesets with 2 changes to 2 files (+1 heads)
+  (run 'hg heads' to see heads, 'hg merge' to merge)
+  $ hg up 'desc(C0)'
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit A1
+  $ hg up 0
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ mkcommit B1
+  created new head
+  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
+  $ hg debugobsolete `getid "desc(B0)" ` `getid "desc(B1)"`
+  $ hg log -G --hidden
+  @  25c56d33e4c4 (draft): B1
+  |
+  | o  a0802eb7fc1b (draft): A1
+  | |
+  | o  0f88766e02d6 (draft): C0
+  |/
+  | x  d73caddc5533 (draft): B0
+  | |
+  | x  8aaa48160adc (draft): A0
+  |/
+  o  1e4be0697311 (public): root
+  
+
+Actual testing
+--------------
+
+  $ hg push
+  pushing to $TESTTMP/A7/server (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 2 changesets with 2 changes to 2 files (+1 heads)
+  2 new obsolescence markers
+
+  $ cd ../..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-push-checkheads-superceed-A8.t	Thu Apr 20 12:24:43 2017 +0200
@@ -0,0 +1,79 @@
+====================================
+Testing head checking code: Case A-8
+====================================
+
+Mercurial checks for the introduction of new heads on push. Evolution comes
+into play to detect if existing branches on the server are being replaced by
+some of the new one we push.
+
+This case is part of a series of tests checking this behavior.
+
+Category A: simple case involving a branch being superceeded by another.
+TestCase 8: single-changeset branch indirect rewrite
+
+.. old-state:
+..
+.. * 1-changeset branch
+..
+.. new-state:
+..
+.. * 1-changeset branch succeeding to A, through another unpushed changesets
+..
+.. expected-result:
+..
+.. * push allowed
+..
+.. graph-summary:
+..
+..       A'
+..   A ø⇠ø⇠◔ A''
+..     |/ /
+..     | /
+..     |/
+..     ●
+
+  $ . $TESTDIR/testlib/push-checkheads-util.sh
+
+Test setup
+----------
+
+  $ mkdir A8
+  $ cd A8
+  $ setuprepos
+  creating basic server and client repo
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd client
+  $ hg up 0
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit A1
+  created new head
+  $ hg up 0
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit A2
+  created new head
+  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
+  $ hg debugobsolete `getid "desc(A1)" ` `getid "desc(A2)"`
+  $ hg log -G --hidden
+  @  c1f8d089020f (draft): A2
+  |
+  | x  f6082bc4ffef (draft): A1
+  |/
+  | x  8aaa48160adc (draft): A0
+  |/
+  o  1e4be0697311 (public): root
+  
+
+Actual testing
+--------------
+
+  $ hg push
+  pushing to $TESTTMP/A8/server (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  2 new obsolescence markers
+
+  $ cd ../..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-push-checkheads-unpushed-D1.t	Thu Apr 20 12:24:43 2017 +0200
@@ -0,0 +1,77 @@
+====================================
+Testing head checking code: Case D-1
+====================================
+
+Mercurial checks for the introduction of new heads on push. Evolution comes
+into play to detect if existing branches on the server are being replaced by
+some of the new one we push.
+
+This case is part of a series of tests checking this behavior.
+
+Category D: remote head is "obs-affected" locally, but result is not part of the push
+TestCase 1: remote head is rewritten, but successors is not part of the push
+
+.. old-state:
+..
+.. * 1 changeset branch
+..
+.. new-state:
+..
+.. * 1 changeset branch succeeding the old branch
+.. * 1 new unrelated branch
+..
+.. expected-result:
+..
+.. * pushing only the unrelated branch: denied
+..
+.. graph-summary:
+..
+..   A ø⇠○ A'
+..     |/
+..     | ◔ B
+..     |/
+..     ●
+
+  $ . $TESTDIR/testlib/push-checkheads-util.sh
+
+Test setup
+----------
+
+  $ mkdir D1
+  $ cd D1
+  $ setuprepos
+  creating basic server and client repo
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd client
+  $ hg up 0
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit A1
+  created new head
+  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
+  $ hg up 0
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit B0
+  created new head
+  $ hg log -G --hidden
+  @  74ff5441d343 (draft): B0
+  |
+  | o  f6082bc4ffef (draft): A1
+  |/
+  | x  8aaa48160adc (draft): A0
+  |/
+  o  1e4be0697311 (public): root
+  
+
+Actual testing
+--------------
+
+  $ hg push -r 'desc(B0)'
+  pushing to $TESTTMP/D1/server (glob)
+  searching for changes
+  abort: push creates new remote head 74ff5441d343!
+  (merge or see 'hg help push' for details about pushing new heads)
+  [255]
+
+  $ cd ../..
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-push-checkheads-unpushed-D2.t	Thu Apr 20 12:24:43 2017 +0200
@@ -0,0 +1,93 @@
+====================================
+Testing head checking code: Case D-2
+====================================
+
+Mercurial checks for the introduction of new heads on push. Evolution comes
+into play to detect if existing branches on the server are being replaced by
+some of the new one we push.
+
+This case is part of a series of tests checking this behavior.
+
+Category D: remote head is "obs-affected" locally, but result is not part of the push
+TestCase 1: remote branch has 2 changes, head is pruned, other is rewritten but result is not pushed
+
+.. old-state:
+..
+.. * 1 changeset branch
+..
+.. new-state:
+..
+.. * old head is pruned
+.. * 1 new branch succeeding to the other changeset in the old branch
+.. * 1 new unrelated branch
+..
+.. expected-result:
+..
+.. * push allowed
+.. * pushing only the unrelated branch: denied
+..
+.. graph-summary:
+..
+..   B ⊗
+..     |
+..   A ø⇠○ A'
+..     |/
+..     | ◔ C
+..     |/
+..     ●
+
+  $ . $TESTDIR/testlib/push-checkheads-util.sh
+
+Test setup
+----------
+
+  $ mkdir D2
+  $ cd D2
+  $ setuprepos
+  creating basic server and client repo
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd server
+  $ mkcommit B0
+  $ cd ../client
+  $ hg pull
+  pulling from $TESTTMP/D2/server (glob)
+  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 up 0
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit A1
+  created new head
+  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
+  $ hg debugobsolete --record-parents `getid "desc(B0)"`
+  $ hg up 0
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit C0
+  created new head
+  $ hg log -G --hidden
+  @  0f88766e02d6 (draft): C0
+  |
+  | o  f6082bc4ffef (draft): A1
+  |/
+  | x  d73caddc5533 (draft): B0
+  | |
+  | x  8aaa48160adc (draft): A0
+  |/
+  o  1e4be0697311 (public): root
+  
+
+Actual testing
+--------------
+
+  $ hg push --rev 'desc(C0)'
+  pushing to $TESTTMP/D2/server (glob)
+  searching for changes
+  abort: push creates new remote head 0f88766e02d6!
+  (merge or see 'hg help push' for details about pushing new heads)
+  [255]
+
+  $ cd ../..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-push-checkheads-unpushed-D3.t	Thu Apr 20 12:24:43 2017 +0200
@@ -0,0 +1,110 @@
+====================================
+Testing head checking code: Case D-3
+====================================
+
+Mercurial checks for the introduction of new heads on push. Evolution comes
+into play to detect if existing branches on the server are being replaced by
+some of the new one we push.
+
+This case is part of a series of tests checking this behavior.
+
+Category D: remote head is "obs-affected" locally, but result is not part of the push
+TestCase 3: multi-changeset branch, split on multiple new others, only one of them is pushed
+
+.. old-state:
+..
+.. * 2 changesets branch
+..
+.. new-state:
+..
+.. * 2 new branches, each superseding one changeset in the old one.
+..
+.. expected-result:
+..
+.. * pushing only one of the resulting branch (either of them)
+.. * push denied
+..
+.. graph-summary:
+..
+.. B'◔⇢ø B
+..   | |
+.. A | ø⇠◔ A'
+..   | |/
+..    \|
+..     ●
+
+  $ . $TESTDIR/testlib/push-checkheads-util.sh
+
+Test setup
+----------
+
+  $ mkdir D3
+  $ cd D3
+  $ setuprepos
+  creating basic server and client repo
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd server
+  $ mkcommit B0
+  $ hg up 0
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ cd ../client
+  $ hg pull
+  pulling from $TESTTMP/D3/server (glob)
+  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 up 0
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit A1
+  created new head
+  $ hg up '0'
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit B1
+  created new head
+  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
+  $ hg debugobsolete `getid "desc(B0)" ` `getid "desc(B1)"`
+  $ hg log -G --hidden
+  @  25c56d33e4c4 (draft): B1
+  |
+  | o  f6082bc4ffef (draft): A1
+  |/
+  | x  d73caddc5533 (draft): B0
+  | |
+  | x  8aaa48160adc (draft): A0
+  |/
+  o  1e4be0697311 (public): root
+  
+
+Actual testing
+--------------
+
+  $ hg push --rev 'desc(A1)'
+  pushing to $TESTTMP/D3/server (glob)
+  searching for changes
+  abort: push creates new remote head f6082bc4ffef!
+  (merge or see 'hg help push' for details about pushing new heads)
+  [255]
+  $ hg push --rev 'desc(B1)'
+  pushing to $TESTTMP/D3/server (glob)
+  searching for changes
+  abort: push creates new remote head 25c56d33e4c4!
+  (merge or see 'hg help push' for details about pushing new heads)
+  [255]
+
+Extra testing
+-------------
+
+In this case, even a bare push is creating more heads
+
+  $ hg push
+  pushing to $TESTTMP/D3/server (glob)
+  searching for changes
+  abort: push creates new remote head 25c56d33e4c4!
+  (merge or see 'hg help push' for details about pushing new heads)
+  [255]
+
+  $ cd ../..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-push-checkheads-unpushed-D4.t	Thu Apr 20 12:24:43 2017 +0200
@@ -0,0 +1,122 @@
+====================================
+Testing head checking code: Case D-4
+====================================
+
+Mercurial checks for the introduction of new heads on push. Evolution comes
+into play to detect if existing branches on the server are being replaced by
+some of the new one we push.
+
+This case is part of a series of tests checking this behavior.
+
+Category D: remote head is "obs-affected" locally, but result is not part of the push
+TestCase 4: multi-changeset branch, split on multiple other, (base on its own new branch)
+
+.. old-state:
+..
+.. * 2 branch (1 changeset, and 2 changesets)
+..
+.. new-state:
+..
+.. * 1 new branch superceeding the base of the old-2-changesets-branch,
+.. * 1 new changesets on the old-1-changeset-branch superceeding the head of the other
+..
+.. expected-result:
+..
+.. * push the new branch only -> push denied (variant a)
+.. * push the existing branch only -> push allowed (variant b)
+.. (pushing all is tested as case A-7)
+..
+.. graph-summary:
+..
+.. (variant a)
+..
+.. B'○⇢ø B
+..   | |
+.. A | ø⇠◔ A'
+..   | |/
+.. C ● |
+..    \|
+..     ●
+..
+.. or (variant b)
+..
+.. B'◔⇢ø B
+..   | |
+.. A | ø⇠○ A'
+..   | |/
+.. C ● |
+..    \|
+..     ●
+
+  $ . $TESTDIR/testlib/push-checkheads-util.sh
+
+Test setup
+----------
+
+  $ mkdir D4
+  $ cd D4
+  $ setuprepos
+  creating basic server and client repo
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd server
+  $ mkcommit B0
+  $ hg up 0
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ mkcommit C0
+  created new head
+  $ cd ../client
+  $ hg pull
+  pulling from $TESTTMP/D4/server (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 2 changesets with 2 changes to 2 files (+1 heads)
+  (run 'hg heads' to see heads, 'hg merge' to merge)
+  $ hg up 0
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit A1
+  created new head
+  $ hg up 'desc(C0)'
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit B1
+  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
+  $ hg debugobsolete `getid "desc(B0)" ` `getid "desc(B1)"`
+  $ hg log -G --hidden
+  @  d70a1f75a020 (draft): B1
+  |
+  | o  f6082bc4ffef (draft): A1
+  | |
+  o |  0f88766e02d6 (draft): C0
+  |/
+  | x  d73caddc5533 (draft): B0
+  | |
+  | x  8aaa48160adc (draft): A0
+  |/
+  o  1e4be0697311 (public): root
+  
+
+Actual testing (new branch only)
+--------------------------------
+
+  $ hg push --rev 'desc(A1)'
+  pushing to $TESTTMP/D4/server (glob)
+  searching for changes
+  abort: push creates new remote head f6082bc4ffef!
+  (merge or see 'hg help push' for details about pushing new heads)
+  [255]
+
+Actual testing (existing branch only)
+------------------------------------
+
+  $ hg push --rev 'desc(B1)'
+  pushing to $TESTTMP/D4/server (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  1 new obsolescence markers
+
+  $ cd ../..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-push-checkheads-unpushed-D5.t	Thu Apr 20 12:24:43 2017 +0200
@@ -0,0 +1,107 @@
+====================================
+Testing head checking code: Case D-5
+====================================
+
+Mercurial checks for the introduction of new heads on push. Evolution comes
+into play to detect if existing branches on the server are being replaced by
+some of the new one we push.
+
+This case is part of a series of tests checking this behavior.
+
+Category D: remote head is "obs-affected" locally, but result is not part of the push
+TestCase 5: multi-changeset branch, split on multiple other, (head on its own new branch)
+
+.. old-state:
+..
+.. * 2 branch (1 changeset, and 2 changesets)
+..
+.. new-state:
+..
+.. * 1 new branch superceeding the head of the old-2-changesets-branch,
+.. * 1 new changesets on the old-1-changeset-branch superceeding the base of the other
+..
+.. expected-result:
+..
+.. * push the new branch only -> push denied
+.. * push the existing branch only -> push allowed
+..   /!\ This push create unstability/orphaning on the other hand and we should
+..  probably detect/warn agains that.
+..
+.. graph-summary:
+..
+..   B ø⇠◔ B'
+..     | |
+.. A'◔⇢ø |
+..   | |/
+.. C ● |
+..    \|
+..     ●
+
+  $ . $TESTDIR/testlib/push-checkheads-util.sh
+
+Test setup
+----------
+
+  $ mkdir D5
+  $ cd D5
+  $ setuprepos
+  creating basic server and client repo
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd server
+  $ mkcommit B0
+  $ hg up 0
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ mkcommit C0
+  created new head
+  $ cd ../client
+  $ hg pull
+  pulling from $TESTTMP/D5/server (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 2 changesets with 2 changes to 2 files (+1 heads)
+  (run 'hg heads' to see heads, 'hg merge' to merge)
+  $ hg up 'desc(C0)'
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit A1
+  $ hg up 0
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ mkcommit B1
+  created new head
+  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
+  $ hg debugobsolete `getid "desc(B0)" ` `getid "desc(B1)"`
+  $ hg log -G --hidden
+  @  25c56d33e4c4 (draft): B1
+  |
+  | o  a0802eb7fc1b (draft): A1
+  | |
+  | o  0f88766e02d6 (draft): C0
+  |/
+  | x  d73caddc5533 (draft): B0
+  | |
+  | x  8aaa48160adc (draft): A0
+  |/
+  o  1e4be0697311 (public): root
+  
+
+Actual testing
+--------------
+
+  $ hg push --rev 'desc(B1)'
+  pushing to $TESTTMP/D5/server (glob)
+  searching for changes
+  abort: push creates new remote head 25c56d33e4c4!
+  (merge or see 'hg help push' for details about pushing new heads)
+  [255]
+  $ hg push --rev 'desc(A1)'
+  pushing to $TESTTMP/D5/server (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  1 new obsolescence markers
+
+  $ cd ../..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-push-checkheads-unpushed-D6.t	Thu Apr 20 12:24:43 2017 +0200
@@ -0,0 +1,82 @@
+====================================
+Testing head checking code: Case D-6
+====================================
+
+Mercurial checks for the introduction of new heads on push. Evolution comes
+into play to detect if existing branches on the server are being replaced by
+some of the new one we push.
+
+This case is part of a series of tests checking this behavior.
+
+Category D: remote head is "obs-affected" locally, but result is not part of the push
+TestCase 6: single changeset, superseeded then pruned (on a new changeset unpushed) changeset
+
+This is a partial push variation of case B-6
+
+.. old-state:
+..
+.. * 1 changeset branch
+..
+.. new-state:
+..
+.. * old branch is rewritten onto another one,
+.. * the new version is then pruned.
+..
+.. expected-result:
+..
+.. * push denied
+..
+.. graph-summary:
+..
+..   A ø⇠⊗ A'
+..     | |
+.. C ◔ | ○ B
+..    \|/
+..     ●
+
+  $ . $TESTDIR/testlib/push-checkheads-util.sh
+
+Test setup
+----------
+
+  $ mkdir D6
+  $ cd D6
+  $ setuprepos
+  creating basic server and client repo
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd client
+  $ hg up 0
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit B0
+  created new head
+  $ mkcommit A1
+  $ hg up '0'
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ mkcommit C0
+  created new head
+  $ hg debugobsolete `getid "desc(A0)"` `getid "desc(A1)"`
+  $ hg debugobsolete --record-parents `getid "desc(A1)"`
+  $ hg log -G --hidden
+  @  0f88766e02d6 (draft): C0
+  |
+  | x  ba93660aff8d (draft): A1
+  | |
+  | o  74ff5441d343 (draft): B0
+  |/
+  | x  8aaa48160adc (draft): A0
+  |/
+  o  1e4be0697311 (public): root
+  
+
+Actual testing
+--------------
+
+  $ hg push --rev 'desc(C0)'
+  pushing to $TESTTMP/D6/server (glob)
+  searching for changes
+  abort: push creates new remote head 0f88766e02d6!
+  (merge or see 'hg help push' for details about pushing new heads)
+  [255]
+
+  $ cd ../..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-push-checkheads-unpushed-D7.t	Thu Apr 20 12:24:43 2017 +0200
@@ -0,0 +1,96 @@
+====================================
+Testing head checking code: Case D-7
+====================================
+
+Mercurial checks for the introduction of new heads on push. Evolution comes
+into play to detect if existing branches on the server are being replaced by
+some of the new one we push.
+
+This case is part of a series of tests checking this behavior.
+
+Category D: remote head is "obs-affected" locally, but result is not part of the push
+TestCase 7: single changesets, superseeded multiple time then pruned (on a new changeset unpushed) changeset
+
+This is a partial push variation of B6
+
+.. old-state:
+..
+.. * 1 changeset branch
+..
+.. new-state:
+..
+.. * old branch is rewritten onto another one,
+.. * The rewriting it again rewritten on the root
+.. * the new version is then pruned.
+..
+.. expected-result:
+..
+.. * push allowed
+..
+.. graph-summary:
+..
+..       A'
+..   A ø⇠ø⇠⊗ A''
+..     | | |
+.. C ◔ | ◔ | B
+..    \|/ /
+..     | /
+..     |/
+..     |
+..     ●
+
+  $ . $TESTDIR/testlib/push-checkheads-util.sh
+
+Test setup
+----------
+
+  $ mkdir D7
+  $ cd D7
+  $ setuprepos
+  creating basic server and client repo
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd client
+  $ hg up 0
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit B0
+  created new head
+  $ mkcommit A1
+  $ hg up '0'
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ mkcommit A2
+  created new head
+  $ hg up '0'
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit C0
+  created new head
+  $ hg debugobsolete `getid "desc(A0)"` `getid "desc(A1)"`
+  $ hg debugobsolete `getid "desc(A1)"` `getid "desc(A2)"`
+  $ hg debugobsolete --record-parents `getid "desc(A2)"`
+  $ hg log -G --hidden
+  @  0f88766e02d6 (draft): C0
+  |
+  | x  c1f8d089020f (draft): A2
+  |/
+  | x  ba93660aff8d (draft): A1
+  | |
+  | o  74ff5441d343 (draft): B0
+  |/
+  | x  8aaa48160adc (draft): A0
+  |/
+  o  1e4be0697311 (public): root
+  
+
+Actual testing
+--------------
+
+  $ hg push --rev 'desc(C0)'
+  pushing to $TESTTMP/D7/server (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  3 new obsolescence markers
+
+  $ cd ../..
--- a/tests/testlib/checkheads-util.sh	Thu Apr 20 11:43:57 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-# common setup for head checking code
-
-. $TESTDIR/testlib/common.sh
-
-cat >> $HGRCPATH <<EOF
-[ui]
-logtemplate ="{node|short} ({phase}): {desc}\n"
-
-[phases]
-publish=False
-
-[extensions]
-strip=
-evolve=
-EOF
-
-setuprepos() {
-    echo creating basic server and client repo
-    hg init server
-    cd server
-    mkcommit root
-    hg phase --public .
-    mkcommit A0
-    cd .. 
-    hg clone server client
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/testlib/push-checkheads-util.sh	Thu Apr 20 12:24:43 2017 +0200
@@ -0,0 +1,29 @@
+# setup config and various utility to test new heads checks on push
+
+. $TESTDIR/testlib/common.sh
+
+cat >> $HGRCPATH <<EOF
+[ui]
+# simpler log output
+logtemplate ="{node|short} ({phase}): {desc}\n"
+
+[phases]
+# non publishing server
+publish=False
+
+[extensions]
+# we need to strip some changeset for some test cases
+strip=
+evolve=
+EOF
+
+setuprepos() {
+    echo creating basic server and client repo
+    hg init server
+    cd server
+    mkcommit root
+    hg phase --public .
+    mkcommit A0
+    cd ..
+    hg clone server client
+}