bodhi.egg-info/requires.txt | 3 -
bodhi/overrides.py | 88 ++++++++++++++++++++++++++++++++----------
bodhi/templates/overrides.kid | 42 ++++++++++----------
bodhi/tools/client.py | 80 ++++++++++++++++++++++++++++----------
bodhi/widgets.py | 2
setup.py | 1
6 files changed, 152 insertions(+), 64 deletions(-)
New commits:
commit 4cd41d323e9c820d5cb91b32f3f83400d1a5a617
Author: Luke Macken <lmacken(a)redhat.com>
Date: Wed May 11 10:04:45 2011 -0400
Require CherryPy<3.0
diff --git a/bodhi.egg-info/requires.txt b/bodhi.egg-info/requires.txt
index 053d119..6de723a 100644
--- a/bodhi.egg-info/requires.txt
+++ b/bodhi.egg-info/requires.txt
@@ -1,4 +1,5 @@
TurboGears >= 1.0
TurboMail
python_fedora
-markdown
\ No newline at end of file
+markdown
+CherryPy<3.0
\ No newline at end of file
diff --git a/setup.py b/setup.py
index 9595b10..3d297e8 100755
--- a/setup.py
+++ b/setup.py
@@ -166,6 +166,7 @@ setup(
"TurboMail",
"python_fedora",
"markdown",
+ "CherryPy<3.0",
#"hashlib",
],
scripts = [],
commit 98045366bf984f6a3d74813a23450f64fa918dad
Author: Luke Macken <lmacken(a)redhat.com>
Date: Wed May 11 10:03:10 2011 -0400
Allow empty buildroot override expiration dates
diff --git a/bodhi/widgets.py b/bodhi/widgets.py
index 3b897e9..789ceb3 100644
--- a/bodhi/widgets.py
+++ b/bodhi/widgets.py
@@ -203,6 +203,6 @@ class BuildRootOverrideForm(Form):
validator=AutoCompleteValidator()),
TextArea('notes', validator=validators.UnicodeString(),
rows=13, cols=65),
- CalendarDatePicker('expiration')
+ CalendarDatePicker('expiration', not_empty=False)
]
submit_text = "Submit"
commit 53a79fc47297fac5dce98414e7d1801752fea1c2
Author: Luke Macken <lmacken(a)redhat.com>
Date: Wed May 11 10:02:38 2011 -0400
Add more buildroot override commands to the bodhi client
diff --git a/bodhi/tools/client.py b/bodhi/tools/client.py
index 864290c..190c1c8 100755
--- a/bodhi/tools/client.py
+++ b/bodhi/tools/client.py
@@ -25,6 +25,7 @@ import subprocess
from getpass import getpass, getuser
from optparse import OptionParser
+from datetime import datetime, timedelta
from kitchen.text.converters import to_bytes
from fedora.client import AuthError, ServerError
@@ -99,12 +100,24 @@ def get_parser():
parser.add_option("", "--untested",
action="store_true",
help="Display a list of untested critical path updates",
dest="untested", default=False)
- parser.add_option("-O", "--buildroot-override",
action="store",
+ parser.add_option("-o", "--buildroot-override",
action="store",
help="Submit a build as a buildroot override",
dest="override", metavar="BUILD")
+ parser.add_option("--duration", action="store",
+ help="Duration of the buildroot override",
+ dest="duration", metavar="DAYS")
+ parser.add_option("-O", "--list-overrides",
action="store_true",
+ help="List all buildroot overrides",
+ dest="list_overrides")
+ parser.add_option("--my-overrides", action="store_true",
+ help="List all of your specific buildroot overrides",
+ dest="my_overrides", default=False)
parser.add_option("-E", "--expire-override",
action="store",
help="Expire a buildroot override",
dest="expire_override", metavar="BUILD")
+ parser.add_option("--show-expired", action="store_true",
+ help="Show expired buildroot overrides",
+ dest="show_expired", default=False)
## Details
parser.add_option("-s", "--status", action="store",
type="string",
@@ -172,7 +185,7 @@ def main():
sys.exit(-1)
override_notes = None
-
+
while True:
try:
if opts.new:
@@ -376,6 +389,49 @@ def main():
log.debug(data)
log.info(data['title'])
+ ## Buildroot Overrides commands
+ elif opts.override:
+ expiration = None
+ if opts.duration:
+ expiration = (datetime.utcnow() +
+
timedelta(days=int(opts.duration))).strftime('%m/%d/%Y')
+ if opts.notes:
+ override_notes = opts.notes
+ if not override_notes:
+ override_notes = raw_input('Notes: ').strip()
+ data = bodhi.send_request('override/save', req_params={
+ 'builds': opts.override,
+ 'notes': override_notes,
+ 'expiration': expiration,
+ }, auth=True)
+ if data.get('tg_flash'):
+ log.info(data['tg_flash'])
+ else:
+ log.info("No data returned from bodhi?")
+ elif opts.expire_override:
+ data = bodhi.send_request('override/expire', req_params={
+ 'build': opts.expire_override,
+ }, auth=True)
+ if data.get('tg_flash'):
+ log.info(data['tg_flash'])
+ else:
+ log.info("No data returned from bodhi?")
+ elif opts.list_overrides or opts.my_overrides:
+ data = bodhi.send_request('override/list', req_params={
+ 'mine': opts.my_overrides,
+ 'release': opts.release,
+ 'show_expired': opts.show_expired,
+ }, auth=True)
+ print data['title'] + '\n' + '=' *
len(data['title']) + '\n'
+ for override in data['overrides']:
+ print "[ %s ]" % override['build']
+ print " * Notes: %s" % override['notes']
+ print " * Submitter: %s" % override['submitter']
+ print " * Submitted: %s" %
override['date_submitted']
+ if override['date_expired']:
+ print " * Expired: %s" %
override['date_expired']
+ print
+
elif opts.status or opts.bugs or opts.release or opts.type_ or \
opts.mine or args:
def print_query(data):
@@ -426,25 +482,7 @@ def main():
arch == 'i686' and ' --arch=i386
--arch=i586'
or '', build['nvr']),
shell=True)
- elif opts.override:
- if not override_notes:
- override_notes = raw_input('Notes: ').strip()
- data = bodhi.send_request('override/save', req_params={
- 'builds': opts.override,
- 'notes': override_notes,
- }, auth=True)
- if data.get('tg_flash'):
- log.info(data['tg_flash'])
- else:
- log.info("No data returned from bodhi?")
- elif opts.expire_override:
- data = bodhi.send_request('override/expire', req_params={
- 'build': opts.expire_override,
- }, auth=True)
- if data.get('tg_flash'):
- log.info(data['tg_flash'])
- else:
- log.info("No data returned from bodhi?")
+
else:
parser.print_help()
break
commit 47a76fbd792f68c3267a478615cb628718ff0b98
Author: Luke Macken <lmacken(a)redhat.com>
Date: Wed May 11 10:01:56 2011 -0400
Improve our overrides list
diff --git a/bodhi/templates/overrides.kid b/bodhi/templates/overrides.kid
index 887d5df..e14c7b1 100644
--- a/bodhi/templates/overrides.kid
+++ b/bodhi/templates/overrides.kid
@@ -9,14 +9,16 @@
<body>
<h2>${title}</h2>
+ <div style="float:left">
<a
href="${tg.url('/override/new')}"><img
src="${tg.url('/static/images/plus.png')}"/>Submit a new
override</a>
- <br/>
- <div py:if="num_items" class="list">
- <span py:for="page in tg.paginate.pages">
- <a py:if="page != tg.paginate.current_page"
- href="${tg.paginate.get_href(page)}">${page}</a>
- <b py:if="page ==
tg.paginate.current_page">${page}</b>
- </span>
+ </div>
+ <div style="float:right">
+ <div py:if="show_expired">
+ [ <a
href="${tg.url('/override/list')}">Hide expired overrides</a>
]
+ </div>
+ <div py:if="not show_expired">
+ [ <a
href="${tg.url('/override/list?show_expired=True')}">Show expired
overrides</a> ]
+ </div>
</div>
<table class="list">
@@ -25,22 +27,18 @@
<b>Build</b>
</th>
<th class="list">
- <b>Release</b>
- </th>
- <th class="list">
<b>Notes</b>
</th>
<th class="list">
- <b>Submitted</b>
+ <b>Submitter</b>
</th>
<th class="list">
- <b>Submitter</b>
+ <b>Submitted</b>
</th>
<th class="list">
<b>Expiration</b>
</th>
<th class="list">
- <b>Manual Expiration</b>
</th>
</tr>
<?python row_color = "#FFFFFF" ?>
@@ -49,23 +47,25 @@
${override.build}
</td>
<td class="list">
- <a class="list" href="${tg.url('/%s' %
override.release.name)}">${override.release.name}</a>
- </td>
- <td class="list">
${override.notes}
</td>
<td class="list">
- ${override.date_submitted}
+ <a href="${tg.url('/user/' +
override.submitter)}">${override.submitter}</a>
</td>
<td class="list">
- <a href="${tg.url('/user/' +
override.submitter)}">${override.submitter}</a>
+ ${override.date_submitted.strftime('%m/%d/%Y')}
</td>
<td class="list">
- ${override.expiration}
+ ${override.expiration.strftime('%m/%d/%Y')}
</td>
<td class="list">
- <div py:if="'releng' in tg.identity.groups or
tg.identity.user_name == override.submitter">
- <a href="${tg.url('/override/expire/%s' %
override.build)}">Expire</a>
+ <div py:if="override.date_expired">
+ <b>EXPIRED</b>
+ </div>
+ <div py:if="not override.date_expired">
+ <div py:if="'releng' in tg.identity.groups or
tg.identity.user_name == override.submitter">
+ <a href="${tg.url('/override/expire/%s' %
override.build)}">Expire</a>
+ </div>
</div>
</td>
<?python row_color = (row_color == "#f1f1f1") and
"#FFFFFF" or "#f1f1f1" ?>
commit 24c1b764d568e50b69deb3c09cd3f3ef5e1583d6
Author: Luke Macken <lmacken(a)redhat.com>
Date: Wed May 11 10:01:18 2011 -0400
Improvements to our BuildrootOverride.save() method
diff --git a/bodhi/overrides.py b/bodhi/overrides.py
index a1d8e14..6d77950 100644
--- a/bodhi/overrides.py
+++ b/bodhi/overrides.py
@@ -114,8 +114,13 @@ class BuildRootOverrideController(Controller):
@expose('json')
@validate(form=override_form)
@error_handler(new)
- def save(self, builds, notes, expiration, *args, **kw):
- log.debug('BuildRootOverrideController.save(%s)' % builds)
+ def save(self, builds, notes, expiration=None, *args, **kw):
+ log.debug(repr(locals()))
+ last_release = None # for our koji wait-repo example
+
+ if not expiration:
+ expiration = datetime.utcnow() + \
+
timedelta(days=config.get('buildroot_overrides.expire_after'))
try:
koji = get_session()
@@ -125,7 +130,7 @@ class BuildRootOverrideController(Controller):
return dict()
raise redirect('/override/new')
- for build in builds:
+ for build in iterate(builds):
release = None
n, v, r = get_nvr(build)
@@ -145,12 +150,12 @@ class BuildRootOverrideController(Controller):
if request_format() == 'json':
return dict()
raise redirect('/override/new')
-
+
# Determine the release by the tag, and sanity check the builds
for tag in tags:
for rel in Release.select():
if tag == rel.candidate_tag:
- release = rel
+ release = last_release = rel
elif tag in (rel.testing_tag, rel.stable_tag):
flash('Error: %s is already tagged with %s' % (
build, tag))
@@ -166,15 +171,24 @@ class BuildRootOverrideController(Controller):
raise redirect('/override/new')
# Create a new overrides object
- override = BuildRootOverride(build=build,
- notes=notes, submitter=identity.current.user_name,
- expiration=expiration, releaseID=release.id)
+ try:
+ override = BuildRootOverride(build=build,
+ notes=notes, submitter=identity.current.user_name,
+ expiration=expiration, releaseID=release.id)
+ except DuplicateEntryError:
+ flash('Error: buildroot override for %r already exists' % build)
+ if request_format() == 'json':
+ return dict()
+ raise redirect('/override/new')
# Tag the build
override.tag()
flash('Your buildroot override has been successfully tagged. '
- 'It may take up to 20 minutes for the buildroot to regenerate.')
+ 'It may take up to 20 minutes for the buildroot to regenerate. '
+ 'You can wait for the new buildroot by running '
+ '`koji wait-repo %s-build`' % last_release.dist_tag)
+
if request_format() == 'json':
return dict(override.__json__())
raise redirect('/override')
commit 29cd5a53af0ad04d3509bb0a496648ab1173a060
Author: Luke Macken <lmacken(a)redhat.com>
Date: Wed May 11 10:00:45 2011 -0400
Set the expiration date on overrides, and don't delete them from the database
diff --git a/bodhi/overrides.py b/bodhi/overrides.py
index eee51d5..a1d8e14 100644
--- a/bodhi/overrides.py
+++ b/bodhi/overrides.py
@@ -96,6 +96,7 @@ class BuildRootOverrideController(Controller):
def expire(self, build, *args, **kw):
""" Expire a given override """
override = BuildRootOverride.byBuild(build)
+ override.date_expired = datetime.utcnow()
try:
override.untag()
except Exception, e:
@@ -105,7 +106,6 @@ class BuildRootOverrideController(Controller):
log.info('Buildroot override %s manually expired by %s' % (
build, identity.current.user_name))
flash('Buildroot override for %s successful untagged' % build)
- override.destroySelf()
if request_format() == 'json':
return dict()
raise redirect('/override')
commit 3fdbee4d434b31261d15659fa9b22db0f697a08a
Author: Luke Macken <lmacken(a)redhat.com>
Date: Wed May 11 10:00:30 2011 -0400
Add an improved buildroot list controller
diff --git a/bodhi/overrides.py b/bodhi/overrides.py
index 6b75a25..eee51d5 100644
--- a/bodhi/overrides.py
+++ b/bodhi/overrides.py
@@ -14,9 +14,11 @@
import logging
from datetime import datetime, timedelta
+from sqlobject import AND
from turbogears import (expose, paginate, validate, validators, redirect,
error_handler, url, flash, identity, config)
from turbogears.controllers import Controller
+from kitchen.iterutils import iterate
try:
from fedora.tg.tg1utils import request_format
@@ -27,6 +29,7 @@ from bodhi.model import BuildRootOverride, Release
from bodhi.buildsys import get_session
from bodhi.util import get_nvr, get_pkg_pushers
from bodhi.widgets import BuildRootOverrideForm
+from bodhi.exceptions import DuplicateEntryError
log = logging.getLogger(__name__)
@@ -35,23 +38,54 @@ override_form = BuildRootOverrideForm()
class BuildRootOverrideController(Controller):
@identity.require(identity.not_anonymous())
- @expose(template="bodhi.templates.overrides")
+ @expose()
+ def index(self):
+ raise redirect('/override/list')
+
+ @identity.require(identity.not_anonymous())
+ @expose(template="bodhi.templates.overrides", allow_json=True)
+ @validate(validators={
+ 'build': validators.UnicodeString(),
+ 'mine': validators.StringBool(),
+ 'release': validators.UnicodeString(),
+ 'show_expired': validators.StringBool()
+ })
@paginate('overrides', default_order='-date_submitted',
limit=20, max_limit=1000)
- def index(self, build=None, tg_errors=None, *args, **kw):
- if 'releng' in identity.current.groups:
- overrides = BuildRootOverride.select()
+ def list(self, build=None, tg_errors=None, mine=False, release=None,
+ show_expired=False, **kw):
+ query = []
+ title = '%d Buildroot Overrides'
+ if mine:
+ query.append(
+ BuildRootOverride.q.submitter == identity.current.user_name)
+ title += ' submitted by %s' % identity.current.user_name
+ if release:
+ rel = Release.byName(release)
+ query.append(
+ BuildRootOverride.q.releaseID == rel.id)
+ title += ' for %s' % rel.long_name
+ if not show_expired:
+ query.append(
+ BuildRootOverride.q.date_expired == None)
+
+ overrides = BuildRootOverride.select(AND(*query))
+
+ if request_format() == 'json':
+ overrides = [o.__json__() for o in overrides]
+ num_items = len(overrides)
else:
- overrides = BuildRootOverride.select(
- BuildRootOverride.q.submitter == identity.current.user_name)
- return dict(overrides=overrides, title='Buildroot Overrides',
- num_items=overrides.count())
+ num_items = overrides.count()
+ return dict(overrides=overrides,
+ title=title % num_items,
+ num_items=num_items,
+ show_expired=show_expired)
@identity.require(identity.not_anonymous())
@expose(template="bodhi.templates.form")
def new(self, tg_errors=None, *args, **kw):
- #if tg_errors:
- # flash(tg_errors)
+ if tg_errors:
+ flash(tg_errors)
expiration = datetime.utcnow() + \
timedelta(days=config.get('buildroot_overrides.expire_after', 1))
return dict(form=override_form, values={'expiration': expiration},