checkheads: check successors for new heads in both missing and common
authorPierre-Yves David <pierre-yves.david@logilab.fr>
Sun, 26 Aug 2012 00:25:33 +0200
changeset 17548 eaa5fcc5bd20
parent 17547 e6de4761d26f
child 17549 be0fcbb1c92f
checkheads: check successors for new heads in both missing and common A relevant obsolete marker may have been added -after- we previously exchanged the changeset. We have to search for remote heads that disappear by the sole fact of pushing obsolescence. This case will also happen when remote got the new version from a repository that does not propagate obsolescence markers.
mercurial/discovery.py
tests/test-bookmarks-pushpull.t
tests/test-obsolete-checkheads.t
--- a/mercurial/discovery.py	Fri Aug 24 16:52:45 2012 +0200
+++ b/mercurial/discovery.py	Sun Aug 26 00:25:33 2012 +0200
@@ -264,6 +264,8 @@
     error = None
     unsynced = False
     allmissing = set(outgoing.missing)
+    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
@@ -293,11 +295,11 @@
             # more tricky for unsynced changes.
             newhs = set()
             for nh in candidate_newhs:
-                if repo[nh].phase() <= phases.public:
+                if nh in repo and repo[nh].phase() <= phases.public:
                     newhs.add(nh)
                 else:
                     for suc in obsolete.anysuccessors(repo.obsstore, nh):
-                        if suc != nh and suc in allmissing:
+                        if suc != nh and suc in allfuturecommon:
                             break
                     else:
                         newhs.add(nh)
--- a/tests/test-bookmarks-pushpull.t	Fri Aug 24 16:52:45 2012 +0200
+++ b/tests/test-bookmarks-pushpull.t	Sun Aug 26 00:25:33 2012 +0200
@@ -286,7 +286,7 @@
   $ hg book -r tip add-bar
 Note: this push *must* push only a single changeset, as that's the point
 of this test.
-  $ hg push -B add-foo
+  $ hg push -B add-foo --traceback
   pushing to http://localhost:$HGPORT/
   searching for changes
   remote: adding changesets
--- a/tests/test-obsolete-checkheads.t	Fri Aug 24 16:52:45 2012 +0200
+++ b/tests/test-obsolete-checkheads.t	Sun Aug 26 00:25:33 2012 +0200
@@ -159,3 +159,115 @@
   abort: push creates new remote head d7d41ccbd4de!
   (did you forget to merge? use push -f to force)
   [255]
+
+
+
+Both precursors and successors are already know remotely. Descendant adds heads
+===============================================================================
+
+setup. (The obsolete marker is known locally only
+
+  $ cd ..
+  $ rm -rf local
+  $ hg clone remote local
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd local
+  $ mkcommit old
+  old already tracked!
+  nothing changed
+  [1]
+  $ hg up -q '.^'
+  $ mkcommit new
+  created new head
+  $ hg push -f
+  pushing to $TESTTMP/remote
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  $ mkcommit desc1
+  $ hg up -q '.^'
+  $ mkcommit desc2
+  created new head
+  $ hg debugobsolete `getid old` `getid new`
+  $ hg glog --hidden
+  @  5fe37041cc2b (draft) add desc2
+  |
+  | o  a3ef1d111c5f (draft) add desc1
+  |/
+  o  71e3228bffe1 (draft) add new
+  |
+  | x  c70b08862e08 (draft) add old
+  |/
+  o  b4952fcf48cf (public) add base
+  
+  $ hg glog --hidden -R ../remote
+  o  71e3228bffe1 (draft) add new
+  |
+  | o  c70b08862e08 (draft) add old
+  |/
+  @  b4952fcf48cf (public) add base
+  
+  $ cp -r ../remote ../backup2
+
+Push should not warn about adding new heads. We create one, but we'll delete
+one anyway.
+
+  $ hg push
+  pushing to $TESTTMP/remote
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 2 changesets with 2 changes to 2 files (+1 heads)
+
+
+Remote head is unknown but obsoleted by a local changeset
+=========================================================
+
+setup
+
+  $ rm -fr ../remote
+  $ cp -r ../backup1 ../remote
+  $ cd ..
+  $ rm -rf local
+  $ hg clone remote local -r 0
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  updating to branch default
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd local
+  $ mkcommit new
+  $ hg -R ../remote id --debug -r tip
+  c70b08862e0838ea6d7c59c85da2f1ed6c8d67da tip
+  $ hg  id --debug -r tip
+  71e3228bffe1886550777233d6c97bb5a6b2a650 tip
+  $ hg debugobsolete c70b08862e0838ea6d7c59c85da2f1ed6c8d67da 71e3228bffe1886550777233d6c97bb5a6b2a650
+  $ hg glog --hidden
+  @  71e3228bffe1 (draft) add new
+  |
+  o  b4952fcf48cf (public) add base
+  
+  $ hg glog --hidden -R ../remote
+  o  c70b08862e08 (draft) add old
+  |
+  @  b4952fcf48cf (public) add base
+  
+
+Push should not complain about new heads.
+
+It should not complain about "unsynced remote changes!" either but that's not
+handled yet.
+
+  $ hg push --traceback
+  pushing to $TESTTMP/remote
+  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)