view tests/test-evolve-issue5967.t @ 6224:17ffdea0edbb stable

evolve: look for split successors of the correct ancestor (issue6648) Consider two changesets, 1 and 2. 1 is split into two new changesets and 2 is pruned. If we stand on 2 and call hg evolve, _singlesuccessor() will traverse ancestors of wdp in search of a changeset with successors to update to (it will be 1, which was split). In case of a split, select_split_successor() gets control. The issue is this function didn't traverse ancestors, and instead tried to look up successors of the original changeset (i.e. 2 in our case, which was pruned). We can make select_split_successor() aware of _singlesuccessor() logic by using the changeset that actually has successors without traversing ancestors again. It's done by storing that changeset in MultipleSuccessorsError exception.
author Anton Shestakov <av6@dwimlabs.net>
date Thu, 21 Apr 2022 22:19:27 +0400
parents 61d2f1cf90f0
children 8e4f6354b316
line wrap: on
line source

hg evolve --continue and obsmarkers after conflict resolution with no changes to commit (issue5967)
https://bz.mercurial-scm.org/show_bug.cgi?id=5967

  $ . $TESTDIR/testlib/common.sh

  $ hg init issue5967
  $ cd issue5967
  $ cat > .hg/hgrc << EOF
  > [alias]
  > glog = log -GT "{rev}: {desc}"
  > [extensions]
  > evolve=
  > EOF

  $ echo apple > a
  $ hg ci -qAm 'apple'
  $ echo banana > a
  $ hg ci -m 'banana'

Amending revision 0 in a way that causes conflicts

  $ hg prev
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  [0] apple
  $ echo apricot > a
  $ hg amend -m 'apricot'
  1 new orphan changesets

  $ hg glog
  @  2: apricot
  
  *  1: banana
  |
  x  0: apple
  

Trying to evolve, then manually discarding changes from revision 1

  $ hg evolve
  move:[1] banana
  atop:[2] apricot
  merging a
  warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
  unresolved merge conflicts
  (see 'hg help evolve.interrupted')
  [240]

  $ echo apricot > a
  $ hg resolve --mark a
  (no more unresolved files)
  continue: hg evolve --continue

This will correctly notice that revision 1 can be dropped

  $ hg evolve --continue
  evolving 1:dd9b5dd30cd6 "banana"
  evolution of 1:dd9b5dd30cd6 created no changes to commit
  $ hg glog
  @  2: apricot
  

This is important: 1 should not have a successor (especially not revision 2)

  $ hg debugobsolete
  3ba7db0ce860a189d1fd1fd7675f0e871652ed16 4d6fec23dcc4c3e4ccce8b1d3b79f62ee927c2be 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '9', 'operation': 'amend', 'user': 'test'}
  dd9b5dd30cd6b703d126d55b34165fd6ec5717c9 0 {3ba7db0ce860a189d1fd1fd7675f0e871652ed16} (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '0', 'operation': 'evolve', 'user': 'test'}
  $ hg olog --all
  @  4d6fec23dcc4 (2) apricot
  |    rewritten(description, content) from 3ba7db0ce860 using amend by test (Thu Jan 01 00:00:00 1970 +0000)
  |
  x  3ba7db0ce860 (0) apple
  
  $ hg olog --hidden --all 1
  x  dd9b5dd30cd6 (1) banana
       pruned using evolve by test (Thu Jan 01 00:00:00 1970 +0000)