Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 3 Jul 2017 10:42:15 -0500
From:      Pedro Giffuni <pfg@FreeBSD.org>
To:        cem@freebsd.org
Cc:        src-committers <src-committers@freebsd.org>, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   Re: svn commit: r320579 - head/usr.bin/patch
Message-ID:  <ad1564e9-fa9a-1006-59dd-7ecee305a04d@FreeBSD.org>
In-Reply-To: <CAG6CVpW4DYOzyacfEVQq%2B1WBGd1KO0m79zqJbGYPAyb6zS_5TQ@mail.gmail.com>
References:  <201707022100.v62L0Ume001253@repo.freebsd.org> <CAG6CVpW4DYOzyacfEVQq%2B1WBGd1KO0m79zqJbGYPAyb6zS_5TQ@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Hello;


On 07/02/17 21:53, Conrad Meyer wrote:
> Hi Pedro,
>
> Does this change the behavior of 'patch -p1' (for example) with 'git
> diff' generated diffs?  So patches that could be applied with -p1
> before now need to be applied with -p0?  Or is this a different mode
> of patch?
Thanks for pointing this out.

This doesn't change the meaning of the patch level so previous behavior 
is not affected.
In fact using patch -p1 still patches the file.
The behavior is consistent with some incipient path detection we have on 
CVS files.

No problem AFAICT.

> If so, that's a somewhat surprising change in behavior.  Does GNU
> patch have the same behavior?

I did some testing on {g}patch.
GNU patch indeed has a different behavior and requires -p1 on such diffs.

IMHO, the (new) BSD patch behavior is somewhat more natural in the sense 
that no one asked git to add a prefix to the path so it makes sense to 
ignore it. Recent GNU patch does support many git-specific features that 
we don't.


Pedro.
> Thanks,
> Conrad
>
> On Sun, Jul 2, 2017 at 2:00 PM, Pedro F. Giffuni <pfg@freebsd.org> wrote:
>> Author: pfg
>> Date: Sun Jul  2 21:00:30 2017
>> New Revision: 320579
>> URL: https://svnweb.freebsd.org/changeset/base/320579
>>
>> Log:
>>    patch(1): add support for git generated diffs.
>>
>>    Sometimes patches coming from other places have extra a/ and b/
>>    directories prepended to filenames.
>>
>>    Obtained from:        OpenBSD (CVS rev. 1.57, 1.58)
>>
>> Modified:
>>    head/usr.bin/patch/pch.c
>>
>> Modified: head/usr.bin/patch/pch.c
>> ==============================================================================
>> --- head/usr.bin/patch/pch.c    Sun Jul  2 20:47:25 2017        (r320578)
>> +++ head/usr.bin/patch/pch.c    Sun Jul  2 21:00:30 2017        (r320579)
>> @@ -264,6 +264,7 @@ intuit_diff_type(void)
>>          char    *s, *t;
>>          int     indent, retval;
>>          struct file_name names[MAX_FILE];
>> +       int     piece_of_git = 0;
>>
>>          memset(names, 0, sizeof(names));
>>          ok_to_create_file = false;
>> @@ -308,14 +309,20 @@ intuit_diff_type(void)
>>                  if (!stars_last_line && strnEQ(s, "*** ", 4))
>>                          names[OLD_FILE].path = fetchname(s + 4,
>>                              &names[OLD_FILE].exists, strippath);
>> -               else if (strnEQ(s, "--- ", 4))
>> -                       names[NEW_FILE].path = fetchname(s + 4,
>> +               else if (strnEQ(s, "--- ", 4)) {
>> +                       size_t off = 4;
>> +                       if (piece_of_git && strippath == 957)
>> +                               off = 6;
>> +                       names[NEW_FILE].path = fetchname(s + off,
>>                              &names[NEW_FILE].exists, strippath);
>> -               else if (strnEQ(s, "+++ ", 4))
>> +               } else if (strnEQ(s, "+++ ", 4)) {
>>                          /* pretend it is the old name */
>> -                       names[OLD_FILE].path = fetchname(s + 4,
>> +                       size_t off = 4;
>> +                       if (piece_of_git && strippath == 957)
>> +                               off = 6;
>> +                       names[OLD_FILE].path = fetchname(s + off,
>>                              &names[OLD_FILE].exists, strippath);
>> -               else if (strnEQ(s, "Index:", 6))
>> +               } else if (strnEQ(s, "Index:", 6))
>>                          names[INDEX_FILE].path = fetchname(s + 6,
>>                              &names[INDEX_FILE].exists, strippath);
>>                  else if (strnEQ(s, "Prereq:", 7)) {
>> @@ -330,6 +337,9 @@ intuit_diff_type(void)
>>                                  free(revision);
>>                                  revision = NULL;
>>                          }
>> +               } else if (strnEQ(s, "diff --git a/", 13)) {
>> +                       /* Git-style diffs. */
>> +                       piece_of_git = 1;
>>                  } else if (strnEQ(s, "==== ", 5)) {
>>                          /* Perforce-style diffs. */
>>                          if ((t = strstr(s + 5, " - ")) != NULL)
>>




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?ad1564e9-fa9a-1006-59dd-7ecee305a04d>