git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 2/2] merge-file: correctly find files when called in subdir

From
Thomas Rast <trast@student.ethz.ch>
Date
Oct 17, 2010, 19:23 UTC
Message-ID
<d0e540fdced31557e983d7503da3dcb75c622dc9.1287342969.git.trast@student.ethz.ch>
In-Reply-To
<64b470380b8f7bd8afe8f019553cb99f72091c7d.1287342969.git.trast@student.ethz.ch>

Since b541248 (merge.conflictstyle: choose between "merge" and "diff3 -m" styles, 2008-08-29), git-merge-file uses setup_directory_gently(), thus cd'ing around to find any possible config files to use.

This broke merge-file when it is called from within a subdirectory of a repository, and the arguments are all relative paths.

Fix by prepending the prefix, as passed down from the main git setup code, if there is any.

Signed-off-by: Thomas Rast <trast@student.ethz.ch>
---

With the last patch, we can safely pass a zero prefix length to say "there was no prefix".

This is a slight semantic change on Windows, because it now substitutes / for \ in paths, but I suppose that's harmless?

 builtin/merge-file.c  |    7 ++++++-
 t/t6023-merge-file.sh |    8 ++++++++
 2 files changed, 14 insertions(+), 1 deletions(-)
diff --git a/builtin/merge-file.c b/builtin/merge-file.c
index b6664d4..6c4afb5 100644
--- a/builtin/merge-file.c
+++ b/builtin/merge-file.c
@@ -28,6 +28,7 @@ int cmd_merge_file(int argc, const char **argv, const char *prefix)
 	xmparam_t xmp = {{0}};
 	int ret = 0, i = 0, to_stdout = 0;
 	int quiet = 0;
+	int prefixlen = 0;
 	struct option options[] = {
 		OPT_BOOLEAN('p', "stdout", &to_stdout, "send results to standard output"),
 		OPT_SET_INT(0, "diff3", &xmp.style, "use a diff3 based merge", XDL_MERGE_DIFF3),
@@ -65,10 +66,14 @@ int cmd_merge_file(int argc, const char **argv, const char *prefix)
 				     "%s\n", strerror(errno));
 	}
 
+	if (prefix)
+		prefixlen = strlen(prefix);
+
 	for (i = 0; i < 3; i++) {
+		const char *fname = prefix_filename(prefix, prefixlen, argv[i]);
 		if (!names[i])
 			names[i] = argv[i];
-		if (read_mmfile(mmfs + i, argv[i]))
+		if (read_mmfile(mmfs + i, fname))
 			return -1;
 		if (buffer_is_binary(mmfs[i].ptr, mmfs[i].size))
 			return error("Cannot merge binary files: %s\n",
diff --git a/t/t6023-merge-file.sh b/t/t6023-merge-file.sh
index d486d73..d9f3439 100755
--- a/t/t6023-merge-file.sh
+++ b/t/t6023-merge-file.sh
@@ -64,6 +64,14 @@ cp new1.txt test.txt
 test_expect_success "merge without conflict" \
 	"git merge-file test.txt orig.txt new2.txt"
 
+test_expect_success 'works in subdirectory' '
+	mkdir dir &&
+	cp new1.txt dir/a.txt &&
+	cp orig.txt dir/o.txt &&
+	cp new2.txt dir/b.txt &&
+	( cd dir && git merge-file a.txt o.txt b.txt )
+'
+
 cp new1.txt test.txt
 test_expect_success "merge without conflict (--quiet)" \
 	"git merge-file --quiet test.txt orig.txt new2.txt"
-- 
1.7.3.1.266.g3c065
Previous: Thomas RastNext: Jonathan Nieder
Message 7 of 10 in “merge-file: correctly find files when called in subdir”
  1. merge-file: correctly find files when called in subdirThomas Rast, Oct 16, 2010
  2. Bert WesargOct 16, 2010
  3. Jonathan NiederOct 17, 2010
  4. Thomas RastOct 17, 2010
  5. Jonathan NiederOct 17, 2010
  6. 1/2 prefix_filename(): safely handle the case where pfx_len=0Thomas Rast, Oct 17, 2010
  7. 2/2 merge-file: correctly find files when called in subdirThomas Rast, Oct 17, 2010
  8. Jonathan NiederOct 17, 2010
  9. Johannes SixtOct 18, 2010
  10. Jonathan NiederOct 17, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.