git add -i: Fix parsing of abbreviated hunk headers
The unified diff format allows one-line ranges to be abbreviated by omiting the size. The hunk header "@@ -10,1 +10,1 @@" can be expressed as "@@ -10 +10 @@", but this wasn't properly parsed in all cases. Such abbreviated hunk headers are generated when a one-line change (add, remove or modify) appears without context; for example because the file is a one-liner itself or because GIT_DIFF_OPTS was set to '-u0'. If the user then runs 'git add -i' and enters the 'patch' command for that file, perl complains about undefined variables. Signed-off-by: Jean-Luc Herren <jlh@gmx.ch> Signed-off-by: Lars Hjemli <hjemli@gmail.com> Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
This commit is contained in:
parent
a72c874e43
commit
7288ed8ebd
@ -360,7 +360,9 @@ sub hunk_splittable {
|
||||
sub parse_hunk_header {
|
||||
my ($line) = @_;
|
||||
my ($o_ofs, $o_cnt, $n_ofs, $n_cnt) =
|
||||
$line =~ /^@@ -(\d+)(?:,(\d+)) \+(\d+)(?:,(\d+)) @@/;
|
||||
$line =~ /^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/;
|
||||
$o_cnt = 1 unless defined $o_cnt;
|
||||
$n_cnt = 1 unless defined $n_cnt;
|
||||
return ($o_ofs, $o_cnt, $n_ofs, $n_cnt);
|
||||
}
|
||||
|
||||
@ -705,9 +707,6 @@ sub patch_update_cmd {
|
||||
parse_hunk_header($text->[0]);
|
||||
|
||||
if (!$_->{USE}) {
|
||||
if (!defined $o_cnt) { $o_cnt = 1; }
|
||||
if (!defined $n_cnt) { $n_cnt = 1; }
|
||||
|
||||
# We would have added ($n_cnt - $o_cnt) lines
|
||||
# to the postimage if we were to use this hunk,
|
||||
# but we didn't. So the line number that the next
|
||||
@ -719,10 +718,10 @@ sub patch_update_cmd {
|
||||
if ($n_lofs) {
|
||||
$n_ofs += $n_lofs;
|
||||
$text->[0] = ("@@ -$o_ofs" .
|
||||
((defined $o_cnt)
|
||||
(($o_cnt != 1)
|
||||
? ",$o_cnt" : '') .
|
||||
" +$n_ofs" .
|
||||
((defined $n_cnt)
|
||||
(($n_cnt != 1)
|
||||
? ",$n_cnt" : '') .
|
||||
" @@\n");
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user