diff tests/test-rewind.t @ 5820:5341d7c30e68 stable

branching: merge into stable in preparation for release # no-check-commit
author Anton Shestakov <av6@dwimlabs.net>
date Thu, 11 Mar 2021 11:49:34 +0800
parents abbc021c6f68
children fd039a7f0c3c
line wrap: on
line diff
--- a/tests/test-rewind.t	Wed Feb 24 14:30:21 2021 -0800
+++ b/tests/test-rewind.t	Thu Mar 11 11:49:34 2021 +0800
@@ -8,6 +8,7 @@
   > publish = false
   > [alias]
   > glf = log -GT "{rev}: {desc} ({files})"
+  > glhf = log -GT "{rev}:{node|short} {desc} ({files})"
   > [extensions]
   > evolve =
   > EOF
@@ -666,16 +667,13 @@
   rewinding 4535d0af405c to 2 changesets: a0316c4c5417 9576e80d6851
   $ hg rewind --to '9576e80d6851' --hidden --dry-run
   rewinding 4535d0af405c to 2 changesets: a0316c4c5417 9576e80d6851
-
-XXX this should also give us 2 changesets
-
   $ hg rewind --to 'a0316c4c5417' --hidden --dry-run
-  rewinding 4535d0af405c to 1 changesets: a0316c4c5417
+  rewinding 4535d0af405c to 2 changesets: a0316c4c5417 9576e80d6851
 
   $ hg rewind --to '9576e80d6851' --exact --hidden --dry-run
-  rewinding 4535d0af405c to 1 changesets: 9576e80d6851
+  rewinding 4535d0af405c to 2 changesets: a0316c4c5417 9576e80d6851
   $ hg rewind --to 'a0316c4c5417' --exact --hidden --dry-run
-  rewinding 4535d0af405c to 1 changesets: a0316c4c5417
+  rewinding 4535d0af405c to 2 changesets: a0316c4c5417 9576e80d6851
 
 actual rewind
 
@@ -869,6 +867,19 @@
      summary:     c_ROOT
   
 
+  $ hg rewind --hidden --to 'allpredecessors(desc("c_B0"))' --dry-run
+  abort: not rewinding, a65fceb2324a is a successor of 7e594302a05d
+  (pick only one of these changesets, possibly with --exact)
+  [255]
+  $ hg rewind --hidden --to 'allpredecessors(desc("c_B0"))' --dry-run --exact
+  abort: not rewinding, a65fceb2324a is a successor of 7e594302a05d
+  (pick only one of these changesets, possibly with --exact)
+  [255]
+  $ hg rewind --hidden --to 'allpredecessors(desc("c_B0"))' --dry-run --as-divergence
+  abort: not rewinding, a65fceb2324a is a successor of 7e594302a05d
+  (pick only one of these changesets, possibly with --exact)
+  [255]
+
 Testing the defaults
 --------------------
 
@@ -1198,3 +1209,436 @@
   $ hg rewind --keep --to 'desc("amended")' --hidden
   abort: uncommitted changes
   [20]
