Hi Julian.
On 11.04.2013 05:10, Julian Foad wrote:
> Hi Matthias. Thanks for your email, and sorry it was so long before I looked
> back in my mailbox and replied.
>
> Matthias Buecher wrote on 2013-02-02:
>
>> the contrib script "detect-merge-conflicts.sh" [1] uses a grep command
>> which also finds false positive merge conflict markers: it finds single
>> lines of
>> "=======" and the pre-commit will fail.
>>
>> For example I wanted to add a readme file that contains the following two
>> lines:
>> Install
>> =======
>>
>> Of course committing failed.
>
> Yes, failing the commit just because there is a ======= line is clearly too
> strong. The beginning and end lines are more distinctive and unusual,
> starting with seven angle brackets and then a space and then a dot, so we
> could just look for them.
>
>> The correct solution would be to use sed and search for real blocks of merge
>> conflict marker:
>> SUSPICIOUS=$($SVNLOOK diff -t "$TXN" "$REPOS" | sed -n -e
>> '/^+<<<<<<< \..*$/,/^+>>>>>>>
>> \..*$/ { /^+=======$/p ; //q }' | wc -l)
>>
>> This sed command finds blocks enclosed with new "<<<<<<
>> ." and ">>>>>>>." and checks if this block
>> contains a new line with "=======". If found it prints out that line
>> and quits sed.
>
> Well, that is a possible solution, unless the admin wants to detect a
> beginning marker even when the user has edited out the end marker. I was a
> bit concerned that the 'sed' syntax might not be very portable (I'm not
> sure), so I was about to commit this but also leaving the old 'grep' command
> as a commented-out example as well. Then I realized that the attempt to look
> for a block starting with the '<<<<<<<' line and ending with the '>>>>>>>'
> line doesn't actually ensure that the beginning and end markers are within
> the same file, as it scans the whole output of 'svnlook diff' in one pass
> which might include changes to hundreds of files.
There had been several follow-up mails due to sed compatibility and the result
was:
SUSPICIOUS=$("${SVNLOOK}" diff -t "${TXN}" "${REPOS}" | "${SED}" -n -e
'/^+<<<<<<< \..*$/,/^+>>>>>>> \..*$/ { /^+=======$/ { p ; q ;
}
}' | wc -l)
Tested on Debian, Redhat, FreeBSD and NetBSD.
All distributions support semicolons and the closing brackets have to be on
separate lines as per sed manual.
I see the issue with multiple files in a single diff.
> In the end, I decided to make the minimum change so as to minimize the risk
> of being asked to fix fallout such as portability issues or unwanted
> behaviour changes. So I just removed the "=======" detection from the
> existing 'grep' command and added a comment explaining why. Committed
> revision 1466758. I have no objection to us making further changes if you
> feel the need.
It's ok for me, as everbody is able to adopt the script to his needs.
> Thanks for the suggestion and the patch.
>
> - Julian
>
>
>> Kind regards
>> Matthias "Maddes" Bücher
>>
>> P.S.:
>> I'm not subscribed and would appreciate being explicitly Cc:ed in any
>> responses. Thanks.
>>
>> [1]
>> http://svn.apache.org/repos/asf/subversion/trunk/contrib/hook-scripts/detect-merge-conflicts.sh
>>
>