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.
This commit is contained in:
parent
c7eeb0ead5
commit
11e7e2964c
|
@ -25,6 +25,8 @@ my $state = undef;
|
||||||
my $hunk_wheat = undef;
|
my $hunk_wheat = undef;
|
||||||
my $hunk_chaff = undef;
|
my $hunk_chaff = undef;
|
||||||
my $hunk_header = undef;
|
my $hunk_header = undef;
|
||||||
|
my $hunk_remaining_lines = undef;
|
||||||
|
my $signature = "";
|
||||||
|
|
||||||
sub compute_hunk_header {
|
sub compute_hunk_header {
|
||||||
my $original_header = shift;
|
my $original_header = shift;
|
||||||
|
@ -48,7 +50,7 @@ sub finish_hunk {
|
||||||
}
|
}
|
||||||
$wheat .= (compute_hunk_header $hunk_header, $hunk_wheat). $hunk_wheat;
|
$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;
|
$hunk_header = undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,12 +62,18 @@ while (<STDIN>) {
|
||||||
$state = "diff header";
|
$state = "diff header";
|
||||||
$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();
|
finish_hunk();
|
||||||
$state = "diff hunk";
|
$state = "diff hunk";
|
||||||
$hunk_header = $_;
|
$hunk_header = $_;
|
||||||
$hunk_wheat = "";
|
$hunk_wheat = "";
|
||||||
$hunk_chaff = "";
|
$hunk_chaff = "";
|
||||||
|
$signature = "";
|
||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
if ($state eq "diff header") {
|
if ($state eq "diff header") {
|
||||||
|
@ -73,6 +81,12 @@ while (<STDIN>) {
|
||||||
$chaff .= $_;
|
$chaff .= $_;
|
||||||
next;
|
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);
|
my $include = m{^ } || ($lineno >= $min_line && $lineno <= $max_line);
|
||||||
if ($include) {
|
if ($include) {
|
||||||
$hunk_wheat .= $_;
|
$hunk_wheat .= $_;
|
||||||
|
|
1
test/tools/patch/signature/cmd
Normal file
1
test/tools/patch/signature/cmd
Normal file
|
@ -0,0 +1 @@
|
||||||
|
%:patch tee applied.diff<ret><ret>!echo Applied:; cat applied.diff; echo; echo Updated buffer:<ret>
|
10
test/tools/patch/signature/in
Normal file
10
test/tools/patch/signature/in
Normal file
|
@ -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
|
20
test/tools/patch/signature/out
Normal file
20
test/tools/patch/signature/out
Normal file
|
@ -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
|
1
test/tools/patch/signature/rc
Normal file
1
test/tools/patch/signature/rc
Normal file
|
@ -0,0 +1 @@
|
||||||
|
source "%val{runtime}/rc/tools/patch.kak"
|
Loading…
Reference in New Issue
Block a user