Neels Janosch Hofmeyr wrote:
> Wilfredo Sánchez Vega wrote:
>> I'm running into this error while trying to do a merge:
>>
>> --- Merging r4130 through r4318 into '.':
>> U lib-patches/Twisted/twisted.python.util.patch
>> svn: Attempt to add tree conflict that already exists
>> svn: Error reading spooled REPORT request response
>
> Hmm, looks like a solid bug. Investigating...
BTW, I successfully reproduced this issue.
In case you're interested, it's because a deletion and addition happen in
one merge range, onto a file that was also modified in the target branch. To
work around it, you could merge selected ranges and resolve tree-conflicts
after each range.
But to find out which files and ranges are involved is not that simple. I've
also been thinking about that one and might come up with a little tool soon.
Anyway. I'm still struggling to find the proper fix for this issue, in *theory*.
How to handle multiple tree-conflicts within a given merge range? i.e. in
a given range, file alpha was removed, later added, later removed again. I'm
merging that onto another branch that has modified file alpha. For further
argument, make the "later added" an "added-with-history", so that it is
again the "exact same" file with history and all.
What do I want to see -- The first delete? The last delete? Only the "arch"
over all consecutive delete/add/delete/add operations? (As in, if the last
one was an add, process an edit, if the last one was a delete, process a
delete?)
What should `svn info' show -- the merge range given on the command line?
The revision number that tried to delete the file (whih one)?
I'm still pretty uncertain about that stuff.
My reproduction script is attached.
In the script, also note that passing the file in question as an explicit
target (instead of recursing on the parent dir) totally fails to see a
tree-conflict in the first place. It's as if the merge lost its voice.
If I don't come up with an idea soon, I'll make this a new issue.
~Neels
> Thanks for the report! So you got my message on IRC ;)
> I'll be back later, hopefully with a fix.
>
> ~Neels
>
>> The client and server are both running svn version 1.6.2.
>>
>> This merge completes without errors if I use svn 1.4.4 client (had
>> that on another machine; didn't try anything in between), which
>> suggests that this is a regression.
>>
>> The script below will reproduce this on my system.
>>
>> -wsv
>>
>>
>> #!/usr/bin/env bash
>>
>> # Create a temporary directory
>> tmp="$(mktemp -d -t foo)";
>> cd "${tmp}";
>>
>> # Check out CalendarServer
>> svn co -r4315 http://svn.calendarserver.org/repository/calendarserver/CalendarServer/trunk
>> CalendarServer;
>> cd CalendarServer;
>>
>> # Merge all changes on the update-twisted-3816-3 since it's creation
>> (r4129)
>> svn merge -r4129:HEAD http://svn.calendarserver.org/repository/calendarserver/CalendarServer/branches/exarkun/update-twisted-3816-3
>> ;
>>
>> # Print the WC path
>> echo "WC is: $(pwd)";
>>
>> ------------------------------------------------------
>> http://subversion.tigris.org/ds/viewMessage.do?dsForumId=462&dsMessageId=2359252
>
> ------------------------------------------------------
> http://subversion.tigris.org/ds/viewMessage.do?dsForumId=462&dsMessageId=2359433
------------------------------------------------------
http://subversion.tigris.org/ds/viewMessage.do?dsForumId=462&dsMessageId=2359772
#!/bin/bash
## GENERIC PREPARATIONS
if [ -f /usr/local/bin/superpower ]; then
# use my local way if my script is there (neels).
echo "##### REMEMBER TO SETUP YOUR ENVIRONMENT #####"
else
# the rest of the world:
# The next line is the only line you should need to adjust.
SVNDIR=/my/svn/trunk
alias svn=${SVNDIR}/subversion/svn/svn
alias svnserve=${SVNDIR}/subversion/svnserve/svnserve
alias svnadmin=${SVNDIR}/subversion/svnadmin/svnadmin
fi
svn --version
# Select an access method. If svn://, the svnserve setup is
# handled automagically by this script; but if http://, then
# you'll have to configure it yourself first.
#
# URL=http://localhost/neels/repos
URL=svn://localhost/repos
#URL=file:///`pwd`/repos
rm -rf repos wc
rm -rf wc2
svnadmin create repos
# These are for svnserve only.
echo "[general]" > repos/conf/svnserve.conf
echo "anon-access = write" >> repos/conf/svnserve.conf
echo "auth-access = write" >> repos/conf/svnserve.conf
if [ -x ./k ]; then
./k
fi
# The server will only be contacted if $URL is svn://foo, of course.
svnserve --pid-file svnserve-pid -d -r `pwd`
# And put the kill command in a file, in case need to run it manually.
echo "kill -9 `cat svnserve-pid`" > k
chmod a+rwx k
svn co -q ${URL} wc
set -x
## ACTUAL TEST
cd wc
mkdir trunk
echo "A" > trunk/file
svn add trunk
svn ci -m "r1"
echo "B" > trunk/file
svn ci -m "r2"
svn cp -m "r3" ^/trunk ^/branch
svn up .
echo "C" > branch/file
svn ci -m "r4"
svn rm branch/file
svn ci -m "r5"
echo "D" > branch/file
svn add branch/file
svn ci -m "r5"
echo "E" > branch/file
svn ci -m "r6"
echo "F" > trunk/file
svn ci -m "r7"
svn up .
cd trunk
range=-r3:6
svn merge $range $URL/branch .
svn diff
svn st
svn revert -R .
svn merge $range $URL/branch/file file
svn diff
svn st
svn revert -R .
svn merge --ignore-ancestry $range $URL/branch/file file
svn diff
svn st
cd ..
cd ..
## ACTUAL TEST ENDS
echo "====="
Received on 2009-06-05 19:15:41 CEST