aboutsummaryrefslogtreecommitdiffstats
path: root/MgaRepo/rpmutil.py
diff options
context:
space:
mode:
authorPapoteur <papoteur@mageialinux-online.org>2016-11-05 15:38:08 +0100
committerPapoteur <papoteur@mageialinux-online.org>2016-11-05 15:38:08 +0100
commitf372e877cb32a6c009e29ff9ddf1a14f8b2fd216 (patch)
treebe50c72a1a883aa07cad805d44a0cda906285997 /MgaRepo/rpmutil.py
parent8f51e35c875c9cbb4637cbf8796ee66a871ba57f (diff)
downloadmgarepo-f372e877cb32a6c009e29ff9ddf1a14f8b2fd216.tar
mgarepo-f372e877cb32a6c009e29ff9ddf1a14f8b2fd216.tar.gz
mgarepo-f372e877cb32a6c009e29ff9ddf1a14f8b2fd216.tar.bz2
mgarepo-f372e877cb32a6c009e29ff9ddf1a14f8b2fd216.tar.xz
mgarepo-f372e877cb32a6c009e29ff9ddf1a14f8b2fd216.zip
Revert to 1.12.3 state
Diffstat (limited to 'MgaRepo/rpmutil.py')
-rw-r--r--MgaRepo/rpmutil.py293
1 files changed, 73 insertions, 220 deletions
diff --git a/MgaRepo/rpmutil.py b/MgaRepo/rpmutil.py
index 78e086d..769167c 100644
--- a/MgaRepo/rpmutil.py
+++ b/MgaRepo/rpmutil.py
@@ -1,10 +1,9 @@
+#!/usr/bin/python3
from MgaRepo import Error, config
from MgaRepo import mirror, layout, log, binrepo
-from MgaRepo.simplerpm import SRPM
-from MgaRepo.util import execcmd, CommandError
-from MgaRepo.git import GIT
from MgaRepo.svn import SVN
-from MgaRepo.vcsutil import detectVCS
+from MgaRepo.simplerpm import SRPM
+from MgaRepo.util import execcmd
from MgaRepo.command import default_parent
import rpm
import urllib.parse
@@ -16,12 +15,12 @@ import sys
import os
def get_spec(pkgdirurl, targetdir=".", submit=False):
- svn = detectVCS(pkgdirurl)
+ svn = SVN()
tmpdir = tempfile.mktemp()
try:
geturl = layout.checkout_url(pkgdirurl, append_path="SPECS")
mirror.info(geturl)
- svn.export(geturl, tmpdir)
+ svn.export("'%s'" % geturl, tmpdir)
speclist = glob.glob(os.path.join(tmpdir, "*.spec"))
if not speclist:
raise Error("no spec files found")
@@ -34,9 +33,14 @@ def get_spec(pkgdirurl, targetdir=".", submit=False):
if os.path.isdir(tmpdir):
shutil.rmtree(tmpdir)
+def rpm_macros_defs(macros):
+ defs = ("--define \"%s %s\"" % macro for macro in macros)
+ args = " ".join(defs)
+ return args
+
#FIXME move it to another module
def rev_touched_url(url, rev):
- svn = detectVCS(url)
+ svn = SVN()
info = svn.info2(url)
if info is None:
raise Error("can't fetch svn info about the URL: %s" % url)
@@ -91,21 +95,16 @@ def get_srpm(pkgdirurl,
template = None,
macros = [],
verbose = 0,
- strict = False,
- fullnames = False):
- svn = detectVCS(pkgdirurl)
+ strict = False):
+ svn = SVN()
tmpdir = tempfile.mktemp()
- topdir = "_topdir %s" % tmpdir
- builddir = "_builddir %s/%s" % (tmpdir, "BUILD")
- rpmdir = "_rpmdir %s/%s" % (tmpdir, "RPMS")
- sourcedir = "_sourcedir %s/%s" % (tmpdir, "SOURCES")
- specdir = "_specdir %s/%s" % (tmpdir, "SPECS")
- srcrpmdir = "_srcrpmdir %s/%s" % (tmpdir, "SRPMS")
- patchdir = "_patchdir %s/%s" % (tmpdir, "SOURCES")
- temppath = "_tmppath %s" % (tmpdir)
-
- rpmdefs = [("--define", expr) for expr in (topdir, builddir, rpmdir,
- sourcedir, specdir, srcrpmdir, patchdir, temppath)]
+ 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":
@@ -134,29 +133,24 @@ def get_srpm(pkgdirurl,
if config.getbool("srpm", "run-prep", False):
makefile = os.path.join(tmpdir, "Makefile")
if os.path.exists(makefile):
- execcmd(("make", "-C", tmpdir, "srpm-prep"))
+ execcmd("make", "-C", tmpdir, "srpm-prep")
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
- sourcecmd = config.get("helper", "rpmbuild", "rpmbuild")
- args = [sourcecmd, "-bs", "--nodeps"]
- for pair in rpmdefs:
- args.extend(pair)
- for pair in macros:
- args.extend(("--define", "%s %s" % pair))
- args.append(spec)
if svnlog:
submit = not not revision
try:
log.specfile_svn2rpm(pkgdirurl, spec, revision, submit=submit,
- template=template, macros=macros, exported=tmpdir, fullnames=fullnames)
+ template=template, macros=macros, exported=tmpdir)
except:
- #cmd = [sourcecmd, topdir, builddir, rpmdir, sourcedir, specdir
- execcmd(args)
+ 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)
@@ -168,15 +162,9 @@ def get_srpm(pkgdirurl,
if status != 0:
raise Error("script %s failed" % script)
- try:
- execcmd(args)
- except CommandError as e:
- if config.getbool("global", "verbose"):
- cmdline = e.cmdline + "\n"
- else:
- cmdline = ""
- raise Error("error while creating the source RPM "
- "(with %s):\n%s%s" % (sourcecmd, cmdline, e.output))
+ 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 = cp_srpms(revision, revname, geturl, targetdirs, srpmsdir, verbose)
@@ -187,7 +175,7 @@ def get_srpm(pkgdirurl,
def patch_spec(pkgdirurl, patchfile, log=""):
#FIXME use get_spec
- svn = detectVCS(pkgdirurl)
+ svn = SVN()
tmpdir = tempfile.mktemp()
try:
geturl = layout.checkout_url(pkgdirurl, append_path="SPECS")
@@ -196,7 +184,7 @@ def patch_spec(pkgdirurl, patchfile, log=""):
if not speclist:
raise Error("no spec files found")
spec = speclist[0]
- status, output = execcmd(["patch", spec, patchfile])
+ status, output = execcmd("patch", spec, patchfile)
if status != 0:
raise Error("can't apply patch:\n%s\n" % output)
else:
@@ -207,6 +195,7 @@ def patch_spec(pkgdirurl, patchfile, log=""):
def put_srpm(srpmfile, markrelease=False, striplog=True, branch=None,
baseurl=None, baseold=None, logmsg=None, rename=True):
+ svn = SVN()
srpm = SRPM(srpmfile)
tmpdir = tempfile.mktemp()
if baseurl:
@@ -214,7 +203,6 @@ def put_srpm(srpmfile, markrelease=False, striplog=True, branch=None,
else:
pkgurl = layout.package_url(srpm.name, distro=branch,
mirrored=False)
- svn = detectVCS(pkgurl)
print("Importing package to %s" % pkgurl)
try:
if srpm.epoch:
@@ -276,9 +264,9 @@ def put_srpm(srpmfile, markrelease=False, striplog=True, branch=None,
svn.remove(entrypath)
# Copy all files
- execcmd(["cp", "-rf", uspecsdir, currentdir])
+ execcmd("cp -rlf", uspecsdir, currentdir)
if os.path.isdir(usourcesdir):
- execcmd(["cp", "-rlf", usourcesdir, currentdir])
+ execcmd("cp -rlf", usourcesdir, currentdir)
# Add new entries
for entry in [x for x in uspecsentries
@@ -367,106 +355,8 @@ def put_srpm(srpmfile, markrelease=False, striplog=True, branch=None,
log="Copying release %s-%s to releases/ directory." %
(version, srpm.release))
-def build_rpm(build_cmd="b",
- verbose=True,
- rpmlint=True,
- short_circuit=False,
- packager = None,
- installdeps = True,
- use_dnf = False,
- svnlog = False,
- fullnames = True,
- macros = [],
- **rpmargs):
- top = os.getcwd()
- topdir = "_topdir %s" % top
- builddir = "_builddir %s/%s" % (top, "BUILD")
- rpmdir = "_rpmdir %s/%s" % (top, "RPMS")
- sourcedir = "_sourcedir %s/%s" % (top, "SOURCES")
- specdir = "_specdir %s/%s" % (top, "SPECS")
- srcrpmdir = "_srcrpmdir %s/%s" % (top, "SRPMS")
- patchdir = "_patchdir %s/%s" % (top, "SOURCES")
-
- build = os.path.join(top, "BUILD")
- if not os.path.exists(build):
- os.mkdir(build)
- specsdir = os.path.join(top, "SPECS")
- speclist = glob.glob(os.path.join(specsdir, "*.spec"))
- if not speclist:
- raise Error("no spec files found")
- spec = speclist[0]
-
- # If we're building package with %changelog, we'll make a temporary
- # copy of the spec file with %changelog applied that we'll use for
- # building. This way we avoid modifying files in repository.
- # TODO: implement support for external changelog in rpm
- if svnlog:
- vcs = detectVCS(top)
- specsdir = tempfile.mkdtemp()
- shutil.copy(spec, specsdir)
- specdir = "_specdir "+specsdir
- spec = os.path.join(specsdir,os.path.basename(spec))
- info = vcs.info2(top)
- pkgdirurl = layout.remove_current(info["URL"])
- log.specfile_svn2rpm(pkgdirurl, spec, rev=None, submit=False,
- template=None, macros=macros, exported=top, fullnames=fullnames)
-
- rpmdefs = [("--define", expr) for expr in (topdir, builddir, rpmdir,
- sourcedir, specdir, srcrpmdir, patchdir)]
-
- if packager:
- rpmdefs.append(("--define", "packager %s" % packager))
-
- if rpmlint:
- rpmdefs.append(("--define", "_build_pkgcheck_set %{_bindir}/rpmlint"))
-
- rpmbuild = config.get("helper", "rpmbuild", "rpmbuild")
- args = [rpmbuild, spec]
- if short_circuit:
- args.append("--short-circuit")
- for pair in rpmdefs:
- args.extend(pair)
- for pair in macros:
- args.extend(("--define", "%s %s" % pair))
- args.extend(("--define", "_disable_source_fetch 0"))
- args.extend(*rpmargs.values())
- os.environ["LC_ALL"] = "C"
- # First check whether dependencies are satisfied
- status, output = execcmd(*args + ["--nobuild"], show=verbose, collecterr=True, noerror=True)
- if status:
- if "error: Failed build dependencies:" in output:
- if not installdeps:
- raise Error("Automatic installation of dependencies disabled,"
- "aborting...")
- else:
- if verbose:
- print("Installing missing build dependencies")
- if use_dnf:
- pkg_mgr_base = ["dnf"]
- pkg_mgr_builddep = pkg_mgr_base + ["--assume-yes", "--setopt=install_weak_deps=False", "builddep"]
- else:
- pkg_mgr_base = ["urpmi"]
- pkg_mgr_builddep = pkg_mgr_base + ["--auto", "--buildrequires", "--no-recommends"]
- if os.getuid() != 0:
- print("Trying to obtain privileges for installing build dependencies:")
- sudocheck = ["sudo", "-l"] + pkg_mgr_base
- status, output = execcmd(*sudocheck, collecter=True, noerror=True)
- if status:
- raise Error("%s\nFailed! Cannot proceed without, aborting..."
- % output.splitlines()[-1])
- cmd_base = ["sudo"] + pkg_mgr_builddep
- else:
- cmd_base = pkg_mgr_builddep
- cmd = cmd_base + [spec]
- status, output = execcmd(*cmd, show=verbose, collecter=True, noerror=True)
-
- status, output = execcmd(*args + ["-b"+build_cmd], show=verbose)
- if svnlog:
- if os.path.isdir(specsdir):
- shutil.rmtree(specsdir)
-
def create_package(pkgdirurl, log="", verbose=0):
- svn = detectVCS(pkgdirurl)
+ svn = SVN()
tmpdir = tempfile.mktemp()
try:
basename = layout.package_name(pkgdirurl)
@@ -507,7 +397,7 @@ revision: %s
return log
def mark_release(pkgdirurl, version, release, revision):
- svn = detectVCS(pkgdirurl)
+ svn = SVN()
releasesurl = layout.checkout_url(pkgdirurl, releases=True)
versionurl = "/".join([releasesurl, version])
releaseurl = "/".join([versionurl, release])
@@ -529,7 +419,7 @@ def mark_release(pkgdirurl, version, release, revision):
log=markreleaselog)
def check_changed(pkgdirurl, all=0, show=0, verbose=0):
- svn = detectVCS(pkgdirurl)
+ svn = SVN()
if all:
baseurl = pkgdirurl
packages = []
@@ -600,48 +490,33 @@ def checkout(pkgdirurl, path=None, revision=None, branch=None, distro=None, back
if path is None:
path = layout.package_name(pkgdirurl)
mirror.info(current, write=True)
- svn = detectVCS(pkgdirurl)
+ svn = SVN()
svn.checkout(current, path, rev=revision, show=1)
if not spec:
binrepo.download_binaries(path)
-def clone(pkgdirurl, path=None, revision=None, branch=None, distro=None, backports=None,
- spec=False, fullnames = True, bindownload = True):
- o_pkgdirurl = pkgdirurl
- pkgdirurl = layout.package_url(o_pkgdirurl, distro=distro, backports=backports)
- append = None
- if spec:
- append = "SPECS"
- current = layout.checkout_url(pkgdirurl, branch=branch, backports=backports,
- append_path=append)
- if path is None:
- path = layout.package_name(pkgdirurl)
- mirror.info(current, write=True)
- git = GIT()
- git.clone(current, path, fullnames=fullnames, show=1)
- if not spec and bindownload:
- binrepo.download_binaries(path)
-
-def getpkgtopdir(basedir=os.path.curdir):
- vcs = detectVCS(basedir)
- if vcs:
- basedir = os.path.relpath(vcs.get_topdir())
- if ispkgtopdir(basedir, vcs_dirname=vcs.vcs_dirname):
- return basedir
- raise Error("can't find top package directories SOURCES and SPECS")
-
-def ispkgtopdir(path=None, vcs_dirname=None):
+def getpkgtopdir(basedir=None):
+ #FIXME this implementation doesn't work well with relative path names,
+ # which is something we need in order to have a friendlier output
+ if basedir is None:
+ basedir = os.path.curdir
+ while not ispkgtopdir(basedir):
+ if os.path.abspath(basedir) == "/":
+ raise Error("can't find top package directories SOURCES and SPECS")
+ basedir = os.path.join(basedir, os.path.pardir)
+ if basedir.startswith("./"):
+ basedir = basedir[2:]
+ return basedir
+
+def ispkgtopdir(path=None):
if path is None:
path = os.getcwd()
names = os.listdir(path)
- if not vcs_dirname:
- vcs = detectVCS(path)
- vcs_dirname = vcs.vcs_dirname
- return (vcs_dirname in names and "SPECS" in names and "SOURCES" in names)
+ return (".svn" in names and "SPECS" in names and "SOURCES" in names)
def sync(dryrun=False, commit=False, download=False):
+ svn = SVN()
topdir = getpkgtopdir()
- svn = detectVCS(topdir)
spath = binrepo.sources_path(topdir)
binrepoentries = binrepo.parse_sources(spath)
# run svn info because svn st does not complain when topdir is not an
@@ -723,7 +598,7 @@ def sync(dryrun=False, commit=False, download=False):
upload([path], commit=commit)
def commit(target=".", message=None, logfile=None):
- svn = detectVCS(target)
+ svn = SVN()
status = svn.status(target, quiet=True)
if not status:
print("nothing to commit")
@@ -758,41 +633,39 @@ def spec_sources(topdir):
return sources
def update(target=None):
- vcs = None
+ svn = SVN()
info = None
- vcs_target = None
+ svn_target = None
br_target = None
if target:
- vcs_target = target
+ svn_target = target
else:
top = getpkgtopdir()
- vcs_target = top
+ svn_target = top
br_target = top
- if vcs_target:
- vcs = detectVCS(vcs_target)
- vcs.update(vcs_target, show=True)
+ if svn_target:
+ svn.update(svn_target, show=True)
if br_target:
- if not vcs:
- vcs = detectVCS(br_target)
- info = vcs.info2(vcs_target)
- if not br_target and not vcs_target:
- raise Error("target not in %s nor in binaries "\
- "repository: %s" % (type(vcs).__name__,target))
+ info = svn.info2(svn_target)
+ if not br_target and not svn_target:
+ raise Error("target not in SVN nor in binaries "\
+ "repository: %s" % target)
url = info["URL"]
binrepo.download_binaries(br_target)
def upload(paths, commit=False):
- topdir = getpkgtopdir()
- svn = detectVCS(topdir)
for path in paths:
if os.path.isdir(path) or binrepo.is_binary(path):
+ topdir = getpkgtopdir()
binrepo.upload_binary(topdir, os.path.basename(path))
binrepo.update_sources(topdir, added=[path])
if commit:
+ svn = SVN()
silent = config.get("log", "ignore-string", "SILENT")
message = "%s: new file %s" % (silent, path)
svn.commit(binrepo.sources_path(topdir), log=message)
else:
+ svn = SVN()
svn.add(path, local=True)
if commit:
silent = config.get("log", "ignore-string", "SILENT")
@@ -801,15 +674,16 @@ def upload(paths, commit=False):
def delete(paths, commit=False):
silent = config.get("log", "ignore-string", "SILENT")
- topdir = getpkgtopdir()
- svn = detectVCS(topdir)
for path in paths:
message = "%s: delete file %s" % (silent, path)
if binrepo.is_binary(path):
+ topdir = getpkgtopdir()
binrepo.update_sources(topdir, removed=[os.path.basename(path)])
if commit:
+ svn = SVN()
svn.commit(binrepo.sources_path(topdir), log=message)
else:
+ svn = SVN()
svn.remove(path, local=True)
if commit:
svn.commit(path, log=message)
@@ -818,7 +692,7 @@ def obsolete(pkgdirurl, branch=None, distro=None, backports=None, commit=False,
o_pkgdirurl = pkgdirurl
pkgdirurl = layout.package_url(o_pkgdirurl, distro=distro, backports=backports)
pkgdest = layout.package_url(o_pkgdirurl, obsolete=True, backports=backports)
- svn = detectVCS(pkgdirurl)
+ svn = SVN()
svn.mv(pkgdirurl, pkgdest, message=log)
if commit:
svn.commit(path, log=log)
@@ -853,7 +727,7 @@ def get_submit_info(path):
if not os.path.isdir(os.path.join(path, ".svn")):
raise Error("subversion directory not found")
- svn = detectVCS(path)
+ svn = SVN()
# Now, extract the package name.
info = svn.info2(path)
@@ -892,25 +766,4 @@ def get_submit_info(path):
return name, url, max
-def get_pkg_tag(tag, path=os.path.curdir, subpkg=None):
- topdir = getpkgtopdir(path)
- speclist = glob.glob(os.path.join(topdir, "SPECS", "*.spec"))
- if not speclist:
- raise Error("no spec files found")
- specfile = speclist[0]
-
- pkg = rpm.spec(specfile)
- if subpkg is None:
- header = pkg.sourceHeader
- elif isinstance(subpkg,int):
- header = pkg.packages(subpkg)
- else:
- raise Error("Subpkg must be the index number of a package,"\
- "or None for source package")
-
- if isinstance(header[tag],bytes):
- return header[tag].decode("utf8")
- else:
- return header[tag]
-
# vim:et:ts=4:sw=4