[PATCH] parsemail: Clarify exit codes

Daniel Axtens dja at axtens.net
Wed Mar 21 23:07:07 AEDT 2018


Daniel Axtens <dja at axtens.net> writes:

> Daniel Axtens <dja at axtens.net> writes:
>
>> jk reports that the patchwork error codes are really unhelpful for
>> correct integration with an MDA. In particular they make sorting out
>> failures into a separate queue very difficult. Make this better and
>> clearer.
>>
>> Update the comment for parse_mail regarding return values and exceptions
>> to line up with how the function actually works and how we use the
>> results.
>>
>
> jk applied this to OzLabs and used it to verify the bugs fixed in
> stable/2.0, so I am considering that to be a pretty solid test, and
> am merging this to master and stable/2.0.

Hmm, nope, we need fixes to the tests first. v2 to come.

Regards,
Daniel

>
> Regards,
> Daniel
>
>> Reported-by: Jeremy Kerr <jk at ozlabs.org>
>> Fixes: #171
>> Signed-off-by: Daniel Axtens <dja at axtens.net>
>> ---
>>  patchwork/management/commands/parsemail.py | 16 ++++++++++++----
>>  patchwork/parser.py                        |  9 ++++++++-
>>  2 files changed, 20 insertions(+), 5 deletions(-)
>>
>> diff --git a/patchwork/management/commands/parsemail.py b/patchwork/management/commands/parsemail.py
>> index 52ec8bc56899..1ed12ae886cf 100644
>> --- a/patchwork/management/commands/parsemail.py
>> +++ b/patchwork/management/commands/parsemail.py
>> @@ -77,12 +77,20 @@ class Command(base.BaseCommand):
>>              logger.warning("Broken email ignored")
>>              return
>>  
>> +        # it's important to get exit codes correct here. The key is to allow
>> +        # proper separation of real errors vs expected 'failures'.
>> +        #
>> +        # patch/comment parsed:        0
>> +        # no parseable content found:  0
>> +        # db integrity/other db error: 1 (this will mean dups are logged, which
>> +        #                                 might get annoying - we'll see)
>> +        # broken email (ValueError):   1 (this could also be noisy, if an issue
>> +        #                                 we could use a different return code)
>>          try:
>>              result = parse_mail(mail, options['list_id'])
>> -            if result:
>> -                sys.exit(0)
>> -            logger.warning('Failed to parse mail')
>> -            sys.exit(1)
>> +            if result is None:
>> +                logger.warning('Nothing added to database')
>>          except Exception:
>>              logger.exception('Error when parsing incoming email',
>>                               extra={'mail': mail.as_string()})
>> +            sys.exit(1)
>> diff --git a/patchwork/parser.py b/patchwork/parser.py
>> index c1f40a577fa3..019ca20bb159 100644
>> --- a/patchwork/parser.py
>> +++ b/patchwork/parser.py
>> @@ -922,7 +922,14 @@ def parse_mail(mail, list_id=None):
>>          list_id (str): Mailing list ID
>>  
>>      Returns:
>> -        None
>> +        patch/cover letter/comment
>> +        Or None if nothing is found in the mail
>> +                   or X-P-H: ignore
>> +                   or project not found
>> +
>> +    Raises:
>> +        ValueError if there is an error in parsing
>> +        Some db errors are passed through (e.g. IntegrityError)
>>      """
>>      # some basic sanity checks
>>      if 'From' not in mail:
>> -- 
>> 2.14.1


More information about the Patchwork mailing list