Add a rematch_packager management command

This allows quick resolution of all unmatched packages, especially after
tweaking the way find_user works.

Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
Dan McGee 2011-06-23 20:11:07 -05:00
parent 9156003d2d
commit 82289ebb44
3 changed files with 80 additions and 4 deletions

View File

@ -0,0 +1,64 @@
# -*- coding: utf-8 -*-
"""
rematch_packager command
Match all packages with a packager_str but NULL packager_id to a packager if we
can find one.
Usage: ./manage.py rematch_packager
"""
from django.core.management.base import NoArgsCommand
import sys
import logging
from devel.utils import UserFinder
from main.models import Package
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 = "Runs a check on all active mirror URLs to determine if they are reachable via IPv4 and/or v6."
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 match_packager()
def match_packager():
finder = UserFinder()
logger.info("getting all unmatched packages")
package_count = matched_count = 0
unknown = set()
for package in Package.objects.filter(packager__isnull=True):
logger.debug("package %s, packager string %s",
package.pkgname, package.packager_str)
package_count += 1
user = finder.find(package.packager_str)
if user:
package.packager = user
logger.debug(" found user %s" % user.username)
package.save()
matched_count += 1
else:
unknown.add(package.packager_str)
logger.info("%d packages checked, %d newly matched",
package_count, matched_count)
logger.debug("unknown packagers:\n%s",
"\n".join(unknown))
# vim: set ts=4 sw=4 et:

View File

@ -1,7 +1,7 @@
from django.test import TestCase
from django.contrib.auth.models import User
from devel.utils import UserFinder
from devel.utils import UserFinder
from main.models import UserProfile
class DevelTest(TestCase):
@ -87,6 +87,16 @@ def test_by_name(self):
self.assertEqual(self.user3,
self.finder.find("Bob Jones <bjones AT Arch Linux DOT org>"))
def test_by_invalid(self):
self.assertEqual(self.user1,
self.finder.find("Joe User <user1@example.com"))
self.assertEqual(self.user1,
self.finder.find("Joe 'nickname' User <user1@example.com"))
self.assertEqual(self.user1,
self.finder.find("Joe \"nickname\" User <user1@example.com"))
self.assertEqual(self.user1,
self.finder.find("Joe User <joe@differentdomain.com"))
def test_cache(self):
# simply look two of them up, but then do it repeatedly
for i in range(50):

View File

@ -88,10 +88,12 @@ def find(self, userstring):
return None
if userstring in self.cache:
return self.cache[userstring]
matches = re.match(r'^([^<]+)? ?<([^>]*)>', userstring)
name = email = None
matches = re.match(r'^([^<]+)? ?<([^>]*)>?', userstring)
if not matches:
name = userstring
email = None
name = userstring.strip()
else:
name = matches.group(1)
email = matches.group(2)