[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: svn diff produces a patch which does not reapply cleanly

From: Konstantin Kolinko <knst.kolinko_at_gmail.com>
Date: Thu, 8 Jan 2009 01:01:02 +0300

2009/1/7 Stefan Küng <tortoisesvn_at_gmail.com>:
> David Glasser wrote:
>> On Wed, Jan 7, 2009 at 10:07 AM, Stefan Kueng <tortoisesvn_at_gmail.com> wrote:
>>> David Ellingsworth wrote:
>>>> On Wed, Jan 7, 2009 at 11:26 AM, Stefan Küng <tortoisesvn_at_gmail.com> wrote:
>>>>> Daniel Shahaf wrote:
>>>>>> David Ellingsworth wrote on Tue, 6 Jan 2009 at 19:57 -0500:
>>>>>>> While using TortoiseSVN 1.5.6 build 14908, I encountered an error
>>>>>>> while trying to apply a patch with TortoiseMerge that was previously
>>>>>>> created using TortoiseSVN's "Create Patch" feature. While I was unable
>>>>>>> to apply the patch with TortoiseMerge, I did succeed while using the
>>>>>>> standard patch command, but not without any fuzz.
>>>>>>>
>>>>>>> The reply to the issue I posted on TortioseSVN"s user mailing list
>>>>>>> indicates this is an error in svn's core since the patch generated is
>>>>>>> equivalent to "svn diff file > patchfile". I have verified this using
>>>>>>> svn client 1.5.1 and 1.5.5.
>>>>>>>
>>>>>>> Attached are some files I created which are capable of reliably
>>>>>>> reproducing the problem. The files are as follows: the original
>>>>>>> file(test.txt), the updated file(test_v2.txt), and the associated
>>>>>>> patch file generated from svn diff(test.patch).
>>>>>>>
>>>>>> What *exactly* should we do with these three files to reproduce the error?
>>>>>> (If you can package the answer in script (or transcript) form, that's
>>>>>> best.) I tried
>>>>>>
>>>>>> svn add wc1\trunk\test.txt
>>>>>> svn commit wc1 -m "add"
>>>>>> rm -f wc1\trunk\test.txt
>>>>>> cp wc1\trunk\test_v2.txt wc1\trunk\test.txt
>>>>>> svn diff wc1 > out
>>>>>> vim -Nu NONE -c "%s/\r//" -c "wq ++ff=dos" out
>>>>>> svn revert wc1\trunk\test.txt
>>>>>> patch -d wc1\trunk < out
>>>>>> diff -u wc1\trunk\test*.txt
>>>>>>
>>>>>> but it didn't cause any error message, and the 'diff -u' at the end also
>>>>>> found no differences (the expected result). Results are the same with
>>>>>> both 1.5 and trunk.
>>>>> Try
>>>>>
>>>>> svn add wc1\trunk\test.txt
>>>>> svn commit wc1 -m "add"
>>>>> cp test_v2.txt wc1\trunk\test.txt
>>>>> svn diff wc1 > out
>>>>> svn revert wc1\trunk\test.txt
>>>>> patch -d wc1\trunk < out
>>>>>
>>>>> Stefan
>>>>>
>>>> Output is as follows, I don't have a trunk directory so it's been excluded:
>>>>
>>>> $ svn add wc1\test.txt
>>>> A wc1\test.txt
>>>>
>>>> $ svn commit wc1 -m "add"
>>>> Adding wc1\test.txt
>>>> Transmitting file data .
>>>> Committed revision 1.
>>>>
>>>> $ cp test_v2.txt wc1\test.txt
>>>>
>>>> $ svn diff wc1 > out
>>>>
>>>> $ svn revert wc1\test.txt
>>>> Reverted 'wc1\test.txt'
>>>>
>>>> $ patch -d wc1 < out
>>>> patching file 'test.txt'
>>>> Hunk #2 succeeded at 7 (offset 2 lines)
>>> sure, the patch can be applied, but not cleanly - 'offset 2 lines'.
>>> The patch should be applied cleanly, without any offset.
>>>
>>> I haven't found any clear docs on how a patch file really is defined,
>>> but from what I think is wrong:
>>>
>>> The chunk info line
>>> @@ -2,9 +5,9 @@
>>> is wrong. AFAIK the first number (-2) is the line number where removing
>>> starts, the second one the number of lines to remove (including context
>>> lines), the third one (5) the line number where adding starts and the
>>> fourth (9) the number of lines to add (also including context lines).
>>>
>>> Now, in 1.4.x, the diff would have the start line numbers adjusted. The
>>> first chunk is always correct, but now (>= 1.5.x) the line numbers are
>>> always in reference to the original file. Before those lines were
>>> adjusted: if a chunk before added lines or removed lines, the 'start'
>>> lines of the following chunks would take that into account.
>>>
>>> Does anyone know if (and where) the patch file format is documented?
>>> Because I may be completely wrong here - I've implemented the patch
>>> functionality in TortoiseMerge completely by reverse engineering the
>>> format...
>>
>> I get the same patch with 1.4.x and ~trunk (with that line), FWIW.
>> You get something different with 1.4.x?
>
> hmm - no. I also get the same patch with 1.4.x and even 1.3.x.
>
> Problem still is: the original 'patch' tool can't apply that patch
> cleanly without doing 'fuzzy' work. Which means the patch is not correct?
>
> If there was a documentation on how a patch has to be created and how
> those chunk infos are supposed to work, it would be easier...
>
>
> Stefan
>

Here is the specification:
It is POSIX.1-2008 (The Open Group Base Specifications Issue 7)

http://www.opengroup.org/onlinepubs/9699919799/utilities/diff.html
http://www.opengroup.org/onlinepubs/9699919799/utilities/patch.html

Note: The entrance is here:
http://www.opengroup.org/bookstore/catalog/c082.htm
They ask for your name and assign you a cookie.

The previous Issue 6 is freely accessible here, though it does not yet
specify the -u format:
http://www.opengroup.org/onlinepubs/009695399/utilities/diff.html

Best regards,
Konstantin Kolinko

------------------------------------------------------
http://subversion.tigris.org/ds/viewMessage.do?dsForumId=462&dsMessageId=1010551
Received on 2009-01-07 23:01:50 CET

This is an archived mail posted to the Subversion Dev mailing list.