]>
Commit | Line | Data |
---|---|---|
5c38ea31 | 1 | #!/usr/bin/env perl |
f47f1e2c | 2 | # Copyright (c) 2009, 2010 David Aguilar |
5c38ea31 DA |
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 | ||
d48b2841 | 13 | use 5.008; |
5c38ea31 DA |
14 | use strict; |
15 | use warnings; | |
16 | use Cwd qw(abs_path); | |
17 | use File::Basename qw(dirname); | |
18 | ||
4cefa495 DA |
19 | require Git; |
20 | ||
5c38ea31 DA |
21 | my $DIR = abs_path(dirname($0)); |
22 | ||
23 | ||
24 | sub usage | |
25 | { | |
26 | print << 'USAGE'; | |
f47f1e2c DA |
27 | usage: git difftool [-t|--tool=<tool>] [-x|--extcmd=<cmd>] |
28 | [-y|--no-prompt] [-g|--gui] | |
29 | ['git diff' options] | |
5c38ea31 DA |
30 | USAGE |
31 | exit 1; | |
32 | } | |
33 | ||
34 | sub setup_environment | |
35 | { | |
36 | $ENV{PATH} = "$DIR:$ENV{PATH}"; | |
37 | $ENV{GIT_PAGER} = ''; | |
afcbc8e7 | 38 | $ENV{GIT_EXTERNAL_DIFF} = 'git-difftool--helper'; |
5c38ea31 DA |
39 | } |
40 | ||
41 | sub exe | |
42 | { | |
43 | my $exe = shift; | |
46ae156d DA |
44 | if ($^O eq 'MSWin32' || $^O eq 'msys') { |
45 | return "$exe.exe"; | |
46 | } | |
47 | return $exe; | |
5c38ea31 DA |
48 | } |
49 | ||
50 | sub generate_command | |
51 | { | |
52 | my @command = (exe('git'), 'diff'); | |
53 | my $skip_next = 0; | |
54 | my $idx = -1; | |
55 | for my $arg (@ARGV) { | |
56 | $idx++; | |
57 | if ($skip_next) { | |
58 | $skip_next = 0; | |
59 | next; | |
60 | } | |
46ae156d | 61 | if ($arg eq '-t' || $arg eq '--tool') { |
5c38ea31 | 62 | usage() if $#ARGV <= $idx; |
2464456a | 63 | $ENV{GIT_DIFF_TOOL} = $ARGV[$idx + 1]; |
5c38ea31 DA |
64 | $skip_next = 1; |
65 | next; | |
66 | } | |
67 | if ($arg =~ /^--tool=/) { | |
2464456a | 68 | $ENV{GIT_DIFF_TOOL} = substr($arg, 7); |
5c38ea31 DA |
69 | next; |
70 | } | |
f47f1e2c DA |
71 | if ($arg eq '-x' || $arg eq '--extcmd') { |
72 | usage() if $#ARGV <= $idx; | |
73 | $ENV{GIT_DIFFTOOL_EXTCMD} = $ARGV[$idx + 1]; | |
74 | $skip_next = 1; | |
75 | next; | |
76 | } | |
77 | if ($arg =~ /^--extcmd=/) { | |
78 | $ENV{GIT_DIFFTOOL_EXTCMD} = substr($arg, 9); | |
79 | next; | |
80 | } | |
4cefa495 | 81 | if ($arg eq '-g' || $arg eq '--gui') { |
42accaec DA |
82 | eval { |
83 | my $tool = Git::command_oneline('config', | |
84 | 'diff.guitool'); | |
85 | if (length($tool)) { | |
86 | $ENV{GIT_DIFF_TOOL} = $tool; | |
87 | } | |
88 | }; | |
4cefa495 DA |
89 | next; |
90 | } | |
8b733222 | 91 | if ($arg eq '-y' || $arg eq '--no-prompt') { |
5c38ea31 | 92 | $ENV{GIT_DIFFTOOL_NO_PROMPT} = 'true'; |
a904392e DA |
93 | delete $ENV{GIT_DIFFTOOL_PROMPT}; |
94 | next; | |
95 | } | |
96 | if ($arg eq '--prompt') { | |
97 | $ENV{GIT_DIFFTOOL_PROMPT} = 'true'; | |
98 | delete $ENV{GIT_DIFFTOOL_NO_PROMPT}; | |
5c38ea31 DA |
99 | next; |
100 | } | |
8b733222 | 101 | if ($arg eq '-h' || $arg eq '--help') { |
5c38ea31 DA |
102 | usage(); |
103 | } | |
104 | push @command, $arg; | |
105 | } | |
106 | return @command | |
107 | } | |
108 | ||
109 | setup_environment(); | |
677fbff8 AR |
110 | |
111 | # ActiveState Perl for Win32 does not implement POSIX semantics of | |
112 | # exec* system call. It just spawns the given executable and finishes | |
113 | # the starting program, exiting with code 0. | |
114 | # system will at least catch the errors returned by git diff, | |
115 | # allowing the caller of git difftool better handling of failures. | |
e8d11804 AR |
116 | my $rc = system(generate_command()); |
117 | exit($rc | ($rc >> 8)); |