[PATCH 2 of 6 V2] checkheads: take phases into account when computing new heads with obsolete

Pierre-Yves David pierre-yves.david at ens-lyon.org
Sat Aug 25 18:54:02 CDT 2012


# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at logilab.fr>
# Date 1345819965 -7200
# Node ID 796714edb70729e3b0cfea984d9a265f25766459
# Parent  409b6e1e7da93ca12b7b5c791d08cc94e4455ce4
checkheads: take phases into account when computing new heads with obsolete

Checkheads were more permissive than expected. When the remote heads is public we
don't need to search for successors. None will make a public head disappear.

diff --git a/mercurial/discovery.py b/mercurial/discovery.py
--- a/mercurial/discovery.py
+++ b/mercurial/discovery.py
@@ -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):
diff --git a/tests/test-obsolete-checkheads.t b/tests/test-obsolete-checkheads.t
--- a/tests/test-obsolete-checkheads.t
+++ b/tests/test-obsolete-checkheads.t
@@ -71,6 +71,65 @@
   adding file changes
   added 1 changesets with 1 changes to 1 files (+1 heads)
 
+old head is now public (public locally 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 remotly 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 remplacement in not pushed
 ===========================================================
 
@@ -78,6 +137,7 @@
 
   $ rm -fr ../remote
   $ cp -r ../backup1 ../remote
+  $ hg phase --draft --force '(0::) - 0'
   $ hg up -q '.^'
   $ mkcommit other
   created new head


More information about the Mercurial-devel mailing list