hgext/convert/subversion.py
changeset 5854 8b95f598097c
parent 5842 111ed8c871bf
child 5870 0d583ade5817
--- a/hgext/convert/subversion.py	Sat Jan 12 20:49:07 2008 +0100
+++ b/hgext/convert/subversion.py	Sat Jan 05 01:51:21 2008 +0100
@@ -181,46 +181,48 @@
             return False
 
     def getheads(self):
-        # detect standard /branches, /tags, /trunk layout
+
+        def getcfgpath(name, rev):
+            cfgpath = self.ui.config('convert', 'svn.' + name)
+            path = (cfgpath or name).strip('/')
+            if not self.exists(path, rev):
+                if cfgpath:
+                    raise util.Abort(_('expected %s to be at %r, but not found')
+                                 % (name, path))
+                return None
+            self.ui.note(_('found %s at %r\n') % (name, path))
+            return path
+
         rev = optrev(self.last_changed)
-        rpath = self.url.strip('/')
-        cfgtrunk = self.ui.config('convert', 'svn.trunk')
-        cfgbranches = self.ui.config('convert', 'svn.branches')
-        cfgtags = self.ui.config('convert', 'svn.tags')
-        trunk = (cfgtrunk or 'trunk').strip('/')
-        branches = (cfgbranches or 'branches').strip('/')
-        tags = (cfgtags or 'tags').strip('/')
-        if self.exists(trunk, rev) and self.exists(branches, rev) and self.exists(tags, rev):
-            self.ui.note('found trunk at %r, branches at %r and tags at %r\n' %
-                         (trunk, branches, tags))
-            oldmodule = self.module
+        oldmodule = ''
+        trunk = getcfgpath('trunk', rev)
+        tags = getcfgpath('tags', rev)
+        branches = getcfgpath('branches', rev)
+
+        # If the project has a trunk or branches, we will extract heads
+        # from them. We keep the project root otherwise.
+        if trunk:
+            oldmodule = self.module or ''
             self.module += '/' + trunk
             lt = self.latest(self.module, self.last_changed)
             self.head = self.revid(lt)
-            self.heads = [self.head]
+
+        # First head in the list is the module's head
+        self.heads = [self.head]
+        self.tags = '%s/%s' % (oldmodule , (tags or 'tags'))
+
+        # Check if branches bring a few more heads to the list
+        if branches:
+            rpath = self.url.strip('/')
             branchnames = svn.client.ls(rpath + '/' + branches, rev, False,
                                         self.ctx)
             for branch in branchnames.keys():
-                if oldmodule:
-                    module = oldmodule + '/' + branches + '/' + branch
-                else:
-                    module = '/' + branches + '/' + branch
+                module = '%s/%s/%s' % (oldmodule, 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)
 
-            if oldmodule:
-                self.tags = '%s/%s' % (oldmodule, tags)
-            else:
-                self.tags = '/%s' % tags
-
-        elif cfgtrunk or cfgbranches or cfgtags:
-            raise util.Abort('trunk/branch/tags layout expected, but not found')
-        else:
-            self.ui.note('working with one branch\n')
-            self.heads = [self.head]
-            self.tags  = tags
         return self.heads
 
     def getfile(self, file, rev):