difftool: parse options using Getopt::Long
Replace custom option/argument parser with standard Getopt::Long module. This shortens the code and makes it easier to understand. Signed-off-by: Tim Henigan <tim.henigan@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									0987145dd3
								
							
						
					
					
						commit
						3f94ff755e
					
				|  | @ -15,17 +15,15 @@ use strict; | ||||||
| use warnings; | use warnings; | ||||||
| use Cwd qw(abs_path); | use Cwd qw(abs_path); | ||||||
| use File::Basename qw(dirname); | use File::Basename qw(dirname); | ||||||
|  | use Getopt::Long qw(:config pass_through); | ||||||
| require Git; | use Git; | ||||||
|  |  | ||||||
| my $DIR = abs_path(dirname($0)); |  | ||||||
|  |  | ||||||
|  |  | ||||||
| sub usage | sub usage | ||||||
| { | { | ||||||
| 	print << 'USAGE'; | 	print << 'USAGE'; | ||||||
| usage: git difftool [-t|--tool=<tool>] [-x|--extcmd=<cmd>] | usage: git difftool [-t|--tool=<tool>] | ||||||
|                     [-y|--no-prompt]   [-g|--gui] |                     [-x|--extcmd=<cmd>] [-g|--gui] | ||||||
|  |                     [--prompt] [-y|--no-prompt] | ||||||
|                     ['git diff' options] |                     ['git diff' options] | ||||||
| USAGE | USAGE | ||||||
| 	exit 1; | 	exit 1; | ||||||
|  | @ -33,6 +31,7 @@ USAGE | ||||||
|  |  | ||||||
| sub setup_environment | sub setup_environment | ||||||
| { | { | ||||||
|  | 	my $DIR = abs_path(dirname($0)); | ||||||
| 	$ENV{PATH} = "$DIR:$ENV{PATH}"; | 	$ENV{PATH} = "$DIR:$ENV{PATH}"; | ||||||
| 	$ENV{GIT_PAGER} = ''; | 	$ENV{GIT_PAGER} = ''; | ||||||
| 	$ENV{GIT_EXTERNAL_DIFF} = 'git-difftool--helper'; | 	$ENV{GIT_EXTERNAL_DIFF} = 'git-difftool--helper'; | ||||||
|  | @ -47,75 +46,57 @@ sub exe | ||||||
| 	return $exe; | 	return $exe; | ||||||
| } | } | ||||||
|  |  | ||||||
| sub generate_command | # parse command-line options. all unrecognized options and arguments | ||||||
| { | # are passed through to the 'git diff' command. | ||||||
| 	my @command = (exe('git'), 'diff'); | my ($difftool_cmd, $extcmd, $gui, $help, $prompt); | ||||||
| 	my $skip_next = 0; | GetOptions('g|gui' => \$gui, | ||||||
| 	my $idx = -1; | 	'h' => \$help, | ||||||
| 	my $prompt = ''; | 	'prompt!' => \$prompt, | ||||||
| 	for my $arg (@ARGV) { | 	'y' => sub { $prompt = 0; }, | ||||||
| 		$idx++; | 	't|tool:s' => \$difftool_cmd, | ||||||
| 		if ($skip_next) { | 	'x|extcmd:s' => \$extcmd); | ||||||
| 			$skip_next = 0; |  | ||||||
| 			next; | if (defined($help)) { | ||||||
| 		} | 	usage(); | ||||||
| 		if ($arg eq '-t' || $arg eq '--tool') { | } | ||||||
| 			usage() if $#ARGV <= $idx; | if (defined($difftool_cmd)) { | ||||||
| 			$ENV{GIT_DIFF_TOOL} = $ARGV[$idx + 1]; | 	if (length($difftool_cmd) > 0) { | ||||||
| 			$skip_next = 1; | 		$ENV{GIT_DIFF_TOOL} = $difftool_cmd; | ||||||
| 			next; | 	} else { | ||||||
| 		} | 		print "No <tool> given for --tool=<tool>\n"; | ||||||
| 		if ($arg =~ /^--tool=/) { |  | ||||||
| 			$ENV{GIT_DIFF_TOOL} = substr($arg, 7); |  | ||||||
| 			next; |  | ||||||
| 		} |  | ||||||
| 		if ($arg eq '-x' || $arg eq '--extcmd') { |  | ||||||
| 			usage() if $#ARGV <= $idx; |  | ||||||
| 			$ENV{GIT_DIFFTOOL_EXTCMD} = $ARGV[$idx + 1]; |  | ||||||
| 			$skip_next = 1; |  | ||||||
| 			next; |  | ||||||
| 		} |  | ||||||
| 		if ($arg =~ /^--extcmd=/) { |  | ||||||
| 			$ENV{GIT_DIFFTOOL_EXTCMD} = substr($arg, 9); |  | ||||||
| 			next; |  | ||||||
| 		} |  | ||||||
| 		if ($arg eq '-g' || $arg eq '--gui') { |  | ||||||
| 			eval { |  | ||||||
| 				my $tool = Git::command_oneline('config', |  | ||||||
| 				                                'diff.guitool'); |  | ||||||
| 				if (length($tool)) { |  | ||||||
| 					$ENV{GIT_DIFF_TOOL} = $tool; |  | ||||||
| 				} |  | ||||||
| 			}; |  | ||||||
| 			next; |  | ||||||
| 		} |  | ||||||
| 		if ($arg eq '-y' || $arg eq '--no-prompt') { |  | ||||||
| 			$prompt = 'no'; |  | ||||||
| 			next; |  | ||||||
| 		} |  | ||||||
| 		if ($arg eq '--prompt') { |  | ||||||
| 			$prompt = 'yes'; |  | ||||||
| 			next; |  | ||||||
| 		} |  | ||||||
| 		if ($arg eq '-h') { |  | ||||||
| 		usage(); | 		usage(); | ||||||
| 	} | 	} | ||||||
| 		push @command, $arg; | } | ||||||
|  | if (defined($extcmd)) { | ||||||
|  | 	if (length($extcmd) > 0) { | ||||||
|  | 		$ENV{GIT_DIFFTOOL_EXTCMD} = $extcmd; | ||||||
|  | 	} else { | ||||||
|  | 		print "No <cmd> given for --extcmd=<cmd>\n"; | ||||||
|  | 		usage(); | ||||||
| 	} | 	} | ||||||
| 	if ($prompt eq 'yes') { | } | ||||||
|  | if (defined($gui)) { | ||||||
|  | 	my $guitool = ""; | ||||||
|  | 	$guitool = Git::config('diff.guitool'); | ||||||
|  | 	if (length($guitool) > 0) { | ||||||
|  | 		$ENV{GIT_DIFF_TOOL} = $guitool; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | if (defined($prompt)) { | ||||||
|  | 	if ($prompt) { | ||||||
| 		$ENV{GIT_DIFFTOOL_PROMPT} = 'true'; | 		$ENV{GIT_DIFFTOOL_PROMPT} = 'true'; | ||||||
| 	} elsif ($prompt eq 'no') { | 	} else { | ||||||
| 		$ENV{GIT_DIFFTOOL_NO_PROMPT} = 'true'; | 		$ENV{GIT_DIFFTOOL_NO_PROMPT} = 'true'; | ||||||
| 	} | 	} | ||||||
| 	return @command |  | ||||||
| } | } | ||||||
|  |  | ||||||
| setup_environment(); | setup_environment(); | ||||||
|  | my @command = (exe('git'), 'diff', @ARGV); | ||||||
|  |  | ||||||
| # ActiveState Perl for Win32 does not implement POSIX semantics of | # ActiveState Perl for Win32 does not implement POSIX semantics of | ||||||
| # exec* system call. It just spawns the given executable and finishes | # exec* system call. It just spawns the given executable and finishes | ||||||
| # the starting program, exiting with code 0. | # the starting program, exiting with code 0. | ||||||
| # system will at least catch the errors returned by git diff, | # system will at least catch the errors returned by git diff, | ||||||
| # allowing the caller of git difftool better handling of failures. | # allowing the caller of git difftool better handling of failures. | ||||||
| my $rc = system(generate_command()); | my $rc = system(@command); | ||||||
| exit($rc | ($rc >> 8)); | exit($rc | ($rc >> 8)); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Tim Henigan
						Tim Henigan