aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/obs/lib/rpm_spec.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/obs/lib/rpm_spec.py')
-rw-r--r--scripts/obs/lib/rpm_spec.py84
1 files changed, 84 insertions, 0 deletions
diff --git a/scripts/obs/lib/rpm_spec.py b/scripts/obs/lib/rpm_spec.py
new file mode 100644
index 0000000..a7c4379
--- /dev/null
+++ b/scripts/obs/lib/rpm_spec.py
@@ -0,0 +1,84 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright 2022 sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
+import glob
+import os
+import shutil
+import lib
+import lib.git
+
+
+def get_spec_in_path(project):
+ repo_path = lib.git.get_repo_path(project)
+ ret = glob.glob(f"{repo_path}/**/contrib/*.spec.in", recursive=True)
+ assert len(ret) < 2
+ return ret[0] if ret else None
+
+
+def get_source_name(project):
+ """ Get the name to the .tar.xz file generated by dpkg-buildpackage, that
+ we also use in the rpm spec file. This requires
+ lib.debian.move_files_to_output() to run first."""
+ path_output = lib.get_output_path(project)
+ ret = glob.glob(f"{path_output}/*.tar.*")
+ assert len(ret) == 1
+ return os.path.basename(ret[0])
+
+
+def add_depend(project, pkgname, version):
+ """ Add a 'Requires: ...' line below the 'Name:' and '%package' lines of
+ the .spec.in file.
+ :param pkgname: of the meta-package to depend on (e.g. osmocom-nightly)
+ :param version: of the meta-pkgname to depend on or None """
+ path = get_spec_in_path(project)
+
+ req_line = f"Requires: {pkgname}"
+ if version:
+ req_line += f" = {version}"
+
+ # Main package
+ lib.run_cmd(["sed", "-e", "/^Name:/a\\", "-e", req_line, "-i", path])
+
+ # Subpackages
+ lib.run_cmd(["sed", "-e", "/^%package/a\\", "-e", req_line, "-i", path])
+
+
+def generate(project, version, epoch):
+ """ Update the version and source in the .spec.in file.
+ :param version: from get-version-gen script """
+ print(f"{project}: generating rpm spec file")
+ path = get_spec_in_path(project)
+ source = get_source_name(project)
+
+ # rpmbuild doesn't allow '-' in version
+ version = version.replace("-", ".")
+
+ # Version
+ lib.run_cmd(["sed", f"s/^Version:.*/Version: {version}/", "-i", path])
+ if epoch:
+ epoch_line = f"Epoch: {epoch}"
+ lib.run_cmd(["sed", "-e", "/^Version:/a\\", "-e", epoch_line, "-i",
+ path])
+
+ # Source: add the one generated by dpkg-buildpackage and another line with
+ # rpmlintrc
+ lib.run_cmd(["sed", f"s/^Source:.*/Source: {source}/", "-i", path])
+ rpmlint_line = "Source1: rpmlintrc"
+ lib.run_cmd(["sed", "-e", "/^Source:/a\\", "-e", rpmlint_line, "-i", path])
+
+ # rpmbuild assumes the directory inside the source tarball has the version
+ # at the end, but dpkg-buildpackage doesn't generate it that way. Set the
+ # directory with "%setup -n dirname".
+ lib.run_cmd(["sed", f"s/^%setup/%setup -n {os.path.basename(project)}/",
+ "-i", path])
+
+
+def copy_to_output(project):
+ # rpm spec
+ path_spec_in = get_spec_in_path(project)
+ path_output = lib.get_output_path(project)
+ name_spec = os.path.basename(path_spec_in)[:-3] # remove '.in'
+ shutil.copy(path_spec_in, f"{path_output}/{name_spec}")
+
+ # rpmlintrc
+ shutil.copy(f"{lib.config.path_top}/data/rpmlintrc", path_output)