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

[PATCH 3/4] mergetool--lib: Add functions for finding available tools

From
David Aguilar <davvid@gmail.com>
Date
Jan 27, 2013, 21:24 UTC
Message-ID
<1359321886-80523-4-git-send-email-davvid@gmail.com>
In-Reply-To
<1359321886-80523-1-git-send-email-davvid@gmail.com>

Refactor show_tool_help() so that the tool-finding logic is broken out into separate functions.

Signed-off-by: David Aguilar <davvid@gmail.com>
---
 git-mergetool--lib.sh | 60 +++++++++++++++++++++++++++++----------------------
 1 file changed, 34 insertions(+), 26 deletions(-)
diff --git a/git-mergetool--lib.sh b/git-mergetool--lib.sh
index cf52423..894b849 100644
--- a/git-mergetool--lib.sh
+++ b/git-mergetool--lib.sh
@@ -2,6 +2,33 @@
 # git-mergetool--lib is a library for common merge tool functions
 MERGE_TOOLS_DIR=$(git --exec-path)/mergetools
 
+mode_ok () {
+	diff_mode && can_diff ||
+	merge_mode && can_merge
+}
+
+is_available () {
+	merge_tool_path=$(translate_merge_tool_path "$1") &&
+	type "$merge_tool_path" >/dev/null 2>&1
+}
+
+filter_tools () {
+	filter="$1"
+	prefix="$2"
+	(
+		cd "$MERGE_TOOLS_DIR" &&
+		for i in *
+		do
+			echo "$i"
+		done
+	) | sort | while read tool
+	do
+		setup_tool "$tool" 2>/dev/null &&
+		(eval "$filter" "$tool") &&
+		printf "$prefix$tool\n"
+	done
+}
+
 diff_mode() {
 	test "$TOOL_MODE" = diff
 }
@@ -199,27 +226,13 @@ list_merge_tool_candidates () {
 }
 
 show_tool_help () {
-	unavailable= available= LF='
-'
-	for i in "$MERGE_TOOLS_DIR"/*
-	do
-		tool=$(basename "$i")
-		setup_tool "$tool" 2>/dev/null || continue
-
-		merge_tool_path=$(translate_merge_tool_path "$tool")
-		if type "$merge_tool_path" >/dev/null 2>&1
-		then
-			available="$available$tool$LF"
-		else
-			unavailable="$unavailable$tool$LF"
-		fi
-	done
-
 	cmd_name=${TOOL_MODE}tool
+	available=$(filter_tools 'mode_ok && is_available' '\t\t')
+	unavailable=$(filter_tools 'mode_ok && ! is_available' '\t\t')
 	if test -n "$available"
 	then
 		echo "'git $cmd_name --tool=<tool>' may be set to one of the following:"
-		echo "$available" | sort | sed -e 's/^/	/'
+		printf "$available"
 	else
 		echo "No suitable tool for 'git $cmd_name --tool=<tool>' found."
 	fi
@@ -227,7 +240,7 @@ show_tool_help () {
 	then
 		echo
 		echo 'The following tools are valid, but not currently available:'
-		echo "$unavailable" | sort | sed -e 's/^/	/'
+		printf "$unavailable"
 	fi
 	if test -n "$unavailable$available"
 	then
@@ -250,17 +263,12 @@ $tools
 	printf "$msg" >&2
 
 	# Loop over each candidate and stop when a valid merge tool is found.
-	for i in $tools
+	for tool in $tools
 	do
-		merge_tool_path=$(translate_merge_tool_path "$i")
-		if type "$merge_tool_path" >/dev/null 2>&1
-		then
-			echo "$i"
-			return 0
-		fi
+		is_available "$tool" && echo "$tool" && return 0
 	done
 
-	echo >&2 "No known merge resolution program available."
+	echo >&2 "No known ${TOOL_MODE} tool is available."
 	return 1
 }
 
-- 
1.8.0.13.gf25ae33
Previous: Junio C HamanoNext: Johannes Sixt
Message 9 of 18 in “Documentation: Auto-generate merge tool lists”
  1. 0/4 Documentation: Auto-generate merge tool listsDavid Aguilar, Jan 27, 2013
  2. 1/4 mergetool--lib: Simplify command expressionsDavid Aguilar, Jan 27, 2013
  3. Johannes SixtJan 27, 2013
  4. David AguilarJan 27, 2013
  5. Junio C HamanoJan 27, 2013
  6. Junio C HamanoJan 27, 2013
  7. 2/4 mergetool--lib: Improve the help text in guess_merge_tool()David Aguilar, Jan 27, 2013
  8. Junio C HamanoJan 27, 2013
  9. 3/4 mergetool--lib: Add functions for finding available toolsDavid Aguilar, Jan 27, 2013
  10. Johannes SixtJan 27, 2013
  11. Junio C HamanoJan 27, 2013
  12. John KeepingJan 27, 2013
  13. Junio C HamanoJan 27, 2013
  14. David AguilarJan 27, 2013
  15. 4/4 doc: Generate a list of valid merge toolsDavid Aguilar, Jan 27, 2013
  16. Junio C HamanoJan 27, 2013
  17. John KeepingJan 27, 2013
  18. Junio C HamanoJan 27, 2013

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.