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

multiple tree-conflicts during merge -- was: Re: Error reading spooled REPORT request response

From: Neels Janosch Hofmeyr <neels_at_elego.de>
Date: Fri, 05 Jun 2009 19:14:31 +0200

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

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.


> 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




if [ -f /usr/local/bin/superpower ]; then
  # use my local way if my script is there (neels).
  # the rest of the world:

  # The next line is the only line you should need to adjust.
  alias svn=${SVNDIR}/subversion/svn/svn
  alias svnserve=${SVNDIR}/subversion/svnserve/svnserve
  alias svnadmin=${SVNDIR}/subversion/svnadmin/svnadmin

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

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

# 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


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
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 ..

echo "====="

Received on 2009-06-05 19:15:41 CEST

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

This site is subject to the Apache Privacy Policy and the Apache Public Forum Archive Policy.