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

Signed-off-by: David Aguilar <dav...@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

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to