diff options
Diffstat (limited to 'rc/tools/patch-range.pl')
| -rwxr-xr-x | rc/tools/patch-range.pl | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/rc/tools/patch-range.pl b/rc/tools/patch-range.pl index 2d54ab26..01611abe 100755 --- a/rc/tools/patch-range.pl +++ b/rc/tools/patch-range.pl @@ -9,6 +9,12 @@ if ($ARGV[0] eq "-print-remaining-diff") { shift @ARGV; } +my $line_number_kind = "diff"; +if ($ARGV[0] eq "-line-numbers-from-new-file") { + $line_number_kind = "new-file"; + shift @ARGV; +} + my $min_line = $ARGV[0]; shift @ARGV; my $max_line = $ARGV[0]; @@ -22,7 +28,7 @@ if (defined $ARGV[0] and $ARGV[0] =~ m{^[^-]}) { } my $reverse = grep /^(--reverse|-R)$/, @ARGV; -my $lineno = 0; +my $lineno = $line_number_kind eq "diff" ? 0 : undef; my $original = ""; my $diff_header = ""; my $wheat = ""; @@ -63,9 +69,9 @@ sub finish_hunk { } while (<STDIN>) { - ++$lineno; + ++$lineno if $line_number_kind eq "diff"; $original .= $_; - if (m{^diff}) { + if (m{^diff} || (not defined $state and m{^---})) { finish_hunk(); $state = "diff header"; $diff_header = ""; @@ -74,7 +80,8 @@ while (<STDIN>) { $signature .= $_ if $print_remaining; next; } - if (m{^@@ -\d+(?:,(\d)+)? \+\d+(?:,\d+)? @@}) { + if (m{^@@ -\d+(?:,(\d)+)? \+(\d+)(?:,\d+)? @@}) { + $lineno = $2 - 1 if $line_number_kind eq "new-file"; $hunk_remaining_lines = $1 or 1; finish_hunk(); $state = "diff hunk"; @@ -96,8 +103,11 @@ while (<STDIN>) { $signature .= $_ if $print_remaining; next; } + ++$lineno if $line_number_kind eq "new-file" && m{^[ +]}; --$hunk_remaining_lines if m{^[ -]}; - my $include = m{^ } || ($lineno >= $min_line && $lineno <= $max_line); + my $include = m{^ } || + ($lineno >= $min_line && $lineno <= $max_line) || + ($line_number_kind eq "new-file" && m{^-} && $lineno == $min_line - 1); if ($include) { $hunk_wheat .= $_; if ($print_remaining) { |
