1125
1127
return _PreviewTree(self)
1129
def _text_parent(self, trans_id):
1130
file_id = self.tree_file_id(trans_id)
1132
if file_id is None or self._tree.kind(file_id) != 'file':
1134
except errors.NoSuchFile:
1138
def _get_parents_texts(self, trans_id):
1139
"""Get texts for compression parents of this file."""
1140
file_id = self._text_parent(trans_id)
1143
return (self._tree.get_file_text(file_id),)
1145
def _get_parents_lines(self, trans_id):
1146
"""Get lines for compression parents of this file."""
1147
file_id = self._text_parent(trans_id)
1150
return (self._tree.get_file_lines(file_id),)
1152
def serialize(self, serializer):
1153
"""Serialize this TreeTransform.
1155
:param serializer: A Serialiser like pack.ContainerSerializer.
1157
new_name = dict((k, v.encode('utf-8')) for k, v in
1158
self._new_name.items())
1159
new_executability = dict((k, int(v)) for k, v in
1160
self._new_executability.items())
1161
tree_path_ids = dict((k.encode('utf-8'), v)
1162
for k, v in self._tree_path_ids.items())
1164
'_id_number': self._id_number,
1165
'_new_name': new_name,
1166
'_new_parent': self._new_parent,
1167
'_new_executability': new_executability,
1168
'_new_id': self._new_id,
1169
'_tree_path_ids': tree_path_ids,
1170
'_removed_id': list(self._removed_id),
1171
'_removed_contents': list(self._removed_contents),
1172
'_non_present_ids': self._non_present_ids,
1174
yield serializer.bytes_record(bencode.bencode(attribs),
1176
for trans_id, kind in self._new_contents.items():
1178
cur_file = open(self._limbo_name(trans_id), 'rb')
1180
lines = osutils.split_lines(cur_file.read())
1183
parents = self._get_parents_lines(trans_id)
1184
mpdiff = multiparent.MultiParent.from_lines(lines, parents)
1185
content = ''.join(mpdiff.to_patch())
1186
if kind == 'directory':
1188
if kind == 'symlink':
1189
content = os.readlink(self._limbo_name(trans_id))
1190
yield serializer.bytes_record(content, ((trans_id, kind),))
1193
def deserialize(self, records):
1194
"""Deserialize a stored TreeTransform.
1196
:param records: An iterable of (names, content) tuples, as per
1197
pack.ContainerPushParser.
1199
names, content = records.next()
1200
attribs = bencode.bdecode(content)
1201
self._id_number = attribs['_id_number']
1202
self._new_name = dict((k, v.decode('utf-8'))
1203
for k, v in attribs['_new_name'].items())
1204
self._new_parent = attribs['_new_parent']
1205
self._new_executability = dict((k, bool(v)) for k, v in
1206
attribs['_new_executability'].items())
1207
self._new_id = attribs['_new_id']
1208
self._r_new_id = dict((v, k) for k, v in self._new_id.items())
1209
self._tree_path_ids = {}
1210
self._tree_id_paths = {}
1211
for bytepath, trans_id in attribs['_tree_path_ids'].items():
1212
path = bytepath.decode('utf-8')
1213
self._tree_path_ids[path] = trans_id
1214
self._tree_id_paths[trans_id] = path
1215
self._removed_id = set(attribs['_removed_id'])
1216
self._removed_contents = set(attribs['_removed_contents'])
1217
self._non_present_ids = attribs['_non_present_ids']
1218
for ((trans_id, kind),), content in records:
1220
mpdiff = multiparent.MultiParent.from_patch(content)
1221
lines = mpdiff.to_lines(self._get_parents_texts(trans_id))
1222
self.create_file(lines, trans_id)
1223
if kind == 'directory':
1224
self.create_directory(trans_id)
1225
if kind == 'symlink':
1226
self.create_symlink(content.decode('utf-8'), trans_id)
1128
1229
class TreeTransform(TreeTransformBase):
1129
1230
"""Represent a tree transformation.