I know this is kinda big, but it's mostly simple mechanical cleanups.
Stuff I'd like reviewers to focus on:
* Patch 15, particularly looking over the new testcases (13a-13d) in
t6043 and the documentation.
* Should I have switched 'unsigned short' to 'unsigned' instead of
vice-versa in patch 1?
* Similarly, does anyone have a reason to prefer oid,mode pair over
using a diff_filespec as I did in patch 11?
The crux of this series is in patch 15, changing the default for
directory rename detection to treat it as a conflict. It is similar
to the patch Junio previously reviewed; changes:
* It now also handles files renamed into directories on one side
where the other side renamed the directory away. (Previously, it
only handled new files added into such directories.)
* As suggested by Junio, even if merge.directoryRenames=true is set
in config (to accept directory rename heuristics as correct
without reporting conflicts), messages will now be printed about
the paths being changed by directory renames.
* Error and info messages updated based in part on Junio's
suggestions, a second check that the messages make sense would be
useful.
* There are now testcases testing the conflict and information
message output (testcases 13[abcd] in t6043)
The reason this series exploded from one patch to fifteen was the need
to handle transitive renames (renames into directories on one side
while the other side renamed that directory away). For that, I needed
to plumb more information through...but quickly got frustrated with
various ugly code bits and went down a rabbit hole.
The first 12 patches are solely cleanups
Patches 13 & 14 are simple changes to make additional information
available.
Patch 15 is primary purpose of the series, described above.
Elijah Newren (15):
Use 'unsigned short' for mode, like diff_filespec does
merge-recursive: rename merge_options argument from 'o' to 'opt'
merge-recursive: rename diff_filespec 'one' to 'o'
merge-recursive: rename locals 'o' and 'a' to 'obuf' and 'abuf'
merge-recursive: use 'ci' for rename_conflict_info variable name
merge-recursive: move some struct declarations together
merge-recursive: shrink rename_conflict_info
merge-recursive: remove ren[12]_other fields from rename_conflict_info
merge-recursive: track branch where rename occurred in rename struct
merge-recursive: cleanup handle_rename_* function signatures
merge-recursive: switch from (oid,mode) pairs to a diff_filespec
t6043: fix copied test description to match its purpose
merge-recursive: track information associated with directory renames
merge-recursive: give callers of handle_content_merge() access to
contents
merge-recursive: switch directory rename detection default
Documentation/config/merge.txt | 19 +-
archive.c | 2 +-
blame.c | 2 +-
blame.h | 2 +-
builtin/rm.c | 2 +-
builtin/update-index.c | 2 +-
cache.h | 2 +-
fsck.c | 2 +-
line-log.c | 2 +-
match-trees.c | 8 +-
merge-recursive.c | 1853 ++++++++++++------------
notes.c | 2 +-
sha1-name.c | 2 +-
t/t3401-rebase-and-am-rename.sh | 8 +-
t/t6043-merge-rename-directories.sh | 462 +++++-
t/t6046-merge-skip-unneeded-updates.sh | 8 +-
tree-diff.c | 2 +-
tree-walk.c | 6 +-
tree-walk.h | 6 +-
19 files changed, 1367 insertions(+), 1025 deletions(-)
--
2.21.0.211.gb523892db9