77# binary, for any purpose, commercial or non-commercial, and by any
88# means.
99
10+ use List::Util qw( first) ;
11+
1012sub parse_hunk_header {
1113 my ($line ) = @_ ;
1214 my ($o_ofs , $o_cnt , $n_ofs , $n_cnt ) =
@@ -27,12 +29,36 @@ $git_root =~ s/^\s+//;
2729$git_root =~ s /\s +$// ;
2830chdir ($git_root ) or die " $! " ;
2931
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+ }
3460} else {
35- open ($diff , ' -|' , ' git' , ' --no-pager' , ' diff' , $oldrev ) or die ;
61+ open ($diff , ' -|' , ' git' , ' --no-pager' , ' diff' , @REST ) or die ;
3662}
3763
3864my ($pre , $post );
@@ -63,8 +89,13 @@ while (<$diff>) {
6389 my $o_end = $o_ofs + $o_cnt - 1;
6490 my $n_end = $n_ofs + $n_cnt - 1;
6591 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+ }
6899 }
69100 if (!$delete ) {
70101 if ($newrev ) {
0 commit comments