[PATCH 2 of 2] discovery: abort also when pushing multiple headed new branch

FUJIWARA Katsunori foozy at lares.dti.ne.jp
Wed Jan 16 08:47:35 CST 2013


# HG changeset patch
# User FUJIWARA Katsunori <foozy at lares.dti.ne.jp>
# Date 1358347312 -32400
# Node ID fa8cc735280a977f2ebeddf74206f37d3132b4e4
# Parent  3842a427e56915d1d08660b86d5cc107ff9e30c9
discovery: abort also when pushing multiple headed new branch

Before this patch, pushing with --new-branch permits to create
multiple headed branch on the destination repository.

But permitting to create new branch should be different from
permitting to create multiple heads on branch.

This patch prevents from careless pushing multiple headed new branch,
and requires --force to push such branch forcibly.

diff -r 3842a427e569 -r fa8cc735280a mercurial/discovery.py
--- a/mercurial/discovery.py	Wed Jan 16 23:41:52 2013 +0900
+++ b/mercurial/discovery.py	Wed Jan 16 23:41:52 2013 +0900
@@ -269,13 +269,12 @@
     allfuturecommon = set(c.node() for c in repo.set('%ld', outgoing.common))
     allfuturecommon.update(allmissing)
     for branch, heads in headssum.iteritems():
-        if heads[0] is None:
-            # Maybe we should abort if we push more that one head
-            # for new branches ?
-            continue
         candidate_newhs = set(heads[1])
         # add unsynced data
-        oldhs = set(heads[0])
+        if heads[0] is None:
+            oldhs = set()
+        else:
+            oldhs = set(heads[0])
         oldhs.update(heads[2])
         candidate_newhs.update(heads[2])
         dhs = None
@@ -310,7 +309,15 @@
             newhs = candidate_newhs
         if [h for h in heads[2] if h not in discardedheads]:
             unsynced = True
-        if len(newhs) > len(oldhs):
+        if heads[0] is None:
+            if 1 < len(newhs):
+                dhs = list(newhs)
+                if error is None:
+                    error = _("push creates multiple headed new branch '%s'"
+                              ) % (branch)
+                    hint = _("did you forget to merge? "
+                             "see \"hg help push\" about pushing forcibly")
+        elif len(newhs) > len(oldhs):
             # strip updates to existing remote heads from the new heads list
             dhs = list(newhs - bookmarkedheads - oldhs)
         if dhs:
diff -r 3842a427e569 -r fa8cc735280a tests/test-push-warn.t
--- a/tests/test-push-warn.t	Wed Jan 16 23:41:52 2013 +0900
+++ b/tests/test-push-warn.t	Wed Jan 16 23:41:52 2013 +0900
@@ -354,6 +354,29 @@
   adding file changes
   added 1 changesets with 1 changes to 1 files
 
+Pushing muliple headed new branch:
+
+  $ echo 14 > foo
+  $ hg -q branch f
+  $ hg -q ci -m 14
+  $ echo 15 > foo
+  $ hg -q ci -m 15
+  $ hg -q up 14
+  $ echo 16 > foo
+  $ hg -q ci -m 16
+  $ hg push --branch f --new-branch ../f
+  pushing to ../f
+  searching for changes
+  abort: push creates multiple headed new branch 'f'
+  (did you forget to merge? see "hg help push" about pushing forcibly)
+  [255]
+  $ hg push --branch f --new-branch --force ../f
+  pushing to ../f
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 3 changesets with 3 changes to 1 files (+1 heads)
 
 Checking prepush logic does not allow silently pushing
 multiple new heads:


More information about the Mercurial-devel mailing list