This patchset introduces directory rename detection to merge-recursive. See https://public-inbox.org/git/20171110190550.27059-1-newren@xxxxxxxxx/ for the previous series, design considerations, etc. Changes since the first series include: * Rebased on latest master (addressing a couple minor conflicts) * Fixed numerous checkstyle.pl issues (except a few line-too-long and string-split ones, in order to match the style of the surrounding code; also, added two BUG() calls as suggested by Stefan) * Various code cleanups and commit message improvements suggested by reviewers * Testcase cleanups suggested by reviewers: * Use test_create_repo for different tests instead of heavy-handed cleaning * O-A-B instead of A-B-C for labelling original commit and sides of merge * reduced the number of git-rev-parse invocations * various wording fixes, clarifications, and typo eradication in comments * New testcases (see patch 31/33): * Added a pair of testcases suggested by Stefan Boller and a third that was a slight modification of one of those two. The second testcase Stefan suggested has a fairly weird resolution that folks may want to double check, although to be fair, the input is fairly weird so some kind of weirdness in the output is to be expected. * Added a new testcase 9h based on a separate bug I found * Fixed two bugs: * ensure we write updates for directory-renamed file (bug triggered by testcase suggested by Stefan Boller; see patch 33/33) * avoid spurious rename/rename(1to2) conflicts from dir renames (found while I was digging around more; see patch 32/33) Both Junio and Stefan made numerous suggestions that were very helpful. I believe this second series incorporates all suggestions made by Junio, all but one of the non-tentative suggestions from Stefan (namely, the git ls-files exit code checking), and several of the tentative suggestions from Stefan as well. If folks feel strongly about the ls-files exit code checking or can spot anything I missed that looks important, let me know and I'll get it fixed up. Elijah Newren (33): Tighten and correct a few testcases for merging and cherry-picking merge-recursive: fix logic ordering issue merge-recursive: add explanation for src_entry and dst_entry directory rename detection: basic testcases directory rename detection: directory splitting testcases directory rename detection: testcases to avoid taking detection too far directory rename detection: partially renamed directory testcase/discussion directory rename detection: files/directories in the way of some renames directory rename detection: testcases checking which side did the rename directory rename detection: more involved edge/corner testcases directory rename detection: testcases exploring possibly suboptimal merges directory rename detection: miscellaneous testcases to complete coverage directory rename detection: tests for handling overwriting untracked files directory rename detection: tests for handling overwriting dirty files merge-recursive: move the get_renames() function merge-recursive: introduce new functions to handle rename logic merge-recursive: fix leaks of allocated renames and diff_filepairs merge-recursive: make !o->detect_rename codepath more obvious merge-recursive: split out code for determining diff_filepairs merge-recursive: add a new hashmap for storing directory renames merge-recursive: add get_directory_renames() merge-recursive: check for directory level conflicts merge-recursive: add a new hashmap for storing file collisions merge-recursive: add computation of collisions due to dir rename & merging merge-recursive: check for file level conflicts then get new name merge-recursive: when comparing files, don't include trees merge-recursive: apply necessary modifications for directory renames merge-recursive: avoid clobbering untracked files with directory renames merge-recursive: fix overwriting dirty files involved in renames merge-recursive: fix remaining directory rename + dirty overwrite cases directory rename detection: new testcases showcasing a pair of bugs merge-recursive: avoid spurious rename/rename conflict from dir renames merge-recursive: ensure we write updates for directory-renamed file merge-recursive.c | 1239 +++++++++++- merge-recursive.h | 17 + t/t3501-revert-cherry-pick.sh | 5 +- t/t6043-merge-rename-directories.sh | 3821 +++++++++++++++++++++++++++++++++++ t/t7607-merge-overwrite.sh | 7 +- unpack-trees.c | 4 +- unpack-trees.h | 4 + 7 files changed, 4981 insertions(+), 116 deletions(-) create mode 100755 t/t6043-merge-rename-directories.sh -- 2.15.0.309.g00c152f825