# HG changeset patch # User Pierre-Yves David # Date 1563379574 -7200 # Node ID 076b6813a7eaffcbdd72b21f390a9f877e014d74 # Parent f162cafc5000676c0a5c182ec67448556d0f7a9c# Parent ef8907df73fce51c6e4ddc85365139e84ca7b697 branching: merge with stable diff -r f162cafc5000 -r 076b6813a7ea CHANGELOG --- a/CHANGELOG Mon Jul 15 16:53:07 2019 -0700 +++ b/CHANGELOG Wed Jul 17 18:06:14 2019 +0200 @@ -20,6 +20,7 @@ * pick: properly report and cleanup "unfinished state" * prune: don't update wcp if pruned revision are unrelated (issue6137) * evolve: properly prune changeset with no change in case of conflict (issue5967) + * touch: detect resulting divergence in more cases (issue6107) 9.0.0 -- 2019-06-06 ------------------- diff -r f162cafc5000 -r 076b6813a7ea hgext3rd/evolve/cmdrewrite.py --- a/hgext3rd/evolve/cmdrewrite.py Mon Jul 15 16:53:07 2019 -0700 +++ b/hgext3rd/evolve/cmdrewrite.py Wed Jul 17 18:06:14 2019 +0200 @@ -1381,8 +1381,12 @@ p2 = newmapping.get(p2, p2) if not (duplicate or allowdivergence): - # The user hasn't yet decided what to do with the revived - # cset, let's ask + # If reviving this cset creates divergence, let's ask user + # what to do: create divergence or duplicate + + # We need to check two cases that can cause divergence: + # case 1: the rev being revived has a non-obsolete successor (easily + # detected by successorssets) sset = obsutil.successorssets(repo, ctx.node()) nodivergencerisk = (len(sset) == 0 or (len(sset) == 1 @@ -1390,6 +1394,12 @@ and repo[sset[0][0]].rev() == ctx.rev() )) if nodivergencerisk: + # case 2: one of the precursors of the rev being revived has a + # non-obsolete successor (we need divergentsets for this) + from . import evolvecmd + if evolvecmd.divergentsets(repo, ctx): + nodivergencerisk = False + if nodivergencerisk: duplicate = False else: displayer.show(ctx) diff -r f162cafc5000 -r 076b6813a7ea hgext3rd/evolve/evolvecmd.py --- a/hgext3rd/evolve/evolvecmd.py Mon Jul 15 16:53:07 2019 -0700 +++ b/hgext3rd/evolve/evolvecmd.py Wed Jul 17 18:06:14 2019 +0200 @@ -1536,9 +1536,8 @@ If so, evolve rebases that changeset. If not, evolve refuses to guess your intention, and gives a hint about what you might want to do next. - Any time evolve creates a changeset, it updates the working copy to the new - changeset. Using ``--update`` will make evolve perform an update after any - successful evolve operation. + When ``--update`` is used, successful evolve operations update the + working directory to the newly created changesets. Automatic mode only handles common use cases. For example, it avoids taking action in the case of ambiguity, and it ignores orphan changesets that are diff -r f162cafc5000 -r 076b6813a7ea tests/test-touch.t --- a/tests/test-touch.t Mon Jul 15 16:53:07 2019 -0700 +++ b/tests/test-touch.t Wed Jul 17 18:06:14 2019 +0200 @@ -200,3 +200,25 @@ $ hg st --change 17 A a A b + + $ cd .. + +Make sure touch doesn't fail to warn about divergence (issue6107) + + $ hg init touchdiv + $ cd touchdiv + $ echo c > c + $ hg add c + $ hg ci -m "added c" + + $ hg amend -m "modified c" + $ hg prune . -q + + $ hg touch -r "desc('added c')" --hidden + $ hg touch -r "desc('modified c')" --hidden + [1] modified c + reviving this changeset will create divergence unless you make a duplicate. + (a)llow divergence or (d)uplicate the changeset? a + 2 new content-divergent changesets + + $ cd ..