345 if not self.head: |
345 if not self.head: |
346 raise util.Abort(_('no revision found in module %s') |
346 raise util.Abort(_('no revision found in module %s') |
347 % self.module) |
347 % self.module) |
348 self.last_changed = self.revnum(self.head) |
348 self.last_changed = self.revnum(self.head) |
349 |
349 |
350 self._changescache = None |
350 self._changescache = (None, None) |
351 |
351 |
352 if os.path.exists(os.path.join(url, '.svn/entries')): |
352 if os.path.exists(os.path.join(url, '.svn/entries')): |
353 self.wc = url |
353 self.wc = url |
354 else: |
354 else: |
355 self.wc = None |
355 self.wc = None |
442 _('svn: no revision found after start revision %d') |
442 _('svn: no revision found after start revision %d') |
443 % self.startrev) |
443 % self.startrev) |
444 |
444 |
445 return self.heads |
445 return self.heads |
446 |
446 |
447 def getchanges(self, rev): |
447 def _getchanges(self, rev): |
448 if self._changescache and self._changescache[0] == rev: |
|
449 return self._changescache[1] |
|
450 self._changescache = None |
|
451 (paths, parents) = self.paths[rev] |
448 (paths, parents) = self.paths[rev] |
452 if parents: |
449 if parents: |
453 files, self.removed, copies = self.expandpaths(rev, paths, parents) |
450 files, self.removed, copies = self.expandpaths(rev, paths, parents) |
454 else: |
451 else: |
455 # Perform a full checkout on roots |
452 # Perform a full checkout on roots |
461 copies = {} |
458 copies = {} |
462 self.removed = set() |
459 self.removed = set() |
463 |
460 |
464 files.sort() |
461 files.sort() |
465 files = zip(files, [rev] * len(files)) |
462 files = zip(files, [rev] * len(files)) |
466 |
|
467 # caller caches the result, so free it here to release memory |
|
468 del self.paths[rev] |
|
469 return (files, copies) |
463 return (files, copies) |
470 |
464 |
|
465 def getchanges(self, rev): |
|
466 # reuse cache from getchangedfiles |
|
467 if self._changescache[0] == rev: |
|
468 (files, copies) = self._changescache[1] |
|
469 else: |
|
470 (files, copies) = self._getchanges(rev) |
|
471 # caller caches the result, so free it here to release memory |
|
472 del self.paths[rev] |
|
473 return (files, copies) |
|
474 |
471 def getchangedfiles(self, rev, i): |
475 def getchangedfiles(self, rev, i): |
472 changes = self.getchanges(rev) |
476 # called from filemap - cache computed values for reuse in getchanges |
473 self._changescache = (rev, changes) |
477 (files, copies) = self._getchanges(rev) |
474 return [f[0] for f in changes[0]] |
478 self._changescache = (rev, (files, copies)) |
|
479 return [f[0] for f in files] |
475 |
480 |
476 def getcommit(self, rev): |
481 def getcommit(self, rev): |
477 if rev not in self.commits: |
482 if rev not in self.commits: |
478 uuid, module, revnum = revsplit(rev) |
483 uuid, module, revnum = revsplit(rev) |
479 self.module = module |
484 self.module = module |