6 commits - apache/bodhi.wsgi bodhi/controllers.py bodhi/model.py bodhi/release.py bodhi.spec bodhi/templates bodhi/tests bodhi/util.py
by Luke Macken
apache/bodhi.wsgi | 2 +-
bodhi.spec | 7 +++++--
bodhi/controllers.py | 2 +-
bodhi/model.py | 13 ++++++++++++-
bodhi/release.py | 2 +-
bodhi/templates/master.kid | 9 +++++----
bodhi/tests/test_controllers.py | 18 ++++++++++++++++++
bodhi/util.py | 4 ++--
8 files changed, 45 insertions(+), 12 deletions(-)
New commits:
commit 9d28335e1293d80d090a9a41f70eb71b7ff6d50e
Author: Luke Macken <lmacken(a)redhat.com>
Date: Thu Oct 30 01:01:13 2008 -0400
For some reason, these characters cause Unicode errors in rawhide
diff --git a/bodhi/templates/master.kid b/bodhi/templates/master.kid
index 7587a99..db056db 100644
--- a/bodhi/templates/master.kid
+++ b/bodhi/templates/master.kid
@@ -113,8 +113,9 @@ $(document).ready(function() {
<!-- content BEGIN -->
<div id="fedora-middle-two">
- <div class="fedora-corner-tr"> </div>
- <div class="fedora-corner-tl"> </div>
+ <div class="fedora-corner-tr"></div>
+ <div class="fedora-corner-tl"></div>
+
<div id="fedora-content">
<div id="page-main">
@@ -126,8 +127,8 @@ $(document).ready(function() {
</div>
</div>
- <div class="fedora-corner-br"> </div>
- <div class="fedora-corner-bl"> </div>
+ <div class="fedora-corner-br"></div>
+ <div class="fedora-corner-bl"></div>
</div>
<!-- content END -->
commit bcc673fab69067e555654113d640f0152511f225
Author: Luke Macken <lmacken(a)redhat.com>
Date: Thu Oct 30 00:31:12 2008 -0400
Add a revoke action, and a unit test for it (myfedora#18)
diff --git a/bodhi/model.py b/bodhi/model.py
index 32bd047..293d097 100644
--- a/bodhi/model.py
+++ b/bodhi/model.py
@@ -286,7 +286,7 @@ class PackageUpdate(SQLObject):
if not authorized_user(self, identity):
raise InvalidRequest("Unauthorized to perform action on %s" %
self.title)
- if action not in ('testing', 'stable', 'obsolete', 'unpush'):
+ if action not in ('testing', 'stable', 'obsolete', 'unpush', 'revoke'):
raise InvalidRequest("Unknown request: %s" % action)
if action == self.status:
raise InvalidRequest("%s already %s" % (self.title, action))
@@ -331,6 +331,17 @@ class PackageUpdate(SQLObject):
"already released, and is newer "
"than %s" % (oldBuild['nvr'],
mybuild['nvr']))
+ elif action == 'revoke':
+ if self.request:
+ flash_log('%s %s request revoked' % (self.title, self.request))
+ self.request = None
+ self.comment('%s request revoked' % action,
+ author=identity.current.user_name)
+ mail.send_admin('revoke', self)
+ else:
+ flash_log('%s does not have a request to revoke' % self.title)
+ return
+
self.request = action
self.pushed = False
self.date_pushed = None
diff --git a/bodhi/tests/test_controllers.py b/bodhi/tests/test_controllers.py
index ea03252..efec675 100644
--- a/bodhi/tests/test_controllers.py
+++ b/bodhi/tests/test_controllers.py
@@ -1123,3 +1123,21 @@ class TestControllers(testutil.DBTest):
assert PackageUpdate.select().count() == 1
assert PackageBuild.select().count() == len(params['builds'].split(','))
testutil.print_log()
+
+ def test_revoke_request(self):
+ session = login()
+ create_release(num='8', dist='dist-f')
+ params = {
+ 'builds' : u'TurboGears-1.0.7-1.fc8',
+ 'type_' : 'bugfix',
+ 'bugs' : '',
+ 'notes' : '',
+ }
+ testutil.capture_log(['bodhi.controllers', 'bodhi.util'])
+ self.save_update(params, session)
+ update = PackageUpdate.byTitle(params['builds'])
+ assert update.request == 'testing'
+ testutil.create_request('/updates/request/revoke/%s' % params['builds'],
+ headers=session, method='POST')
+ update = PackageUpdate.byTitle(params['builds'])
+ assert update.request == None
commit c3979d71692d9186427fd21095aa3ade9207dfad
Author: Luke Macken <lmacken(a)redhat.com>
Date: Thu Oct 30 00:30:39 2008 -0400
Setting the webpath to None was a bad idea...
diff --git a/apache/bodhi.wsgi b/apache/bodhi.wsgi
index 6d33f5c..0e11996 100644
--- a/apache/bodhi.wsgi
+++ b/apache/bodhi.wsgi
@@ -17,7 +17,7 @@ load_config()
turbogears.config.update({'global': {'server.environment': 'production'}})
turbogears.config.update({'global': {'autoreload.on': False}})
turbogears.config.update({'global': {'server.log_to_screen': False}})
-turbogears.config.update({'global': {'server.webpath': None}})
+#turbogears.config.update({'global': {'server.webpath': None}})
from bodhi import jobs
turbogears.startup.call_on_startup.append(jobs.schedule)
commit c531702de8c4ec3dcc4d2849d0aede46848f7304
Author: Luke Macken <lmacken(a)redhat.com>
Date: Fri Oct 24 18:34:26 2008 -0400
0.5.10
diff --git a/bodhi.spec b/bodhi.spec
index d9b17aa..79469e2 100644
--- a/bodhi.spec
+++ b/bodhi.spec
@@ -2,8 +2,8 @@
%{!?pyver: %define pyver %(%{__python} -c "import sys ; print sys.version[:3]")}
Name: bodhi
-Version: 0.5.9
-Release: 4%{?dist}
+Version: 0.5.10
+Release: 1%{?dist}
Summary: A modular framework that facilitates publishing software updates
Group: Applications/Internet
License: GPLv2+
@@ -113,6 +113,9 @@ rm -rf bodhi/tests bodhi/tools/test-bodhi.py
%changelog
+* Fri Oct 24 2008 Luke Macken <lmacken(a)redhat.com> - 0.5.10-3
+- Latest upstream release
+
* Wed Oct 15 2008 Luke Macken <lmacken(a)redhat.com> - 0.5.9-2
- Fix a trivial module import issue
diff --git a/bodhi/release.py b/bodhi/release.py
index d906c22..c2a3af8 100644
--- a/bodhi/release.py
+++ b/bodhi/release.py
@@ -1,4 +1,4 @@
-VERSION = '0.5.9'
+VERSION = '0.5.10'
NAME = 'bodhi'
DESCRIPTION = 'Bodhi is a modular web-system that facilitates the process of publishing updates for a Fedora-based software distribution'
AUTHOR = 'Luke Macken'
commit 85439d05bf717f7eab422e45424b9aefcf31bab5
Author: Luke Macken <lmacken(a)redhat.com>
Date: Fri Oct 24 18:09:15 2008 -0400
Return 403's from our login when necessary. (#466510)
diff --git a/bodhi/controllers.py b/bodhi/controllers.py
index 4c4e196..7d6b24c 100644
--- a/bodhi/controllers.py
+++ b/bodhi/controllers.py
@@ -168,7 +168,7 @@ class Root(controllers.RootController):
forward_url= cherrypy.request.headers.get("Referer", "/")
# This seems to be the cause of some bodhi-client errors
- # cherrypy.response.status=403
+ cherrypy.response.status=403
return dict(message=msg, previous_url=previous_url, logging_in=True,
original_parameters=cherrypy.request.params,
forward_url=forward_url)
commit a6d0da3f1ce84800f1a81995fba91ce7d7a387aa
Author: Luke Macken <lmacken(a)redhat.com>
Date: Fri Oct 24 18:09:02 2008 -0400
Kill some whitespace
diff --git a/bodhi/util.py b/bodhi/util.py
index 08f4466..77b692a 100644
--- a/bodhi/util.py
+++ b/bodhi/util.py
@@ -387,7 +387,7 @@ def sanity_check_repodata(myurl):
myurl += 'repodata/'
else:
baseurl = baseurl.replace('repodata/', '/')
-
+
rf = myurl + 'repomd.xml'
try:
rm = urlgrabber.urlopen(rf)
@@ -414,7 +414,7 @@ def sanity_check_repodata(myurl):
except urlgrabber.grabber.URLGrabError, e:
errorstrings.append('Error accessing repository %s' % e)
-
+
if errorstrings:
raise RepodataException(','.join(errorstrings))
15 years, 5 months
2 commits - apache/bodhi.wsgi bodhi.spec bodhi/util.py
by Luke Macken
apache/bodhi.wsgi | 8 +-------
bodhi.spec | 2 +-
bodhi/util.py | 2 +-
3 files changed, 3 insertions(+), 9 deletions(-)
New commits:
commit 7c853bb6aa0d9dd7e53a3f378c1686ede277c009
Author: Luke Macken <lmacken(a)redhat.com>
Date: Fri Oct 17 09:55:21 2008 -0400
Fix the webpath of our wsgi app, and clean it up a bit
diff --git a/apache/bodhi.wsgi b/apache/bodhi.wsgi
index bd050c9..6d33f5c 100644
--- a/apache/bodhi.wsgi
+++ b/apache/bodhi.wsgi
@@ -17,7 +17,7 @@ load_config()
turbogears.config.update({'global': {'server.environment': 'production'}})
turbogears.config.update({'global': {'autoreload.on': False}})
turbogears.config.update({'global': {'server.log_to_screen': False}})
-#turbogears.config.update({'global': {'server.webpath': '/updates'}})
+turbogears.config.update({'global': {'server.webpath': None}})
from bodhi import jobs
turbogears.startup.call_on_startup.append(jobs.schedule)
@@ -30,9 +30,3 @@ if cherrypy.server.state == 0:
cherrypy.server.start(init_only=True, server_class=None)
application = cherrypy._cpwsgi.wsgiApp
-
-## Apparently this is needed if we are using a server.webpath,
-# but I seem to get lots of 404's when using it compared to without...
-#def application(environ, start_response):
-# environ['SCRIPT_NAME'] = ''
-# return cherrypy._cpwsgi.wsgiApp(environ, start_response)
commit a405dbb16511dc4ec26124966890aac95dc6815d
Author: Luke Macken <lmacken(a)redhat.com>
Date: Wed Oct 15 13:58:01 2008 -0400
More trivial module importing
diff --git a/bodhi.spec b/bodhi.spec
index 1452cc7..d9b17aa 100644
--- a/bodhi.spec
+++ b/bodhi.spec
@@ -3,7 +3,7 @@
Name: bodhi
Version: 0.5.9
-Release: 2%{?dist}
+Release: 4%{?dist}
Summary: A modular framework that facilitates publishing software updates
Group: Applications/Internet
License: GPLv2+
diff --git a/bodhi/util.py b/bodhi/util.py
index 1b2c22d..08f4466 100644
--- a/bodhi/util.py
+++ b/bodhi/util.py
@@ -33,7 +33,7 @@ from yum.misc import checksum
from os.path import isdir, join, dirname, basename, isfile
from datetime import datetime
from decorator import decorator
-from turbogears import config, url, flash
+from turbogears import config, url, flash, redirect
from fedora.tg.util import request_format
from bodhi.exceptions import (RPMNotFound, RepodataException,
15 years, 6 months
2 commits - bodhi/controllers.py bodhi.spec bodhi/util.py
by Luke Macken
bodhi.spec | 5 ++++-
bodhi/controllers.py | 3 ++-
bodhi/util.py | 1 +
3 files changed, 7 insertions(+), 2 deletions(-)
New commits:
commit d6cfe437d909ff10db7ffd136640364e5bace626
Author: Luke Macken <lmacken(a)redhat.com>
Date: Wed Oct 15 13:47:22 2008 -0400
Import request_format in our util module
diff --git a/bodhi/util.py b/bodhi/util.py
index f12a419..1b2c22d 100644
--- a/bodhi/util.py
+++ b/bodhi/util.py
@@ -34,6 +34,7 @@ from os.path import isdir, join, dirname, basename, isfile
from datetime import datetime
from decorator import decorator
from turbogears import config, url, flash
+from fedora.tg.util import request_format
from bodhi.exceptions import (RPMNotFound, RepodataException,
InvalidUpdateException)
commit a762b146f6e28eeb4dafeeee2928dd6465c34a57
Author: Luke Macken <lmacken(a)redhat.com>
Date: Wed Oct 15 13:16:45 2008 -0400
Fix a trivial module import issue
diff --git a/bodhi.spec b/bodhi.spec
index 5931f40..1452cc7 100644
--- a/bodhi.spec
+++ b/bodhi.spec
@@ -3,7 +3,7 @@
Name: bodhi
Version: 0.5.9
-Release: 1%{?dist}
+Release: 2%{?dist}
Summary: A modular framework that facilitates publishing software updates
Group: Applications/Internet
License: GPLv2+
@@ -113,6 +113,9 @@ rm -rf bodhi/tests bodhi/tools/test-bodhi.py
%changelog
+* Wed Oct 15 2008 Luke Macken <lmacken(a)redhat.com> - 0.5.9-2
+- Fix a trivial module import issue
+
* Tue Oct 14 2008 Luke Macken <lmacken(a)redhat.com> - 0.5.9-1
- Fix a variety of bugs, including a race-condition when editing.
diff --git a/bodhi/controllers.py b/bodhi/controllers.py
index 4a5063b..4c4e196 100644
--- a/bodhi/controllers.py
+++ b/bodhi/controllers.py
@@ -44,7 +44,8 @@ from bodhi.model import (Package, PackageBuild, PackageUpdate, Release,
from bodhi.search import SearchController
from bodhi.widgets import CommentForm, OkCancelForm, CommentCaptchaForm
from bodhi.exceptions import (DuplicateEntryError, InvalidRequest,
- PostgresIntegrityError, SQLiteIntegrityError)
+ PostgresIntegrityError, SQLiteIntegrityError,
+ InvalidUpdateException)
log = logging.getLogger(__name__)
15 years, 6 months
7 commits - bodhi/buildsys.py bodhi/controllers.py bodhi.egg-info/PKG-INFO bodhi/model.py bodhi/release.py bodhi.spec
by Luke Macken
bodhi.egg-info/PKG-INFO | 5 ++++-
bodhi.spec | 7 +++++--
bodhi/buildsys.py | 6 +++---
bodhi/controllers.py | 2 +-
bodhi/model.py | 13 ++++++++++++-
bodhi/release.py | 2 +-
6 files changed, 26 insertions(+), 9 deletions(-)
New commits:
commit c8e1bf6f0a5591a92d72b4fb503b1ae24a066978
Author: Luke Macken <lmacken(a)redhat.com>
Date: Tue Oct 14 15:16:55 2008 -0400
0.5.9
diff --git a/bodhi.egg-info/PKG-INFO b/bodhi.egg-info/PKG-INFO
index 4a0e297..f0365e1 100644
--- a/bodhi.egg-info/PKG-INFO
+++ b/bodhi.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: bodhi
-Version: 0.5.8
+Version: 0.5.9
Summary: Bodhi is a modular web-system that facilitates the process of publishing updates for a Fedora-based software distribution
Home-page: https://fedorahosted.org/bodhi
Author: Luke Macken
diff --git a/bodhi.spec b/bodhi.spec
index d9d7a66..5931f40 100644
--- a/bodhi.spec
+++ b/bodhi.spec
@@ -2,8 +2,8 @@
%{!?pyver: %define pyver %(%{__python} -c "import sys ; print sys.version[:3]")}
Name: bodhi
-Version: 0.5.8
-Release: 2%{?dist}
+Version: 0.5.9
+Release: 1%{?dist}
Summary: A modular framework that facilitates publishing software updates
Group: Applications/Internet
License: GPLv2+
@@ -113,6 +113,9 @@ rm -rf bodhi/tests bodhi/tools/test-bodhi.py
%changelog
+* Tue Oct 14 2008 Luke Macken <lmacken(a)redhat.com> - 0.5.9-1
+- Fix a variety of bugs, including a race-condition when editing.
+
* Thu Oct 13 2008 Steve 'Ashcrow' Milner <smilner(a)redhat.com> - 0.5.8-2
- Added default attributes to client files.
diff --git a/bodhi/release.py b/bodhi/release.py
index 63b0800..d906c22 100644
--- a/bodhi/release.py
+++ b/bodhi/release.py
@@ -1,4 +1,4 @@
-VERSION = '0.5.8'
+VERSION = '0.5.9'
NAME = 'bodhi'
DESCRIPTION = 'Bodhi is a modular web-system that facilitates the process of publishing updates for a Fedora-based software distribution'
AUTHOR = 'Luke Macken'
commit e11baef70e7fe80a480965fbab399a3c712dff7c
Author: Luke Macken <lmacken(a)redhat.com>
Date: Tue Oct 14 15:15:48 2008 -0400
Import the time module, instead of grabbing sleep directly
diff --git a/bodhi/buildsys.py b/bodhi/buildsys.py
index 5ac4ca6..b1b8f78 100644
--- a/bodhi/buildsys.py
+++ b/bodhi/buildsys.py
@@ -11,10 +11,10 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+import time
import koji
import logging
-from time import sleep
from os.path import join, expanduser
from turbogears import config
@@ -196,7 +196,7 @@ def wait_for_tasks(tasks, sleep=300):
log.debug("Waiting for %d tasks to complete: %s" % (len(tasks), tasks))
for task in tasks:
while not session.taskFinished(task):
- sleep(sleep)
+ time.sleep(sleep)
task_info = session.getTaskInfo(task)
if task_info['state'] != koji.TASK_STATES['CLOSED']:
log.error("Koji task %d failed" % task)
commit e08c8a497b8154940b6c160e7eac880caec0f901
Author: Luke Macken <lmacken(a)redhat.com>
Date: Tue Oct 14 15:09:15 2008 -0400
Wait for all koji.moveBuild tasks to complete in PackageUpdate.unpush()
This will hopefully solve some editing race-conditions.
diff --git a/bodhi/model.py b/bodhi/model.py
index 3811d43..32bd047 100644
--- a/bodhi/model.py
+++ b/bodhi/model.py
@@ -636,6 +636,7 @@ class PackageUpdate(SQLObject):
""" Move this update back to its dist-fX-updates-candidate tag """
log.debug("Unpushing %s" % self.title)
koji = buildsys.get_session()
+ tasks = []
newtag = '%s-updates-candidate' % self.release.dist_tag
curtag = self.get_build_tag()
if curtag.endswith('-updates-candidate'):
@@ -648,7 +649,14 @@ class PackageUpdate(SQLObject):
koji.untagBuild(curtag, build.nvr, force=True)
else:
log.debug("Moving %s from %s to %s" % (build.nvr, curtag, newtag))
- koji.moveBuild(curtag, newtag, build.nvr, force=True)
+ task = koji.moveBuild(curtag, newtag, build.nvr, force=True)
+ tasks.append(task)
+ if tasks:
+ log.debug('Waiting for %s tasks to complete...' % tasks)
+ if buildsys.wait_for_tasks(tasks, sleep=1):
+ log.error('One or more tasks failed!')
+ else:
+ log.debug('Tasks complete!')
self.pushed = False
self.status = 'pending'
mail.send_admin('unpushed', self)
commit 816a518bc6a2e1022a362f42c88b355237a82150
Author: Luke Macken <lmacken(a)redhat.com>
Date: Tue Oct 14 15:08:14 2008 -0400
Spit out a warning if a "None" string is passed to set_request
diff --git a/bodhi/model.py b/bodhi/model.py
index 2c8a9aa..3811d43 100644
--- a/bodhi/model.py
+++ b/bodhi/model.py
@@ -293,6 +293,9 @@ class PackageUpdate(SQLObject):
if action == self.request:
raise InvalidRequest("%s has already been submitted to %s" % (
self.title, self.request))
+ if action == 'None':
+ log.warning('%r was passed to set_request' % action)
+ return
if action == 'unpush':
self.unpush()
commit b191f793a8b963ab861673a8d4772b490dfbeafe
Author: Luke Macken <lmacken(a)redhat.com>
Date: Tue Oct 14 15:07:26 2008 -0400
Make the sleep timeout in buildsys.wait_for_tasks configurable
diff --git a/bodhi/buildsys.py b/bodhi/buildsys.py
index 46deb5b..5ac4ca6 100644
--- a/bodhi/buildsys.py
+++ b/bodhi/buildsys.py
@@ -188,7 +188,7 @@ def get_session():
return session
-def wait_for_tasks(tasks):
+def wait_for_tasks(tasks, sleep=300):
"""
Wait for a list of koji tasks to complete. Return the first task number
to fail, otherwise zero.
@@ -196,7 +196,7 @@ def wait_for_tasks(tasks):
log.debug("Waiting for %d tasks to complete: %s" % (len(tasks), tasks))
for task in tasks:
while not session.taskFinished(task):
- sleep(300)
+ sleep(sleep)
task_info = session.getTaskInfo(task)
if task_info['state'] != koji.TASK_STATES['CLOSED']:
log.error("Koji task %d failed" % task)
commit f49fa493fad5c8d585822a661fbacbcb322dae97
Author: Luke Macken <lmacken(a)redhat.com>
Date: Tue Oct 14 15:06:20 2008 -0400
Update the egg info
diff --git a/bodhi.egg-info/PKG-INFO b/bodhi.egg-info/PKG-INFO
index aed094e..4a0e297 100644
--- a/bodhi.egg-info/PKG-INFO
+++ b/bodhi.egg-info/PKG-INFO
@@ -13,3 +13,6 @@ Classifier: Programming Language :: Python
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Framework :: TurboGears
Classifier: Framework :: TurboGears :: Applications
+Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: GNU General Public License (GPL)
commit 81814c02e56c58526e738cc86e450cdf069758da
Author: Luke Macken <lmacken(a)redhat.com>
Date: Tue Oct 14 14:35:32 2008 -0400
Don't unpush if the update we're editing is already stable
diff --git a/bodhi/controllers.py b/bodhi/controllers.py
index 29f3c3d..4a5063b 100644
--- a/bodhi/controllers.py
+++ b/bodhi/controllers.py
@@ -527,7 +527,6 @@ class Root(controllers.RootController):
if edited:
try:
edited = PackageUpdate.byTitle(edited)
- edited.unpush()
except SQLObjectNotFound:
flash_log("Cannot find update '%s' to edit" % edited)
raise InvalidUpdateException(params)
@@ -536,6 +535,7 @@ class Root(controllers.RootController):
"engineering at %s about unpushing this update." %
config.get('release_team_address'))
raise InvalidUpdateException(params)
+ edited.unpush()
# Make sure all builds are tagged appropriately. We also determine
# which builds get pushed for which releases, based on the tag.
15 years, 6 months
setup.py
by Luke Macken
setup.py | 53 ++++++++++++++++++++++++++++++++++++-----------------
1 file changed, 36 insertions(+), 17 deletions(-)
New commits:
commit d8ad39979f1ef2d948a6749c26decfc1bd65818c
Author: Steve 'Ashcrow' Milner <smilner(a)redhat.com>
Date: Mon Oct 13 13:41:19 2008 -0400
cleaned up setup script a bit adding classifiers, etc..
diff --git a/setup.py b/setup.py
old mode 100644
new mode 100755
index 03cb807..d0f5972
--- a/setup.py
+++ b/setup.py
@@ -1,3 +1,5 @@
+#!/usr/bin/env python
+#
# $Id: $
__requires__='TurboGears[future]'
@@ -28,7 +30,8 @@ excludeDataDirs.extend(standard_exclude_directories)
poFiles = filter(os.path.isfile, glob.glob('po/*.po'))
-SUBSTFILES = ('bodhi/config/app.cfg',)
+SUBSTFILES = ('bodhi/config/app.cfg')
+
class Build(_build, object):
'''
@@ -73,7 +76,8 @@ class Build(_build, object):
matches = self.subRE.search(line)
if matches:
for pattern in self.substitutions:
- line = line.replace(pattern, self.substitutions[pattern])
+ line = line.replace(pattern,
+ self.substitutions[pattern])
outf.writelines(line)
outf.close()
f.close()
@@ -95,7 +99,9 @@ class Build(_build, object):
subprocess.call(['/usr/bin/msgfmt', pofile, '-o', mofile])
super(Build, self).run()
+
class InstallData(_install_data, object):
+
def finalize_options(self):
'''Override to emulate setuptools in the default case.
install_data => install_dir
@@ -117,31 +123,41 @@ class InstallData(_install_data, object):
else:
self.install_dir = self.temp_data
+
# bodhi/static => /usr/share/bodhi/static
data_files = [
('bodhi/static', filter(os.path.isfile, glob.glob('bodhi/static/*'))),
- ('bodhi/static/css', filter(os.path.isfile, glob.glob('bodhi/static/css/*'))),
- ('bodhi/static/images', filter(os.path.isfile, glob.glob('bodhi/static/images/*'))),
- ('bodhi/static/js', filter(os.path.isfile, glob.glob('bodhi/static/js/*'))),
+ ('bodhi/static/css', filter(os.path.isfile,
+ glob.glob('bodhi/static/css/*'))),
+ ('bodhi/static/images', filter(os.path.isfile,
+ glob.glob('bodhi/static/images/*'))),
+ ('bodhi/static/js', filter(os.path.isfile,
+ glob.glob('bodhi/static/js/*'))),
('man/man1', ['docs/bodhi.1']),
]
for langfile in filter(os.path.isfile, glob.glob('locale/*/*/*')):
data_files.append((os.path.dirname(langfile), [langfile]))
-package_data = find_package_data(where='bodhi', package='bodhi', exclude=excludeFiles, exclude_directories=excludeDataDirs,)
+package_data = find_package_data(where='bodhi',
+ package='bodhi',
+ exclude=excludeFiles,
+ exclude_directories=excludeDataDirs)
package_data['bodhi.config'].append('app.cfg')
-from bodhi.release import NAME, VERSION, DESCRIPTION, AUTHOR, EMAIL, URL, LICENSE
+
+from bodhi.release import NAME, VERSION, DESCRIPTION
+from bodhi.release import AUTHOR, EMAIL, URL, LICENSE
+
setup(
- name=NAME,
- version=VERSION,
- description=DESCRIPTION,
- author=AUTHOR,
- author_email=EMAIL,
- url=URL,
- license=LICENSE,
- cmdclass={
+ name = NAME,
+ version = VERSION,
+ description = DESCRIPTION,
+ author = AUTHOR,
+ author_email = EMAIL,
+ url = URL,
+ license = LICENSE,
+ cmdclass = {
'build': Build,
'install_data': InstallData,
},
@@ -152,8 +168,8 @@ setup(
],
scripts = [],
data_files = data_files,
- zip_safe=False,
- packages=find_packages(),
+ zip_safe = False,
+ packages = find_packages(),
package_data = package_data,
keywords = [
'turbogears.app',
@@ -163,6 +179,9 @@ setup(
'Topic :: Software Development :: Libraries :: Python Modules',
'Framework :: TurboGears',
'Framework :: TurboGears :: Applications',
+ 'Topic :: Internet :: WWW/HTTP :: WSGI :: Application',
+ 'Intended Audience :: Developers',
+ 'License :: OSI Approved :: GNU General Public License (GPL)',
],
test_suite = 'nose.collector',
entry_points = {
15 years, 6 months
Makefile
by Luke Macken
Makefile | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
New commits:
commit fa1f8c48747d6ef74388827ee5d57428954a2260
Author: Luke Macken <lmacken(a)redhat.com>
Date: Mon Oct 13 14:14:17 2008 -0400
Rename bodhi_client.py to client.py
diff --git a/Makefile b/Makefile
index c006eb6..ea3bcce 100644
--- a/Makefile
+++ b/Makefile
@@ -30,11 +30,11 @@ build:
install:
python setup.py install -O1 --skip-build --root $(DESTDIR)
- install -D bodhi/tools/bodhi_client.py $(DESTDIR)/usr/bin/bodhi
+ install -D bodhi/tools/client.py $(DESTDIR)/usr/bin/bodhi
virt-install:
virtualenv virtenv
- /bin/sh -c ". virtenv/bin/activate; python setup.py install -O1 --skip-build; install -D bodhi/tools/bodhi_client.py virtenv/bin/bodhi"
+ /bin/sh -c ". virtenv/bin/activate; python setup.py install -O1 --skip-build; install -D bodhi/tools/client.py virtenv/bin/bodhi"
shell:
tg-admin --config=bodhi.cfg shell
15 years, 6 months
3 commits - bodhi.egg-info/PKG-INFO bodhi/release.py bodhi.spec .gitignore Makefile
by Luke Macken
.gitignore | 2 ++
Makefile | 13 +++++++++++--
bodhi.egg-info/PKG-INFO | 2 +-
bodhi.spec | 11 +++++++++--
bodhi/release.py | 2 +-
5 files changed, 24 insertions(+), 6 deletions(-)
New commits:
commit 193c1162844d871079b9345c76e99f7281df3480
Author: Steve 'Ashcrow' Milner <smilner(a)redhat.com>
Date: Fri Oct 10 10:50:10 2008 -0400
added two new make targets. virt-install to install bodhi to a local virtualenv named virtenv and install-deps to install the depencencies needed to develop on bodhi
diff --git a/.gitignore b/.gitignore
index 59bd389..374a415 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,3 +5,5 @@
.bodhi.tmp
dist
MANIFEST
+virtenv
+build
diff --git a/Makefile b/Makefile
index 8971e01..c006eb6 100644
--- a/Makefile
+++ b/Makefile
@@ -19,7 +19,8 @@ todo:
grep -r --color=auto FIXME bodhi/ || :
clean:
- find . -name '*.pyc' | xargs rm
+ find . -name '*.pyc' | xargs rm -f
+ rm -rf virtenv
dist:
python setup.py sdist --formats=bztar
@@ -31,6 +32,10 @@ install:
python setup.py install -O1 --skip-build --root $(DESTDIR)
install -D bodhi/tools/bodhi_client.py $(DESTDIR)/usr/bin/bodhi
+virt-install:
+ virtualenv virtenv
+ /bin/sh -c ". virtenv/bin/activate; python setup.py install -O1 --skip-build; install -D bodhi/tools/bodhi_client.py virtenv/bin/bodhi"
+
shell:
tg-admin --config=bodhi.cfg shell
@@ -50,8 +55,12 @@ profile:
nosetests --with-profile --profile-stats-file=nose.prof
python -c "import hotshot.stats ; stats = hotshot.stats.load('nose.prof') ; stats.sort_stats('time', 'calls') ; stats.print_stats(20)"
+install-deps:
+ su -c "yum install TurboGears python-TurboMail python-fedora python-sqlalchemy koji mash yum-utils git intltool python-bugzilla python-genshi \
+python-crypto python-imaging python-turboflot python-tgcaptcha python-nose.noarch"
+
rpm: srpm
@rpm -i bodhi*src.rpm
@rpmbuild -ba ~/rpmbuild/SPECS/bodhi.spec
-.PHONY: docs test todo clean dist build install srpm pyflakes profile shell init run
+.PHONY: docs test todo clean dist build install virt-install srpm pyflakes profile shell init run install-deps
commit a276bda72e24dc87568bc8f861bf230f50b99693
Author: Luke Macken <lmacken(a)redhat.com>
Date: Mon Oct 13 13:52:09 2008 -0400
Add default attributes to the client subpackage (Steve Milner)
diff --git a/bodhi.egg-info/PKG-INFO b/bodhi.egg-info/PKG-INFO
index cae43d1..aed094e 100644
--- a/bodhi.egg-info/PKG-INFO
+++ b/bodhi.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: bodhi
-Version: 0.5.7
+Version: 0.5.8
Summary: Bodhi is a modular web-system that facilitates the process of publishing updates for a Fedora-based software distribution
Home-page: https://fedorahosted.org/bodhi
Author: Luke Macken
diff --git a/bodhi.spec b/bodhi.spec
index 0930988..d9d7a66 100644
--- a/bodhi.spec
+++ b/bodhi.spec
@@ -3,7 +3,7 @@
Name: bodhi
Version: 0.5.8
-Release: 1%{?dist}
+Release: 2%{?dist}
Summary: A modular framework that facilitates publishing software updates
Group: Applications/Internet
License: GPLv2+
@@ -107,11 +107,15 @@ rm -rf bodhi/tests bodhi/tools/test-bodhi.py
%files client
+%defattr(-,root,root,-)
%{_bindir}/bodhi
%{_mandir}/man1/bodhi.1.gz
%changelog
+* Thu Oct 13 2008 Steve 'Ashcrow' Milner <smilner(a)redhat.com> - 0.5.8-2
+- Added default attributes to client files.
+
* Sun Oct 12 2008 Luke Macken <lmacken(a)redhat.com> - 0.5.8-1
- Minor release to fix some new update creation bugs
commit c6bc741889a924c681f7f4cf3280b7a23aa7167e
Author: Luke Macken <lmacken(a)redhat.com>
Date: Sun Oct 12 15:35:09 2008 -0400
0.5.8
diff --git a/bodhi.spec b/bodhi.spec
index 60e3de4..0930988 100644
--- a/bodhi.spec
+++ b/bodhi.spec
@@ -2,7 +2,7 @@
%{!?pyver: %define pyver %(%{__python} -c "import sys ; print sys.version[:3]")}
Name: bodhi
-Version: 0.5.7
+Version: 0.5.8
Release: 1%{?dist}
Summary: A modular framework that facilitates publishing software updates
Group: Applications/Internet
@@ -112,6 +112,9 @@ rm -rf bodhi/tests bodhi/tools/test-bodhi.py
%changelog
+* Sun Oct 12 2008 Luke Macken <lmacken(a)redhat.com> - 0.5.8-1
+- Minor release to fix some new update creation bugs
+
* Thu Oct 09 2008 Luke Macken <lmacken(a)redhat.com> - 0.5.7-1
- Latest release, containing some API improvements
diff --git a/bodhi/release.py b/bodhi/release.py
index f658f7b..63b0800 100644
--- a/bodhi/release.py
+++ b/bodhi/release.py
@@ -1,4 +1,4 @@
-VERSION = '0.5.7'
+VERSION = '0.5.8'
NAME = 'bodhi'
DESCRIPTION = 'Bodhi is a modular web-system that facilitates the process of publishing updates for a Fedora-based software distribution'
AUTHOR = 'Luke Macken'
15 years, 6 months
bodhi/model.py
by Luke Macken
bodhi/model.py | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
New commits:
commit ec9adab9487165273b0b94c3746277d09ff2242c
Author: Luke Macken <lmacken(a)redhat.com>
Date: Sun Oct 12 15:17:12 2008 -0400
Handle koji TagErrors when obsoleting older builds
diff --git a/bodhi/model.py b/bodhi/model.py
index f2ac7e9..2c8a9aa 100644
--- a/bodhi/model.py
+++ b/bodhi/model.py
@@ -656,7 +656,11 @@ class PackageUpdate(SQLObject):
koji = buildsys.get_session()
tag = self.get_build_tag()
for build in self.builds:
- koji.untagBuild(tag, build.nvr, force=True)
+ try:
+ koji.untagBuild(tag, build.nvr, force=True)
+ except Exception, e:
+ log.error('There was a problem untagging %s' % build.nvr)
+ log.exception(e)
self.pushed = False
def obsolete(self, newer=None):
15 years, 6 months
4 commits - bodhi/controllers.py bodhi/exceptions.py bodhi/tests bodhi/util.py
by Luke Macken
bodhi/controllers.py | 49 +++++++++++++++++++---------------------
bodhi/exceptions.py | 3 ++
bodhi/tests/test_controllers.py | 22 +++++++++++++++++
bodhi/util.py | 13 +++++++++-
4 files changed, 61 insertions(+), 26 deletions(-)
New commits:
commit ecda31b26688cb7066062214a42e30443aec6bfb
Author: Luke Macken <lmacken(a)redhat.com>
Date: Fri Oct 10 01:56:25 2008 -0400
Import the InvalidUpdateException in our util module
diff --git a/bodhi/util.py b/bodhi/util.py
index 9766ecd..f12a419 100644
--- a/bodhi/util.py
+++ b/bodhi/util.py
@@ -35,7 +35,8 @@ from datetime import datetime
from decorator import decorator
from turbogears import config, url, flash
-from bodhi.exceptions import RPMNotFound, RepodataException
+from bodhi.exceptions import (RPMNotFound, RepodataException,
+ InvalidUpdateException)
log = logging.getLogger(__name__)
commit f0552cfa4ebb23e7b9fdb48d4e4c25170ebf12a3
Author: Luke Macken <lmacken(a)redhat.com>
Date: Fri Oct 10 01:50:04 2008 -0400
Add a json_redirect decorator that takes care of alot of boilerplate code
diff --git a/bodhi/controllers.py b/bodhi/controllers.py
index 46507ef..29f3c3d 100644
--- a/bodhi/controllers.py
+++ b/bodhi/controllers.py
@@ -36,6 +36,7 @@ from bodhi.rss import Feed
from bodhi.new import NewUpdateController, update_form
from bodhi.util import make_update_link, make_type_icon, make_karma_icon, link
from bodhi.util import flash_log, get_pkg_pushers, make_request_icon
+from bodhi.util import json_redirect
from bodhi.admin import AdminController
from bodhi.metrics import MetricsController
from bodhi.model import (Package, PackageBuild, PackageUpdate, Release,
@@ -47,7 +48,6 @@ from bodhi.exceptions import (DuplicateEntryError, InvalidRequest,
log = logging.getLogger(__name__)
-
class Root(controllers.RootController):
new = NewUpdateController()
@@ -400,6 +400,7 @@ class Root(controllers.RootController):
title='Edit Update')
@expose(allow_json=True)
+ @json_redirect
@error_handler(new.index)
@validate(form=update_form)
@identity.require(identity.not_anonymous())
@@ -447,22 +448,6 @@ class Root(controllers.RootController):
if request: request = request.lower()
koji = buildsys.get_session()
- # Basic sanity checks
- if type_ not in config.get('update_types'):
- flash_log('Unknown update type: %s. Valid types are: %s' % (
- type_, config.get('update_types')))
- return dict()
- if request not in ('testing', 'stable', None):
- flash_log('Unknown request: %s. Valid requests are: testing, '
- 'stable, None' % request)
- return dict()
- if stable_karma < 1:
- flash_log("Stable karama must be at least 1.")
- return dict()
- if stable_karma <= unstable_karma:
- flash_log("Stable karama must be higher than unstable karma.")
- return dict()
-
# Parameters used to re-populate the update form if something fails
params = {
'builds.text' : ' '.join(builds),
@@ -476,6 +461,21 @@ class Root(controllers.RootController):
'unstable_karma': unstable_karma,
}
+ # Basic sanity checks
+ if type_ not in config.get('update_types'):
+ flash_log('Unknown update type: %s. Valid types are: %s' % (
+ type_, config.get('update_types')))
+ raise InvalidUpdateException(params)
+ if request not in ('testing', 'stable', None):
+ flash_log('Unknown request: %s. Valid requests are: testing, '
+ 'stable, None' % request)
+ if stable_karma < 1:
+ flash_log("Stable karma must be at least 1.")
+ raise InvalidUpdateException(params)
+ if stable_karma <= unstable_karma:
+ flash_log("Stable karma must be higher than unstable karma.")
+ raise InvalidUpdateException(params)
+
# Make sure this update doesn't already exist
if not edited:
for build in builds:
@@ -510,8 +510,7 @@ class Root(controllers.RootController):
except urllib2.URLError:
flash_log("Unable to access the package database. Please "
"notify an administrator in #fedora-admin")
- if request_format() == 'json': return dict()
- raise redirect('/new', **params)
+ raise InvalidUpdateException(params)
# Verify that the user is either in the committers list, or is
# a member of a groups that has privileges to commit to this package
@@ -521,8 +520,7 @@ class Root(controllers.RootController):
not filter(lambda x: x in identity.current.groups, groups[0]):
flash_log("%s does not have commit access to %s" % (
identity.current.user_name, pkg))
- if request_format() == 'json': return dict()
- raise redirect('/new', **params)
+ raise InvalidUpdateException(params)
# If we're editing an update, unpush it first so we can assume all
# of the builds are tagged as update candidates
@@ -532,14 +530,12 @@ class Root(controllers.RootController):
edited.unpush()
except SQLObjectNotFound:
flash_log("Cannot find update '%s' to edit" % edited)
- if request_format() == 'json': return dict()
- raise redirect('/new', **params)
+ raise InvalidUpdateException(params)
if edited.status == 'stable':
flash_log("Cannot edit stable updates. Contact release "
"engineering at %s about unpushing this update." %
config.get('release_team_address'))
- if request_format() == 'json': return dict()
- raise redirect('/new', **params)
+ raise InvalidUpdateException(params)
# Make sure all builds are tagged appropriately. We also determine
# which builds get pushed for which releases, based on the tag.
@@ -549,8 +545,7 @@ class Root(controllers.RootController):
tags = [tag['name'] for tag in koji.listTags(build)]
except GenericError:
flash_log("Invalid build: %s" % build)
- if request_format() == 'json': return dict()
- raise redirect('/new', **params)
+ raise InvalidUpdateException(params)
# Determine which release this build is a candidate for
for tag in tags:
@@ -593,8 +588,7 @@ class Root(controllers.RootController):
# skip this verification.
if not valid and not edited:
flash_log("%s not tagged as an update candidate" % build)
- if request_format() == 'json': return dict()
- raise redirect('/new', **params)
+ raise InvalidUpdateException(params)
kojiBuild = koji.getBuild(build)
kojiBuild['nvr'] = "%s-%s-%s" % (kojiBuild['name'],
@@ -744,8 +738,7 @@ class Root(controllers.RootController):
update.set_request(request, pathcheck=False)
except InvalidRequest, e:
flash_log(str(e))
- if request_format() == 'json': return dict()
- raise redirect('/new', **params)
+ raise InvalidUpdateException(params)
flash_log('. '.join(note))
diff --git a/bodhi/exceptions.py b/bodhi/exceptions.py
index 15c9b39..f6c1607 100644
--- a/bodhi/exceptions.py
+++ b/bodhi/exceptions.py
@@ -33,6 +33,9 @@ class RepositoryNotFound(BodhiException):
class InvalidRequest(BodhiException):
pass
+class InvalidUpdateException(BodhiException):
+ pass
+
try:
from sqlobject.dberrors import DuplicateEntryError
except ImportError:
diff --git a/bodhi/util.py b/bodhi/util.py
index 1e23cdf..9766ecd 100644
--- a/bodhi/util.py
+++ b/bodhi/util.py
@@ -32,6 +32,7 @@ from yum import repoMDObject
from yum.misc import checksum
from os.path import isdir, join, dirname, basename, isfile
from datetime import datetime
+from decorator import decorator
from turbogears import config, url, flash
from bodhi.exceptions import RPMNotFound, RepodataException
@@ -422,3 +423,12 @@ def to_unicode(obj, encoding='utf-8'):
obj = unicode(obj, encoding, 'replace')
return obj
+@decorator
+def json_redirect(f, *args, **kw):
+ try:
+ return f(*args, **kw)
+ except InvalidUpdateException, e:
+ if request_format() == 'json':
+ return dict()
+ else:
+ raise redirect('/new', **e.args[0])
commit 4739c2f3eb961bbdda6a97978a616a0da412d111
Author: Luke Macken <lmacken(a)redhat.com>
Date: Fri Oct 10 01:48:12 2008 -0400
Add a test_bad_karma_thresholds unit test for #242
diff --git a/bodhi/tests/test_controllers.py b/bodhi/tests/test_controllers.py
index 9bef400..ea03252 100644
--- a/bodhi/tests/test_controllers.py
+++ b/bodhi/tests/test_controllers.py
@@ -920,6 +920,28 @@ class TestControllers(testutil.DBTest):
assert update.builds[1].package.stable_karma == params['stable_karma']
assert update.builds[1].package.unstable_karma == params['unstable_karma']
+ def test_bad_karma_thresholds(self):
+ session = login()
+ create_release()
+ params = {
+ 'builds' : 'TurboGears-2.6.23.1-21.fc7',
+ 'release' : 'Fedora 7',
+ 'type_' : 'security',
+ 'bugs' : '',
+ 'notes' : '',
+ 'request' : 'Stable',
+ 'stable_karma' : 1,
+ 'unstable_karma' : 2,
+ }
+ testutil.capture_log('bodhi.util')
+ self.save_update(params, session)
+ assert "Stable karma must be higher than unstable karma." in testutil.get_log()
+
+ params['stable_karma'] = 0
+ testutil.capture_log('bodhi.util')
+ self.save_update(params, session)
+ assert "Stable karma must be at least 1." in testutil.get_log()
+
def test_anonymous_captcha(self):
""" Make sure our captcha does its job """
session = login()
commit 1780e7be4496af22b0e2fb53475462e102745449
Author: Steve 'Ashcrow' Milner <smilner(a)redhat.com>
Date: Thu Oct 9 19:39:23 2008 -0400
proposed fix for #242 checking to make sure that stable karma is always above unstable, and stable karma is at least 1.
diff --git a/bodhi/controllers.py b/bodhi/controllers.py
index c8c40e8..46507ef 100644
--- a/bodhi/controllers.py
+++ b/bodhi/controllers.py
@@ -456,6 +456,12 @@ class Root(controllers.RootController):
flash_log('Unknown request: %s. Valid requests are: testing, '
'stable, None' % request)
return dict()
+ if stable_karma < 1:
+ flash_log("Stable karama must be at least 1.")
+ return dict()
+ if stable_karma <= unstable_karma:
+ flash_log("Stable karama must be higher than unstable karma.")
+ return dict()
# Parameters used to re-populate the update form if something fails
params = {
15 years, 6 months
2 commits - bodhi.egg-info/PKG-INFO bodhi/release.py bodhi.spec .gitignore
by Luke Macken
.gitignore | 7 +++++++
bodhi.egg-info/PKG-INFO | 2 +-
bodhi.spec | 5 ++++-
bodhi/release.py | 2 +-
4 files changed, 13 insertions(+), 3 deletions(-)
New commits:
commit 4b80247a4fc45e33890bde7812aad2a510b594d9
Author: Luke Macken <lmacken(a)redhat.com>
Date: Thu Oct 9 21:17:25 2008 -0400
Add a gitignore, thanks to smilner (#244)
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..59bd389
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,7 @@
+# Files to be ignored by all git checkouts
+*.pyc
+*.pyo
+*.swp
+.bodhi.tmp
+dist
+MANIFEST
commit a6a5b783c009c3243ed1da92085a6dde2c85196c
Author: Luke Macken <lmacken(a)redhat.com>
Date: Thu Oct 9 21:13:58 2008 -0400
0.5.7 release, containing some API improvements
diff --git a/bodhi.egg-info/PKG-INFO b/bodhi.egg-info/PKG-INFO
index a20bf1f..cae43d1 100644
--- a/bodhi.egg-info/PKG-INFO
+++ b/bodhi.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: bodhi
-Version: 0.5.6
+Version: 0.5.7
Summary: Bodhi is a modular web-system that facilitates the process of publishing updates for a Fedora-based software distribution
Home-page: https://fedorahosted.org/bodhi
Author: Luke Macken
diff --git a/bodhi.spec b/bodhi.spec
index 67f5d15..60e3de4 100644
--- a/bodhi.spec
+++ b/bodhi.spec
@@ -2,7 +2,7 @@
%{!?pyver: %define pyver %(%{__python} -c "import sys ; print sys.version[:3]")}
Name: bodhi
-Version: 0.5.6
+Version: 0.5.7
Release: 1%{?dist}
Summary: A modular framework that facilitates publishing software updates
Group: Applications/Internet
@@ -112,6 +112,9 @@ rm -rf bodhi/tests bodhi/tools/test-bodhi.py
%changelog
+* Thu Oct 09 2008 Luke Macken <lmacken(a)redhat.com> - 0.5.7-1
+- Latest release, containing some API improvements
+
* Tue Oct 07 2008 Luke Macken <lmacken(a)redhat.com> - 0.5.6-1
- Latest upstream release.
diff --git a/bodhi/release.py b/bodhi/release.py
index 2c82042..f658f7b 100644
--- a/bodhi/release.py
+++ b/bodhi/release.py
@@ -1,4 +1,4 @@
-VERSION = '0.5.6'
+VERSION = '0.5.7'
NAME = 'bodhi'
DESCRIPTION = 'Bodhi is a modular web-system that facilitates the process of publishing updates for a Fedora-based software distribution'
AUTHOR = 'Luke Macken'
15 years, 6 months