changeset 551:d17cec76e769

replay: correctly handle renaming the parent dir of a branch
author Augie Fackler <durin42@gmail.com>
date Sat, 06 Feb 2010 13:01:35 -0600
parents f0159775e0f1
children 2d44461e8617
files hgsubversion/replay.py hgsubversion/svnmeta.py tests/fixtures/rename_branch_parent_dir.sh tests/fixtures/rename_branch_parent_dir.svndump tests/test_fetch_branches.py
diffstat 5 files changed, 294 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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():
--- 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 {
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
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
+
+
--- 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()]