From: Elijah Newren <newren@gmail.com>
To: git@vger.kernel.org
Cc: gitster@pobox.com, Elijah Newren <newren@gmail.com>
Subject: [PATCH v3 31/33] directory rename detection: new testcases showcasing a pair of bugs
Date: Tue, 21 Nov 2017 00:00:57 -0800 [thread overview]
Message-ID: <20171121080059.32304-32-newren@gmail.com> (raw)
In-Reply-To: <20171121080059.32304-1-newren@gmail.com>
Add a testcase showing spurious rename/rename(1to2) conflicts occurring
due to directory rename detection.
Also add a pair of testcases dealing with moving directory hierarchies
around that were suggested by Stefan Beller as "food for thought" during
his review of an earlier patch series, but which actually uncovered a
bug. Round things out with a test that is a cross between the two
testcases that showed existing bugs in order to make sure we aren't
merely addressing problems in isolation but in general.
Signed-off-by: Elijah Newren <newren@gmail.com>
---
t/t6043-merge-rename-directories.sh | 284 ++++++++++++++++++++++++++++++++++++
1 file changed, 284 insertions(+)
diff --git a/t/t6043-merge-rename-directories.sh b/t/t6043-merge-rename-directories.sh
index e48d5443c5..224d266695 100755
--- a/t/t6043-merge-rename-directories.sh
+++ b/t/t6043-merge-rename-directories.sh
@@ -153,6 +153,7 @@ test_expect_success '1b-check: Merge a directory with another' '
# Testcase 1c, Transitive renaming
# (Related to testcases 3a and 6d -- when should a transitive rename apply?)
# (Related to testcases 9c and 9d -- can transitivity repeat?)
+# (Related to testcase 12b -- joint-transitivity?)
# Commit O: z/{b,c}, x/d
# Commit A: y/{b,c}, x/d
# Commit B: z/{b,c,d}
@@ -2758,6 +2759,67 @@ test_expect_failure '9g-check: Renamed directory that only contained immediate s
)
'
+# Testcase 9h, Avoid implicit rename if involved as source on other side
+# (Extremely closely related to testcase 3a)
+# Commit O: z/{b,c,d_1}
+# Commit A: z/{b,c,d_2}
+# Commit B: y/{b,c}, x/d_1
+# Expected: y/{b,c}, x/d_2
+# NOTE: If we applied the z/ -> y/ rename to z/d, then we'd end up with
+# a rename/rename(1to2) conflict (z/d -> y/d vs. x/d)
+test_expect_success '9h-setup: Avoid dir rename on merely modified path' '
+ test_create_repo 9h &&
+ (
+ cd 9h &&
+
+ mkdir z &&
+ echo b >z/b &&
+ echo c >z/c &&
+ printf "1\n2\n3\n4\n5\n6\n7\n8\nd\n" >z/d &&
+ git add z &&
+ test_tick &&
+ git commit -m "O" &&
+
+ git branch O &&
+ git branch A &&
+ git branch B &&
+
+ git checkout A &&
+ test_tick &&
+ echo more >>z/d &&
+ git add z/d &&
+ git commit -m "A" &&
+
+ git checkout B &&
+ mkdir y &&
+ mkdir x &&
+ git mv z/b y/ &&
+ git mv z/c y/ &&
+ git mv z/d x/ &&
+ rmdir z &&
+ test_tick &&
+ git commit -m "B"
+ )
+'
+
+test_expect_failure '9h-check: Avoid dir rename on merely modified path' '
+ (
+ cd 9h &&
+
+ git checkout A^0 &&
+
+ git merge -s recursive B^0 &&
+
+ test 3 -eq $(git ls-files -s | wc -l) &&
+
+ git rev-parse >actual \
+ HEAD:y/b HEAD:y/c HEAD:x/d &&
+ git rev-parse >expect \
+ O:z/b O:z/c A:z/d &&
+ test_cmp expect actual
+ )
+'
+
###########################################################################
# Rules suggested by section 9:
#
@@ -3539,4 +3601,226 @@ test_expect_success '11f-check: Avoid deleting not-uptodate with dir rename/rena
)
'
+###########################################################################
+# SECTION 12: Everything else
+#
+# Tests suggested by others. Tests added after implementation completed
+# and submitted. Grab bag.
+###########################################################################
+
+# Testcase 12a, Moving one directory hierarchy into another
+# (Related to testcase 9a)
+# Commit O: node1/{leaf1,leaf2}, node2/{leaf3,leaf4}
+# Commit A: node1/{leaf1,leaf2,node2/{leaf3,leaf4}}
+# Commit B: node1/{leaf1,leaf2,leaf5}, node2/{leaf3,leaf4,leaf6}
+# Expected: node1/{leaf1,leaf2,leaf5,node2/{leaf3,leaf4,leaf6}}
+
+test_expect_success '12a-setup: Moving one directory hierarchy into another' '
+ test_create_repo 12a &&
+ (
+ cd 12a &&
+
+ mkdir -p node1 node2 &&
+ echo leaf1 >node1/leaf1 &&
+ echo leaf2 >node1/leaf2 &&
+ echo leaf3 >node2/leaf3 &&
+ echo leaf4 >node2/leaf4 &&
+ git add node1 node2 &&
+ test_tick &&
+ git commit -m "O" &&
+
+ git branch O &&
+ git branch A &&
+ git branch B &&
+
+ git checkout A &&
+ git mv node2/ node1/ &&
+ test_tick &&
+ git commit -m "A" &&
+
+ git checkout B &&
+ echo leaf5 >node1/leaf5 &&
+ echo leaf6 >node2/leaf6 &&
+ git add node1 node2 &&
+ test_tick &&
+ git commit -m "B"
+ )
+'
+
+test_expect_success '12a-check: Moving one directory hierarchy into another' '
+ (
+ cd 12a &&
+
+ git checkout A^0 &&
+
+ git merge -s recursive B^0 &&
+
+ test 6 -eq $(git ls-files -s | wc -l) &&
+
+ git rev-parse >actual \
+ HEAD:node1/leaf1 HEAD:node1/leaf2 HEAD:node1/leaf5 HEAD:node1/node2/leaf3 HEAD:node1/node2/leaf4 HEAD:node1/node2/leaf6 &&
+ git rev-parse >expect \
+ O:node1/leaf1 O:node1/leaf2 B:node1/leaf5 O:node2/leaf3 O:node2/leaf4 B:node2/leaf6 &&
+ test_cmp expect actual
+ )
+'
+
+# Testcase 12b, Moving two directory hierarchies into each other
+# (Related to testcases 1c and 12c)
+# Commit O: node1/{leaf1, leaf2}, node2/{leaf3, leaf4}
+# Commit A: node1/{leaf1, leaf2, node2/{leaf3, leaf4}}
+# Commit B: node2/{leaf3, leaf4, node1/{leaf1, leaf2}}
+# Expected: node1/node2/node1/{leaf1, leaf2},
+# node2/node1/node2/{leaf3, leaf4}
+# NOTE: Without directory renames, we would expect
+# node2/node1/{leaf1, leaf2},
+# node1/node2/{leaf3, leaf4}
+# with directory rename detection, we note that
+# commit A renames node2/ -> node1/node2/
+# commit B renames node1/ -> node2/node1/
+# therefore, applying those directory renames to the initial result
+# (making all four paths experience a transitive renaming), yields
+# the expected result.
+#
+# You may ask, is it weird to have two directories rename each other?
+# To which, I can do no more than shrug my shoulders and say that
+# even simple rules give weird results when given weird inputs.
+
+test_expect_success '12b-setup: Moving one directory hierarchy into another' '
+ test_create_repo 12b &&
+ (
+ cd 12b &&
+
+ mkdir -p node1 node2 &&
+ echo leaf1 >node1/leaf1 &&
+ echo leaf2 >node1/leaf2 &&
+ echo leaf3 >node2/leaf3 &&
+ echo leaf4 >node2/leaf4 &&
+ git add node1 node2 &&
+ test_tick &&
+ git commit -m "O" &&
+
+ git branch O &&
+ git branch A &&
+ git branch B &&
+
+ git checkout A &&
+ git mv node2/ node1/ &&
+ test_tick &&
+ git commit -m "A" &&
+
+ git checkout B &&
+ git mv node1/ node2/ &&
+ test_tick &&
+ git commit -m "B"
+ )
+'
+
+test_expect_failure '12b-check: Moving one directory hierarchy into another' '
+ (
+ cd 12b &&
+
+ git checkout A^0 &&
+
+ git merge -s recursive B^0 &&
+
+ test 4 -eq $(git ls-files -s | wc -l) &&
+
+ git rev-parse >actual \
+ HEAD:node1/node2/node1/leaf1 \
+ HEAD:node1/node2/node1/leaf2 \
+ HEAD:node2/node1/node2/leaf3 \
+ HEAD:node2/node1/node2/leaf4 &&
+ git rev-parse >expect \
+ O:node1/leaf1 O:node1/leaf2 \
+ O:node2/leaf3 O:node2/leaf4 &&
+ test_cmp expect actual
+ )
+'
+
+# Testcase 12c, Moving two directory hierarchies into each other w/ content merge
+# (Related to testcase 12b)
+# Commit O: node1/{ leaf1_1, leaf2_1}, node2/{leaf3_1, leaf4_1}
+# Commit A: node1/{ leaf1_2, leaf2_2, node2/{leaf3_2, leaf4_2}}
+# Commit B: node2/{node1/{leaf1_3, leaf2_3}, leaf3_3, leaf4_3}
+# Expected: Content merge conflicts for each of:
+# node1/node2/node1/{leaf1, leaf2},
+# node2/node1/node2/{leaf3, leaf4}
+# NOTE: This is *exactly* like 12c, except that every path is modified on
+# each side of the merge.
+
+test_expect_success '12c-setup: Moving one directory hierarchy into another w/ content merge' '
+ test_create_repo 12c &&
+ (
+ cd 12c &&
+
+ mkdir -p node1 node2 &&
+ printf "1\n2\n3\n4\n5\n6\n7\n8\nleaf1\n" >node1/leaf1 &&
+ printf "1\n2\n3\n4\n5\n6\n7\n8\nleaf2\n" >node1/leaf2 &&
+ printf "1\n2\n3\n4\n5\n6\n7\n8\nleaf3\n" >node2/leaf3 &&
+ printf "1\n2\n3\n4\n5\n6\n7\n8\nleaf4\n" >node2/leaf4 &&
+ git add node1 node2 &&
+ test_tick &&
+ git commit -m "O" &&
+
+ git branch O &&
+ git branch A &&
+ git branch B &&
+
+ git checkout A &&
+ git mv node2/ node1/ &&
+ for i in `git ls-files`; do echo side A >>$i; done &&
+ git add -u &&
+ test_tick &&
+ git commit -m "A" &&
+
+ git checkout B &&
+ git mv node1/ node2/ &&
+ for i in `git ls-files`; do echo side B >>$i; done &&
+ git add -u &&
+ test_tick &&
+ git commit -m "B"
+ )
+'
+
+test_expect_failure '12c-check: Moving one directory hierarchy into another w/ content merge' '
+ (
+ cd 12c &&
+
+ git checkout A^0 &&
+
+ test_must_fail git merge -s recursive B^0 &&
+
+ test 12 -eq $(git ls-files -u | wc -l) &&
+
+ git rev-parse >actual \
+ :1:node1/node2/node1/leaf1 \
+ :1:node1/node2/node1/leaf2 \
+ :1:node2/node1/node2/leaf3 \
+ :1:node2/node1/node2/leaf4 \
+ :2:node1/node2/node1/leaf1 \
+ :2:node1/node2/node1/leaf2 \
+ :2:node2/node1/node2/leaf3 \
+ :2:node2/node1/node2/leaf4 \
+ :3:node1/node2/node1/leaf1 \
+ :3:node1/node2/node1/leaf2 \
+ :3:node2/node1/node2/leaf3 \
+ :3:node2/node1/node2/leaf4 &&
+ git rev-parse >expect \
+ O:node1/leaf1 \
+ O:node1/leaf2 \
+ O:node2/leaf3 \
+ O:node2/leaf4 \
+ A:node1/leaf1 \
+ A:node1/leaf2 \
+ A:node1/node2/leaf3 \
+ A:node1/node2/leaf4 \
+ B:node2/node1/leaf1 \
+ B:node2/node1/leaf2 \
+ B:node2/leaf3 \
+ B:node2/leaf4 &&
+ test_cmp expect actual
+ )
+'
+
test_done
--
2.15.0.309.g62ce55426d
next prev parent reply other threads:[~2017-11-21 8:02 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-11-21 8:00 [PATCH v3 00/33] Add directory rename detection to git Elijah Newren
2017-11-21 8:00 ` [PATCH v3 01/33] Tighten and correct a few testcases for merging and cherry-picking Elijah Newren
2017-11-21 8:00 ` [PATCH v3 02/33] merge-recursive: fix logic ordering issue Elijah Newren
2017-11-21 8:00 ` [PATCH v3 03/33] merge-recursive: add explanation for src_entry and dst_entry Elijah Newren
2017-11-21 8:00 ` [PATCH v3 04/33] directory rename detection: basic testcases Elijah Newren
2017-11-21 8:00 ` [PATCH v3 05/33] directory rename detection: directory splitting testcases Elijah Newren
2017-11-21 8:00 ` [PATCH v3 06/33] directory rename detection: testcases to avoid taking detection too far Elijah Newren
2017-11-21 8:00 ` [PATCH v3 07/33] directory rename detection: partially renamed directory testcase/discussion Elijah Newren
2017-11-21 8:00 ` [PATCH v3 08/33] directory rename detection: files/directories in the way of some renames Elijah Newren
2017-11-21 8:00 ` [PATCH v3 09/33] directory rename detection: testcases checking which side did the rename Elijah Newren
2017-11-21 8:00 ` [PATCH v3 10/33] directory rename detection: more involved edge/corner testcases Elijah Newren
2017-11-21 8:00 ` [PATCH v3 11/33] directory rename detection: testcases exploring possibly suboptimal merges Elijah Newren
2017-11-22 18:29 ` Stefan Beller
2017-11-21 8:00 ` [PATCH v3 12/33] directory rename detection: miscellaneous testcases to complete coverage Elijah Newren
2017-11-21 8:00 ` [PATCH v3 13/33] directory rename detection: tests for handling overwriting untracked files Elijah Newren
2017-11-21 8:00 ` [PATCH v3 14/33] directory rename detection: tests for handling overwriting dirty files Elijah Newren
2017-11-21 8:00 ` [PATCH v3 15/33] merge-recursive: move the get_renames() function Elijah Newren
2017-11-21 8:00 ` [PATCH v3 16/33] merge-recursive: introduce new functions to handle rename logic Elijah Newren
2017-11-21 8:00 ` [PATCH v3 17/33] merge-recursive: fix leaks of allocated renames and diff_filepairs Elijah Newren
2017-11-21 8:00 ` [PATCH v3 18/33] merge-recursive: make !o->detect_rename codepath more obvious Elijah Newren
2017-11-21 8:00 ` [PATCH v3 19/33] merge-recursive: split out code for determining diff_filepairs Elijah Newren
2017-11-21 8:00 ` [PATCH v3 20/33] merge-recursive: add a new hashmap for storing directory renames Elijah Newren
2017-11-21 8:00 ` [PATCH v3 21/33] merge-recursive: add get_directory_renames() Elijah Newren
2017-11-26 0:52 ` Johannes Schindelin
2017-11-26 1:45 ` Elijah Newren
2017-11-21 8:00 ` [PATCH v3 22/33] merge-recursive: check for directory level conflicts Elijah Newren
2017-11-22 18:36 ` Stefan Beller
2017-11-21 8:00 ` [PATCH v3 23/33] merge-recursive: add a new hashmap for storing file collisions Elijah Newren
2017-11-21 8:00 ` [PATCH v3 24/33] merge-recursive: add computation of collisions due to dir rename & merging Elijah Newren
2017-11-21 8:00 ` [PATCH v3 25/33] merge-recursive: check for file level conflicts then get new name Elijah Newren
2017-11-22 18:56 ` Stefan Beller
2017-11-21 8:00 ` [PATCH v3 26/33] merge-recursive: when comparing files, don't include trees Elijah Newren
2017-11-21 8:00 ` [PATCH v3 27/33] merge-recursive: apply necessary modifications for directory renames Elijah Newren
2017-11-21 8:00 ` [PATCH v3 28/33] merge-recursive: avoid clobbering untracked files with " Elijah Newren
2017-11-21 8:00 ` [PATCH v3 29/33] merge-recursive: fix overwriting dirty files involved in renames Elijah Newren
2017-11-21 8:00 ` [PATCH v3 30/33] merge-recursive: fix remaining directory rename + dirty overwrite cases Elijah Newren
2017-11-21 8:00 ` Elijah Newren [this message]
2017-11-21 8:00 ` [PATCH v3 32/33] merge-recursive: avoid spurious rename/rename conflict from dir renames Elijah Newren
2017-11-21 8:00 ` [PATCH v3 33/33] merge-recursive: ensure we write updates for directory-renamed file Elijah Newren
2017-11-22 0:42 ` [PATCH v3 00/33] Add directory rename detection to git Stefan Beller
2017-11-22 1:12 ` Elijah Newren
2017-11-22 2:44 ` Junio C Hamano
2017-11-22 19:24 ` Stefan Beller
2017-11-23 6:22 ` Elijah Newren
2017-11-23 11:52 ` Adam Dinwoodie
2017-11-23 22:28 ` Elijah Newren
2017-11-24 5:25 ` Elijah Newren
2017-11-24 20:07 ` Elijah Newren
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20171121080059.32304-32-newren@gmail.com \
--to=newren@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).