Re: [PATCH] git apply: binary files differ can be applied with -pN (N>1).
- From
Jiang Xin <worldhello.net@gmail.com>
- Date
- Nov 25, 2010, 01:46 UTC
- Message-ID
- <4CEDC011.1050503@gmail.com>
- In-Reply-To
- <7vlj4itz8j.fsf@alter.siamese.dyndns.org>
于 2010年11月25日 01:20, Junio C Hamano 写道:
Show 14 quoted lines
> Jiang Xin <worldhello.net@gmail.com> writes: > >> When patch file generated against two non-git directories using >> 'git diff --binary --no-index' without '--no-prefix', the patch >> file has patch level greater then 1, and should be applied with >> '-p2' option. But it does not work if there are binary differ >> in the patch file, it is because in one case the patch level is >> not properly handled. >> >> Signed-off-by: Jiang Xin <jiangxin@ossxp.com> > > Can you please add a testcase to protect your fix from getting broken by > later changes by other people, perhaps to t/t4120? >
Yes, I add a testcase in t/t4120, and I will send it as a new PATCH. The new testcase is like following:
+test_expect_success 'apply git diff with -p2 and use default name from header' ' + sed -e "/^\(---\|+++\) / d" patch.file > patch.newheader && + cp file1.saved file1 && + git apply -p2 patch.newheader +' +
> By the way, this codepath is shared by all forms of patches "diff --git" > header, not just binary. Do you see a similar breakage with --no-prefix > patches that are not binary, and if not why? >
The breakage will appear under these circumstances: * the patch is in git style: header with "diff --git". * the header does not contain '--- path/to/old' and '+++ path/to/new'. * has a patch level greater than 1.
When I do `git diff` against binary files, I find the patch header does not has '--- path/to/old' and '+++ path/to/new'. May be there exist other cases, but I'm not sure.
Show 27 quoted lines
>> ---
>> builtin/apply.c | 3 ++-
>> 1 files changed, 2 insertions(+), 1 deletions(-)
>>
>> diff --git a/builtin/apply.c b/builtin/apply.c
>> index 23c18c5..d603e37 100644
>> --- a/builtin/apply.c
>> +++ b/builtin/apply.c
>> @@ -1126,6 +1126,7 @@ static char *git_header_name(char *line, int llen)
>> * form.
>> */
>> for (len = 0 ; ; len++) {
>> + int nslash = p_value;
>> switch (name[len]) {
>> default:
>> continue;
>> @@ -1137,7 +1138,7 @@ static char *git_header_name(char *line, int llen)
>> char c = *second++;
>> if (c == '\n')
>> return NULL;
>> - if (c == '/')
>> + if (c == '/' && --nslash <= 0)
>> break;
>> }
>> if (second[len] == '\n' && !memcmp(name, second, len)) {
>> --
>> 1.7.3.2.245.g03276.dirty-- Jiang Xin