141
129
return self.read_revision_from_string(f.read())
144
class CHKSerializer(serializer.Serializer):
132
class CHKSerializer(xml8.Serializer_v8):
145
133
"""A CHKInventory based serializer with 'plain' behaviour."""
148
136
revision_format_num = None
149
137
support_altered_by_hack = False
150
supported_kinds = set(['file', 'directory', 'symlink', 'tree-reference'])
152
139
def __init__(self, node_size, search_key_name):
153
140
self.maximum_size = node_size
154
141
self.search_key_name = search_key_name
156
def _unpack_inventory(self, elt, revision_id=None, entry_cache=None,
157
return_from_cache=False):
158
"""Construct from XML Element"""
159
inv = xml_serializer.unpack_inventory_flat(elt, self.format_num,
160
xml_serializer.unpack_inventory_entry, entry_cache,
164
def read_inventory_from_string(self, xml_string, revision_id=None,
165
entry_cache=None, return_from_cache=False):
166
"""Read xml_string into an inventory object.
168
:param xml_string: The xml to read.
169
:param revision_id: If not-None, the expected revision id of the
171
:param entry_cache: An optional cache of InventoryEntry objects. If
172
supplied we will look up entries via (file_id, revision_id) which
173
should map to a valid InventoryEntry (File/Directory/etc) object.
174
:param return_from_cache: Return entries directly from the cache,
175
rather than copying them first. This is only safe if the caller
176
promises not to mutate the returned inventory entries, but it can
177
make some operations significantly faster.
180
return self._unpack_inventory(
181
xml_serializer.fromstring(xml_string), revision_id,
182
entry_cache=entry_cache,
183
return_from_cache=return_from_cache)
184
except xml_serializer.ParseError, e:
185
raise errors.UnexpectedInventoryFormat(e)
187
def read_inventory(self, f, revision_id=None):
188
"""Read an inventory from a file-like object."""
191
return self._unpack_inventory(self._read_element(f),
195
except xml_serializer.ParseError, e:
196
raise errors.UnexpectedInventoryFormat(e)
198
def write_inventory_to_lines(self, inv):
199
"""Return a list of lines with the encoded inventory."""
200
return self.write_inventory(inv, None)
202
def write_inventory_to_string(self, inv, working=False):
203
"""Just call write_inventory with a StringIO and return the value.
205
:param working: If True skip history data - text_sha1, text_size,
206
reference_revision, symlink_target.
209
self.write_inventory(inv, sio, working)
210
return sio.getvalue()
212
def write_inventory(self, inv, f, working=False):
213
"""Write inventory to a file.
215
:param inv: the inventory to write.
216
:param f: the file to write. (May be None if the lines are the desired
218
:param working: If True skip history data - text_sha1, text_size,
219
reference_revision, symlink_target.
220
:return: The inventory as a list of lines.
223
append = output.append
224
if inv.revision_id is not None:
225
revid1 = ' revision_id="'
226
revid2 = xml_serializer.encode_and_escape(inv.revision_id)
230
append('<inventory format="%s"%s%s>\n' % (
231
self.format_num, revid1, revid2))
232
append('<directory file_id="%s name="%s revision="%s />\n' % (
233
xml_serializer.encode_and_escape(inv.root.file_id),
234
xml_serializer.encode_and_escape(inv.root.name),
235
xml_serializer.encode_and_escape(inv.root.revision)))
236
xml_serializer.serialize_inventory_flat(inv,
238
root_id=None, supported_kinds=self.supported_kinds,
245
144
chk_serializer_255_bigpage = CHKSerializer(65536, 'hash-255-way')