return tuple(filter(lambda x: x != "", line.split("\t")))
+
+def parse_svn_dateprop(date):
+ return (properties.time_from_cstring(date) / 1000000.0, 0)
+
+
def parse_svn_revprops(svn_revprops, rev):
if svn_revprops.has_key(properties.PROP_REVISION_AUTHOR):
rev.committer = svn_revprops[properties.PROP_REVISION_AUTHOR]
pass
assert svn_revprops.has_key(properties.PROP_REVISION_DATE)
- rev.timestamp = properties.time_from_cstring(svn_revprops[properties.PROP_REVISION_DATE]) / 1000000.0
- rev.timezone = None
+ (rev.timestamp, rev.timezone) = parse_svn_dateprop(svn_revprops[properties.PROP_REVISION_DATE])
rev.properties = {}
from bzrlib.graph import CachingParentsProvider
from bzrlib.inventory import Inventory
from bzrlib.lockable_files import LockableFiles, TransportLock
-from bzrlib.repository import Repository, RepositoryFormat
+from bzrlib.repository import Repository, RepositoryFormat, needs_read_lock
from bzrlib.revisiontree import RevisionTree
from bzrlib.revision import Revision, NULL_REVISION, ensure_null
from bzrlib.transport import Transport, get_transport
import os
-from bzrlib.plugins.svn import changes, core, errors, logwalker
+from bzrlib.plugins.svn import changes, core, errors, logwalker, properties
from bzrlib.plugins.svn.branchprops import PathPropertyProvider
from bzrlib.plugins.svn.cache import create_cache_dir, sqlite3
from bzrlib.plugins.svn.changes import changes_path, find_prev_location
from bzrlib.plugins.svn.mapping import (SVN_PROP_BZR_REVISION_ID, SVN_REVPROP_BZR_SIGNATURE,
parse_revision_metadata, parse_revid_property,
parse_merge_property, BzrSvnMapping,
- get_default_mapping, parse_revision_id)
+ get_default_mapping, parse_revision_id,
+ parse_svn_dateprop)
from bzrlib.plugins.svn.mapping3 import BzrSvnMappingv3FileProps
from bzrlib.plugins.svn.parents import SqliteCachingParentsProvider
from bzrlib.plugins.svn.revids import CachingRevidMap, RevidMap
self._cached_revnum = self.transport.get_latest_revnum()
return self._cached_revnum
+ @needs_read_lock
+ def gather_stats(self, revid=None, committers=None):
+ result = {}
+ def revdate(revnum):
+ return parse_svn_dateprop(self._log.revprop_list(revnum)[properties.PROP_REVISION_DATE])
+ if committers is not None and revid is not None:
+ all_committers = set()
+ for rev in self.get_revisions(filter(lambda r: r is not None and r != NULL_REVISION, self.get_ancestry(revid))):
+ if rev.committer != '':
+ all_committers.add(rev.committer)
+ result['committers'] = len(all_committers)
+ result['firstrev'] = revdate(0)
+ result['latestrev'] = revdate(self.get_latest_revnum())
+ result['uuid'] = self.uuid
+ # Approximate number of revisions
+ result['revisions'] = self.get_latest_revnum()+1
+ return result
+
def get_mapping(self):
if self._default_mapping is None:
self._default_mapping = get_default_mapping().from_repository(self, self._hinted_branch_path)
ancestry = []
graph = self.get_graph()
for rev, parents in graph.iter_ancestry([revision_id]):
- if rev == NULL_REVISION:
- rev = None
ancestry.append(rev)
ancestry.reverse()
return ancestry
set_branching_scheme(repos, TrunkBranchingScheme())
self.assertEqual([], list(repos.all_revision_ids()))
+ def test_gather_stats(self):
+ repos_url = self.make_repository("a")
+ repos = Repository.open(repos_url)
+ stats = repos.gather_stats()
+ self.assertEquals(1, stats['revisions'])
+ self.assertTrue(stats.has_key("firstrev"))
+ self.assertTrue(stats.has_key("latestrev"))
+ self.assertFalse(stats.has_key('committers'))
+
def test_all_revs(self):
repos_url = self.make_client("a", "dc")
self.build_tree({'dc/trunk/file': "data", "dc/foo/file":"data"})