This patchset introduces directory rename detection to merge-recursive; I'm resubmitting just a few hours after my PATCHv2 because I didn't know about the DEVELOPER=1 flag previously, and my code had a number of warnings/errors. I would have just submitted fixup/squash patches, but when I checked, there sadly they cause merge conflicts when rebasing See https://public-inbox.org/git/20171110190550.27059-1-newren@xxxxxxxxx/ for the first series, design considerations, etc, and https://public-inbox.org/git/20171120220209.15111-1-newren@xxxxxxxxx/ for v2. Changes since the last series: * Fixed various compilation errors with make DEVELOPER=1. 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 | 1243 +++++++++++- 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, 4985 insertions(+), 116 deletions(-) create mode 100755 t/t6043-merge-rename-directories.sh -- 2.15.0.309.g62ce55426d