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

Re: [PATCH v3 13/13] mergetool: fix running in subdir when rerere enabled

From
Junio C Hamano <gitster@pobox.com>
Date
Jan 9, 2017, 19:05 UTC
Message-ID
<xmqqvatot5ob.fsf@gitster.mtv.corp.google.com>
In-Reply-To
<xmqq4m18ump1.fsf@gitster.mtv.corp.google.com>
Junio C Hamano <gitster@pobox.com> writes:
> I wonder if it makes more sense to always move to toplevel upfront
> and consistently use path from the toplevel, perhaps like the patch
s/the patch/the attached patch/ I meant.
Show 9 quoted lines
> does.  The first hunk is what you wrote but only inside MERGE_RR
> block, and the second hunk deals with converting end-user supplied
> paths that are relative to the original relative to the top-level.
>
> The tweaking of $orderfile you have in the first hunk may have to be
> tightened mimicking the way how "eval ... --sq ... ; shift" is used
> in the second hunk to avoid confusion in case orderfile specified by
> the end user happens to be the same as a valid revname
> (e.g. "master").
And here is a squash-able patch to illustrate what I mean.

I removed both of the comment blocks as the code always works with the worktree-relative pathname after this patch while adjusting end-user supplied paths from relative to original cwd. As that is how the core parts of the system (including the parts written in C) work, even though an explanation you did in the log message is needed to explain why the change was needed and what the change intended to do to readers of "git log", it is not necessary to explain it to the readers of the latest code, which is what the in-code comment is about.

The single-liner addition to the test creates a branch whose name is the same as the specified orderfile to deliberately create a confusing situation. I haven't tried, but I am fairly sure that the test will demonstrate how broken the orderfile=$(...) in the original is, if you apply the test part of the attached patch, without the changes to git-mergetool.sh, to your version.

