Re: [PATCH 4/7] checkout: fix merge.conflictstyle handling

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 <felipe.contreras@xxxxxxxxx>
---
  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 <base>... -- <head> <remote> ...";
@@ -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




[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux