PR#685: Rest of automated conversion from py3 changes

Merges #685
https://pagure.io/koji/pull-request/685
This commit is contained in:
Mike McLean 2018-07-11 17:37:45 -04:00
commit 147f781183
113 changed files with 505 additions and 337 deletions

View file

@ -21,6 +21,9 @@
# Mike McLean <mikem@redhat.com>
# Mike Bonnet <mikeb@redhat.com>
from __future__ import absolute_import
from __future__ import division
import six
try:
import krbV
except ImportError: # pragma: no cover
@ -36,7 +39,7 @@ import logging
import logging.handlers
from koji.daemon import incremental_upload, log_output, TaskManager, SCM
from koji.tasks import ServerExit, ServerRestart, BaseTaskHandler, MultiPlatformTask
from koji.util import parseStatus, isSuccess, dslice, dslice_ex
from koji.util import parseStatus, isSuccess, dslice, dslice_ex, to_list
import multilib.multilib as multilib
import os
import pwd
@ -53,11 +56,11 @@ import sys
import time
import traceback
import xml.dom.minidom
import xmlrpclib
import six.moves.xmlrpc_client
import zipfile
import copy
import Cheetah.Template
from ConfigParser import ConfigParser
from six.moves.configparser import ConfigParser
from fnmatch import fnmatch
from gzip import GzipFile
from optparse import OptionParser, SUPPRESS_HELP
@ -257,7 +260,7 @@ class BuildRoot(object):
output = koji.genMockConfig(self.name, self.br_arch, managed=True, **opts)
#write config
fo = file(configfile,'w')
fo = open(configfile,'w')
fo.write(output)
fo.close()
@ -270,7 +273,7 @@ class BuildRoot(object):
id_suffix = 'repo'
name_prefix = 'Repository for Koji'
for dep in self.deps:
if isinstance(dep, (int, long)):
if isinstance(dep, six.integer_types):
# dep is a task ID, the url points to the task output directory
repo_type = 'task'
dep_url = pi.task(dep)
@ -357,7 +360,7 @@ class BuildRoot(object):
</settings>
"""
settings = settings % locals()
fo = file(self.rootdir() + destfile, 'w')
fo = open(self.rootdir() + destfile, 'w')
fo.write(settings)
fo.close()
@ -1054,7 +1057,7 @@ class BuildTask(BaseTaskHandler):
archdict[a] = 1
if not archdict:
raise koji.BuildError("No matching arches were found")
return archdict.keys()
return to_list(archdict.keys())
def choose_taskarch(self, arch, srpm, build_tag):
@ -1115,7 +1118,7 @@ class BuildTask(BaseTaskHandler):
self.logger.debug("Waiting on subtasks...")
# wait for subtasks to finish
results = self.wait(subtasks.values(), all=True, failany=failany)
results = self.wait(to_list(subtasks.values()), all=True, failany=failany)
# finalize import
# merge data into needed args for completeBuild call
@ -1123,7 +1126,7 @@ class BuildTask(BaseTaskHandler):
brmap = {}
logs = {}
built_srpm = None
for (arch, task_id) in subtasks.iteritems():
for (arch, task_id) in six.iteritems(subtasks):
result = results[task_id]
self.logger.debug("DEBUG: %r : %r " % (arch,result,))
brootid = result['brootid']
@ -1203,7 +1206,7 @@ class BuildArchTask(BaseBuildTask):
self.logger.warn("Negative average build duration for %s: %s", name, avg)
return
# increase the task weight by 0.75 for every hour of build duration
adj = (avg / 4800.0)
adj = avg / 4800.0
# cap the adjustment at +4.5
weight = self.weight() + min(4.5, adj)
self.session.host.setTaskWeight(self.id, weight)
@ -1631,7 +1634,7 @@ class BuildMavenTask(BaseBuildTask):
for filepath in logs:
self.uploadFile(os.path.join(outputdir, filepath),
relPath=os.path.dirname(filepath))
for relpath, files in output_files.iteritems():
for relpath, files in six.iteritems(output_files):
for filename in files:
self.uploadFile(os.path.join(outputdir, relpath, filename),
relPath=relpath)
@ -1867,7 +1870,7 @@ class WrapperRPMTask(BaseBuildTask):
contents = contents.encode('utf-8')
specfile = spec_template[:-5]
specfd = file(specfile, 'w')
specfd = open(specfile, 'w')
specfd.write(contents)
specfd.close()
@ -2078,7 +2081,7 @@ class ChainMavenTask(MultiPlatformTask):
pkg_to_wrap = params['buildrequires'][0]
to_wrap = self.done[pkg_to_wrap]
if isinstance(to_wrap, (int, long)):
if isinstance(to_wrap, six.integer_types):
task_to_wrap = self.session.getTaskInfo(to_wrap, request=True)
build_to_wrap = None
else:
@ -2097,8 +2100,8 @@ class ChainMavenTask(MultiPlatformTask):
running[task_id] = package
del todo[package]
try:
results = self.wait(running.keys())
except (xmlrpclib.Fault, koji.GenericError) as e:
results = self.wait(to_list(running.keys()))
except (six.moves.xmlrpc_client.Fault, koji.GenericError) as e:
# One task has failed, wait for the rest to complete before the
# chainmaven task fails. self.wait(all=True) should thrown an exception.
self.wait(all=True)
@ -2150,8 +2153,8 @@ class ChainMavenTask(MultiPlatformTask):
have the same keys and those keys have the same values. If a value is
list, it will be considered equal to a list with the same values in
a different order."""
akeys = a.keys()
bkeys = b.keys()
akeys = to_list(a.keys())
bkeys = to_list(b.keys())
if sorted(akeys) != sorted(bkeys):
return False
for key in akeys:
@ -2312,7 +2315,7 @@ class BuildBaseImageTask(BuildImageTask):
canfail.append(subtasks[arch])
self.logger.debug("Got image subtasks: %r" % (subtasks))
self.logger.debug("Waiting on image subtasks (%s can fail)..." % canfail)
results = self.wait(subtasks.values(), all=True, failany=True, canfail=canfail)
results = self.wait(to_list(subtasks.values()), all=True, failany=True, canfail=canfail)
# if everything failed, fail even if all subtasks are in canfail
self.logger.debug('subtask results: %r', results)
@ -2621,7 +2624,7 @@ class BuildLiveMediaTask(BuildImageTask):
self.logger.debug("Got image subtasks: %r", subtasks)
self.logger.debug("Waiting on livemedia subtasks...")
results = self.wait(subtasks.values(), all=True, failany=True, canfail=canfail)
results = self.wait(to_list(subtasks.values()), all=True, failany=True, canfail=canfail)
# if everything failed, fail even if all subtasks are in canfail
self.logger.debug('subtask results: %r', results)
@ -2657,7 +2660,7 @@ class BuildLiveMediaTask(BuildImageTask):
wrapper_tasks[arch] = self.subtask('wrapperRPM', arglist,
label='wrapper %s' % arch, arch='noarch')
results2 = self.wait(wrapper_tasks.values(), all=True, failany=True)
results2 = self.wait(to_list(wrapper_tasks.values()), all=True, failany=True)
self.logger.debug('wrapper results: %r', results2)
# add wrapper rpm results into main results
@ -2835,7 +2838,7 @@ class ImageTask(BaseTaskHandler):
self.ks.handler.repo.repoList = [] # delete whatever the ks file told us
if opts.get('repo'):
user_repos = opts['repo']
if isinstance(user_repos, basestring):
if isinstance(user_repos, six.string_types):
user_repos = user_repos.split(',')
index = 0
for user_repo in user_repos:
@ -2919,7 +2922,7 @@ class ImageTask(BaseTaskHandler):
}
# Duplicated with pungi/util.py _apply_substitutions
for k, v in sorted(substitutions.items(), key=lambda x: len(x[0]), reverse=True):
for k, v in sorted(to_list(substitutions.items()), key=lambda x: len(x[0]), reverse=True):
if k in name:
name = name.replace(k, v)
if k in version:
@ -4955,7 +4958,7 @@ Build Info: %(weburl)s/buildinfo?buildID=%(build_id)i\r
def uniq(self, items):
"""Remove duplicates from the list of items, and sort the list."""
m = dict(zip(items, [1] * len(items)))
l = m.keys()
l = to_list(m.keys())
l.sort()
return l
@ -5000,8 +5003,8 @@ class NewRepoTask(BaseTaskHandler):
# gather subtask results
data = {}
if subtasks:
results = self.wait(subtasks.values(), all=True, failany=True)
for (arch, task_id) in subtasks.iteritems():
results = self.wait(to_list(subtasks.values()), all=True, failany=True)
for (arch, task_id) in six.iteritems(subtasks):
data[arch] = results[task_id]
self.logger.debug("DEBUG: %r : %r " % (arch,data[arch],))
@ -5042,7 +5045,7 @@ class CreaterepoTask(BaseTaskHandler):
if external_repos:
self.merge_repos(external_repos, arch, groupdata)
elif pkglist is None:
fo = file(os.path.join(self.datadir, "EMPTY_REPO"), 'w')
fo = open(os.path.join(self.datadir, "EMPTY_REPO"), 'w')
fo.write("This repo is empty because its tag has no content for this arch\n")
fo.close()
@ -5154,7 +5157,7 @@ class NewDistRepoTask(BaseTaskHandler):
method='createdistrepo', arglist=arglist, label=arch,
parent=self.id, arch='noarch')
if len(subtasks) > 0 and task_opts['multilib']:
self.wait(subtasks.values(), all=True, failany=True)
self.wait(to_list(subtasks.values()), all=True, failany=True)
for arch in arch32s:
# move the 32-bit task output to the final resting place
# so the 64-bit arches can use it for multilib
@ -5168,8 +5171,8 @@ class NewDistRepoTask(BaseTaskHandler):
method='createdistrepo', arglist=arglist, label=arch,
parent=self.id, arch='noarch')
# wait for 64-bit subtasks to finish
self.wait(subtasks.values(), all=True, failany=True)
for (arch, task_id) in subtasks.iteritems():
self.wait(to_list(subtasks.values()), all=True, failany=True)
for (arch, task_id) in six.iteritems(subtasks):
if task_opts['multilib'] and arch in arch32s:
# already moved above
continue
@ -5505,7 +5508,7 @@ enabled=1
# select our rpms
selected = {}
for rpm_id in rpm_idx:
avail_keys = rpm_idx[rpm_id].keys()
avail_keys = to_list(rpm_idx[rpm_id].keys())
best_key = self.pick_key(keys, avail_keys)
if best_key is None:
# we lack a matching key for this rpm
@ -5569,7 +5572,7 @@ enabled=1
fmt = '%(name)s-%(version)s-%(release)s.%(arch)s'
filenames = [[fmt % selected[r], r] for r in sig_missing]
for fname, rpm_id in sorted(filenames):
avail = rpm_idx.get(rpm_id, {}).keys()
avail = to_list(rpm_idx.get(rpm_id, {}).keys())
outfile.write('%s: %r\n' % (fname, avail))
outfile.close()
self.session.uploadWrapper(missing_log, self.uploadpath)
@ -5620,7 +5623,7 @@ enabled=1
def write_kojipkgs(self):
filename = os.path.join(self.repodir, 'kojipkgs')
datafile = file(filename, 'w')
datafile = open(filename, 'w')
try:
json.dump(self.kojipkgs, datafile, indent=4, sort_keys=True)
finally:
@ -5656,9 +5659,9 @@ class WaitrepoTask(BaseTaskHandler):
if not targets:
raise koji.GenericError("No build target for tag: %s" % taginfo['name'])
if isinstance(newer_than, basestring) and newer_than.lower() == "now":
if isinstance(newer_than, six.string_types) and newer_than.lower() == "now":
newer_than = start
if not isinstance(newer_than, (type(None), int, long, float)):
if not isinstance(newer_than, to_list(six.integer_types) + [type(None), float]):
raise koji.GenericError("Invalid value for newer_than: %s" % newer_than)
if newer_than and nvrs:
@ -5823,7 +5826,7 @@ def get_options():
defaults[name] = config.getboolean('kojid', name)
elif name in ['plugin', 'plugins']:
defaults['plugin'] = value.split()
elif name in defaults.keys():
elif name in to_list(defaults.keys()):
defaults[name] = value
elif name.upper().startswith('RLIMIT_'):
defaults[name.upper()] = value
@ -5913,7 +5916,7 @@ if __name__ == "__main__":
options.serverca)
except koji.AuthError as e:
quit("Error: Unable to log in: %s" % e)
except xmlrpclib.ProtocolError:
except six.moves.xmlrpc_client.ProtocolError:
quit("Error: Unable to connect to server %s" % (options.server))
elif options.user:
try:
@ -5921,7 +5924,7 @@ if __name__ == "__main__":
session.login()
except koji.AuthError:
quit("Error: Unable to log in. Bad credentials?")
except xmlrpclib.ProtocolError:
except six.moves.xmlrpc_client.ProtocolError:
quit("Error: Unable to connect to server %s" % (options.server))
elif krbV:
krb_principal = options.krb_principal
@ -5947,7 +5950,7 @@ if __name__ == "__main__":
#make sure it works
try:
ret = session.echo("OK")
except xmlrpclib.ProtocolError:
except six.moves.xmlrpc_client.ProtocolError:
quit("Error: Unable to connect to server %s" % (options.server))
if ret != ["OK"]:
quit("Error: incorrect server response: %r" % (ret))