diff --git a/git-mergetool.sh b/git-mergetool.sh
index 22f56c25a2..21f82d5b58 100755
--- a/git-mergetool.sh
+++ b/git-mergetool.sh
@@ -454,53 +454,34 @@ main () {
 	merge_keep_backup="$(git config --bool mergetool.keepBackup || echo true)"
 	merge_keep_temporaries="$(git config --bool mergetool.keepTemporaries || echo false)"
 
-	if test $# -eq 0 && test -e "$GIT_DIR/MERGE_RR"
+	prefix=$(git rev-parse --show-prefix) || exit 1
+	cd_to_toplevel
+
+	if test -n "$orderfile"
 	then
-		# The pathnames output by the 'git rerere remaining'
-		# command below are relative to the top-level
-		# directory but the 'git diff --name-only' command
-		# further below expects the pathnames to be relative
-		# to the current working directory.  Thus, we cd to
-		# the top-level directory before running 'git diff
-		# --name-only'.  We change directories even earlier
-		# (before running 'git rerere remaining') in case 'git
-		# rerere remaining' is ever changed to output
-		# pathnames relative to the current working directory.
-		#
-		# Changing directories breaks a relative $orderfile
-		# pathname argument, so fix it up to be relative to
-		# the top-level directory.
-
-		prefix=$(git rev-parse --show-prefix) || exit 1
-		cd_to_toplevel
-		if test -n "$orderfile"
-		then
-			orderfile=$(git rev-parse --prefix "$prefix" "$orderfile") || exit 1
-		fi
+		orderfile=$(
+			git rev-parse --prefix "$prefix" -- "$orderfile" |
+			sed -e 1d
+		)
+	fi
 
+	if test $# -eq 0 && test -e "$GIT_DIR/MERGE_RR"
+	then
 		set -- $(git rerere remaining)
 		if test $# -eq 0
 		then
 			print_noop_and_exit
 		fi
+	elif test $# -ge 0
+	then
+		eval "set -- $(git rev-parse --sq --prefix "$prefix" -- "$@")"
+		shift
 	fi
 
-	# Note:  The pathnames output by 'git diff --name-only' are
-	# relative to the top-level directory, but it expects input
-	# pathnames to be relative to the current working directory.
-	# Thus:
-	#   * Either cd_to_toplevel must not be run before this or all
-	#     relative input pathnames must be converted to be
-	#     relative to the top-level directory (or absolute).
-	#   * Either cd_to_toplevel must be run after this or all
-	#     relative output pathnames must be converted to be
-	#     relative to the current working directory (or absolute).
 	files=$(git -c core.quotePath=false \
 		diff --name-only --diff-filter=U \
 		${orderfile:+"-O$orderfile"} -- "$@")
 
-	cd_to_toplevel
-
 	if test -z "$files"
 	then
 		print_noop_and_exit
diff --git a/t/t7610-mergetool.sh b/t/t7610-mergetool.sh
index dfd641d34b..180dd7057a 100755
--- a/t/t7610-mergetool.sh
+++ b/t/t7610-mergetool.sh
@@ -678,6 +678,11 @@ test_expect_success 'diff.orderFile configuration is honored' '
 		b
 		a
 	EOF
+
+	# make sure "order-file" that is ambiguous between
+	# rev and path is understood correctly.
+	git branch order-file HEAD &&
+
 	git mergetool --no-prompt --tool myecho >output &&
 	git grep --no-index -h -A2 Merging: output >actual &&
 	test_cmp expect actual
Previous: Junio C HamanoNext: Johannes Sixt
Message 30 of 76 in “fix mergetool+rerere+subdir regression”
  1. 0/4 fix mergetool+rerere+subdir regressionRichard Hansen, Jan 4, 2017
  2. 2/4 t7610: make tests more independent and debuggableRichard Hansen, Jan 4, 2017
  3. Stefan BellerJan 4, 2017
  4. Richard HansenJan 5, 2017
  5. Richard HansenJan 5, 2017
  6. Simon RuderichJan 5, 2017
  7. Richard HansenJan 5, 2017
  8. 3/4 t7610: add test case for rerere+mergetool+subdir bugRichard Hansen, Jan 4, 2017
  9. 1/4 t7610: update branch names to match test numberRichard Hansen, Jan 4, 2017
  10. 4/4 mergetool: fix running in subdir when rerere enabledRichard Hansen, Jan 4, 2017
  11. 0/4 fix mergetool+rerere+subdir regressionRichard Hansen, Jan 6, 2017
  12. 4/4 mergetool: fix running in subdir when rerere enabledRichard Hansen, Jan 6, 2017
  13. Johannes SixtJan 6, 2017
  14. Richard HansenJan 7, 2017
  15. 3/4 t7610: add test case for rerere+mergetool+subdir bugRichard Hansen, Jan 6, 2017
  16. 1/4 t7610: update branch names to match test numberRichard Hansen, Jan 6, 2017
  17. 2/4 t7610: make tests more independent and debuggableRichard Hansen, Jan 6, 2017
  18. Stefan BellerJan 6, 2017
  19. Richard HansenJan 7, 2017
  20. 00/13 fix mergetool+rerere+subdir regressionRichard Hansen, Jan 9, 2017
  21. 01/13 .mailmap: Use my personal email address as my canonicalRichard Hansen, Jan 9, 2017
  22. 05/13 t7610: don't rely on state from previous testRichard Hansen, Jan 9, 2017
  23. 06/13 t7610: run 'git reset --hard' after each test to clean upRichard Hansen, Jan 9, 2017
  24. 03/13 t7610: Move setup code to the 'setup' test case.Richard Hansen, Jan 9, 2017
  25. 04/13 t7610: use test_when_finished for cleanup tasksRichard Hansen, Jan 9, 2017
  26. 07/13 t7610: delete some now-unnecessary 'git reset --hard' linesRichard Hansen, Jan 9, 2017
  27. 08/13 t7610: always work on a test-specific branchRichard Hansen, Jan 9, 2017
  28. 13/13 mergetool: fix running in subdir when rerere enabledRichard Hansen, Jan 9, 2017
  29. Junio C HamanoJan 9, 2017
  30. Junio C HamanoJan 9, 2017
  31. Johannes SixtJan 9, 2017
  32. Richard HansenJan 9, 2017
  33. Junio C HamanoJan 9, 2017
  34. Junio C HamanoJan 9, 2017
  35. Richard HansenJan 9, 2017
  36. 09/13 t7610: don't assume the checked-out commitRichard Hansen, Jan 9, 2017
  37. 12/13 mergetool: take the "-O" out of $orderfileRichard Hansen, Jan 9, 2017
  38. 11/13 t7610: add test case for rerere+mergetool+subdir bugRichard Hansen, Jan 9, 2017
  39. 10/13 t7610: spell 'git reset --hard' consistentlyRichard Hansen, Jan 9, 2017
  40. 02/13 t7610: update branch names to match test numberRichard Hansen, Jan 9, 2017
  41. Stefan BellerJan 9, 2017
  42. 00/14 fix mergetool+rerere+subdir regressionRichard Hansen, Jan 9, 2017
  43. 01/14 .mailmap: Use my personal email address as my canonicalRichard Hansen, Jan 9, 2017
  44. 02/14 rev-parse doc: use "--" in the --prefix exampleRichard Hansen, Jan 9, 2017
  45. 04/14 t7610: Move setup code to the 'setup' test case.Richard Hansen, Jan 9, 2017
  46. 05/14 t7610: use test_when_finished for cleanup tasksRichard Hansen, Jan 9, 2017
  47. 08/14 t7610: delete some now-unnecessary 'git reset --hard' linesRichard Hansen, Jan 9, 2017
  48. 10/14 t7610: don't assume the checked-out commitRichard Hansen, Jan 9, 2017
  49. 13/14 mergetool: take the "-O" out of $orderfileRichard Hansen, Jan 9, 2017
  50. 11/14 t7610: spell 'git reset --hard' consistentlyRichard Hansen, Jan 9, 2017
  51. 14/14 mergetool: fix running in subdir when rerere enabledRichard Hansen, Jan 9, 2017
  52. Johannes SixtJan 10, 2017
  53. Richard HansenJan 10, 2017
  54. Junio C HamanoJan 10, 2017
  55. Johannes SixtJan 10, 2017
  56. 12/14 t7610: add test case for rerere+mergetool+subdir bugRichard Hansen, Jan 9, 2017
  57. 09/14 t7610: always work on a test-specific branchRichard Hansen, Jan 9, 2017
  58. 07/14 t7610: run 'git reset --hard' after each test to clean upRichard Hansen, Jan 9, 2017
  59. 06/14 t7610: don't rely on state from previous testRichard Hansen, Jan 9, 2017
  60. 03/14 t7610: update branch names to match test numberRichard Hansen, Jan 9, 2017
  61. 00/14 fix mergetool+rerere+subdir regressionRichard Hansen, Jan 10, 2017
  62. 01/14 .mailmap: Use my personal email address as my canonicalRichard Hansen, Jan 10, 2017
  63. 09/14 t7610: always work on a test-specific branchRichard Hansen, Jan 10, 2017
  64. 11/14 t7610: spell 'git reset --hard' consistentlyRichard Hansen, Jan 10, 2017
  65. 10/14 t7610: don't assume the checked-out commitRichard Hansen, Jan 10, 2017
  66. 12/14 t7610: add test case for rerere+mergetool+subdir bugRichard Hansen, Jan 10, 2017
  67. 13/14 mergetool: take the "-O" out of $orderfileRichard Hansen, Jan 10, 2017
  68. 14/14 mergetool: fix running in subdir when rerere enabledRichard Hansen, Jan 10, 2017
  69. 08/14 t7610: delete some now-unnecessary 'git reset --hard' linesRichard Hansen, Jan 10, 2017
  70. 07/14 t7610: run 'git reset --hard' after each test to clean upRichard Hansen, Jan 10, 2017
  71. 06/14 t7610: don't rely on state from previous testRichard Hansen, Jan 10, 2017
  72. 05/14 t7610: use test_when_finished for cleanup tasksRichard Hansen, Jan 10, 2017
  73. 04/14 t7610: Move setup code to the 'setup' test case.Richard Hansen, Jan 10, 2017
  74. 03/14 t7610: update branch names to match test numberRichard Hansen, Jan 10, 2017
  75. 02/14 rev-parse doc: pass "--" to rev-parse in the --prefix exampleRichard Hansen, Jan 10, 2017
  76. David AguilarJan 10, 2017

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.