From: Phillip Wood Date: Thu, 10 Jun 2021 09:32:24 GMT Subject: Re: [PATCH 4/7] checkout: fix merge.conflictstyle handling Message-ID: In-Reply-To: <20210609192842.696646-5-felipe.contreras@gmail.com> On 09/06/2021 20:28, Felipe Contreras wrote: > Currently both merge.conflictStyle and `git commit --merge > --conflict=diff3` don't work together, since the former wrongly > overrides the later. > > The way merge configurations are handled is not correct. > It should be possible to do git_config(merge_recursive_config, ...) just > like we can with git_diff_basic_config and others. It would be helpful to explain what the problem with merge_recursive_config() actually is rather than just saying "it should be possible ..." > Therefore builtins like `git merge` can't call this function at the > right time. > > We shuffle the functions a little bit so at least merge_recursive_config > doesn't call git_xmerge_config directly and thus override previous > configurations. Rather than papering of the problem, how difficult would it be to add a field to ll_merge_options and pass the conflict style with that rather than fiddling with the order that we set a global variable. Does this change affect 'am/apply -3'? - Do they still read the config setting properly? Best Wishes Phillip > Signed-off-by: Felipe Contreras > --- > builtin/merge-recursive.c | 3 +++ > builtin/merge.c | 4 ++++ > merge-recursive.c | 2 +- > sequencer.c | 5 +++++ > t/t6440-config-conflict-markers.sh | 31 ++++++++++++++++++++++++++++++ > 5 files changed, 44 insertions(+), 1 deletion(-) > > diff --git a/builtin/merge-recursive.c b/builtin/merge-recursive.c > index a4bfd8fc51..80f9279b4c 100644 > --- a/builtin/merge-recursive.c > +++ b/builtin/merge-recursive.c > @@ -4,6 +4,7 @@ > #include "tag.h" > #include "merge-recursive.h" > #include "xdiff-interface.h" > +#include "config.h" > > static const char builtin_merge_recursive_usage[] = > "git %s ... -- ..."; > @@ -30,6 +31,8 @@ int cmd_merge_recursive(int argc, const char **argv, const char *prefix) > char *better1, *better2; > struct commit *result; > > + git_config(git_xmerge_config, NULL); > + > init_merge_options(&o, the_repository); > if (argv[0] && ends_with(argv[0], "-subtree")) > o.subtree_shift = ""; > diff --git a/builtin/merge.c b/builtin/merge.c > index eddb8ae70d..7aa3dbb111 100644 > --- a/builtin/merge.c > +++ b/builtin/merge.c > @@ -43,6 +43,7 @@ > #include "commit-reach.h" > #include "wt-status.h" > #include "commit-graph.h" > +#include "xdiff-interface.h" > > #define DEFAULT_TWOHEAD (1<<0) > #define DEFAULT_OCTOPUS (1<<1) > @@ -659,6 +660,9 @@ static int git_merge_config(const char *k, const char *v, void *cb) > if (status) > return status; > status = git_gpg_config(k, v, NULL); > + if (status) > + return status; > + status = git_xmerge_config(k, v, NULL); > if (status) > return status; > return git_diff_ui_config(k, v, cb); > diff --git a/merge-recursive.c b/merge-recursive.c > index d146bb116f..10e6e1e4d1 100644 > --- a/merge-recursive.c > +++ b/merge-recursive.c > @@ -3845,7 +3845,7 @@ static void merge_recursive_config(struct merge_options *opt) > } /* avoid erroring on values from future versions of git */ > free(value); > } > - git_config(git_xmerge_config, NULL); > + git_config(git_default_config, NULL); > } > > void init_merge_options(struct merge_options *opt, > diff --git a/sequencer.c b/sequencer.c > index 0bec01cf38..9e2bdca0f6 100644 > --- a/sequencer.c > +++ b/sequencer.c > @@ -34,6 +34,7 @@ > #include "commit-reach.h" > #include "rebase-interactive.h" > #include "reset.h" > +#include "xdiff-interface.h" > > #define GIT_REFLOG_ACTION "GIT_REFLOG_ACTION" > > @@ -224,6 +225,10 @@ static int git_sequencer_config(const char *k, const char *v, void *cb) > if (status) > return status; > > + status = git_xmerge_config(k, v, NULL); > + if (status) > + return status; > + > return git_diff_basic_config(k, v, NULL); > } > > diff --git a/t/t6440-config-conflict-markers.sh b/t/t6440-config-conflict-markers.sh > index 44f79ac91b..485ad0eee0 100755 > --- a/t/t6440-config-conflict-markers.sh > +++ b/t/t6440-config-conflict-markers.sh > @@ -89,4 +89,35 @@ test_expect_success 'notes' ' > ) > ' > > +test_expect_success 'checkout' ' > + test_create_repo checkout && > + ( > + test_commit checkout && > + > + fill a b c d e >content && > + git add content && > + git commit -m initial && > + > + git checkout -b simple master && > + fill a c e >content && > + git commit -a -m simple && > + > + fill b d >content && > + git checkout --merge master && > + ! grep -E "\|+" content && > + > + git config merge.conflictstyle merge && > + > + git checkout -f simple && > + fill b d >content && > + git checkout --merge --conflict=diff3 master && > + grep -E "\|+" content && > + > + git checkout -f simple && > + fill b d >content && > + git checkout --merge --conflict=merge master && > + ! grep -E "\|+" content > + ) > +' > + > test_done >