Rev 2493: Fix annotate_iter to lock the basis tree appropriately. in http://bazaar.launchpad.net/~bzr/bzr/dirstate

Robert Collins robertc at robertcollins.net
Wed Mar 7 06:05:50 GMT 2007


At http://bazaar.launchpad.net/~bzr/bzr/dirstate

------------------------------------------------------------
revno: 2493
revision-id: robertc at robertcollins.net-20070307060453-57bjf3z967sc6cda
parent: robertc at robertcollins.net-20070307054158-j7yh62s59nz3rqdy
committer: Robert Collins <robertc at robertcollins.net>
branch nick: dirstate
timestamp: Wed 2007-03-07 17:04:53 +1100
message:
  Fix annotate_iter to lock the basis tree appropriately.
modified:
  bzrlib/workingtree.py          workingtree.py-20050511021032-29b6ec0a681e02e3
=== modified file 'bzrlib/workingtree.py'
--- a/bzrlib/workingtree.py	2007-03-07 01:14:11 +0000
+++ b/bzrlib/workingtree.py	2007-03-07 06:04:53 +0000
@@ -487,26 +487,30 @@
         """
         file_id = osutils.safe_file_id(file_id)
         basis = self.basis_tree()
-        changes = self._iter_changes(basis, True, [self.id2path(file_id)],
-            require_versioned=True).next()
-        changed_content, kind = changes[2], changes[6]
-        if not changed_content:
-            return basis.annotate_iter(file_id)
-        if kind[1] is None:
-            return None
-        import annotate
-        if kind[0] != 'file':
-            old_lines = []
-        else:
-            old_lines = list(basis.annotate_iter(file_id))
-        old = [old_lines]
-        for tree in self.branch.repository.revision_trees(
-            self.get_parent_ids()[1:]):
-            if file_id not in tree:
-                continue
-            old.append(list(tree.annotate_iter(file_id)))
-        return annotate.reannotate(old, self.get_file(file_id).readlines(),
-                                   CURRENT_REVISION)
+        basis.lock_read()
+        try:
+            changes = self._iter_changes(basis, True, [self.id2path(file_id)],
+                require_versioned=True).next()
+            changed_content, kind = changes[2], changes[6]
+            if not changed_content:
+                return basis.annotate_iter(file_id)
+            if kind[1] is None:
+                return None
+            import annotate
+            if kind[0] != 'file':
+                old_lines = []
+            else:
+                old_lines = list(basis.annotate_iter(file_id))
+            old = [old_lines]
+            for tree in self.branch.repository.revision_trees(
+                self.get_parent_ids()[1:]):
+                if file_id not in tree:
+                    continue
+                old.append(list(tree.annotate_iter(file_id)))
+            return annotate.reannotate(old, self.get_file(file_id).readlines(),
+                                       CURRENT_REVISION)
+        finally:
+            basis.unlock()
 
     def get_parent_ids(self):
         """See Tree.get_parent_ids.



More information about the bazaar-commits mailing list