> +++ b/patchwork/bin/parsemail.sh > @@ -24,6 +24,8 @@ PATCHWORK_BASE=`readlink -e $BIN_DIR/../..` > > PYTHONPATH="$PATCHWORK_BASE":"$PATCHWORK_BASE/lib/python:$PYTHONPATH" \ > DJANGO_SETTINGS_MODULE=patchwork.settings.production \ > - "$PATCHWORK_BASE/patchwork/bin/parsemail.py" > + "$PATCHWORK_BASE/patchwork/manage.py parsemail" $@
So, I went to test this and found a couple of other issues: - If you quote the entire thing, you try to execute the program manage.py\ parsemail - not what you want. The quote needs to be moved to after manage.py. - manage.py lives in PATCHWORK_BASE, not PATCHWORK_BASE/patchwork/ - This will fail in the Python 3 case. (It'd also be nice to be able to override DJANGO_SETTINGS_MODULE.) Both of these are only really issues when you're testing, rather than production issues. Regards, Daniel > > +# NOTE(stephenfin): We must return 0 here. For more information, refer > +# to https://patchwork.ozlabs.org/patch/602248/ > exit 0 > diff --git a/patchwork/management/commands/parsemail.py > b/patchwork/management/commands/parsemail.py > new file mode 100644 > index 0000000..b1599e3 > --- /dev/null > +++ b/patchwork/management/commands/parsemail.py > @@ -0,0 +1,61 @@ > +# Patchwork - automated patch tracking system > +# Copyright (C) 2016 Intel Corporation > +# > +# This file is part of the Patchwork package. > +# > +# Patchwork is free software; you can redistribute it and/or modify > +# it under the terms of the GNU General Public License as published by > +# the Free Software Foundation; either version 2 of the License, or > +# (at your option) any later version. > +# > +# Patchwork is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with Patchwork; if not, write to the Free Software > +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA > + > +from email import message_from_file > +import logging > +from optparse import make_option > +import sys > + > +from django.core.management import base > + > +from patchwork.parser import parse_mail > + > +logger = logging.getLogger(__name__) > + > + > +class Command(base.BaseCommand): > + help = 'Parse an mbox file and store any patch/comment found' > + args = '<infile>' # Django < 1.8 compatibility > + option_list = base.BaseCommand.option_list + ( > + make_option( > + '--list-id', > + help='mailing list ID. If not supplied, this will be extracted ' > + 'from the mail headers.' > + ), > + ) > + > + def handle(self, *args, **options): > + # Attempt to parse the path if provided, and fallback to stdin if not > + if args: > + logger.info('Parsing mail loaded by filename') > + with open(args[0]) as file_: > + mail = message_from_file(file_) > + else: > + logger.info('Parsing mail loaded from stdin') > + mail = message_from_file(sys.stdin) > + > + try: > + result = parse_mail(mail, options['list_id']) > + if result: > + sys.exit(0) > + logger.warning('Failed to parse mail.') > + sys.exit(1) > + except Exception as exc: > + logger.exception('Error when parsing incoming email', > + extra={'mail': mail.as_string()}) > diff --git a/patchwork/parser.py b/patchwork/parser.py > index 1805df8..51de997 100644 > --- a/patchwork/parser.py > +++ b/patchwork/parser.py > @@ -42,7 +42,7 @@ _hunk_re = re.compile(r'^\@\@ -\d+(?:,(\d+))? > \+\d+(?:,(\d+))? \@\@') > _filename_re = re.compile(r'^(---|\+\+\+) (\S+)') > list_id_headers = ['List-ID', 'X-Mailing-List', 'X-list'] > > -LOGGER = logging.getLogger(__name__) > +logger = logging.getLogger(__name__) > > > def normalise_space(str): > @@ -599,7 +599,7 @@ def parse_mail(mail, list_id=None): > > hint = mail.get('X-Patchwork-Hint', '').lower() > if hint == 'ignore': > - LOGGER.debug("Ignoring email due to 'ignore' hint") > + logger.debug("Ignoring email due to 'ignore' hint") > return > > if list_id: > @@ -608,7 +608,7 @@ def parse_mail(mail, list_id=None): > project = find_project_by_header(mail) > > if project is None: > - LOGGER.error('Failed to find a project for email') > + logger.error('Failed to find a project for email') > return > > # parse content > @@ -651,7 +651,7 @@ def parse_mail(mail, list_id=None): > delegate=delegate, > state=find_state(mail)) > patch.save() > - LOGGER.debug('Patch saved') > + logger.debug('Patch saved') > > return patch > elif x == 0: # (potential) cover letters > @@ -683,7 +683,7 @@ def parse_mail(mail, list_id=None): > submitter=author, > content=message) > cover_letter.save() > - LOGGER.debug('Cover letter saved') > + logger.debug('Cover letter saved') > > return cover_letter > > @@ -704,7 +704,7 @@ def parse_mail(mail, list_id=None): > submitter=author, > content=message) > comment.save() > - LOGGER.debug('Comment saved') > + logger.debug('Comment saved') > > return comment > > diff --git a/patchwork/settings/base.py b/patchwork/settings/base.py > index b78ed4b..a32710f 100644 > --- a/patchwork/settings/base.py > +++ b/patchwork/settings/base.py > @@ -125,6 +125,8 @@ STATICFILES_DIRS = [ > # Third-party application settings > # > > +# rest_framework > + > try: > # django rest framework isn't a standard package in most distros, so > # don't make it compulsory > @@ -136,17 +138,65 @@ try: > except ImportError: > pass > > -# > -# Third-party application settings > -# > - > -# rest_framework > > REST_FRAMEWORK = { > 'DEFAULT_VERSIONING_CLASS': > 'rest_framework.versioning.NamespaceVersioning' > } > > # > +# Logging settings > +# > + > +LOGGING = { > + 'version': 1, > + 'disable_existing_loggers': False, > + 'formatters': { > + 'email': { > + 'format': '== Mail\n\n%(mail)s\n\n== Traceback\n', > + }, > + }, > + 'filters': { > + 'require_debug_false': { > + '()': 'django.utils.log.RequireDebugFalse', > + }, > + 'require_debug_true': { > + '()': 'django.utils.log.RequireDebugTrue', > + }, > + }, > + 'handlers': { > + 'console': { > + 'level': 'DEBUG', > + 'filters': ['require_debug_true'], > + 'class': 'logging.StreamHandler', > + }, > + 'mail_admins': { > + 'level': 'ERROR', > + 'filters': ['require_debug_false'], > + 'class': 'django.utils.log.AdminEmailHandler', > + 'formatter': 'email', > + 'include_html': True, > + }, > + }, > + 'loggers': { > + 'django': { > + 'handlers': ['console'], > + 'level': 'INFO', > + 'propagate': True, > + }, > + 'patchwork.parser': { > + 'handlers': ['console'], > + 'level': 'DEBUG', > + 'propagate': False, > + }, > + 'patchwork.management.commands': { > + 'handlers': ['console', 'mail_admins'], > + 'level': 'INFO', > + 'propagate': True, > + }, > + }, > +} > + > +# > # Patchwork settings > # > > -- > 2.7.4 > > _______________________________________________ > Patchwork mailing list > [email protected] > https://lists.ozlabs.org/listinfo/patchwork
signature.asc
Description: PGP signature
_______________________________________________ Patchwork mailing list [email protected] https://lists.ozlabs.org/listinfo/patchwork
