# HG changeset patch # User Augie Fackler # Date 1265482895 21600 # Node ID d17cec76e769f267edde754f880c3bec417688a3 # Parent f0159775e0f126165a6bad69f2220481e3579d02 replay: correctly handle renaming the parent dir of a branch diff --git a/hgsubversion/replay.py b/hgsubversion/replay.py --- a/hgsubversion/replay.py +++ b/hgsubversion/replay.py @@ -100,6 +100,10 @@ def convert_rev(ui, meta, svn, r, tbdelt ha = branchedits[0][1] 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 closedrevs = closebranches.values() for branch, files in branch_batches.iteritems(): diff --git a/hgsubversion/svnmeta.py b/hgsubversion/svnmeta.py --- a/hgsubversion/svnmeta.py +++ b/hgsubversion/svnmeta.py @@ -1,4 +1,5 @@ import cPickle as pickle +import posixpath import os import tempfile @@ -498,6 +499,18 @@ class SVNMeta(object): and branch not in self.branches and branch not in added_branches): 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) self.addedtags, self.deletedtags = addedtags, deletedtags return { diff --git a/tests/fixtures/rename_branch_parent_dir.sh b/tests/fixtures/rename_branch_parent_dir.sh new file mode 100755 --- /dev/null +++ b/tests/fixtures/rename_branch_parent_dir.sh @@ -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 diff --git a/tests/fixtures/rename_branch_parent_dir.svndump b/tests/fixtures/rename_branch_parent_dir.svndump new file mode 100644 --- /dev/null +++ b/tests/fixtures/rename_branch_parent_dir.svndump @@ -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 + + diff --git a/tests/test_fetch_branches.py b/tests/test_fetch_branches.py --- a/tests/test_fetch_branches.py +++ b/tests/test_fetch_branches.py @@ -27,6 +27,16 @@ class TestFetchBranches(test_util.TestBa ctx.extra().get('close', None) != '1') 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): repo = self._load_fixture_and_fetch('unrelatedbranch.svndump', stupid) heads = [repo[n] for n in repo.heads()]