replay: correctly handle renaming the parent dir of a branch

This commit is contained in:
Augie Fackler 2010-02-06 13:01:35 -06:00
parent 555e763e54
commit d4c3b3a0d2
5 changed files with 294 additions and 0 deletions

View File

@ -100,6 +100,10 @@ def convert_rev(ui, meta, svn, r, tbdelta):
ha = branchedits[0][1] ha = branchedits[0][1]
closebranches[branch] = ha closebranches[branch] = ha
extraempty = (set(tbdelta['branches'][0]) -
(set(current.emptybranches) | set(branch_batches.keys())))
current.emptybranches.update([(x, False) for x in extraempty])
# 1. handle normal commits # 1. handle normal commits
closedrevs = closebranches.values() closedrevs = closebranches.values()
for branch, files in branch_batches.iteritems(): for branch, files in branch_batches.iteritems():

View File

@ -1,4 +1,5 @@
import cPickle as pickle import cPickle as pickle
import posixpath
import os import os
import tempfile import tempfile
@ -498,6 +499,18 @@ class SVNMeta(object):
and branch not in self.branches and branch not in self.branches
and branch not in added_branches): and branch not in added_branches):
parent = {branch: (None, 0, revision.revnum)} parent = {branch: (None, 0, revision.revnum)}
elif bpath is None:
srcpath = paths[p].copyfrom_path
srcrev = paths[p].copyfrom_rev
parent = {}
for br in self.branches:
rn = self.remotename(br)
if rn.startswith(srcpath[1:] + '/'):
bname = posixpath.basename(rn)
newbr = posixpath.join(p, bname)
parent.update(
self._determine_parent_branch(
newbr, rn, srcrev, revision.revnum))
added_branches.update(parent) added_branches.update(parent)
self.addedtags, self.deletedtags = addedtags, deletedtags self.addedtags, self.deletedtags = addedtags, deletedtags
return { return {

44
tests/fixtures/rename_branch_parent_dir.sh vendored Executable file
View File

@ -0,0 +1,44 @@
#!/bin/sh
mkdir temp
cd temp
svnadmin create repo
svn co file://`pwd`/repo wc
cd wc
mkdir brances trunk tags
svn add *
svn ci -m 'btt'
cd trunk
for a in alpha beta gamma delta ; do
echo $a > $a
svn add $a
done
svn ci -m 'Add files.'
cd ..
svn up
svn cp trunk brances/dev_branch
svn ci -m 'branch'
cd brances/dev_branch
svn rm delta
echo narf > alpha
echo iota > iota
svn add iota
svn ci -m 'branch changes'
cd ../..
svn up
svn mv brances branches
svn ci -m 'move branches to branches'
cd ..
cd ..
svnadmin dump temp/repo > rename_branch_parent_dir.svndump
echo
echo 'Complete.'
echo 'You probably want to clean up temp now.'
echo 'Dump in rename_branch_parent_dir.svndump'
exit 0

View File

@ -0,0 +1,223 @@
SVN-fs-dump-format-version: 2
UUID: dceec716-b592-46cb-b5fe-41acbbe32b85
Revision-number: 0
Prop-content-length: 56
Content-length: 56
K 8
svn:date
V 27
2010-02-06T17:32:02.297006Z
PROPS-END
Revision-number: 1
Prop-content-length: 102
Content-length: 102
K 7
svn:log
V 3
btt
K 10
svn:author
V 5
augie
K 8
svn:date
V 27
2010-02-06T17:32:03.176895Z
PROPS-END
Node-path: brances
Node-kind: dir
Node-action: add
Prop-content-length: 10
Content-length: 10
PROPS-END
Node-path: tags
Node-kind: dir
Node-action: add
Prop-content-length: 10
Content-length: 10
PROPS-END
Node-path: trunk
Node-kind: dir
Node-action: add
Prop-content-length: 10
Content-length: 10
PROPS-END
Revision-number: 2
Prop-content-length: 110
Content-length: 110
K 7
svn:log
V 10
Add files.
K 10
svn:author
V 5
augie
K 8
svn:date
V 27
2010-02-06T17:32:04.202558Z
PROPS-END
Node-path: trunk/alpha
Node-kind: file
Node-action: add
Prop-content-length: 10
Text-content-length: 6
Text-content-md5: 9f9f90dbe3e5ee1218c86b8839db1995
Content-length: 16
PROPS-END
alpha
Node-path: trunk/beta
Node-kind: file
Node-action: add
Prop-content-length: 10
Text-content-length: 5
Text-content-md5: f0cf2a92516045024a0c99147b28f05b
Content-length: 15
PROPS-END
beta
Node-path: trunk/delta
Node-kind: file
Node-action: add
Prop-content-length: 10
Text-content-length: 6
Text-content-md5: d2840cc81bc032bd1141b56687d0f93c
Content-length: 16
PROPS-END
delta
Node-path: trunk/gamma
Node-kind: file
Node-action: add
Prop-content-length: 10
Text-content-length: 6
Text-content-md5: 303febb9068384eca46b5b6516843b35
Content-length: 16
PROPS-END
gamma
Revision-number: 3
Prop-content-length: 105
Content-length: 105
K 7
svn:log
V 6
branch
K 10
svn:author
V 5
augie
K 8
svn:date
V 27
2010-02-06T17:32:07.137254Z
PROPS-END
Node-path: brances/dev_branch
Node-kind: dir
Node-action: add
Node-copyfrom-rev: 2
Node-copyfrom-path: trunk
Revision-number: 4
Prop-content-length: 114
Content-length: 114
K 7
svn:log
V 14
branch changes
K 10
svn:author
V 5
augie
K 8
svn:date
V 27
2010-02-06T17:32:08.190998Z
PROPS-END
Node-path: brances/dev_branch/alpha
Node-kind: file
Node-action: change
Text-content-length: 5
Text-content-md5: 5e723ed52db2000686425ca28bc5ba4a
Content-length: 5
narf
Node-path: brances/dev_branch/iota
Node-kind: file
Node-action: add
Prop-content-length: 10
Text-content-length: 5
Text-content-md5: ebcf3971120220589f1dfbf8d56e25b9
Content-length: 15
PROPS-END
iota
Node-path: brances/dev_branch/delta
Node-action: delete
Revision-number: 5
Prop-content-length: 125
Content-length: 125
K 7
svn:log
V 25
move branches to branches
K 10
svn:author
V 5
augie
K 8
svn:date
V 27
2010-02-06T17:32:11.150006Z
PROPS-END
Node-path: branches
Node-kind: dir
Node-action: add
Node-copyfrom-rev: 4
Node-copyfrom-path: brances
Node-path: brances
Node-action: delete

View File

@ -27,6 +27,16 @@ class TestFetchBranches(test_util.TestBase):
ctx.extra().get('close', None) != '1') ctx.extra().get('close', None) != '1')
return sorted(branches) return sorted(branches)
def test_rename_branch_parent(self, stupid=False):
repo = self._load_fixture_and_fetch('rename_branch_parent_dir.svndump', stupid)
heads = [repo[n] for n in repo.heads()]
heads = dict([(ctx.branch(), ctx) for ctx in heads])
# Let these tests disabled yet as the fix is not obvious
self.assertEqual(['dev_branch'], self.openbranches(repo))
def test_rename_branch_parent_stupid(self):
self.test_rename_branch_parent(stupid=True)
def test_unrelatedbranch(self, stupid=False): def test_unrelatedbranch(self, stupid=False):
repo = self._load_fixture_and_fetch('unrelatedbranch.svndump', stupid) repo = self._load_fixture_and_fetch('unrelatedbranch.svndump', stupid)
heads = [repo[n] for n in repo.heads()] heads = [repo[n] for n in repo.heads()]