diff --git a/tests/test-copies-unrelated.t b/tests/test-copies-unrelated.t --- a/tests/test-copies-unrelated.t +++ b/tests/test-copies-unrelated.t @@ -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) diff --git a/tests/test-rename-merge1.t b/tests/test-rename-merge1.t --- a/tests/test-rename-merge1.t +++ b/tests/test-rename-merge1.t @@ -184,52 +184,3 @@ $ hg status M newfile $ cd .. - -Check that file is considered unrelated when deleted and recreated - - $ hg init unrelated - $ cd unrelated - $ echo foo > file - $ hg add file - $ hg commit -m "added file" - $ hg cp file newfile - $ hg commit -m "copy file" - $ hg update 0 - 0 files updated, 0 files merged, 1 files removed, 0 files unresolved - $ hg rm file - $ hg commit -m "deleted file" - created new head - $ echo bar > file - $ hg add file - $ hg ci -m 'recreate file' - $ hg log -G -T '{rev} {desc}\n' - @ 3 recreate file - | - o 2 deleted file - | - | o 1 copy file - |/ - o 0 added file - -BROKEN: this is inconsistent with `hg merge` (below), which doesn't consider -'file' renamed same since it was deleted for a while - $ hg st --copies --rev 3 --rev 1 - M file - A newfile - file - $ hg merge --debug 1 - unmatched files in other: - newfile - all copies found (* = to merge, ! = divergent, % = renamed and deleted): - src: 'file' -> dst: 'newfile' - checking for directory renames - resolving manifests - branchmerge: True, force: False, partial: False - ancestor: 19d7f95df299, local: 4e4a42b1cbdf+, remote: 45b14aae7432 - newfile: remote created -> g - getting newfile - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - (branch merge, don't forget to commit) - $ hg status - M newfile - $ cd ..