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