1100
1100
:param serializer: A Serialiser like pack.ContainerSerializer.
1102
new_name = dict((k, v.encode('utf-8')) for k, v in
1103
viewitems(self._new_name))
1104
new_executability = dict((k, int(v)) for k, v in
1105
viewitems(self._new_executability))
1106
tree_path_ids = dict((k.encode('utf-8'), v)
1107
for k, v in viewitems(self._tree_path_ids))
1102
new_name = {k.encode('utf-8'): v.encode('utf-8')
1103
for k, v in viewitems(self._new_name)}
1104
new_parent = {k.encode('utf-8'): v.encode('utf-8')
1105
for k, v in viewitems(self._new_parent)}
1106
new_id = {k.encode('utf-8'): v
1107
for k, v in viewitems(self._new_id)}
1108
new_executability = {k: int(v)
1109
for k, v in viewitems(self._new_executability)}
1110
tree_path_ids = {k.encode('utf-8'): v.encode('utf-8')
1111
for k, v in viewitems(self._tree_path_ids)}
1112
non_present_ids = {k: v.encode('utf-8')
1113
for k, v in viewitems(self._non_present_ids)}
1114
removed_contents = [trans_id.encode('utf-8')
1115
for trans_id in self._removed_contents]
1116
removed_id = [trans_id.encode('utf-8')
1117
for trans_id in self._removed_id]
1109
1119
b'_id_number': self._id_number,
1110
1120
b'_new_name': new_name,
1111
b'_new_parent': self._new_parent,
1121
b'_new_parent': new_parent,
1112
1122
b'_new_executability': new_executability,
1113
b'_new_id': self._new_id,
1114
1124
b'_tree_path_ids': tree_path_ids,
1115
b'_removed_id': list(self._removed_id),
1116
b'_removed_contents': list(self._removed_contents),
1117
b'_non_present_ids': self._non_present_ids,
1125
b'_removed_id': removed_id,
1126
b'_removed_contents': removed_contents,
1127
b'_non_present_ids': non_present_ids,
1119
1129
yield serializer.bytes_record(bencode.bencode(attribs),
1120
1130
((b'attribs',),))
1130
1140
if kind == 'symlink':
1131
1141
content = self._read_symlink_target(trans_id)
1132
yield serializer.bytes_record(content, ((trans_id, kind),))
1142
if not isinstance(content, bytes):
1143
content = content.encode('utf-8')
1144
yield serializer.bytes_record(
1145
content, ((trans_id.encode('utf-8'), kind.encode('ascii')),))
1134
1147
def deserialize(self, records):
1135
1148
"""Deserialize a stored TreeTransform.
1140
1153
names, content = next(records)
1141
1154
attribs = bencode.bdecode(content)
1142
1155
self._id_number = attribs[b'_id_number']
1143
self._new_name = dict((k, v.decode('utf-8'))
1144
for k, v in viewitems(attribs[b'_new_name']))
1145
self._new_parent = attribs[b'_new_parent']
1146
self._new_executability = dict((k, bool(v))
1147
for k, v in viewitems(attribs[b'_new_executability']))
1148
self._new_id = attribs[b'_new_id']
1149
self._r_new_id = dict((v, k) for k, v in viewitems(self._new_id))
1156
self._new_name = {k.decode('utf-8'): v.decode('utf-8')
1157
for k, v in viewitems(attribs[b'_new_name'])}
1158
self._new_parent = {k.decode('utf-8'): v.decode('utf-8')
1159
for k, v in viewitems(attribs[b'_new_parent'])}
1160
self._new_executability = {k: bool(v)
1161
for k, v in viewitems(attribs[b'_new_executability'])}
1162
self._new_id = {k.decode('utf-8'): v
1163
for k, v in viewitems(attribs[b'_new_id'])}
1164
self._r_new_id = {v: k for k, v in viewitems(self._new_id)}
1150
1165
self._tree_path_ids = {}
1151
1166
self._tree_id_paths = {}
1152
1167
for bytepath, trans_id in viewitems(attribs[b'_tree_path_ids']):
1153
1168
path = bytepath.decode('utf-8')
1169
trans_id = trans_id.decode('utf-8')
1154
1170
self._tree_path_ids[path] = trans_id
1155
1171
self._tree_id_paths[trans_id] = path
1156
self._removed_id = set(attribs[b'_removed_id'])
1157
self._removed_contents = set(attribs[b'_removed_contents'])
1158
self._non_present_ids = attribs[b'_non_present_ids']
1172
self._removed_id = {trans_id.decode('utf-8')
1173
for trans_id in attribs[b'_removed_id']}
1174
self._removed_contents = set(trans_id.decode('utf-8')
1175
for trans_id in attribs[b'_removed_contents'])
1176
self._non_present_ids = {k: v.decode('utf-8')
1177
for k, v in viewitems(attribs[b'_non_present_ids'])}
1159
1178
for ((trans_id, kind),), content in records:
1179
trans_id = trans_id.decode('utf-8')
1180
kind = kind.decode('ascii')
1160
1181
if kind == 'file':
1161
1182
mpdiff = multiparent.MultiParent.from_patch(content)
1162
1183
lines = mpdiff.to_lines(self._get_parents_texts(trans_id))