/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/util/bencode.py

 * Hook up the new remote method ``RemoteBzrDir.find_repositoryV2`` so
   that it is now attempted first when lookup up repositories, leading to
   an extra round trip on older bzr smart servers but supporting the
   feature on newer servers. (Robert Collins)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# bencode structured encoding
 
2
#
 
3
# Written by Petru Paler
 
4
#
 
5
# Permission is hereby granted, free of charge, to any person
 
6
# obtaining a copy of this software and associated documentation files
 
7
# (the "Software"), to deal in the Software without restriction,
 
8
# including without limitation the rights to use, copy, modify, merge,
 
9
# publish, distribute, sublicense, and/or sell copies of the Software,
 
10
# and to permit persons to whom the Software is furnished to do so,
 
11
# subject to the following conditions:
 
12
 
13
# The above copyright notice and this permission notice shall be
 
14
# included in all copies or substantial portions of the Software.
 
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
 
91
 
 
92
 
 
93
from types import StringType, IntType, LongType, DictType, ListType, TupleType
 
94
 
 
95
class Bencached(object):
 
96
    __slots__ = ['bencoded']
 
97
 
 
98
    def __init__(self, s):
 
99
        self.bencoded = s
 
100
 
 
101
def encode_bencached(x,r):
 
102
    r.append(x.bencoded)
 
103
 
 
104
def encode_int(x, r):
 
105
    r.extend(('i', str(x), 'e'))
 
106
 
 
107
def encode_string(x, r):
 
108
    r.extend((str(len(x)), ':', x))
 
109
 
 
110
def encode_list(x, r):
 
111
    r.append('l')
 
112
    for i in x:
 
113
        encode_func[type(i)](i, r)
 
114
    r.append('e')
 
115
 
 
116
def encode_dict(x,r):
 
117
    r.append('d')
 
118
    ilist = x.items()
 
119
    ilist.sort()
 
120
    for k, v in ilist:
 
121
        r.extend((str(len(k)), ':', k))
 
122
        encode_func[type(v)](v, r)
 
123
    r.append('e')
 
124
 
 
125
encode_func = {}
 
126
encode_func[type(Bencached(0))] = encode_bencached
 
127
encode_func[IntType] = encode_int
 
128
encode_func[LongType] = encode_int
 
129
encode_func[StringType] = encode_string
 
130
encode_func[ListType] = encode_list
 
131
encode_func[TupleType] = encode_list
 
132
encode_func[DictType] = encode_dict
 
133
 
 
134
try:
 
135
    from types import BooleanType
 
136
    encode_func[BooleanType] = encode_int
 
137
except ImportError:
 
138
    pass
 
139
 
 
140
def bencode(x):
 
141
    r = []
 
142
    encode_func[type(x)](x, r)
 
143
    return ''.join(r)
 
144