Add implementation and tests for stats.
authorJelmer Vernooij <jelmer@samba.org>
Thu, 26 Jun 2008 16:27:42 +0000 (18:27 +0200)
committerJelmer Vernooij <jelmer@samba.org>
Thu, 26 Jun 2008 16:27:42 +0000 (18:27 +0200)
mapping.py
repository.py
tests/test_blackbox.py
tests/test_repository.py

index 6e91d694bd211f0cc622b009c38d54887930e086..ac09e76fd65896c913ac61d32e64e5fdd7eb7093 100644 (file)
@@ -135,6 +135,11 @@ def parse_merge_property(line):
 
     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]
@@ -150,8 +155,7 @@ def parse_svn_revprops(svn_revprops, rev):
             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 = {}
 
 
index 67d8597e428f9433635c74d19eba66419091aa9e..8dcbedd207582cdf2d594ba351c331393d6038a3 100644 (file)
@@ -23,7 +23,7 @@ from bzrlib.errors import (InvalidRevisionId, NoSuchRevision, NotBranchError,
 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
@@ -31,7 +31,7 @@ from bzrlib.trace import info, mutter
 
 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
@@ -40,7 +40,8 @@ from bzrlib.plugins.svn.core import SubversionException
 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
@@ -247,6 +248,24 @@ class SvnRepository(Repository):
         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)
@@ -362,8 +381,6 @@ class SvnRepository(Repository):
         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
index 79d298c6f067b798f2578d7007b50275718a617f..e5d53c9bd1ed18a876ad1951d682dc3d278134e8 100644 (file)
@@ -42,6 +42,14 @@ class TestBranch(ExternalBase, TestCaseWithSubversionRepository):
         repos_url = self.make_repository('d')
         self.run_bzr('log %s' % repos_url)
 
+    def test_info(self):
+        repos_url = self.make_repository('d')
+        self.run_bzr('info %s' % repos_url)
+
+    def test_info_verbose(self):
+        repos_url = self.make_repository('d')
+        self.run_bzr('info -v %s' % repos_url)
+
     def test_dumpfile(self):
         filename = os.path.join(self.test_dir, "dumpfile")
         uuid = "606c7b1f-987c-4826-b37d-eb456ceb87e1"
index c06373623da39ddaf231c932f993fdbdefee3488..be00fb93097b76aaab3eb58e639dfe742c78bb2a 100644 (file)
@@ -248,6 +248,15 @@ class TestSubversionRepositoryWorks(TestCaseWithSubversionRepository):
         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"})