129
139
return self.read_revision_from_string(f.read())
132
class CHKSerializer(xml8.Serializer_v8):
142
class CHKSerializer(serializer.Serializer):
133
143
"""A CHKInventory based serializer with 'plain' behaviour."""
136
146
revision_format_num = None
137
147
support_altered_by_hack = False
148
supported_kinds = set(['file', 'directory', 'symlink'])
139
150
def __init__(self, node_size, search_key_name):
140
151
self.maximum_size = node_size
141
152
self.search_key_name = search_key_name
154
def _unpack_inventory(self, elt, revision_id=None, entry_cache=None,
155
return_from_cache=False):
156
"""Construct from XML Element"""
157
inv = xml_serializer.unpack_inventory_flat(elt, self.format_num,
158
xml_serializer.unpack_inventory_entry, entry_cache,
162
def read_inventory_from_string(self, xml_string, revision_id=None,
163
entry_cache=None, return_from_cache=False):
164
"""Read xml_string into an inventory object.
166
:param xml_string: The xml to read.
167
:param revision_id: If not-None, the expected revision id of the
169
:param entry_cache: An optional cache of InventoryEntry objects. If
170
supplied we will look up entries via (file_id, revision_id) which
171
should map to a valid InventoryEntry (File/Directory/etc) object.
172
:param return_from_cache: Return entries directly from the cache,
173
rather than copying them first. This is only safe if the caller
174
promises not to mutate the returned inventory entries, but it can
175
make some operations significantly faster.
178
return self._unpack_inventory(
179
xml_serializer.fromstring(xml_string), revision_id,
180
entry_cache=entry_cache,
181
return_from_cache=return_from_cache)
182
except xml_serializer.ParseError, e:
183
raise errors.UnexpectedInventoryFormat(e)
185
def read_inventory(self, f, revision_id=None):
186
"""Read an inventory from a file-like object."""
189
return self._unpack_inventory(self._read_element(f),
193
except xml_serializer.ParseError, e:
194
raise errors.UnexpectedInventoryFormat(e)
196
def write_inventory_to_lines(self, inv):
197
"""Return a list of lines with the encoded inventory."""
198
return self.write_inventory(inv, None)
200
def write_inventory_to_string(self, inv, working=False):
201
"""Just call write_inventory with a StringIO and return the value.
203
:param working: If True skip history data - text_sha1, text_size,
204
reference_revision, symlink_target.
207
self.write_inventory(inv, sio, working)
208
return sio.getvalue()
210
def write_inventory(self, inv, f, working=False):
211
"""Write inventory to a file.
213
:param inv: the inventory to write.
214
:param f: the file to write. (May be None if the lines are the desired
216
:param working: If True skip history data - text_sha1, text_size,
217
reference_revision, symlink_target.
218
:return: The inventory as a list of lines.
221
append = output.append
222
if inv.revision_id is not None:
223
revid1 = ' revision_id="'
224
revid2 = xml_serializer.encode_and_escape(inv.revision_id)
228
append('<inventory format="%s"%s%s>\n' % (
229
self.format_num, revid1, revid2))
230
append('<directory file_id="%s name="%s revision="%s />\n' % (
231
xml_serializer.encode_and_escape(inv.root.file_id),
232
xml_serializer.encode_and_escape(inv.root.name),
233
xml_serializer.encode_and_escape(inv.root.revision)))
234
xml_serializer.serialize_inventory_flat(inv,
236
root_id=None, supported_kinds=self.supported_kinds,
144
243
chk_serializer_255_bigpage = CHKSerializer(65536, 'hash-255-way')