From: Tim Henigan Date: Fri, 23 Mar 2012 18:26:32 GMT Subject: Re: [PATCH] difftool: print list of valid tools with '--tool-help' Message-ID: In-Reply-To: <7v8vj1ihcn.fsf@alter.siamese.dyndns.org> On Thu, Mar 15, 2012 at 7:18 PM, Junio C Hamano wrote: > Tim Henigan writes: > > As this topic to show list of tools dynamically has plenty of time to be > in the mainline (it will be post 1.7.10), I would suggest a follow-up > series to this patch to do things like the following (just thinking > aloud): > >  - define a new entry point to these mergetools/ scriptlets, let's call >   it "cando".  An entry for mergetools/kompare might look like this: > >        cando () { >                type kompare >/dev/null && test -n "$DISPLAY" >        } > >   that would yield true only when kompare is available and $DISPLAY is >   set. > >  - instead of dumping everything in $gitpath/mergetools/*, check if each >   tool says it can be used in the user's environment. I experimented with this a bit and came up with the following idea (not protected for GMail whitespace mangling): # The following is to be added to 'git-difftool.perl' sub print_tool_help { my ($cmd, @found, @notfound); my $gitpath = Git::exec_path(); for (glob "$gitpath/mergetools/*") { my $tool = basename($_); next if ($tool eq "defaults"); $cmd = '. "$(git --exec-path)/git-mergetool--lib"'; $cmd .= " && get_merge_tool_path $tool >/dev/null 2>&1"; if (system('sh', '-c', $cmd) == 0) { push(@found, $tool); } else { push(@notfound, $tool); } } print "'git difftool --tool=' may be set to one of the following:\n"; print "\t$_\n" for (@found); print "\nThe following are valid tools, but not currently installed:\n"; print "\t$_\n" for (@notfound); exit(0); } Rather than create a new entry point, I used the existing 'get_merge_tool_path' that resides in 'git-mergetool--lib' to determine if a given tool is actually installed on the system. The '$DISPLAY' variable is lost in this implementation, but honestly I don't understand how it was intended to be used. Does this look useful?