[prev in list] [next in list] [prev in thread] [next in thread] 

List:       subversion-issues
Subject:    [Issue 3431] New - Double file entries in repository after merge of
From:       Horst Hermanns <h.hermanns () telekom ! de>
Date:       2009-06-19 14:01:04
Message-ID: iz3431 () subversion ! tigris ! org
[Download RAW message or body]

http://subversion.tigris.org/issues/show_bug.cgi?id=3431
                 Issue #|3431
                 Summary|Double file entries in repository after merge of chang
                        |es (moved file) from one branch to another
               Component|subversion
                 Version|1.6.x
                Platform|All
                     URL|
              OS/Version|All
                  Status|NEW
       Status whiteboard|
                Keywords|
              Resolution|
              Issue type|DEFECT
                Priority|P3
            Subcomponent|unknown
             Assigned to|issues@subversion
             Reported by|hhermanns






------- Additional comments from hhermanns@tigris.org Fri Jun 19 07:01:03 -0700 2009 -------
This issue is created based on mailthread:
http://subversion.tigris.org/ds/viewMessage.do?dsMessageId=2363493&dsForumId=462

...
We merged changes (creation and move of a file) from one branch to another. Due
to our mergeinfo properties we divided the merge in two merge steps/rev-ranges
(without commit in between). Afterwards we committed the result of both merges.

Example (Test Script see below):
 - Branch1, Create dir1 with file1 -> commit/Rev1
 - Branch1, Create dir2 in dir1 and mv file1 to dir2 -> commit/Rev2

 - Branch2, svn merge -r....:Rev1 <Branch1> .
 - Branch2, svn merge -rRev1:Rev2 <Branch1> .
 - Branch2, svn ci ...

Due to status/commit/log output and WC everythings fine (finally only one file
'file1' in dir2 was shown), but after commit in the repository the file 'file1'
is located in old and new directory. A new checkout contains file1 at both
locations.

The problem occurcs only if we merge in 2 steps and don't commit between the
both steps.
Is this procedure ok or do we have to commit between each merge? I thought 'svn
merge' also splits rev ranges depending on the mergeinfo properties.

We tested this behavior in several environments:
	SVN Client, 1.5.6/1.6.2 (Windows JavaHL, precompiled Tigris.org Apache 2.2)
	SVN Server, 1.5.5/1.6.2 (Linux-Server, compiled with gcc 4.1.0, Apache 2.2.11
with mod_dav_svn)
	Repository format FSFS
...

------ Test-script -------

#!/bin/sh
SVN=`which svn`
SVNSERVE=`which svnserve`
SVNADMIN=`which svnadmin`

URL=https://.../svn/repo1
# URL=svn://localhost/repos
# URL=file:///`pwd`/repos

##rm -rf repos wc import-me

##${SVNADMIN} create repos


echo "### Making a Greek Tree for import..."
mkdir import-me
mkdir import-me/trunk
mkdir import-me/tags
mkdir import-me/branches
mkdir import-me/trunk/A
mkdir import-me/trunk/A/B/
mkdir import-me/trunk/A/C/
mkdir import-me/trunk/A/D/
mkdir import-me/trunk/A/B/E/
mkdir import-me/trunk/A/B/F/
mkdir import-me/trunk/A/D/G/
mkdir import-me/trunk/A/D/H/
echo "This is the file 'iota'."        > import-me/trunk/iota
echo "This is the file 'A/mu'."        > import-me/trunk/A/mu
echo "This is the file 'A/B/lambda'."  > import-me/trunk/A/B/lambda echo "This
is the file 'A/B/E/alpha'." > import-me/trunk/A/B/E/alpha echo "This is the file
'A/B/E/beta'."  > import-me/trunk/A/B/E/beta
echo "This is the file 'A/D/gamma'."   > import-me/trunk/A/D/gamma
echo "This is the file 'A/D/G/pi'."    > import-me/trunk/A/D/G/pi
echo "This is the file 'A/D/G/rho'."   > import-me/trunk/A/D/G/rho
echo "This is the file 'A/D/G/tau'."   > import-me/trunk/A/D/G/tau
echo "This is the file 'A/D/H/chi'."   > import-me/trunk/A/D/H/chi
echo "This is the file 'A/D/H/omega'." > import-me/trunk/A/D/H/omega
echo "This is the file 'A/D/H/psi'."   > import-me/trunk/A/D/H/psi
echo "### Done."
echo ""
echo "### Importing it..."
(cd import-me; ${SVN} import -q -m "Initial import." ${URL}) echo "### Done."
echo ""

# test case
# create two branches
${SVN} mkdir -m "new Branch A" ${URL}/branches/A ${SVN} mkdir -m "new Branch B"
${URL}/branches/B

# Create changes in Branch A
${SVN} co -q ${URL}/branches/A wcA
cd wcA
svn mkdir dir1

cd dir1
touch file1
svn add file1

cd ..
svn ci -m "Commit new dir1/file1 Branch A" .

cd dir1
svn mkdir dir2
svn mv file1 dir2

cd ..
svn ci -m"relocated file1 to dir2 in BranchA" .



# Merge changes from Branch A to Branch B cd ..
${SVN} co -q ${URL}/branches/B wcB
cd wcB

endRev=`svn info | grep Revision: | awk -F ' ' '{print  $2}'` midRev=`expr
$endRev - 1` startRev=`expr $endRev - 2`

svn merge --force -r${startRev}:${midRev} ${URL}/branches/A .

svn merge --force -r${midRev}:${endRev} ${URL}/branches/A .

echo ""
echo "Status:"
svn status

svn ci -m "Commit merge results to Branch B" .

echo ""
echo "Log, should only have one entry for file1"
svn log -rHEAD -vq

#List Merge Results
echo ""
echo "old location dir1, there should be no file1"
svn list ${URL}/branches/B/dir1

echo "new location dir1/dir2, there should be a file1"
svn list ${URL}/branches/B/dir1/dir2

------------------------------------------------------
http://subversion.tigris.org/ds/viewMessage.do?dsForumId=463&dsMessageId=2363520

To unsubscribe from this discussion, e-mail: [issues-unsubscribe@subversion.tigris.org].
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic