Rev 1665: Cache tags. in http://people.samba.org/bzr/jelmer/bzr-svn/trunk

Jelmer Vernooij jelmer at samba.org
Tue Aug 26 05:29:45 BST 2008


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

------------------------------------------------------------
revno: 1665
revision-id: jelmer at samba.org-20080826042943-z23vhmva3wfnxjrm
parent: jelmer at samba.org-20080826040939-burapuad97m3eyv4
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.4
timestamp: Tue 2008-08-26 06:29:43 +0200
message:
  Cache tags.
modified:
  repository.py                  repository.py-20060306123302-1f8c5069b3fe0265
  tags.py                        tags.py-20080822211316-scblu3akdvu0b64c-1
=== modified file 'repository.py'
--- a/repository.py	2008-08-26 04:09:39 +0000
+++ b/repository.py	2008-08-26 04:29:43 +0000
@@ -194,6 +194,7 @@
         self._default_mapping = None
         self._hinted_branch_path = branch_path
         self._real_parents_provider = self
+        self._cached_tags = {}
 
         cache = self.get_config().get_use_cache()
 
@@ -239,6 +240,7 @@
             self._clear_cached_state()
 
     def _clear_cached_state(self):
+        self._cached_tags = {}
         self._cached_revnum = None
         self._parents_provider = CachingParentsProvider(self._real_parents_provider)
 
@@ -877,7 +879,7 @@
         return dict([(layout.get_tag_name(p, project), revid) for (p, revid) in tags.items() if revid is not None])
 
     @needs_read_lock
-    def find_tags(self, project, layout=None, from_revnum=0, to_revnum=None):
+    def find_tags(self, project, layout=None, mapping=None, revnum=None):
         """Find tags underneath this repository for the specified project.
 
         :param layout: Repository layout to use
@@ -885,40 +887,19 @@
         :param project: Name of the project to find tags for. None for all.
         :return: Dictionary mapping tag names to revision ids.
         """
+        if revnum is None:
+            revnum = self.get_latest_revnum()
+
         if layout is None:
             layout = self.get_layout()
 
-        if to_revnum is None:
-            to_revnum = self.get_latest_revnum()
-
-        mapping = self.get_mapping()
-
-        tags = {}
-        pb = ui.ui_factory.nested_progress_bar()
-        try:
-            tag_paths = list(layout.get_tags(to_revnum, project=project, pb=pb))
-            for i, (project, bp, nick) in enumerate(tag_paths):
-                pb.update("finding tags", i, len(tag_paths))
-                npb = ui.ui_factory.nested_progress_bar()
-                try:
-                    it = self.iter_changes(bp, from_revnum=to_revnum, 
-                                           to_revnum=0, mapping=mapping, 
-                                           pb=npb, limit=2)
-                    (bp, paths, rev, _) = it.next()
-                    if paths.has_key(bp):
-                        del paths[bp]
-                        if not changes.changes_path(paths, bp, False):
-                            try:
-                                (bp, _, rev, _) = it.next()
-                            except StopIteration:
-                                pass
-                finally:
-                    npb.finished()
-                
-                tags[nick] = self.generate_revision_id(rev, bp, mapping)
-        finally:
-            pb.finished()
-        return tags
+        if mapping is None:
+            mapping = self.get_mapping()
+
+        if not (layout, mapping) in self._cached_tags:
+            self._cached_tags[layout,mapping] = self.find_tags_between(project=project,
+                    layout=layout, mapping=mapping, from_revnum=0, to_revnum=revnum)
+        return self._cached_tags[layout,mapping]
 
     def find_branchpaths(self, check_path, check_parent_path, 
                          from_revnum=0, to_revnum=None, 

=== modified file 'tags.py'
--- a/tags.py	2008-08-26 03:32:23 +0000
+++ b/tags.py	2008-08-26 04:29:43 +0000
@@ -96,12 +96,10 @@
         except KeyError:
             raise NoSuchTag(tag_name)
 
-    def get_tag_dict(self, _from_revnum=0):
-        return self.repository.find_tags_between(project=self.branch.project, 
+    def get_tag_dict(self):
+        return self.repository.find_tags(project=self.branch.project, 
                               layout=self.branch.layout,
-                              mapping=self.branch.mapping,
-                              from_revnum=_from_revnum, 
-                              to_revnum=self.repository.get_latest_revnum())
+                              mapping=self.branch.mapping)
 
     def get_reverse_tag_dict(self):
         """Returns a dict with revisions as keys




More information about the bazaar-commits mailing list