diff options
Diffstat (limited to 'scripts/obs/lib/srcpkg.py')
-rw-r--r-- | scripts/obs/lib/srcpkg.py | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/scripts/obs/lib/srcpkg.py b/scripts/obs/lib/srcpkg.py new file mode 100644 index 0000000..468a240 --- /dev/null +++ b/scripts/obs/lib/srcpkg.py @@ -0,0 +1,157 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: GPL-2.0-or-later +# Copyright 2022 sysmocom - s.f.m.c. GmbH <info@sysmocom.de> +import os +import lib.config +import lib.debian +import lib.rpm_spec + + +def checkout_for_feed(project, feed): + """ checkout a commit, either latest tag or master or 20YY branch """ + if feed == "latest": + lib.git.checkout_latest_tag(project) + elif feed == "nightly": + lib.git.checkout_default_branch(project) + else: # 2022q1 etc + lib.git.checkout(project, feed) + + +def get_git_version_gen_path(project): + # Use git-version-gen in the project's repository if available + repo_path = lib.git.get_repo_path(project) + ret = f"{repo_path}/git-version-gen" + if os.path.exists(ret): + return ret + + # Use git-version-gen script from libosmocore.git as fallback + print(f"{project}: has no git-version-gen, using the one from libosmocore") + repo_path = lib.git.get_repo_path("libosmocore") + ret = f"{repo_path}/git-version-gen" + if not os.path.exists(ret): + lib.git.clone("libosmocore") + if os.path.exists(ret): + return ret + + print(f"ERROR: {project}.git doesn't have a git-version-gen script and" + " couldn't find libosmocore.git's copy of the script here either: " + + ret) + exit(1) + + +def get_git_version(project): + """ :returns: the string from git-version-gen, e.g. '1.7.0.10-76bdb' """ + repo_path = lib.git.get_repo_path(project) + script_path = get_git_version_gen_path(project) + + ret = lib.run_cmd([script_path, "."], cwd=repo_path) + if not ret.output: + lib.exit_error_cmd(ret, "empty output from git-version-gen") + + return ret.output + + +def get_version_for_feed(project, feed, conflict_version): + if feed == "latest": + # There's always a tag if we are here. If there was none, the build + # would have been skipped for latest. + ret = lib.git.get_latest_tag(project) + return ret[1:] if ret.startswith("v") else ret + + ret = get_git_version(project) + + # Try to get the last version from the debian/changelog if we can't get + # it with git-version-gen, like it was done in the previous OBS scripts + if ret == "UNKNOWN": + ret = lib.debian.get_last_version_from_changelog(project) + # cut off epoch, we retrieve it separately in get_epoch() below + if ":" in ret: + ret = ret.split(":")[1] + + if not ret: + ret = "0.0.0" + + # Append the conflict_version to increase the version even if the commit + # did not change (OS#5135) + if conflict_version: + ret = f"{ret}.{conflict_version}" + + return ret + + +def get_epoch(project): + """ The osmo-gbproxy used to have the same package version as osmo-sgsn + until 2021 where it was split into its own git repository. From then + on, osmo-gbproxy has a 0.*.* package version, which is smaller than + the previous 1.*.* from osmo-sgsn. We had to set the epoch to 1 for + osmo-gbproxy so package managers know these 0.*.* versions are higher + than the previous 1.*.* ones that are still found in e.g. debian 11. + The epoch is set in debian/changelog, retrieve it from there. + :returns: the epoch number if set, e.g. "1" or an empty string """ + version_epoch = lib.debian.get_last_version_from_changelog(project) + + if ":" in version_epoch: + return version_epoch.split(":")[0] + + return "" + + +def prepare_project_osmo_dia2gsup(): + """ Run erlang/osmo_dia2gsup's generate_build_dep.sh script to download + sources for dependencies. """ + lib.run_cmd("contrib/generate_build_dep.sh", + cwd=lib.git.get_repo_path("erlang/osmo_dia2gsup")) + + +def prepare_project_open5gs(): + """ Build fails without downloading freeDiameter sources. Also we can't + just update all subprojects because it would fail with 'Subproject + exists but has no meson.build file' for promethous-client-c. """ + lib.run_cmd(["meson", "subprojects", "download", "freeDiameter"], + cwd=lib.git.get_repo_path("open5gs")) + + +def write_tarball_version(project, version): + repo_path = lib.git.get_repo_path(project) + + with open(f"{repo_path}/.tarball-version", "w") as f: + f.write(f"{version}\n") + + +def build(project, feed, conflict_version, fetch): + lib.git.clone(project, fetch) + lib.git.clean(project) + checkout_for_feed(project, feed) + version = get_version_for_feed(project, feed, conflict_version) + epoch = get_epoch(project) + version_epoch = f"{epoch}:{version}" if epoch else version + has_rpm_spec = lib.rpm_spec.get_spec_in_path(project) is not None + + print(f"{project}: building source package {version_epoch}") + write_tarball_version(project, version_epoch) + + if project in lib.config.projects_osmocom: + metapkg = f"osmocom-{feed}" + lib.debian.control_add_depend(project, metapkg, conflict_version) + if has_rpm_spec: + lib.rpm_spec.add_depend(project, metapkg, conflict_version) + + lib.debian.changelog_add_entry_if_needed(project, feed, version_epoch) + + os.makedirs(lib.get_output_path(project)) + lib.remove_cache_extra_files() + + project_specific_func = f"prepare_project_{os.path.basename(project)}" + if project_specific_func in globals(): + print(f"{project}: running {project_specific_func}") + globals()[project_specific_func]() + + lib.debian.build_source_package(project) + lib.debian.move_files_to_output(project) + + if has_rpm_spec: + lib.rpm_spec.generate(project, version, epoch) + lib.rpm_spec.copy_to_output(project) + + lib.remove_cache_extra_files() + return version_epoch |