[PATCH] parsemail: Clarify exit codes

Daniel Axtens dja at axtens.net
Wed Mar 21 22:55:05 AEDT 2018


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.

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