view tests/test-rebase-interruptions.t @ 43252:32187ae9eeb3

copies: simplify the handling of merges Instead of stacking copies for both parent on the head, we move copies outside of the heap into a dedicated dictionary. The two side of merge can we merged sooner, making the algorithm simpler. This simplicity reflect in the heap structure and speed up the execution for copies involving a large amount of merges. Here are timing for perfpathcopies of multiple revision pairs. - filelog: timing using filelog (with the introrev condition dropped) - base: this series base - before: the parent of this changeset - after: this changeset revision: large amount; added files: large amount; rename small amount; c3b14617fbd7 9ba6ab77fd29 filelog: ! wall 3.679613 comb 3.680000 user 3.580000 sys 0.100000 (median of 3) base: ! wall 8.884369 comb 8.880000 user 8.850000 sys 0.030000 (median of 3) before: ! wall 8.443747 comb 8.420000 user 8.410000 sys 0.010000 (median of 3) after: ! wall 4.697917 comb 4.690000 user 4.660000 sys 0.030000 (median of 3) revision: large amount; added files: small amount; rename small amount; c3b14617fbd7 f650a9b140d2 filelog: ! wall 0.003357 comb 0.010000 user 0.010000 sys 0.000000 (median of 781) base: ! wall 12.398524 comb 12.400000 user 12.330000 sys 0.070000 (median of 3) before: ! wall 10.852593 comb 10.850000 user 10.800000 sys 0.050000 (median of 3) after: ! wall 6.750832 comb 6.750000 user 6.640000 sys 0.110000 (median of 3) revision: large amount; added files: large amount; rename large amount; 08ea3258278e d9fa043f30c0 filelog: ! wall 2.754687 comb 2.760000 user 2.650000 sys 0.110000 (median of 4) base: ! wall 1.423166 comb 1.420000 user 1.400000 sys 0.020000 (median of 8) before: ! wall 1.068041 comb 1.060000 user 1.050000 sys 0.010000 (median of 10) after: ! wall 1.045916 comb 1.050000 user 1.040000 sys 0.010000 (median of 10) revision: small amount; added files: large amount; rename large amount; df6f7a526b60 a83dc6a2d56f filelog: ! wall 1.552293 comb 1.550000 user 1.510000 sys 0.040000 (median of 6 base: ! wall 0.022662 comb 0.020000 user 0.020000 sys 0.000000 (median of 128) before: ! wall 0.021111 comb 0.020000 user 0.020000 sys 0.000000 (median of 139) after: ! wall 0.021577 comb 0.020000 user 0.020000 sys 0.000000 (median of 138) revision: small amount; added files: large amount; rename small amount; 4aa4e1f8e19a 169138063d63 filelog: ! wall 1.500983 comb 1.500000 user 1.420000 sys 0.080000 (median of 7) base: ! wall 0.006956 comb 0.010000 user 0.010000 sys 0.000000 (median of 392) before: ! wall 0.004356 comb 0.010000 user 0.010000 sys 0.000000 (median of 675) after: ! wall 0.004329 comb 0.000000 user 0.000000 sys 0.000000 (median of 682) revision: small amount; added files: small amount; rename small amount; 4bc173b045a6 964879152e2e filelog: ! wall 0.011745 comb 0.020000 user 0.020000 sys 0.000000 (median of 250) base: ! wall 0.000156 comb 0.000000 user 0.000000 sys 0.000000 (median of 17180) before: ! wall 0.000100 comb 0.000000 user 0.000000 sys 0.000000 (median of 26912) after: ! wall 0.000105 comb 0.000000 user 0.000000 sys 0.000000 (median of 25689) revision: medium amount; added files: large amount; rename medium amount; c95f1ced15f2 2c68e87c3efe filelog: ! wall 3.228230 comb 3.230000 user 3.110000 sys 0.120000 (median of 4) base: ! wall 0.997640 comb 1.000000 user 0.980000 sys 0.020000 (median of 10) before: ! wall 0.778291 comb 0.780000 user 0.780000 sys 0.000000 (median of 13) after: ! wall 0.706594 comb 0.710000 user 0.710000 sys 0.000000 (median of 15) revision: medium amount; added files: medium amount; rename small amount; d343da0c55a8 d7746d32bf9d filelog: ! wall 1.052501 comb 1.060000 user 1.040000 sys 0.020000 (median of 10 base: ! wall 0.214519 comb 0.220000 user 0.220000 sys 0.000000 (median of 45) before: ! wall 0.160804 comb 0.160000 user 0.160000 sys 0.000000 (median of 62) after: ! wall 0.163736 comb 0.160000 user 0.160000 sys 0.000000 (median of 60) Differential Revision: https://phab.mercurial-scm.org/D7069
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Wed, 02 Oct 2019 13:43:27 -0400
parents 4edd427f34c1
children 9c9cfecd4600
line wrap: on
line source

  $ cat >> $HGRCPATH <<EOF
  > [extensions]
  > rebase=
  > 
  > [phases]
  > publish=False
  > 
  > [alias]
  > tglog = log -G --template "{rev}: {node|short} '{desc}' {branches}\n"
  > tglogp = log -G --template "{rev}: {node|short} {phase} '{desc}' {branches}\n"
  > EOF


  $ hg init a
  $ cd a

  $ echo A > A
  $ hg ci -Am A
  adding A

  $ echo B > B
  $ hg ci -Am B
  adding B

  $ echo C >> A
  $ hg ci -m C

  $ hg up -q -C 0

  $ echo D >> A
  $ hg ci -m D
  created new head

  $ echo E > E
  $ hg ci -Am E
  adding E

  $ cd ..


Changes during an interruption - continue:

  $ hg clone -q -u . a a1
  $ cd a1

  $ hg tglog
  @  4: ae36e8e3dfd7 'E'
  |
  o  3: 46b37eabc604 'D'
  |
  | o  2: 965c486023db 'C'
  | |
  | o  1: 27547f69f254 'B'
  |/
  o  0: 4a2df7238c3b 'A'
  
Rebasing B onto E:

  $ hg rebase -s 1 -d 4
  rebasing 1:27547f69f254 "B"
  rebasing 2:965c486023db "C"
  merging A
  warning: conflicts while merging A! (edit, then use 'hg resolve --mark')
  unresolved conflicts (see hg resolve, then hg rebase --continue)
  [1]

Force a commit on C during the interruption:

  $ hg up -q -C 2 --config 'extensions.rebase=!'

  $ echo 'Extra' > Extra
  $ hg add Extra
  $ hg ci -m 'Extra' --config 'extensions.rebase=!'

Force this commit onto secret phase

  $ hg phase --force --secret 6

  $ hg tglogp
  @  6: deb5d2f93d8b secret 'Extra'
  |
  | o  5: 45396c49d53b draft 'B'
  | |
  | o  4: ae36e8e3dfd7 draft 'E'
  | |
  | o  3: 46b37eabc604 draft 'D'
  | |
  o |  2: 965c486023db draft 'C'
  | |
  o |  1: 27547f69f254 draft 'B'
  |/
  o  0: 4a2df7238c3b draft 'A'
  
Resume the rebasing:

  $ hg rebase --continue
  already rebased 1:27547f69f254 "B" as 45396c49d53b
  rebasing 2:965c486023db "C"
  merging A
  warning: conflicts while merging A! (edit, then use 'hg resolve --mark')
  unresolved conflicts (see hg resolve, then hg rebase --continue)
  [1]

Solve the conflict and go on:

  $ echo 'conflict solved' > A
  $ rm A.orig
  $ hg resolve -m A
  (no more unresolved files)
  continue: hg rebase --continue

  $ hg rebase --continue
  already rebased 1:27547f69f254 "B" as 45396c49d53b
  rebasing 2:965c486023db "C"
  warning: orphaned descendants detected, not stripping 27547f69f254, 965c486023db

  $ hg tglogp
  o  7: d2d25e26288e draft 'C'
  |
  | o  6: deb5d2f93d8b secret 'Extra'
  | |
  o |  5: 45396c49d53b draft 'B'
  | |
  @ |  4: ae36e8e3dfd7 draft 'E'
  | |
  o |  3: 46b37eabc604 draft 'D'
  | |
  | o  2: 965c486023db draft 'C'
  | |
  | o  1: 27547f69f254 draft 'B'
  |/
  o  0: 4a2df7238c3b draft 'A'
  
  $ cd ..


Changes during an interruption - abort:

  $ hg clone -q -u . a a2
  $ cd a2

  $ hg tglog
  @  4: ae36e8e3dfd7 'E'
  |
  o  3: 46b37eabc604 'D'
  |
  | o  2: 965c486023db 'C'
  | |
  | o  1: 27547f69f254 'B'
  |/
  o  0: 4a2df7238c3b 'A'
  
Rebasing B onto E:

  $ hg rebase -s 1 -d 4
  rebasing 1:27547f69f254 "B"
  rebasing 2:965c486023db "C"
  merging A
  warning: conflicts while merging A! (edit, then use 'hg resolve --mark')
  unresolved conflicts (see hg resolve, then hg rebase --continue)
  [1]

Force a commit on B' during the interruption:

  $ hg up -q -C 5 --config 'extensions.rebase=!'

  $ echo 'Extra' > Extra
  $ hg add Extra
  $ hg ci -m 'Extra' --config 'extensions.rebase=!'

  $ hg tglog
  @  6: 402ee3642b59 'Extra'
  |
  o  5: 45396c49d53b 'B'
  |
  o  4: ae36e8e3dfd7 'E'
  |
  o  3: 46b37eabc604 'D'
  |
  | o  2: 965c486023db 'C'
  | |
  | o  1: 27547f69f254 'B'
  |/
  o  0: 4a2df7238c3b 'A'
  
Abort the rebasing:

  $ hg rebase --abort
  warning: new changesets detected on destination branch, can't strip
  rebase aborted

  $ hg tglog
  @  6: 402ee3642b59 'Extra'
  |
  o  5: 45396c49d53b 'B'
  |
  o  4: ae36e8e3dfd7 'E'
  |
  o  3: 46b37eabc604 'D'
  |
  | o  2: 965c486023db 'C'
  | |
  | o  1: 27547f69f254 'B'
  |/
  o  0: 4a2df7238c3b 'A'
  
  $ cd ..

Changes during an interruption - abort (again):

  $ hg clone -q -u . a a3
  $ cd a3

  $ hg tglogp
  @  4: ae36e8e3dfd7 draft 'E'
  |
  o  3: 46b37eabc604 draft 'D'
  |
  | o  2: 965c486023db draft 'C'
  | |
  | o  1: 27547f69f254 draft 'B'
  |/
  o  0: 4a2df7238c3b draft 'A'
  
Rebasing B onto E:

  $ hg rebase -s 1 -d 4
  rebasing 1:27547f69f254 "B"
  rebasing 2:965c486023db "C"
  merging A
  warning: conflicts while merging A! (edit, then use 'hg resolve --mark')
  unresolved conflicts (see hg resolve, then hg rebase --continue)
  [1]

Change phase on B and B'

  $ hg up -q -C 5 --config 'extensions.rebase=!'
  $ hg phase --public 1
  $ hg phase --public 5
  $ hg phase --secret -f 2

  $ hg tglogp
  @  5: 45396c49d53b public 'B'
  |
  o  4: ae36e8e3dfd7 public 'E'
  |
  o  3: 46b37eabc604 public 'D'
  |
  | o  2: 965c486023db secret 'C'
  | |
  | o  1: 27547f69f254 public 'B'
  |/
  o  0: 4a2df7238c3b public 'A'
  
Abort the rebasing:

  $ hg rebase --abort
  warning: can't clean up public changesets 45396c49d53b
  rebase aborted

  $ hg tglogp
  @  5: 45396c49d53b public 'B'
  |
  o  4: ae36e8e3dfd7 public 'E'
  |
  o  3: 46b37eabc604 public 'D'
  |
  | o  2: 965c486023db secret 'C'
  | |
  | o  1: 27547f69f254 public 'B'
  |/
  o  0: 4a2df7238c3b public 'A'
  
Test rebase interrupted by hooks

  $ hg up 2
  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
  $ echo F > F
  $ hg add F
  $ hg ci -m F

  $ cd ..

(precommit version)

  $ cp -R a3 hook-precommit
  $ cd hook-precommit
  $ hg rebase --source 2 --dest 5 --tool internal:other --config 'hooks.precommit=hg status | grep "M A"'
  rebasing 2:965c486023db "C"
  M A
  rebasing 6:a0b2430ebfb8 "F" (tip)
  abort: precommit hook exited with status 1
  [255]
  $ hg tglogp
  @  7: 401ccec5e39f secret 'C'
  |
  | @  6: a0b2430ebfb8 secret 'F'
  | |
  o |  5: 45396c49d53b public 'B'
  | |
  o |  4: ae36e8e3dfd7 public 'E'
  | |
  o |  3: 46b37eabc604 public 'D'
  | |
  | o  2: 965c486023db secret 'C'
  | |
  | o  1: 27547f69f254 public 'B'
  |/
  o  0: 4a2df7238c3b public 'A'
  
  $ hg rebase --continue
  already rebased 2:965c486023db "C" as 401ccec5e39f
  rebasing 6:a0b2430ebfb8 "F"
  saved backup bundle to $TESTTMP/hook-precommit/.hg/strip-backup/965c486023db-aa6250e7-rebase.hg
  $ hg tglogp
  @  6: 6e92a149ac6b secret 'F'
  |
  o  5: 401ccec5e39f secret 'C'
  |
  o  4: 45396c49d53b public 'B'
  |
  o  3: ae36e8e3dfd7 public 'E'
  |
  o  2: 46b37eabc604 public 'D'
  |
  | o  1: 27547f69f254 public 'B'
  |/
  o  0: 4a2df7238c3b public 'A'
  
  $ cd ..

(pretxncommit version)

  $ cp -R a3 hook-pretxncommit
  $ cd hook-pretxncommit
  $ hg rebase --source 2 --dest 5 --tool internal:other \
  >     --config 'hooks.tonative.pretxncommit=True' --config 'hooks.pretxncommit=hg log -r $HG_NODE | grep "summary:     C"'
  rebasing 2:965c486023db "C"
  summary:     C
  rebasing 6:a0b2430ebfb8 "F" (tip)
  transaction abort!
  rollback completed
  abort: pretxncommit hook exited with status 1
  [255]
  $ hg tglogp
  @  7: 401ccec5e39f secret 'C'
  |
  | @  6: a0b2430ebfb8 secret 'F'
  | |
  o |  5: 45396c49d53b public 'B'
  | |
  o |  4: ae36e8e3dfd7 public 'E'
  | |
  o |  3: 46b37eabc604 public 'D'
  | |
  | o  2: 965c486023db secret 'C'
  | |
  | o  1: 27547f69f254 public 'B'
  |/
  o  0: 4a2df7238c3b public 'A'
  
  $ hg rebase --continue
  already rebased 2:965c486023db "C" as 401ccec5e39f
  rebasing 6:a0b2430ebfb8 "F"
  saved backup bundle to $TESTTMP/hook-pretxncommit/.hg/strip-backup/965c486023db-aa6250e7-rebase.hg
  $ hg tglogp
  @  6: 6e92a149ac6b secret 'F'
  |
  o  5: 401ccec5e39f secret 'C'
  |
  o  4: 45396c49d53b public 'B'
  |
  o  3: ae36e8e3dfd7 public 'E'
  |
  o  2: 46b37eabc604 public 'D'
  |
  | o  1: 27547f69f254 public 'B'
  |/
  o  0: 4a2df7238c3b public 'A'
  
  $ cd ..

(pretxnclose version)

  $ cp -R a3 hook-pretxnclose
  $ cd hook-pretxnclose
  $ hg rebase --source 2 --dest 5 --tool internal:other --config 'hooks.pretxnclose=hg log -r tip | grep "summary:     C"'
  rebasing 2:965c486023db "C"
  summary:     C
  rebasing 6:a0b2430ebfb8 "F" (tip)
  transaction abort!
  rollback completed
  abort: pretxnclose hook exited with status 1
  [255]
  $ hg tglogp
  @  7: 401ccec5e39f secret 'C'
  |
  | @  6: a0b2430ebfb8 secret 'F'
  | |
  o |  5: 45396c49d53b public 'B'
  | |
  o |  4: ae36e8e3dfd7 public 'E'
  | |
  o |  3: 46b37eabc604 public 'D'
  | |
  | o  2: 965c486023db secret 'C'
  | |
  | o  1: 27547f69f254 public 'B'
  |/
  o  0: 4a2df7238c3b public 'A'
  
  $ hg rebase --continue
  already rebased 2:965c486023db "C" as 401ccec5e39f
  rebasing 6:a0b2430ebfb8 "F"
  saved backup bundle to $TESTTMP/hook-pretxnclose/.hg/strip-backup/965c486023db-aa6250e7-rebase.hg
  $ hg tglogp
  @  6: 6e92a149ac6b secret 'F'
  |
  o  5: 401ccec5e39f secret 'C'
  |
  o  4: 45396c49d53b public 'B'
  |
  o  3: ae36e8e3dfd7 public 'E'
  |
  o  2: 46b37eabc604 public 'D'
  |
  | o  1: 27547f69f254 public 'B'
  |/
  o  0: 4a2df7238c3b public 'A'
  
  $ cd ..

Make sure merge state is cleaned up after a no-op rebase merge (issue5494)
  $ hg init repo
  $ cd repo
  $ echo a > a
  $ hg commit -qAm base
  $ echo b >> a
  $ hg commit -qm b
  $ hg up '.^'
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  $ echo c >> a
  $ hg commit -qm c
  $ hg rebase -s 1 -d 2 --noninteractive
  rebasing 1:fdaca8533b86 "b"
  merging a
  warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
  unresolved conflicts (see hg resolve, then hg rebase --continue)
  [1]
  $ echo a > a
  $ echo c >> a
  $ hg resolve --mark a
  (no more unresolved files)
  continue: hg rebase --continue
  $ hg rebase --continue
  rebasing 1:fdaca8533b86 "b"
  note: not rebasing 1:fdaca8533b86 "b", its destination already has all its changes
  saved backup bundle to $TESTTMP/repo/.hg/strip-backup/fdaca8533b86-7fd70513-rebase.hg
  $ hg resolve --list
  $ test -d .hg/merge
  [1]
Now try again with --collapse
  $ hg unbundle -q .hg/strip-backup/fdaca8533b86-7fd70513-rebase.hg
  $ hg rebase -s 2 -d 1 --noninteractive --collapse
  rebasing 2:fdaca8533b86 "b" (tip)
  merging a
  warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
  unresolved conflicts (see hg resolve, then hg rebase --continue)
  [1]
  $ echo a > a
  $ echo c >> a
  $ hg resolve --mark a
  (no more unresolved files)
  continue: hg rebase --continue
  $ hg rebase --continue
  rebasing 2:fdaca8533b86 "b" (tip)
  saved backup bundle to $TESTTMP/repo/.hg/strip-backup/fdaca8533b86-7fd70513-rebase.hg
  $ hg resolve --list
  $ test -d .hg/merge
  [1]