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 | |
| 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.
| -rwxr-xr-x | rc/tools/patch-range.pl | 18 | ||||
| -rw-r--r-- | test/tools/patch/signature/cmd | 1 | ||||
| -rw-r--r-- | test/tools/patch/signature/in | 10 | ||||
| -rw-r--r-- | test/tools/patch/signature/out | 20 | ||||
| -rw-r--r-- | test/tools/patch/signature/rc | 1 |
5 files changed, 48 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 .= $_; diff --git a/test/tools/patch/signature/cmd b/test/tools/patch/signature/cmd new file mode 100644 index 00000000..2b5ac0b6 --- /dev/null +++ b/test/tools/patch/signature/cmd @@ -0,0 +1 @@ +%:patch tee applied.diff<ret><ret>!echo Applied:; cat applied.diff; echo; echo Updated buffer:<ret> diff --git a/test/tools/patch/signature/in b/test/tools/patch/signature/in new file mode 100644 index 00000000..acceecf7 --- /dev/null +++ b/test/tools/patch/signature/in @@ -0,0 +1,10 @@ +diff -ur a/file1 b/file1 +--- a/file1 ++++ b/file1 +@@ -1,3 +1,3 @@ + context +-file1 here ++modified file1 here + context +-- +2.43.0 diff --git a/test/tools/patch/signature/out b/test/tools/patch/signature/out new file mode 100644 index 00000000..3c4120f3 --- /dev/null +++ b/test/tools/patch/signature/out @@ -0,0 +1,20 @@ +Applied: +diff -ur a/file1 b/file1 +--- a/file1 ++++ b/file1 +@@ -1,3 +1,3 @@ + context +-file1 here ++modified file1 here + context + +Updated buffer: +diff -ur a/file1 b/file1 +--- a/file1 ++++ b/file1 +@@ -1,3 +1,3 @@ + context + modified file1 here + context +-- +2.43.0 diff --git a/test/tools/patch/signature/rc b/test/tools/patch/signature/rc new file mode 100644 index 00000000..62ee8585 --- /dev/null +++ b/test/tools/patch/signature/rc @@ -0,0 +1 @@ +source "%val{runtime}/rc/tools/patch.kak" |
