summaryrefslogtreecommitdiff
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
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.
-rwxr-xr-xrc/tools/patch-range.pl18
-rw-r--r--test/tools/patch/signature/cmd1
-rw-r--r--test/tools/patch/signature/in10
-rw-r--r--test/tools/patch/signature/out20
-rw-r--r--test/tools/patch/signature/rc1
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"