tests/test-copies-unrelated.t
changeset 42590 ab416b5d9b91
parent 42589 67bf11597eb8
child 42594 d013099c551b
--- a/tests/test-copies-unrelated.t	Mon Jul 01 14:24:51 2019 -0700
+++ b/tests/test-copies-unrelated.t	Fri Jun 21 16:59:29 2019 -0700
@@ -34,48 +34,336 @@
   $ newrepo
   $ echo x > x
   $ hg ci -Aqm 'add x'
+  $ echo x2 > x
+  $ hg ci -m 'modify x'
+  $ hg co -q 0
   $ hg cp x y
-  $ hg ci -m 'copy x to y'
+  $ hg ci -qm 'copy x to y'
   $ hg rm y
   $ hg ci -m 'remove y'
   $ hg cp -f x y
   $ hg ci -m 'copy x onto y (again)'
   $ hg l
-  @  3 copy x onto y (again)
+  @  4 copy x onto y (again)
+  |  y
+  o  3 remove y
   |  y
-  o  2 remove y
+  o  2 copy x to y
   |  y
-  o  1 copy x to y
-  |  y
+  | o  1 modify x
+  |/   x
   o  0 add x
      x
-  $ hg debugp1copies -r 3
+  $ hg debugp1copies -r 4
   x -> y
-  $ hg debugpathcopies 0 3
+  $ hg debugpathcopies 0 4
   x -> y
+  $ hg graft -r 1
+  grafting 1:* "modify x" (glob)
+  merging y and x to y
+  $ hg co -qC 1
+  $ hg graft -r 4
+  grafting 4:* "copy x onto y (again)" (glob)
+  merging x and y to y
 
