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 () { $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 () { $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!echo Applied:; cat applied.diff; echo; echo Updated buffer: 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"