예제 #1
0
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
예제 #2
0
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()))))
예제 #3
0
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)
예제 #4
0
파일: svn.py 프로젝트: bbockelm/osg-build
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'])
예제 #5
0
파일: main.py 프로젝트: bbockelm/osg-build
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)
예제 #6
0
                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 = []
예제 #7
0
파일: main.py 프로젝트: bbockelm/osg-build
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