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.
--- 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