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