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

Signed-off-by: David Aguilar <dav...@gmail.com>
---
filter_tools renamed to show_tool_names() and simplfied
to use ls -1.  show_tool_names() now has a preamble as discussed.

 git-mergetool--lib.sh | 68 +++++++++++++++++++++++++++++----------------------
 1 file changed, 39 insertions(+), 29 deletions(-)

diff --git a/git-mergetool--lib.sh b/git-mergetool--lib.sh
index db3eb58..fe068f6 100644
--- a/git-mergetool--lib.sh
+++ b/git-mergetool--lib.sh
@@ -2,6 +2,35 @@
 # 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
+}
+
+show_tool_names () {
+       condition=${1:-true} per_line_prefix=${2:-} preamble=${3:-}
+
+       ( cd "$MERGE_TOOLS_DIR" && ls -1 * ) |
+       while read toolname
+       do
+               if setup_tool "$toolname" 2>/dev/null &&
+                       (eval "$condition" "$toolname")
+               then
+                       if test -n "$preamble"
+                       then
+                               echo "$preamble"
+                               preamble=
+                       fi
+                       printf "%s%s\n" "$per_line_prefix" "$tool"
+               fi
+       done
+}
+
 diff_mode() {
        test "$TOOL_MODE" = diff
 }
@@ -199,35 +228,21 @@ 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
+       tool_opt="'git ${TOOL_MODE}tool --tool-<tool>'"
+       available=$(show_tool_names 'mode_ok && is_available' '\t\t' \
+               "$tool_opt may be set to one of the following:")
+       unavailable=$(show_tool_names 'mode_ok && ! is_available' '\t\t' \
+               "The following tools are valid, but not currently available:")
        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/^/ /'
+               echo "$available"
        else
                echo "No suitable tool for 'git $cmd_name --tool=<tool>' found."
        fi
        if test -n "$unavailable"
        then
                echo
-               echo 'The following tools are valid, but not currently 
available:'
-               echo "$unavailable" | sort | sed -e 's/^/       /'
+               echo "$unavailable"
        fi
        if test -n "$unavailable$available"
        then
@@ -248,17 +263,12 @@ See 'git ${TOOL_MODE}tool --tool-help' or 'git help 
config' for more details.
 $tools
 EOF
        # 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.g3ff16bb

--
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