hgext/convert/subversion.py
changeset 6173 963000ed8cac
parent 6172 0cd6846e5200
child 6210 942287cb1f57
--- a/hgext/convert/subversion.py	Sun Feb 24 17:58:53 2008 +0100
+++ b/hgext/convert/subversion.py	Sun Feb 24 17:58:55 2008 +0100
@@ -196,6 +196,15 @@
             except ValueError:
                 raise util.Abort('svn: revision %s is not an integer' % rev)
 
+        self.startrev = self.ui.config('convert', 'svn.startrev', default=0)
+        try:
+            self.startrev = int(self.startrev)
+            if self.startrev < 0:
+                self.startrev = 0
+        except ValueError:
+            raise util.Abort(_('svn: start revision %s is not an integer') 
+                             % self.startrev)
+
         try:
             self.get_blacklist()
         except IOError, e:
@@ -283,6 +292,15 @@
                              (branch, self.revnum(brevid)))
                 self.heads.append(brevid)
 
+        if self.startrev and self.heads:
+            if len(self.heads) > 1:
+                raise util.Abort(_('svn: start revision is not supported with '
+                                   'with more than one branch'))
+            revnum = self.revnum(self.heads[0])
+            if revnum < self.startrev:
+                raise util.Abort(_('svn: no revision found after start revision %d') 
+                                 % self.startrev)
+
         return self.heads
 
     def getfile(self, file, rev):
@@ -349,7 +367,7 @@
             
         start = self.revnum(self.head)
         try:
-            for entry in get_log(self.url, [self.tags], 0, start):
+            for entry in get_log(self.url, [self.tags], self.startrev, start):
                 orig_paths, revnum, author, date, message = entry
                 for path in orig_paths:
                     if not path.startswith(self.tags+'/'):
@@ -686,10 +704,11 @@
                     # ent.copyfrom_rev may not be the actual last revision
                     previd = self.latest(newpath, ent.copyfrom_rev)
                     if previd is not None:
-                        parents = [previd]
                         prevmodule, prevnum = self.revsplit(previd)[1:]
-                        self.ui.note('found parent of branch %s at %d: %s\n' %
-                                     (self.module, prevnum, prevmodule))
+                        if prevnum >= self.startrev:
+                            parents = [previd]
+                            self.ui.note('found parent of branch %s at %d: %s\n' %
+                                         (self.module, prevnum, prevmodule))
                 else:
                     self.ui.debug("No copyfrom path, don't know what to do.\n")
 
@@ -736,11 +755,14 @@
 
         try:
             firstcset = None
-            branched = False
+            lastonbranch = False
             stream = get_log(self.url, [self.module], from_revnum, to_revnum)
             try:
                 for entry in stream:
                     paths, revnum, author, date, message = entry
+                    if revnum < self.startrev:
+                        lastonbranch = True
+                        break
                     if self.is_blacklisted(revnum):
                         self.ui.note('skipping blacklisted revision %d\n' 
                                      % revnum)
@@ -748,16 +770,16 @@
                     if paths is None:
                         self.ui.debug('revision %d has no entries\n' % revnum)
                         continue
-                    cset, branched = parselogentry(paths, revnum, author, 
-                                                   date, message)
+                    cset, lastonbranch = parselogentry(paths, revnum, author, 
+                                                       date, message)
                     if cset:
                         firstcset = cset
-                    if branched:
+                    if lastonbranch:
                         break
             finally:
                 stream.close()
 
-            if not branched and firstcset and not firstcset.parents:
+            if not lastonbranch and firstcset and not firstcset.parents:
                 # The first revision of the sequence (the last fetched one)
                 # has invalid parents if not a branch root. Find the parent
                 # revision now, if any.