def get_task(args): """Return the task the user specified in the first positional argument, if it is a valid task. Allow the user to enter only the first few characters if the task is unambiguous. Raise UsageError if task is unspecified, invalid, or ambiguous. """ if len(args) < 1: raise UsageError('Need task!') task = args[0] valid_tasks = [ 'koji', 'lint', 'mock', 'prebuild', 'prepare', 'quilt', 'rpmbuild' ] matching_tasks = [x for x in valid_tasks if x.startswith(task)] if len(matching_tasks) > 1: raise UsageError('Ambiguous task. Matching tasks are:' + ", ".join(matching_tasks)) elif not matching_tasks: raise UsageError('No valid task') else: real_task = matching_tasks[0] return real_task
def target_for_repo_hint(repo_hint, dver): hints = repo_hints(valid_koji_targets()) if repo_hint in hints: return hints[repo_hint]['target'] % dver else: raise UsageError("'%s' is not a valid repo.\nValid repos are: %s" % (repo_hint, ", ".join(sorted(hints.keys()))))
def set_loglevel(level_str): """Sets the log level from a string. level_str should match one of the constants defined in logging""" global log, log_consolehandler try: loglevel = int(getattr(logging, level_str.upper())) except (TypeError, AttributeError): raise UsageError("Invalid log level") log.setLevel(loglevel) log_consolehandler.setLevel(loglevel)
def koji(package_dir, koji_obj, buildopts): """koji task with an svn build.""" package_info = get_package_info(package_dir) package_name = os.path.basename(package_info['canon_url']) if not re.match("\w+", package_name): # sanity check raise Error("Package directory '%s' gives invalid package name '%s'" % (package_dir, package_name)) if not verify_package_info(package_info): raise UsageError("%s isn't a package directory " "(must have either osg/ or upstream/ dirs or both)" % (package_dir)) if not buildopts.get('scratch'): koji_obj.add_pkg(package_name) return koji_obj.build_svn(package_info['canon_url'], package_info['revision'])
def init(argv): """Initialization. Get build options and packages. """ options, args = parse_cmdline_args(argv) if options.version: print_version_and_exit() # if loglevel is passed on the command line, make it take into effect # immediately so we see debug messages in get_buildopts if options.loglevel: set_loglevel(options.loglevel) task = get_task(args) buildopts = get_buildopts(options, task) set_loglevel(buildopts.get('loglevel', 'INFO')) if len(args) < 2: raise UsageError('Need package directories for this task!') package_dirs = args[1:] return (buildopts, package_dirs, task)
svn_ok = svn.is_svn(pkg) and svn.verify_working_dir(pkg) except SVNError, err: log.info(str(err)) vcs = (git_ok and git) or (svn_ok and svn) if not vcs: print "VCS build requested but no usable VCS found for " + pkg print "Exiting" return 1 vcs.verify_correct_branch(pkg, buildopts) else: # verify package dirs for pkg in package_dirs: if not os.path.isdir(pkg): raise UsageError(pkg + " isn't a directory!") if ((not os.path.isdir(os.path.join(pkg, "osg"))) and (not os.path.isdir(os.path.join(pkg, "upstream")))): raise UsageError( pkg + " isn't a package directory " "(must have either osg/ or upstream/ dirs or both)") if (task == 'koji' and not buildopts['scratch'] and not buildopts['vcs']): raise UsageError("Non-scratch Koji builds must be from SVN!") if task == 'koji' and len(package_dirs) >= BACKGROUND_THRESHOLD: buildopts['background'] = True # main loop # HACK task_ids = []
def main(argv): """Main function.""" buildopts, package_dirs, task = init(argv) koji_obj = None mock_obj = None if task == 'allbuild': log.warning("The 'allbuild' task is deprecated. The 'koji' task now " "builds on all supported distro versions by default.") # checks if task == 'allbuild' or (task == 'koji' and buildopts['svn']): # verify svn working dirs for pkg in package_dirs: if not svn.verify_working_dir(pkg): print "Exiting" return 1 svn.verify_correct_branch(pkg, buildopts) else: # verify package dirs for pkg in package_dirs: if not os.path.isdir(pkg): raise UsageError(pkg + " isn't a directory!") if ((not os.path.isdir(os.path.join(pkg, "osg"))) and (not os.path.isdir(os.path.join(pkg, "upstream")))): raise UsageError(pkg + " isn't a package directory " "(must have either osg/ or upstream/ dirs or both)") if (task == 'koji' and not buildopts['scratch'] and not buildopts['svn']): raise UsageError("Non-scratch Koji builds must be from SVN!") # main loop # HACK task_ids = [] task_ids_by_results_dir = dict() for pkg in package_dirs: if task == 'allbuild': # allbuild is special--we ignore most options and use # a slightly different set of defaults. for dver in DVERS: dver_buildopts = buildopts.copy() dver_buildopts.update(DEFAULT_BUILDOPTS_BY_DVER[dver]) for key in ALLBUILD_ALLOWED_OPTNAMES: dver_buildopts[key] = buildopts[key] svn.koji(pkg, kojiinter.KojiInter(dver_buildopts), dver_buildopts) else: for dver in buildopts['enabled_dvers']: dver_buildopts = buildopts.copy() dver_buildopts.update(buildopts['targetopts_by_dver'][dver]) mock_obj = None koji_obj = None if task == 'koji': koji_obj = kojiinter.KojiInter(dver_buildopts) if task == 'mock': if dver_buildopts['mock_config_from_koji']: # HACK: We don't want to log in to koji just to get a mock config dver_buildopts_ = dver_buildopts.copy() dver_buildopts_['dry_run'] = True koji_obj = kojiinter.KojiInter(dver_buildopts_) mock_obj = mock.Mock(dver_buildopts, koji_obj) if buildopts['svn'] and task == 'koji': task_ids.append(svn.koji(pkg, koji_obj, dver_buildopts)) else: builder = srpm.SRPMBuild(pkg, dver_buildopts, mock_obj=mock_obj, koji_obj=koji_obj) builder.maybe_autoclean() method = getattr(builder, task) if task == 'koji': task_ids_by_results_dir.setdefault(builder.results_dir, []) task_id = method() task_ids.append(task_id) task_ids_by_results_dir[builder.results_dir].append(task_id) else: method() # end of main loop # HACK task_ids = filter(None, task_ids) if kojiinter.KojiInter.backend and task_ids: print "Koji task ids are:", task_ids for tid in task_ids: print HTTPS_KOJI_HUB + "/koji/taskinfo?taskID=" + str(tid) if not buildopts['no_wait']: kojiinter.KojiInter.backend.watch_tasks(task_ids) # TODO This is not implemented for the KojiShellInter backend # Not implemented for SVN builds since results_dir is undefined for those if buildopts['getfiles']: if buildopts['svn']: log.warning("--getfiles is only for SRPM builds") elif not isinstance(kojiinter.KojiInter.backend, kojiinter.KojiLibInter): log.warning("--getfiles is only implemented on the KojiLib backend") else: for destdir, tids in task_ids_by_results_dir.iteritems(): kojiinter.KojiInter.backend.download_results(tids, destdir) log.info("Results and logs downloaded to %s", destdir) else: if buildopts['getfiles']: log.warning("Cannot use both --getfiles and --nowait") return 0