summaryrefslogtreecommitdiff
path: root/rc
diff options
context:
space:
mode:
authorJohannes Altmanninger <aclopte@gmail.com>2024-01-25 00:57:00 +0100
committerMaxime Coste <mawww@kakoune.org>2024-01-26 09:55:52 +1100
commit11e7e2964c9aa80db28fb2bc335e0d43044ea233 (patch)
tree36644482f2b0ff30546a9de40ad71129a9f4f4ba /rc
parentc7eeb0ead5d35b3dac6feb7ce51ef33304ba792d (diff)
rc tools patch: skip patch message signature, fixing diff application
Patches as produced by "git format-patch" have a trailing signature that is separated from the body by a line with "-- " on it. By default it contains the Git version. We erroneously include this signature in the diff we pipe to patch, which fails to apply as a result. Add a targeted fix to suppress these signatures.
Diffstat (limited to 'rc')
-rwxr-xr-xrc/tools/patch-range.pl18
1 files changed, 16 insertions, 2 deletions
diff --git a/rc/tools/patch-range.pl b/rc/tools/patch-range.pl
index b3c3dc91..978f45c3 100755
--- a/rc/tools/patch-range.pl
+++ b/rc/tools/patch-range.pl
@@ -25,6 +25,8 @@ my $state = undef;
my $hunk_wheat = undef;
my $hunk_chaff = undef;
my $hunk_header = undef;
+my $hunk_remaining_lines = undef;
+my $signature = "";
sub compute_hunk_header {
my $original_header = shift;
@@ -48,7 +50,7 @@ sub finish_hunk {
}
$wheat .= (compute_hunk_header $hunk_header, $hunk_wheat). $hunk_wheat;
}
- $chaff .= (compute_hunk_header $hunk_header, $hunk_chaff) . $hunk_chaff;
+ $chaff .= (compute_hunk_header $hunk_header, $hunk_chaff) . $hunk_chaff . $signature;
$hunk_header = undef;
}
@@ -60,12 +62,18 @@ while (<STDIN>) {
$state = "diff header";
$diff_header = "";
}
- if (m{^@@}) {
+ if ($state eq "signature") {
+ $signature .= $_;
+ next;
+ }
+ if (m{^@@ -\d+(?:,(\d)+)? \+\d+(?:,\d+)? @@}) {
+ $hunk_remaining_lines = $1 or 1;
finish_hunk();
$state = "diff hunk";
$hunk_header = $_;
$hunk_wheat = "";
$hunk_chaff = "";
+ $signature = "";
next;
}
if ($state eq "diff header") {
@@ -73,6 +81,12 @@ while (<STDIN>) {
$chaff .= $_;
next;
}
+ if ($hunk_remaining_lines == 0 and m{^-- $}) {
+ $state = "signature";
+ $signature .= $_;
+ next;
+ }
+ --$hunk_remaining_lines if m{^[ -]};
my $include = m{^ } || ($lineno >= $min_line && $lineno <= $max_line);
if ($include) {
$hunk_wheat .= $_;