From 0d4f67ab5efcbac1d7c17bb9c5a76ad109d534c4 Mon Sep 17 00:00:00 2001 From: Tomas Kopecek Date: May 12 2017 09:34:17 +0000 Subject: python-modernize -f libmodernize.fixes.fix_dict_six --- diff --git a/builder/kojid b/builder/kojid index 8305034..38b267d 100755 --- a/builder/kojid +++ b/builder/kojid @@ -967,7 +967,7 @@ class BuildTask(BaseTaskHandler): archdict[a] = 1 if not archdict: raise koji.BuildError("No matching arches were found") - return archdict.keys() + return list(archdict.keys()) def choose_taskarch(self, arch, srpm, build_tag): @@ -1029,7 +1029,7 @@ class BuildTask(BaseTaskHandler): # wait for subtasks to finish failany = not getattr(self.options, 'build_arch_can_fail', False) - results = self.wait(subtasks.values(), all=True, failany=failany) + results = self.wait(list(subtasks.values()), all=True, failany=failany) # finalize import # merge data into needed args for completeBuild call @@ -1037,7 +1037,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'] @@ -1516,7 +1516,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) @@ -1976,7 +1976,7 @@ class ChainMavenTask(MultiPlatformTask): running[task_id] = package del todo[package] try: - results = self.wait(running.keys()) + results = self.wait(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. @@ -2029,8 +2029,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 = list(a.keys()) + bkeys = list(b.keys()) if sorted(akeys) != sorted(bkeys): return False for key in akeys: @@ -2191,7 +2191,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(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) @@ -2498,7 +2498,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(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) @@ -2534,7 +2534,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(list(wrapper_tasks.values()), all=True, failany=True) self.logger.debug('wrapper results: %r', results2) # add wrapper rpm results into main results @@ -2779,7 +2779,7 @@ class ImageTask(BaseTaskHandler): 'TC': 'T', } - for k, v in substitutions.iteritems(): + for k, v in six.iteritems(substitutions): if k in name: name = name.replace(k, v) if k in version: @@ -3536,7 +3536,7 @@ class BaseImageTask(OzImageTask): if len(formats) == 0: # we only want a raw disk image (no format option given) f_dict['raw'] = True - elif 'raw' not in f_dict.keys(): + elif 'raw' not in list(f_dict.keys()): f_dict['raw'] = False self.logger.debug('Image delivery plan: %s' % f_dict) return f_dict @@ -4760,7 +4760,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(list(zip(items, [1] * len(items)))) - l = m.keys() + l = list(m.keys()) l.sort() return l @@ -4805,8 +4805,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(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],)) @@ -4965,7 +4965,7 @@ class NewDistRepoTask(BaseTaskHandler): method='createdistrepo', arglist=arglist, label=arch, parent=self.id, arch='noarch') if len(subtasks) > 0 and task_opts['multilib']: - results = self.wait(subtasks.values(), all=True, failany=True) + results = self.wait(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 @@ -4981,8 +4981,8 @@ class NewDistRepoTask(BaseTaskHandler): parent=self.id, arch='noarch') # wait for 64-bit subtasks to finish data = {} - results = self.wait(subtasks.values(), all=True, failany=True) - for (arch, task_id) in subtasks.iteritems(): + results = self.wait(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])) if task_opts['multilib'] and arch in arch32s: @@ -5076,7 +5076,7 @@ class createDistRepoTask(CreaterepoTask): files.append(f) self.session.uploadWrapper('%s/%s' % (ddir, f), self.uploadpath, f) - return [self.uploadpath, files, self.sigmap.items()] + return [self.uploadpath, files, list(self.sigmap.items())] def do_multilib(self, arch, ml_arch, conf): self.repo_id = self.rinfo['id'] @@ -5256,7 +5256,7 @@ enabled=1 # select our rpms selected = {} for rpm_id in rpm_idx: - avail_keys = rpm_idx[rpm_id].keys() + avail_keys = 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 @@ -5329,7 +5329,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 = list(rpm_idx.get(rpm_id, {}).keys()) outfile.write('%s: %r\n' % (fname, avail)) outfile.close() self.session.uploadWrapper(missing_log, self.uploadpath) @@ -5544,7 +5544,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 list(defaults.keys()): defaults[name] = value elif name.upper().startswith('RLIMIT_'): defaults[name.upper()] = value diff --git a/cli/koji b/cli/koji index 48e52f7..adae47f 100755 --- a/cli/koji +++ b/cli/koji @@ -29,6 +29,7 @@ from __future__ import division import sys from six.moves import range from six.moves import zip +import six try: import krbV except ImportError: # pragma: no cover @@ -146,7 +147,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'] + categories.keys())) + categories_ordered=', '.join(sorted(['all'] + list(categories.keys()))) epilog_str = ''' Try "%(progname)s --help" for help about global options Try "%(progname)s help" to get all available commands @@ -246,7 +247,7 @@ def get_options(): assert False # pragma: no cover # update options according to local config - for name, value in result.iteritems(): + for name, value in six.iteritems(result): if getattr(options, name, None) is None: setattr(options, name, value) @@ -465,7 +466,7 @@ def watch_tasks(session,tasklist,quiet=False): rv = 1 for child in session.getTaskChildren(task_id): child_id = child['id'] - if not child_id in tasks.keys(): + if not child_id in list(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, @@ -515,7 +516,7 @@ def watch_logs(session, tasklist, opts): output = list_task_output_all_volumes(session, task_id) # convert to list of (file, volume) files = [] - for filename, volumes in output.iteritems(): + for filename, volumes in six.iteritems(output): files += [(filename, volume) for volume in volumes] if opts.log: @@ -1170,9 +1171,9 @@ def handle_maven_build(options, session, args): section=build_opts.section) except ValueError as e: parser.error(e.args[0]) - opts = params.values()[0] + opts = list(params.values())[0] if opts.pop('type', 'maven') != 'maven': - parser.error(_("Section %s does not contain a maven-build config") % params.keys()[0]) + parser.error(_("Section %s does not contain a maven-build config") % list(params.keys())[0]) source = opts.pop('scmurl') else: source = args[1] @@ -1229,9 +1230,9 @@ def handle_wrapper_rpm(options, session, args): section=build_opts.section) except ValueError as e: parser.error(e.args[0]) - opts = params.values()[0] + opts = list(params.values())[0] if opts.get('type') != 'wrapper': - parser.error(_("Section %s does not contain a wrapper-rpm config") % params.keys()[0]) + parser.error(_("Section %s does not contain a wrapper-rpm config") % list(params.keys())[0]) url = opts['scmurl'] package = opts['buildrequires'][0] target_info = session.getBuildTarget(target, strict=True) @@ -1629,7 +1630,7 @@ def handle_import(options, 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 = to_import.keys() + nvrs = list(to_import.keys()) nvrs.sort() for nvr in nvrs: to_import[nvr].sort() @@ -2091,7 +2092,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" % tags.keys()) + print("Tags: %s" % list(tags.keys())) for tag_name in tags: if tag_name == options.trashcan_tag: if options.debug: @@ -2261,7 +2262,7 @@ def handle_prune_signed_copies(options, session, args): build_space = 0 if not by_sig and options.debug: print("(build has no signatures)") - for sigkey, rpms in by_sig.iteritems(): + for sigkey, rpms in six.iteritems(by_sig): mycount = 0 archdirs = {} sigdirs = {} @@ -2308,7 +2309,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 = sigdirs.keys()[0] + dir = list(sigdirs.keys())[0] if options.test: print("Would have removed dir: %s" % dir) else: @@ -3675,35 +3676,35 @@ def handle_clone_tag(options, session, args): dstgroups[group['name']] = group #construct to-do lists. paddlist = [] # list containing new packages to be added from src tag - for (package_name, pkg) in srcpkgs.iteritems(): + for (package_name, pkg) in six.iteritems(srcpkgs): if package_name not in dstpkgs: paddlist.append(pkg) paddlist.sort(key = lambda x: x['package_name']) pdellist = [] # list containing packages no more present in dst tag - for (package_name, pkg) in dstpkgs.iteritems(): + for (package_name, pkg) in six.iteritems(dstpkgs): if package_name not in srcpkgs: pdellist.append(pkg) pdellist.sort(key = lambda x: x['package_name']) baddlist = [] # list containing new builds to be added from src tag - for (nvr, lbld) in srclblds.iteritems(): + for (nvr, lbld) in six.iteritems(srclblds): if nvr not in dstlblds: baddlist.append(lbld) baddlist.sort(key = lambda x: x['package_name']) bdellist = [] # list containing new builds to be removed from src tag - for (nvr, lbld) in dstlblds.iteritems(): + for (nvr, lbld) in six.iteritems(dstlblds): if nvr not in srclblds: bdellist.append(lbld) bdellist.sort(key = lambda x: x['package_name']) gaddlist = [] # list containing new groups to be added from src tag - for (grpname, group) in srcgroups.iteritems(): + for (grpname, group) in six.iteritems(srcgroups): if grpname not in dstgroups: gaddlist.append(group) gdellist = [] # list containing groups to be removed from src tag - for (grpname, group) in dstgroups.iteritems(): + for (grpname, group) in six.iteritems(dstgroups): if grpname not in srcgroups: gdellist.append(group) grpchanges = {} # dict of changes to make in shared groups - for (grpname, group) in srcgroups.iteritems(): + for (grpname, group) in six.iteritems(srcgroups): if grpname in dstgroups: grpchanges[grpname] = {'adds':[], 'dels':[]} # Store whether group is inherited or not @@ -4397,7 +4398,7 @@ def _print_histline(entry, **kwargs): else: return '%s.name' % key if edit: - keys = x.keys() + keys = list(x.keys()) keys.sort() y = other[-1] for key in keys: @@ -4412,7 +4413,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 = x.keys() + keys = list(x.keys()) keys.sort() # the table keys have already been represented in the base format string also_hidden = list(_table_keys[table]) @@ -4888,7 +4889,7 @@ def anon_handle_taginfo(options, session, args): print("Include all Maven archives?: %s" % (info['maven_include_all'] and 'yes' or 'no')) if 'extra' in info: print("Tag options:") - keys = info['extra'].keys() + keys = list(info['extra'].keys()) keys.sort() for key in keys: print(" %s : %s" % (key, pprint.pformat(info['extra'][key]))) @@ -7068,7 +7069,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 = maybe.keys() + maybe = list(maybe.keys()) maybe.sort() print("Suggested tags: %s" % ', '.join(maybe)) return 1 @@ -7493,7 +7494,7 @@ def handle_help(options, session, args): chosen = set(args) if options.admin: chosen.add('admin') - avail = set(categories.keys() + ['all']) + avail = set(list(categories.keys()) + ['all']) unavail = chosen - avail for arg in unavail: print("No such help category: %s" % arg) @@ -7506,7 +7507,7 @@ def handle_help(options, session, args): def list_commands(categories_chosen=None): if categories_chosen is None or "all" in categories_chosen: - categories_chosen = categories.keys() + categories_chosen = list(categories.keys()) else: # copy list since we're about to modify it categories_chosen = list(categories_chosen) diff --git a/hub/kojihub.py b/hub/kojihub.py index 07b2b2c..6133335 100644 --- a/hub/kojihub.py +++ b/hub/kojihub.py @@ -671,12 +671,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 @@ -686,17 +686,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 @@ -704,7 +704,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 @@ -1972,7 +1972,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 = """ @@ -1994,7 +1994,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 @@ -2160,7 +2160,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 list(ret.keys()) def get_active_tasks(host=None): """Return data on tasks that are yet to be run""" @@ -2410,7 +2410,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, @@ -2549,7 +2549,7 @@ def repo_references(repo_id): 'host_id': 'host_id', 'create_event': 'create_event', 'state': 'state'} - fields, aliases = list(zip(*fields.items())) + fields, aliases = list(zip(*list(fields.items()))) values = {'repo_id': repo_id} clauses = ['repo_id=%(repo_id)s', 'retire_event IS NULL'] query = QueryProcessor(columns=fields, aliases=aliases, tables=['standard_buildroot'], @@ -2914,7 +2914,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, @@ -2979,7 +2979,7 @@ def get_tag(tagInfo, strict=False, event=None): raise koji.GenericError('invalid type for tagInfo: %s' % type(tagInfo)) data = {'tagInfo': tagInfo} - fields, aliases = list(zip(*fields.items())) + fields, aliases = list(zip(*list(fields.items()))) query = QueryProcessor(columns=fields, aliases=aliases, tables=tables, joins=joins, clauses=clauses, values=data) result = query.executeOne() @@ -4964,7 +4964,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: @@ -6708,7 +6708,7 @@ def query_history(tables=None, **kwargs): fields[r_test] = '_revoked_before_event' if skip: continue - fields, aliases = list(zip(*fields.items())) + fields, aliases = list(zip(*list(fields.items()))) query = QueryProcessor(columns=fields, aliases=aliases, tables=[table], joins=joins, clauses=clauses, values=data) ret[table] = query.iterate() @@ -6847,7 +6847,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'] = list(idx.values()) ret['component_of'] = [] # find images/archives that contain the build rpms @@ -6878,7 +6878,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'] = list(idx.values()) # find images/archives that contain the build archives fields = ['archive_id'] @@ -7202,7 +7202,7 @@ def get_notification_recipients(build, tag_id, state): #FIXME - if tag_id is None, we don't have a good way to get the package owner. # using all package owners from all tags would be way overkill. - emails_uniq = dict([(x, 1) for x in emails]).keys() + emails_uniq = list(dict([(x, 1) for x in emails]).keys()) return emails_uniq def tag_notification(is_successful, tag_id, from_id, build_id, user_id, ignore_success=False, failure_msg=''): @@ -7225,7 +7225,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 = 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 @@ -7439,8 +7439,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 = list(self.data.keys()) + columns.extend(list(self.rawdata.keys())) parts.append("(%s) " % ', '.join(columns)) values = [] for key in columns: @@ -7483,7 +7483,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=list(data.keys()), tables=[self.table], clauses=clauses, values=data) if query.execute(): return True @@ -8144,7 +8144,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 @@ -9952,9 +9952,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 @@ -11551,7 +11551,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: @@ -11574,7 +11574,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 list(results['files'].items()) + [('', results['logs'])]: for filename in files: if reldir: relpath = os.path.join(reldir, filename) @@ -11606,7 +11606,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 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)) @@ -11762,7 +11762,7 @@ class HostExports(object): maven_buildroot_id = maven_results['buildroot_id'] maven_task_dir = koji.pathinfo.task(maven_task_id) # import the build output - 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: @@ -11910,7 +11910,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 @@ -12136,7 +12136,7 @@ class HostExports(object): for dep in extra_deps: if isinstance(dep, (int, long)): 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('/') @@ -12169,7 +12169,7 @@ class HostExports(object): logger.error("Current build is %s, new build is %s.", idx_build, archive['build_id']) maven_build_index[archive['group_id']][archive['artifact_id']][archive['version']] = archive['build_id'] - ignore.extend(task_deps.values()) + ignore.extend(list(task_deps.values())) SNAPSHOT_RE = re.compile(r'-\d{8}\.\d{6}-\d+') ignore_by_label = {} @@ -12222,7 +12222,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), 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' % \ @@ -12300,7 +12300,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) diff --git a/hub/kojixmlrpc.py b/hub/kojixmlrpc.py index f10a120..1f3ffd0 100644 --- a/hub/kojixmlrpc.py +++ b/hub/kojixmlrpc.py @@ -112,7 +112,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 @@ -169,7 +169,7 @@ class HandlerRegistry(object): return args def system_listMethods(self): - return self.funcs.keys() + return list(self.funcs.keys()) def system_methodSignature(self, method): #it is not possible to autogenerate this data @@ -515,7 +515,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: @@ -577,12 +577,12 @@ def get_policy(opts, plugins): for plugin_name in opts.get('Plugins', '').split(): alltests.append(koji.policy.findSimpleTests(vars(plugins.get(plugin_name)))) 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, six.string_types): if pname != test.policy: diff --git a/hub/rpmdiff b/hub/rpmdiff index 5972377..b11c300 100755 --- a/hub/rpmdiff +++ b/hub/rpmdiff @@ -27,6 +27,7 @@ import itertools import sys, getopt from six.moves import zip +import six class Rpmdiff: @@ -113,8 +114,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() for f in files: diff --git a/koji/__init__.py b/koji/__init__.py index 691e290..653ef43 100644 --- a/koji/__init__.py +++ b/koji/__init__.py @@ -631,11 +631,11 @@ class RawHeader(object): print("Store at offset %d (%0x)" % (store, store)) #sort entries by offset, dtype #also rearrange: tag, dtype, offset, count -> offset, dtype, tag, count - order = sorted([(x[2], x[1], x[0], x[3]) for x in self.index.itervalues()]) + order = sorted([(x[2], x[1], x[0], x[3]) for x in six.itervalues(self.index)]) next = store #map some rpmtag codes tags = {} - for name, code in rpm.__dict__.iteritems(): + for name, code in six.iteritems(rpm.__dict__): if name.startswith('RPMTAG_') and isinstance(code, int): tags[code] = name[7:].lower() for entry in order: @@ -1137,7 +1137,7 @@ def parse_pom(path=None, contents=None): xml.sax.parseString(contents, handler) for field in fields: - if field not in values.keys(): + if field not in list(values.keys()): raise GenericError('could not extract %s from POM: %s' % (field, (path or ''))) return values @@ -1438,7 +1438,7 @@ def genMockConfig(name, arch, managed=False, repoid=None, tag_name=None, **opts) if opts.get('maven_opts'): mavenrc = 'export MAVEN_OPTS="%s"\n' % ' '.join(opts['maven_opts']) if opts.get('maven_envs'): - for name, val in opts['maven_envs'].iteritems(): + for name, val in six.iteritems(opts['maven_envs']): mavenrc += 'export %s="%s"\n' % (name, val) if mavenrc: files['etc/mavenrc'] = mavenrc @@ -1501,10 +1501,10 @@ name=build """ % locals()) parts.append("\n") - for key, value in config_opts.iteritems(): + for key, value in six.iteritems(config_opts): parts.append("config_opts[%r] = %r\n" % (key, value)) parts.append("\n") - for key, value in plugin_conf.iteritems(): + for key, value in six.iteritems(plugin_conf): parts.append("config_opts['plugin_conf'][%r] = %r\n" % (key, value)) parts.append("\n") @@ -1512,14 +1512,14 @@ name=build # This line is REQUIRED for mock to work if bind_opts defined. parts.append("config_opts['internal_dev_setup'] = False\n") for key in bind_opts.keys(): - for mnt_src, mnt_dest in bind_opts.get(key).iteritems(): + for mnt_src, mnt_dest in six.iteritems(bind_opts.get(key)): parts.append("config_opts['plugin_conf']['bind_mount_opts'][%r].append((%r, %r))\n" % (key, mnt_src, mnt_dest)) parts.append("\n") - for key, value in macros.iteritems(): + for key, value in six.iteritems(macros): parts.append("config_opts['macros'][%r] = %r\n" % (key, value)) parts.append("\n") - for key, value in files.iteritems(): + for key, value in six.iteritems(files): parts.append("config_opts['files'][%r] = %r\n" % (key, value)) return ''.join(parts) @@ -2699,7 +2699,7 @@ class DBHandler(logging.Handler): values = [] data = {} record.message = record.getMessage() - for key, value in self.mapping.iteritems(): + for key, value in six.iteritems(self.mapping): value = str(value) if value.find("%(asctime)") >= 0: if self.formatter: diff --git a/koji/auth.py b/koji/auth.py index d0dc5f4..3cc845b 100644 --- a/koji/auth.py +++ b/koji/auth.py @@ -30,6 +30,7 @@ import cgi #for parse_qs from .context import context from six.moves import range from six.moves import zip +import six # 1 - load session if provided # - check uri for session id @@ -99,7 +100,7 @@ class Session(object): 'EXTRACT(EPOCH FROM update_time)': 'update_ts', 'user_id': 'user_id', } - fields, aliases = list(zip(*fields.items())) + fields, aliases = list(zip(*list(fields.items()))) q = """ SELECT %s FROM sessions WHERE id = %%(id)i @@ -528,7 +529,7 @@ class Session(object): def getPerms(self): if not self.logged_in: return [] - return self.perms.keys() + return list(self.perms.keys()) def hasPerm(self, name): if not self.logged_in: @@ -741,7 +742,7 @@ if __name__ == '__main__': print("logging in with session 1") session_info = sess.login('host/1', 'foobar', {'hostip':'127.0.0.1'}) #wrap values in lists - session_info = dict([[k, [v]] for k, v in session_info.iteritems()]) + session_info = dict([[k, [v]] for k, v in six.iteritems(session_info)]) print("Session 1: %s" % sess) print("Session 1 info: %r" % session_info) print("Creating session 2") diff --git a/koji/context.py b/koji/context.py index ef35a21..707c626 100755 --- a/koji/context.py +++ b/koji/context.py @@ -27,6 +27,7 @@ from __future__ import absolute_import import six.moves._thread from six.moves import range +import six class _data(object): pass @@ -67,7 +68,7 @@ class ThreadLocal(object): 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): diff --git a/koji/daemon.py b/koji/daemon.py index 8ae1ce7..902441a 100644 --- a/koji/daemon.py +++ b/koji/daemon.py @@ -38,6 +38,7 @@ import traceback import errno import six.moves.xmlrpc_client from six.moves import range +import six def incremental_upload(session, fname, fd, path, retries=5, logger=None): @@ -499,7 +500,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(list(self.tasks.keys())) self.session.host.updateHost(task_load=0.0, ready=False) def updateBuildroots(self, nolocal=False): @@ -530,14 +531,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, 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 @@ -769,7 +770,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() diff --git a/koji/policy.py b/koji/policy.py index ec2e119..808ad8a 100644 --- a/koji/policy.py +++ b/koji/policy.py @@ -17,8 +17,10 @@ # Authors: # Mike McLean +from __future__ import absolute_import import fnmatch import koji +import six class BaseSimpleTest(object): @@ -289,7 +291,7 @@ class SimpleRuleSet(object): index[name] = 1 index = {} _recurse(self.ruleset, index) - return index.keys() + return list(index.keys()) def _apply(self, rules, data, top=False): for tests, negate, action in rules: @@ -352,7 +354,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 diff --git a/koji/util.py b/koji/util.py index e5d0f7f..62e62fb 100644 --- a/koji/util.py +++ b/koji/util.py @@ -241,11 +241,11 @@ class LazyDict(dict): return [(key, lazy_eval(val)) for key, val in super(LazyDict, self).items()] def itervalues(self): - for val in super(LazyDict, self).itervalues(): + for val in six.itervalues(super(LazyDict, self)): yield lazy_eval(val) def iteritems(self): - for key, val in super(LazyDict, self).iteritems(): + for key, val in six.iteritems(super(LazyDict, self)): yield key, lazy_eval(val) def pop(self, key, *args, **kwargs): @@ -499,11 +499,11 @@ def tsort(parts): parts = parts.copy() result = [] while True: - level = set([name for name, deps in parts.iteritems() if not deps]) + level = set([name for name, deps in six.iteritems(parts) if not deps]) if not level: break result.append(level) - parts = dict([(name, deps - level) for name, deps in parts.iteritems() + parts = dict([(name, deps - level) for name, deps in six.iteritems(parts) if name not in level]) if parts: raise ValueError('total ordering not possible') diff --git a/plugins/hub/echo.py b/plugins/hub/echo.py index 6727d41..38c96ba 100644 --- a/plugins/hub/echo.py +++ b/plugins/hub/echo.py @@ -8,7 +8,7 @@ from koji.plugin import callbacks, callback, ignore_error import logging -@callback(*callbacks.keys()) +@callback(*list(callbacks.keys())) @ignore_error def echo(cbtype, *args, **kws): logging.getLogger('koji.plugin.echo').info('Called the %s callback, args: %s; kws: %s', diff --git a/tests/test_cli/test_edit_tag.py b/tests/test_cli/test_edit_tag.py index 3b7cbf2..f59bb48 100644 --- a/tests/test_cli/test_edit_tag.py +++ b/tests/test_cli/test_edit_tag.py @@ -1,3 +1,4 @@ +from __future__ import absolute_import import unittest import StringIO as stringio @@ -11,6 +12,7 @@ import mock from mock import call import loadcli +import six cli = loadcli.cli @@ -40,7 +42,7 @@ class TestEditTag(unittest.TestCase): args.append('--rename=' + rename) args.append('--maven-support') args.append('--include-all') - for k, x in extra.iteritems(): + for k, x in six.iteritems(extra): args.append('-x') args.append(k + '=' + str(x)) for r in remove_extra: diff --git a/tests/test_parsers.py b/tests/test_parsers.py index 3d13dda..5587ec3 100644 --- a/tests/test_parsers.py +++ b/tests/test_parsers.py @@ -137,10 +137,10 @@ class HeaderTestCase(unittest.TestCase): self.assertEqual(koji.get_header_fields(self.rpm_path, []), {}) # correct - self.assertEqual(['REQUIRES'], koji.get_header_fields(self.rpm_path, ['REQUIRES']).keys()) + self.assertEqual(['REQUIRES'], list(koji.get_header_fields(self.rpm_path, ['REQUIRES']).keys())) self.assertEqual(['PROVIDES', 'REQUIRES'], sorted(koji.get_header_fields(self.rpm_path, ['REQUIRES', 'PROVIDES']))) hdr = koji.get_rpm_header(self.rpm_path) - self.assertEqual(['REQUIRES'], koji.get_header_fields(hdr, ['REQUIRES']).keys()) + self.assertEqual(['REQUIRES'], list(koji.get_header_fields(hdr, ['REQUIRES']).keys())) def test_get_header_field_src(self): diff --git a/util/koji-gc b/util/koji-gc index 4a7e6e3..cdae6e8 100755 --- a/util/koji-gc +++ b/util/koji-gc @@ -8,6 +8,7 @@ from __future__ import absolute_import from six.moves import zip +import six try: import krbV except ImportError: # pragma: no cover @@ -535,7 +536,7 @@ def handle_trash(): by_owner = {} for binfo in to_trash: by_owner.setdefault(binfo['owner_name'], []).append(binfo) - owners = by_owner.keys() + owners = list(by_owner.keys()) owners.sort() for owner_name in owners: builds = [(b['nvr'], b) for b in by_owner[owner_name]] @@ -557,7 +558,7 @@ def handle_trash(): #best we can do currently owner = binfo['owner_id'] else: - owner = max([(n, k) for k, n in count.iteritems()])[1] + owner = max([(n, k) for k, n in six.iteritems(count)])[1] session.packageListAdd(trashcan_tag, binfo['name'], owner) session.tagBuildBypass(trashcan_tag, binfo['id'], force=True) @@ -770,7 +771,7 @@ def get_build_sigs(build, cache=False): for sig in sigs: if sig['sigkey']: keys.setdefault(sig['sigkey'], 1) - ret = build_sig_cache[build] = keys.keys() + ret = build_sig_cache[build] = list(keys.keys()) return ret def handle_prune(): @@ -830,7 +831,7 @@ def handle_prune(): pkghist.setdefault(h['name'] + '-' + h['version'], []).append(h) else: pkghist.setdefault(h['name'], []).append(h) - pkgs = pkghist.keys() + pkgs = list(pkghist.keys()) pkgs.sort() for pkg in pkgs: if not check_package(pkg): diff --git a/util/koji-shadow b/util/koji-shadow index da782bf..36b7902 100755 --- a/util/koji-shadow +++ b/util/koji-shadow @@ -25,6 +25,7 @@ from __future__ import absolute_import from six.moves import range from six.moves import zip +import six try: import krbV except ImportError: # pragma: no cover @@ -498,7 +499,7 @@ class TrackedBuild(object): log("Warning: some rpms for %s lacked buildroots:" % self.nvr) for rinfo in bad: log(" %(name)s-%(version)s-%(release)s.%(arch)s" % rinfo) - return brs.keys() + return list(brs.keys()) def getDeps(self): buildroots = self.getBuildroots() @@ -547,7 +548,7 @@ class TrackedBuild(object): # changes happened during the build startup and some subtasks got the old # repo and others the new one. base = [] - for name, brlist in bases.iteritems(): + for name, brlist in six.iteritems(bases): #We want to determine for each name if that package was present #in /all/ the buildroots or just some. #Because brlist is constructed only from elements of buildroots, we @@ -557,12 +558,12 @@ class TrackedBuild(object): #each buildroot had this as a base package base.append(name) if len(tags) > 1: - log("Warning: found multiple buildroot tags for %s: %s" % (self.nvr, tags.keys())) - counts = [(n, tag) for tag, n in tags.iteritems()] + log("Warning: found multiple buildroot tags for %s: %s" % (self.nvr, list(tags.keys()))) + counts = [(n, tag) for tag, n in six.iteritems(tags)] sort(counts) tag = counts[-1][1] else: - tag = tags.keys()[0] + tag = list(tags.keys())[0] # due bugs in used tools mainline koji instance could store empty buildroot infos for builds if len(builds) == 0: self.setState("noroot") @@ -1008,7 +1009,7 @@ class BuildTracker(object): for pkg in session.listPackages(pkgID=name): owners.setdefault(pkg['owner_id'], []).append(pkg) if owners: - order = [(len(v), k) for k, v in owners.iteritems()] + order = [(len(v), k) for k, v in six.iteritems(owners)] order.sort() owner = order[-1][1] else: @@ -1124,7 +1125,7 @@ class BuildTracker(object): log("-- %s --" % time.asctime()) self.report_brief() for state in ('broken', 'noroot', 'blocked'): - builds = self.state_idx[state].values() + builds = list(self.state_idx[state].values()) not_replaced = [b for b in builds if not b.substitute] n_replaced = len(builds) - len(not_replaced) log("%s: %i (+%i replaced)" % (state, len(not_replaced), n_replaced)) @@ -1154,7 +1155,7 @@ class BuildTracker(object): nvr = dep.substitute problem_counts.setdefault(nvr, 0) problem_counts[nvr] += 1 - order = [(c, nvr) for (nvr, c) in problem_counts.iteritems()] + order = [(c, nvr) for (nvr, c) in six.iteritems(problem_counts)] if order: order.sort() order.reverse() @@ -1165,7 +1166,7 @@ class BuildTracker(object): def report_brief(self): N = len(self.builds) - states = self.state_idx.keys() + states = list(self.state_idx.keys()) states.sort() parts = ["%s: %i" % (s, len(self.state_idx[s])) for s in states] parts.append("total: %i" % N) @@ -1237,7 +1238,7 @@ class BuildTracker(object): ret = False if options.max_jobs and len(self.state_idx['pending']) >= options.max_jobs: return ret - missing = [(b.order, b.id, b) for b in self.state_idx['missing'].itervalues()] + missing = [(b.order, b.id, b) for b in six.itervalues(self.state_idx['missing'])] missing.sort() for order, build_id, build in missing: if not self.checkBuildDeps(build): diff --git a/util/kojira b/util/kojira index a875f29..e15c149 100755 --- a/util/kojira +++ b/util/kojira @@ -20,6 +20,8 @@ # Authors: # Mike McLean +from __future__ import absolute_import +import six try: import krbV except ImportError: # pragma: no cover @@ -85,7 +87,7 @@ class ManagedRepo(object): tags = {self.tag_id : 1} for x in order: tags[x['parent_id']] = 1 - self.taglist = tags.keys() + self.taglist = list(tags.keys()) def expire(self): """Mark the repo expired""" @@ -198,9 +200,9 @@ class RepoManager(object): def printState(self): self.logger.debug('Tracking %i repos, %i child processes', len(self.repos), len(self.delete_pids)) - for tag_id, task_id in self.tasks.iteritems(): + for tag_id, task_id in six.iteritems(self.tasks): self.logger.debug("Tracking task %s for tag %s", task_id, tag_id) - for pid, desc in self.delete_pids.iteritems(): + for pid, desc in six.iteritems(self.delete_pids): self.logger.debug("Delete job %s: %r", pid, desc) def rmtree(self, path): @@ -296,7 +298,7 @@ class RepoManager(object): if session is None: session = self.session to_check = [] - repo_ids = self.repos.keys() + repo_ids = list(self.repos.keys()) for repo_id in repo_ids: repo = self.repos.get(repo_id) if repo is None: @@ -531,8 +533,8 @@ class RepoManager(object): tag_repos = {} for repo in self.repos.values(): tag_repos.setdefault(repo.tag_id, []).append(repo) - self.logger.debug("Needed tags: %r" % tags.keys()) - self.logger.debug("Current tags: %r" % tag_repos.keys()) + self.logger.debug("Needed tags: %r" % list(tags.keys())) + self.logger.debug("Current tags: %r" % list(tag_repos.keys())) #we need to determine: # - which tags need a new repo @@ -540,7 +542,7 @@ class RepoManager(object): #self.checkCurrentRepos now runs continually in a separate thread regen = [] expire_times = {} - for tag_id in tags.iterkeys(): + for tag_id in six.iterkeys(tags): covered = False for repo in tag_repos.get(tag_id,[]): if repo.current: diff --git a/vm/kojikamid.py b/vm/kojikamid.py index 87a8608..756c4f7 100755 --- a/vm/kojikamid.py +++ b/vm/kojikamid.py @@ -26,6 +26,7 @@ # kojiwind --install # in a cygwin shell. +from __future__ import absolute_import from optparse import OptionParser from six.moves.configparser import ConfigParser import os @@ -42,6 +43,7 @@ import threading import re import glob import zipfile +import six MANAGER_PORT = 7000 @@ -639,7 +641,7 @@ def stream_logs(server, handler, builds): logpath = os.path.join(build.source_dir, relpath) if logpath not in logs: logs[logpath] = (relpath, None) - for log, (relpath, fd) in logs.iteritems(): + for log, (relpath, fd) in six.iteritems(logs): if not fd: if os.path.isfile(log): try: diff --git a/www/kojiweb/index.py b/www/kojiweb/index.py index a7d8b74..85784bd 100644 --- a/www/kojiweb/index.py +++ b/www/kojiweb/index.py @@ -39,6 +39,7 @@ from kojiweb.util import _getValidTokens from koji.util import sha1_constructor from six.moves import range from six.moves import zip +import six # Convenience definition of a commonly-used sort function _sortbyname = kojiweb.util.sortByKeyFunc('name') @@ -682,7 +683,7 @@ def taskinfo(environ, taskID): values['pathinfo'] = pathinfo paths = [] # (volume, relpath) tuples - for relname, volumes in server.listTaskOutput(task['id'], all_volumes=True).iteritems(): + for relname, volumes in six.iteritems(server.listTaskOutput(task['id'], all_volumes=True)): paths += [(volume, relname) for volume in volumes] values['output'] = sorted(paths, cmp = _sortByExtAndName) if environ['koji.currentUser']: @@ -701,8 +702,8 @@ def taskstatus(environ, taskID): return '' files = server.listTaskOutput(taskID, stat=True, all_volumes=True) output = '%i:%s\n' % (task['id'], koji.TASK_STATES[task['state']]) - for filename, volumes_data in files.iteritems(): - for volume, file_stats in volumes_data.iteritems(): + for filename, volumes_data in six.iteritems(files): + for volume, file_stats in six.iteritems(volumes_data): output += '%s:%s:%s\n' % (volume, filename, file_stats['st_size']) return output @@ -2115,7 +2116,7 @@ def buildsbytarget(environ, days='7', start=None, order='-builds'): if builds > maxBuilds: maxBuilds = builds - kojiweb.util.paginateList(values, targets.values(), start, 'targets', 'target', order) + kojiweb.util.paginateList(values, list(targets.values()), start, 'targets', 'target', order) values['order'] = order diff --git a/www/kojiweb/wsgi_publisher.py b/www/kojiweb/wsgi_publisher.py index c775877..5140625 100644 --- a/www/kojiweb/wsgi_publisher.py +++ b/www/kojiweb/wsgi_publisher.py @@ -426,7 +426,7 @@ class Dispatcher(object): if isinstance(result, six.string_types): headers.setdefault('content-length', ('Content-Length', str(len(result)))) headers.setdefault('content-type', ('Content-Type', 'text/html')) - headers = headers.values() + extra + headers = list(headers.values()) + extra self.logger.debug("Headers:") self.logger.debug(koji.util.LazyString(pprint.pformat, [headers])) start_response(status, headers)