Example #1
0
def specfile_svn2rpm(pkgdirurl, specfile, rev=None, size=None,
        submit=False, sort=False, template=None, macros=[], exported=None):
    fi = open(specfile)
    spec, oldchlog = split_spec_changelog(fi)
    fi.close()
    another = None
    if config.getbool("log", "merge-spec", False):
        another = oldchlog
    sort = sort or config.getbool("log", "sort", False)
    chlog = get_changelog(pkgdirurl, another=another, rev=rev, size=size,
                submit=submit, sort=sort, template=template, macros=macros,
                exported=exported, oldlog=True)
    fo = open(specfile, "w")
    fo.writelines(spec)
    fo.write("\n\n%changelog\n")
    fo.writelines(chlog)
    fo.close()
Example #2
0
def repository_url(mirrored=False):
    url = None
    if mirrored and config.getbool("global", "use-mirror", "yes"):
        url = config.get("global", "mirror")
    if url is None:
        url = config.get("global", "repository")
        if not url:
            # compatibility with the default_parent configuration option
            default_parent = config.get("global", "default_parent")
            if default_parent is None:
                raise Error, "you need to set the 'repository' " \
                        "configuration option on mgarepo.conf"
            url = convert_default_parent(default_parent)
    return url
Example #3
0
 def _execsvn(self, *args, **kwargs):
     localcmds = ("add", "revert", "cleanup")
     if not kwargs.get("show") and args[0] not in localcmds:
         args = list(args)
         args.append("--non-interactive")
     else:
         kwargs["geterr"] = True
     kwargs["cleanerr"] = True
     if kwargs.get("xml"):
         args.append("--xml")
     self._set_env()
     svn_command = config.get("global", "svn-command", "svn")
     cmdstr = svn_command + " " + " ".join(args)
     try:
         return execcmd(cmdstr, **kwargs)
     except Error, e:
         msg = None
         if e.args:
             if "Permission denied" in e.args[0]:
                 msg = ("It seems ssh-agent or ForwardAgent are not setup "
                        "or your username is wrong. See "
                        "https://wiki.mageia.org/en/Packagers_ssh"
                        " for more information.")
             elif "authorization failed" in e.args[0]:
                 msg = ("Note that mgarepo does not support any HTTP "
                        "authenticated access.")
         if kwargs.get("show") and \
                 not config.getbool("global", "verbose", 0):
             # svn has already dumped error messages, we don't need to
             # do it too
             if msg:
                 sys.stderr.write("\n")
                 sys.stderr.write(msg)
                 sys.stderr.write("\n")
             raise SilentError
         elif msg:
             raise Error, "%s\n%s" % (e, msg)
         raise
Example #4
0
def execcmd(*cmd, **kwargs):
    cmdstr = " ".join(cmd)
    if kwargs.get("show"):
        if kwargs.get("geterr"):
            err = StringIO()
            pstdin = kwargs.get("stdin") if kwargs.get("stdin") else None
            pipe = subprocess.Popen(cmdstr, shell=True,
                    stdout=subprocess.PIPE, stderr=subprocess.PIPE,
                    stdin=pstdin)
            of = pipe.stdout.fileno()
            ef = pipe.stderr.fileno()
            while True:
                odata = os.read(of, 8192)
                sys.stdout.write(odata)
                edata = os.read(ef, 8192)
                err.write(edata)
                sys.stderr.write(edata)
                status = pipe.poll()
                if status is not None and not (odata and edata):
                    break
            output = err.getvalue()
        else:
            status = os.system(cmdstr)
            output = ""
    else:
        status, output = commands_getstatusoutput(
                "LANG=C LANGUAGE=C LC_ALL=C "+cmdstr)
    verbose = config.getbool("global", "verbose", 0)
    if status != 0 and not kwargs.get("noerror"):
        if kwargs.get("cleanerr") and not verbose:
            raise Error, output
        else:
            raise Error, "command failed: %s\n%s\n" % (cmdstr, output)
    if verbose:
        print cmdstr
        sys.stdout.write(output)
    return status, output
