~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/util/bencode.py

  • Committer: John Arbash Meinel
  • Date: 2008-08-18 22:34:21 UTC
  • mto: (3606.5.6 1.6)
  • mto: This revision was merged to the branch mainline in revision 3641.
  • Revision ID: john@arbash-meinel.com-20080818223421-todjny24vj4faj4t
Add tests for the fetching behavior.

The proper parameter passed is 'unordered' add an assert for it, and
fix callers that were passing 'unsorted' instead.
Add tests that we make the right get_record_stream call based
on the value of _fetch_uses_deltas.
Fix the fetch request for signatures.

Show diffs side-by-side

added added

removed removed

Lines of Context:
9
9
# publish, distribute, sublicense, and/or sell copies of the Software,
10
10
# and to permit persons to whom the Software is furnished to do so,
11
11
# subject to the following conditions:
12
 
#
 
12
13
13
# The above copyright notice and this permission notice shall be
14
14
# included in all copies or substantial portions of the Software.
15
 
#
16
 
# Modifications copyright (C) 2008 Canonical Ltd
17
 
 
18
 
class BDecoder(object):
19
 
 
20
 
    def __init__(self, yield_tuples=False):
21
 
        """Constructor.
22
 
 
23
 
        :param yield_tuples: if true, decode "l" elements as tuples rather than
24
 
            lists.
25
 
        """
26
 
        self.yield_tuples = yield_tuples
27
 
        decode_func = {}
28
 
        decode_func['l'] = self.decode_list
29
 
        decode_func['d'] = self.decode_dict
30
 
        decode_func['i'] = self.decode_int
31
 
        decode_func['0'] = self.decode_string
32
 
        decode_func['1'] = self.decode_string
33
 
        decode_func['2'] = self.decode_string
34
 
        decode_func['3'] = self.decode_string
35
 
        decode_func['4'] = self.decode_string
36
 
        decode_func['5'] = self.decode_string
37
 
        decode_func['6'] = self.decode_string
38
 
        decode_func['7'] = self.decode_string
39
 
        decode_func['8'] = self.decode_string
40
 
        decode_func['9'] = self.decode_string
41
 
        self.decode_func = decode_func
42
 
 
43
 
    def decode_int(self, x, f):
44
 
        f += 1
45
 
        newf = x.index('e', f)
46
 
        try:
47
 
            n = int(x[f:newf])
48
 
        except (OverflowError, ValueError):
49
 
            n = long(x[f:newf])
50
 
        if x[f] == '-':
51
 
            if x[f + 1] == '0':
52
 
                raise ValueError
53
 
        elif x[f] == '0' and newf != f+1:
54
 
            raise ValueError
55
 
        return (n, newf+1)
56
 
 
57
 
    def decode_string(self, x, f):
58
 
        colon = x.index(':', f)
59
 
        try:
60
 
            n = int(x[f:colon])
61
 
        except (OverflowError, ValueError):
62
 
            n = long(x[f:colon])
63
 
        if x[f] == '0' and colon != f+1:
64
 
            raise ValueError
65
 
        colon += 1
66
 
        return (x[colon:colon+n], colon+n)
67
 
 
68
 
    def decode_list(self, x, f):
69
 
        r, f = [], f+1
70
 
        while x[f] != 'e':
71
 
            v, f = self.decode_func[x[f]](x, f)
72
 
            r.append(v)
73
 
        if self.yield_tuples:
74
 
            r = tuple(r)
75
 
        return (r, f + 1)
76
 
 
77
 
    def decode_dict(self, x, f):
78
 
        r, f = {}, f+1
79
 
        lastkey = None
80
 
        while x[f] != 'e':
81
 
            k, f = self.decode_string(x, f)
82
 
            if lastkey >= k:
83
 
                raise ValueError
84
 
            lastkey = k
85
 
            r[k], f = self.decode_func[x[f]](x, f)
86
 
        return (r, f + 1)
87
 
 
88
 
    def bdecode(self, x):
89
 
        if type(x) != str:
90
 
            raise TypeError
91
 
        try:
92
 
            r, l = self.decode_func[x[0]](x, 0)
93
 
        except (IndexError, KeyError):
94
 
            raise ValueError
95
 
        if l != len(x):
