diff options
author | Dan McGee <dan@archlinux.org> | 2011-11-14 19:19:17 +0100 |
---|---|---|
committer | Dan McGee <dan@archlinux.org> | 2011-11-14 19:27:38 +0100 |
commit | 12408702eaf89ea338670ba808da9ef49e35c562 (patch) | |
tree | bd68ff85cadd03f88b5d5c333d33e9f62c69a953 /packages/management/commands/populate_signoffs.py | |
parent | b7439cacf08288d8533910e08d093e9276167ed2 (diff) | |
download | archweb-12408702eaf89ea338670ba808da9ef49e35c562.tar.gz archweb-12408702eaf89ea338670ba808da9ef49e35c562.tar.xz |
Allow population of signoff specs with SVN commit messages
This pulls them from the latest SVN commit on trunk. We don't have a
failproof method of getting the exact right commit, but this should be
close if it is run on a regular basis via cron (aka hourly).
Note that running locally, I needed the development version of South to
get the migration included here to apply because of information_schema
changes in the current version of MySQL.
Signed-off-by: Dan McGee <dan@archlinux.org>
Diffstat (limited to 'packages/management/commands/populate_signoffs.py')
-rw-r--r-- | packages/management/commands/populate_signoffs.py | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/packages/management/commands/populate_signoffs.py b/packages/management/commands/populate_signoffs.py new file mode 100644 index 0000000..5b5acba --- /dev/null +++ b/packages/management/commands/populate_signoffs.py @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- +""" +populate_signoffs command + +Pull the latest commit message from SVN for a given package that is +signoff-eligible and does not have an existing comment attached. + +Usage: ./manage.py populate_signoffs +""" + +from datetime import datetime +import logging +import subprocess +import sys +from xml.etree.ElementTree import XML + +from django.conf import settings +from django.contrib.auth.models import User +from django.core.management.base import NoArgsCommand + +from ...models import SignoffSpecification +from ...utils import get_signoff_groups + +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s -> %(levelname)s: %(message)s', + datefmt='%Y-%m-%d %H:%M:%S', + stream=sys.stderr) +logger = logging.getLogger() + +class Command(NoArgsCommand): + help = "Pull the latest commit message from SVN for a given package that is signoff-eligible and does not have an existing comment attached" + + def handle_noargs(self, **options): + v = int(options.get('verbosity', None)) + if v == 0: + logger.level = logging.ERROR + elif v == 1: + logger.level = logging.INFO + elif v == 2: + logger.level = logging.DEBUG + + return add_signoff_comments() + +def svn_log(pkgbase, repo): + path = '%s%s/%s/trunk/' % (settings.SVN_BASE_URL, repo.svn_root, pkgbase) + cmd = ['svn', 'log', '--limit=1', '--xml', path] + log_data = subprocess.check_output(cmd) + # the XML format is very very simple, especially with only one revision + xml = XML(log_data) + revision = int(xml.find('logentry').get('revision')) + date = datetime.strptime(xml.findtext('logentry/date'), + '%Y-%m-%dT%H:%M:%S.%fZ') + return { + 'revision': revision, + 'date': date, + 'author': xml.findtext('logentry/author'), + 'message': xml.findtext('logentry/msg'), + } + +def create_specification(package, log): + trimmed_message = log['message'].strip() + spec = SignoffSpecification(pkgbase=package.pkgbase, + pkgver=package.pkgver, pkgrel=package.pkgrel, + epoch=package.epoch, arch=package.arch, repo=package.repo, + comments=trimmed_message) + try: + spec.user = User.objects.get(username=log['author']) + except User.DoesNotExist: + pass + + return spec + +def add_signoff_comments(): + logger.info("getting all signoff groups") + groups = get_signoff_groups() + logger.info("%d signoff groups found", len(groups)) + + for group in groups: + if not group.default_spec: + continue + + logger.debug("getting SVN log for %s (%s)", group.pkgbase, group.repo) + log = svn_log(group.pkgbase, group.repo) + logger.info("creating spec with SVN message for %s", group.pkgbase) + spec = create_specification(group.packages[0], log) + spec.save() + +# vim: set ts=4 sw=4 et: |