PR#685: Rest of automated conversion from py3 changes
Merges #685 https://pagure.io/koji/pull-request/685
This commit is contained in:
commit
147f781183
113 changed files with 505 additions and 337 deletions
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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])
|
||||
|
|
|
|||
|
|
@ -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']
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
173
hub/kojihub.py
173
hub/kojihub.py
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
11
koji/auth.py
11
koji/auth.py
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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('')
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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]')
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
|
|
|||
19
koji/util.py
19
koji/util.py
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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']]:
|
||||
|
|
|
|||
|
|
@ -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': [],
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import sys
|
||||
import time
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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] == '*':
|
||||
|
|
|
|||
1
setup.py
1
setup.py
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import sys
|
||||
from setuptools import setup
|
||||
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
from koji.plugin import export_cli, export_as
|
||||
|
||||
@export_as('foobar')
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
import koji
|
||||
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
import shutil
|
||||
import tempfile
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ import hashlib
|
|||
import mock
|
||||
import random
|
||||
import six
|
||||
from six.moves import range
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
except ImportError:
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
import six
|
||||
try:
|
||||
|
|
|
|||
|
|
@ -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, {}]
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import os
|
||||
import subprocess
|
||||
try:
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
except ImportError:
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import copy
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
import os
|
||||
import shutil
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import copy
|
||||
import json
|
||||
import mock
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import copy
|
||||
import json
|
||||
import mock
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import copy
|
||||
import mock
|
||||
import shutil
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
except ImportError:
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
import os
|
||||
import shutil
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import os
|
||||
import mock
|
||||
import shutil
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
except ImportError:
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import copy
|
||||
import mock
|
||||
import shutil
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
import os
|
||||
import shutil
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
from utils import DBQueryTestCase
|
||||
from .utils import DBQueryTestCase
|
||||
|
||||
import koji
|
||||
import kojihub
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
|
||||
import koji
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
import unittest
|
||||
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import copy
|
||||
import mock
|
||||
try:
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
import unittest
|
||||
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import copy
|
||||
import mock
|
||||
import shutil
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
import six
|
||||
try:
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
except ImportError:
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import datetime
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import ast
|
||||
import os
|
||||
import os.path
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
|
|
|||
|
|
@ -1,4 +1,6 @@
|
|||
# coding=utf-8
|
||||
from __future__ import absolute_import
|
||||
from six.moves import range
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
except ImportError:
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import mock
|
||||
import shutil
|
||||
import tempfile
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from __future__ import absolute_import
|
||||
import os
|
||||
import sys
|
||||
|
||||
|
|
|
|||
|
|
@ -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
Loading…
Add table
Add a link
Reference in a new issue