96
 
            raise ValueError
97
 
        return r
98
 
 
99
 
 
100
 
_decoder = BDecoder()
101
 
bdecode = _decoder.bdecode
102
 
 
103
 
_tuple_decoder = BDecoder(True)
104
 
bdecode_as_tuple = _tuple_decoder.bdecode
 
15
 
16
# The Software is provided "AS IS", without warranty of any kind,
 
17
# express or implied, including but not limited to the warranties of
 
18
# merchantability,  fitness for a particular purpose and
 
19
# noninfringement. In no event shall the  authors or copyright holders
 
20
# be liable for any claim, damages or other liability, whether in an
 
21
# action of contract, tort or otherwise, arising from, out of or in
 
22
# connection with the Software or the use or other dealings in the
 
23
# Software.
 
24
 
 
25
def decode_int(x, f):
 
26
    f += 1
 
27
    newf = x.index('e', f)
 
28
    try:
 
29
        n = int(x[f:newf])
 
30
    except (OverflowError, ValueError):
 
31
        n = long(x[f:newf])
 
32
    if x[f] == '-':
 
33
        if x[f + 1] == '0':
 
34
            raise ValueError
 
35
    elif x[f] == '0' and newf != f+1:
 
36
        raise ValueError
 
37
    return (n, newf+1)
 
38
 
 
39
def decode_string(x, f):
 
40
    colon = x.index(':', f)
 
41
    try:
 
42
        n = int(x[f:colon])
 
43
    except (OverflowError, ValueError):
 
44
        n = long(x[f:colon])
 
45
    if x[f] == '0' and colon != f+1:
 
46
        raise ValueError
 
47
    colon += 1
 
48
    return (x[colon:colon+n], colon+n)
 
49
 
 
50
def decode_list(x, f):
 
51
    r, f = [], f+1
 
52
    while x[f] != 'e':
 
53
        v, f = decode_func[x[f]](x, f)
 
54
        r.append(v)
 
55
    return (r, f + 1)
 
56
 
 
57
def decode_dict(x, f):
 
58
    r, f = {}, f+1
 
59
    lastkey = None
 
60
    while x[f] != 'e':
 
61
        k, f = decode_string(x, f)
 
62
        if lastkey >= k:
 
63
            raise ValueError
 
64
        lastkey = k
 
65
        r[k], f = decode_func[x[f]](x, f)
 
66
    return (r, f + 1)
 
67
 
 
68
decode_func = {}
 
69
decode_func['l'] = decode_list
 
70
decode_func['d'] = decode_dict
 
71
decode_func['i'] = decode_int
 
72
decode_func['0'] = decode_string
 
73
decode_func['1'] = decode_string
 
74
decode_func['2'] = decode_string
 
75
decode_func['3'] = decode_string
 
76
decode_func['4'] = decode_string
 
77
decode_func['5'] = decode_string
 
78
decode_func['6'] = decode_string
 
79
decode_func['7'] = decode_string
 
80
decode_func['8'] = decode_string
 
81
decode_func['9'] = decode_string
 
82
 
 
83
def bdecode(x):
 
84
    try:
 
85
        r, l = decode_func[x[0]](x, 0)
 
86
    except (IndexError, KeyError):
 
87
        raise ValueError
 
88
    if l != len(x):
 
89
        raise ValueError
 
90
    return r
105
91
 
106
92
 
107
93
from types import StringType, IntType, LongType, DictType, ListType, TupleType
147
133
 
148
134
try:
149
135
    from types import BooleanType
150
 
except ImportError:
151
 
    pass
152
 
else:
153
 
    def encode_bool(x,r):
154
 
        encode_int(int(x), r)
155
 
    encode_func[BooleanType] = encode_bool
156
 
 
157
 
from bzrlib._static_tuple_py import StaticTuple
158
 
encode_func[StaticTuple] = encode_list
159
 
try:
160
 
    from bzrlib._static_tuple_c import StaticTuple
161
 
except ImportError:
162
 
    pass
163
 
else:
164
 
    encode_func[StaticTuple] = encode_list
165
 
 
 
136
    encode_func[BooleanType] = encode_int
 
137
except ImportError:
 
138
    pass
166
139
 
167
140
def bencode(x):
168
141
    r = []