Rev 3382: Iter_lines_added_or_present_in_keys stacks. in http://people.ubuntu.com/~robertc/baz2.0/shallow-branch

Robert Collins robertc at robertcollins.net
Thu Jun 19 22:54:10 BST 2008


At http://people.ubuntu.com/~robertc/baz2.0/shallow-branch

------------------------------------------------------------
revno: 3382
revision-id: robertc at robertcollins.net-20080619215406-rmavu3lj4q2d6ryf
parent: robertc at robertcollins.net-20080619132744-zsz5c5cpv6sovwoy
committer: Robert Collins <robertc at robertcollins.net>
branch nick: stacking-knits
timestamp: Fri 2008-06-20 07:54:06 +1000
message:
  Iter_lines_added_or_present_in_keys stacks.
modified:
  bzrlib/knit.py                 knit.py-20051212171256-f056ac8f0fbe1bd9
  bzrlib/tests/test_knit.py      test_knit.py-20051212171302-95d4c00dd5f11f2b
  bzrlib/versionedfile.py        versionedfile.py-20060222045106-5039c71ee3b65490
=== modified file 'bzrlib/knit.py'
--- a/bzrlib/knit.py	2008-06-19 13:27:44 +0000
+++ b/bzrlib/knit.py	2008-06-19 21:54:06 +0000
@@ -1300,19 +1300,16 @@
         if pb is None:
             pb = progress.DummyProgress()
         keys = set(keys)
-        # filter for available keys
-        parent_map = self.get_parent_map(keys)
-        if len(parent_map) != len(keys):
-            missing = set(parent_map) - requested_keys
-            raise RevisionNotPresent(key, self.filename)
+        total = len(keys)
         # we don't care about inclusions, the caller cares.
         # but we need to setup a list of records to visit.
         # we need key, position, length
         key_records = []
         build_details = self._index.get_build_details(keys)
-        for key in keys:
-            key_records.append((key, build_details[key][0]))
-        total = len(key_records)
+        for key, details in build_details.iteritems():
+            if key in keys:
+                key_records.append((key, details[0]))
+                keys.remove(key)
         for key_idx, (key, data, sha_value) in \
             enumerate(self._read_records_iter(key_records)):
             pb.update('Walking content.', key_idx, total)
@@ -1328,6 +1325,16 @@
             # change to integrate into the rest of the codebase. RBC 20071110
             for line in line_iterator:
                 yield line, key
+        for source in self._fallback_vfs:
+            if not keys:
+                break
+            source_keys = set()
+            for line, key in source.iter_lines_added_or_present_in_keys(keys):
+                source_keys.add(key)
+                yield line, key
+            keys.difference_update(source_keys)
+        if keys:
+            raise RevisionNotPresent(keys, self.filename)
         pb.update('Walking content.', total, total)
 
     def _make_line_delta(self, delta_seq, new_content):

=== modified file 'bzrlib/tests/test_knit.py'
--- a/bzrlib/tests/test_knit.py	2008-06-19 13:27:44 +0000
+++ b/bzrlib/tests/test_knit.py	2008-06-19 21:54:06 +0000
@@ -1453,7 +1453,25 @@
         pass
 
     def test_iter_lines_added_or_present_in_keys(self):
-        pass
+        # Lines from the basis are returned, and lines for a given key are only
+        # returned once. 
+        key1 = ('foo1',)
+        key2 = ('foo2',)
+        # all sources are asked for keys:
+        basis, test = self.get_basis_and_test_knit()
+        basis.add_lines(key1, (), ["foo"])
+        basis.calls = []
+        lines = list(test.iter_lines_added_or_present_in_keys([key1]))
+        self.assertEqual([("foo\n", key1)], lines)
+        self.assertEqual([("iter_lines_added_or_present_in_keys", set([key1]))],
+            basis.calls)
+        # keys in both are not duplicated:
+        test.add_lines(key2, (), ["bar\n"])
+        basis.add_lines(key2, (), ["bar\n"])
+        basis.calls = []
+        lines = list(test.iter_lines_added_or_present_in_keys([key2]))
+        self.assertEqual([("bar\n", key2)], lines)
+        self.assertEqual([], basis.calls)
 
     def test_keys(self):
         key1 = ('foo1',)

=== modified file 'bzrlib/versionedfile.py'
--- a/bzrlib/versionedfile.py	2008-06-19 13:27:44 +0000
+++ b/bzrlib/versionedfile.py	2008-06-19 21:54:06 +0000
@@ -549,6 +549,10 @@
         self.calls.append(("get_sha1s", copy(keys)))
         return self._backing_vf.get_sha1s(keys)
 
+    def iter_lines_added_or_present_in_keys(self, keys, pb=None):
+        self.calls.append(("iter_lines_added_or_present_in_keys", copy(keys)))
+        return self._backing_vf.iter_lines_added_or_present_in_keys(keys)
+
     def keys(self):
         self.calls.append(("keys",))
         return self._backing_vf.keys()




More information about the bazaar-commits mailing list