7
7
# binary, for any purpose, commercial or non-commercial, and by any
8
8
# means.
9
9
10
+ use List::Util qw( first) ;
11
+
10
12
sub parse_hunk_header {
11
13
my ($line ) = @_ ;
12
14
my ($o_ofs , $o_cnt , $n_ofs , $n_cnt ) =
@@ -27,12 +29,36 @@ $git_root =~ s/^\s+//;
27
29
$git_root =~ s /\s +$// ;
28
30
chdir ($git_root ) or die " $! " ;
29
31
30
- my ($oldrev , $newrev ) = @ARGV ;
31
- $oldrev ||= ' HEAD' ;
32
- if ($newrev ) {
33
- open ($diff , ' -|' , ' git' , ' --no-pager' , ' diff' , $oldrev , $newrev ) or die ;
32
+ my ($oldrev , $newrev , @REST );
33
+
34
+ # First check if file arguments are present.
35
+ my $index = first { $ARGV [$_ ] eq ' --' } 0..$#ARGV ;
36
+ if (defined $index ) {
37
+ ($oldrev , $newrev ) = @ARGV [0 .. $index -1];
38
+ @REST = @ARGV [$index .. $#ARGV ];
39
+ } else {
40
+ ($oldrev , $newrev , @REST ) = @ARGV ;
41
+ }
42
+
43
+ # Then check if any of the revisons accidentally were assigned git diff option values.
44
+ if (defined $newrev && $newrev =~ / ^-/ ) {
45
+ unshift (@REST , $newrev );
46
+ $newrev = undef ;
47
+ }
48
+
49
+ if (defined $oldrev && $oldrev =~ / ^-/ ) {
50
+ unshift (@REST , $oldrev );
51
+ $oldrev = undef ;
52
+ }
53
+
54
+ if (defined $oldrev ) {
55
+ if (defined $newrev ) {
56
+ open ($diff , ' -|' , ' git' , ' --no-pager' , ' diff' , $oldrev , $newrev , @REST ) or die ;
57
+ } else {
58
+ open ($diff , ' -|' , ' git' , ' --no-pager' , ' diff' , $oldrev , @REST ) or die ;
59
+ }
34
60
} else {
35
- open ($diff , ' -|' , ' git' , ' --no-pager' , ' diff' , $oldrev ) or die ;
61
+ open ($diff , ' -|' , ' git' , ' --no-pager' , ' diff' , @REST ) or die ;
36
62
}
37
63
38
64
my ($pre , $post );
@@ -63,8 +89,13 @@ while (<$diff>) {
63
89
my $o_end = $o_ofs + $o_cnt - 1;
64
90
my $n_end = $n_ofs + $n_cnt - 1;
65
91
if (!$create ) {
66
- open ($pre , ' -|' , ' git' , ' blame' , ' -M' , " -L$o_ofs ,$o_end " ,
67
- $oldrev , ' --' , $prefilename ) or die ;
92
+ if ($oldrev ) {
93
+ open ($pre , ' -|' , ' git' , ' blame' , ' -M' , " -L$o_ofs ,$o_end " ,
94
+ $oldrev , ' --' , $prefilename ) or die ;
95
+ } else {
96
+ open ($pre , ' -|' , ' git' , ' blame' , ' -M' , " -L$o_ofs ,$o_end " ,
97
+ ' HEAD' , ' --' , $prefilename ) or die ;
98
+ }
68
99
}
69
100
if (!$delete ) {
70
101
if ($newrev ) {
0 commit comments