~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/rio.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2006-02-22 07:59:56 UTC
  • mfrom: (1553.5.33 bzr.mbp.locks)
  • Revision ID: pqm@pqm.ubuntu.com-20060222075956-fb281c427e571da6
add LockDir and related fixes

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
# Copyright (C) 2005 by Canonical Ltd
2
2
#
3
3
# Distributed under the GNU General Public Licence v2
4
 
#
 
4
 
5
5
# \subsection{\emph{rio} - simple text metaformat}
6
6
7
7
# \emph{r} stands for `restricted', `reproducible', or `rfc822-like'.
18
18
# stream representation of an object and vice versa, and that this relation
19
19
# will continue to hold for future versions of bzr.
20
20
 
21
 
# In comments, $\min(1,10)$
22
 
 
23
 
min(1,10)
24
 
 
25
21
import re
26
22
 
27
23
# XXX: some redundancy is allowing to write stanzas in isolation as well as
92
88
        """Append a name and value to the stanza."""
93
89
        assert valid_tag(tag), \
94
90
            ("invalid tag %r" % tag)
95
 
        if isinstance(value, (str, unicode)):
 
91
        if isinstance(value, str):
 
92
            value = unicode(value)
 
93
        elif isinstance(value, unicode):
96
94
            pass
97
95
        ## elif isinstance(value, (int, long)):
98
96
        ##    value = str(value)           # XXX: python2.4 without L-suffix
99
97
        else:
100
 
            raise ValueError("invalid value %r" % value)
 
98
            raise TypeError("invalid type for rio value: %r of type %s"
 
99
                            % (value, type(value)))
101
100
        self.items.append((tag, value))
102
101
        
103
102
    def __contains__(self, find_tag):
127
126
        return iter(self.items)
128
127
 
129
128
    def to_lines(self):
130
 
        """Generate sequence of lines for external version of this file."""
 
129
        """Generate sequence of lines for external version of this file.
 
130
        
 
131
        The lines are always utf-8 encoded strings.
 
132
        """
131
133
        if not self.items:
132
134
            # max() complains if sequence is empty
133
135
            return []
134
136
        result = []
135
137
        for tag, value in self.items:
136
 
            assert isinstance(value, (str, unicode))
 
138
            assert isinstance(tag, str)
 
139
            assert isinstance(value, unicode)
137
140
            if value == '':
138
141
                result.append(tag + ': \n')
139
142
            elif '\n' in value:
140
143
                # don't want splitlines behaviour on empty lines
141
144
                val_lines = value.split('\n')
142
 
                result.append(tag + ': ' + val_lines[0] + '\n')
 
145
                result.append(tag + ': ' + val_lines[0].encode('utf-8') + '\n')
143
146
                for line in val_lines[1:]:
144
 
                    result.append('\t' + line + '\n')
 
147
                    result.append('\t' + line.encode('utf-8') + '\n')
145
148
            else:
146
 
                result.append(tag + ': ' + value + '\n')
 
149
                result.append(tag + ': ' + value.encode('utf-8') + '\n')
147
150
        return result
148
151
 
149
152
    def to_string(self):
174
177
            if t == tag:
175
178
                r.append(v)
176
179
        return r
 
180
 
 
181
    def as_dict(self):
 
182
        """Return a dict containing the unique values of the stanza.
 
183
        """
 
184
        d = {}
 
185
        for tag, value in self.items:
 
186
            assert tag not in d
 
187
            d[tag] = value
 
188
        return d
177
189
         
178
190
_tag_re = re.compile(r'^[-a-zA-Z0-9_]+$')
179
191
def valid_tag(tag):
190
202
 
191
203
    Only the stanza lines and the trailing blank (if any) are consumed
192
204
    from the line_iter.
 
205
 
 
206
    The raw lines must be in utf-8 encoding.
193
207
    """
194
208
    items = []
195
209
    stanza = Stanza()
200
214
            break       # end of file
201
215
        if line == '\n':
202
216
            break       # end of stanza
 
217
        line = line.decode('utf-8')
203
218
        assert line[-1] == '\n'
204
219
        real_l = line
205
220
        if line[0] == '\t': # continues previous value