+
+  $ cd ..
+
+Extra cases related to folds
+============================
+
+folding with a changeset created after the rewind target
+--------------------------------------------------------
+
+..      B0 ⇠\
+..      |    ⇠ AB2
+.. A0 ⇠ A1 ⇠/
+
+this simple test case introduces the idea of making rewind consider different
+evolutions of fold components: "parent" evolution of A has more predecessors
+
+  $ hg init extra-fold-case-1
+  $ cd extra-fold-case-1
+
+  $ echo R > R
+  $ hg ci -qAm R
+  $ echo A > A
+  $ hg ci -qAm A0
+  $ hg amend -m A1
+  $ echo B > B
+  $ hg ci -qAm B0
+  $ hg fold -r 'desc("A1")::' -m AB2 --exact -q
+
+  $ hg glhf --hidden
+  @  4:7f9a5314ef94 AB2 (A B)
+  |
+  | x  3:16429ed4b6cb B0 (B)
+  | |
+  | x  2:3748b241cad8 A1 (A)
+  |/
+  | x  1:fa8956746c52 A0 (A)
+  |/
+  o  0:167e04d3d1b2 R (R)
+  
+
+target selection
+
+when rewinding from a fold, rewind to all of its components (at various points
+in their evolution) to not lose work
+
+  $ hg rewind --hidden --to 'desc("A0")' --dry-run
+  rewinding 7f9a5314ef94 to 2 changesets: fa8956746c52 16429ed4b6cb
+  $ hg rewind --hidden --to 'desc("B0")' --dry-run
+  rewinding 7f9a5314ef94 to 2 changesets: 3748b241cad8 16429ed4b6cb
+  $ hg rewind --from 'desc("AB2")' --dry-run
+  rewinding 7f9a5314ef94 to 2 changesets: 3748b241cad8 16429ed4b6cb
+
+  $ hg rewind --hidden --to 'allpredecessors(desc("AB2"))' --dry-run
+  abort: not rewinding, 3748b241cad8 is a successor of fa8956746c52
+  (pick only one of these changesets, possibly with --exact)
+  [255]
+
+  $ cd ..
+
+folding with a changeset we rebased onto
+----------------------------------------
+
+.. A0 ⇠ A1 ⇠\
+..      |    ⇠ AB2
+..      B0 ⇠/
+
+similar to the previous case, but this time evolution of A has more
+predecessors and at some point starts to be based on B
+
+  $ hg init extra-fold-case-2
+  $ cd extra-fold-case-2
+
+  $ echo R > R
+  $ hg ci -qAm R
+  $ echo A > A
+  $ hg ci -qAm A0
+  $ hg up 'desc("R")' -q
+  $ echo B > B
+  $ hg ci -qAm B0
+  $ echo A > A
+  $ hg ci -qAm A1
+  $ hg prune -r 'desc("A0")' -s 'desc("A1")'
+  1 changesets pruned
+
+  $ hg fold -r 'desc("B0")::' -m AB2 --exact -q
+
+  $ hg glhf --hidden
+  @  4:1988e9fe9517 AB2 (A B)
+  |
+  | x  3:7175ff74409b A1 (A)
+  | |
+  | x  2:d6ed1d624918 B0 (B)
+  |/
+  | x  1:fa8956746c52 A0 (A)
+  |/
+  o  0:167e04d3d1b2 R (R)
+  
+
+target selection
+
+when rewinding from a fold, rewind to all of its components (at various points
+in their evolution) to not lose work
+
+  $ hg rewind --hidden --to 'desc("A0")' --dry-run
+  rewinding 1988e9fe9517 to 2 changesets: fa8956746c52 d6ed1d624918
+  $ hg rewind --hidden --to 'desc("B0")' --dry-run
+  rewinding 1988e9fe9517 to 2 changesets: d6ed1d624918 7175ff74409b
+  $ hg rewind --from 'desc("AB2")' --dry-run
+  rewinding 1988e9fe9517 to 2 changesets: d6ed1d624918 7175ff74409b
+
+  $ cd ..
+
+folding with a changeset that rebased on us
+-------------------------------------------
+
+.. B0 ⇠⇠⇠⇠ B1 ⇠\
+.. |       |    ⇠ AB2
+.. |  A0 ⇠ A1 ⇠/
+
+now evolutions of A and B have the same amount of changesets, but at point 0
+they aren't yet related
+
+  $ hg init extra-fold-case-3
+  $ cd extra-fold-case-3
+
+  $ echo R > R
+  $ hg ci -qAm R
+  $ echo A > A
+  $ hg ci -qAm A0
+  $ hg amend -m A1
+  $ hg up 'desc("R")' -q
+  $ echo B > B
+  $ hg ci -qAm B0
+  $ hg up 'desc("A1")' -q
+  $ echo B > B
+  $ hg ci -qAm B1
+  $ hg prune -r 'desc("B0")' -s 'desc("B1")'
+  1 changesets pruned
+
+  $ hg fold -r 'desc("A1")::' -m AB2 --exact -q
+
+  $ hg glhf --hidden
+  @  5:7f9a5314ef94 AB2 (A B)
+  |
+  | x  4:fe7a7d317e16 B1 (B)
+  | |
+  +---x  3:d6ed1d624918 B0 (B)
+  | |
+  | x  2:3748b241cad8 A1 (A)
+  |/
+  | x  1:fa8956746c52 A0 (A)
+  |/
+  o  0:167e04d3d1b2 R (R)
+  
+
+target selection
+
+  $ hg rewind --hidden --to 'desc("A0")' --dry-run
+  rewinding 7f9a5314ef94 to 2 changesets: fa8956746c52 fe7a7d317e16
+  $ hg rewind --hidden --to 'desc("B0")' --dry-run
+  rewinding 7f9a5314ef94 to 2 changesets: 3748b241cad8 d6ed1d624918
+  $ hg rewind --hidden --to 'desc("A1")' --dry-run
+  rewinding 7f9a5314ef94 to 2 changesets: 3748b241cad8 fe7a7d317e16
+  $ hg rewind --hidden --to 'desc("B1")' --dry-run
+  rewinding 7f9a5314ef94 to 2 changesets: 3748b241cad8 fe7a7d317e16
+  $ hg rewind --from 'desc("AB2")' --dry-run
+  rewinding 7f9a5314ef94 to 2 changesets: 3748b241cad8 fe7a7d317e16
+
+actual rewind
+
+  $ hg rewind --hidden --to 'desc("A0")'
+  1 new orphan changesets
+  rewound to 2 changesets
+  (1 changesets obsoleted)
+  working directory is now at e492d2f9be46
+
+after rewind to A0:
+- A0' and B1' are successors to AB2 (split using rewind)
+- A0' is a successor of A0 (operation: rewind)
+- A0' is a child of R (just like A0)
+- B1' is a successor of B1 (operation: rewind)
+- B1' is a child of A1 (just like B1), and therefore an orphan
+
+  $ hg obslog -a
+  o    54b340ce1d87 (6) A0
+  |\     split(description, meta, parent, content) from 7f9a5314ef94 using rewind by test (Thu Jan 01 00:00:06 1970 +0000)
+  | |    meta-changed(meta) from fa8956746c52 using rewind by test (Thu Jan 01 00:00:06 1970 +0000)
+  | |
+  +---@  e492d2f9be46 (7) B1
+  | | |    split(description, meta, parent, content) from 7f9a5314ef94 using rewind by test (Thu Jan 01 00:00:06 1970 +0000)
+  | | |    meta-changed(meta) from fe7a7d317e16 using rewind by test (Thu Jan 01 00:00:06 1970 +0000)
+  | | |
+  x---+  7f9a5314ef94 (5) AB2
+  | | |    folded(description, parent, content) from 3748b241cad8, fe7a7d317e16 using fold by test (Thu Jan 01 00:00:06 1970 +0000)
+  | | |
+  x | |  3748b241cad8 (2) A1
+  |/ /     reworded(description) from fa8956746c52 using amend by test (Thu Jan 01 00:00:06 1970 +0000)
+  | |
+  | x  fe7a7d317e16 (4) B1
+  | |    rewritten(description, parent) from d6ed1d624918 using prune by test (Thu Jan 01 00:00:06 1970 +0000)
+  | |
+  | x  d6ed1d624918 (3) B0
+  |
+  x  fa8956746c52 (1) A0
+  
+  $ hg glhf
+  @  7:e492d2f9be46 B1 (B)
+  |
+  | o  6:54b340ce1d87 A0 (A)
+  | |
+  x |  2:3748b241cad8 A1 (A)
+  |/
+  o  0:167e04d3d1b2 R (R)
+  
+
+  $ hg debugobsolete --exclusive -r 'first(head())'
+  7f9a5314ef94f5856ee90661268194cc5ce9b332 54b340ce1d87f3593fd9de2a742e7b444e5136ed e492d2f9be46b73c0cfa51709e92db864b8f3ed9 0 (Thu Jan 01 00:00:06 1970 +0000) {'ef1': '15', 'operation': 'rewind', 'user': 'test'}
+  fa8956746c5294ce3351309133b450c5930f30f5 54b340ce1d87f3593fd9de2a742e7b444e5136ed 4 (Thu Jan 01 00:00:06 1970 +0000) {'ef1': '2', 'operation': 'rewind', 'user': 'test'}
+  $ hg debugobsolete --exclusive -r 'last(head())'
+  7f9a5314ef94f5856ee90661268194cc5ce9b332 54b340ce1d87f3593fd9de2a742e7b444e5136ed e492d2f9be46b73c0cfa51709e92db864b8f3ed9 0 (Thu Jan 01 00:00:06 1970 +0000) {'ef1': '15', 'operation': 'rewind', 'user': 'test'}
+  fe7a7d317e168a15e8aa43131b54d3256443d728 e492d2f9be46b73c0cfa51709e92db864b8f3ed9 4 (Thu Jan 01 00:00:06 1970 +0000) {'ef1': '2', 'operation': 'rewind', 'user': 'test'}
+
+  $ cd ..
+
+simple fold with a missing part
+-------------------------------
+
+.. B0 ⇠ (B1) ⇠\
+.. |     |     ⇠ AB2
+.. A0 ⇠  A1  ⇠/
+
+a stack was rewritten, but then a part of it became unknown locally
+
+  $ hg init extra-fold-case-4
+  $ cd extra-fold-case-4
+
+  $ echo R > R
+  $ hg ci -qAm R
+  $ echo A > A
+  $ hg ci -qAm A0
+  $ echo B > B
+  $ hg ci -qAm B0
+  $ hg up 'desc("R")' -q
+  $ echo A > A
+  $ hg ci -qAm A1
+  $ echo B > B
+  $ hg ci -qAm B1
+  $ hg prune -r 'desc("A0")+desc("B0")' -s 'desc("A1")+desc("B1")' --biject
+  2 changesets pruned
+
+  $ hg fold -r 'desc("A1") + desc("B1")' -m AB2 --exact -q
+
+  $ hg glhf --hidden
+  @  5:1988e9fe9517 AB2 (A B)
+  |
+  | x  4:25210d726f52 B1 (B)
+  | |
+  | x  3:9c76368ab336 A1 (A)
+  |/
+  | x  2:a07c12c45197 B0 (B)
+  | |
+  | x  1:fa8956746c52 A0 (A)
+  |/
+  o  0:167e04d3d1b2 R (R)
+  
+
+target selection
+
+  $ hg rewind --hidden --to 'desc("A0")' --dry-run
+  rewinding 1988e9fe9517 to 2 changesets: fa8956746c52 25210d726f52
+  $ hg rewind --hidden --to 'desc("A1")' --dry-run
+  rewinding 1988e9fe9517 to 2 changesets: 9c76368ab336 25210d726f52
+  $ hg rewind --hidden --to 'desc("B1")' --dry-run
+  rewinding 1988e9fe9517 to 2 changesets: 9c76368ab336 25210d726f52
+
+because B0 is a child of A0, we use A0 instead of A1 unless --exact is given
+
+XXX the semantic of --exact might need clarification here,
+XXX for example, shouln't --exact make sure we only rewind to the `--to` target ?
+
+  $ hg rewind --hidden --to 'desc("B0")' --dry-run
+  rewinding 1988e9fe9517 to 2 changesets: fa8956746c52 a07c12c45197
+  $ hg rewind --hidden --to 'desc("B0")' --exact --dry-run
+  rewinding 1988e9fe9517 to 2 changesets: a07c12c45197 9c76368ab336
+
+stripping one of the fold parts
+
+  $ hg strip --config extensions.strip= -r 'desc("B1")' --hidden -q
+
+  $ hg glhf --hidden
+  @  4:1988e9fe9517 AB2 (A B)
+  |
+  | x  3:9c76368ab336 A1 (A)
+  |/
+  | x  2:a07c12c45197 B0 (B)
+  | |
+  | x  1:fa8956746c52 A0 (A)
+  |/
+  o  0:167e04d3d1b2 R (R)
+  
+
+target selection
+
+the obvious challenge here is to somehow work around the missing fold
+component, but we can't do much because it is one of the latest predecessors of
+AB2 fold
+
+in future we might have a way to allow rewind to skip changesets unknown
+locally and still proceed (and lose the least amount of work possible)
+
+  $ hg rewind --hidden --to 'desc("A0")+desc("B0")' --exact --dry-run
+  rewinding 1988e9fe9517 to 2 changesets: fa8956746c52 a07c12c45197
+  $ hg rewind --hidden --to 'desc("A0")' --dry-run
+  abort: not rewinding, some predecessors are unknown locally: 25210d726f52
+  (try selecting all changesets to rewind to manually, possibly with --exact)
+  [255]
+  $ hg rewind --hidden --to 'desc("A1")' --dry-run
+  abort: not rewinding, some predecessors are unknown locally: 25210d726f52
+  (try selecting all changesets to rewind to manually, possibly with --exact)
+  [255]
+
+XXX the semantic of --exact might need clarification here,
+XXX for example, shouln't --exact make sure we only rewind to the `--to` target ?
+
+  $ hg rewind --hidden --to 'desc("A1")' --exact --dry-run
+  abort: not rewinding, some predecessors are unknown locally: 25210d726f52
+  (try selecting all changesets to rewind to manually, possibly with --exact)
+  [255]
+  $ hg rewind --from 'desc("AB2")' --dry-run
+  abort: not rewinding, some predecessors are unknown locally: 25210d726f52
+  (try selecting all changesets to rewind to manually, possibly with --exact)
+  [255]
+  $ hg rewind --from 'desc("AB2")' --exact --dry-run
+  abort: not rewinding, some predecessors are unknown locally: 25210d726f52
+  (try selecting all changesets to rewind to manually, possibly with --exact)
+  [255]
+
+  $ cd ..
+
+split and then fold with a missing part
+---------------------------------------
+
+..      /⇠ (C1) ⇠\
+.. BC0 ⇠    |     \
+..  |   \⇠  B1     ⇠ AC2
+..  A0 ⇠⇠⇠⇠⇠⇠⇠⇠⇠⇠⇠/
+
+here we have a case when walking successors and then predecessors of target
+revisions just once might not be enough, because it's a more complex DAG with a
+changeset missing from local repo
+
+  $ hg init extra-fold-case-5
+  $ cd extra-fold-case-5
+
+  $ echo R > R
+  $ hg ci -qAm R
+  $ echo A > A
+  $ hg ci -qAm A0
+  $ echo B > B
+  $ echo C > C
+  $ hg ci -qAm BC0
+  $ hg up 'desc("A0")' -q
+  $ echo B > B
+  $ hg ci -qAm B1
+  $ echo C > C
+  $ hg ci -qAm C1
+
+  $ hg prune -r 'desc("BC0")' -s 'desc("B1")+desc("C1")' --split
+  1 changesets pruned
+
+  $ hg up 'desc("R")' -q
+  $ echo A > A
+  $ echo C > C
+  $ hg ci -qAm AC2
+
+  $ hg prune -r 'desc("A0")+desc("C1")' -s 'desc("AC2")' --fold
+  2 changesets pruned
+  1 new orphan changesets
+
+  $ hg glhf --hidden
+  @  5:9ccaac2e5fbb AC2 (A C)
+  |
+  | x  4:2e4ab803d8ae C1 (C)
+  | |
+  | *  3:44774eafdc1c B1 (B)
+  | |
+  | | x  2:883d75400657 BC0 (B C)
+  | |/
+  | x  1:fa8956746c52 A0 (A)
+  |/
+  o  0:167e04d3d1b2 R (R)
+  
+
+target selection
+
+  $ hg rewind --hidden --to 'desc("A0")' --dry-run
+  rewinding 9ccaac2e5fbb to 2 changesets: fa8956746c52 2e4ab803d8ae
+  $ hg rewind --hidden --to 'desc("BC0")' --dry-run
+  rewinding 44774eafdc1c to 1 changesets: 883d75400657
+  rewinding 9ccaac2e5fbb to 2 changesets: fa8956746c52 883d75400657
+  $ hg rewind --from 'desc("AC2")' --dry-run
+  rewinding 9ccaac2e5fbb to 2 changesets: fa8956746c52 2e4ab803d8ae
+
+stripping a component of AC2 fold
+
+  $ hg strip --config extensions.strip= --hidden -r 'desc("C1")' -q
+  warning: ignoring unknown working parent 9ccaac2e5fbb!
+
+target selection
+
+at the moment, there's not much that we can do here because of missing C1
+
+in future we might have a way to allow rewind to skip changesets unknown
+locally and still proceed (and lose the least amount of work possible)
+
+XXX the semantic of --exact might need clarification here,
+XXX for example, shouln't --exact make sure we only rewind to the `--to` target ?
+
+  $ hg rewind --hidden --to 'desc("A0")' --dry-run
+  abort: not rewinding, some predecessors are unknown locally: 2e4ab803d8ae
+  (try selecting all changesets to rewind to manually, possibly with --exact)
+  [255]
+  $ hg rewind --hidden --to 'desc("BC0")' --dry-run
+  rewinding 44774eafdc1c to 1 changesets: 883d75400657
+  rewinding 9ccaac2e5fbb to 2 changesets: fa8956746c52 883d75400657
+  $ hg rewind --from 'desc("AC2")' --dry-run
+  abort: not rewinding, some predecessors are unknown locally: 2e4ab803d8ae
+  (try selecting all changesets to rewind to manually, possibly with --exact)
+  [255]
+  $ hg rewind --from 'desc("AC2")' --exact --dry-run
+  abort: not rewinding, some predecessors are unknown locally: 2e4ab803d8ae
+  (try selecting all changesets to rewind to manually, possibly with --exact)
+  [255]