Just a couple of minor things: > +########################################################################### > +# SECTION 1: Cases involving no renames (one side has subset of changes of > +# the other side) > +########################################################################### > + > +# Testcase 1a, Changes on A, subset of changes on B > +# Commit O: b_1 > +# Commit A: b_2 > +# Commit B: b_3 > +# Expected: b_2 > + > +test_expect_success '1a-setup: Modify(A)/Modify(B), change on B subset of A' ' > + test_create_repo 1a && > + ( > + cd 1a && > + > + test_write_lines 1 2 3 4 5 6 7 8 9 10 >b Broken && chain. <...> > +########################################################################### > +# SECTION 2: Cases involving basic renames > +########################################################################### > + > +# Testcase 2a, Changes on A, rename on B > +# Commit O: b_1 > +# Commit A: b_2 > +# Commit B: c_1 > +# Expected: c_2 > + > +test_expect_success '2a-setup: Modify(A)/rename(B)' ' > + test_create_repo 2a && > + ( > + cd 2a && > + > + test_seq 1 10 >b Broken && chain. > + git add b && > + test_tick && > + git commit -m "O" && > + > + git branch O && > + git branch A && > + git branch B && > + > + git checkout A && > + test_seq 1 11 > b && Nit: space between redirection operator and filename. <...> > +# Testcase 2b, Changed and renamed on A, subset of changes on B > +# Commit O: b_1 > +# Commit A: c_2 > +# Commit B: b_3 > +# Expected: c_2 > + > +test_expect_success '2b-setup: Rename+Mod(A)/Mod(B), B mods subset of A' ' > + test_create_repo 2b && > + ( > + cd 2b && > + > + test_write_lines 1 2 3 4 5 6 7 8 9 10 >b Broken && chain. <...> > +# Testcase 2c, Changes on A, rename on B > +# Commit O: b_1 > +# Commit A: b_2, c_3 > +# Commit B: c_1 > +# Expected: rename/add conflict c_2 vs c_3 > +# > +# NOTE: Since A modified b_1->b_2, and B renamed b_1->c_1, the threeway > +# merge of those files should result in c_2. We then should have a > +# rename/add conflict between c_2 and c_3. However, if we note in > +# merge_content() that A had the right contents (b_2 has same > +# contents as c_2, just at a different name), and that A had the > +# right path present (c_3 existed) and thus decides that it can > +# skip the update, then we're in trouble. This test verifies we do > +# not make that particular mistake. > + > +test_expect_success '2c-setup: Modify b & add c VS rename b->c' ' > + test_create_repo 2c && > + ( > + cd 2c && > + > + test_seq 1 10 >b Broken && chain. <...> > +########################################################################### > +# SECTION 3: Cases involving directory renames > +# > +# NOTE: > +# Directory renames only apply when one side renames a directory, and the > +# other side adds or renames a path into that directory. Applying the > +# directory rename to that new path creates a new pathname that didn't > +# exist on either side of history. Thus, it is impossible for the > +# merge contents to already be at the right path, so all of these checks > +# exist just to make sure that updates are not skipped. > +########################################################################### > + > +# Testcase 3a, Change + rename into dir foo on A, dir rename foo->bar on B > +# Commit O: bq_1, foo/whatever > +# Commit A: foo/{bq_2, whatever} > +# Commit B: bq_1, bar/whatever > +# Expected: bar/{bq_2, whatever} > + > +test_expect_success '3a-setup: bq_1->foo/bq_2 on A, foo/->bar/ on B' ' > + test_create_repo 3a && > + ( > + cd 3a && > + > + mkdir foo && > + test_seq 1 10 >bq && > + test_write_lines a b c d e f g h i j k >foo/whatever && > + git add bq foo/whatever && > + test_tick && > + git commit -m "O" && > + > + git branch O && > + git branch A && > + git branch B && > + > + git checkout A && > + test_seq 1 11 > bq && Space between redirection operator and filename. <...> > +# Testcase 3b, rename into dir foo on A, dir rename foo->bar + change on B > +# Commit O: bq_1, foo/whatever > +# Commit A: foo/{bq_1, whatever} > +# Commit B: bq_2, bar/whatever > +# Expected: bar/{bq_2, whatever} > + > +test_expect_success '3b-setup: bq_1->foo/bq_2 on A, foo/->bar/ on B' ' > + test_create_repo 3b && > + ( > + cd 3b && > + > + mkdir foo && > + test_seq 1 10 >bq && > + test_write_lines a b c d e f g h i j k >foo/whatever && > + git add bq foo/whatever && > + test_tick && > + git commit -m "O" && > + > + git branch O && > + git branch A && > + git branch B && > + > + git checkout A && > + git mv bq foo/ && > + test_tick && > + git commit -m "A" && > + > + git checkout B && > + test_seq 1 11 > bq && Space between redirection operator and filename. <...> > +########################################################################### > +# SECTION 4: Cases involving dirty changes > +########################################################################### > + > +# Testcase 4a, Changed on A, subset of changes on B, locally modified > +# Commit O: b_1 > +# Commit A: b_2 > +# Commit B: b_3 > +# Working copy: b_4 > +# Expected: b_2 for merge, b_4 in working copy > + > +test_expect_success '4a-setup: Change on A, change on B subset of A, dirty mods present' ' > + test_create_repo 4a && > + ( > + cd 4a && > + > + test_write_lines 1 2 3 4 5 6 7 8 9 10 >b Broken && chain. <...> > +# Testcase 4b, Changed+renamed on A, subset of changes on B, locally modified > +# Commit O: b_1 > +# Commit A: c_2 > +# Commit B: b_3 > +# Working copy: c_4 > +# Expected: c_2 > + > +test_expect_success '4b-setup: Rename+Mod(A)/Mod(B), change on B subset of A, dirty mods present' ' > + test_create_repo 4b && > + ( > + cd 4b && > + > + test_write_lines 1 2 3 4 5 6 7 8 9 10 >b Broken && chain.