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