Rev 1354: Add implementation and tests for stats. in http://people.samba.org/bzr/jelmer/bzr-svn/0.4

Jelmer Vernooij jelmer at samba.org
Thu Jun 26 17:27:43 BST 2008


At http://people.samba.org/bzr/jelmer/bzr-svn/0.4

------------------------------------------------------------
revno: 1354
revision-id: jelmer at samba.org-20080626162742-u11ccsf6jfn13w82
parent: jelmer at samba.org-20080626153956-oeoak8n8or9nqn5q
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.4
timestamp: Thu 2008-06-26 18:27:42 +0200
message:
  Add implementation and tests for stats.
modified:
  mapping.py                     mapping.py-20080128201303-6cp01phc0dmc0kiv-1
  repository.py                  repository.py-20060306123302-1f8c5069b3fe0265
  tests/test_blackbox.py         test_blackbox.py-20070325150839-d10llf8arptpcfl6-1
  tests/test_repository.py       test_repos.py-20060508151940-ddc49a59257ca712
=== modified file 'mapping.py'
--- a/mapping.py	2008-06-22 23:44:07 +0000
+++ b/mapping.py	2008-06-26 16:27:42 +0000
@@ -135,6 +135,11 @@
 
     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 @@
             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 = {}
 
 

=== modified file 'repository.py'
--- a/repository.py	2008-06-26 13:41:46 +0000
+++ b/repository.py	2008-06-26 16:27:42 +0000
@@ -23,7 +23,7 @@
 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 @@
 
 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.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 @@
         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 @@
         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

=== modified file 'tests/test_blackbox.py'
--- a/tests/test_blackbox.py	2008-06-05 02:12:47 +0000
+++ b/tests/test_blackbox.py	2008-06-26 16:27:42 +0000
@@ -42,6 +42,14 @@
         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"

=== modified file 'tests/test_repository.py'
--- a/tests/test_repository.py	2008-06-23 18:58:17 +0000
+++ b/tests/test_repository.py	2008-06-26 16:27:42 +0000
@@ -248,6 +248,15 @@
         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"})




More information about the bazaar-commits mailing list