changeset 10875:a9702c47a19f stable

partial backout of 1e819576e926 and add tests (issue2131) The tests are due to Peter Arrenbrecht
author Sune Foldager <cryo@cyanite.org>
date Thu, 08 Apr 2010 19:46:47 +0200
parents 4f11978ae45d
children 24ed7a541f23 c63a6ddbbf9a
files mercurial/localrepo.py tests/test-push-warn tests/test-push-warn.out
diffstat 3 files changed, 157 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/localrepo.py	Wed Apr 07 21:31:47 2010 +0200
+++ b/mercurial/localrepo.py	Thu Apr 08 19:46:47 2010 +0200
@@ -1517,8 +1517,15 @@
             if len(lheads) > len(rheads):
                 warn = 1
             else:
+                # add local heads involved in the push
+                updatelheads = [self.changelog.heads(x, lheads)
+                                for x in update]
+                newheads = set(sum(updatelheads, [])) & set(lheads)
+
+                if not newheads:
+                    return True
+
                 # add heads we don't have or that are not involved in the push
-                newheads = set(lheads)
                 for r in rheads:
                     if r in self.changelog.nodemap:
                         desc = self.changelog.heads(r, heads)
--- a/tests/test-push-warn	Wed Apr 07 21:31:47 2010 +0200
+++ b/tests/test-push-warn	Thu Apr 08 19:46:47 2010 +0200
@@ -1,5 +1,8 @@
 #!/bin/sh
 
+echo "[extensions]" >> $HGRCPATH
+echo "graphlog=" >> $HGRCPATH
+
 mkdir a
 cd a
 hg init
@@ -193,5 +196,72 @@
 hg -q merge 3
 hg -q ci -d '0 0' -mma
 hg push ../l -b b
+cd ..
+
+echo % check prepush with new branch head on former topo non-head
+hg init n
+cd n
+hg branch A
+echo a >a
+hg ci -Ama
+hg branch B
+echo b >b
+hg ci -Amb
+# b is now branch head of B, and a topological head
+# a is now branch head of A, but not a topological head
+hg clone . inner
+cd inner
+hg up B
+echo b1 >b1
+hg ci -Amb1
+# in the clone b1 is now the head of B
+cd ..
+hg up 0
+echo a2 >a2
+hg ci -Ama2
+# a2 is now the new branch head of A, and a new topological head
+# it replaces a former inner branch head, so it should at most warn about A, not B
+echo %% glog of local
+hg glog --template "{rev}: {branches} {desc}\n"
+echo %% glog of remote
+hg glog -R inner --template "{rev}: {branches} {desc}\n"
+echo %% outgoing
+hg out inner --template "{rev}: {branches} {desc}\n"
+hg push inner
+cd ..
+
+echo % check prepush with new branch head on former topo head
+hg init o
+cd o
+hg branch A
+echo a >a
+hg ci -Ama
+hg branch B
+echo b >b
+hg ci -Amb
+# b is now branch head of B, and a topological head
+hg up 0
+echo a1 >a1
+hg ci -Ama1
+# a1 is now branch head of A, and a topological head
+hg clone . inner
+cd inner
+hg up B
+echo b1 >b1
+hg ci -Amb1
+# in the clone b1 is now the head of B
+cd ..
+echo a2 >a2
+hg ci -Ama2
+# a2 is now the new branch head of A, and a topological head
+# it replaces a former topological and branch head, so this should not warn
+echo %% glog of local
+hg glog --template "{rev}: {branches} {desc}\n"
+echo %% glog of remote
+hg glog -R inner --template "{rev}: {branches} {desc}\n"
+echo %% outgoing
+hg out inner --template "{rev}: {branches} {desc}\n"
+hg push inner
+cd ..
 
 exit 0
--- a/tests/test-push-warn.out	Wed Apr 07 21:31:47 2010 +0200
+++ b/tests/test-push-warn.out	Thu Apr 08 19:46:47 2010 +0200
@@ -175,3 +175,82 @@
 searching for changes
 abort: push creates new remote heads on branch 'a'!
 (did you forget to merge? use push -f to force)
+% check prepush with new branch head on former topo non-head
+marked working directory as branch A
+adding a
+marked working directory as branch B
+adding b
+updating to branch B
+2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+adding b1
+0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+adding a2
+created new head
+%% glog of local
+@  2: A a2
+|
+| o  1: B b
+|/
+o  0: A a
+
+%% glog of remote
+@  2: B b1
+|
+o  1: B b
+|
+o  0: A a
+
+%% outgoing
+comparing with inner
+searching for changes
+2: A a2
+pushing to inner
+searching for changes
+note: unsynced remote changes!
+adding changesets
+adding manifests
+adding file changes
+added 1 changesets with 1 changes to 1 files (+1 heads)
+% check prepush with new branch head on former topo head
+marked working directory as branch A
+adding a
+marked working directory as branch B
+adding b
+0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+adding a1
+created new head
+updating to branch A
+2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+adding b1
+adding a2
+%% glog of local
+@  3: A a2
+|
+o  2: A a1
+|
+| o  1: B b
+|/
+o  0: A a
+
+%% glog of remote
+@  3: B b1
+|
+| o  2: A a1
+| |
+o |  1: B b
+|/
+o  0: A a
+
+%% outgoing
+comparing with inner
+searching for changes
+3: A a2
+pushing to inner
+searching for changes
+note: unsynced remote changes!
+adding changesets
+adding manifests
+adding file changes
+added 1 changesets with 1 changes to 1 files