[Checkins] SVN: z3c.vcsync/trunk/src/z3c/vcsync/svn.py Improved integration procedure.

Martijn Faassen faassen at infrae.com
Thu Jul 5 16:02:25 EDT 2007


Log message for revision 77480:
  Improved integration procedure.
  

Changed:
  U   z3c.vcsync/trunk/src/z3c/vcsync/svn.py

-=-
Modified: z3c.vcsync/trunk/src/z3c/vcsync/svn.py
===================================================================
--- z3c.vcsync/trunk/src/z3c/vcsync/svn.py	2007-07-05 20:00:10 UTC (rev 77479)
+++ z3c.vcsync/trunk/src/z3c/vcsync/svn.py	2007-07-05 20:02:25 UTC (rev 77480)
@@ -1,5 +1,9 @@
 import py
+from datetime import datetime
 
+# amount of log entries to search through in a single step
+LOG_STEP = 5
+
 class SvnCheckout(object):
     """A checkout for SVN.
 
@@ -16,6 +20,7 @@
         self.path = path
         self._files = set()
         self._removed = set()
+        self._updated = False
         
     def _repository_url(self):
         prefix = 'Repository Root: '
@@ -33,21 +38,59 @@
         return checkout_url[len(repos_url):]
     
     def up(self):        
-        original_rev = int(self.path.status().rev)
+        self.path.update()
+        self._updated = False
+        
+    def resolve(self):
+        pass
 
-        self.path.update()
+    def commit(self, message):
+        self.path.commit(message)
+
+    def files(self, dt):
+        self._update_files(dt)
+        return list(self._files)
     
-        now_rev = int(self.path.status().rev)
-        
-        if original_rev == now_rev:
+    def removed(self, dt):
+        # XXX strictly speaking update_files caching only works
+        # if dt arg is always the same as in files..
+        self._update_files(dt)
+        return list(self._removed)
+
+    def _update_files(self, dt):
+        """Go through svn log and update self._files and self._removed.
+        """
+        if self._updated:
             return
         
-        logs = self.path.log(original_rev + 1, now_rev, verbose=True)
-
         files = set()
         removed = set()
         checkout_path = self._checkout_path()
+
+        # step backwards through svn log until we're done
+        rev = int(self.path.status().rev)
+        while True:
+            prev_rev = rev - LOG_STEP
+            logs = self.path.log(prev_rev, rev, verbose=True)
+            done = self._update_from_logs(logs, dt, checkout_path,
+                                          files, removed)
+            if done:
+                break
+            rev = prev_rev - 1
+        
+        self._files = files
+        self._removed = removed
+        self._updated = True
+
+    def _update_from_logs(self, logs, dt, checkout_path, files, removed):
+        """Update files and removed from logs.
+
+        Return True if we're done.
+        """
         for log in logs:
+            log_dt = datetime.fromtimestamp(log.date)
+            if log_dt < dt:
+                return True
             for p in log.strpaths:
                 rel_path = p.strpath[len(checkout_path):]
                 steps = rel_path.split(self.path.sep)
@@ -56,18 +99,6 @@
                 if p.action == 'D':
                     removed.add(path)
                 else:
-                    files.add(path)
-        self._files = files
-        self._removed = removed
-        
-    def resolve(self):
-        pass
-
-    def commit(self, message):
-        self.path.commit(message)
-
-    def files(self):
-        return list(self._files)
+                    files.add(path)                
+        return False
     
-    def removed(self):
-        return list(self._removed)



More information about the Checkins mailing list