Before writing a replacement merge strategy for recursive, I decided to first cleanup the merge API -- streamlining merge-recursive.h and making it more readable. It includes some fixes I noticed along the way, and the last two patches were some forgotten changes of mine I rediscovered that had minor textual conflicts before I rebased them on this series. While there are minor textual and semantic dependencies between these patches (preventing me from splitting up this series), they are logically separate and can be reviewed independently. Stuff I'd most welcome review on: * Is cache-tree.c the right place for write_tree_from_memory()? [see patch 7] Should there be docs on how it differs from write_index_as_tree(), already found in cache-tree? What does the latter even do? Some notes: * Applies on master, merges cleanly to next & pu * Only patches 3, 5-7 touch anything outside of merge-recursive * Patches 1 & 3 are bugfixes, 2 & 4 arguably are too, but all are quite minor and do not need to be part of the impending release candidates or 2.23.0. * I'm going to be out next week (July 29-Aug 3), so I can only respond to feedback for the next couple days or it'll have to wait until the 5th. Stuff I didn't address: * merge_recursive() empties the commit_list of merge_bases it is passed, so the caller is expected to NOT use it afterwards. Seems suboptimal to place such an expectation on the caller. * All current callers (3 of them?) of merge_recursive() always pass it a specially created reversed-list for the merge_bases. Some history spelunking provides no details on any of these about why; it appears that the 2nd and 3rd callers reversed the list because the first did, and I'm guessing the first did in an attempt to exactly match the git-merge-recursive.py scripts' behavior. But if the API needs them in a reverse order from what people would normally expect to pass them in, shouldn't it reverse them itself instead of making all callers do it? Also, the order shouldn't matter when there are no conflicts, and when there are conflicts it'd only change which side of the conflict markers the made-up virtual merge base would list things in. However, we do have tests with recursive virtual merge bases and which test the output, and I didn't want to try to clean those all up. Besides, the current order shows nicely when commits are named things like "L1", "L2", "R1", "R2" -- it's nice having a well defined left and right side. Wasn't sure what to do yet, so I just punted for now; this series is already long enough... Elijah Newren (19): merge-recursive: fix minor memory leak in error condition merge-recursive: remove another implicit dependency on the_repository Ensure index matches head before invoking merge machinery, round N merge-recursive: exit early if index != head merge-recursive: don't force external callers to do our logging Change call signature of write_tree_from_memory() Move write_tree_from_memory() from merge-recursive to cache-tree merge-recursive: fix some overly long lines merge-recursive: use common name for ancestors/common/base_list merge-recursive: rename 'mrtree' to 'result_tree', for clarity merge-recursive: rename merge_options argument to opt in header merge-recursive: move some definitions around to clean up the header merge-recursive: consolidate unnecessary fields in merge_options merge-recursive: comment and reorder the merge_options fields merge-recursive: split internal fields into a separate struct merge-recursive.c: alphabetize include list merge-recursive: rename MERGE_RECURSIVE_* to MERGE_VARIANT_* merge-recursive: be consistent with assert merge-recursive: provide a better label for diff3 common ancestor builtin/checkout.c | 2 +- builtin/merge-recursive.c | 4 + builtin/stash.c | 2 + cache-tree.c | 30 ++ cache-tree.h | 2 + merge-recursive.c | 517 +++++++++++++++++------------- merge-recursive.h | 119 +++---- sequencer.c | 1 - t/t3030-merge-recursive.sh | 9 +- t/t6036-recursive-corner-cases.sh | 8 +- t/t6047-diff3-conflict-markers.sh | 191 +++++++++++ 11 files changed, 589 insertions(+), 296 deletions(-) create mode 100755 t/t6047-diff3-conflict-markers.sh -- 2.22.0.564.gb52f8ae349