[PATCH] Drop tables and functions only if exist
by Pavol Babincak
At the time of first initialization of Koji database tables and
functions don't exist. This isn't really a problem as SQL commands later
in the script create them.
For non-existent tables or functions psql prints NOTICE instead of an
ERROR. Therefore one can check if database was initialized correctly
with ON_ERROR_STOP set (see psql(1)):
psql returns 3 if an error occurred in a script and the variable
ON_ERROR_STOP was set.
---
docs/schema.sql | 70 ++++++++++++++++++++++++++++-----------------------------
1 file changed, 35 insertions(+), 35 deletions(-)
diff --git a/docs/schema.sql b/docs/schema.sql
index 56418c9..7a46f7f 100644
--- a/docs/schema.sql
+++ b/docs/schema.sql
@@ -1,56 +1,56 @@
-- vim:noet:sw=8
-- still needs work
-DROP TABLE build_notifications;
+DROP TABLE IF EXISTS build_notifications;
-DROP TABLE log_messages;
+DROP TABLE IF EXISTS log_messages;
-DROP TABLE buildroot_listing;
-DROP TABLE image_listing;
+DROP TABLE IF EXISTS buildroot_listing;
+DROP TABLE IF EXISTS image_listing;
-DROP TABLE rpminfo;
-DROP TABLE image_builds;
-DROP TABLE image_archives;
+DROP TABLE IF EXISTS rpminfo;
+DROP TABLE IF EXISTS image_builds;
+DROP TABLE IF EXISTS image_archives;
-DROP TABLE group_package_listing;
-DROP TABLE group_req_listing;
-DROP TABLE group_config;
-DROP TABLE groups;
+DROP TABLE IF EXISTS group_package_listing;
+DROP TABLE IF EXISTS group_req_listing;
+DROP TABLE IF EXISTS group_config;
+DROP TABLE IF EXISTS groups;
-DROP TABLE tag_listing;
-DROP TABLE tag_packages;
+DROP TABLE IF EXISTS tag_listing;
+DROP TABLE IF EXISTS tag_packages;
-DROP TABLE buildroot;
-DROP TABLE repo;
+DROP TABLE IF EXISTS buildroot;
+DROP TABLE IF EXISTS repo;
-DROP TABLE build_target_config;
-DROP TABLE build_target;
+DROP TABLE IF EXISTS build_target_config;
+DROP TABLE IF EXISTS build_target;
-DROP TABLE tag_config;
-DROP TABLE tag_inheritance;
-DROP TABLE tag;
+DROP TABLE IF EXISTS tag_config;
+DROP TABLE IF EXISTS tag_inheritance;
+DROP TABLE IF EXISTS tag;
-DROP TABLE build;
+DROP TABLE IF EXISTS build;
-DROP TABLE task;
+DROP TABLE IF EXISTS task;
-DROP TABLE host_channels;
-DROP TABLE host;
+DROP TABLE IF EXISTS host_channels;
+DROP TABLE IF EXISTS host;
-DROP TABLE channels;
-DROP TABLE package;
+DROP TABLE IF EXISTS channels;
+DROP TABLE IF EXISTS package;
-DROP TABLE user_groups;
-DROP TABLE user_perms;
-DROP TABLE permissions;
+DROP TABLE IF EXISTS user_groups;
+DROP TABLE IF EXISTS user_perms;
+DROP TABLE IF EXISTS permissions;
-DROP TABLE sessions;
-DROP TABLE users;
+DROP TABLE IF EXISTS sessions;
+DROP TABLE IF EXISTS users;
-DROP TABLE event_labels;
-DROP TABLE events;
-DROP FUNCTION get_event();
-DROP FUNCTION get_event_time(INTEGER);
+DROP TABLE IF EXISTS event_labels;
+DROP TABLE IF EXISTS events;
+DROP FUNCTION IF EXISTS get_event();
+DROP FUNCTION IF EXISTS get_event_time(INTEGER);
BEGIN WORK;
--
1.9.3
8 years, 8 months
[PATCH] (koji-web) Treat extra-footer as a template.
by Ralph Bean
The code previously would look for a file called extra-footer.html that a koji
admin could override to put some nice extra footer on their koji-web page.
If that file existed, koji-web would read it in verbatim and write it to the
bottom of each served page.
This change enhances that behavior and treats the extra-footer.html file as a
Cheetah template. This way, a koji admin could specify some conditional logic
in the extra-footer file to display this or that thing depending on the dynamic
contents of the page being served.
Note that this is backwards compatible. Static html extra-footer files
already out there in the wild will be interpreted as Cheetah templates and
should be included seamlessly.
---
www/kojiweb/includes/footer.chtml | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/www/kojiweb/includes/footer.chtml b/www/kojiweb/includes/footer.chtml
index 8dad310..684e5a4 100644
--- a/www/kojiweb/includes/footer.chtml
+++ b/www/kojiweb/includes/footer.chtml
@@ -8,8 +8,7 @@
#set $localfooterpath=$util.themePath("extra-footer.html", local=True)
#if os.path.exists($localfooterpath)
-#set $localfooter="".join(open($localfooterpath).readlines())
-$localfooter
+#include $localfooterpath
#end if
</div>
--
2.1.0
8 years, 11 months
[PATCH] Ran reindent.py from cpython tools on all python scripts
by Pavol Babincak
Citing from reindent docs:
Change Python (.py) files to use 4-space indents and no hard tab
characters. Also trim excess spaces and tabs from ends of lines, and
remove empty lines at the end of files. Also ensure the last line
ends with a newline.
Citing from PEP 8:
Use 4 spaces per indentation level.
Python 2 code indented with a mixture of tabs and spaces should be
converted to using spaces exclusively.
Don't write string literals that rely on significant trailing
whitespace. Such trailing whitespace is visually indistinguishable
and some editors (or more recently, reindent.py) will trim them.
Also PyLint recommends not to have trailing whitespace on any line.
---
builder/kojid | 140 +++++++++++++++++++++---------------------
cli/koji | 70 ++++++++++-----------
hub/kojihub.py | 28 ++++-----
hub/kojixmlrpc.py | 6 +-
koji/__init__.py | 4 +-
koji/auth.py | 10 +--
koji/context.py | 2 +-
koji/daemon.py | 2 +-
koji/db.py | 2 +-
koji/plugin.py | 2 +-
koji/policy.py | 3 +-
koji/server.py | 1 -
koji/ssl/SSLCommon.py | 1 -
koji/ssl/SSLConnection.py | 1 -
koji/ssl/XMLRPCServerProxy.py | 1 -
koji/tasks.py | 2 +-
koji/util.py | 2 +-
plugins/messagebus.py | 26 ++++----
plugins/runroot.py | 2 -
util/koji-gc | 1 -
util/koji-shadow | 1 -
util/kojira | 4 +-
vm/kojikamid.py | 6 +-
www/kojiweb/index.py | 98 ++++++++++++++---------------
www/lib/kojiweb/util.py | 15 +++--
25 files changed, 210 insertions(+), 220 deletions(-)
diff --git a/builder/kojid b/builder/kojid
index 3df0588..ae33e15 100755
--- a/builder/kojid
+++ b/builder/kojid
@@ -5,7 +5,7 @@
#
# Koji is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation;
+# License as published by the Free Software Foundation;
# version 2.1 of the License.
#
# This software is distributed in the hope that it will be useful,
@@ -1032,11 +1032,11 @@ class BaseBuildTask(BaseTaskHandler):
tag_arches = [koji.canonArch(a) for a in tag['arches'].split()]
host_arches = hostdata['arches'].split()
if not set(tag_arches).intersection(host_arches):
- self.logger.info('Task %s (%s): tag arches (%s) and ' \
- 'host arches (%s) are disjoint' % \
- (self.id, self.method,
- ', '.join(tag_arches), ', '.join(host_arches)))
- return False
+ self.logger.info('Task %s (%s): tag arches (%s) and ' \
+ 'host arches (%s) are disjoint' % \
+ (self.id, self.method,
+ ', '.join(tag_arches), ', '.join(host_arches)))
+ return False
#otherwise...
# This is in principle an error condition, but this is not a good place
# to fail. Instead we proceed and let the task fail normally.
@@ -2389,7 +2389,7 @@ class ImageTask(BaseTaskHandler):
def fetchKickstart(self, broot, ksfile):
"""
- Retrieve the kickstart file we were given (locally or remotely) and
+ Retrieve the kickstart file we were given (locally or remotely) and
upload it.
Note that if the KS file existed locally, then "ksfile" is a relative
@@ -2488,7 +2488,7 @@ class ImageTask(BaseTaskHandler):
# Write out the new ks file. Note that things may not be in the same
# order and comments in the original ks file may be lost.
- kskoji = os.path.join('/tmp', 'koji-image-%s-%i.ks' %
+ kskoji = os.path.join('/tmp', 'koji-image-%s-%i.ks' %
(target_info['build_tag_name'], self.id))
kojikspath = os.path.join(broot.rootdir(), kskoji[1:])
outfile = open(kojikspath, 'w')
@@ -2503,7 +2503,7 @@ class ImageTask(BaseTaskHandler):
def getImagePackages(self, cachepath):
"""
- Read RPM header information from the yum cache available in the
+ Read RPM header information from the yum cache available in the
given path. Returns a list of dictionaries for each RPM included.
"""
found = False
@@ -2524,8 +2524,8 @@ class ImageTask(BaseTaskHandler):
raise koji.LiveCDError, 'No repos found in yum cache!'
return hdrlist
-# ApplianceTask begins with a mock chroot, and then installs appliance-tools
-# into it via the appliance-build group. appliance-creator is then executed
+# ApplianceTask begins with a mock chroot, and then installs appliance-tools
+# into it via the appliance-build group. appliance-creator is then executed
# in the chroot to create the appliance image.
#
class ApplianceTask(ImageTask):
@@ -2548,7 +2548,7 @@ class ApplianceTask(ImageTask):
if opts == None:
opts = {}
self.opts = opts
- broot = self.makeImgBuildRoot(build_tag, repo_info, arch,
+ broot = self.makeImgBuildRoot(build_tag, repo_info, arch,
'appliance-build')
kspath = self.fetchKickstart(broot, ksfile)
self.readKickstart(kspath, opts)
@@ -2561,11 +2561,11 @@ class ApplianceTask(ImageTask):
app_log = '/tmp/appliance.log'
os.mkdir(opath)
- cmd = ['/usr/bin/appliance-creator', '-c', kskoji, '-d', '-v',
+ cmd = ['/usr/bin/appliance-creator', '-c', kskoji, '-d', '-v',
'--logfile', app_log, '--cache', cachedir, '-o', odir]
for arg_name in ('vmem', 'vcpu', 'format'):
arg = opts.get(arg_name)
- if arg != None:
+ if arg != None:
cmd.extend(['--%s' % arg_name, arg])
appname = '%s-%s-%s' % (name, version, release)
cmd.extend(['--name', appname])
@@ -2582,7 +2582,7 @@ class ApplianceTask(ImageTask):
results = []
for directory, subdirs, files in os.walk(opath):
for f in files:
- results.append(os.path.join(broot.rootdir(), 'tmp',
+ results.append(os.path.join(broot.rootdir(), 'tmp',
directory, f))
self.logger.debug('output: %s' % results)
if len(results) == 0:
@@ -2610,7 +2610,7 @@ class ApplianceTask(ImageTask):
cachedir[1:]))
broot.markExternalRPMs(hdrlist)
imgdata['rpmlist'] = hdrlist
-
+
broot.expire()
return imgdata
@@ -2706,7 +2706,7 @@ class LiveCDTask(ImageTask):
livecd_log = '/tmp/livecd.log'
cmd = ['/usr/bin/livecd-creator', '-c', kskoji, '-d', '-v',
'--logfile', livecd_log, '--cache', cachedir]
- # we set the fs label to the same as the isoname if it exists,
+ # we set the fs label to the same as the isoname if it exists,
# taking at most 32 characters
isoname = '%s-%s-%s' % (name, version, release)
cmd.extend(['-f', isoname[:32]])
@@ -3398,7 +3398,7 @@ class BaseImageTask(OzImageTask):
class BuildIndirectionImageTask(OzImageTask):
Methods = ['indirectionimage']
- # So, these are copied directly from the base image class
+ # So, these are copied directly from the base image class
# Realistically, we want to inherit methods from both BuildImageTask
# and OzImageTask.
# TODO: refactor - my initial suggestion would be to have OzImageTask
@@ -3427,7 +3427,7 @@ class BuildIndirectionImageTask(OzImageTask):
def fetchHubOrSCM(self, filepath, fileurl):
"""
Retrieve a file either from the hub or a remote scm
-
+
If fileurl is None we assume we are being asked to retrieve from
the hub and that filepath is relative to /mnt/koji/work.
if fileurl contains a value we assume a remote SCM.
@@ -3466,7 +3466,7 @@ class BuildIndirectionImageTask(OzImageTask):
def _task_to_image(task_id):
""" Take a task ID and turn it into an Image Factory Base Image object """
pim = PersistentImageManager.default_manager()
- taskinfo = self.session.getTaskInfo(task_id)
+ taskinfo = self.session.getTaskInfo(task_id)
taskstate = koji.TASK_STATES[taskinfo['state']].lower()
if taskstate != 'closed':
raise koji.BuildError("Input task (%d) must be in closed state - current state is (%s)" %
@@ -3475,21 +3475,21 @@ class BuildIndirectionImageTask(OzImageTask):
if taskmethod != "createImage":
raise koji.BuildError("Input task method must be 'createImage' - actual method (%s)" %
(taskmethod))
- result = self.session.getTaskResult(task_id)
- files = self.session.listTaskOutput(task_id)
+ result = self.session.getTaskResult(task_id)
+ files = self.session.listTaskOutput(task_id)
# This approach works for both scratch and saved/formal images
# The downside is that we depend on the output file naming convention
- def _match_name(inlist, namere):
- for filename in inlist:
- if re.search(namere, filename):
- return filename
- task_diskimage = _match_name(result['files'], ".*qcow2$")
- task_tdl = _match_name(result['files'], "tdl.*xml")
+ def _match_name(inlist, namere):
+ for filename in inlist:
+ if re.search(namere, filename):
+ return filename
+ task_diskimage = _match_name(result['files'], ".*qcow2$")
+ task_tdl = _match_name(result['files'], "tdl.*xml")
- task_dir = os.path.join(koji.pathinfo.work(),koji.pathinfo.taskrelpath(task_id))
- diskimage_full = os.path.join(task_dir, task_diskimage)
- tdl_full = os.path.join(task_dir, task_tdl)
+ task_dir = os.path.join(koji.pathinfo.work(),koji.pathinfo.taskrelpath(task_id))
+ diskimage_full = os.path.join(task_dir, task_diskimage)
+ tdl_full = os.path.join(task_dir, task_tdl)
if not (os.path.isfile(diskimage_full) and os.path.isfile(tdl_full)):
raise koji.BuildError("Missing TDL or qcow2 image for task (%d) - possible expired scratch build" % (task_id))
@@ -3508,7 +3508,7 @@ class BuildIndirectionImageTask(OzImageTask):
factory_base_image.status = 'COMPLETE'
# Now save it
pim.save_image(factory_base_image)
-
+
# We can now reference this object directly or via its UUID in persistent storage
return factory_base_image
@@ -3518,10 +3518,10 @@ class BuildIndirectionImageTask(OzImageTask):
build = self.session.getBuild(nvr)
if not build:
raise koji.BuildError("Could not find build for (%s)" % (nvr))
-
+
buildarchives = self.session.listArchives(build['id'])
if not buildarchives:
- raise koji.Builderror("Could not retrieve archives for build (%s) from NVR (%s)" %
+ raise koji.Builderror("Could not retrieve archives for build (%s) from NVR (%s)" %
(build['id'], nvr))
buildfiles = [ x['filename'] for x in buildarchives ]
@@ -3539,7 +3539,7 @@ class BuildIndirectionImageTask(OzImageTask):
tdl_full = os.path.join(builddir, build_tdl)
if not (os.path.isfile(diskimage_full) and os.path.isfile(tdl_full)):
- raise koji.BuildError("Missing TDL (%s) or qcow2 (%s) image for image (%s) - this should never happen" %
+ raise koji.BuildError("Missing TDL (%s) or qcow2 (%s) image for image (%s) - this should never happen" %
(build_tdl, build_diskimage, nvr))
# The sequence to recreate a valid persistent image is as follows
@@ -3588,12 +3588,12 @@ class BuildIndirectionImageTask(OzImageTask):
release = opts['release']
# TODO: Another mostly copy-paste
- if not release:
- release = self.getRelease(name, version)
- if '-' in version:
- raise koji.ApplianceError('The Version may not have a hyphen')
- if '-' in release:
- raise koji.ApplianceError('The Release may not have a hyphen')
+ if not release:
+ release = self.getRelease(name, version)
+ if '-' in version:
+ raise koji.ApplianceError('The Version may not have a hyphen')
+ if '-' in release:
+ raise koji.ApplianceError('The Release may not have a hyphen')
indirection_template = self.fetchHubOrSCM(opts.get('indirection_template'),
opts.get('indirection_template_url'))
@@ -3601,24 +3601,24 @@ class BuildIndirectionImageTask(OzImageTask):
self.logger.debug('Got indirection template %s' % (indirection_template))
try:
- if opts['utility_image_build']:
- utility_factory_image = _nvr_to_image(opts['utility_image_build'], opts['arch'])
- else:
- utility_factory_image = _task_to_image(int(opts['utility_image_task']))
-
- if opts['base_image_build']:
- base_factory_image = _nvr_to_image(opts['base_image_build'], opts['arch'])
- else:
- base_factory_image = _task_to_image(int(opts['base_image_task']))
+ if opts['utility_image_build']:
+ utility_factory_image = _nvr_to_image(opts['utility_image_build'], opts['arch'])
+ else:
+ utility_factory_image = _task_to_image(int(opts['utility_image_task']))
+
+ if opts['base_image_build']:
+ base_factory_image = _nvr_to_image(opts['base_image_build'], opts['arch'])
+ else:
+ base_factory_image = _task_to_image(int(opts['base_image_task']))
except Exception, e:
self.logger.exception(e)
raise
# OK - We have a template and two input images - lets build
- bld_info = None
- if not opts['scratch']:
- bld_info = self.initImageBuild(name, version, release,
- target_info, opts)
+ bld_info = None
+ if not opts['scratch']:
+ bld_info = self.initImageBuild(name, version, release,
+ target_info, opts)
try:
return self._do_indirection(opts, base_factory_image, utility_factory_image,
@@ -3667,9 +3667,9 @@ class BuildIndirectionImageTask(OzImageTask):
open(target_image.data, "w").write("Mock build from task ID: %s" %
(str(self.id)))
target_image.status='COMPLETE'
- else:
+ else:
target = bd.builder_for_target_image('indirection',
- image_id=base_factory_image.identifier,
+ image_id=base_factory_image.identifier,
parameters=params)
target.target_thread.join()
except Exception, e:
@@ -3697,7 +3697,7 @@ class BuildIndirectionImageTask(OzImageTask):
myresults['logs'] = [ os.path.basename(ozlog) ]
myresults['arch'] = opts['arch']
# TODO: This should instead track the two input images: base and utility
- myresults['rpmlist'] = [ ]
+ myresults['rpmlist'] = [ ]
# This is compatible with some helper methods originally implemented for the base
# image build. In the original usage, the dict contains an entry per build arch
@@ -3825,7 +3825,7 @@ class BuildSRPMFromSCMTask(BaseBuildTask):
raise koji.BuildError, "Multiple srpms found in %s: %s" % (sourcedir, ", ".join(srpms))
else:
srpm = srpms[0]
-
+
# check srpm name
h = koji.get_rpm_header(srpm)
name = h[rpm.RPMTAG_NAME]
@@ -3844,7 +3844,7 @@ class BuildSRPMFromSCMTask(BaseBuildTask):
broot.expire()
return {'srpm': "%s/%s" % (uploadpath, srpm_name),
- 'logs': ["%s/%s" % (uploadpath, os.path.basename(f))
+ 'logs': ["%s/%s" % (uploadpath, os.path.basename(f))
for f in log_files],
'brootid': brootid,
}
@@ -3969,16 +3969,16 @@ Build Info: %(weburl)s/buildinfo?buildID=%(build_id)i\r
if not data:
data = {}
taskinfo = self.session.getTaskInfo(task_id)
-
+
if not taskinfo:
# invalid task_id
return data
-
+
if taskinfo['host_id']:
hostinfo = self.session.getHost(taskinfo['host_id'])
else:
hostinfo = None
-
+
result = None
try:
result = self.session.getTaskResult(task_id)
@@ -3994,17 +3994,17 @@ Build Info: %(weburl)s/buildinfo?buildID=%(build_id)i\r
sys.exc_clear()
if not result:
result = 'Unknown'
-
+
files = self.session.listTaskOutput(task_id)
logs = [filename for filename in files if filename.endswith('.log')]
rpms = [filename for filename in files if filename.endswith('.rpm') and not filename.endswith('.src.rpm')]
srpms = [filename for filename in files if filename.endswith('.src.rpm')]
misc = [filename for filename in files if filename not in logs + rpms + srpms]
-
+
logs.sort()
rpms.sort()
misc.sort()
-
+
data[task_id] = {}
data[task_id]['id'] = taskinfo['id']
data[task_id]['method'] = taskinfo['method']
@@ -4018,7 +4018,7 @@ Build Info: %(weburl)s/buildinfo?buildID=%(build_id)i\r
data[task_id]['rpms'] = rpms
data[task_id]['srpms'] = srpms
data[task_id]['misc'] = misc
-
+
children = self.session.getTaskChildren(task_id)
for child in children:
data = self._getTaskData(child['id'], data)
@@ -4057,7 +4057,7 @@ Build Info: %(weburl)s/buildinfo?buildID=%(build_id)i\r
elif build['state'] == koji.BUILD_STATES['FAILED']:
failure_data = task_data[task_id]['result']
failed_hosts = ['%s (%s)' % (task['host'], task['arch']) for task in task_data.values() if task['host'] and task['state'] == 'failed']
- failure_info = "\r\n%s (%d) failed on %s:\r\n %s" % (build_nvr, build_id,
+ failure_info = "\r\n%s (%d) failed on %s:\r\n %s" % (build_nvr, build_id,
', '.join(failed_hosts),
failure_data)
@@ -4066,14 +4066,14 @@ Build Info: %(weburl)s/buildinfo?buildID=%(build_id)i\r
tasks = {'failed' : [task for task in task_data.values() if task['state'] == 'failed'],
'canceled' : [task for task in task_data.values() if task['state'] == 'canceled'],
'closed' : [task for task in task_data.values() if task['state'] == 'closed']}
-
+
srpms = []
for taskinfo in task_data.values():
for srpmfile in taskinfo['srpms']:
srpms.append(srpmfile)
srpms = self.uniq(srpms)
srpms.sort()
-
+
if srpms:
output = "SRPMS:\r\n"
for srpm in srpms:
@@ -4564,7 +4564,7 @@ if __name__ == "__main__":
except koji.AuthError, e:
quit("Error: Unable to log in: %s" % e)
except xmlrpclib.ProtocolError:
- quit("Error: Unable to connect to server %s" % (options.server))
+ quit("Error: Unable to connect to server %s" % (options.server))
elif options.user:
try:
# authenticate using user/password
diff --git a/cli/koji b/cli/koji
index bfb0955..839f7d6 100755
--- a/cli/koji
+++ b/cli/koji
@@ -6,7 +6,7 @@
#
# Koji is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation;
+# License as published by the Free Software Foundation;
# version 2.1 of the License.
#
# This software is distributed in the hope that it will be useful,
@@ -141,7 +141,7 @@ def get_options():
parser.add_option("--debug-xmlrpc", action="store_true", default=False,
help=_("show xmlrpc debug output"))
parser.add_option("-q", "--quiet", action="store_true", default=False,
- help=_("run quietly"))
+ help=_("run quietly"))
parser.add_option("--skip-main", action="store_true", default=False,
help=_("don't actually run main"))
parser.add_option("-s", "--server", help=_("url of XMLRPC server"))
@@ -205,7 +205,7 @@ def get_options():
'krbservice': 'host',
'cert': '~/.koji/client.crt',
'ca': '~/.koji/clientca.crt',
- 'serverca': '~/.koji/serverca.crt',
+ 'serverca': '~/.koji/serverca.crt',
'authtype': None
}
#note: later config files override earlier ones
@@ -263,7 +263,7 @@ def get_options():
# expand paths here, so we don't have to worry about it later
value = os.path.expanduser(getattr(options, name))
setattr(options, name, value)
-
+
#honor topdir
if options.topdir:
koji.BASEDIR = options.topdir
@@ -427,7 +427,7 @@ def display_task_results(tasks):
for task in [task for task in tasks.values() if task.level == 0]:
state = task.info['state']
task_label = task.str()
-
+
if state == koji.TASK_STATES['CLOSED']:
print '%s completed successfully' % task_label
elif state == koji.TASK_STATES['FAILED']:
@@ -526,7 +526,7 @@ def watch_logs(session, tasklist, opts):
while contents:
if not taskoffsets.has_key(log):
taskoffsets[log] = 0
-
+
contents = session.downloadTaskOutput(task_id, log, taskoffsets[log], 16384)
taskoffsets[log] += len(contents)
if contents:
@@ -556,7 +556,7 @@ def handle_add_group(options, session, args):
assert False
tag = args[0]
group = args[1]
-
+
activate_session(session)
if not session.hasPerm('admin'):
print "This action requires admin privileges"
@@ -566,7 +566,7 @@ def handle_add_group(options, session, args):
if not dsttag:
print "Unknown tag: %s" % tag
return 1
-
+
groups = dict([(p['name'], p['group_id']) for p in session.getTagGroups(tag, inherit=False)])
group_id = groups.get(group, None)
if group_id is not None:
@@ -574,7 +574,7 @@ def handle_add_group(options, session, args):
return 1
session.groupListAdd(tag, group)
-
+
def handle_add_host(options, session, args):
"[admin] Add a host"
usage = _("usage: %prog add-host [options] hostname arch [arch2 ...]")
@@ -694,7 +694,7 @@ def handle_remove_host_from_channel(options, session, args):
if channel not in hostchannels:
print "Host %s is not a member of channel %s" % (host, channel)
return 1
-
+
session.removeHostFromChannel(host, channel)
def handle_remove_channel(options, session, args):
@@ -903,7 +903,7 @@ def handle_build(options, session, args):
parser.error(_("Exactly two arguments (a build target and a SCM URL or srpm file) are required"))
assert False
if build_opts.arch_override and not build_opts.scratch:
- parser.error(_("--arch_override is only allowed for --scratch builds"))
+ parser.error(_("--arch_override is only allowed for --scratch builds"))
activate_session(session)
target = args[0]
if target.lower() == "none" and build_opts.repo_id:
@@ -987,7 +987,7 @@ def handle_chain_build(options, session, args):
return 1
sources = args[1:]
-
+
src_list = []
build_level = []
#src_lists is a list of lists of sources to build.
@@ -1017,7 +1017,7 @@ def handle_chain_build(options, session, args):
if build_opts.background:
#relative to koji.PRIO_DEFAULT
priority = 5
-
+
task_id = session.chainBuild(src_list, target, priority=priority)
print "Created task:", task_id
@@ -2534,7 +2534,7 @@ def anon_handle_latest_build(options, session, args):
print "%-40s %-20s %s" % ("Build","Tag","Built by")
print "%s %s %s" % ("-"*40, "-"*20, "-"*16)
options.quiet = True
-
+
output = [ fmt % x for x in data]
output.sort()
for line in output:
@@ -2927,7 +2927,7 @@ def anon_handle_list_hosts(options, session, args):
for host in hosts:
session.getLastHostUpdate(host['id'])
updateList = session.multiCall()
-
+
for host, [update] in zip(hosts, updateList):
if update is None:
host['update'] = '-'
@@ -3166,12 +3166,12 @@ def handle_clone_tag(options, session, args):
activate_session(session)
if not session.hasPerm('admin') and not options.test:
- print "This action requires admin privileges"
- return
+ print "This action requires admin privileges"
+ return
if args[0] == args[1]:
sys.stdout.write('Source and destination tags must be different.\n')
- return
+ return
# store tags.
srctag = session.getTag(args[0])
dsttag = session.getTag(args[1])
@@ -3433,7 +3433,7 @@ def handle_add_target(options, session, args):
if not session.hasPerm('admin'):
print "This action requires admin privileges"
return 1
-
+
chkbuildtag = session.getTag(build_tag)
chkdesttag = session.getTag(dest_tag)
if not chkbuildtag:
@@ -3445,7 +3445,7 @@ def handle_add_target(options, session, args):
if not chkdesttag:
print "Destination tag does not exist: %s" % dest_tag
return 1
-
+
session.createBuildTarget(name, build_tag, dest_tag)
def handle_edit_target(options, session, args):
@@ -3509,13 +3509,13 @@ def handle_remove_target(options, session, args):
if not session.hasPerm('admin'):
print "This action requires admin privileges"
return
-
+
target = args[0]
target_info = session.getBuildTarget(target)
if not target_info:
print "Build target %s does not exist" % target
return 1
-
+
session.deleteBuildTarget(target_info['id'])
def handle_remove_tag(options, session, args):
@@ -4680,7 +4680,7 @@ def handle_edit_tag_inheritance(options, session, args):
return 1
print _("Error: Key constraints may be broken. Exiting.")
return 1
-
+
# len(data) == 1
data = data[0]
@@ -5101,7 +5101,7 @@ def handle_image_build_indirection(options, session, args):
usage += _("\n %prog image-build --config FILE")
usage += _("\n\n(Specify the --help global option for a list of other " +
"help options)")
- parser = OptionParser(usage=usage)
+ parser = OptionParser(usage=usage)
parser.add_option("--config",
help=_("Use a configuration file to define image-build options " +
"instead of command line options (they will be ignored)."))
@@ -5151,19 +5151,19 @@ def _build_image_indirection(options, task_opts, session, args):
"""
# Do some sanity checks before even attempting to create the session
- if not (bool(task_opts.utility_image_task) !=
+ if not (bool(task_opts.utility_image_task) !=
bool(task_opts.utility_image_build)):
raise koji.GenericError, _("You must specify either a utility-image task or build ID/NVR")
- if not (bool(task_opts.base_image_task) !=
+ if not (bool(task_opts.base_image_task) !=
bool(task_opts.base_image_build)):
raise koji.GenericError, _("You must specify either a base-image task or build ID/NVR")
required_opts = [ 'name', 'version', 'arch', 'target', 'indirection_template', 'results_loc' ]
optional_opts = [ 'indirection_template_url', 'scratch', 'utility_image_task', 'utility_image_build',
- 'base_image_task', 'base_image_build', 'release', 'skip_tag' ]
+ 'base_image_task', 'base_image_build', 'release', 'skip_tag' ]
- missing = [ ]
+ missing = [ ]
for opt in required_opts:
if not getattr(task_opts, opt, None):
missing.append(opt)
@@ -5909,7 +5909,7 @@ def handle_move_build(opts, session, args):
activate_session(session)
tasks = []
builds = []
-
+
if options.all:
for arg in args[2:]:
pkg = session.getPackage(arg)
@@ -5923,10 +5923,10 @@ def handle_move_build(opts, session, args):
build = session.getBuild(arg)
if not build:
print _("Invalid build %s, skipping." % arg)
- continue
+ continue
if not build in builds:
builds.append(build)
-
+
for build in builds:
task_id = session.moveBuild(args[0], args[1], build['id'], options.force)
tasks.append(task_id)
@@ -6045,7 +6045,7 @@ def anon_handle_download_build(options, session, args):
elif len(args) > 1:
parser.error(_("Only a single package N-V-R or build ID may be specified"))
assert False
-
+
activate_session(session)
build = args[0]
@@ -6060,7 +6060,7 @@ def anon_handle_download_build(options, session, args):
print "No associated builds for task %s" % build
return 1
build = builds[0]['build_id']
-
+
if suboptions.latestfrom:
# We want the latest build, not a specific build
try:
@@ -6074,7 +6074,7 @@ def anon_handle_download_build(options, session, args):
info = builds[0]
else:
info = session.getBuild(build)
-
+
if info is None:
print "No such build: %s" % build
return 1
@@ -6134,7 +6134,7 @@ def anon_handle_download_build(options, session, args):
pg = None
else:
pg = progress.TextMeter()
-
+
for url, relpath in urls:
file = grabber.urlopen(url, progress_obj=pg, text=relpath)
diff --git a/hub/kojihub.py b/hub/kojihub.py
index 9decf7c..3cb9648 100644
--- a/hub/kojihub.py
+++ b/hub/kojihub.py
@@ -5,7 +5,7 @@
#
# Koji is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation;
+# License as published by the Free Software Foundation;
# version 2.1 of the License.
#
# This software is distributed in the hope that it will be useful,
@@ -3442,8 +3442,8 @@ def list_rpms(buildID=None, buildrootID=None, imageID=None, componentBuildrootID
# image specific constraints
if imageID != None:
- clauses.append('image_listing.image_id = %(imageID)i')
- joins.append('image_listing ON rpminfo.id = image_listing.rpm_id')
+ clauses.append('image_listing.image_id = %(imageID)i')
+ joins.append('image_listing ON rpminfo.id = image_listing.rpm_id')
if hostID != None:
joins.append('buildroot ON rpminfo.buildroot_id = buildroot.id')
@@ -3553,7 +3553,7 @@ def list_archives(buildID=None, buildrootID=None, componentBuildrootID=None, hos
checksum_type: the checksum type (integer)
If componentBuildrootID is specified, then the map will also contain the following key:
- project: whether the archive was pulled in as a project dependency, or as part of the
+ project: whether the archive was pulled in as a project dependency, or as part of the
build environment setup (boolean)
If 'type' is specified, then the archives listed will be limited
@@ -3590,7 +3590,7 @@ def list_archives(buildID=None, buildrootID=None, componentBuildrootID=None, hos
an empty list is returned.
"""
values = {}
-
+
tables = ['archiveinfo']
joins = ['archivetypes on archiveinfo.type_id = archivetypes.id']
fields = [('archiveinfo.id', 'id'),
@@ -5949,7 +5949,7 @@ def get_notification_recipients(build, tag_id, state):
for this tag and the user who submitted the build. The list will not contain
duplicates.
"""
-
+
clauses = []
if build:
@@ -7542,7 +7542,7 @@ class RootExports(object):
"""
Import an archive file and associate it with a build. The archive can
be any non-rpm filetype supported by Koji.
-
+
filepath: path to the archive file (relative to the Koji workdir)
buildinfo: information about the build to associate the archive with
May be a string (NVR), integer (buildID), or dict (containing keys: name, version, release)
@@ -8557,7 +8557,7 @@ class RootExports(object):
raise koji.GenericError, 'user already exists: %s' % username
if krb_principal and get_user(krb_principal):
raise koji.GenericError, 'user with this Kerberos principal already exists: %s' % krb_principal
-
+
return context.session.createUser(username, status=status, krb_principal=krb_principal)
def enableUser(self, username):
@@ -8566,14 +8566,14 @@ class RootExports(object):
if not user:
raise koji.GenericError, 'unknown user: %s' % username
set_user_status(user, koji.USER_STATUS['NORMAL'])
-
+
def disableUser(self, username):
"""Disable logins by the specified user"""
user = get_user(username)
if not user:
raise koji.GenericError, 'unknown user: %s' % username
set_user_status(user, koji.USER_STATUS['BLOCKED'])
-
+
#group management calls
newGroup = staticmethod(new_group)
addGroupMember = staticmethod(add_group_member)
@@ -9223,11 +9223,11 @@ class RootExports(object):
notificationUser = self.getUser(user_id)
if not notificationUser:
raise koji.GenericError, 'invalid user ID: %s' % user_id
-
+
if not (notificationUser['id'] == currentUser['id'] or self.hasPerm('admin')):
raise koji.GenericError, 'user %s cannot create notifications for user %s' % \
(currentUser['name'], notificationUser['name'])
-
+
email = '%s@%s' % (notificationUser['name'], context.opts['EmailDomain'])
insert = """INSERT INTO build_notifications
(user_id, package_id, tag_id, success_only, email)
@@ -10076,7 +10076,7 @@ class HostExports(object):
if len(poms) == 0:
pass
elif len(poms) == 1:
- # This directory has a .pom file, so get the Maven group_id,
+ # This directory has a .pom file, so get the Maven group_id,
# artifact_id, and version from it and associate those with
# the artifacts in this directory
pom_path = os.path.join(maven_task_dir, relpath, poms[0])
@@ -10317,7 +10317,7 @@ class HostExports(object):
def importImage(self, task_id, build_id, results):
"""
- Import a built image, populating the database with metadata and
+ Import a built image, populating the database with metadata and
moving the image to its final location.
"""
for sub_results in results.values():
diff --git a/hub/kojixmlrpc.py b/hub/kojixmlrpc.py
index 67cb8ee..0e51012 100644
--- a/hub/kojixmlrpc.py
+++ b/hub/kojixmlrpc.py
@@ -3,7 +3,7 @@
#
# Koji is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation;
+# License as published by the Free Software Foundation;
# version 2.1 of the License.
#
# This software is distributed in the hope that it will be useful,
@@ -292,7 +292,7 @@ class ModXMLRPCRequestHandler(object):
if context.opts.get('LockOut') and \
context.method not in ('login', 'krbLogin', 'sslLogin', 'logout') and \
not context.session.hasPerm('admin'):
- raise koji.ServerOffline, "Server disabled for maintenance"
+ raise koji.ServerOffline, "Server disabled for maintenance"
def _dispatch(self, method, params):
func = self._get_handler(method)
@@ -569,7 +569,7 @@ def get_policy(opts, plugins):
if pname != test.policy:
continue
elif pname not in test.policy:
- continue
+ continue
# in case of name overlap, last one wins
# hence plugins can override builtin tests
merged[name] = test
diff --git a/koji/__init__.py b/koji/__init__.py
index d133ed1..24f0808 100644
--- a/koji/__init__.py
+++ b/koji/__init__.py
@@ -5,7 +5,7 @@
#
# Koji is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation;
+# License as published by the Free Software Foundation;
# version 2.1 of the License.
#
# This software is distributed in the hope that it will be useful,
@@ -987,7 +987,7 @@ def parse_pom(path=None, contents=None):
raise GenericError, 'either a path to a pom file or the contents of a pom file must be specified'
# A common problem is non-UTF8 characters in XML files, so we'll convert the string first
-
+
contents = fixEncoding(contents)
try:
diff --git a/koji/auth.py b/koji/auth.py
index 8e51ec7..d419d77 100644
--- a/koji/auth.py
+++ b/koji/auth.py
@@ -3,7 +3,7 @@
#
# Koji is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation;
+# License as published by the Free Software Foundation;
# version 2.1 of the License.
#
# This software is distributed in the hope that it will be useful,
@@ -247,7 +247,7 @@ class Session(object):
if not result:
raise koji.AuthError, 'invalid user_id: %s' % user_id
name, usertype, status = result
-
+
if status != koji.USER_STATUS['NORMAL']:
raise koji.AuthError, 'logins by %s are not allowed' % name
@@ -394,7 +394,7 @@ class Session(object):
raise koji.AuthError, '%s is not authorized to login other users' % client_dn
else:
username = client_name
-
+
cursor = context.cnx.cursor()
query = """SELECT id FROM users
WHERE name = %(username)s"""
@@ -596,7 +596,7 @@ class Session(object):
"""
if not name:
raise koji.GenericError, 'a user must have a non-empty name'
-
+
if usertype == None:
usertype = koji.USERTYPES['NORMAL']
elif not koji.USERTYPES.get(usertype):
@@ -606,7 +606,7 @@ class Session(object):
status = koji.USER_STATUS['NORMAL']
elif not koji.USER_STATUS.get(status):
raise koji.GenericError, 'invalid status: %s' % status
-
+
cursor = context.cnx.cursor()
select = """SELECT nextval('users_id_seq')"""
cursor.execute(select, locals())
diff --git a/koji/context.py b/koji/context.py
index f904bed..b05e3a3 100755
--- a/koji/context.py
+++ b/koji/context.py
@@ -3,7 +3,7 @@
#
# Koji is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation;
+# License as published by the Free Software Foundation;
# version 2.1 of the License.
#
# This software is distributed in the hope that it will be useful,
diff --git a/koji/daemon.py b/koji/daemon.py
index b9f3070..d76355b 100644
--- a/koji/daemon.py
+++ b/koji/daemon.py
@@ -4,7 +4,7 @@
#
# Koji is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation;
+# License as published by the Free Software Foundation;
# version 2.1 of the License.
#
# This software is distributed in the hope that it will be useful,
diff --git a/koji/db.py b/koji/db.py
index f5f6104..dcd2461 100644
--- a/koji/db.py
+++ b/koji/db.py
@@ -5,7 +5,7 @@
#
# Koji is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation;
+# License as published by the Free Software Foundation;
# version 2.1 of the License.
#
# This software is distributed in the hope that it will be useful,
diff --git a/koji/plugin.py b/koji/plugin.py
index e189d1f..cbb245e 100644
--- a/koji/plugin.py
+++ b/koji/plugin.py
@@ -3,7 +3,7 @@
#
# Koji is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation;
+# License as published by the Free Software Foundation;
# version 2.1 of the License.
#
# This software is distributed in the hope that it will be useful,
diff --git a/koji/policy.py b/koji/policy.py
index 47e7237..653f414 100644
--- a/koji/policy.py
+++ b/koji/policy.py
@@ -2,7 +2,7 @@
#
# Koji is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation;
+# License as published by the Free Software Foundation;
# version 2.1 of the License.
#
# This software is distributed in the hope that it will be useful,
@@ -368,4 +368,3 @@ def findSimpleTests(namespace):
ret.setdefault(name, value)
#...so first test wins in case of name overlap
return ret
-
diff --git a/koji/server.py b/koji/server.py
index 7d9ed3e..7cc8be8 100644
--- a/koji/server.py
+++ b/koji/server.py
@@ -187,4 +187,3 @@ class InputWrapper(object):
while line:
yield line
line = self.readline()
-
diff --git a/koji/ssl/SSLCommon.py b/koji/ssl/SSLCommon.py
index 5cb722d..0d3fb94 100644
--- a/koji/ssl/SSLCommon.py
+++ b/koji/ssl/SSLCommon.py
@@ -139,4 +139,3 @@ class PlgHTTPS(httplib.HTTP):
def __init__(self, host='', port=None, ssl_context=None, strict=None, timeout=None):
self._setup(self._connection_class(host, port, ssl_context, strict, timeout))
-
diff --git a/koji/ssl/SSLConnection.py b/koji/ssl/SSLConnection.py
index 1bb9e76..5a45095 100644
--- a/koji/ssl/SSLConnection.py
+++ b/koji/ssl/SSLConnection.py
@@ -156,4 +156,3 @@ class PlgFileObject(socket._fileobject):
self._sock.close()
finally:
self._sock = None
-
diff --git a/koji/ssl/XMLRPCServerProxy.py b/koji/ssl/XMLRPCServerProxy.py
index 40b174d..16de619 100644
--- a/koji/ssl/XMLRPCServerProxy.py
+++ b/koji/ssl/XMLRPCServerProxy.py
@@ -176,4 +176,3 @@ if __name__ == '__main__':
except KeyboardInterrupt:
os._exit(0)
print "All done. (%d timed out)" % tm.get()
-
diff --git a/koji/tasks.py b/koji/tasks.py
index 46a7099..0d9a003 100644
--- a/koji/tasks.py
+++ b/koji/tasks.py
@@ -4,7 +4,7 @@
#
# Koji is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation;
+# License as published by the Free Software Foundation;
# version 2.1 of the License.
#
# This software is distributed in the hope that it will be useful,
diff --git a/koji/util.py b/koji/util.py
index e7c95a7..80e511f 100644
--- a/koji/util.py
+++ b/koji/util.py
@@ -2,7 +2,7 @@
#
# Koji is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation;
+# License as published by the Free Software Foundation;
# version 2.1 of the License.
#
# This software is distributed in the hope that it will be useful,
diff --git a/plugins/messagebus.py b/plugins/messagebus.py
index a23bc94..4ebf806 100644
--- a/plugins/messagebus.py
+++ b/plugins/messagebus.py
@@ -22,19 +22,19 @@ session = None
target = None
def connect_timeout(host, port, timeout):
- for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM):
- af, socktype, proto, canonname, sa = res
- sock = socket.socket(af, socktype, proto)
- sock.settimeout(timeout)
- try:
- sock.connect(sa)
- break
- except socket.error, msg:
- sock.close()
- else:
- # If we got here then we couldn't connect (yet)
- raise
- return sock
+ for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM):
+ af, socktype, proto, canonname, sa = res
+ sock = socket.socket(af, socktype, proto)
+ sock.settimeout(timeout)
+ try:
+ sock.connect(sa)
+ break
+ except socket.error, msg:
+ sock.close()
+ else:
+ # If we got here then we couldn't connect (yet)
+ raise
+ return sock
class tlstimeout(qpid.messaging.transports.tls):
def __init__(self, conn, host, port):
diff --git a/plugins/runroot.py b/plugins/runroot.py
index 427d483..86b6892 100644
--- a/plugins/runroot.py
+++ b/plugins/runroot.py
@@ -319,5 +319,3 @@ class RunRootTask(tasks.BaseTaskHandler):
os.unlink(fn)
except OSError:
pass
-
-
diff --git a/util/koji-gc b/util/koji-gc
index 871c7f8..2d61aa4 100755
--- a/util/koji-gc
+++ b/util/koji-gc
@@ -957,4 +957,3 @@ if __name__ == "__main__":
pass
if not options.skip_main:
sys.exit(rv)
-
diff --git a/util/koji-shadow b/util/koji-shadow
index cdeef8c..3b62776 100755
--- a/util/koji-shadow
+++ b/util/koji-shadow
@@ -1328,4 +1328,3 @@ if __name__ == "__main__":
except:
pass
sys.exit(rv)
-
diff --git a/util/kojira b/util/kojira
index fe827be..c18f63b 100755
--- a/util/kojira
+++ b/util/kojira
@@ -5,7 +5,7 @@
#
# Koji is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation;
+# License as published by the Free Software Foundation;
# version 2.1 of the License.
#
# This software is distributed in the hope that it will be useful,
@@ -130,7 +130,7 @@ class ManagedRepo(object):
if not tag_info:
tag_info = getTag(self.session, self.tag_id, self.event_id)
if not tag_info:
- self.logger.warn('Could not get info for tag %i, skipping delete of repo %i' %
+ self.logger.warn('Could not get info for tag %i, skipping delete of repo %i' %
(self.tag_id, self.repo_id))
return False
tag_name = tag_info['name']
diff --git a/vm/kojikamid.py b/vm/kojikamid.py
index c142267..15c0570 100755
--- a/vm/kojikamid.py
+++ b/vm/kojikamid.py
@@ -6,7 +6,7 @@
#
# Koji is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation;
+# License as published by the Free Software Foundation;
# version 2.1 of the License.
#
# This software is distributed in the hope that it will be useful,
@@ -276,7 +276,7 @@ class WindowsBuild(object):
continue
tokens = entry.split(':')
filename = tokens[0]
- for var in ('name', 'version', 'release'):
+ for var in ('name', 'version', 'release'):
filename = filename.replace('$' + var, getattr(self, var))
metadata = {}
metadata['platforms'] = tokens[1].split(',')
@@ -589,7 +589,7 @@ def get_mgmt_server():
macaddr, gateway, MANAGER_PORT)
server = xmlrpclib.ServerProxy('http://%s:%s/' %
(gateway, MANAGER_PORT), allow_none=True)
- # we would set a timeout on the socket here, but that is apparently not
+ # we would set a timeout on the socket here, but that is apparently not
# supported by python/cygwin/Windows
task_port = server.getPort(macaddr)
logger.debug('found task-specific port %s', task_port)
diff --git a/www/kojiweb/index.py b/www/kojiweb/index.py
index ff15a5f..4be6131 100644
--- a/www/kojiweb/index.py
+++ b/www/kojiweb/index.py
@@ -286,7 +286,7 @@ def index(environ, packageOrder='package_name', packageStart=None):
if user:
packages = kojiweb.util.paginateResults(server, values, 'listPackages', kw={'userID': user['id'], 'with_dups': True},
start=packageStart, dataName='packages', prefix='package', order=packageOrder, pageSize=10)
-
+
notifs = server.getBuildNotifications(user['id'])
notifs.sort(kojiweb.util.sortByKeyFunc('id'))
# XXX Make this a multicall
@@ -294,21 +294,21 @@ def index(environ, packageOrder='package_name', packageStart=None):
notif['package'] = None
if notif['package_id']:
notif['package'] = server.getPackage(notif['package_id'])
-
+
notif['tag'] = None
if notif['tag_id']:
notif['tag'] = server.getTag(notif['tag_id'])
values['notifs'] = notifs
-
+
values['user'] = user
values['welcomeMessage'] = environ['koji.options']['KojiGreeting']
-
+
return _genHTML(environ, 'index.chtml')
def notificationedit(environ, notificationID):
server = _getServer(environ)
_assertLogin(environ)
-
+
notificationID = int(notificationID)
notification = server.getBuildNotification(notificationID)
if notification == None:
@@ -399,7 +399,7 @@ def notificationcreate(environ):
def notificationdelete(environ, notificationID):
server = _getServer(environ)
_assertLogin(environ)
-
+
notificationID = int(notificationID)
notification = server.getBuildNotification(notificationID)
if not notification:
@@ -491,7 +491,7 @@ def tasks(environ, owner=None, state='active', view='tree', method='all', hostID
if view in ('tree', 'toplevel'):
opts['parent'] = None
-
+
if state == 'active':
opts['state'] = [koji.TASK_STATES['FREE'], koji.TASK_STATES['OPEN'], koji.TASK_STATES['ASSIGNED']]
elif state == 'all':
@@ -531,7 +531,7 @@ def tasks(environ, owner=None, state='active', view='tree', method='all', hostID
tasks = kojiweb.util.paginateMethod(server, values, 'listTasks', kw={'opts': opts},
start=start, dataName='tasks', prefix='task', order=order)
-
+
if view == 'tree':
server.multicall = True
for task in tasks:
@@ -577,7 +577,7 @@ def taskinfo(environ, taskID):
values['parent'] = parent
else:
values['parent'] = None
-
+
descendents = server.getTaskDescendents(task['id'], request=True)
values['descendents'] = descendents
@@ -641,7 +641,7 @@ def taskinfo(environ, taskID):
values['wrapTask'] = wrapTask
elif task['method'] == 'restartVerify':
values['rtask'] = server.getTaskInfo(params[0], request=True)
-
+
if task['state'] in (koji.TASK_STATES['CLOSED'], koji.TASK_STATES['FAILED']):
try:
result = server.getTaskResult(task['id'])
@@ -688,7 +688,7 @@ def taskstatus(environ, taskID):
def resubmittask(environ, taskID):
server = _getServer(environ)
_assertLogin(environ)
-
+
taskID = int(taskID)
newTaskID = server.resubmitTask(taskID)
_redirect(environ, 'taskinfo?taskID=%i' % newTaskID)
@@ -817,13 +817,13 @@ def packages(environ, tagID=None, userID=None, order='package_name', start=None,
values['prefix'] = prefix
inherited = int(inherited)
values['inherited'] = inherited
-
+
packages = kojiweb.util.paginateResults(server, values, 'listPackages',
kw={'tagID': tagID, 'userID': userID, 'prefix': prefix, 'inherited': bool(inherited)},
start=start, dataName='packages', prefix='package', order=order)
-
+
values['chars'] = _PREFIX_CHARS
-
+
return _genHTML(environ, 'packages.chtml')
def packageinfo(environ, packageID, tagOrder='name', tagStart=None, buildOrder='-completion_time', buildStart=None):
@@ -840,7 +840,7 @@ def packageinfo(environ, packageID, tagOrder='name', tagStart=None, buildOrder='
values['package'] = package
values['packageID'] = package['id']
-
+
tags = kojiweb.util.paginateMethod(server, values, 'listTags', kw={'package': package['id']},
start=tagStart, dataName='tags', prefix='tag', order=tagOrder)
builds = kojiweb.util.paginateMethod(server, values, 'listBuilds', kw={'packageID': package['id']},
@@ -966,7 +966,7 @@ def tagedit(environ, tagID):
params['maven_include_all'] = bool(form.has_key('maven_include_all'))
server.editTag2(tag['id'], **params)
-
+
_redirect(environ, 'taginfo?tagID=%i' % tag['id'])
elif form.has_key('cancel'):
_redirect(environ, 'taginfo?tagID=%i' % tag['id'])
@@ -1016,7 +1016,7 @@ def tagparent(environ, tagID, parentID, action):
data = server.getInheritanceData(tag['id'])
data.append(newDatum)
-
+
server.setInheritanceData(tag['id'], data)
elif form.has_key('cancel'):
pass
@@ -1039,7 +1039,7 @@ def tagparent(environ, tagID, parentID, action):
values['inheritanceData'] = inheritanceData[0]
else:
raise koji.GenericError, 'tag %i has tag %i listed as a parent more than once' % (tag['id'], parent['id'])
-
+
return _genHTML(environ, 'tagparent.chtml')
elif action == 'remove':
data = server.getInheritanceData(tag['id'])
@@ -1076,7 +1076,7 @@ def buildinfo(environ, buildID):
server = _getServer(environ)
buildID = int(buildID)
-
+
build = server.getBuild(buildID)
values['title'] = koji.buildLabel(build) + ' | Build Info'
@@ -1170,7 +1170,7 @@ def buildinfo(environ, buildID):
values['imagebuild'] = imagebuild
values['archives'] = archives
values['archivesByExt'] = archivesByExt
-
+
values['noarch_log_dest'] = noarch_log_dest
if environ['koji.currentUser']:
values['perms'] = server.getUserPerms(environ['koji.currentUser']['id'])
@@ -1243,7 +1243,7 @@ def builds(environ, userID=None, tagID=None, packageID=None, state=None, order='
if prefix not in _PREFIX_CHARS:
prefix = None
values['prefix'] = prefix
-
+
values['order'] = order
if type in ('maven', 'win', 'image'):
pass
@@ -1274,7 +1274,7 @@ def builds(environ, userID=None, tagID=None, packageID=None, state=None, order='
'type': type,
'state': state, 'prefix': prefix},
start=start, dataName='builds', prefix='build', order=order)
-
+
values['chars'] = _PREFIX_CHARS
return _genHTML(environ, 'builds.chtml')
@@ -1295,7 +1295,7 @@ def users(environ, order='name', start=None, prefix=None):
start=start, dataName='users', prefix='user', order=order)
values['chars'] = _PREFIX_CHARS
-
+
return _genHTML(environ, 'users.chtml')
def userinfo(environ, userID, packageOrder='package_name', packageStart=None, buildOrder='-completion_time', buildStart=None):
@@ -1314,10 +1314,10 @@ def userinfo(environ, userID, packageOrder='package_name', packageStart=None, bu
packages = kojiweb.util.paginateResults(server, values, 'listPackages', kw={'userID': user['id'], 'with_dups': True},
start=packageStart, dataName='packages', prefix='package', order=packageOrder, pageSize=10)
-
+
builds = kojiweb.util.paginateMethod(server, values, 'listBuilds', kw={'userID': user['id']},
start=buildStart, dataName='builds', prefix='build', order=buildOrder, pageSize=10)
-
+
return _genHTML(environ, 'userinfo.chtml')
def rpminfo(environ, rpmID, fileOrder='name', fileStart=None, buildrootOrder='-id', buildrootStart=None):
@@ -1360,7 +1360,7 @@ def rpminfo(environ, rpmID, fileOrder='name', fileStart=None, buildrootOrder='-i
values['build'] = build
values['builtInRoot'] = builtInRoot
values['buildroots'] = buildroots
-
+
files = kojiweb.util.paginateMethod(server, values, 'listRPMFiles', args=[rpm['id']],
start=fileStart, dataName='files', prefix='file', order=fileOrder)
@@ -1408,7 +1408,7 @@ def fileinfo(environ, filename, rpmID=None, archiveID=None):
values['rpm'] = None
values['archive'] = None
-
+
if rpmID:
rpmID = int(rpmID)
rpm = server.getRPM(rpmID)
@@ -1439,7 +1439,7 @@ def fileinfo(environ, filename, rpmID=None, archiveID=None):
def cancelbuild(environ, buildID):
server = _getServer(environ)
_assertLogin(environ)
-
+
buildID = int(buildID)
build = server.getBuild(buildID)
if build == None:
@@ -1468,7 +1468,7 @@ def hosts(environ, state='enabled', start=None, order='name'):
values['state'] = state
hosts = server.listHosts(**args)
-
+
server.multicall = True
for host in hosts:
server.getLastHostUpdate(host['id'])
@@ -1518,7 +1518,7 @@ def hostinfo(environ, hostID=None, userID=None):
values['perms'] = server.getUserPerms(environ['koji.currentUser']['id'])
else:
values['perms'] = []
-
+
return _genHTML(environ, 'hostinfo.chtml')
def hostedit(environ, hostID):
@@ -1630,7 +1630,7 @@ def buildrootinfo(environ, buildrootID, builtStart=None, builtOrder=None, compon
values['buildroot'] = buildroot
values['task'] = task
-
+
return _genHTML(environ, 'buildrootinfo.chtml')
def rpmlist(environ, type, buildrootID=None, imageID=None, start=None, order='nvr'):
@@ -1714,13 +1714,13 @@ def buildtargets(environ, start=None, order='name'):
targets = kojiweb.util.paginateMethod(server, values, 'getBuildTargets',
start=start, dataName='targets', prefix='target', order=order)
-
+
values['order'] = order
if environ['koji.currentUser']:
values['perms'] = server.getUserPerms(environ['koji.currentUser']['id'])
else:
values['perms'] = []
-
+
return _genHTML(environ, 'buildtargets.chtml')
def buildtargetinfo(environ, targetID=None, name=None):
@@ -1733,7 +1733,7 @@ def buildtargetinfo(environ, targetID=None, name=None):
target = server.getBuildTarget(targetID)
elif name != None:
target = server.getBuildTarget(name)
-
+
if target == None:
raise koji.GenericError, 'invalid build target: %s' % (targetID or name)
@@ -1785,7 +1785,7 @@ def buildtargetedit(environ, targetID):
values = _initValues(environ, 'Edit Build Target', 'buildtargets')
tags = server.listTags()
tags.sort(_sortbyname)
-
+
values['target'] = target
values['tags'] = tags
@@ -1810,7 +1810,7 @@ def buildtargetcreate(environ):
if target == None:
raise koji.GenericError, 'error creating build target "%s"' % name
-
+
_redirect(environ, 'buildtargetinfo?targetID=%i' % target['id'])
elif form.has_key('cancel'):
_redirect(environ, 'buildtargets')
@@ -1860,7 +1860,7 @@ def buildsbyuser(environ, start=None, order='-builds'):
user['builds'] = numBuilds
if numBuilds > maxBuilds:
maxBuilds = numBuilds
-
+
values['order'] = order
graphWidth = 400.0
@@ -1893,14 +1893,14 @@ def rpmsbyhost(environ, start=None, order=None, hostArch=None, rpmArch=None):
host['rpms'] = numRPMs
if numRPMs > maxRPMs:
maxRPMs = numRPMs
-
+
values['hostArch'] = hostArch
hostArchList = server.getAllArches()
hostArchList.sort()
values['hostArchList'] = hostArchList
values['rpmArch'] = rpmArch
values['rpmArchList'] = hostArchList + ['noarch', 'src']
-
+
if order == None:
order = '-rpms'
values['order'] = order
@@ -1947,11 +1947,11 @@ def tasksbyhost(environ, start=None, order='-tasks', hostArch=None):
server = _getServer(environ)
maxTasks = 1
-
+
hostArchFilter = hostArch
if hostArchFilter == 'ix86':
hostArchFilter = ['i386', 'i486', 'i586', 'i686']
-
+
hosts = server.listHosts(arches=hostArchFilter)
server.multicall = True
@@ -1963,12 +1963,12 @@ def tasksbyhost(environ, start=None, order='-tasks', hostArch=None):
host['tasks'] = numTasks
if numTasks > maxTasks:
maxTasks = numTasks
-
+
values['hostArch'] = hostArch
hostArchList = server.getAllArches()
hostArchList.sort()
values['hostArchList'] = hostArchList
-
+
values['order'] = order
graphWidth = 400.0
@@ -1984,7 +1984,7 @@ def tasksbyuser(environ, start=None, order='-tasks'):
server = _getServer(environ)
maxTasks = 1
-
+
users = server.listUsers()
server.multicall = True
@@ -1996,7 +1996,7 @@ def tasksbyuser(environ, start=None, order='-tasks'):
user['tasks'] = numTasks
if numTasks > maxTasks:
maxTasks = numTasks
-
+
values['order'] = order
graphWidth = 400.0
@@ -2025,7 +2025,7 @@ def buildsbystatus(environ, days='7'):
server.listBuilds(completeAfter=dateAfter, state=koji.BUILD_STATES['FAILED'], taskID=-1, queryOpts={'countOnly': True})
server.listBuilds(completeAfter=dateAfter, state=koji.BUILD_STATES['CANCELED'], taskID=-1, queryOpts={'countOnly': True})
[[numSucceeded], [numFailed], [numCanceled]] = server.multiCall()
-
+
values['numSucceeded'] = numSucceeded
values['numFailed'] = numFailed
values['numCanceled'] = numCanceled
@@ -2070,7 +2070,7 @@ def buildsbytarget(environ, days='7', start=None, order='-builds'):
if builds > maxBuilds:
maxBuilds = builds
- kojiweb.util.paginateList(values, targets.values(), start, 'targets', 'target', order)
+ kojiweb.util.paginateList(values, targets.values(), start, 'targets', 'target', order)
values['order'] = order
@@ -2140,7 +2140,7 @@ def recentbuilds(environ, user=None, tag=None, package=None):
task = None
builds[i]['task'] = task
builds[i]['changelog'] = clogs[i][0]
-
+
values['tag'] = tagObj
values['user'] = userObj
values['package'] = packageObj
@@ -2197,7 +2197,7 @@ def search(environ, start=None, order='name'):
raise koji.GenericError, 'unknown search type: %s' % type
values['infoURL'] = infoURL
values['order'] = order
-
+
results = kojiweb.util.paginateMethod(server, values, 'search', args=(terms, type, match),
start=start, dataName='results', prefix='result', order=order)
if not start and len(results) == 1:
diff --git a/www/lib/kojiweb/util.py b/www/lib/kojiweb/util.py
index ae00757..ebb9f49 100644
--- a/www/lib/kojiweb/util.py
+++ b/www/lib/kojiweb/util.py
@@ -225,7 +225,7 @@ def passthrough_except(template, *exclude):
previously used
#attr _PASSTHROUGH = ...
to define the list of variable names to be passed-through.
- Any variables names passed in will be excluded from the
+ Any variables names passed in will be excluded from the
list of variables in the output string.
"""
passvars = []
@@ -245,7 +245,7 @@ def sortByKeyFunc(key, noneGreatest=False):
cmpFunc = lambda a, b: (a is None or b is None) and -(cmp(a, b)) or cmp(a, b)
else:
cmpFunc = cmp
-
+
if key.startswith('-'):
key = key[1:]
sortFunc = lambda a, b: cmpFunc(b[key], a[key])
@@ -265,7 +265,7 @@ def paginateList(values, data, start, dataName, prefix=None, order=None, noneGre
"""
if order != None:
data.sort(sortByKeyFunc(order, noneGreatest))
-
+
totalRows = len(data)
if start:
@@ -277,7 +277,7 @@ def paginateList(values, data, start, dataName, prefix=None, order=None, noneGre
count = len(data)
_populateValues(values, dataName, prefix, data, totalRows, start, count, pageSize, order)
-
+
return data
def paginateMethod(server, values, methodName, args=None, kw=None,
@@ -294,10 +294,10 @@ def paginateMethod(server, values, methodName, args=None, kw=None,
start = 0
if not dataName:
raise StandardError, 'dataName must be specified'
-
+
kw['queryOpts'] = {'countOnly': True}
totalRows = getattr(server, methodName)(*args, **kw)
-
+
kw['queryOpts'] = {'order': order,
'offset': start,
'limit': pageSize}
@@ -402,7 +402,7 @@ def formatDep(name, version, flags):
a human-readable format. Copied from
rpmUtils/miscutils.py:formatRequires()"""
s = name
-
+
if flags:
if flags & (koji.RPMSENSE_LESS | koji.RPMSENSE_GREATER |
koji.RPMSENSE_EQUAL):
@@ -567,4 +567,3 @@ a network issue or load issues on the server."""
else:
str = "An error has occurred while processing your request."
return str, level
-
--
1.9.3
8 years, 11 months
[PATCH 1/2] (koji-web) Add user-specific css classes.
by Ralph Bean
This will allow us in Fedora to style system account names differently. For
instance, we can markup the name 'koschei' (our continuous integration bot).
---
www/kojiweb/buildinfo.chtml | 2 +-
www/kojiweb/builds.chtml | 2 +-
www/kojiweb/index.chtml | 4 ++--
www/kojiweb/packageinfo.chtml | 2 +-
www/kojiweb/packages.chtml | 2 +-
www/kojiweb/tasks.chtml | 2 +-
6 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/www/kojiweb/buildinfo.chtml b/www/kojiweb/buildinfo.chtml
index 65fc3ba..07c62fd 100644
--- a/www/kojiweb/buildinfo.chtml
+++ b/www/kojiweb/buildinfo.chtml
@@ -45,7 +45,7 @@
</tr>
#end if
<tr>
- <th>Built by</th><td><a href="userinfo?userID=$build.owner_id">$build.owner_name</a></td>
+ <th>Built by</th><td class="user-$build.owner_name"><a href="userinfo?userID=$build.owner_id">$build.owner_name</a></td>
</tr>
<tr>
#set $stateName = $util.stateName($build.state)
diff --git a/www/kojiweb/builds.chtml b/www/kojiweb/builds.chtml
index f221ffa..337c466 100644
--- a/www/kojiweb/builds.chtml
+++ b/www/kojiweb/builds.chtml
@@ -134,7 +134,7 @@
#if $tag
<td><a href="taginfo?tagID=$build.tag_id">$build.tag_name</a></td>
#end if
- <td><a href="userinfo?userID=$build.owner_id">$build.owner_name</a></td>
+ <td class="user-$build.owner_name"><a href="userinfo?userID=$build.owner_id">$build.owner_name</a></td>
<td>$util.formatTime($build.completion_time)</td>
#set $stateName = $util.stateName($build.state)
<td class="$stateName">$util.stateImage($build.state)</td>
diff --git a/www/kojiweb/index.chtml b/www/kojiweb/index.chtml
index f631217..7613fe6 100644
--- a/www/kojiweb/index.chtml
+++ b/www/kojiweb/index.chtml
@@ -22,7 +22,7 @@
<td>$build.build_id</td>
<td><a href="buildinfo?buildID=$build.build_id">$build.nvr</a></td>
#if not $user
- <td><a href="userinfo?userID=$build.owner_id">$build.owner_name</a></td>
+ <td class="user-$build.owner_name"><a href="userinfo?userID=$build.owner_id">$build.owner_name</a></td>
#end if
<td>$util.formatTime($build.completion_time)</td>
<td class="$stateName">$util.stateImage($build.state)</td>
@@ -55,7 +55,7 @@
<td>$task.id</td>
<td><a href="taskinfo?taskID=$task.id" class="task$state" title="$state">$koji.taskLabel($task)</a></td>
#if not $user
- <td>
+ <td class="user-$task.owner_name">
#if $task.owner_type == $koji.USERTYPES['HOST']
<a href="hostinfo?userID=$task.owner">$task.owner_name</a>
#else
diff --git a/www/kojiweb/packageinfo.chtml b/www/kojiweb/packageinfo.chtml
index e0fcb71..313bc88 100644
--- a/www/kojiweb/packageinfo.chtml
+++ b/www/kojiweb/packageinfo.chtml
@@ -47,7 +47,7 @@
#for $build in $builds
<tr class="$util.rowToggle($self)">
<td><a href="buildinfo?buildID=$build.build_id">$build.nvr</a></td>
- <td><a href="userinfo?userID=$build.owner_id">$build.owner_name</a></td>
+ <td class="user-$build.owner_name"><a href="userinfo?userID=$build.owner_id">$build.owner_name</a></td>
<td>$util.formatTime($build.completion_time)</td>
#set $stateName = $util.stateName($build.state)
<td class="$stateName">$util.stateImage($build.state)</td>
diff --git a/www/kojiweb/packages.chtml b/www/kojiweb/packages.chtml
index 6de2cf8..08cae84 100644
--- a/www/kojiweb/packages.chtml
+++ b/www/kojiweb/packages.chtml
@@ -78,7 +78,7 @@
<td><a href="packageinfo?packageID=$package.package_id">$package.package_name</a></td>
#if $tag or $user
<td><a href="taginfo?tagID=$package.tag_id">$package.tag_name</a></td>
- <td><a href="userinfo?userID=$package.owner_id">$package.owner_name</a></td>
+ <td class="user-$package.owner_name"><a href="userinfo?userID=$package.owner_id">$package.owner_name</a></td>
<td class="$str(not $package.blocked).lower()">#if $package.blocked then $util.imageTag('no') else $util.imageTag('yes')#</td>
#end if
</tr>
diff --git a/www/kojiweb/tasks.chtml b/www/kojiweb/tasks.chtml
index 897bfcc..4c1a32f 100644
--- a/www/kojiweb/tasks.chtml
+++ b/www/kojiweb/tasks.chtml
@@ -145,7 +145,7 @@ All
$printChildren($task.id, $task.descendents)
#end if
</td>
- <td>
+ <td class="user-$task.owner_name">
#if $task.owner_type == $koji.USERTYPES['HOST']
<a href="hostinfo?userID=$task.owner">$task.owner_name</a>
#else
--
2.1.0
8 years, 11 months
[PATCH] mergeScratch(): import rpms from a scratch build into an existing build
by Mike Bonnet
Hi. The attached patch implements a mergeScratch() method. This
enables importing the rpms built by a scratch build and associating them
with an existing build, if that build was built from the same SCM URL
and has the same NVR.
The use-case for the method is arch enablement. The general approach
would be:
- setup a new build tag that builds only for the new arch
- this would use either imported rpms or an external repo of rpms
that had been built/bootstrapped manually
- run a scratch build in the new build tag, from the same SCM URL as
an existing build
- call mergeScratch(scratch_task_id)
- rpms built for the new arch are added to the existing build
This allows arch coverage to be added incrementally to existing builds
in a non-disruptive way. When all builds in the -build tag have rpms
for the new arch, the arch can be enabled in the main tags and all new
builds will generate rpms for the new arch. This simplifies the
bootstrap process for a new arch, and avoids mass-rebuilds that would
result in no change in the existing arch rpms.
This could be accomplished with the existing rpm import functionality,
but mergeScratch() retains the build logs and the buildroot metadata
(associated with the scratch build task) so merged rpms have better
tracking and auditability.
Questions and comments welcome.
Thanks,
Mike
8 years, 12 months
[PATCH] add id and parent to the headers of Koji TaskStateChange messages
by Mike Bonnet
This should make it easier to track the state of a specific task and any
child tasks it creates. While this may be considered a change to the
public API, it is an additive change and I can't imagine any current
use-cases it would affect.
Questions/comments welcome.
Thanks,
Mike
8 years, 12 months
[PATCH] Save a reference to the config.
by Ralph Bean
This fixes the AttributeError we hit in today's rawhide:
https://kojipkgs.fedoraproject.org/mash/rawhide-20150430/logs/mash.log
The error looks like:
```
Traceback (most recent call last):
File "/usr/bin/mash", line 105, in <module>
main()
File "/usr/bin/mash", line 91, in main
rc = themash.doMultilib()
File "/usr/lib/python2.7/site-packages/mash/__init__.py", line 610, in doMultilib
pid = self.doDepSolveAndMultilib(arch, repocache)
File "/usr/lib/python2.7/site-packages/mash/__init__.py", line 561, in doDepSolveAndMultilib
elif do_multi and method.select(pkg):
File "/usr/lib/python2.7/site-packages/mash/multilib.py", line 189, in select
if po.name in self.config.multilib_devel_blacklist:
AttributeError: DevelMultilibMethod instance has no attribute 'config'
```
Signed-off-by: Ralph Bean <rbean(a)redhat.com>
---
mash/multilib.py | 2 ++
1 file changed, 2 insertions(+)
diff --git a/mash/multilib.py b/mash/multilib.py
index 9dedc0c..e18b87b 100644
--- a/mash/multilib.py
+++ b/mash/multilib.py
@@ -86,6 +86,7 @@ class YabootMultilibMethod:
class RuntimeMultilibMethod(MultilibMethod):
def __init__(self, config):
self.name = 'runtime'
+ self.config = config
def select(self, po):
libdirs = [ '/usr/lib', '/usr/lib64', '/lib', '/lib64' ]
@@ -184,6 +185,7 @@ class RuntimeMultilibMethod(MultilibMethod):
class DevelMultilibMethod(RuntimeMultilibMethod):
def __init__(self, config):
self.name = 'devel'
+ self.config = config
def select(self, po):
if po.name in self.config.multilib_devel_blacklist:
--
2.1.0
9 years
how to setup the koji build system?
by gssxd@qq.com
hi,
I followed the wiki page:
https://fedoraproject.org/wiki/Koji/ServerHowTo
also, the page that Sérgio M. B. pointed out
http://www.devops-blog.net/koji/koji-rpm-build-system-installation-part-1
but, so far I still can't get it installed.
The failure I am seeing as following:
[root@www koji]# su kojiadmin
[kojiadmin@www koji]$ koji call getLoggedInUser
Error: [('asn1 encoding routines', 'ASN1_item_verify', 'unknown message digest algorithm'), ('SSL routines', 'SSL3_GET_SERVER_CERTIFICATE', 'certificate verify failed')]
[kojiadmin@www koji]$
Could you please give any idea? how to fix it?
Thanks
Suney
From: buildsys-request
Date: 2015-04-24 20:00
To: buildsys
Subject: buildsys Digest, Vol 122, Issue 18
Send buildsys mailing list submissions to
buildsys(a)lists.fedoraproject.org
To subscribe or unsubscribe via the World Wide Web, visit
https://admin.fedoraproject.org/mailman/listinfo/buildsys
or, via email, send a message with subject or body 'help' to
buildsys-request(a)lists.fedoraproject.org
You can reach the person managing the list at
buildsys-owner(a)lists.fedoraproject.org
When replying, please edit your Subject line so it is more specific
than "Re: Contents of buildsys digest..."
Today's Topics:
1. Re: how to setup the koji build system? (Didier Fabert)
2. Re: how to setup the koji build system? (Sérgio Basto)
----------------------------------------------------------------------
Message: 1
Date: Thu, 23 Apr 2015 15:42:01 +0200
From: Didier Fabert <didier.fabert(a)gmail.com>
To: Discussion of Fedora build system
<buildsys(a)lists.fedoraproject.org>
Subject: Re: how to setup the koji build system?
Message-ID: <2589606.sBjckj0VDC(a)didier.b2pweb.com>
Content-Type: text/plain; charset="us-ascii"
Hi,
Do you talking about this wiki page:
https://fedoraproject.org/wiki/Koji/ServerHowTo ?
I recently upgrade my personnal koji from el6 to el7 and all rock's without
any problem (excepting sigul but it's a another story).
What are your failures exactly ? During install, bootstrap or first use ?
On Thursday 23 April 2015 09:39:38 gssxd(a)qq.com wrote:
> Hello,
> I want to build my own linux based on the koji build system . However the
> koji wiki page seems to be a little bit out-of date. I followed the
> instructions to go through all of the steps, but it alway show me some
> failures.
> I am using the koji-1.9.0, and I saw the wiki page was refering
> to the version 1.3.1. Is there anybody has any suggestion about the setup
> information? or anyone can provide me the latest document about how to
> build the koji system?
> Thanks very much.
>
> Thanks
> Suney
------------------------------
Message: 2
Date: Thu, 23 Apr 2015 15:40:52 +0100
From: Sérgio Basto <sergio(a)serjux.com>
To: buildsys(a)lists.fedoraproject.org
Subject: Re: how to setup the koji build system?
Message-ID: <1429800052.29728.14.camel(a)serjux.com>
Content-Type: text/plain; charset="ISO-8859-15"
On Qui, 2015-04-23 at 09:39 +0800, gssxd(a)qq.com wrote:
> Hello,
> I want to build my own linux based on the koji build system . However
> the koji wiki page seems to be a little bit out-of date. I followed
> the instructions to go through all of the steps, but it alway show me
> some failures.
> I am using the koji-1.9.0, and I saw the wiki page was refering to the
> version 1.3.1.
> Is there anybody has any suggestion about the setup information? or
> anyone can provide me the latest document about how to build the koji
> system?
I follow this page:
http://www.devops-blog.net/koji/koji-rpm-build-system-installation-part-1
also a little bit out-of date, but on comments we have good tips, to
solve the not updated things .
Best regards,
--
Sérgio M. B.
------------------------------
--
buildsys mailing list
buildsys(a)lists.fedoraproject.org
https://admin.fedoraproject.org/mailman/listinfo/buildsys
End of buildsys Digest, Vol 122, Issue 18
*****************************************
9 years