From 4946c0febeb3dd68a1d169ab5f8b6baf9cee0a8c Mon Sep 17 00:00:00 2001 From: Bryan O'Sullivan Date: Tue, 17 Jul 2007 15:24:59 -0700 Subject: [PATCH] convert/subversion.py: fix bad assumptions about SVN path naming The SVN converter assumed that the trunk and branches paths were fixed, and immediately under the base of the SVN URL. Fix the second assumption, and allow the trunk and branches paths to be reconfigured. --- hgext/convert/subversion.py | 48 ++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/hgext/convert/subversion.py b/hgext/convert/subversion.py index 88a97dc420..976156c22f 100644 --- a/hgext/convert/subversion.py +++ b/hgext/convert/subversion.py @@ -1,6 +1,17 @@ # Subversion 1.4/1.5 Python API backend # # Copyright(C) 2007 Daniel Holth et al +# +# Configuration options: +# +# convert.svn.trunk +# Relative path to the trunk (default: "trunk") +# convert.svn.branches +# Relative path to tree of branches (default: "branches") +# +# Set these in a hgrc, or on the command line as follows: +# +# hg convert --config convert.svn.trunk=wackoname [...] import pprint import locale @@ -88,26 +99,47 @@ class convert_svn(converter_source): lastrevs[module] = revnum self.lastrevs = lastrevs + def exists(self, path, optrev): + try: + return svn.client.ls(self.url.rstrip('/') + '/' + path, + optrev, False, self.ctx) + except SubversionException, err: + return [] + def getheads(self): # detect standard /branches, /tags, /trunk layout optrev = svn.core.svn_opt_revision_t() optrev.kind = svn.core.svn_opt_revision_number optrev.value.number = self.last_changed rpath = self.url.strip('/') - paths = svn.client.ls(rpath, optrev, False, self.ctx) - if 'branches' in paths and 'trunk' in paths: - self.module += '/trunk' + cfgtrunk = self.ui.config('convert', 'svn.trunk') + cfgbranches = self.ui.config('convert', 'svn.branches') + trunk = (cfgtrunk or 'trunk').strip('/') + branches = (cfgbranches or 'branches').strip('/') + if self.exists(trunk, optrev) and self.exists(branches, optrev): + self.ui.note('found trunk at %r and branches at %r\n' % + (trunk, branches)) + oldmodule = self.module + self.module += '/' + trunk lt = self.latest(self.module, self.last_changed) self.head = self.revid(lt) self.heads = [self.head] - branches = svn.client.ls(rpath + '/branches', optrev, False, self.ctx) - for branch in branches.keys(): - module = '/branches/' + branch + branchnames = svn.client.ls(rpath + '/' + branches, optrev, False, + self.ctx) + for branch in branchnames.keys(): + if oldmodule: + module = '/' + oldmodule + '/' + branches + '/' + branch + else: + module = '/' + branches + '/' + branch brevnum = self.latest(module, self.last_changed) brev = self.revid(brevnum, module) self.ui.note('found branch %s at %d\n' % (branch, brevnum)) self.heads.append(brev) + elif cfgtrunk or cfgbranches: + raise util.Abort(_('trunk/branch layout expected, ' + 'but not found')) else: + self.ui.note('working with one branch\n') self.heads = [self.head] return self.heads @@ -193,8 +225,8 @@ class convert_svn(converter_source): except SubversionException: dirent = None if not dirent: - raise util.Abort('%s not found up to revision %d' \ - % (path, stop)) + print self.base, path + raise util.Abort('%s not found up to revision %d' % (path, stop)) return dirent.created_rev