From 8fc7ce395e1d9370896fe7a14e0128177fcd8c4f Mon Sep 17 00:00:00 2001 From: Papoteur Date: Sun, 29 May 2016 12:07:58 +0200 Subject: Add a retry with building srpm in case of error in getrelease when creating a srpm. --- MgaRepo/log.py | 124 +++++++++++++++++++++++++++++++++++++---------------- MgaRepo/rpmutil.py | 70 ++++++++++++++++++------------ 2 files changed, 128 insertions(+), 66 deletions(-) diff --git a/MgaRepo/log.py b/MgaRepo/log.py index e02547f..fab7d6e 100644 --- a/MgaRepo/log.py +++ b/MgaRepo/log.py @@ -19,7 +19,8 @@ import subprocess locale.setlocale(locale.LC_ALL, "C") -def getrelease(pkgdirurl, rev=None, macros=[], exported=None): + +def getrelease(pkgdirurl, rev=None, macros=[], exported=None, create=False): """Tries to obtain the version-release of the package for a yet-not-markrelease revision of the package. @@ -30,38 +31,84 @@ def getrelease(pkgdirurl, rev=None, macros=[], exported=None): svn = SVN() pkgcurrenturl = os.path.join(pkgdirurl, "current") specurl = os.path.join(pkgcurrenturl, "SPECS") - if exported is None: - tmpdir = tempfile.mktemp() - svn.export(specurl, tmpdir, rev=rev) - else: - tmpdir = os.path.join(exported, "SPECS") - try: - found = glob.glob(os.path.join(tmpdir, "*.spec")) - if not found: - raise Error("no .spec file found inside %s" % specurl) - specpath = found[0] - options = rpm_macros_defs(macros) - command = (("rpm -q --qf '%%{EPOCH}:%%{VERSION}-%%{RELEASE}\n' " - "--specfile %s %s") % - (specpath, options)) - output = get_output_exec(command) - releases = output.split() + srpmurl = os.path.join(pkgcurrenturl, "SRPMS") + if not create: + if exported is None: + tmpdir = tempfile.mktemp() + svn.export(specurl, tmpdir, rev=rev) + else: + tmpdir = os.path.join(exported, "SPECS") try: - epoch, vr = releases[0].split(":", 1) - version, release = vr.split("-", 1) - except ValueError: - raise Error("Invalid command output: %s: %s" % \ - (command, output)) - #XXX check if this is the right way: - if epoch == "(none)": - ev = version + found = glob.glob(os.path.join(tmpdir, "*.spec")) + if not found: + raise Error("no .spec file found inside %s" % specurl) + specpath = found[0] + options = rpm_macros_defs(macros) + command = (("rpm -q --qf '%%{EPOCH}:%%{VERSION}-%%{RELEASE}\n' " + "--specfile %s %s") % + (specpath, options)) + pipe = subprocess.Popen(command, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, shell=True) + pipe.wait() + output = pipe.stdout.read().decode('utf8') + error = pipe.stderr.read().decode('utf8') + if pipe.returncode != 0: + raise Error("Error in command %s: %s" % (command, error)) + releases = output.split() + try: + epoch, vr = releases[0].split(":", 1) + version, release = vr.split("-", 1) + except ValueError: + raise Error("Invalid command output: %s: %s" % \ + (command, output)) + #XXX check if this is the right way: + if epoch == "(none)": + ev = version + else: + ev = epoch + ":" + version + return ev, release + finally: + if exported is None and os.path.isdir(tmpdir): + shutil.rmtree(tmpdir) + else: + if exported is None: + tmpdir = tempfile.mktemp() + svn.export(specurl, tmpdir, rev=rev) else: - ev = epoch + ":" + version - return ev, release - finally: - if exported is None and os.path.isdir(tmpdir): - shutil.rmtree(tmpdir) - + tmpdir = os.path.join(exported, "SRPMS") + try: + found = glob.glob(os.path.join(srpmurl, "*.src.rpm")) + if not found: + raise Error("no .src.rpm file found inside %s" % srpmurl) + srpmpath = found[0] + options = rpm_macros_defs(macros) + command = (("rpm -qp --qf '%%{EPOCH}:%%{VERSION}-%%{RELEASE}\n' " + " %s %s") % + (srpmpath, options)) + pipe = subprocess.Popen(command, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, shell=True) + pipe.wait() + output = pipe.stdout.read().decode('utf8') + error = pipe.stderr.read().decode('utf8') + if pipe.returncode != 0: + raise Error("Error in command %s: %s" % (command, error)) + releases = output.split() + try: + epoch, vr = releases[0].split(":", 1) + version, release = vr.split("-", 1) + except ValueError: + raise Error("Invalid command output: %s: %s" % \ + (command, output)) + #XXX check if this is the right way: + if epoch == "(none)": + ev = version + else: + ev = epoch + ":" + version + return ev, release + finally: + if exported is None and os.path.isdir(tmpdir): + shutil.rmtree(tmpdir) + class _Revision: lines = [] date = None @@ -390,7 +437,7 @@ def parse_markrelease_log(relentry): def svn2rpm(pkgdirurl, rev=None, size=None, submit=False, - template=None, macros=[], exported=None): + template=None, macros=[], exported=None, create=False): concat = config.get("log", "concat", "").split() revoffset = get_revision_offset() svn = SVN() @@ -454,7 +501,7 @@ def svn2rpm(pkgdirurl, rev=None, size=None, submit=False, # if they are not submitted yet, what we have to do is to add # a release/version number from getrelease() version, release = getrelease(pkgdirurl, macros=macros, - exported=exported) + exported=exported, create=create) toprelease = make_release(entries=notsubmitted, released=False, version=version, release=release) releases.append(toprelease) @@ -561,7 +608,7 @@ def get_old_log(pkgdirurl): def get_changelog(pkgdirurl, another=None, svn=True, rev=None, size=None, submit=False, sort=False, template=None, macros=[], exported=None, - oldlog=False): + oldlog=False, create=False): """Generates the changelog for a given package URL @another: a stream with the contents of a changelog to be merged with @@ -583,11 +630,12 @@ def get_changelog(pkgdirurl, another=None, svn=True, rev=None, size=None, parsed from there @oldlog: if set it will try to append the old changelog file defined in oldurl in mgarepo.conf + @create: if set, will use rpm -qp rpm instead of --specfile to get release number """ newlog = StringIO() if svn: rawsvnlog = svn2rpm(pkgdirurl, rev=rev, size=size, submit=submit, - template=template, macros=macros, exported=exported) + template=template, macros=macros, exported=exported, create=create) newlog.write(rawsvnlog) if another: newlog.writelines(another) @@ -600,7 +648,7 @@ def get_changelog(pkgdirurl, another=None, svn=True, rev=None, size=None, return newlog def specfile_svn2rpm(pkgdirurl, specfile, rev=None, size=None, - submit=False, sort=False, template=None, macros=[], exported=None): + submit=False, sort=False, template=None, macros=[], exported=None, create=False): with open(specfile, encoding = 'utf-8') as fi: spec, oldchlog = split_spec_changelog(fi) another = None @@ -609,14 +657,14 @@ def specfile_svn2rpm(pkgdirurl, specfile, rev=None, size=None, 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) + exported=exported, oldlog=True, create=create) with open(specfile, "w", encoding='utf-8') as fo: fo.writelines(spec) fo.write("\n\n%changelog\n") fo.writelines(chlog) if __name__ == "__main__": - l = svn2rpm(sys.argv[1]) + l = svn2rpm(sys.argv[1], create=True) print(l) # vim:et:ts=4:sw=4 diff --git a/MgaRepo/rpmutil.py b/MgaRepo/rpmutil.py index 8c00da9..01f6fa2 100644 --- a/MgaRepo/rpmutil.py +++ b/MgaRepo/rpmutil.py @@ -55,6 +55,32 @@ def rev_touched_url(url, rev): touched = True return touched +def cp_srpms(revision, revname, geturl, targetdirs, srpmsdir, verbose): + 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 + def get_srpm(pkgdirurl, mode = "current", targetdirs = None, @@ -111,49 +137,37 @@ def get_srpm(pkgdirurl, if not speclist: raise Error("no spec files found") spec = speclist[0] + + defs = rpm_macros_defs(macros) + sourcecmd = config.get("helper", "rpmbuild", "rpmbuild") + if packager: + packager = " --define 'packager %s'" % packager if svnlog: submit = not not revision - log.specfile_svn2rpm(pkgdirurl, spec, revision, submit=submit, + try: + log.specfile_svn2rpm(pkgdirurl, spec, revision, submit=submit, template=template, macros=macros, exported=tmpdir) + except: + 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)) + cp_srpms(revision, revname, geturl, targetdirs, srpmsdir, verbose) + log.specfile_svn2rpm(pkgdirurl, spec, revision, submit=submit, + template=template, macros=macros, exported=tmpdir, create=True) + 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) + targetsrpms = cp_srpms(revision, revname, geturl, targetdirs, srpmsdir, verbose) return targetsrpms finally: if os.path.isdir(tmpdir): -- cgit v1.2.1 From f1146cc517d084f69a1ac82dc99248637df8635d Mon Sep 17 00:00:00 2001 From: Papoteur Date: Sun, 29 May 2016 12:30:10 +0200 Subject: Suppress prefix with no effect on import command. --- MgaRepo/util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MgaRepo/util.py b/MgaRepo/util.py index 52ae50f..538eae8 100644 --- a/MgaRepo/util.py +++ b/MgaRepo/util.py @@ -65,7 +65,7 @@ def execcmd(*cmd, **kwargs): break output = err.getvalue() else: - status = os.system(prefix + cmdstr) + status = os.system(cmdstr) output = "" else: status, output = commands_getstatusoutput(prefix + cmdstr) -- cgit v1.2.1 From 0c06e003bad8372d90ebb56bf5131328b7260dfc Mon Sep 17 00:00:00 2001 From: Papoteur Date: Sun, 29 May 2016 12:37:18 +0200 Subject: Prepare 1.12.2 --- CHANGES | 4 ++++ Makefile | 2 +- mgarepo | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 290652d..0db1dbe 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,7 @@ +* 1.12.2 +- Suppress prefix with no effect on import command (cf 1.12.0) +- Add a retry with building srpm in case of error in getrelease when creating a srpm + * 1.12.1 - prefix the command svn log without LC_ALL=C (mga#73) diff --git a/Makefile b/Makefile index e54cd6f..84eb8e8 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ PACKAGE = mgarepo -VERSION = 1.12.1 +VERSION = 1.12.2 .PHONY: all $(DIRS) clean clean: diff --git a/mgarepo b/mgarepo index be20f81..3607c8f 100755 --- a/mgarepo +++ b/mgarepo @@ -4,7 +4,7 @@ from MgaRepo.command import * import getopt import sys -VERSION="1.12.1" +VERSION="1.12.2" HELP = """\ Usage: mgarepo COMMAND [COMMAND ARGUMENTS] -- cgit v1.2.1 From 27d87188fe08eea91ae26c3b6aaccf05a829c25d Mon Sep 17 00:00:00 2001 From: Papoteur Date: Sun, 29 May 2016 16:46:54 +0200 Subject: Correction of a syntax for python 3 --- MgaRepo/rpmutil.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MgaRepo/rpmutil.py b/MgaRepo/rpmutil.py index 01f6fa2..769167c 100644 --- a/MgaRepo/rpmutil.py +++ b/MgaRepo/rpmutil.py @@ -65,7 +65,7 @@ def cp_srpms(revision, revname, geturl, targetdirs, srpmsdir, verbose): srpms = glob.glob(os.path.join(srpmsdir, "*.src.rpm")) if not srpms: # something fishy happened - raise Error, "no SRPMS were found at %s" % srpmsdir + raise Error("no SRPMS were found at %s" % srpmsdir) for srpm in srpms: name = os.path.basename(srpm) if revname: -- cgit v1.2.1 From 7480f7479ef24584c482143516ee17c7b58f8cde Mon Sep 17 00:00:00 2001 From: Papoteur Date: Sun, 29 May 2016 16:52:02 +0200 Subject: prepare 1.12.3 --- CHANGES | 3 +++ Makefile | 2 +- mgarepo | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 0db1dbe..e45b013 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +* 1.12.3 +- syntax correction + * 1.12.2 - Suppress prefix with no effect on import command (cf 1.12.0) - Add a retry with building srpm in case of error in getrelease when creating a srpm diff --git a/Makefile b/Makefile index 84eb8e8..8205229 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ PACKAGE = mgarepo -VERSION = 1.12.2 +VERSION = 1.12.3 .PHONY: all $(DIRS) clean clean: diff --git a/mgarepo b/mgarepo index 3607c8f..7df3daf 100755 --- a/mgarepo +++ b/mgarepo @@ -4,7 +4,7 @@ from MgaRepo.command import * import getopt import sys -VERSION="1.12.2" +VERSION="1.12.3" HELP = """\ Usage: mgarepo COMMAND [COMMAND ARGUMENTS] -- cgit v1.2.1