From 6bb1d77449226c21c2d45d44899b30f118e796f1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lorenz=20H=C3=BCdepohl?= <dev@stellardeath.org>
Date: Mon, 23 Mar 2020 13:47:34 +0100
Subject: [PATCH] Add CentOS-specific macros and Tags

---
 mpcdf_common.py                 | 28 +++++++++++++++++++++++++++-
 mpcdf_setup_software_project.py | 29 ++++++++++++++++++++++++-----
 2 files changed, 51 insertions(+), 6 deletions(-)

diff --git a/mpcdf_common.py b/mpcdf_common.py
index 9d02a6b..f8ba325 100644
--- a/mpcdf_common.py
+++ b/mpcdf_common.py
@@ -6,6 +6,7 @@ import osc
 import osc.conf
 import osc.core
 import osc.oscerr
+import textwrap
 from functools import partial
 from xml.etree import ElementTree
 
@@ -47,6 +48,23 @@ compiler_parallel_studio = {value["compiler"]: dict({"ps": key}, **value) for ke
 prjconf_start_marker = "# Autogenerated by osc mpcdf_setup_repos, do not edit till end of section\n"
 prjconf_end_marker = "# End of autogenerated section\n"
 
+centos_prjconf_tags = textwrap.dedent(
+    """
+    Prefer: perl-Error
+    Substitute: c_compiler gcc
+    Substitute: c++_compiler gcc-c++
+    Substitute: ca-certificates-mozilla ca-certificates
+    """).strip()
+
+centos_macros = textwrap.dedent(
+    """
+    # Disable all problematic automatic RPM stuff
+    # like byte-compiling (with the wrong Python version)
+    # or debug packages that fail for many binary-only packages
+    %__no_python_bytecompile 1
+    %debug_package %{nil}
+    """).strip()
+
 
 def check_for_update():
     import os
@@ -555,10 +573,18 @@ def mpcdf_setup_subproject(api_url, project, distribution, microarchitecture,
 
     prjconf_ours.append("Constraint: hostlabel {0}".format(microarchitecture))
     prjconf_ours.append("PublishFilter: ^mpcdf_.*$")
+
+    if "CentOS" in distribution:
+        prjconf_ours.append(centos_prjconf_tags)
+        extra_macros = centos_macros
+    else:
+        extra_macros = ""
+
     prjconf_ours.append("""
 Macros:
 %microarchitecture {0}
-:Macros""".format(microarchitecture))
+{1}
+:Macros""".format(microarchitecture, extra_macros))
     prjconf_ours.append("")
 
     # Remove existing repositories
diff --git a/mpcdf_setup_software_project.py b/mpcdf_setup_software_project.py
index cf153ad..638807d 100644
--- a/mpcdf_setup_software_project.py
+++ b/mpcdf_setup_software_project.py
@@ -9,6 +9,8 @@ import osc.cmdln
 import mpcdf_common
 
 
+@osc.cmdln.option('-n', '--dry-run', action="store_true",
+                  help="Do not actually run anything but output the resulting XML configuration")
 @osc.cmdln.option('-i', '--ignore-repo', action="append", default=[], metavar="REPO",
                   help="Do not enable for repository REPO")
 @osc.cmdln.alias("mpcdf_setup_software")
@@ -55,13 +57,30 @@ def do_mpcdf_setup_software_project(self, subcmd, opts, *args):
     prjconf.append("Preinstall: mpcdf_modules")
     prjconf.append("Preinstall: brp_mpcdf_modules")
 
+    software_meta = mpcdf_common.project_meta(api_url, "software")
+    distributions = (repo.get("name") for repo in software_meta.findall('./repository'))
+    centos_distributions = list(distro for distro in distributions if "CentOS" in distro)
+    if centos_distributions:
+        prjconf.append("")
+        prjconf.append("%if {0}".format(" || ".join('"%_repository" == "{0}"'.format(c) for c in centos_distributions)))
+        prjconf.append(mpcdf_common.centos_prjconf_tags)
+        prjconf.append("")
+        prjconf.append("Macros:")
+        prjconf.append(mpcdf_common.centos_macros)
+        prjconf.append(":Macros")
+        prjconf.append("%endif")
+
     prjconf.append(end_marker)
     prjconf = prjconf_head + "\n".join(prjconf) + prjconf_tail
-    osc.core.edit_meta("prjconf", "software", data=prjconf)
 
-    if opts.ignore_repo:
-        ignore_repos = opts.ignore_repo
+    if opts.dry_run:
+        print("osc meta prjconf software -F - <<EOF\n{0}\nEOF\n".format(prjconf))
     else:
-        ignore_repos = ()
+        osc.core.edit_meta("prjconf", "software", data=prjconf)
+
+        if opts.ignore_repo:
+            ignore_repos = opts.ignore_repo
+        else:
+            ignore_repos = ()
 
-    mpcdf_common.mpcdf_enable_repositories_for_all_packages(api_url, "software", ignore_repos=ignore_repos)
+        mpcdf_common.mpcdf_enable_repositories_for_all_packages(api_url, "software", ignore_repos=ignore_repos)
-- 
GitLab