bodhi/new.py | 65 +++++++++++++++++++++++++--------------- bodhi/tests/test_controllers.py | 2 - 2 files changed, 43 insertions(+), 24 deletions(-)
New commits: commit e2e8864dd8dc3a4293135b1c9371b5e3ee8d9278 Author: Luke Macken lmacken@redhat.com Date: Wed Jul 21 02:40:31 2010 -0400
Update a unit test to work with our recent grid tweaks
diff --git a/bodhi/tests/test_controllers.py b/bodhi/tests/test_controllers.py index 6c06242..4a86638 100644 --- a/bodhi/tests/test_controllers.py +++ b/bodhi/tests/test_controllers.py @@ -2026,7 +2026,7 @@ class TestControllers(testutil.DBTest): assert '100 updates found' in cherrypy.response.body[0], cherrypy.response.body[0] json = simplejson.loads(cherrypy.response.body[0]) assert json['num_items'] == 100, json['num_items'] - assert len(json['updates']) == 20, len(json['updates']) + assert len(json['updates']) == 25, len(json['updates'])
## Try getting all 100 testutil.create_request('/updates/list?tg_format=json&tg_paginate_limit=100',
commit 8c90438f7257af7241d4c89d7017361cf7a9ed0b Author: Luke Macken lmacken@redhat.com Date: Wed Jul 21 02:33:57 2010 -0400
Have our build auto-completion field query koji for potential candidates.
This fixes tickets #173, #457, and most of #312.
diff --git a/bodhi/new.py b/bodhi/new.py index a628032..cc47db5 100644 --- a/bodhi/new.py +++ b/bodhi/new.py @@ -1,4 +1,3 @@ -# $Id: new.py,v 1.8 2007/01/06 08:03:21 lmacken Exp $ # This program 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; version 2 of the License. @@ -16,25 +15,37 @@ import os import logging
from os.path import join +from operator import itemgetter from turbogears import expose, controllers, identity, config, flash
from bodhi.widgets import NewUpdateForm +from bodhi.buildsys import get_session +from bodhi.model import Release from bodhi.util import url
log = logging.getLogger(__name__) update_form = NewUpdateForm()
-class NewUpdateController(controllers.Controller): +packages = [] + +# Load the list of packages from koji +if config.get('buildsystem') == 'koji': + try: + koji = get_session() + packages = [pkg['package_name'] for pkg in koji.listPackages()] + log.debug("%d packages loaded from koji" % len(packages)) + except Exception, e: + log.exception(e) + log.error("There was a problem loading the package list from koji") +else: + # Resort to looking on the filesystem for the package names + try: + packages = os.listdir(config.get('build_dir')) + except (OSError, TypeError): + log.warning("Warning: build_dir either invalid or not set in app.cfg")
- build_dir = config.get('build_dir') - packages = []
- def build_pkglist(self): - """ Cache a list of packages used for the package AutoCompleteField """ - try: - self.packages = os.listdir(self.build_dir) - except (OSError, TypeError): - log.warning("Warning: build_dir either invalid or not set in app.cfg") +class NewUpdateController(controllers.Controller):
@identity.require(identity.not_anonymous()) @expose(template="bodhi.templates.form") @@ -42,7 +53,6 @@ class NewUpdateController(controllers.Controller): notice = config.get('newupdate_notice') if notice: flash(notice) - self.build_pkglist() return dict(form=update_form, values=kw, action=url("/save"), title='New Update Form')
@@ -55,21 +65,30 @@ class NewUpdateController(controllers.Controller): """ if not name: return dict() matches = [] - if not self.packages: self.build_pkglist() - if name[-1] == '-' and name[:-1] and name[:-1] in self.packages: - name = name[:-1] - for version in os.listdir(join(self.build_dir, name)): - for release in os.listdir(join(self.build_dir, name, version)): - matches.append('-'.join((name, version, release))) + pkgname = name[:-1] + if name[-1] == '-' and pkgname and pkgname in packages: + name = pkgname + matches.extend(self._fetch_candidate_builds(pkgname)) else: - for pkg in self.packages: + for pkg in packages: if name == pkg: - for version in os.listdir(join(self.build_dir, name)): - for release in os.listdir(join(self.build_dir, name, - version)): - matches.append('-'.join((name, version, release))) + matches.extend(self._fetch_candidate_builds(pkg)) break elif pkg.startswith(name): matches.append(pkg) - matches.reverse() return dict(pkgs=matches) + + def _fetch_candidate_builds(self, pkg): + """ Return all candidate builds for a given package """ + matches = {} + koji = get_session() + koji.multicall = True + for tag in [r.candidate_tag for r in Release.select()]: + koji.getLatestBuilds(tag, package=pkg) + results = koji.multiCall() + for result in results: + for entries in result: + for entry in entries: + matches[entry['nvr']] = entry['completion_time'] + return [build[0] for build in + sorted(matches.items(), key=itemgetter(1), reverse=True)]