View file

@ -21,6 +21,7 @@
# Largely borrowed from the mergerepo script included in createrepo and
# written by Seth Vidal
from __future__ import absolute_import
import createrepo
import os.path
import rpmUtils.miscutils
@ -238,7 +239,7 @@ class RepoMerge(object):
include_srpms[srpm_name] = (pkg.sourcerpm, pkg.repoid)
pkgorigins = os.path.join(self.yumbase.conf.cachedir, 'pkgorigins')
origins = file(pkgorigins, 'w')
origins = open(pkgorigins, 'w')
seen_rpms = {}
for repo in repos:
@ -283,7 +284,7 @@ def main(args):
opts = parse_args(args)
if opts.blocked:
blocked_fo = file(opts.blocked)
blocked_fo = open(opts.blocked)
blocked_list = blocked_fo.readlines()
blocked_fo.close()
blocked = dict([(b.strip(), 1) for b in blocked_list])

View file

@ -23,6 +23,7 @@ import six.moves.xmlrpc_client
from six.moves import filter
from six.moves import map
from six.moves import zip
from six.moves import range
try:
import libcomps
@ -34,7 +35,7 @@ except ImportError: # pragma: no cover
yumcomps = None
import koji
from koji.util import md5_constructor
from koji.util import md5_constructor, to_list
from koji_cli.lib import _, OptionParser, activate_session, parse_arches, \
_unique_path, _running_in_bg, _progress_callback, watch_tasks, \
arg_filter, linked_upload, list_task_output_all_volumes, \
@ -653,9 +654,9 @@ def handle_maven_build(options, session, args):
section=build_opts.section)
except ValueError as e:
parser.error(e.args[0])
opts = list(params.values())[0]
opts = to_list(params.values())[0]
if opts.pop('type', 'maven') != 'maven':
parser.error(_("Section %s does not contain a maven-build config") % list(params.keys())[0])
parser.error(_("Section %s does not contain a maven-build config") % to_list(params.keys())[0])
source = opts.pop('scmurl')
else:
source = args[1]
@ -714,9 +715,9 @@ def handle_wrapper_rpm(options, session, args):
section=build_opts.section)
except ValueError as e:
parser.error(e.args[0])
opts = list(params.values())[0]
opts = to_list(params.values())[0]
if opts.get('type') != 'wrapper':
parser.error(_("Section %s does not contain a wrapper-rpm config") % list(params.keys())[0])
parser.error(_("Section %s does not contain a wrapper-rpm config") % to_list(params.keys())[0])
url = opts['scmurl']
package = opts['buildrequires'][0]
target_info = session.getBuildTarget(target, strict=True)
@ -1145,7 +1146,7 @@ def handle_import(goptions, session, args):
nvr = "%(name)s-%(version)s-%(release)s" % koji.parse_NVRA(data['sourcerpm'])
to_import.setdefault(nvr,[]).append((path,data))
builds_missing = False
nvrs = list(to_import.keys())
nvrs = to_list(to_import.keys())
nvrs.sort()
for nvr in nvrs:
to_import[nvr].sort()
@ -1373,7 +1374,7 @@ def _import_comps(session, filename, tag, options):
for k in pkgopts.keys():
if six.PY2 and isinstance(pkgopts[k], unicode):
pkgopts[k] = str(pkgopts[k])
s_opts = ', '.join(["'%s': %r" % (k, pkgopts[k]) for k in sorted(list(pkgopts.keys()))])
s_opts = ', '.join(["'%s': %r" % (k, pkgopts[k]) for k in sorted(pkgopts.keys())])
print(" Package: %s: {%s}" % (pkg.name, s_opts))
session.groupPackageListAdd(tag, group.id, pkg.name, force=force, **pkgopts)
# libcomps does not support group dependencies
@ -1406,7 +1407,7 @@ def _import_comps_alt(session, filename, tag, options): # no cover 3.x
for k in pkgopts.keys():
if six.PY2 and isinstance(pkgopts[k], unicode):
pkgopts[k] = str(pkgopts[k])
s_opts = ', '.join(["'%s': %r" % (k, pkgopts[k]) for k in sorted(list(pkgopts.keys()))])
s_opts = ', '.join(["'%s': %r" % (k, pkgopts[k]) for k in sorted(pkgopts.keys())])
print(" Package: %s: {%s}" % (pkg, s_opts))
session.groupPackageListAdd(tag, group.groupid, pkg, force=force, **pkgopts)
#yum.comps does not support group dependencies
@ -1616,7 +1617,7 @@ def handle_prune_signed_copies(options, session, args):
#that the build was recently untagged from
tags.setdefault(entry['tag_name'], 1)
if options.debug:
print("Tags: %s" % list(tags.keys()))
print("Tags: %s" % to_list(tags.keys()))
for tag_name in tags:
if tag_name == options.trashcan_tag:
if options.debug:
@ -1833,7 +1834,7 @@ def handle_prune_signed_copies(options, session, args):
except OSError as e:
print("Error removing %s: %s" % (signedpath, e))
if len(sigdirs) == 1:
dir = list(sigdirs.keys())[0]
dir = to_list(sigdirs.keys())[0]
if options.test:
print("Would have removed dir: %s" % dir)
else:
@ -4133,7 +4134,7 @@ def _print_histline(entry, **kwargs):
else:
return '%s.name' % key
if edit:
keys = list(x.keys())
keys = to_list(x.keys())
keys.sort()
y = other[-1]
for key in keys:
@ -4148,7 +4149,7 @@ def _print_histline(entry, **kwargs):
continue
print(" %s: %s -> %s" % (key, x[key], y[key]))
elif create and options.verbose and table != 'tag_listing':
keys = list(x.keys())
keys = to_list(x.keys())
keys.sort()
# the table keys have already been represented in the base format string
also_hidden = list(_table_keys[table])
@ -4635,9 +4636,7 @@ def anon_handle_taginfo(goptions, session, args):
print("Include all Maven archives?: %s" % (info['maven_include_all'] and 'yes' or 'no'))
if 'extra' in info:
print("Tag options:")
keys = list(info['extra'].keys())
keys.sort()
for key in keys:
for key in sorted(info['extra'].keys()):
print(" %s : %s" % (key, pprint.pformat(info['extra'][key])))
dest_targets = session.getBuildTargets(destTagID=info['id'], **event_opts)
build_targets = session.getBuildTargets(buildTagID=info['id'], **event_opts)
@ -6829,8 +6828,7 @@ def anon_handle_wait_repo(options, session, args):
targets = session.getBuildTargets(destTagID=tag_info['id'])
if targets:
maybe = {}.fromkeys([t['build_tag_name'] for t in targets])
maybe = list(maybe.keys())
maybe.sort()
maybe = sorted(maybe.keys())
print("Suggested tags: %s" % ', '.join(maybe))
return 1
tag_id = tag_info['id']

View file

