checkheads: attend to phases when computing new heads with obsolete
authorPierre-Yves David <pierre-yves.david@logilab.fr>
Fri, 24 Aug 2012 16:52:45 +0200
changeset 17547 e6de4761d26f
parent 17546 488e470634d8
child 17548 eaa5fcc5bd20
checkheads: attend to phases when computing new heads with obsolete Checkheads was more permissive than expected. When the remote heads are public we don't need to search for successors. None will make a public head disappear.
mercurial/discovery.py
tests/test-obsolete-checkheads.t
--- a/mercurial/discovery.py	Wed Aug 01 19:35:05 2012 +0200
+++ b/mercurial/discovery.py	Fri Aug 24 16:52:45 2012 +0200
@@ -293,11 +293,14 @@
             # more tricky for unsynced changes.
             newhs = set()
             for nh in candidate_newhs:
-                for suc in obsolete.anysuccessors(repo.obsstore, nh):
-                    if suc != nh and suc in allmissing:
-                        break
+                if repo[nh].phase() <= phases.public:
+                    newhs.add(nh)
                 else:
-                    newhs.add(nh)
+                    for suc in obsolete.anysuccessors(repo.obsstore, nh):
+                        if suc != nh and suc in allmissing:
+                            break
+                    else:
+                        newhs.add(nh)
         else:
             newhs = candidate_newhs
         if len(newhs) > len(oldhs):
--- a/tests/test-obsolete-checkheads.t	Wed Aug 01 19:35:05 2012 +0200
+++ b/tests/test-obsolete-checkheads.t	Fri Aug 24 16:52:45 2012 +0200
@@ -71,13 +71,72 @@
   adding file changes
   added 1 changesets with 1 changes to 1 files (+1 heads)
 
-old head is obsolete but replacement in not pushed
+old head is now public (public local version)
+=============================================
+
+setup
+
+  $ rm -fr ../remote
+  $ cp -r ../backup1 ../remote
+  $ hg -R ../remote phase --public c70b08862e08
+  $ hg pull -v
+  pulling from $TESTTMP/remote
+  searching for changes
+  no changes found
+  $ hg glog --hidden
+  @  71e3228bffe1 (draft) add new
+  |
+  | o  c70b08862e08 (public) add old
+  |/
+  o  b4952fcf48cf (public) add base
+  
+
+Abort: old will still be an head because it's public.
+
+  $ hg push
+  pushing to $TESTTMP/remote
+  searching for changes
+  abort: push creates new remote head 71e3228bffe1!
+  (did you forget to merge? use push -f to force)
+  [255]
+
+old head is now public (public remote version)
+==============================================
+
+TODO: Not implemented yet.
+
+# setup
+#
+#   $ rm -fr ../remote
+#   $ cp -r ../backup1 ../remote
+#   $ hg -R ../remote phase --public c70b08862e08
+#   $ hg phase --draft --force c70b08862e08
+#   $ hg glog --hidden
+#   @  71e3228bffe1 (draft) add new
+#   |
+#   | x  c70b08862e08 (draft) add old
+#   |/
+#   o  b4952fcf48cf (public) add base
+#
+#
+#
+# Abort: old will still be an head because it's public.
+#
+#   $ hg push
+#   pushing to $TESTTMP/remote
+#   searching for changes
+#   abort: push creates new remote head 71e3228bffe1!
+#   (did you forget to merge? use push -f to force)
+#   [255]
+
+old head is obsolete but replacement is not pushed
 ==================================================
 
 setup
 
   $ rm -fr ../remote
   $ cp -r ../backup1 ../remote
+  $ hg phase --draft --force '(0::) - 0'
   $ hg up -q '.^'
   $ mkcommit other
   created new head