aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/obs/lib/srcpkg.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/obs/lib/srcpkg.py')
-rw-r--r--scripts/obs/lib/srcpkg.py187
1 files changed, 138 insertions, 49 deletions
diff --git a/scripts/obs/lib/srcpkg.py b/scripts/obs/lib/srcpkg.py
index 035cf81..9dcb33f 100644
--- a/scripts/obs/lib/srcpkg.py
+++ b/scripts/obs/lib/srcpkg.py
@@ -1,60 +1,86 @@
#!/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 pathlib
+import sys
import lib.config
import lib.debian
import lib.rpm_spec
-def checkout_for_feed(project, feed, branch=None):
+def checkout_for_feed(project):
""" checkout a commit, either latest tag or master or 20YY branch """
+ feed = lib.args.feed
+ branch = lib.args.git_branch
if branch:
lib.git.checkout(project, f"origin/{branch}")
elif feed == "latest":
lib.git.checkout_latest_tag(project)
- elif feed == "nightly":
+ elif feed in ["master", "nightly"]:
lib.git.checkout_default_branch(project)
else: # 2022q1 etc
lib.git.checkout(project, f"origin/{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")
+ # Run git-version-gen if it is in the repository
+ script_path = f"{repo_path}/git-version-gen"
+ if os.path.exists(script_path):
+ ret = lib.run_cmd([script_path, "."], cwd=repo_path).output.rstrip()
+ if not ret:
+ lib.exit_error_cmd(ret, "empty output from git-version-gen")
+ return ret
- return ret.output
+ # Generate a version string similar to git-version-gen, but run use git
+ # describe --tags, so it works with non-annotated tags as well (needed for
+ # e.g. limesuite's tags).
+ pattern = lib.git.get_latest_tag_pattern(project)
+ pattern = pattern.replace("^", "", 1)
+ pattern = pattern.replace("$", "", -1)
+ result = lib.run_cmd(["git", "describe",
+ "--abbrev=4",
+ "--tags",
+ f"--match={pattern}",
+ "HEAD"], cwd=repo_path, check=False)
+
+ if result.returncode == 128:
+ print(f"{project}: has no git tags")
+ commit = lib.run_cmd(["git", "rev-parse", "HEAD"],
+ cwd=repo_path).output[0:4]
+ count = lib.run_cmd(["git", "rev-list", "--count", "HEAD"],
+ cwd=repo_path).output.rstrip()
+ try:
+ print(f"{project}: getting version from debian/changelog")
+ version = lib.debian.get_last_version_from_changelog(project)
+ return f"{version}.{count}-{commit}"
+ except:
+ print(f"{project}: using 0.0.0 as version")
+ return f"0.0.0.{count}-{commit}"
+
+ if result.returncode != 0:
+ lib.exit_error_cmd(result, "command failed unexpectedly")
+
+ ret = result.output.rstrip()
+
+ # Like git-version-gen:
+ # * Change the first '-' to '.'
+ # * Remove the 'g' in git describe's output string
+ # * Remove the leading 'v'
+ ret = ret.replace("-", ".", 1)
+ ret = ret.replace("-g", "-", 1)
+ if ret.startswith("v"):
+ ret = ret[1:]
+ return ret
-def get_version_for_feed(project, feed, conflict_version):
- if feed == "latest":
+
+def get_version_for_feed(project):
+ if lib.args.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)
@@ -72,6 +98,7 @@ def get_version_for_feed(project, feed, conflict_version):
# Append the conflict_version to increase the version even if the commit
# did not change (OS#5135)
+ conflict_version = lib.args.conflict_version
if conflict_version:
ret = f"{ret}.{conflict_version}"
@@ -95,21 +122,33 @@ def get_epoch(project):
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"],
+ """ Download the subproject sources here, so the package can be built in
+ OBS without Internet access. """
+ lib.run_cmd(["meson", "subprojects", "download"],
cwd=lib.git.get_repo_path("open5gs"))
+def prepare_project_limesuite():
+ """ Fix bug in 23.10: https://github.com/myriadrf/LimeSuite/pull/386 """
+ lib.run_cmd(["mv", "-v",
+ "liblimesuite22.09-1.install",
+ "liblimesuite23.10-1.install"],
+ cwd=f"{lib.git.get_repo_path('limesuite')}/debian",
+ check=False)
+
+
+def run_generate_build_dep(project):
+ """ Run contrib/generate_build_dep.sh if it exists in the given project, to
+ to download sources for dependencies (see e.g. osmo_dia2gsup.git). """
+ repo_path = lib.git.get_repo_path(project)
+ script_path = "contrib/generate_build_dep.sh"
+
+ if os.path.exists(f"{repo_path}/{script_path}"):
+ print(f"{project}: running {script_path}")
+ lib.run_cmd(script_path, cwd=repo_path)
+
+
def write_tarball_version(project, version):
repo_path = lib.git.get_repo_path(project)
@@ -117,25 +156,48 @@ def write_tarball_version(project, version):
f.write(f"{version}\n")
-def build(project, feed, branch, conflict_version, fetch):
- lib.git.clone(project, fetch)
+def write_commit_txt(project):
+ """ Write the current git commit to commit_$commit.txt file, so it gets
+ uploaded to OBS along with the rest of the source package. This allows
+ figuring out if the source package is still up-to-date or not for the
+ master feed. """
+ output_path = lib.get_output_path(project)
+ commit = lib.git.get_head(project)
+
+ print(f"{project}: adding commit_{commit}.txt")
+ pathlib.Path(f"{output_path}/commit_{commit}.txt").touch()
+
+
+def build(project, gerrit_id=0):
+ conflict_version = lib.args.conflict_version
+ feed = lib.args.feed
+ version_append = lib.args.version_append
+
+ lib.git.clone(project)
lib.git.clean(project)
- checkout_for_feed(project, feed, branch)
- version = get_version_for_feed(project, feed, conflict_version)
+ if gerrit_id > 0:
+ lib.git.checkout_from_review(project, gerrit_id)
+ else:
+ checkout_for_feed(project)
+
+ version = get_version_for_feed(project)
+ if version_append:
+ version += version_append
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}"
+ if project in lib.config.projects_osmocom and not lib.args.no_meta:
+ metapkg = lib.args.conflict_pkgname or 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)
+ lib.debian.changelog_add_entry_if_needed(project, version_epoch)
os.makedirs(lib.get_output_path(project))
lib.remove_cache_extra_files()
@@ -145,6 +207,15 @@ def build(project, feed, branch, conflict_version, fetch):
print(f"{project}: running {project_specific_func}")
globals()[project_specific_func]()
+ if project in lib.config.projects_osmocom:
+ run_generate_build_dep(project)
+
+ if lib.args.configure_append:
+ lib.debian.configure_append(project, lib.args.configure_append)
+
+ if lib.args.disable_manuals:
+ lib.debian.disable_manuals(project)
+
lib.debian.build_source_package(project)
lib.debian.move_files_to_output(project)
@@ -152,5 +223,23 @@ def build(project, feed, branch, conflict_version, fetch):
lib.rpm_spec.generate(project, version, epoch)
lib.rpm_spec.copy_to_output(project)
+ if feed == "master":
+ write_commit_txt(project)
+
lib.remove_cache_extra_files()
return version_epoch
+
+
+def requires_osmo_gsm_manuals_dev(project):
+ """ Check if an already built source package has osmo-gsm-manuals-dev in
+ Build-Depends of the .dsc file """
+ path_dsc = glob.glob(f"{lib.get_output_path(project)}/*.dsc")
+ assert len(path_dsc) == 1, f"failed to get dsc path for {project}"
+
+ with open(path_dsc[0], "r") as handle:
+ for line in handle.readlines():
+ if line.startswith("Build-Depends:") \
+ and "osmo-gsm-manuals-dev" in line:
+ return True
+
+ return False