tests/test-evolve-orphan-split.t
author Anton Shestakov <av6@dwimlabs.net>
Tue, 24 Dec 2019 23:31:42 +0700
branchmercurial-4.5
changeset 5037 5ea7c807d094
parent 4777 ff452675566c
child 5280 90fbbc29b93a
permissions -rw-r--r--
heptapod-ci: skip test-evolve.t in tests-py2-pure job It seems pure mode on Mercurial 4.5 was broken in case of this test. The error was: Traceback (most recent call last): File "/tmp/hgtests.YoK65c/install/bin/hg", line 41, in <module> dispatch.run() File "/tmp/hgtests.YoK65c/install/lib/python/mercurial/dispatch.py", line 88, in run status = (dispatch(req) or 0) & 255 File "/tmp/hgtests.YoK65c/install/lib/python/mercurial/dispatch.py", line 183, in dispatch ret = _runcatch(req) File "/tmp/hgtests.YoK65c/install/lib/python/mercurial/dispatch.py", line 324, in _runcatch return _callcatch(ui, _runcatchfunc) File "/tmp/hgtests.YoK65c/install/lib/python/mercurial/dispatch.py", line 332, in _callcatch return scmutil.callcatch(ui, func) File "/tmp/hgtests.YoK65c/install/lib/python/mercurial/scmutil.py", line 154, in callcatch return func() File "/tmp/hgtests.YoK65c/install/lib/python/mercurial/dispatch.py", line 314, in _runcatchfunc return _dispatch(req) File "/tmp/hgtests.YoK65c/install/lib/python/mercurial/dispatch.py", line 918, in _dispatch cmdpats, cmdoptions) File "/tmp/hgtests.YoK65c/install/lib/python/mercurial/dispatch.py", line 673, in runcommand ret = _runcommand(ui, options, cmd, d) File "/tmp/hgtests.YoK65c/install/lib/python/mercurial/dispatch.py", line 926, in _runcommand return cmdfunc() File "/tmp/hgtests.YoK65c/install/lib/python/mercurial/dispatch.py", line 915, in <lambda> d = lambda: util.checksignature(func)(ui, *args, **strcmdopt) File "/tmp/hgtests.YoK65c/install/lib/python/mercurial/util.py", line 1195, in check return func(*args, **kwargs) File "/builds/mercurial/evolve/hgext3rd/evolve/evolvecmd.py", line 1603, in evolve return _performevolve(ui, repo, **opts) File "/builds/mercurial/evolve/hgext3rd/evolve/evolvecmd.py", line 1726, in _performevolve targetcat, lastsolved) File "/builds/mercurial/evolve/hgext3rd/evolve/evolvecmd.py", line 1752, in _solveonerev lastsolved=lastsolved, stacktmplt=stacktmplt) File "/builds/mercurial/evolve/hgext3rd/evolve/evolvecmd.py", line 80, in _solveone lastsolved=lastsolved) File "/builds/mercurial/evolve/hgext3rd/evolve/evolvecmd.py", line 183, in _solveunstable keepbranch, b'orphan') File "/builds/mercurial/evolve/hgext3rd/evolve/evolvecmd.py", line 952, in relocate fullnode = unfi.changelog.index.partialmatch(sha1) AttributeError: 'InlinedIndexObject' object has no attribute 'partialmatch'

** Testing resolution of orphans by `hg evolve` where an obsolete changeset has
multiple successors **

  $ cat >> $HGRCPATH <<EOF
  > [ui]
  > interactive = True
  > [alias]
  > glog = log -GT "{rev}:{node|short} {desc}\n ({bookmarks}) {phase}"
  > [extensions]
  > rebase =
  > EOF
  $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH

Repo Setup

  $ hg init repo
  $ cd repo
  $ echo ".*\.orig" > .hgignore
  $ hg add .hgignore
  $ hg ci -m "added hgignore"

An orphan changeset with parent got split
-----------------------------------------

  $ for ch in a b c; do echo foo > $ch; done;

  $ hg add a b
  $ hg ci -m "added a and b"
  $ hg add c
  $ hg ci -m "added c"

  $ hg glog
  @  2:86e1ebf1ca61 added c
  |   () draft
  o  1:d0ddb614efbd added a and b
  |   () draft
  o  0:8fa14d15e168 added hgignore
      () draft

  $ hg split -r 1 <<EOF
  > y
  > y
  > n
  > c
  > EOF
  0 files updated, 0 files merged, 3 files removed, 0 files unresolved
  adding a
  adding b
  diff --git a/a b/a
  new file mode 100644
  examine changes to 'a'? [Ynesfdaq?] y
  
  @@ -0,0 +1,1 @@
  +foo
  record change 1/2 to 'a'? [Ynesfdaq?] y
  
  diff --git a/b b/b
  new file mode 100644
  examine changes to 'b'? [Ynesfdaq?] n
  
  created new head
  continue splitting? [Ycdq?] c
  1 new orphan changesets

  $ hg glog
  @  4:8b179cffc81c added a and b
  |   () draft
  o  3:bd3735d4dab0 added a and b
  |   () draft
  | *  2:86e1ebf1ca61 added c
  | |   () draft
  | x  1:d0ddb614efbd added a and b
  |/    () draft
  o  0:8fa14d15e168 added hgignore
      () draft

  $ hg evolve --update
  move:[2] added c
  atop:[4] added a and b
  working directory is now at af13f0560b31

  $ hg glog
  @  5:af13f0560b31 added c
  |   () draft
  o  4:8b179cffc81c added a and b
  |   () draft
  o  3:bd3735d4dab0 added a and b
  |   () draft
  o  0:8fa14d15e168 added hgignore
      () draft

