]>
Commit | Line | Data |
---|---|---|
5c38ea31 DA |
1 | #!/usr/bin/env perl |
2 | # Copyright (c) 2009 David Aguilar | |
3 | # | |
4 | # This is a wrapper around the GIT_EXTERNAL_DIFF-compatible | |
a904392e DA |
5 | # git-difftool--helper script. |
6 | # | |
7 | # This script exports GIT_EXTERNAL_DIFF and GIT_PAGER for use by git. | |
8 | # GIT_DIFFTOOL_NO_PROMPT, GIT_DIFFTOOL_PROMPT, and GIT_DIFF_TOOL | |
9 | # are exported for use by git-difftool--helper. | |
10 | # | |
5c38ea31 DA |
11 | # Any arguments that are unknown to this script are forwarded to 'git diff'. |
12 | ||
13 | use strict; | |
14 | use warnings; | |
15 | use Cwd qw(abs_path); | |
16 | use File::Basename qw(dirname); | |
17 | ||
18 | my $DIR = abs_path(dirname($0)); | |
19 | ||
20 | ||
21 | sub usage | |
22 | { | |
23 | print << 'USAGE'; | |
8b733222 | 24 | usage: git difftool [--tool=<tool>] [-y|--no-prompt] ["git diff" options] |
5c38ea31 DA |
25 | USAGE |
26 | exit 1; | |
27 | } | |
28 | ||
29 | sub setup_environment | |
30 | { | |
31 | $ENV{PATH} = "$DIR:$ENV{PATH}"; | |
32 | $ENV{GIT_PAGER} = ''; | |
afcbc8e7 | 33 | $ENV{GIT_EXTERNAL_DIFF} = 'git-difftool--helper'; |
5c38ea31 DA |
34 | } |
35 | ||
36 | sub exe | |
37 | { | |
38 | my $exe = shift; | |
46ae156d DA |
39 | if ($^O eq 'MSWin32' || $^O eq 'msys') { |
40 | return "$exe.exe"; | |
41 | } | |
42 | return $exe; | |
5c38ea31 DA |
43 | } |
44 | ||
45 | sub generate_command | |
46 | { | |
47 | my @command = (exe('git'), 'diff'); | |
48 | my $skip_next = 0; | |
49 | my $idx = -1; | |
50 | for my $arg (@ARGV) { | |
51 | $idx++; | |
52 | if ($skip_next) { | |
53 | $skip_next = 0; | |
54 | next; | |
55 | } | |
46ae156d | 56 | if ($arg eq '-t' || $arg eq '--tool') { |
5c38ea31 | 57 | usage() if $#ARGV <= $idx; |
2464456a | 58 | $ENV{GIT_DIFF_TOOL} = $ARGV[$idx + 1]; |
5c38ea31 DA |
59 | $skip_next = 1; |
60 | next; | |
61 | } | |
62 | if ($arg =~ /^--tool=/) { | |
2464456a | 63 | $ENV{GIT_DIFF_TOOL} = substr($arg, 7); |
5c38ea31 DA |
64 | next; |
65 | } | |
8b733222 | 66 | if ($arg eq '-y' || $arg eq '--no-prompt') { |
5c38ea31 | 67 | $ENV{GIT_DIFFTOOL_NO_PROMPT} = 'true'; |
a904392e DA |
68 | delete $ENV{GIT_DIFFTOOL_PROMPT}; |
69 | next; | |
70 | } | |
71 | if ($arg eq '--prompt') { | |
72 | $ENV{GIT_DIFFTOOL_PROMPT} = 'true'; | |
73 | delete $ENV{GIT_DIFFTOOL_NO_PROMPT}; | |
5c38ea31 DA |
74 | next; |
75 | } | |
8b733222 | 76 | if ($arg eq '-h' || $arg eq '--help') { |
5c38ea31 DA |
77 | usage(); |
78 | } | |
79 | push @command, $arg; | |
80 | } | |
81 | return @command | |
82 | } | |
83 | ||
84 | setup_environment(); | |
677fbff8 AR |
85 | |
86 | # ActiveState Perl for Win32 does not implement POSIX semantics of | |
87 | # exec* system call. It just spawns the given executable and finishes | |
88 | # the starting program, exiting with code 0. | |
89 | # system will at least catch the errors returned by git diff, | |
90 | # allowing the caller of git difftool better handling of failures. | |
e8d11804 AR |
91 | my $rc = system(generate_command()); |
92 | exit($rc | ($rc >> 8)); |