summaryrefslogtreecommitdiff
path: root/rc/tools/patch-range.pl
diff options
context:
space:
mode:
Diffstat (limited to 'rc/tools/patch-range.pl')
-rwxr-xr-xrc/tools/patch-range.pl20
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) {