When the successors does not form a linear chain and are multiple heads
-----------------------------------------------------------------------

  $ hg fold -r .^^::. --exact -m "added a b c"
  3 changesets folded
  0 files updated, 0 files merged, 0 files removed, 0 files unresolved

  $ hg glog
  @  6:f89e4764f2ed added a b c
  |   () draft
  o  0:8fa14d15e168 added hgignore
      () draft
  $ echo foo > d
  $ hg ci -Aqm "added d"

  $ hg glog
  @  7:d48a30875f01 added d
  |   () draft
  o  6:f89e4764f2ed added a b c
  |   () draft
  o  0:8fa14d15e168 added hgignore
      () draft
  $ hg prev
  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
  [6] added a b c
  $ hg split -r . <<EOF
  > y
  > n
  > y
  > y
  > y
  > y
  > c
  > EOF
  0 files updated, 0 files merged, 3 files removed, 0 files unresolved
  adding a
  adding b
  adding c
  diff --git a/a b/a
  new file mode 100644
  examine changes to 'a'? [Ynesfdaq?] y
  
  @@ -0,0 +1,1 @@
  +foo
  record change 1/3 to 'a'? [Ynesfdaq?] n
  
  diff --git a/b b/b
  new file mode 100644
  examine changes to 'b'? [Ynesfdaq?] y
  
  @@ -0,0 +1,1 @@
  +foo
  record change 2/3 to 'b'? [Ynesfdaq?] y
  
  diff --git a/c b/c
  new file mode 100644
  examine changes to 'c'? [Ynesfdaq?] y
  
  @@ -0,0 +1,1 @@
  +foo
  record change 3/3 to 'c'? [Ynesfdaq?] y
  
  created new head
  continue splitting? [Ycdq?] c
  1 new orphan changesets

  $ hg glog
  @  9:c0fbf8aaf6c4 added a b c
  |   () draft
  o  8:f2632392aefe added a b c
  |   () draft
  | *  7:d48a30875f01 added d
  | |   () draft
  | x  6:f89e4764f2ed added a b c
  |/    () draft
  o  0:8fa14d15e168 added hgignore
      () draft

  $ hg rebase -r . -d 8fa14d15e168
  rebasing 9:c0fbf8aaf6c4 "added a b c" (tip)
  $ hg glog
  @  10:7f87764e5b64 added a b c
  |   () draft
  | o  8:f2632392aefe added a b c
  |/    () draft
  | *  7:d48a30875f01 added d
  | |   () draft
  | x  6:f89e4764f2ed added a b c
  |/    () draft
  o  0:8fa14d15e168 added hgignore
      () draft

  $ hg evolve --dry-run <<EOF
  > 1
  > EOF
  ancestor 'd48a30875f01' split over multiple topological branches.
  choose an evolve destination:
  1: [f2632392aefe] added a b c
  2: [7f87764e5b64] added a b c
  q: quit the prompt
  enter the index of the revision you want to select: 1
  move:[7] added d
  atop:[8] added a b c
  hg rebase -r d48a30875f01 -d f2632392aefe

  $ hg evolve --dry-run <<EOF
  > 2
  > EOF
  ancestor 'd48a30875f01' split over multiple topological branches.
  choose an evolve destination:
  1: [f2632392aefe] added a b c
  2: [7f87764e5b64] added a b c
  q: quit the prompt
  enter the index of the revision you want to select: 2
  move:[7] added d
  atop:[10] added a b c
  hg rebase -r d48a30875f01 -d 7f87764e5b64

Testing the interactive prompt with invalid values first
(this should move its own test file when we use it at multiple places)

  $ hg evolve --all <<EOF
  > foo
  > EOF
  ancestor 'd48a30875f01' split over multiple topological branches.
  choose an evolve destination:
  1: [f2632392aefe] added a b c
  2: [7f87764e5b64] added a b c
  q: quit the prompt
  enter the index of the revision you want to select: foo
  invalid value 'foo' entered for index
  could not solve instability, ambiguous destination: parent split across two branches

  $ hg evolve --all <<EOF
  > 4
  > EOF
  ancestor 'd48a30875f01' split over multiple topological branches.
  choose an evolve destination:
  1: [f2632392aefe] added a b c
  2: [7f87764e5b64] added a b c
  q: quit the prompt
  enter the index of the revision you want to select: 4
  invalid value '4' entered for index
  could not solve instability, ambiguous destination: parent split across two branches

  $ hg evolve --all <<EOF
  > -1
  > EOF
  ancestor 'd48a30875f01' split over multiple topological branches.
  choose an evolve destination:
  1: [f2632392aefe] added a b c
  2: [7f87764e5b64] added a b c
  q: quit the prompt
  enter the index of the revision you want to select: -1
  invalid value '-1' entered for index
  could not solve instability, ambiguous destination: parent split across two branches

  $ hg evolve --all <<EOF
  > q
  > EOF
  ancestor 'd48a30875f01' split over multiple topological branches.
  choose an evolve destination:
  1: [f2632392aefe] added a b c
  2: [7f87764e5b64] added a b c
  q: quit the prompt
  enter the index of the revision you want to select: q
  could not solve instability, ambiguous destination: parent split across two branches

Doing the evolve with the interactive prompt

  $ hg evolve --all <<EOF
  > 1
  > EOF
  ancestor 'd48a30875f01' split over multiple topological branches.
  choose an evolve destination:
  1: [f2632392aefe] added a b c
  2: [7f87764e5b64] added a b c
  q: quit the prompt
  enter the index of the revision you want to select: 1
  move:[7] added d
  atop:[8] added a b c