# HG changeset patch # User Pierre-Yves David # Date 1345933533 -7200 # Node ID eaa5fcc5bd20b2d634343d39f215c6db6d78f943 # Parent e6de4761d26f2e5b78c50d773c796d2905be4875 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. diff -r e6de4761d26f -r eaa5fcc5bd20 mercurial/discovery.py --- 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) diff -r e6de4761d26f -r eaa5fcc5bd20 tests/test-bookmarks-pushpull.t --- 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 diff -r e6de4761d26f -r eaa5fcc5bd20 tests/test-obsolete-checkheads.t --- 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)