27
27
revision as _mod_revision,
31
from bzrlib.util.bencode import (
33
class RIORevisionSerializer1(object):
34
"""Simple revision serializer based around RIO.
36
class BEncodeRevisionSerializer1(object):
37
"""Simple revision serializer based around bencode.
36
39
It tries to group entries together that are less likely
37
40
to change often, to make it easier to do compression.
40
def _write_revision_stanza(self, rev):
42
decode_utf8 = cache_utf8.decode
43
revision_id = decode_utf8(rev.revision_id)
44
s.add("revision-id", revision_id)
45
s.add("timestamp", "%.3f" % rev.timestamp)
46
for p in rev.parent_ids:
47
s.add("parent-id", decode_utf8(p))
48
s.add("inventory-sha1", rev.inventory_sha1)
49
s.add("committer", rev.committer)
43
def write_revision_to_string(self, rev):
44
encode_utf8 = cache_utf8.encode
46
"revision-id": rev.revision_id,
47
"timestamp": "%.3f" % rev.timestamp,
48
"parent-ids": rev.parent_ids,
49
"inventory-sha1": rev.inventory_sha1,
50
"committer": encode_utf8(rev.committer),
51
"message": encode_utf8(rev.message),
54
for key, value in rev.properties.iteritems():
55
revprops[key] = encode_utf8(value)
56
ret["properties"] = revprops
50
57
if rev.timezone is not None:
51
s.add("timezone", str(rev.timezone))
53
for k, v in rev.properties.iteritems():
54
if isinstance(v, str):
56
s.add("property-" + k, v)
57
s.add("message", rev.message)
58
ret["timezone"] = str(rev.timezone)
60
61
def write_revision(self, rev, f):
62
s = self._write_revision_stanza(rev)
65
def write_revision_to_string(self, rev):
66
s = self._write_revision_stanza(rev)
69
def _read_revision_stanza(self, s):
70
rev = _mod_revision.Revision(None)
74
for (field, value) in s.iter_pairs():
75
if field == "revision-id":
76
rev.revision_id = cache_utf8.encode(value)
77
elif field == "parent-id":
78
rev.parent_ids.append(cache_utf8.encode(value))
79
elif field == "committer":
81
elif field == "inventory-sha1":
82
rev.inventory_sha1 = value
83
elif field == "timezone":
84
rev.timezone = int(value)
85
elif field == "timestamp":
86
rev.timestamp = float(value)
87
elif field == "message":
89
elif field.startswith("property-"):
90
rev.properties[field[len("property-"):]] = value
92
raise AssertionError("Unknown field %s" % field)
62
f.write(self.write_revision_to_string(rev))
64
def read_revision_from_string(self, text):
65
decode_utf8 = cache_utf8.decode
67
rev = _mod_revision.Revision(
68
committer=decode_utf8(ret["committer"]),
69
revision_id=ret["revision-id"],
70
parent_ids=ret["parent-ids"],
71
inventory_sha1=ret["inventory-sha1"],
72
timestamp=float(ret["timestamp"]),
73
message=decode_utf8(ret["message"]),
76
rev.timezone = int(ret["timezone"])
79
for key, value in ret["properties"].iteritems():
80
rev.properties[key] = decode_utf8(value)
95
83
def read_revision(self, f):
96
s = rio.read_stanza(f)
97
return self._read_revision_stanza(s)
99
def read_revision_from_string(self, text):
100
s = rio.read_stanza(StringIO(text))
101
return self._read_revision_stanza(s)
104
class CHKSerializerSubtree(RIORevisionSerializer1, xml6.Serializer_v6):
84
return self.read_revision_from_string(f.read())
87
class CHKSerializerSubtree(BEncodeRevisionSerializer1, xml6.Serializer_v6):
105
88
"""A CHKInventory based serializer that supports tree references"""
107
90
supported_kinds = set(['file', 'directory', 'symlink', 'tree-reference'])