@ -19,6 +19,7 @@ except ImportError: # pragma: no cover
krbV = None
import koji
from koji.util import to_list
# fix OptionParser for python 2.3 (optparse verion 1.4.1+)
# code taken from optparse version 1.5a2
@ -94,7 +95,7 @@ categories = {
def get_epilog_str(progname=None):
if progname is None:
progname = os.path.basename(sys.argv[0]) or 'koji'
categories_ordered=', '.join(sorted(['all'] + list(categories.keys())))
categories_ordered=', '.join(sorted(['all'] + to_list(categories.keys())))
epilog_str = '''
Try "%(progname)s --help" for help about global options
Try "%(progname)s help" to get all available commands
@ -301,7 +302,7 @@ def watch_tasks(session, tasklist, quiet=False, poll_interval=60):
rv = 1
for child in session.getTaskChildren(task_id):
child_id = child['id']
if not child_id in list(tasks.keys()):
if not child_id in tasks.keys():
tasks[child_id] = TaskWatcher(child_id, session, task.level + 1, quiet=quiet)
tasks[child_id].update()
# If we found new children, go through the list again,

View file

@ -22,6 +22,7 @@
# Mike Bonnet <mikeb@redhat.com>
# Cristian Balint <cbalint@redhat.com>
from __future__ import absolute_import
import base64
import calendar
import koji.rpmdiff
@ -42,7 +43,7 @@ import tempfile
import time
import traceback
import urlparse
import xmlrpclib
import six.moves.xmlrpc_client
import zipfile
import rpm
@ -61,6 +62,8 @@ from koji.util import md5_constructor
from koji.util import multi_fnmatch
from koji.util import safer_move
from koji.util import sha1_constructor
from koji.util import to_list
from six.moves import range
logger = logging.getLogger('koji.hub')
def log_error(msg):
@ -395,7 +398,7 @@ class Task(object):
if xml_request.find('<?xml', 0, 10) == -1:
#handle older base64 encoded data
xml_request = base64.decodestring(xml_request)
params, method = xmlrpclib.loads(xml_request)
params, method = six.moves.xmlrpc_client.loads(xml_request)
return params
def getResult(self, raise_fault=True):
@ -414,8 +417,8 @@ class Task(object):
try:
# If the result is a Fault, then loads will raise it
# This is normally what we want to happen
result, method = xmlrpclib.loads(xml_result)
except xmlrpclib.Fault as fault:
result, method = six.moves.xmlrpc_client.loads(xml_result)
except six.moves.xmlrpc_client.Fault as fault:
if raise_fault:
raise
# Note that you can't really return a fault over xmlrpc, except by
@ -446,7 +449,7 @@ class Task(object):
if task['request'].find('<?xml', 0, 10) == -1:
#handle older base64 encoded data
task['request'] = base64.decodestring(task['request'])
task['request'] = xmlrpclib.loads(task['request'])[0]
task['request'] = six.moves.xmlrpc_client.loads(task['request'])[0]
return results
def runCallbacks(self, cbtype, old_info, attr, new_val):
@ -611,7 +614,7 @@ def eventCondition(event, table=None):
table += '.'
if event is None:
return """(%(table)sactive = TRUE)""" % locals()
elif isinstance(event, int) or isinstance(event, long):
elif isinstance(event, six.integer_types):
return """(%(table)screate_event <= %(event)d AND ( %(table)srevoke_event IS NULL OR %(event)d < %(table)srevoke_event ))""" \
% locals()
else:
@ -693,12 +696,12 @@ def _writeInheritanceData(tag_id, changes, clear=False):
data[parent_id] = link
break
if clear:
for link in data.itervalues():
for link in six.itervalues(data):
if not link.get('is_update'):
link['delete link'] = True
link['is_update'] = True
changed = False
for link in data.itervalues():
for link in six.itervalues(data):
if link.get('is_update'):
changed = True
break
@ -708,17 +711,17 @@ def _writeInheritanceData(tag_id, changes, clear=False):
return
#check for duplicate priorities
pri_index = {}
for link in data.itervalues():
for link in six.itervalues(data):
if link.get('delete link'):
continue
pri_index.setdefault(link['priority'], []).append(link)
for pri, dups in pri_index.iteritems():
for pri, dups in six.iteritems(pri_index):
if len(dups) <= 1:
continue
#oops, duplicate entries for a single priority
dup_ids = [link['parent_id'] for link in dups]
raise koji.GenericError("Inheritance priorities must be unique (pri %s: %r )" % (pri, dup_ids))
for parent_id, link in data.iteritems():
for parent_id, link in six.iteritems(data):
if not link.get('is_update'):
continue
# revoke old values
@ -726,7 +729,7 @@ def _writeInheritanceData(tag_id, changes, clear=False):
clauses=['tag_id=%(tag_id)s', 'parent_id = %(parent_id)s'])
update.make_revoke()
update.execute()
for parent_id, link in data.iteritems():
for parent_id, link in six.iteritems(data):
if not link.get('is_update'):
continue
# skip rest if we are just deleting
@ -1051,7 +1054,7 @@ def readPackageList(tagID=None, userID=None, pkgID=None, event=None, inherit=Fal
q += """
AND users.id = %%(userID)i"""
if pkgID != None:
if isinstance(pkgID, int) or isinstance(pkgID, long):
if isinstance(pkgID, six.integer_types):
q += """
AND package.id = %%(pkgID)i"""
else:
@ -1180,7 +1183,7 @@ def readTaggedBuilds(tag, event=None, inherit=False, latest=False, package=None,
# build - id pkg_id version release epoch
# tag_listing - id build_id tag_id
if not isinstance(latest, (int, long, float)):
if not isinstance(latest, list(six.integer_types) + [float]):
latest = bool(latest)
taglist = [tag]
@ -1322,7 +1325,7 @@ def readTaggedRPMS(tag, package=None, arch=None, event=None, inherit=False, late
joins.append('LEFT OUTER JOIN rpmsigs on rpminfo.id = rpmsigs.rpm_id')
if arch:
data['arch'] = arch
if isinstance(arch, basestring):
if isinstance(arch, six.string_types):
clauses.append('rpminfo.arch = %(arch)s')
elif isinstance(arch, (list, tuple)):
clauses.append('rpminfo.arch IN %(arch)s')
@ -1991,7 +1994,7 @@ def get_tag_groups(tag, event=None, inherit=True, incl_pkgs=True, incl_reqs=True
groups.setdefault(grp_id, group)
if incl_pkgs:
for group in groups.itervalues():
for group in six.itervalues(groups):
group['packagelist'] = {}
fields = ('group_id', 'tag_id', 'package', 'blocked', 'type', 'basearchonly', 'requires')
q = """
@ -2013,7 +2016,7 @@ def get_tag_groups(tag, event=None, inherit=True, incl_pkgs=True, incl_reqs=True
if incl_reqs:
# and now the group reqs
for group in groups.itervalues():
for group in six.itervalues(groups):
group['grouplist'] = {}
fields = ('group_id', 'tag_id', 'req_id', 'blocked', 'type', 'is_metapkg', 'name')
q = """SELECT %s FROM group_req_listing JOIN groups on req_id = id
@ -2048,17 +2051,17 @@ def readTagGroups(tag, event=None, inherit=True, incl_pkgs=True, incl_reqs=True,
Blocked packages/groups can alternatively also be listed if incl_blocked is set to True
"""
groups = get_tag_groups(tag, event, inherit, incl_pkgs, incl_reqs)
groups = list(groups.values())
groups = to_list(groups.values())
for group in groups:
#filter blocked entries and collapse to a list
if 'packagelist' in group:
if incl_blocked:
group['packagelist'] = list(group['packagelist'].values())
group['packagelist'] = to_list(group['packagelist'].values())
else:
group['packagelist'] = [x for x in group['packagelist'].values() if not x['blocked']]
if 'grouplist' in group:
if incl_blocked:
group['grouplist'] = list(group['grouplist'].values())
group['grouplist'] = to_list(group['grouplist'].values())
else:
group['grouplist'] = [x for x in group['grouplist'].values() if not x['blocked']]
#filter blocked entries and collapse to a list
@ -2133,7 +2136,7 @@ def remove_host_from_channel(hostname, channel_name):
def rename_channel(old, new):
"""Rename a channel"""
context.session.assertPerm('admin')
if not isinstance(new, basestring):
if not isinstance(new, six.string_types):
raise koji.GenericError("new channel name must be a string")
cinfo = get_channel(old, strict=True)
dup_check = get_channel(new, strict=False)
@ -2210,7 +2213,7 @@ def get_all_arches():
#in a perfect world, this list would only include canonical
#arches, but not all admins will undertand that.
ret[koji.canonArch(arch)] = 1
return ret.keys()
return to_list(ret.keys())
def get_active_tasks(host=None):
"""Return data on tasks that are yet to be run"""
@ -2463,7 +2466,7 @@ def repo_init(tag, with_src=False, with_debuginfo=False, event=None):
os.symlink(relpath, destlink)
except:
log_error('Error linking %s to %s' % (destlink, relpath))
for artifact_dir, artifacts in artifact_dirs.iteritems():
for artifact_dir, artifacts in six.iteritems(artifact_dirs):
_write_maven_repo_metadata(artifact_dir, artifacts)
koji.plugin.run_callbacks('postRepoInit', tag=tinfo, with_src=with_src, with_debuginfo=with_debuginfo,
@ -2829,7 +2832,7 @@ def get_build_targets(info=None, event=None, buildTagID=None, destTagID=None, qu
if info:
if isinstance(info, str):
clauses.append('build_target.name = %(info)s')
elif isinstance(info, int) or isinstance(info, long):
elif isinstance(info, six.integer_types):
clauses.append('build_target.id = %(info)i')
else:
raise koji.GenericError('invalid type for lookup: %s' % type(info))
@ -2872,11 +2875,11 @@ def lookup_name(table, info, strict=False, create=False):
create option will fail.
"""
fields = ('id', 'name')
if isinstance(info, int) or isinstance(info, long):
if isinstance(info, six.integer_types):
q = """SELECT id,name FROM %s WHERE id=%%(info)d""" % table
elif isinstance(info, str):
q = """SELECT id,name FROM %s WHERE name=%%(info)s""" % table
elif isinstance(info, unicode):
elif six.PY2 and isinstance(info, unicode):
info = koji.fixEncoding(info)
q = """SELECT id,name FROM %s WHERE name=%%(info)s""" % table
else:
@ -2994,7 +2997,7 @@ def _create_tag(name, parent=None, arches=None, perm=None, locked=False, maven_s
# add extra data
if extra is not None:
for key, value in extra.iteritems():
for key, value in six.iteritems(extra):
data = {
'tag_id': tag_id,
'key': key,
@ -3051,9 +3054,9 @@ def get_tag(tagInfo, strict=False, event=None):
'tag_config.maven_include_all': 'maven_include_all'
}
clauses = [eventCondition(event, table='tag_config')]
if isinstance(tagInfo, (int, long)):
if isinstance(tagInfo, six.integer_types):
clauses.append("tag.id = %(tagInfo)i")
elif isinstance(tagInfo, basestring):
elif isinstance(tagInfo, six.string_types):
clauses.append("tag.name = %(tagInfo)s")
else:
raise koji.GenericError('invalid type for tagInfo: %s' % type(tagInfo))
@ -3279,7 +3282,7 @@ def get_external_repos(info=None, url=None, event=None, queryOpts=None):
if info is not None:
if isinstance(info, str):
clauses.append('name = %(info)s')
elif isinstance(info, (int, long)):
elif isinstance(info, six.integer_types):
clauses.append('id = %(info)i')
else:
raise koji.GenericError('invalid type for lookup: %s' % type(info))
@ -3504,7 +3507,7 @@ def get_user(userInfo=None, strict=False):
fields = ['id', 'name', 'status', 'usertype', 'krb_principal']
#fields, aliases = zip(*fields.items())
data = {'info' : userInfo}
if isinstance(userInfo, int) or isinstance(userInfo, long):
if isinstance(userInfo, six.integer_types):
clauses = ['id = %(info)i']
elif isinstance(userInfo, str):
clauses = ['krb_principal = %(info)s OR name = %(info)s']
@ -3519,7 +3522,7 @@ def get_user(userInfo=None, strict=False):
def find_build_id(X, strict=False):
if isinstance(X, int) or isinstance(X, long):
if isinstance(X, six.integer_types):
return X
elif isinstance(X, str):
data = koji.parse_NVR(X)
@ -3750,7 +3753,7 @@ def get_rpm(rpminfo, strict=False, multi=False):
)
# we can look up by id or NVRA
data = None
if isinstance(rpminfo, (int, long)):
if isinstance(rpminfo, six.integer_types):
data = {'id': rpminfo}
elif isinstance(rpminfo, str):
data = koji.parse_NVRA(rpminfo)
@ -4613,7 +4616,7 @@ def get_host(hostInfo, strict=False, event=None):
}
clauses = [eventCondition(event, table='host_config')]
if isinstance(hostInfo, (int, long)):
if isinstance(hostInfo, six.integer_types):
clauses.append("host.id = %(hostInfo)i")
elif isinstance(hostInfo, str):
clauses.append("host.name = %(hostInfo)s")
@ -4674,7 +4677,7 @@ def get_channel(channelInfo, strict=False):
fields = ('id', 'name')
query = """SELECT %s FROM channels
WHERE """ % ', '.join(fields)
if isinstance(channelInfo, int) or isinstance(channelInfo, long):
if isinstance(channelInfo, six.integer_types):
query += """id = %(channelInfo)i"""
elif isinstance(channelInfo, str):
query += """name = %(channelInfo)s"""
@ -5196,7 +5199,7 @@ def import_build(srpm, rpms, brmap=None, task_id=None, build_id=None, logs=None)
policy_data = {
'package': build['name'],
'buildroots': brmap.values(),
'buildroots': to_list(brmap.values()),
'import': True,
'import_type': 'rpm',
}
@ -5236,7 +5239,7 @@ def import_build(srpm, rpms, brmap=None, task_id=None, build_id=None, logs=None)
import_rpm_file(fn, binfo, rpminfo)
add_rpm_sig(rpminfo['id'], koji.rip_rpm_sighdr(fn))
if logs:
for key, files in logs.iteritems():
for key, files in six.iteritems(logs):
if not key:
key = None
for relpath in files:
@ -5411,7 +5414,7 @@ class CG_Importer(object):
if metadata is None:
#default to looking for uploaded file
metadata = 'metadata.json'
if not isinstance(metadata, (str, unicode)):
if not isinstance(metadata, six.string_types):
raise koji.GenericError("Invalid metadata value: %r" % metadata)
if metadata.endswith('.json'):
# handle uploaded metadata
@ -5496,7 +5499,7 @@ class CG_Importer(object):
datetime.datetime.fromtimestamp(float(metadata['build']['end_time'])).isoformat(' ')
owner = metadata['build'].get('owner', None)
if owner:
if not isinstance(owner, basestring):
if not isinstance(owner, six.string_types):
raise koji.GenericError("Invalid owner format (expected username): %s" % owner)
buildinfo['owner'] = get_user(owner, strict=True)['id']
self.buildinfo = buildinfo
@ -5887,14 +5890,14 @@ def add_external_rpm(rpminfo, external_repo, strict=True):
# sanity check rpminfo
dtypes = (
('name', basestring),
('version', basestring),
('release', basestring),
('name', six.string_types),
('version', six.string_types),
('release', six.string_types),
('epoch', (int, type(None))),
('arch', basestring),
('arch', six.string_types),
('payloadhash', str),
('size', int),
('buildtime', (int, long)))
('buildtime', six.integer_types))
for field, allowed in dtypes:
if field not in rpminfo:
raise koji.GenericError("%s field missing: %r" % (field, rpminfo))
@ -6849,7 +6852,7 @@ def query_history(tables=None, **kwargs):
fields['creator.id = %(editor)i'] = '_created_by'
fields['revoker.id = %(editor)i'] = '_revoked_by'
elif arg == 'after':
if not isinstance(value, basestring):
if not isinstance(value, six.string_types):
value = datetime.datetime.fromtimestamp(value).isoformat(' ')
data['after'] = value
clauses.append('ev1.time > %(after)s OR ev2.time > %(after)s')
@ -6864,7 +6867,7 @@ def query_history(tables=None, **kwargs):
fields[c_test] = '_created_after_event'
fields[r_test] = '_revoked_after_event'
elif arg == 'before':
if not isinstance(value, basestring):
if not isinstance(value, six.string_types):
value = datetime.datetime.fromtimestamp(value).isoformat(' ')
data['before'] = value
clauses.append('ev1.time < %(before)s OR ev2.time < %(before)s')
@ -7019,7 +7022,7 @@ def build_references(build_id, limit=None):
idx.setdefault(row['id'], row)
if limit is not None and len(idx) > limit:
break
ret['rpms'] = idx.values()
ret['rpms'] = to_list(idx.values())
ret['component_of'] = []
# find images/archives that contain the build rpms
@ -7050,7 +7053,7 @@ def build_references(build_id, limit=None):
idx.setdefault(row['id'], row)
if limit is not None and len(idx) > limit:
break
ret['archives'] = idx.values()
ret['archives'] = to_list(idx.values())
# find images/archives that contain the build archives
fields = ['archive_id']
@ -7392,7 +7395,7 @@ def tag_notification(is_successful, tag_id, from_id, build_id, user_id, ignore_s
from_tag = get_tag(from_id)
for email in get_notification_recipients(build, from_tag['id'], state):
recipients[email] = 1
recipients_uniq = recipients.keys()
recipients_uniq = to_list(recipients.keys())
if len(recipients_uniq) > 0 and not (is_successful and ignore_success):
task_id = make_task('tagNotification', [recipients_uniq, is_successful, tag_id, from_id, build_id, user_id, ignore_success, failure_msg])
return task_id
@ -7620,8 +7623,8 @@ class InsertProcessor(object):
if not self.data and not self.rawdata:
return "-- incomplete update: no assigns"
parts = ['INSERT INTO %s ' % self.table]
columns = self.data.keys()
columns.extend(self.rawdata.keys())
columns = to_list(self.data.keys())
columns.extend(to_list(self.rawdata.keys()))
parts.append("(%s) " % ', '.join(columns))
values = []
for key in columns:
@ -7664,7 +7667,7 @@ class InsertProcessor(object):
del data['create_event']
del data['creator_id']
clauses = ["%s = %%(%s)s" % (k, k) for k in data]
query = QueryProcessor(columns=data.keys(), tables=[self.table],
query = QueryProcessor(columns=to_list(data.keys()), tables=[self.table],
clauses=clauses, values=data)
if query.execute():
return True
@ -8043,7 +8046,7 @@ def policy_get_pkg(data):
if not pkginfo:
#for some operations (e.g. adding a new package), the package
#entry may not exist yet
if isinstance(data['package'], basestring):
if isinstance(data['package'], six.string_types):
return {'id' : None, 'name' : data['package']}
else:
raise koji.GenericError("Invalid package: %s" % data['package'])
@ -8331,7 +8334,7 @@ class UserInGroupTest(koji.policy.BaseSimpleTest):
return False
groups = koji.auth.get_user_groups(user['id'])
args = self.str.split()[1:]
for group_id, group in groups.iteritems():
for group_id, group in six.iteritems(groups):
for pattern in args:
if fnmatch.fnmatch(group, pattern):
return True
@ -8931,7 +8934,7 @@ class RootExports(object):
values = {}
q = """SELECT id, EXTRACT(EPOCH FROM time) FROM events"""
if before is not None:
if not isinstance(before, (int, long, float)):
if not isinstance(before, list(six.integer_types) + [float]):
raise koji.GenericError('invalid type for before: %s' % type(before))
# use the repr() conversion because it retains more precision than the
# string conversion
@ -8963,7 +8966,7 @@ class RootExports(object):
# we will accept offset and size as strings to work around xmlrpc limits
offset = koji.decode_int(offset)
size = koji.decode_int(size)
if isinstance(md5sum, basestring):
if isinstance(md5sum, six.string_types):
# this case is for backwards compatibility
verify = "md5"
digest = md5sum
@ -9551,9 +9554,9 @@ class RootExports(object):
if before:
if isinstance(before, datetime.datetime):
before = calendar.timegm(before.utctimetuple())
elif isinstance(before, (str, unicode)):
elif isinstance(before, six.string_types):
before = koji.util.parseTime(before)
elif isinstance(before, (int, long)):
elif isinstance(before, six.integer_types):
pass
else:
raise koji.GenericError('invalid type for before: %s' % type(before))
@ -9561,9 +9564,9 @@ class RootExports(object):
if after:
if isinstance(after, datetime.datetime):
after = calendar.timegm(after.utctimetuple())
elif isinstance(after, (str, unicode)):
elif isinstance(after, six.string_types):
after = koji.util.parseTime(after)
elif isinstance(after, (int, long)):
elif isinstance(after, six.integer_types):
pass
else:
raise koji.GenericError('invalid type for after: %s' % type(after))
@ -9654,7 +9657,7 @@ class RootExports(object):
def listTagged(self, tag, event=None, inherit=False, prefix=None, latest=False, package=None, owner=None, type=None):
"""List builds tagged with tag"""
if not isinstance(tag, (int, long)):
if not isinstance(tag, six.integer_types):
#lookup tag id
tag = get_tag_id(tag, strict=True)
results = readTaggedBuilds(tag, event, inherit=inherit, latest=latest, package=package, owner=owner, type=type)
@ -9665,14 +9668,14 @@ class RootExports(object):
def listTaggedRPMS(self, tag, event=None, inherit=False, latest=False, package=None, arch=None, rpmsigs=False, owner=None, type=None):
"""List rpms and builds within tag"""
if not isinstance(tag, (int, long)):
if not isinstance(tag, six.integer_types):
#lookup tag id
tag = get_tag_id(tag, strict=True)
return readTaggedRPMS(tag, event=event, inherit=inherit, latest=latest, package=package, arch=arch, rpmsigs=rpmsigs, owner=owner, type=type)
def listTaggedArchives(self, tag, event=None, inherit=False, latest=False, package=None, type=None):
"""List archives and builds within a tag"""
if not isinstance(tag, (int, long)):
if not isinstance(tag, six.integer_types):
tag = get_tag_id(tag, strict=True)
return readTaggedArchives(tag, event=event, inherit=inherit, latest=latest, package=package, type=type)
@ -9851,14 +9854,14 @@ class RootExports(object):
def getLatestBuilds(self, tag, event=None, package=None, type=None):
"""List latest builds for tag (inheritance enabled)"""
if not isinstance(tag, (int, long)):
if not isinstance(tag, six.integer_types):
#lookup tag id
tag = get_tag_id(tag, strict=True)
return readTaggedBuilds(tag, event, inherit=True, latest=True, package=package, type=type)
def getLatestRPMS(self, tag, package=None, arch=None, event=None, rpmsigs=False, type=None):
"""List latest RPMS for tag (inheritance enabled)"""
if not isinstance(tag, (int, long)):
if not isinstance(tag, six.integer_types):
#lookup tag id
tag = get_tag_id(tag, strict=True)
return readTaggedRPMS(tag, package=package, arch=arch, event=event, inherit=True, latest=True, rpmsigs=rpmsigs, type=type)
@ -9918,13 +9921,13 @@ class RootExports(object):
def getInheritanceData(self, tag, event=None):
"""Return inheritance data for tag"""
if not isinstance(tag, (int, long)):
if not isinstance(tag, six.integer_types):
#lookup tag id
tag = get_tag_id(tag, strict=True)
return readInheritanceData(tag, event)
def setInheritanceData(self, tag, data, clear=False):
if not isinstance(tag, (int, long)):
if not isinstance(tag, six.integer_types):
#lookup tag id
tag = get_tag_id(tag, strict=True)
context.session.assertPerm('admin')
@ -9935,7 +9938,7 @@ class RootExports(object):
stops = {}
if jumps is None:
jumps = {}
if not isinstance(tag, (int, long)):
if not isinstance(tag, six.integer_types):
#lookup tag id
tag = get_tag_id(tag, strict=True)
for mapping in [stops, jumps]:
@ -9962,7 +9965,7 @@ class RootExports(object):
- buildroot_id
If no build has the given ID, or the build generated no RPMs, an empty list is returned."""
if not isinstance(build, (int, long)):
if not isinstance(build, six.integer_types):
#lookup build id
build = self.findBuildID(build, strict=True)
return self.listRPMs(buildID=build)
@ -10187,9 +10190,9 @@ class RootExports(object):
userID = get_user(userID, strict=True)['id']
if pkgID is not None:
pkgID = get_package_id(pkgID, strict=True)
result_list = readPackageList(tagID=tagID, userID=userID, pkgID=pkgID,
result_list = list(readPackageList(tagID=tagID, userID=userID, pkgID=pkgID,
inherit=inherited, with_dups=with_dups,
event=event).values()
event=event).values())
if with_dups:
# when with_dups=True, readPackageList returns a list of list of dicts
# convert it to a list of dicts for consistency
@ -10353,7 +10356,7 @@ class RootExports(object):
return taginfo
def getRepo(self, tag, state=None, event=None, dist=False):
if isinstance(tag, (int, long)):
if isinstance(tag, six.integer_types):
id = tag
else:
id = get_tag_id(tag, strict=True)
@ -10626,8 +10629,8 @@ class RootExports(object):
if val.find('<?xml', 0, 10) == -1:
#handle older base64 encoded data
val = base64.decodestring(val)
data, method = xmlrpclib.loads(val)
except xmlrpclib.Fault as fault:
data, method = six.moves.xmlrpc_client.loads(val)
except six.moves.xmlrpc_client.Fault as fault:
data = fault
task[f] = data
yield task
@ -10887,14 +10890,14 @@ class RootExports(object):
buildinfo = get_build(build)
if not buildinfo:
raise koji.GenericError('build does not exist: %s' % build)
elif isinstance(ts, xmlrpclib.DateTime):
elif isinstance(ts, six.moves.xmlrpc_client.DateTime):
#not recommended
#the xmlrpclib.DateTime class is almost useless
try:
ts = time.mktime(time.strptime(str(ts), '%Y%m%dT%H:%M:%S'))
except ValueError:
raise koji.GenericError("Invalid time: %s" % ts)
elif not isinstance(ts, (int, long, float)):
elif not isinstance(ts, list(six.integer_types) + [float]):
raise koji.GenericError("Invalid type for timestamp")
koji.plugin.run_callbacks('preBuildStateChange', attribute='completion_ts', old=buildinfo['completion_ts'], new=ts, info=buildinfo)
buildid = buildinfo['id']
@ -11842,7 +11845,7 @@ class HostExports(object):
safer_move(fn, dest)
os.symlink(dest, fn)
if logs:
for key, files in logs.iteritems():
for key, files in six.iteritems(logs):
if key:
logdir = "%s/logs/%s" % (dir, key)
else:
@ -11865,7 +11868,7 @@ class HostExports(object):
scratchdir = koji.pathinfo.scratch()
username = get_user(task.getOwner())['name']
destdir = os.path.join(scratchdir, username, 'task_%s' % task_id)
for reldir, files in results['files'].items() + [('', results['logs'])]:
for reldir, files in to_list(results['files'].items()) + [('', results['logs'])]:
for filename in files:
if reldir:
relpath = os.path.join(reldir, filename)
@ -11897,7 +11900,7 @@ class HostExports(object):
scratchdir = koji.pathinfo.scratch()
username = get_user(task.getOwner())['name']
destdir = os.path.join(scratchdir, username, 'task_%s' % task_id)
for relpath in results['output'].keys() + results['logs']:
for relpath in to_list(results['output'].keys()) + results['logs']:
filename = os.path.join(koji.pathinfo.task(results['task_id']), relpath)
dest = os.path.join(destdir, relpath)
koji.ensuredir(os.path.dirname(dest))
@ -12086,7 +12089,7 @@ class HostExports(object):
maven_task_id = maven_results['task_id']
maven_buildroot_id = maven_results['buildroot_id']
maven_task_dir = koji.pathinfo.task(maven_task_id)
for relpath, files in maven_results['files'].iteritems():
for relpath, files in six.iteritems(maven_results['files']):
dir_maven_info = maven_info
poms = [f for f in files if f.endswith('.pom')]
if len(poms) == 0:
@ -12250,7 +12253,7 @@ class HostExports(object):
task_dir = koji.pathinfo.task(results['task_id'])
# import the build output
for relpath, metadata in results['output'].iteritems():
for relpath, metadata in six.iteritems(results['output']):
archivetype = get_archive_type(relpath)
if not archivetype:
# Unknown archive type, fail the build
@ -12476,9 +12479,9 @@ class HostExports(object):
extra_deps = []
task_deps = {}
for dep in extra_deps:
if isinstance(dep, (int, long)):
if isinstance(dep, six.integer_types):
task_output = list_task_output(dep, stat=True)
for filepath, filestats in task_output.iteritems():
for filepath, filestats in six.iteritems(task_output):
if os.path.splitext(filepath)[1] in ['.log', '.md5', '.sha1']:
continue
tokens = filepath.split('/')
@ -12564,7 +12567,7 @@ class HostExports(object):
if build_id:
build = get_build(build_id)
logger.error("g:a:v supplied by build %(nvr)s", build)
logger.error("Build supplies %i archives: %r", len(build_archives), build_archives.keys())
logger.error("Build supplies %i archives: %r", len(build_archives), to_list(build_archives.keys()))
if tag_archive:
logger.error("Size mismatch, br: %i, db: %i", fileinfo['size'], tag_archive['size'])
raise koji.BuildrootError('Unknown file in build environment: %s, size: %s' % \
@ -12649,7 +12652,7 @@ class HostExports(object):
repodir = koji.pathinfo.repo(repo_id, rinfo['tag_name'])
workdir = koji.pathinfo.work()
if not rinfo['dist']:
for arch, (uploadpath, files) in data.iteritems():
for arch, (uploadpath, files) in six.iteritems(data):
archdir = "%s/%s" % (repodir, koji.canonArch(arch))
if not os.path.isdir(archdir):
raise koji.GenericError("Repo arch directory missing: %s" % archdir)

View file

@ -18,7 +18,9 @@
# Authors:
# Mike McLean <mikem@redhat.com>
from ConfigParser import RawConfigParser
from __future__ import absolute_import
from __future__ import division
from six.moves.configparser import RawConfigParser
import datetime
import inspect
import logging
@ -38,6 +40,8 @@ import koji.util
# import xmlrpclib functions from koji to use tweaked Marshaller
from koji.xmlrpcplus import getparser, dumps, Fault, ExtendedMarshaller
from koji.context import context
from six.moves import range
import six
class Marshaller(ExtendedMarshaller):
@ -96,7 +100,7 @@ class HandlerRegistry(object):
Handlers are functions marked with one of the decorators defined in koji.plugin
"""
for v in vars(plugin).itervalues():
for v in six.itervalues(vars(plugin)):
if isinstance(v, type):
#skip classes
continue
@ -116,7 +120,7 @@ class HandlerRegistry(object):
if ret:
return ret
ret = tuple(inspect.getargspec(func))
if inspect.ismethod(func) and func.im_self:
if inspect.ismethod(func) and func.__self__:
# bound method, remove first arg
args, varargs, varkw, defaults = ret
if args:
@ -143,17 +147,17 @@ class HandlerRegistry(object):
def _getFuncArgs(self, func):
args = []
for x in range(0, func.func_code.co_argcount):
if x == 0 and func.func_code.co_varnames[x] == "self":
for x in range(0, func.__code__.co_argcount):
if x == 0 and func.__code__.co_varnames[x] == "self":
continue
if func.func_defaults and func.func_code.co_argcount - x <= len(func.func_defaults):
args.append((func.func_code.co_varnames[x], func.func_defaults[x - func.func_code.co_argcount + len(func.func_defaults)]))
if func.__defaults__ and func.__code__.co_argcount - x <= len(func.__defaults__):
args.append((func.__code__.co_varnames[x], func.__defaults__[x - func.__code__.co_argcount + len(func.__defaults__)]))
else:
args.append(func.func_code.co_varnames[x])
args.append(func.__code__.co_varnames[x])
return args
def system_listMethods(self):
return self.funcs.keys()
return koji.util.to_list(self.funcs.keys())
def system_methodSignature(self, method):
#it is not possible to autogenerate this data
@ -475,7 +479,7 @@ def load_config(environ):
opts['policy'] = dict(config.items('policy'))
else:
opts['policy'] = {}
for pname, text in _default_policies.iteritems():
for pname, text in six.iteritems(_default_policies):
opts['policy'].setdefault(pname, text)
# use configured KojiDir
if opts.get('KojiDir') is not None:
@ -543,14 +547,14 @@ def get_policy(opts, plugins):
continue
alltests.append(koji.policy.findSimpleTests(vars(plugin)))
policy = {}
for pname, text in opts['policy'].iteritems():
for pname, text in six.iteritems(opts['policy']):
#filter/merge tests
merged = {}
for tests in alltests:
# tests can be limited to certain policies by setting a class variable
for name, test in tests.iteritems():
for name, test in six.iteritems(tests):
if hasattr(test, 'policy'):
if isinstance(test.policy, basestring):
if isinstance(test.policy, six.string_types):
if pname != test.policy:
continue
elif pname not in test.policy:
@ -647,7 +651,7 @@ def load_scripts(environ):
def get_memory_usage():
pagesize = resource.getpagesize()
statm = [pagesize*int(y)/1024 for y in "".join(open("/proc/self/statm").readlines()).strip().split()]
statm = [pagesize * int(y) // 1024 for y in "".join(open("/proc/self/statm").readlines()).strip().split()]
size, res, shr, text, lib, data, dirty = statm
return res - shr

View file

@ -23,6 +23,7 @@
from __future__ import absolute_import
from __future__ import division
import sys
from six.moves import range
from six.moves import zip
@ -449,7 +450,7 @@ def decode_args2(args, names, strict=True):
args, opts = decode_args(*args)
if strict and len(names) < len(args):
raise TypeError("Expecting at most %i arguments" % len(names))
ret = dict(list(zip(names, args)))
ret = dict(zip(names, args))
ret.update(opts)
return ret
@ -1165,7 +1166,7 @@ def parse_pom(path=None, contents=None):
xml.sax.parseString(contents, handler)
for field in fields:
if field not in list(values.keys()):
if field not in util.to_list(values.keys()):
raise GenericError('could not extract %s from POM: %s' % (field, (path or '<contents>')))
return values
@ -2178,7 +2179,7 @@ class ClientSession(object):
# decode and decrypt the login info
sinfo_priv = base64.decodestring(sinfo_enc)
sinfo_str = ac.rd_priv(sinfo_priv)
sinfo = dict(list(zip(['session-id', 'session-key'], sinfo_str.split())))
sinfo = dict(zip(['session-id', 'session-key'], sinfo_str.split()))
if not sinfo:
self.logger.warn('No session info received')
@ -2569,7 +2570,7 @@ class ClientSession(object):
ret = []
callgrp = (calls[i:i + batch] for i in range(0, len(calls), batch))
self.logger.debug("MultiCall with batch size %i, calls/groups(%i/%i)",
batch, len(calls), round(len(calls) / batch))
batch, len(calls), round(len(calls) // batch))
for c in callgrp:
ret.extend(self._callMethod('multiCall', (c,), {}))
else:
@ -2750,9 +2751,9 @@ class ClientSession(object):
if t2 <= 0:
t2 = 1
if debug:
self.logger.debug("Uploaded %d bytes in %f seconds (%f kbytes/sec)" % (size, t1, size/t1/1024))
self.logger.debug("Uploaded %d bytes in %f seconds (%f kbytes/sec)" % (size, t1, size / t1 / 1024.0))
if debug:
self.logger.debug("Total: %d bytes in %f seconds (%f kbytes/sec)" % (ofs, t2, ofs/t2/1024))
self.logger.debug("Total: %d bytes in %f seconds (%f kbytes/sec)" % (ofs, t2, ofs / t2 / 1024.0))
if callback:
callback(ofs, totalsize, size, t1, t2)
fo.close()
@ -3060,7 +3061,7 @@ def fixEncodingRecurse(value, fallback='iso8859-15', remove_nonprintable=False):
if isinstance(value, tuple):
return tuple([fixEncodingRecurse(x, fallback=fallback, remove_nonprintable=remove_nonprintable) for x in value])
elif isinstance(value, list):
return list([fixEncodingRecurse(x, fallback=fallback, remove_nonprintable=remove_nonprintable) for x in value])
return [fixEncodingRecurse(x, fallback=fallback, remove_nonprintable=remove_nonprintable) for x in value]
elif isinstance(value, dict):
ret = {}
for k in value:

View file

@ -34,6 +34,7 @@ from .context import context
from six.moves import range
from six.moves import zip
import six
from .util import to_list
# 1 - load session if provided
# - check uri for session id
@ -108,7 +109,7 @@ class Session(object):
'user_id': 'user_id',
}
# sort for stability (unittests)
fields, aliases = list(zip(*list(sorted(fields.items(), key=lambda x: x[1]))))
fields, aliases = zip(*sorted(fields.items(), key=lambda x: x[1]))
q = """
SELECT %s FROM sessions
WHERE id = %%(id)i
@ -120,7 +121,7 @@ class Session(object):
row = c.fetchone()
if not row:
raise koji.AuthError('Invalid session or bad credentials')
session_data = dict(list(zip(aliases, row)))
session_data = dict(zip(aliases, row))
#check for expiration
if session_data['expired']:
raise koji.AuthExpired('session "%i" has expired' % id)
@ -158,7 +159,7 @@ class Session(object):
fields = ('name', 'status', 'usertype')
q = """SELECT %s FROM users WHERE id=%%(user_id)s""" % ','.join(fields)
c.execute(q, session_data)
user_data = dict(list(zip(fields, c.fetchone())))
user_data = dict(zip(fields, c.fetchone()))
if user_data['status'] != koji.USER_STATUS['NORMAL']:
raise koji.AuthError('logins by %s are not allowed' % user_data['name'])
@ -537,7 +538,7 @@ class Session(object):
def getPerms(self):
if not self.logged_in:
return []
return list(self.perms.keys())
return to_list(self.perms.keys())
def hasPerm(self, name):
if not self.logged_in:
@ -709,7 +710,7 @@ def get_user_data(user_id):
row = c.fetchone()
if not row:
return None
return dict(list(zip(fields, row)))
return dict(zip(fields, row))
def login(*args, **opts):
return context.session.login(*args, **opts)

View file

@ -24,7 +24,10 @@
# - request data
# - auth data
import thread
from __future__ import absolute_import
import six.moves._thread
from six.moves import range
import six
class _data(object):
pass
@ -35,7 +38,7 @@ class ThreadLocal(object):
# should probably be getattribute, but easier to debug this way
def __getattr__(self, key):
id = thread.get_ident()
id = six.moves._thread.get_ident()
tdict = object.__getattribute__(self, '_tdict')
if id not in tdict:
raise AttributeError(key)
@ -43,7 +46,7 @@ class ThreadLocal(object):
return object.__getattribute__(data, key)
def __setattr__(self, key, value):
id = thread.get_ident()
id = six.moves._thread.get_ident()
tdict = object.__getattribute__(self, '_tdict')
if id not in tdict:
tdict[id] = _data()
@ -51,7 +54,7 @@ class ThreadLocal(object):
return object.__setattr__(data, key, value)
def __delattr__(self, key):
id = thread.get_ident()
id = six.moves._thread.get_ident()
tdict = object.__getattribute__(self, '_tdict')
if id not in tdict:
raise AttributeError(key)
@ -62,14 +65,14 @@ class ThreadLocal(object):
return ret
def __str__(self):
id = thread.get_ident()
id = six.moves._thread.get_ident()
tdict = object.__getattribute__(self, '_tdict')
return "(current thread: %s) {" % id + \
", ".join(["%s : %s" %(k, v.__dict__) for (k, v) in tdict.iteritems()]) + \
", ".join(["%s : %s" %(k, v.__dict__) for (k, v) in six.iteritems(tdict)]) + \
"}"
def _threadclear(self):
id = thread.get_ident()
id = six.moves._thread.get_ident()
tdict = object.__getattribute__(self, '_tdict')
if id not in tdict:
return
@ -97,8 +100,8 @@ if __name__ == '__main__':
context._threadclear()
print(context)
for x in xrange(1, 10):
thread.start_new_thread(test, ())
for x in range(1, 10):
six.moves._thread.start_new_thread(test, ())
time.sleep(4)
print('')

View file

@ -20,11 +20,14 @@
# Mike McLean <mikem@redhat.com>
# Mike Bonnet <mikeb@redhat.com>
from __future__ import absolute_import
from __future__ import division
import koji
import koji.tasks
import koji.xmlrpcplus
from koji.tasks import safe_rmtree
from koji.util import md5_constructor, adler32_constructor, parseStatus, dslice
from koji.util import md5_constructor, adler32_constructor, parseStatus, \
dslice, to_list
import os
import signal
import logging
@ -36,6 +39,8 @@ import subprocess
import sys
import traceback
import errno
from six.moves import range
import six
def incremental_upload(session, fname, fd, path, retries=5, logger=None):
@ -580,7 +585,7 @@ class TaskManager(object):
"""Attempt to shut down cleanly"""
for task_id in self.pids.keys():
self.cleanupTask(task_id)
self.session.host.freeTasks(self.tasks.keys())
self.session.host.freeTasks(to_list(self.tasks.keys()))
self.session.host.updateHost(task_load=0.0, ready=False)
def updateBuildroots(self, nolocal=False):
@ -611,14 +616,14 @@ class TaskManager(object):
#task not running - expire the buildroot
#TODO - consider recycling hooks here (with strong sanity checks)
self.logger.info("Expiring buildroot: %(id)i/%(tag_name)s/%(arch)s" % br)
self.logger.debug("Buildroot task: %r, Current tasks: %r" % (task_id, self.tasks.keys()))
self.logger.debug("Buildroot task: %r, Current tasks: %r" % (task_id, to_list(self.tasks.keys())))
self.session.host.setBuildRootState(id, st_expired)
continue
if nolocal:
return
local_br = self._scanLocalBuildroots()
# get info on local_only buildroots (most likely expired)
local_only = [id for id in local_br.iterkeys() if id not in db_br]
local_only = [id for id in six.iterkeys(local_br) if id not in db_br]
if local_only:
missed_br = self.session.listBuildroots(buildrootID=tuple(local_only))
#get all the task info in one call
@ -719,7 +724,7 @@ class TaskManager(object):
fo = open(fn, 'r')
id = None
name = None
for n in xrange(10):
for n in range(10):
# data should be in first few lines
line = fo.readline()
if line.startswith('# Koji buildroot id:'):
@ -850,7 +855,7 @@ class TaskManager(object):
# Note: we may still take an assigned task below
#sort available capacities for each of our bins
avail = {}
for bin in bins.iterkeys():
for bin in six.iterkeys(bins):
avail[bin] = [host['capacity'] - host['task_load'] for host in bin_hosts[bin]]
avail[bin].sort()
avail[bin].reverse()
@ -882,7 +887,7 @@ class TaskManager(object):
#accept this task)
bin_avail = avail.get(bin, [0])
self.logger.debug("available capacities for bin: %r" % bin_avail)
median = bin_avail[(len(bin_avail)-1)/2]
median = bin_avail[(len(bin_avail)-1)//2]
self.logger.debug("ours: %.2f, median: %.2f" % (our_avail, median))
if not self.checkRelAvail(bin_avail, our_avail):
#decline for now and give the upper half a chance
@ -900,7 +905,7 @@ class TaskManager(object):
Check our available capacity against the capacity of other hosts in this bin.
Return True if we should take a task, False otherwise.
"""
median = bin_avail[(len(bin_avail)-1)/2]
median = bin_avail[(len(bin_avail)-1)//2]
self.logger.debug("ours: %.2f, median: %.2f" % (avail, median))
if avail >= median:
return True
@ -1093,7 +1098,7 @@ class TaskManager(object):
raise IOError("No such directory: %s" % br_path)
fs_stat = os.statvfs(br_path)
available = fs_stat.f_bavail * fs_stat.f_bsize
availableMB = available / 1024 / 1024
availableMB = available // 1024 // 1024
self.logger.debug("disk space available in '%s': %i MB", br_path, availableMB)
if availableMB < self.options.minspace:
self.status = "Insufficient disk space: %i MB, %i MB required" % (availableMB, self.options.minspace)

View file

@ -21,6 +21,7 @@
# Mike McLean <mikem@redhat.com>
from __future__ import absolute_import
import logging
import sys
import psycopg2
@ -33,7 +34,7 @@ import psycopg2
# del psycopg2.extensions.string_types[1266]
import time
import traceback
import context
from . import context
import re
POSITIONAL_RE = re.compile(r'%[a-z]')

View file

@ -19,6 +19,7 @@
# Mike McLean <mikem@redhat.com>
# Mike Bonnet <mikeb@redhat.com>
from __future__ import absolute_import
import imp
import koji
import logging

View file

@ -17,10 +17,14 @@
# Authors:
# Mike McLean <mikem@redhat.com>
from __future__ import absolute_import
import fnmatch
import logging
import koji
import six
from koji.util import to_list
class BaseSimpleTest(object):
@ -292,7 +296,7 @@ class SimpleRuleSet(object):
index[name] = 1
index = {}
_recurse(self.ruleset, index)
return index.keys()
return to_list(index.keys())
def _apply(self, rules, data, top=False):
for tests, negate, action in rules:
@ -361,7 +365,7 @@ def findSimpleTests(namespace):
namespace = (namespace,)
ret = {}
for ns in namespace:
for key, value in ns.iteritems():
for key, value in six.iteritems(ns):
if value is BaseSimpleTest:
# skip this abstract base class if we encounter it
# this module contains generic tests, so it is valid to include it

View file

@ -18,11 +18,13 @@
# This library and program is heavily based on rpmdiff from the rpmlint package
# It was modified to be used as standalone library for the Koji project.
from __future__ import absolute_import
import hashlib
import json
import rpm
import os
import itertools
import six
class Rpmdiff:
@ -113,8 +115,8 @@ class Rpmdiff:
old_files_dict = self.__fileIteratorToDict(old.fiFromHeader())
new_files_dict = self.__fileIteratorToDict(new.fiFromHeader())
files = list(set(itertools.chain(old_files_dict.iterkeys(),
new_files_dict.iterkeys())))
files = list(set(itertools.chain(six.iterkeys(old_files_dict),
six.iterkeys(new_files_dict))))
files.sort()
self.old_data['files'] = old_files_dict
self.new_data['files'] = new_files_dict

View file

@ -20,18 +20,20 @@
# Mike McLean <mikem@redhat.com>
# Mike Bonnet <mikeb@redhat.com>
from __future__ import absolute_import
import koji
import koji.plugin
import koji.util
import os
import logging
import xmlrpclib
import six.moves.xmlrpc_client
import signal
import shutil
import random
import time
import pprint
import six.moves.urllib.request
from six.moves import range
def scan_mounts(topdir):
"""Search path for mountpoints"""
@ -390,7 +392,7 @@ class BaseTaskHandler(object):
try:
self.session.getTaskResult(task)
checked.add(task)
except (koji.GenericError, xmlrpclib.Fault):
except (koji.GenericError, six.moves.xmlrpc_client.Fault):
self.logger.info("task %s failed or was canceled, cancelling unfinished tasks" % task)
self.session.cancelTaskChildren(self.id)
# reraise the original error now, rather than waiting for
@ -577,7 +579,7 @@ class SleepTask(BaseTaskHandler):
class ForkTask(BaseTaskHandler):
Methods = ['fork']
def handler(self, n=5, m=37):
for i in xrange(n):
for i in range(n):
os.spawnvp(os.P_NOWAIT, 'sleep', ['sleep', str(m)])
class WaitTestTask(BaseTaskHandler):
@ -592,7 +594,7 @@ class WaitTestTask(BaseTaskHandler):
_taskWeight = 0.1
def handler(self, count, seconds=10):
tasks = []
for i in xrange(count):
for i in range(count):
task_id = self.subtask(method='sleep', arglist=[seconds], label=str(i))
tasks.append(task_id)
bad_task = self.subtask('sleep', ['BAD_ARG'], label='bad')

View file

@ -19,6 +19,7 @@
# Mike Bonnet <mikeb@redhat.com>
from __future__ import absolute_import
from __future__ import division
import calendar
import datetime
from koji.xmlrpcplus import DateTime
@ -116,7 +117,7 @@ def checkForBuilds(session, tag, builds, event, latest=False):
def duration(start):
"""Return the duration between start and now in MM:SS format"""
elapsed = time.time() - start
mins = int(elapsed / 60)
mins = int(elapsed // 60)
secs = int(elapsed % 60)
return '%s:%02i' % (mins, secs)
@ -181,7 +182,7 @@ class DataWalker(object):
if isinstance(value, tuple):
value = tuple([self._walk(x) for x in value])
elif isinstance(value, list):
value = list([self._walk(x) for x in value])
value = [self._walk(x) for x in value]
elif isinstance(value, dict):
ret = {}
for k in value:
@ -729,3 +730,17 @@ def parse_maven_chain(confs, scratch=False):
except ValueError:
raise ValueError('No possible build order, missing/circular dependencies')
return builds
def to_list(l):
"""
Helper function for py2/py3 compatibility used e.g. in
list(dict.keys())
Don't use it for structures like list(zip(x, y)), where six.moves.zip is
used, so it is always an iterator.
"""
if isinstance(l, list):
return l
else:
return list(l)

View file

@ -2,6 +2,7 @@
Custom xmlrpc handling for Koji
"""
from __future__ import absolute_import
import six
import six.moves.xmlrpc_client as xmlrpc_client
import types

View file

@ -1,8 +1,9 @@
# kojid plugin
from __future__ import absolute_import
import commands
import koji
import ConfigParser
import six.moves.configparser
import os
import platform
import re
@ -48,7 +49,7 @@ class RunRootTask(koji.tasks.BaseTaskHandler):
return res
def _read_config(self):
cp = ConfigParser.SafeConfigParser()
cp = six.moves.configparser.SafeConfigParser()
cp.read(CONFIG_FILE)
self.config = {
'default_mounts': [],
@ -89,7 +90,7 @@ class RunRootTask(koji.tasks.BaseTaskHandler):
'fstype': cp.get(section_name, 'fstype'),
'options': cp.get(section_name, 'options'),
})
except ConfigParser.NoOptionError:
except six.moves.configparser.NoOptionError:
raise koji.GenericError("bad config: missing options in %s section" % section_name)
for path in self.config['default_mounts'] + self.config['safe_roots'] + [x[0] for x in self.config['path_subs']]:

View file

@ -1,8 +1,9 @@
from __future__ import absolute_import
import fnmatch
import os
import sys
import tarfile
import ConfigParser
import six.moves.configparser
import koji
import koji.tasks as tasks
@ -27,7 +28,7 @@ def omit_paths3(tarinfo):
def read_config():
global config
cp = ConfigParser.SafeConfigParser()
cp = six.moves.configparser.SafeConfigParser()
cp.read(CONFIG_FILE)
config = {
'path_filters': [],

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import sys
import time

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import koji
from koji.plugin import export_cli
from koji_cli.lib import _, activate_session, OptionParser, watch_tasks

View file

@ -5,10 +5,12 @@
# Authors:
# Mike Bonnet <mikeb@redhat.com>
from __future__ import absolute_import
from koji.plugin import callbacks, callback, ignore_error
from koji.util import to_list
import logging
@callback(*callbacks.keys())
@callback(*to_list(callbacks.keys()))
@ignore_error
def echo(cbtype, *args, **kws):
logging.getLogger('koji.plugin.echo').info('Called the %s callback, args: %s; kws: %s',

View file

@ -4,10 +4,11 @@
# Authors:
# Mike Bonnet <mikeb@redhat.com>
from __future__ import absolute_import
from koji import PluginError
from koji.context import context
from koji.plugin import callbacks, callback, ignore_error, convert_datetime
import ConfigParser
import six.moves.configparser
import logging
import qpid.messaging
import qpid.messaging.transports
@ -78,7 +79,7 @@ def get_config():
if config:
return config
config = ConfigParser.SafeConfigParser()
config = six.moves.configparser.SafeConfigParser()
config.read(CONFIG_FILE)
if not config.has_option('broker', 'timeout'):
config.set('broker', 'timeout', '60')

View file

@ -5,10 +5,11 @@
# Authors:
# Mike Bonnet <mikeb@redhat.com>
from __future__ import absolute_import
import koji
from koji.plugin import callback, ignore_error, convert_datetime
from koji.context import context
import ConfigParser
import six.moves.configparser
import logging
import json
import random
@ -269,7 +270,7 @@ def send_queued_msgs(cbtype, *args, **kws):
log = logging.getLogger('koji.plugin.protonmsg')
global CONFIG
if not CONFIG:
conf = ConfigParser.SafeConfigParser()
conf = six.moves.configparser.SafeConfigParser()
with open(CONFIG_FILE) as conffile:
conf.readfp(conffile)
CONFIG = conf

View file

@ -5,11 +5,12 @@
# Authors:
# Mike Bonnet <mikeb@redhat.com>
from __future__ import absolute_import
import koji
from koji.context import context
from koji.plugin import callback
from koji.util import rmtree
import ConfigParser
import six.moves.configparser
import fnmatch
import os
import shutil
@ -31,7 +32,7 @@ def maven_import(cbtype, *args, **kws):
filepath = kws['filepath']
if not config:
config = ConfigParser.SafeConfigParser()
config = six.moves.configparser.SafeConfigParser()
config.read(CONFIG_FILE)
name_patterns = config.get('patterns', 'rpm_names').split()
for pattern in name_patterns:

View file

@ -3,6 +3,7 @@
# plugin has a config file. This hub plugin has no config file.
from __future__ import absolute_import
from koji.context import context
from koji.plugin import export
import koji

View file

@ -1,5 +1,6 @@
from __future__ import absolute_import
import sys
import ConfigParser
import six.moves.configparser
import koji
from koji.context import context
from koji.plugin import export
@ -28,7 +29,7 @@ def saveFailedTree(buildrootID, full=False, **opts):
# read configuration only once
if config is None:
config = ConfigParser.SafeConfigParser()
config = six.moves.configparser.SafeConfigParser()
config.read(CONFIG_FILE)
allowed_methods = config.get('permissions', 'allowed_methods').split()
if len(allowed_methods) == 1 and allowed_methods[0] == '*':

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import sys
from setuptools import setup

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
from koji.plugin import export_cli, export_as
@export_as('foobar')

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
import koji

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
import shutil
import tempfile

View file

@ -5,6 +5,7 @@ import hashlib
import mock
import random
import six
from six.moves import range
try:
import unittest2 as unittest
except ImportError:

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
import six
try:

View file

@ -487,7 +487,7 @@ Finished: Thu Jan 1 00:50:00 1970
}
# need ordered dict to get same results
files = collections.OrderedDict(sorted(files.items(),
files = collections.OrderedDict(sorted(list(files.items()),
key=lambda t: t[0]))
list_task_output_mock.side_effect = [[], files, {}]

View file

@ -1,8 +1,10 @@
from __future__ import print_function
from __future__ import absolute_import
import mock
import os
import six
import sys
from six.moves import map
try:
import unittest2 as unittest
except ImportError:

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import os
import subprocess
try:

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
try:
import unittest2 as unittest
except ImportError:

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import copy
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
import os
import shutil

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import copy
import json
import mock

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import copy
import json
import mock

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import copy
import mock
import shutil

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
try:
import unittest2 as unittest
except ImportError:

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
import os
import shutil

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import os
import mock
import shutil

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
try:
import unittest2 as unittest
except ImportError:

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import copy
import mock
import shutil

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
import os
import shutil

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,5 +1,6 @@
from __future__ import absolute_import
import mock
from utils import DBQueryTestCase
from .utils import DBQueryTestCase
import koji
import kojihub

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
import koji

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
import unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import copy
import mock
try:

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
import unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import copy
import mock
import shutil

View file

@ -1,5 +1,6 @@
from __future__ import absolute_import
import mock
import xmlrpclib
import six.moves.xmlrpc_client
try:
import unittest2 as unittest
except ImportError:
@ -65,8 +66,8 @@ class TestTaskWaitResults(unittest.TestCase):
task = self.getTask(t)
task.getResult.return_value = "OK"
task.isCanceled.return_value = False
self.tasks[6].getResult.side_effect = xmlrpclib.Fault(1, "error")
with self.assertRaises(xmlrpclib.Fault):
self.tasks[6].getResult.side_effect = six.moves.xmlrpc_client.Fault(1, "error")
with self.assertRaises(six.moves.xmlrpc_client.Fault):
results = self.host_exports.taskWaitResults(parent, task_ids)
self.assertEqual(results, [])
self.tasks[6].getResult.side_effect = koji.GenericError('problem')

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
import six
try:

View file

@ -86,7 +86,7 @@ class RepoManagerTest(unittest.TestCase):
self.mgr.checkTasks()
# should have removed the close tasks
self.assertEqual(self.mgr.tasks.keys(), [101, 102])
self.assertEqual(list(self.mgr.tasks.keys()), [101, 102])
@mock.patch('time.sleep')
def test_regen_loop(self, sleep):

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
try:
import unittest2 as unittest
except ImportError:

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import datetime
try:
import unittest2 as unittest

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import ast
import os
import os.path

View file

@ -1,6 +1,8 @@
from __future__ import absolute_import
import copy
import datetime
import mock
from six.moves import range
try:
import unittest2 as unittest
except ImportError:

View file

@ -7,6 +7,7 @@ import os
import resource
import six.moves.configparser
import time
import six
try:
import unittest2 as unittest
except ImportError:
@ -795,24 +796,24 @@ class MavenUtilTestCase(unittest.TestCase):
name, release, date = 'fedora', 26, datetime.now().strftime('%Y%m%d')
data = {'name': name, 'release': release, 'date': date}
six.assertCountEqual(self, data.items(), ldict.items())
six.assertCountEqual(self, data.items(), [v for v in ldict.iteritems()])
six.assertCountEqual(self, list(data.items()), list(ldict.items()))
six.assertCountEqual(self, list(data.items()), [v for v in six.iteritems(ldict)])
name, release, date = 'rhel', 7, '20171012'
six.assertCountEqual(self, [name, release, date], ldict.values())
six.assertCountEqual(self, [name, release, date], [v for v in ldict.itervalues()])
six.assertCountEqual(self, [name, release, date], list(ldict.values()))
six.assertCountEqual(self, [name, release, date], [v for v in six.itervalues(ldict)])
data = {'name': name, 'release': release, 'date': date}
self.assertEqual(name, ldict.pop('name'))
data.pop('name')
six.assertCountEqual(self, data.items(), ldict.items())
six.assertCountEqual(self, list(data.items()), list(ldict.items()))
(key, value) = ldict.popitem()
data.pop(key)
six.assertCountEqual(self, data.items(), ldict.items())
six.assertCountEqual(self, list(data.items()), list(ldict.items()))
ldict_copy = ldict.copy()
six.assertCountEqual(self, data.items(), ldict_copy.items())
six.assertCountEqual(self, list(data.items()), list(ldict_copy.items()))
def test_LazyRecord(self):
"""Test LazyRecord object"""
@ -878,7 +879,7 @@ class MavenUtilTestCase(unittest.TestCase):
actual = koji.util.eventFromOpts(session, opts)
self.assertNotEqual(None, actual)
six.assertCountEqual(self, expect.items(), actual.items())
six.assertCountEqual(self, list(expect.items()), list(actual.items()))
# no event is matched case
opts = mock.MagicMock(event=0, ts=0, repo=0)
@ -967,6 +968,19 @@ class MavenUtilTestCase(unittest.TestCase):
self.assertNotEqual(copy.digest(), chksum.digest())
self.assertEqual(614401368, chksum.digest())
def test_to_list(self):
l = [1, 2, 3]
r = koji.util.to_list(l)
self.assertEqual(l, r)
it = iter(l)
r = koji.util.to_list(it)
self.assertEqual(l, r)
with self.assertRaises(TypeError):
koji.util.to_list(1)
class TestRmtree(unittest.TestCase):
@patch('koji.util._rmtree')

View file

@ -1,4 +1,6 @@
# coding=utf-8
from __future__ import absolute_import
from six.moves import range
try:
import unittest2 as unittest
except ImportError:

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import mock
import shutil
import tempfile

View file

@ -2,6 +2,7 @@ from __future__ import absolute_import
import random
import shutil
import six
from six.moves import range
try:
import unittest2 as unittest
except ImportError:

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import os
import sys

View file

@ -1,3 +1,4 @@
from __future__ import absolute_import
import six
import protonmsg
import tempfile
@ -8,7 +9,7 @@ except ImportError:
from mock import patch, MagicMock
from koji.context import context
from ConfigParser import SafeConfigParser
from six.moves.configparser import SafeConfigParser
class TestProtonMsg(unittest.TestCase):
def tearDown(self):

Some files were not shown because too many files have changed in this diff Show more