/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/chk_serializer.py

  • Committer: Jelmer Vernooij
  • Date: 2009-05-25 22:34:26 UTC
  • mto: (4398.5.2 bencode_serializer)
  • mto: This revision was merged to the branch mainline in revision 4410.
  • Revision ID: jelmer@samba.org-20090525223426-01v9i5iush24to3z
Use bencode rather than rio in the new revision serialiszer.

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
    inventory,
26
26
    osutils,
27
27
    revision as _mod_revision,
28
 
    rio,
29
28
    xml5,
30
29
    xml6,
31
30
    )
 
31
from bzrlib.util.bencode import (
 
32
    bdecode,
 
33
    bencode,
 
34
    )
32
35
 
33
 
class RIORevisionSerializer1(object):
34
 
    """Simple revision serializer based around RIO. 
 
36
class BEncodeRevisionSerializer1(object):
 
37
    """Simple revision serializer based around bencode. 
35
38
    
36
39
    It tries to group entries together that are less likely
37
40
    to change often, to make it easier to do compression.
38
41
    """
39
42
 
40
 
    def _write_revision_stanza(self, rev):
41
 
        s = rio.Stanza()
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
 
45
        ret = {
 
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),
 
52
            }
 
53
        revprops = {}
 
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))
52
 
        if rev.properties:
53
 
            for k, v in rev.properties.iteritems():
54
 
                if isinstance(v, str):
55
 
                    v = decode_utf8(v)
56
 
                s.add("property-" + k, v)
57
 
        s.add("message", rev.message)
58
 
        return s
 
58
            ret["timezone"] = str(rev.timezone)
 
59
        return bencode(ret)
59
60
 
60
61
    def write_revision(self, rev, f):
61
 
        w = rio.RioWriter(f)
62
 
        s = self._write_revision_stanza(rev)
63
 
        w.write_stanza(s)
64
 
 
65
 
    def write_revision_to_string(self, rev):
66
 
        s = self._write_revision_stanza(rev)
67
 
        return s.to_string()
68
 
 
69
 
    def _read_revision_stanza(self, s):
70
 
        rev = _mod_revision.Revision(None)
71
 
        rev.properties = {}
72
 
        rev.parent_ids = []
73
 
        rev.timezone = 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":
80
 
                rev.committer = value
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":
88
 
                rev.message = value
89
 
            elif field.startswith("property-"):
90
 
                rev.properties[field[len("property-"):]] = value
91
 
            else:
92
 
                raise AssertionError("Unknown field %s" % field)
 
62
        f.write(self.write_revision_to_string(rev))
 
63
 
 
64
    def read_revision_from_string(self, text):
 
65
        decode_utf8 = cache_utf8.decode
 
66
        ret = bdecode(text)
 
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"]),
 
74
            properties={})
 
75
        if "timezone" in ret:
 
76
            rev.timezone = int(ret["timezone"])
 
77
        else:
 
78
            rev.timezone = None
 
79
        for key, value in ret["properties"].iteritems():
 
80
            rev.properties[key] = decode_utf8(value)
93
81
        return rev
94
82
 
95
83
    def read_revision(self, f):
96
 
        s = rio.read_stanza(f)
97
 
        return self._read_revision_stanza(s)
98
 
 
99
 
    def read_revision_from_string(self, text):
100
 
        s = rio.read_stanza(StringIO(text))
101
 
        return self._read_revision_stanza(s)
102
 
 
103
 
 
104
 
class CHKSerializerSubtree(RIORevisionSerializer1, xml6.Serializer_v6):
 
84
        return self.read_revision_from_string(f.read())
 
85
 
 
86
 
 
87
class CHKSerializerSubtree(BEncodeRevisionSerializer1, xml6.Serializer_v6):
105
88
    """A CHKInventory based serializer that supports tree references"""
106
89
 
107
90
    supported_kinds = set(['file', 'directory', 'symlink', 'tree-reference'])
144
127
chk_serializer_255_bigpage = CHKSerializer(65536, 'hash-255-way')
145
128
 
146
129
 
147
 
class CHKRIOSerializer(RIORevisionSerializer1, CHKSerializer):
148
 
    """A CHKInventory and RIO based serializer with 'plain' behaviour."""
 
130
class CHKBEncodeSerializer(BEncodeRevisionSerializer1, CHKSerializer):
 
131
    """A CHKInventory and BEncode based serializer with 'plain' behaviour."""
149
132
 
150
133
    format_num = '10'
151
134
 
152
135
 
153
 
chk_rio_serializer = CHKRIOSerializer(65536, 'hash-255-way')
 
136
chk_bencode_serializer = CHKBEncodeSerializer(65536, 'hash-255-way')