[MERGE] don't report malformed bundles as NotABundle
John Arbash Meinel
john at arbash-meinel.com
Wed Jun 21 18:09:30 BST 2006
Aaron Bentley wrote:
> John Arbash Meinel wrote:
>>> I don't think 'assertNotRaises' is really what we want.
>>> I think we want a fixed exception to be raised (MalformedBundle).
>
> I think it's a bug in our implementation that crlf bundle cause
> MalformedBundle to be raised.
>
>>> As far
>>> as the "doesn't raise anything" case, that is already handled by *not*
>>> catching the exception at all.
>
> If we say 'assertRaises', it's a failure if it doesn't raise.
>
> Aaron
But assertNotRaises could raise an IOError, or BadBundle, or IndexError,
or KeyError, or anything.
If you want it to succeed, then just perform the action and don't
assertRaises().
I agree that bundles should support \r\n as much as they support \n. In
the loop to find the header of the bundle, we are currently doing:
if found:
# not all mailers will keep trailing whitespace
if line == '#\n':
line = '# \n'
if (not line.startswith('# ') or not line.endswith('\n')
or line[2:-1].decode('utf-8') != header[0]):
raise MalformedHeader('Found a header, but it'
' was improperly formatted')
header.pop(0) # We read this line.
if not header:
break # We found everything.
elif (line.startswith('#') and line.endswith('\n')):
line = line[1:-1].strip().decode('utf-8')
if line[:len(header_str)] == header_str:
if line == header[0]:
found = True
else:
raise MalformedHeader('Found what looks like'
' a header, but did not match')
header.pop(0)
I could see changing this line to be:
if found:
if (not line.startswith('#')
or line[1:].strip().decode('utf-8') != header[0]):
raise MalformedHeader...
header.pop(0) # We handled the header line
if not header:
break # We have read all the lines of the header
elif line.startswith('#'):
try:
line = line[1:].strip().decode('utf-8')
except UnicodeDecodeError:
continue # This can't be a bundle header line, it isn't utf8
if line.startswith(header_str):
if line == header[0]:
found = True
else:
raise MalformedHeader(....)
header.pop(0)
And then in '_read_next_entry()' we can change this line:
line = line[1:-1].decode('utf-8') # Remove the '#' and '\n'
to
line = line[1:].rstrip().decode('utf-8')
The initial indent is important, so we can't strip it (yet).
The other piece is that I was originally planning on changing from a
custom serializer to using RIO to read/write the information, and just
wrap around the RIO iterator so that we prepend/strip the '# ' for each
line.
So for any lines that start with '#' we can strip the trailing
whitespace. We obviously can't do that for patch lines.
John
=:->
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 254 bytes
Desc: OpenPGP digital signature
Url : https://lists.ubuntu.com/archives/bazaar/attachments/20060621/81ef9bfc/attachment.pgp
More information about the bazaar
mailing list