subversion-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Bert Huijben <b...@qqmail.nl>
Subject Re: 1.8 bug(?): svn:mergeinfo set for tree-conflicted files in subdirs
Date Wed, 11 Mar 2015 23:25:01 GMT
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
Mime
View raw message