I don’t know whether it is a bug or a feature. Storing this value will make a future merge handle the partial merge that was skipped at first: the mergeinfo tells that it didn't merge to that node.
There are two ways to remember that: record ‘non inheritable’ info on the direct parent, and then again on all children that are merged… The untouched node is then unaffected, but future merges will be slower as more nodes have specific merge-info. Storing it just on the node that is not merged as you see here is the other option, which will keep your further merges faster.
In 1.6 we could in general not change the node affected by a tree conflict, so we always had to choose the slow option. With the central metadata storage we can do things more efficient… and this allowed fixing a lot of known issues of previous versions.
Bert
Sent from Windows Mail
From: Pete Harlan
Sent: Wednesday, March 11, 2015 11:16 PM
To: 'subversion'
Hi,
Subversion 1.8.11 behaves differently than 1.7.17 and 1.6.11, in that
it sets empty svn:mergeinfo properties for files within a
tree-conflicted directory during a merge. The effect is this:
Layout:
/trunk
/branches/branch
Add empty dir/file.txt to trunk and independently to branch.
Merge trunk to branch; the resulting merge generates:
% svn propget -v svn:mergeinfo -R
Properties on '.':
svn:mergeinfo
/trunk:2-4
Properties on 'dir/file.txt':
svn:mergeinfo
%
Expected result is that no svn:mergeinfo property would appear on
dir/file.txt. Is this a bug? A known bug?
Thanks,
Pete
Script to reproduce (run as "script.sh /path/to/svn"):
#!/bin/bash
#
# Reproduce an issue in Subversion 1.8.11 where files in a tree
# conflict can have svn:mergeinfo properties added to them during a
# merge.
set -e
SERVER_DIR=server
CLIENT_DIR=client
if [ $# != 1 ]; then
echo "usage: $0 <path to svn>"
exit
fi
SVN=$1
SVNADMIN="$(dirname $SVN)/svnadmin"
SERVER_URL="file:///$PWD/$SERVER_DIR"
createAndCommitSubdirWithFile ()
{
mkdir dir
touch dir/file.txt
$SVN add dir
$SVN commit -m "$1"
$SVN update # Update . to committed rev
}
# Create the repo and enter it.
$SVNADMIN create $SERVER_DIR
$SVN checkout $SERVER_URL $CLIENT_DIR
cd $CLIENT_DIR
# Create the trunk/branches structure
mkdir trunk
mkdir branches
$SVN add trunk branches
$SVN commit -m 'Create initial structure'
# Make a branch from the trunk.
$SVN copy ^/trunk ^/branches/branch -m 'Create branch from trunk'
# Commit a subdir with a file in it in the trunk and commit it.
$SVN switch --ignore-ancestry ^/trunk
createAndCommitSubdirWithFile 'Committed on trunk'
# Commit a subdir with a file in it in the branch and commit it.
$SVN switch ^/branches/branch
createAndCommitSubdirWithFile 'Committed on branch'
# Merge the trunk and display any svn:mergeinfo properties.
# (Remove --non-interactive if testing svn prior to 1.7)
$SVN merge --non-interactive ^/trunk || true
$SVN propget svn:mergeinfo -R . >actual.out
echo '. - /trunk:2-4' >expected.out
$SVN --version | head -1
if diff -q actual.out expected.out; then
echo Success
else
echo 'Test failed!'
echo 'Expected output:'
cat expected.out
echo 'Actual output:'
cat actual.out
exit 1
fi
Received on 2015-03-12 00:35:33 CET