Example #5
0
def get_srpm(pkgdirurl,
             mode = "current",
             targetdirs = None,
             version = None,
             release = None,
             revision = None,
             packager = "",
             revname = 0,
             svnlog = 0,
             scripts = [], 
             submit = False,
             template = None,
             macros = [],
             verbose = 0,
             strict = False):
    svn = SVN()
    tmpdir = tempfile.mktemp()
    topdir = "--define '_topdir %s'" % tmpdir
    builddir = "--define '_builddir %s/%s'" % (tmpdir, "BUILD")
    rpmdir = "--define '_rpmdir %s/%s'" % (tmpdir, "RPMS")
    sourcedir = "--define '_sourcedir %s/%s'" % (tmpdir, "SOURCES")
    specdir = "--define '_specdir %s/%s'" % (tmpdir, "SPECS")
    srcrpmdir = "--define '_srcrpmdir %s/%s'" % (tmpdir, "SRPMS")
    patchdir = "--define '_patchdir %s/%s'" % (tmpdir, "SOURCES")

    try:
        if mode == "version":
            geturl = layout.checkout_url(pkgdirurl, version=version,
                    release=release)
        elif mode == "pristine":
            geturl = layout.checkout_url(pkgdirurl, pristine=True)
        elif mode == "current" or mode == "revision":
            #FIXME we should handle revisions specified using @REV
            geturl = layout.checkout_url(pkgdirurl)
        else:
            raise Error, "unsupported get_srpm mode: %s" % mode
        strict = strict or config.getbool("submit", "strict-revision", False)
        if strict and not rev_touched_url(geturl, revision):
            #FIXME would be nice to have the revision number even when
            # revision is None
            raise Error, "the revision %s does not change anything "\
                    "inside %s" % (revision or "HEAD", geturl)
        mirror.info(geturl)
        svn.export(geturl, tmpdir, rev=revision)
        binrepo.download_binaries(tmpdir)
        srpmsdir = os.path.join(tmpdir, "SRPMS")
        os.mkdir(srpmsdir)
        specsdir = os.path.join(tmpdir, "SPECS")
        speclist = glob.glob(os.path.join(specsdir, "*.spec"))
        if config.getbool("srpm", "run-prep", False):
            makefile = os.path.join(tmpdir, "Makefile")
            if os.path.exists(makefile):
                execcmd("make", "-C", tmpdir, "srpm-prep")
        if not speclist:
            raise Error, "no spec files found"
        spec = speclist[0]
        if svnlog:
            submit = not not revision
            log.specfile_svn2rpm(pkgdirurl, spec, revision, submit=submit,
                    template=template, macros=macros, exported=tmpdir)
        for script in scripts:
            #FIXME revision can be "None"
            status, output = execcmd(script, tmpdir, spec, str(revision),
                                     noerror=1)
            if status != 0:
                raise Error, "script %s failed" % script
        if packager:
            packager = " --define 'packager %s'" % packager

        defs = rpm_macros_defs(macros)
        sourcecmd = config.get("helper", "rpmbuild", "rpmbuild")
        execcmd("%s -bs --nodeps %s %s %s %s %s %s %s %s %s %s" %
            (sourcecmd, topdir, builddir, rpmdir, sourcedir, specdir,
                srcrpmdir, patchdir, packager, spec, defs))

        # copy the generated SRPMs to their target locations
        targetsrpms = []
        urlrev = None
        if revname:
            urlrev = revision or layout.get_url_revision(geturl)
        if not targetdirs:
            targetdirs = (".",)
        srpms = glob.glob(os.path.join(srpmsdir, "*.src.rpm"))
        if not srpms:
            # something fishy happened
            raise Error, "no SRPMS were found at %s" % srpmsdir
        for srpm in srpms:
            name = os.path.basename(srpm)
            if revname:
                name = "@%s:%s" % (urlrev, name)
            for targetdir in targetdirs:
                newpath = os.path.join(targetdir, name)
                targetsrpms.append(newpath)
                if os.path.exists(newpath):
                    # should we warn?
                    os.unlink(newpath)
                shutil.copy(srpm, newpath)
                if verbose:
                    sys.stderr.write("Wrote: %s\n" %  newpath)
        return targetsrpms
    finally:
        if os.path.isdir(tmpdir):
            shutil.rmtree(tmpdir)