In an effort to reduce the number of shell scripts part of git, I propose this patch converting the two remaining merge strategies, resolve and octopus, from shell to C. This will enable slightly better performance, better integration with git itself (no more forking to perform these operations), better portability (Windows and shell scripts don't mix well). Three scripts are actually converted: first git-merge-one-file.sh, then git-merge-resolve.sh, and finally git-merge-octopus.sh. Not only they are converted, but they also are modified to operate without forking, and then libified so they can be used by git without spawning another process. The first patch is not important to make the whole series work, but I made this patch while working on this series. Patches 2-5 rewrite, clean, and libify `git merge-one-file', used by the resolve and octopus strategies. Patch 6 libifies `git merge-index', so the rewritten `git merge-one-file' can be called without forking. Patch 7-8-9 rewrite, clean, and libify `git merge-resolve'. Patch 10 moves a function, better_branch_name(), that will prove itself useful in the C version of `git merge-octopus', but that is not part of libgit.a. Patches 11-12-13 rewrite, clean, and libify `git merge-octopus'. Patches 14-15-16-17 teach `git merge' and the sequencer to call the strategies without forking. This series keeps the commands `git merge-one-file', `git merge-resolve' and `git merge-octopus', so any script depending on them should keep working without any changes. This series is based on c9c318d6bf (The fourth batch, 2020-06-22). The tip is tagged as "rewrite-and-cleanup-merge-strategies-v1" at https://github.com/agrn/git. Alban Gruin (17): t6027: modernise tests merge-one-file: rewrite in C merge-one-file: remove calls to external processes merge-one-file: use error() instead of fprintf(stderr, ...) merge-one-file: libify merge_one_file() merge-index: libify merge_one_path() and merge_all() merge-resolve: rewrite in C merge-resolve: remove calls to external processes merge-resolve: libify merge_resolve() merge-recursive: move better_branch_name() to merge.c merge-octopus: rewrite in C merge-octopus: remove calls to external processes merge-octopus: libify merge_octopus() merge: use the "resolve" strategy without forking merge: use the "octopus" strategy without forking sequencer: use the "resolve" strategy without forking sequencer: use the "octopus" merge strategy without forking Makefile | 7 +- builtin.h | 3 + builtin/merge-index.c | 77 +---- builtin/merge-octopus.c | 65 ++++ builtin/merge-one-file.c | 74 ++++ builtin/merge-recursive.c | 16 +- builtin/merge-resolve.c | 69 ++++ builtin/merge.c | 9 +- cache.h | 2 +- git-merge-octopus.sh | 112 ------- git-merge-one-file.sh | 167 --------- git-merge-resolve.sh | 54 --- git.c | 3 + merge-strategies.c | 577 ++++++++++++++++++++++++++++++++ merge-strategies.h | 44 +++ merge.c | 12 + sequencer.c | 16 +- t/t6027-merge-binary.sh | 27 +- t/t6035-merge-dir-to-symlink.sh | 2 +- 19 files changed, 889 insertions(+), 447 deletions(-) create mode 100644 builtin/merge-octopus.c create mode 100644 builtin/merge-one-file.c create mode 100644 builtin/merge-resolve.c delete mode 100755 git-merge-octopus.sh delete mode 100755 git-merge-one-file.sh delete mode 100755 git-merge-resolve.sh create mode 100644 merge-strategies.c create mode 100644 merge-strategies.h -- 2.27.0.139.gc9c318d6bf