Thread (61 messages) flat view 61 messages, 3 authors, 2016-06-15

Re: [GUILT 06/28] Fix and simplify the do_get_patch function.

From: Per Cederqvist <hidden>
Date: 2016-06-15 23:00:25

On Sun, Mar 23, 2014 at 6:09 PM, Jeff Sipek [off-list ref] wrote:
On Fri, Mar 21, 2014 at 08:31:44AM +0100, Per Cederqvist wrote:
quoted
When extracting the patch, we only want the actual patches.  We don't
want the "---" delimiter.  Simplify the extraction by simply deleting
everything before the first "diff " line.  (Use sed instead of awk to
simplify the code.)

Without this patch, "guilt fold" and "guilt push" sometimes fails if
guilt.diffstat is true.

Signed-off-by: Per Cederqvist <redacted>
---
 guilt | 7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)
diff --git a/guilt b/guilt
index 8701481..c59cd0f 100755
--- a/guilt
+++ b/guilt
@@ -332,12 +332,7 @@ do_make_header()
 # usage: do_get_patch patchfile
 do_get_patch()
 {
-     awk '
-BEGIN{}
-/^(diff |---$|--- )/ {patch = 1}
-patch == 1 {print $0}
-END{}
-' < "$1"
+     sed -n '/^diff /,$p' < "$1"
So, the thought behind this mess was to allow minimal patches to work.  The
'diff' line is *not* required by patch(1)!
I see. I can see that this is sometimes useful, even though I think
it is more important that guilt actually works with the patches itself
creates.
Is it a problem if a patch description contains a line that starts with
'diff '?  (The current code has this issue as well.)
Yes.
For the record, this ambiguity is what's on several occasions made me
consider splitting the header and the patch into separate files.  Yeah, it'd
be messier.  :/
I really like having the header and the patches in the same file. I had
to solve a similar problem when I wrote my utility for diffing two diff
files (https://git.lysator.liu.se/pdiffdiff). Based on the experience I got
doing that, I propose this new do_get_patch function:

# usage: do_get_patch patchfile
do_get_patch()
{
    awk '
BEGIN {
    patchheader = ""
    patch = 0
}
patch == 1 {
    print $0
    next
}
/^(diff |index |=|RCS file:|retrieving revision )/ {
    patchheader = patchheader $0 "\n"
    next
}
/^(--- |((new|deleted) file|old) mode )/ {
    printf "%s", patchheader
  -/^(diff |---$|--- )/ {patch = 1}  print $0
    patch = 1
}
{
    patchheader = ""
}' < "$1"

}

The idea is to collect lines that *might* start the patch in
patchheader. Once we detect the start of the patch (via a
line that matches "--- " or any of the mode change lines)
we print the patcheader and the current line. If we get a
line that neither looks like a patchheader nor starts a patch,
we discard the patcheader. This is the case of a commit
message with a line that starts with "diff ".

The function above solves the issue with lines that
start with "diff " in the commit message.  On the other
hand, it introduces the same issue for lines that start
with for instance "old mode ".

Actually, a smaller change that probably fixes the
issue with diffstat is to replace

/^(diff |---$|--- )/ {patch = 1}

witih

/^(diff |--- )/ {patch = 1}

as the problem with the original implementation is that
the "---\n" line that starts the diffstat should not start
the patch.

    /ceder
quoted
 }

 # usage: do_get_header patchfile
--
1.8.3.1
--
Defenestration n. (formal or joc.):
  The act of removing Windows from your computer in disgust, usually
  followed by the installation of Linux or some other Unix-like operating
  system.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help