D6598: tests: split out tests for unrelated copy source/target into separate file
martinvonz (Martin von Zweigbergk)
phabricator at mercurial-scm.org
Thu Jul 4 15:00:25 UTC 2019
martinvonz created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.
REVISION SUMMARY
I've realized only recently how many cases there are where a file is
treated differently if it's considered "related" to another file (not
deleted and re-added). I'll add more tests for some of these cases
soon.
REPOSITORY
rHG Mercurial
REVISION DETAIL
https://phab.mercurial-scm.org/D6598
AFFECTED FILES
tests/test-copies-unrelated.t
tests/test-copies.t
CHANGE DETAILS
diff --git a/tests/test-copies.t b/tests/test-copies.t
--- a/tests/test-copies.t
+++ b/tests/test-copies.t
@@ -96,30 +96,6 @@
Incorrectly doesn't show the rename
$ hg debugpathcopies 0 1
-Copy a file, then delete destination, then copy again. This does not create a new filelog entry.
- $ newrepo
- $ echo x > x
- $ hg ci -Aqm 'add x'
- $ hg cp x y
- $ hg ci -m '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)
- | y
- o 2 remove y
- | y
- o 1 copy x to y
- | y
- o 0 add x
- x
- $ hg debugp1copies -r 3
- x -> y
- $ hg debugpathcopies 0 3
- x -> y
-
Rename file in a loop: x->y->z->x
$ newrepo
$ echo x > x
@@ -144,29 +120,6 @@
x
$ hg debugpathcopies 0 3
-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).
- $ newrepo
- $ echo x > x
- $ hg ci -Aqm 'add x'
- $ hg mv x y
- $ hg ci -m '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
- | y
- o 2 remove y
- | y
- o 1 rename x to y
- | x y
- o 0 add x
- x
- $ hg debugp1copies -r 3
- $ hg debugpathcopies 0 3
-
Copy x to z, then remove z, then copy x2 (same content as x) to z. With copy metadata in the
changeset, the two copies here will have the same filelog entry, so ctx['z'].introrev() might point
to the first commit that added the file. We should still report the copy as being from x2.
@@ -234,25 +187,6 @@
x
$ hg debugpathcopies 1 2
-Copies via null revision (there shouldn't be any)
- $ newrepo
- $ echo x > x
- $ hg ci -Aqm 'add x'
- $ hg cp x y
- $ hg ci -m 'copy x to y'
- $ hg co -q null
- $ echo x > x
- $ hg ci -Aqm 'add x (again)'
- $ hg l
- @ 2 add x (again)
- x
- o 1 copy x to y
- | y
- o 0 add x
- x
- $ hg debugpathcopies 1 2
- $ hg debugpathcopies 2 1
-
Merge rename from other branch
$ newrepo
$ echo x > x
diff --git a/tests/test-copies.t b/tests/test-copies-unrelated.t
copy from tests/test-copies.t
copy to tests/test-copies-unrelated.t
--- a/tests/test-copies.t
+++ b/tests/test-copies-unrelated.t
@@ -30,72 +30,6 @@
> cd repo-$REPONUM
> }
-Simple rename case
- $ newrepo
- $ echo x > x
- $ hg ci -Aqm 'add x'
- $ hg mv x y
- $ hg debugp1copies
- x -> y
- $ hg debugp2copies
- $ hg ci -m 'rename x to y'
- $ hg l
- @ 1 rename x to y
- | x y
- o 0 add x
- x
- $ hg debugp1copies -r 1
- x -> y
- $ hg debugpathcopies 0 1
- x -> y
- $ hg debugpathcopies 1 0
- y -> x
-Test filtering copies by path. We do filtering by destination.
- $ hg debugpathcopies 0 1 x
- $ hg debugpathcopies 1 0 x
- y -> x
- $ hg debugpathcopies 0 1 y
- x -> y
- $ hg debugpathcopies 1 0 y
-
-Copy a file onto another file
- $ newrepo
- $ echo x > x
- $ echo y > y
- $ hg ci -Aqm 'add x and y'
- $ hg cp -f x y
- $ hg debugp1copies
- x -> y
- $ hg debugp2copies
- $ hg ci -m 'copy x onto y'
- $ hg l
- @ 1 copy x onto y
- | y
- o 0 add x and y
- x y
- $ hg debugp1copies -r 1
- x -> y
-Incorrectly doesn't show the rename
- $ hg debugpathcopies 0 1
-
-Copy a file onto another file with same content. If metadata is stored in changeset, this does not
-produce a new filelog entry. The changeset's "files" entry should still list the file.
- $ newrepo
- $ echo x > x
- $ echo x > x2
- $ hg ci -Aqm 'add x and x2 with same content'
- $ hg cp -f x x2
- $ hg ci -m 'copy x onto x2'
- $ hg l
- @ 1 copy x onto x2
- | x2
- o 0 add x and x2 with same content
- x x2
- $ hg debugp1copies -r 1
- x -> x2
-Incorrectly doesn't show the rename
- $ hg debugpathcopies 0 1
-
Copy a file, then delete destination, then copy again. This does not create a new filelog entry.
$ newrepo
$ echo x > x
@@ -120,30 +54,6 @@
$ hg debugpathcopies 0 3
x -> y
-Rename file in a loop: x->y->z->x
- $ newrepo
- $ echo x > x
- $ hg ci -Aqm 'add x'
- $ hg mv x y
- $ hg debugp1copies
- x -> y
- $ hg debugp2copies
- $ hg ci -m 'rename x to y'
- $ hg mv y z
- $ hg ci -m 'rename y to z'
- $ hg mv z x
- $ hg ci -m 'rename z to x'
- $ hg l
- @ 3 rename z to x
- | x z
- o 2 rename y to z
- | y z
- o 1 rename x to y
- | x y
- o 0 add x
- x
- $ hg debugpathcopies 0 3
-
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).
$ newrepo
@@ -167,73 +77,6 @@
$ hg debugp1copies -r 3
$ hg debugpathcopies 0 3
-Copy x to z, then remove z, then copy x2 (same content as x) to z. With copy metadata in the
-changeset, the two copies here will have the same filelog entry, so ctx['z'].introrev() might point
-to the first commit that added the file. We should still report the copy as being from x2.
- $ newrepo
- $ echo x > x
- $ echo x > x2
- $ hg ci -Aqm 'add x and x2 with same content'
- $ hg cp x z
- $ hg ci -qm 'copy x to z'
- $ hg rm z
- $ hg ci -m 'remove z'
- $ hg cp x2 z
- $ hg ci -m 'copy x2 to z'
- $ hg l
- @ 3 copy x2 to z
- | z
- o 2 remove z
- | z
- o 1 copy x to z
- | z
- o 0 add x and x2 with same content
- x x2
- $ hg debugp1copies -r 3
- x2 -> z
- $ hg debugpathcopies 0 3
- x2 -> z
-
-Create x and y, then rename them both to the same name, but on different sides of a fork
- $ newrepo
- $ echo x > x
- $ echo y > y
- $ hg ci -Aqm 'add x and y'
- $ hg mv x z
- $ hg ci -qm 'rename x to z'
- $ hg co -q 0
- $ hg mv y z
- $ hg ci -qm 'rename y to z'
- $ hg l
- @ 2 rename y to z
- | y z
- | o 1 rename x to z
- |/ x z
- o 0 add x and y
- x y
- $ hg debugpathcopies 1 2
- z -> x
- y -> z
-
-Fork renames x to y on one side and removes x on the other
- $ newrepo
- $ echo x > x
- $ hg ci -Aqm 'add x'
- $ hg mv x y
- $ hg ci -m 'rename x to y'
- $ hg co -q 0
- $ hg rm x
- $ hg ci -m 'remove x'
- created new head
- $ hg l
- @ 2 remove x
- | x
- | o 1 rename x to y
- |/ x y
- o 0 add x
- x
- $ hg debugpathcopies 1 2
-
Copies via null revision (there shouldn't be any)
$ newrepo
$ echo x > x
@@ -252,402 +95,3 @@
x
$ hg debugpathcopies 1 2
$ hg debugpathcopies 2 1
-
-Merge rename from other branch
- $ newrepo
- $ echo x > x
- $ hg ci -Aqm 'add x'
- $ hg mv x y
- $ hg ci -m 'rename x to y'
- $ hg co -q 0
- $ echo z > z
- $ hg ci -Aqm 'add z'
- $ hg merge -q 1
- $ hg debugp1copies
- $ hg debugp2copies
- $ hg ci -m 'merge rename from p2'
- $ hg l
- @ 3 merge rename from p2
- |\ x
- | o 2 add z
- | | z
- o | 1 rename x to y
- |/ x y
- o 0 add x
- x
-Perhaps we should indicate the rename here, but `hg status` is documented to be weird during
-merges, so...
- $ hg debugp1copies -r 3
- $ hg debugp2copies -r 3
- $ hg debugpathcopies 0 3
- x -> y
- $ hg debugpathcopies 1 2
- y -> x
- $ hg debugpathcopies 1 3
- $ hg debugpathcopies 2 3
- x -> y
-
-Copy file from either side in a merge
- $ newrepo
- $ echo x > x
- $ hg ci -Aqm 'add x'
- $ hg co -q null
- $ echo y > y
- $ hg ci -Aqm 'add y'
- $ hg merge -q 0
- $ hg cp y z
- $ hg debugp1copies
- y -> z
- $ hg debugp2copies
- $ hg ci -m 'copy file from p1 in merge'
- $ hg co -q 1
- $ hg merge -q 0
- $ hg cp x z
- $ hg debugp1copies
- $ hg debugp2copies
- x -> z
- $ hg ci -qm 'copy file from p2 in merge'
- $ hg l
- @ 3 copy file from p2 in merge
- |\ z
- +---o 2 copy file from p1 in merge
- | |/ z
- | o 1 add y
- | y
- o 0 add x
- x
- $ hg debugp1copies -r 2
- y -> z
- $ hg debugp2copies -r 2
- $ hg debugpathcopies 1 2
- y -> z
- $ hg debugpathcopies 0 2
- $ hg debugp1copies -r 3
- $ hg debugp2copies -r 3
- x -> z
- $ hg debugpathcopies 1 3
- $ hg debugpathcopies 0 3
- x -> z
-
-Copy file that exists on both sides of the merge, same content on both sides
- $ newrepo
- $ echo x > x
- $ hg ci -Aqm 'add x on branch 1'
- $ hg co -q null
- $ echo x > x
- $ hg ci -Aqm 'add x on branch 2'
- $ hg merge -q 0
- $ hg cp x z
- $ hg debugp1copies
- x -> z
- $ hg debugp2copies
- $ hg ci -qm 'merge'
- $ hg l
- @ 2 merge
- |\ z
- | o 1 add x on branch 2
- | x
- o 0 add x on branch 1
- x
- $ hg debugp1copies -r 2
- x -> z
- $ hg debugp2copies -r 2
-It's a little weird that it shows up on both sides
- $ hg debugpathcopies 1 2
- x -> z
- $ hg debugpathcopies 0 2
- x -> z (filelog !)
-
-Copy file that exists on both sides of the merge, different content
- $ newrepo
- $ echo branch1 > x
- $ hg ci -Aqm 'add x on branch 1'
- $ hg co -q null
- $ echo branch2 > x
- $ hg ci -Aqm 'add x on branch 2'
- $ hg merge -q 0
- warning: conflicts while merging x! (edit, then use 'hg resolve --mark')
- [1]
- $ echo resolved > x
- $ hg resolve -m x
- (no more unresolved files)
- $ hg cp x z
- $ hg debugp1copies
- x -> z
- $ hg debugp2copies
- $ hg ci -qm 'merge'
- $ hg l
- @ 2 merge
- |\ x z
- | o 1 add x on branch 2
- | x
- o 0 add x on branch 1
- x
- $ hg debugp1copies -r 2
- x -> z (changeset !)
- $ hg debugp2copies -r 2
- x -> z (no-changeset !)
- $ hg debugpathcopies 1 2
- x -> z (changeset !)
- $ hg debugpathcopies 0 2
- x -> z (no-changeset !)
-
-Copy x->y on one side of merge and copy x->z on the other side. Pathcopies from one parent
-of the merge to the merge should include the copy from the other side.
- $ newrepo
- $ echo x > x
- $ hg ci -Aqm 'add x'
- $ hg cp x y
- $ hg ci -qm 'copy x to y'
- $ hg co -q 0
- $ hg cp x z
- $ hg ci -qm 'copy x to z'
- $ hg merge -q 1
- $ hg ci -m 'merge copy x->y and copy x->z'
- $ hg l
- @ 3 merge copy x->y and copy x->z
- |\
- | o 2 copy x to z
- | | z
- o | 1 copy x to y
- |/ y
- o 0 add x
- x
- $ hg debugp1copies -r 3
- $ hg debugp2copies -r 3
- $ hg debugpathcopies 2 3
- x -> y
- $ hg debugpathcopies 1 3
- x -> z
-
-Copy x to y on one side of merge, create y and rename to z on the other side. Pathcopies from the
-first side should not include the y->z rename since y didn't exist in the merge base.
- $ newrepo
- $ echo x > x
- $ hg ci -Aqm 'add x'
- $ hg cp x y
- $ hg ci -qm 'copy x to y'
- $ hg co -q 0
- $ echo y > y
- $ hg ci -Aqm 'add y'
- $ hg mv y z
- $ hg ci -m 'rename y to z'
- $ hg merge -q 1
- $ hg ci -m 'merge'
- $ hg l
- @ 4 merge
- |\
- | o 3 rename y to z
- | | y z
- | o 2 add y
- | | y
- o | 1 copy x to y
- |/ y
- o 0 add x
- x
- $ hg debugp1copies -r 3
- y -> z
- $ hg debugp2copies -r 3
- $ hg debugpathcopies 2 3
- y -> z
- $ hg debugpathcopies 1 3
-
-Create x and y, then rename x to z on one side of merge, and rename y to z and
-modify z on the other side. When storing copies in the changeset, we don't
-filter out copies whose target was created on the other side of the merge.
- $ newrepo
- $ echo x > x
- $ echo y > y
- $ hg ci -Aqm 'add x and y'
- $ hg mv x z
- $ hg ci -qm 'rename x to z'
- $ hg co -q 0
- $ hg mv y z
- $ hg ci -qm 'rename y to z'
- $ echo z >> z
- $ hg ci -m 'modify z'
- $ hg merge -q 1
- warning: conflicts while merging z! (edit, then use 'hg resolve --mark')
- [1]
- $ echo z > z
- $ hg resolve -qm z
- $ hg ci -m 'merge 1 into 3'
-Try merging the other direction too
- $ hg co -q 1
- $ hg merge -q 3
- warning: conflicts while merging z! (edit, then use 'hg resolve --mark')
- [1]
- $ echo z > z
- $ hg resolve -qm z
- $ hg ci -m 'merge 3 into 1'
- created new head
- $ hg l
- @ 5 merge 3 into 1
- |\ y z
- +---o 4 merge 1 into 3
- | |/ x z
- | o 3 modify z
- | | z
- | o 2 rename y to z
- | | y z
- o | 1 rename x to z
- |/ x z
- o 0 add x and y
- x y
- $ hg debugpathcopies 1 4
- y -> z (no-filelog !)
- $ hg debugpathcopies 2 4
- x -> z (no-filelog !)
- $ hg debugpathcopies 0 4
- x -> z (filelog !)
- y -> z (compatibility !)
- y -> z (changeset !)
- $ hg debugpathcopies 1 5
- y -> z (no-filelog !)
- $ hg debugpathcopies 2 5
- x -> z (no-filelog !)
- $ hg debugpathcopies 0 5
- x -> z
-
-
-Test for a case in fullcopytracing algorithm where neither of the merging csets
-is a descendant of the merge base. This test reflects that the algorithm
-correctly finds the copies:
-
- $ cat >> $HGRCPATH << EOF
- > [experimental]
- > evolution.createmarkers=True
- > evolution.allowunstable=True
- > EOF
-
- $ newrepo
- $ echo a > a
- $ hg add a
- $ hg ci -m "added a"
- $ echo b > b
- $ hg add b
- $ hg ci -m "added b"
-
- $ hg mv b b1
- $ hg ci -m "rename b to b1"
-
- $ hg up ".^"
- 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
- $ echo d > d
- $ hg add d
- $ hg ci -m "added d"
- created new head
-
- $ echo baba >> b
- $ hg ci --amend -m "added d, modified b"
-
- $ hg l --hidden
- @ 4 added d, modified b
- | b d
- | x 3 added d
- |/ d
- | o 2 rename b to b1
- |/ b b1
- o 1 added b
- | b
- o 0 added a
- a
-
-Grafting revision 4 on top of revision 2, showing that it respect the rename:
-
- $ hg up 2 -q
- $ hg graft -r 4 --base 3 --hidden
- grafting 4:af28412ec03c "added d, modified b" (tip) (no-changeset !)
- grafting 4:6325ca0b7a1c "added d, modified b" (tip) (changeset !)
- merging b1 and b to b1
-
- $ hg l -l1 -p
- @ 5 added d, modified b
- | b1
- ~ diff -r 5a4825cc2926 -r 94a2f1a0e8e2 b1 (no-changeset !)
- ~ diff -r 0a0ed3b3251c -r d544fb655520 b1 (changeset !)
- --- a/b1 Thu Jan 01 00:00:00 1970 +0000
- +++ b/b1 Thu Jan 01 00:00:00 1970 +0000
- @@ -1,1 +1,2 @@
- b
- +baba
-
-Test to make sure that fullcopytracing algorithm doesn't fail when neither of the
-merging csets is a descendant of the base.
--------------------------------------------------------------------------------------------------
-
- $ newrepo
- $ echo a > a
- $ hg add a
- $ hg ci -m "added a"
- $ echo b > b
- $ hg add b
- $ hg ci -m "added b"
-
- $ echo foobar > willconflict
- $ hg add willconflict
- $ hg ci -m "added willconflict"
- $ echo c > c
- $ hg add c
- $ hg ci -m "added c"
-
- $ hg l
- @ 3 added c
- | c
- o 2 added willconflict
- | willconflict
- o 1 added b
- | b
- o 0 added a
- a
-
- $ hg up ".^^"
- 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
- $ echo d > d
- $ hg add d
- $ hg ci -m "added d"
- created new head
-
- $ echo barfoo > willconflict
- $ hg add willconflict
- $ hg ci --amend -m "added willconflict and d"
-
- $ hg l
- @ 5 added willconflict and d
- | d willconflict
- | o 3 added c
- | | c
- | o 2 added willconflict
- |/ willconflict
- o 1 added b
- | b
- o 0 added a
- a
-
- $ hg rebase -r . -d 2 -t :other
- rebasing 5:5018b1509e94 "added willconflict and d" (tip) (no-changeset !)
- rebasing 5:af8d273bf580 "added willconflict and d" (tip) (changeset !)
-
- $ hg up 3 -q
- $ hg l --hidden
- o 6 added willconflict and d
- | d willconflict
- | x 5 added willconflict and d
- | | d willconflict
- | | x 4 added d
- | |/ d
- +---@ 3 added c
- | | c
- o | 2 added willconflict
- |/ willconflict
- o 1 added b
- | b
- o 0 added a
- a
-
-Now if we trigger a merge between revision 3 and 6 using base revision 4,
-neither of the merging csets will be a descendant of the base revision:
-
- $ hg graft -r 6 --base 4 --hidden -t :other
- grafting 6:99802e4f1e46 "added willconflict and d" (tip) (no-changeset !)
- grafting 6:b19f0df72728 "added willconflict and d" (tip) (changeset !)
To: martinvonz, #hg-reviewers
Cc: mercurial-devel
More information about the Mercurial-devel
mailing list