~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/rio.py

  • Committer: Martin Pool
  • Date: 2005-11-28 08:35:56 UTC
  • mto: (1185.33.61 bzr.dev)
  • mto: This revision was merged to the branch mainline in revision 1518.
  • Revision ID: mbp@sourcefrog.net-20051128083556-5a3d8423b567599c
Finish rio format and tests.

Show diffs side-by-side

added added

removed removed

Lines of Context:
137
137
            if value == '':
138
138
                result.append(tag + ': \n')
139
139
            elif '\n' in value:
140
 
                val_lines = value.splitlines()
 
140
                # don't want splitlines behaviour on empty lines
 
141
                val_lines = value.split('\n')
141
142
                result.append(tag + ': ' + val_lines[0] + '\n')
142
143
                for line in val_lines[1:]:
143
144
                    result.append('\t' + line + '\n')
186
187
    blank line follows the stanza, it is consumed.  It's not an error for
187
188
    there to be no blank at end of file.  If there is a blank file at the
188
189
    start of the input this is really an empty stanza and that is returned. 
 
190
 
 
191
    Only the stanza lines and the trailing blank (if any) are consumed
 
192
    from the line_iter.
189
193
    """
190
194
    items = []
191
 
    got_lines = False
192
195
    stanza = Stanza()
 
196
    tag = None
 
197
    accum_value = None
193
198
    for line in line_iter:
194
199
        if line == None or line == '':
195
200
            break       # end of file
196
 
        got_lines = True
197
201
        if line == '\n':
198
202
            break       # end of stanza
199
203
        assert line[-1] == '\n'
200
204
        real_l = line
201
 
        # extract tag
202
 
        try:
203
 
            colon_index = line.index(': ')
204
 
        except ValueError:
205
 
            raise ValueError('tag/value separator not found in line %r' % real_l)
206
 
        tag = line[:colon_index]
207
 
        assert valid_tag(tag), \
208
 
                "invalid rio tag %r" % tag
209
 
        value_start = line[colon_index+2:-1]
210
 
        # TODO: Handle multiline values
211
 
        value = value_start
212
 
        stanza.add(tag, value)
213
 
    if not got_lines:
214
 
        return None         # didn't see any content
215
 
    return stanza
 
205
        if line[0] == '\t': # continues previous value
 
206
            if tag is None:
 
207
                raise ValueError('invalid continuation line %r' % real_l)
 
208
            accum_value += '\n' + line[1:-1]
 
209
        else: # new tag:value line
 
210
            if tag is not None:
 
211
                stanza.add(tag, accum_value)
 
212
            try:
 
213
                colon_index = line.index(': ')
 
214
            except ValueError:
 
215
                raise ValueError('tag/value separator not found in line %r' % real_l)
 
216
            tag = line[:colon_index]
 
217
            assert valid_tag(tag), \
 
218
                    "invalid rio tag %r" % tag
 
219
            accum_value = line[colon_index+2:-1]
 
220
    if tag is not None: # add last tag-value
 
221
        stanza.add(tag, accum_value)
 
222
        return stanza
 
223
    else:     # didn't see any content
 
224
        return None