/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: John Arbash Meinel
  • Date: 2009-06-03 01:43:22 UTC
  • mfrom: (4290.1.13 bencode)
  • mto: This revision was merged to the branch mainline in revision 4410.
  • Revision ID: john@arbash-meinel.com-20090603014322-luyawuzu5f9v1llt
Merge the chk serializer, and update it for the new bencode locations.

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
 
17
17
"""Serializer object for CHK based inventory storage."""
18
18
 
 
19
from cStringIO import (
 
20
    StringIO,
 
21
    )
 
22
 
19
23
from bzrlib import (
 
24
    bencode,
 
25
    cache_utf8,
20
26
    inventory,
 
27
    osutils,
 
28
    revision as _mod_revision,
21
29
    xml5,
22
30
    xml6,
23
31
    )
24
32
 
25
 
 
26
 
class CHKSerializerSubtree(xml6.Serializer_v6):
 
33
class BEncodeRevisionSerializer1(object):
 
34
    """Simple revision serializer based around bencode. 
 
35
    
 
36
    It tries to group entries together that are less likely
 
37
    to change often, to make it easier to do compression.
 
38
    """
 
39
 
 
40
    def write_revision_to_string(self, rev):
 
41
        encode_utf8 = cache_utf8.encode
 
42
        ret = {
 
43
            "revision-id": rev.revision_id,
 
44
            "timestamp": "%.3f" % rev.timestamp,
 
45
            "parent-ids": rev.parent_ids,
 
46
            "inventory-sha1": rev.inventory_sha1,
 
47
            "committer": encode_utf8(rev.committer),
 
48
            "message": encode_utf8(rev.message),
 
49
            }
 
50
        revprops = {}
 
51
        for key, value in rev.properties.iteritems():
 
52
            revprops[key] = encode_utf8(value)
 
53
        ret["properties"] = revprops
 
54
        if rev.timezone is not None:
 
55
            ret["timezone"] = str(rev.timezone)
 
56
        return bencode.bencode(ret)
 
57
 
 
58
    def write_revision(self, rev, f):
 
59
        f.write(self.write_revision_to_string(rev))
 
60
 
 
61
    def read_revision_from_string(self, text):
 
62
        decode_utf8 = cache_utf8.decode
 
63
        ret = bencode.bdecode(text)
 
64
        rev = _mod_revision.Revision(
 
65
            committer=decode_utf8(ret["committer"]),
 
66
            revision_id=ret["revision-id"],
 
67
            parent_ids=ret["parent-ids"],
 
68
            inventory_sha1=ret["inventory-sha1"],
 
69
            timestamp=float(ret["timestamp"]),
 
70
            message=decode_utf8(ret["message"]),
 
71
            properties={})
 
72
        if "timezone" in ret:
 
73
            rev.timezone = int(ret["timezone"])
 
74
        else:
 
75
            rev.timezone = None
 
76
        for key, value in ret["properties"].iteritems():
 
77
            rev.properties[key] = decode_utf8(value)
 
78
        return rev
 
79
 
 
80
    def read_revision(self, f):
 
81
        return self.read_revision_from_string(f.read())
 
82
 
 
83
 
 
84
class CHKSerializerSubtree(BEncodeRevisionSerializer1, xml6.Serializer_v6):
27
85
    """A CHKInventory based serializer that supports tree references"""
28
86
 
29
87
    supported_kinds = set(['file', 'directory', 'symlink', 'tree-reference'])
64
122
 
65
123
 
66
124
chk_serializer_255_bigpage = CHKSerializer(65536, 'hash-255-way')
 
125
 
 
126
 
 
127
class CHKBEncodeSerializer(BEncodeRevisionSerializer1, CHKSerializer):
 
128
    """A CHKInventory and BEncode based serializer with 'plain' behaviour."""
 
129
 
 
130
    format_num = '10'
 
131
 
 
132
 
 
133
chk_bencode_serializer = CHKBEncodeSerializer(65536, 'hash-255-way')