[PATCH 3 of 6] checkheads: check successors for new heads in both missing and common

Adrian Buehlmann adrian at cadifra.com
Fri Aug 24 10:34:15 CDT 2012


On 2012-08-24 17:14, pierre-yves.david at logilab.fr wrote:
> # HG changeset patch
> # User Pierre-Yves David <pierre-yves.david at logilab.fr>
> # Date 1343842694 -7200
> # Node ID 595b866243542dd2e27268d8b9d6b4a00a27f66d
> # Parent  80142228fec06522f5f4446eb02e9acfcb56df82
> 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 disapear by the sole fact
                                                         disappear
> of pushing obsolescence.
> 
> This case will also happen when remote got the new version from a repository
> that does not propagate obsolescence markers.
> 
> diff --git a/mercurial/discovery.py b/mercurial/discovery.py
> --- a/mercurial/discovery.py
> +++ b/mercurial/discovery.py
> @@ -262,10 +262,12 @@ def checkheads(repo, remote, outgoing, r
>      # If there are more heads after the push than before, a suitable
>      # error message, depending on unsynced status, is displayed.
>      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
>              # for new branches ?
>              continue
> @@ -291,15 +293,15 @@ def checkheads(repo, remote, outgoing, r
>              #
>              # This two case will be easy to handle for know changeset but much
>              # 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)
>          else:
>              newhs = candidate_newhs
> diff --git a/tests/test-bookmarks-pushpull.t b/tests/test-bookmarks-pushpull.t
> --- a/tests/test-bookmarks-pushpull.t
> +++ b/tests/test-bookmarks-pushpull.t
> @@ -284,11 +284,11 @@ bookmark, not all outgoing changes:
>    0 files updated, 0 files merged, 1 files removed, 0 files unresolved
>    $ hg book add-foo
>    $ 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
>    remote: adding manifests
>    remote: adding file changes
> 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
> @@ -158,5 +158,117 @@ Push should abort n new head
>    pushing to $TESTTMP/remote
>    searching for changes
>    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 add 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 creates 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 obsolete 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 complains about "unsynced remote changes!" either but that's not
                 complain
> +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)


More information about the Mercurial-devel mailing list