def _read_next_entry(self, line, indent=1): """Read in a key-value pair """ if not line.startswith('#'): raise errors.MalformedHeader('Bzr header did not start with #') line = line[1:-1].decode('utf-8') # Remove the '#' and '\n' if line[:indent] == ' ' * indent: line = line[indent:] if not line: return None, None # Ignore blank lines loc = line.find(': ') if loc != -1: key = line[:loc] value = line[loc + 2:] if not value: value = self._read_many(indent=indent + 2) elif line[-1:] == ':': key = line[:-1] value = self._read_many(indent=indent + 2) else: raise errors.MalformedHeader('While looking for key: value pairs,' ' did not find the colon %r' % (line)) key = key.replace(' ', '_') #mutter('found %s: %s' % (key, value)) return key, value
def read_bundle(f): """Read in a bundle from a filelike object. :param f: A file-like object :return: A list of Bundle objects """ version = None for line in f: m = BUNDLE_HEADER_RE.match(line) if m: if m.group('lineending') != '': raise errors.UnsupportedEOLMarker() version = m.group('version') break elif line.startswith(BUNDLE_HEADER): raise errors.MalformedHeader( 'Extra characters after version number') m = CHANGESET_OLD_HEADER_RE.match(line) if m: version = m.group('version') raise errors.BundleNotSupported(version, 'old format bundles not supported') if version is None: raise errors.NotABundle('Did not find an opening header') # Now we have a version, to figure out how to read the bundle if version not in _serializers: raise errors.BundleNotSupported(version, 'version not listed in known versions') serializer = _serializers[version](version) return serializer.read(f)
def _handle_next(self, line): if line is None: return key, value = self._read_next_entry(line, indent=1) mutter('_handle_next %r => %r' % (key, value)) if key is None: return revision_info = self.info.revisions[-1] if key in revision_info.__dict__: if getattr(revision_info, key) is None: if key in ('file_id', 'revision_id', 'base_id'): value = value.encode('utf8') elif key in ('parent_ids'): value = [v.encode('utf8') for v in value] setattr(revision_info, key, value) else: raise errors.MalformedHeader('Duplicated Key: %s' % key) else: # What do we do with a key we don't recognize raise errors.MalformedHeader('Unknown Key: "%s"' % key)