-Copy x to y, then remove y, then add back y. With copy metadata in the changeset, this could easily
-end up reporting y as copied from x (if we don't unmark it as a copy when it's removed).
+Copy x to y, then remove y, then add back y. With copy metadata in the
+changeset, this could easily end up reporting y as copied from x (if we don't
+unmark it as a copy when it's removed). Despite x and y not being related, we
+want grafts to propagate across the rename.
   $ newrepo
   $ echo x > x
   $ hg ci -Aqm 'add x'
+  $ echo x2 > x
+  $ hg ci -m 'modify x'
+  $ hg co -q 0
   $ hg mv x y
-  $ hg ci -m 'rename x to y'
+  $ hg ci -qm 'rename x to y'
   $ hg rm y
   $ hg ci -qm 'remove y'
   $ echo x > y
   $ hg ci -Aqm 'add back y'
   $ hg l
-  @  3 add back y
+  @  4 add back y
+  |  y
+  o  3 remove y
   |  y
-  o  2 remove y
-  |  y
-  o  1 rename x to y
+  o  2 rename x to y
+  |  x y
+  | o  1 modify x
+  |/   x
+  o  0 add x
+     x
+  $ hg debugpathcopies 0 4
+BROKEN: This should succeed and merge the changes from x into y
+  $ hg graft -r 1
+  grafting 1:* "modify x" (glob)
+  file 'x' was deleted in local [local] but was modified in other [graft].
+  You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
+  What do you want to do? u
+  abort: unresolved conflicts, can't continue
+  (use 'hg resolve' and 'hg graft --continue')
+  [255]
+
+Add x, remove it, then add it back, then rename x to y. Similar to the case
+above, but here the break in history is before the rename.
+  $ newrepo
+  $ echo x > x
+  $ hg ci -Aqm 'add x'
+  $ echo x2 > x
+  $ hg ci -m 'modify x'
+  $ hg co -q 0
+  $ hg rm x
+  $ hg ci -qm 'remove x'
+  $ echo x > x
+  $ hg ci -Aqm 'add x again'
+  $ hg mv x y
+  $ hg ci -m 'rename x to y'
+  $ hg l
+  @  4 rename x to y
   |  x y
+  o  3 add x again
+  |  x
+  o  2 remove x
+  |  x
+  | o  1 modify x
+  |/   x
+  o  0 add x
+     x
+  $ hg debugpathcopies 0 4
+  x -> y
+  $ hg graft -r 1
+  grafting 1:* "modify x" (glob)
+  merging y and x to y
+  $ hg co -qC 1
+  $ hg graft -r 4
+  grafting 4:* "rename x to y" (glob)
+  merging x and y to y
+
+Add x, modify it, remove it, then add it back, then rename x to y. Similar to
+the case above, but here the re-added file's nodeid is different from before
+the break.
+
+  $ newrepo
+  $ echo x > x
+  $ hg ci -Aqm 'add x'
+  $ echo x2 > x
+  $ hg ci -m 'modify x'
+  $ echo x3 > x
+  $ hg ci -qm 'modify x again'
+  $ hg co -q 1
+  $ hg rm x
+  $ hg ci -qm 'remove x'
+# Same content to avoid conflicts
+  $ hg revert -r 1 x
+  $ hg ci -Aqm 'add x again'
+  $ hg mv x y
+  $ hg ci -m 'rename x to y'
+  $ hg l
+  @  5 rename x to y
+  |  x y
+  o  4 add x again
+  |  x
+  o  3 remove x
+  |  x
+  | o  2 modify x again
+  |/   x
+  o  1 modify x
+  |  x
   o  0 add x
      x
-  $ hg debugp1copies -r 3
-  $ hg debugpathcopies 0 3
+  $ hg debugpathcopies 0 5
+  x -> y (no-filelog !)
+#if no-filelog
+  $ hg graft -r 2
+  grafting 2:* "modify x again" (glob)
+  merging y and x to y
+#else
+BROKEN: This should succeed and merge the changes from x into y
+  $ hg graft -r 2
+  grafting 2:* "modify x again" (glob)
+  file 'x' was deleted in local [local] but was modified in other [graft].
+  You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
+  What do you want to do? u
+  abort: unresolved conflicts, can't continue
+  (use 'hg resolve' and 'hg graft --continue')
+  [255]
+#endif
+  $ hg co -qC 2
+BROKEN: This should succeed and merge the changes from x into y
+  $ hg graft -r 5
+  grafting 5:* "rename x to y"* (glob)
+  file 'x' was deleted in other [graft] but was modified in local [local].
+  You can use (c)hanged version, (d)elete, or leave (u)nresolved.
+  What do you want to do? u
+  abort: unresolved conflicts, can't continue
+  (use 'hg resolve' and 'hg graft --continue')
+  [255]
+
+Add x, remove it, then add it back, rename x to y from the first commit.
+Similar to the case above, but here the break in history is parallel to the
+rename.
+  $ newrepo
+  $ echo x > x
+  $ hg ci -Aqm 'add x'
+  $ hg rm x
+  $ hg ci -qm 'remove x'
+  $ echo x > x
+  $ hg ci -Aqm 'add x again'
+  $ echo x2 > x
+  $ hg ci -m 'modify x'
+  $ hg co -q 0
+  $ hg mv x y
+  $ hg ci -qm 'rename x to y'
+  $ hg l
+  @  4 rename x to y
+  |  x y
+  | o  3 modify x
+  | |  x
+  | o  2 add x again
+  | |  x
+  | o  1 remove x
+  |/   x
+  o  0 add x
+     x
+  $ hg debugpathcopies 2 4
+  x -> y
+  $ hg graft -r 3
+  grafting 3:* "modify x" (glob)
+  merging y and x to y
+  $ hg co -qC 3
+  $ hg graft -r 4
+  grafting 4:* "rename x to y" (glob)
+  merging x and y to y
+
+Add x, remove it, then add it back, rename x to y from the first commit.
+Similar to the case above, but here the re-added file's nodeid is different
+from the base.
+  $ newrepo
+  $ echo x > x
+  $ hg ci -Aqm 'add x'
+  $ hg rm x
+  $ hg ci -qm 'remove x'
+  $ echo x2 > x
+  $ hg ci -Aqm 'add x again with different content'
+  $ hg co -q 0
+  $ hg mv x y
+  $ hg ci -qm 'rename x to y'
+  $ hg l
+  @  3 rename x to y
+  |  x y
+  | o  2 add x again with different content
+  | |  x
+  | o  1 remove x
+  |/   x
+  o  0 add x
+     x
+  $ hg debugpathcopies 2 3
+  x -> y
+BROKEN: This should merge the changes from x into y
+  $ hg graft -r 2
+  grafting 2:* "add x again with different content" (glob)
+  $ hg co -qC 2
+BROKEN: This should succeed and merge the changes from x into y
+  $ hg graft -r 3
+  grafting 3:* "rename x to y" (glob)
+  file 'x' was deleted in other [graft] but was modified in local [local].
+  You can use (c)hanged version, (d)elete, or leave (u)nresolved.
+  What do you want to do? u
+  abort: unresolved conflicts, can't continue
+  (use 'hg resolve' and 'hg graft --continue')
+  [255]
+
+Add x on two branches, then rename x to y on one side. Similar to the case
+above, but here the break in history is via the base commit.
+  $ newrepo
+  $ echo a > a
+  $ hg ci -Aqm 'base'
+  $ echo x > x
+  $ hg ci -Aqm 'add x'
+  $ echo x2 > x
+  $ hg ci -m 'modify x'
+  $ hg co -q 0
+  $ echo x > x
+  $ hg ci -Aqm 'add x again'
+  $ hg mv x y
+  $ hg ci -qm 'rename x to y'
+  $ hg l
+  @  4 rename x to y
+  |  x y
+  o  3 add x again
+  |  x
+  | o  2 modify x
+  | |  x
+  | o  1 add x
+  |/   x
+  o  0 base
+     a
+  $ hg debugpathcopies 1 4
+BROKEN: This should succeed and merge the changes from x into y
+  $ hg graft -r 2
+  grafting 2:* "modify x" (glob)
+  file 'x' was deleted in local [local] but was modified in other [graft].
+  What do you want to do?
+  use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
+  abort: unresolved conflicts, can't continue
+  (use 'hg resolve' and 'hg graft --continue')
+  [255]
+  $ hg co -qC 2
+  $ hg graft -r 4
+  grafting 4:* "rename x to y"* (glob)
+  merging x and y to y
+
+Add x on two branches, with same content but different history, then rename x
+to y on one side. Similar to the case above, here the file's nodeid is
+different between the branches.
+  $ newrepo
+  $ echo a > a
+  $ hg ci -Aqm 'base'
+  $ echo x > x
+  $ hg ci -Aqm 'add x'
+  $ echo x2 > x
+  $ hg ci -m 'modify x'
+  $ hg co -q 0
+  $ touch x
+  $ hg ci -Aqm 'add empty x'
+# Same content to avoid conflicts
+  $ hg revert -r 1 x
+  $ hg ci -m 'modify x to match commit 1'
+  $ hg mv x y
+  $ hg ci -qm 'rename x to y'
+  $ hg l
+  @  5 rename x to y
+  |  x y
+  o  4 modify x to match commit 1
+  |  x
+  o  3 add empty x
+  |  x
+  | o  2 modify x
+  | |  x
+  | o  1 add x
+  |/   x
+  o  0 base
+     a
+  $ hg debugpathcopies 1 5
+BROKEN: This should succeed and merge the changes from x into y
+  $ hg graft -r 2
+  grafting 2:* "modify x" (glob)
+  file 'x' was deleted in local [local] but was modified in other [graft].
+  You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
+  What do you want to do? u
+  abort: unresolved conflicts, can't continue
+  (use 'hg resolve' and 'hg graft --continue')
+  [255]
+  $ hg co -qC 2
+BROKEN: This should succeed and merge the changes from x into y
+  $ hg graft -r 5
+  grafting 5:* "rename x to y"* (glob)
+  file 'x' was deleted in other [graft] but was modified in local [local].
+  You can use (c)hanged version, (d)elete, or leave (u)nresolved.
+  What do you want to do? u
+  abort: unresolved conflicts, can't continue
+  (use 'hg resolve' and 'hg graft --continue')
+  [255]
 
 Copies via null revision (there shouldn't be any)
   $ newrepo
@@ -95,3 +383,5 @@
      x
   $ hg debugpathcopies 1 2
   $ hg debugpathcopies 2 1
+  $ hg graft -r 1
+  grafting 1:* "copy x to y" (glob)