comparison hgext/convert/subversion.py @ 4772:69548a9d9796

convert: fetch svn changes on demand (in batches)
author Brendan Cully <brendan@kublai.com>
date Sun, 01 Jul 2007 23:28:21 -0700
parents e2292928cbe6
children cfbce076f2de
comparison
equal deleted inserted replaced
4771:e2292928cbe6 4772:69548a9d9796
25 except ImportError: 25 except ImportError:
26 pass 26 pass
27 27
28 class CompatibilityException(Exception): pass 28 class CompatibilityException(Exception): pass
29 29
30 nbRevisionsPerFetch = 50 30 LOG_BATCH_SIZE = 50
31 31
32 class svn_entry(object): 32 class svn_entry(object):
33 """Emulate a Subversion path change.""" 33 """Emulate a Subversion path change."""
34 __slots__ = ['path', 'copyfrom_path', 'copyfrom_rev', 'action'] 34 __slots__ = ['path', 'copyfrom_path', 'copyfrom_rev', 'action']
35 def __init__(self, entry): 35 def __init__(self, entry):
124 latest = svn.ra.get_latest_revnum(self.ra) 124 latest = svn.ra.get_latest_revnum(self.ra)
125 dirent = svn.ra.stat(self.ra, self.module, latest) 125 dirent = svn.ra.stat(self.ra, self.module, latest)
126 self.last_changed = dirent.created_rev 126 self.last_changed = dirent.created_rev
127 127
128 self.head = self.rev(self.last_changed) 128 self.head = self.rev(self.last_changed)
129
130 # Should lazily fetch revisions in batches of, say, 1,000...:
131 self._fetch_revisions(from_revnum=self.last_changed, to_revnum=0)
132 129
133 def rev(self, revnum): 130 def rev(self, revnum):
134 return (u"svn:%s%s@%s" % (self.uuid, self.module, revnum)).decode(self.encoding) 131 return (u"svn:%s%s@%s" % (self.uuid, self.module, revnum)).decode(self.encoding)
135 132
136 def get_blacklist(self): 133 def get_blacklist(self):
156 svn_url = self.base + module 153 svn_url = self.base + module
157 self.ui.debug("reparent to %s\n" % svn_url.encode(self.encoding)) 154 self.ui.debug("reparent to %s\n" % svn_url.encode(self.encoding))
158 svn.ra.reparent(self.ra, svn_url.encode(self.encoding)) 155 svn.ra.reparent(self.ra, svn_url.encode(self.encoding))
159 156
160 def _fetch_revisions(self, from_revnum = 0, to_revnum = 347, pb=None): 157 def _fetch_revisions(self, from_revnum = 0, to_revnum = 347, pb=None):
161 self.parent_cset = None 158 if not hasattr(self, 'child_rev'):
162 self.child_cset = None 159 self.child_rev = from_revnum
163 160 self.child_cset = self.commits.get(self.child_rev)
161 else:
162 self.commits[self.child_rev] = self.child_cset
163
164 self.ui.debug('Fetching revisions %d to %d\n' % (from_revnum, to_revnum)) 164 self.ui.debug('Fetching revisions %d to %d\n' % (from_revnum, to_revnum))
165 165
166 def get_entry_from_path(path, module=self.module): 166 def get_entry_from_path(path, module=self.module):
167 # Given the repository url of this wc, say 167 # Given the repository url of this wc, say
168 # "http://server/plone/CMFPlone/branches/Plone-2_0-branch" 168 # "http://server/plone/CMFPlone/branches/Plone-2_0-branch"
386 386
387 log = message and self.recode(message) 387 log = message and self.recode(message)
388 author = author and self.recode(author) or '' 388 author = author and self.recode(author) or ''
389 389
390 cset = commit(author=author, 390 cset = commit(author=author,
391 date=util.datestr(date), 391 date=util.datestr(date),
392 desc=log, 392 desc=log,
393 parents=[], 393 parents=[],
394 copies=copies, 394 copies=copies,
395 branch=branch) 395 branch=branch)
396 396
397 if self.child_cset is not None: 397 if self.child_cset and self.child_rev != rev:
398 self.child_cset.parents = [rev] 398 self.child_cset.parents = [rev]
399 399 self.commits[self.child_rev] = self.child_cset
400 self.child_cset = cset 400 self.child_cset = cset
401 401 self.child_rev = rev
402 self.commits[rev] = cset
403 402
404 try: 403 try:
405 discover_changed_paths = True 404 discover_changed_paths = True
406 strict_node_history = False 405 strict_node_history = False
407 svn.ra.get_log(self.ra, [self.module], from_revnum, to_revnum, 406 svn.ra.get_log(self.ra, [self.module], from_revnum, to_revnum,
463 cl = files 462 cl = files
464 cl.sort() 463 cl.sort()
465 return cl 464 return cl
466 465
467 def getcommit(self, rev): 466 def getcommit(self, rev):
467 if rev not in self.commits:
468 revnum = int(rev.split('@')[-1])
469 minrev = revnum - LOG_BATCH_SIZE > 0 and revnum - LOG_BATCH_SIZE or 0
470 self._fetch_revisions(from_revnum=revnum, to_revnum=minrev)
468 return self.commits[rev] 471 return self.commits[rev]
469 472
470 def gettags(self): 473 def gettags(self):
471 return [] 474 return []
472 475