diff options
| author | Johannes Altmanninger <aclopte@gmail.com> | 2024-01-25 00:57:00 +0100 |
|---|---|---|
| committer | Maxime Coste <mawww@kakoune.org> | 2024-01-26 09:55:52 +1100 |
| commit | 11e7e2964c9aa80db28fb2bc335e0d43044ea233 (patch) | |
| tree | 36644482f2b0ff30546a9de40ad71129a9f4f4ba /rc | |
| parent | c7eeb0ead5d35b3dac6feb7ce51ef33304ba792d (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-x | rc/tools/patch-range.pl | 18 |
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 .= $_; |
