Rev 2907: Split _parse_segment out into a _parse_lines helper, reducing duplication with full index parsing. in http://people.ubuntu.com/~robertc/baz2.0/index
Robert Collins
robertc at robertcollins.net
Fri Oct 12 08:19:56 BST 2007
At http://people.ubuntu.com/~robertc/baz2.0/index
------------------------------------------------------------
revno: 2907
revision-id: robertc at robertcollins.net-20071012071947-6r3jplcjwtce8svg
parent: robertc at robertcollins.net-20071012070233-39ejidosqndttn7i
committer: Robert Collins <robertc at robertcollins.net>
branch nick: index
timestamp: Fri 2007-10-12 17:19:47 +1000
message:
Split _parse_segment out into a _parse_lines helper, reducing duplication with full index parsing.
modified:
bzrlib/index.py index.py-20070712131115-lolkarso50vjr64s-1
=== modified file 'bzrlib/index.py'
--- a/bzrlib/index.py 2007-10-12 07:02:33 +0000
+++ b/bzrlib/index.py 2007-10-12 07:19:47 +0000
@@ -276,7 +276,7 @@
mutter('Reading entire index %s', self._transport.abspath(self._name))
stream = self._transport.get(self._name)
self._read_prefix(stream)
- expected_elements = 3 + self._key_length
+ self._expected_elements = 3 + self._key_length
line_count = 0
# raw data keyed by offset
self._keys_by_offset = {}
@@ -285,34 +285,15 @@
self._nodes_by_key = {}
trailers = 0
pos = stream.tell()
- for line in stream.readlines():
- if line == '\n':
- trailers += 1
- continue
- elements = line.split('\0')
- if len(elements) != expected_elements:
- raise errors.BadIndexData(self)
- # keys are tuples
- key = tuple(elements[:self._key_length])
- absent, references, value = elements[-3:]
- value = value[:-1] # remove the newline
- ref_lists = []
- for ref_string in references.split('\t'):
- ref_lists.append(tuple([
- int(ref) for ref in ref_string.split('\r') if ref
- ]))
- ref_lists = tuple(ref_lists)
- self._keys_by_offset[pos] = (key, absent, ref_lists, value)
- pos += len(line)
+ lines = stream.read().split('\n')
+ del lines[-1]
+ _, _, _, trailers = self._parse_lines(lines, pos)
for key, absent, references, value in self._keys_by_offset.itervalues():
if absent:
continue
# resolve references:
if self.node_ref_lists:
- node_refs = []
- for ref_list in references:
- node_refs.append(tuple([self._keys_by_offset[ref][0] for ref in ref_list]))
- node_value = (value, tuple(node_refs))
+ node_value = (value, self._resolve_references(references))
else:
node_value = value
self._nodes[key] = node_value
@@ -849,12 +830,24 @@
lines = trimmed_data.split('\n')
del lines[-1]
pos = offset
+ first_key, last_key, nodes, _ = self._parse_lines(lines, pos)
+ for key, value in nodes:
+ self._bisect_nodes[key] = value
+ self._parsed_bytes(offset, first_key,
+ offset + len(trimmed_data), last_key)
+ return offset + len(trimmed_data), last_segment
+
+ def _parse_lines(self, lines, pos):
+ key = None
first_key = None
- key = None
+ trailers = 0
+ nodes = []
for line in lines:
if line == '':
# must be at the end
- assert self._size == pos + 1, "%s %s" % (self._size, pos)
+ if self._size:
+ assert self._size == pos + 1, "%s %s" % (self._size, pos)
+ trailers += 1
continue
elements = line.split('\0')
if len(elements) != self._expected_elements:
@@ -878,10 +871,9 @@
node_value = (value, ref_lists)
else:
node_value = value
- self._bisect_nodes[key] = node_value
+ nodes.append((key, node_value))
# print "parsed ", key
- self._parsed_bytes(offset, first_key, offset + len(trimmed_data), key)
- return offset + len(trimmed_data), last_segment
+ return first_key, key, nodes, trailers
def _parsed_bytes(self, start, start_key, end, end_key):
"""Mark the bytes from start to end as parsed.
More information about the bazaar-commits
mailing list