From 7c7584b97096a168fe1236c84e5e12d7bee24476 Mon Sep 17 00:00:00 2001 From: David Aguilar Date: Tue, 24 Jul 2012 20:14:22 -0700 Subject: [PATCH] difftool: Handle finding mergetools/ in a path with spaces Use the original File::Find implementation from bf73fc2 (difftool: print list of valid tools with '--tool-help', 2012-03-29) so that we properly handle mergetools/ being located in a path containing spaces. One small difference is that we avoid using a global variable by passing a reference to the list of tools. Signed-off-by: David Aguilar Signed-off-by: Junio C Hamano --- git-difftool.perl | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/git-difftool.perl b/git-difftool.perl index a5b371f729..30574801be 100755 --- a/git-difftool.perl +++ b/git-difftool.perl @@ -13,9 +13,10 @@ use 5.008; use strict; use warnings; -use File::Basename qw(basename dirname); +use File::Basename qw(dirname); use File::Copy; use File::Compare; +use File::Find; use File::stat; use File::Path qw(mkpath); use File::Temp qw(tempdir); @@ -58,13 +59,27 @@ sub find_worktree return $worktree; } +sub filter_tool_scripts +{ + my ($tools) = @_; + if (-d $_) { + if ($_ ne ".") { + # Ignore files in subdirectories + $File::Find::prune = 1; + } + } else { + if ((-f $_) && ($_ ne "defaults")) { + push(@$tools, $_); + } + } +} + sub print_tool_help { - my ($cmd, @found, @notfound); + my ($cmd, @found, @notfound, @tools); my $gitpath = Git::exec_path(); - my @files = map { basename($_) } glob("$gitpath/mergetools/*"); - my @tools = sort(grep { !m{^defaults$} } @files); + find(sub { filter_tool_scripts(\@tools) }, "$gitpath/mergetools"); foreach my $tool (@tools) { $cmd = "TOOL_MODE=diff"; @@ -79,10 +94,10 @@ sub print_tool_help } print "'git difftool --tool=' may be set to one of the following:\n"; - print "\t$_\n" for (@found); + print "\t$_\n" for (sort(@found)); print "\nThe following tools are valid, but not currently available:\n"; - print "\t$_\n" for (@notfound); + print "\t$_\n" for (sort(@notfound)); print "\nNOTE: Some of the tools listed above only work in a windowed\n"; print "environment. If run in a terminal-only session, they will fail.\n"; -- 2.11.4.GIT