[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