aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/obs/lib/debian.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/obs/lib/debian.py')
-rw-r--r--scripts/obs/lib/debian.py133
1 files changed, 133 insertions, 0 deletions
diff --git a/scripts/obs/lib/debian.py b/scripts/obs/lib/debian.py
new file mode 100644
index 0000000..6703f8b
--- /dev/null
+++ b/scripts/obs/lib/debian.py
@@ -0,0 +1,133 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright 2022 sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
+import datetime
+import os
+import shlex
+import lib
+import lib.git
+
+# Imports that may not be available during startup, ignore it here and rely on
+# lib.check_required_programs() checking this later on (possibly after the
+# script executed itself in docker if using --docker).
+try:
+ import packaging.version
+except ImportError:
+ pass
+
+def control_add_depend(project, pkgname, version):
+ """ :param pkgname: of the meta-package to depend on (e.g. osmocom-nightly)
+ :param version: of the meta-pkgname to depend on or None """
+ repo_path = lib.git.get_repo_path(project)
+
+ if version:
+ depend = f"{pkgname} (= {version})"
+ else:
+ depend = pkgname
+
+ cmd = ["sed", f"s/^Depends: /Depends: {depend}, /", "-i", "debian/control"]
+ lib.run_cmd(cmd, cwd=repo_path)
+
+
+def changelog_add_entry(project, version):
+ """ :param version: for the new changelog entry """
+ feed = lib.args.feed
+ repo_path = lib.git.get_repo_path(project)
+ changelog_path = f"{repo_path}/debian/changelog"
+
+ changelog_old = open(changelog_path).read()
+
+ # Package name might be different from project name, read it from changelog
+ pkgname = changelog_old.split(" ", 1)[0]
+ assert pkgname
+
+ # Debian doesn't allow '-' in version
+ version = version.replace("-", ".")
+
+ # Debian changelog requires this specific date format
+ date = datetime.datetime.now(datetime.timezone.utc)
+ date_str = date.strftime("%a, %d %b %Y %H:%M:%S %z")
+
+ # Add new changelog entry
+ with open(changelog_path, "w") as f:
+ f.write(f"{pkgname} ({version}) unstable; urgency=medium\n")
+ f.write("\n")
+ f.write(" * Automatically generated changelog entry for building the"
+ f" Osmocom {feed} feed\n")
+ f.write("\n")
+ f.write(f" -- Osmocom OBS scripts <info@osmocom.org> {date_str}\n")
+ f.write("\n")
+ f.write(changelog_old)
+
+
+def fix_source_format(project):
+ """ Always use format "3.0 (native)" (e.g. limesuite has "3.0 (quilt)")."""
+ repo_path = lib.git.get_repo_path(project)
+ format_path = f"{repo_path}/debian/source/format"
+ if not os.path.exists(format_path):
+ return
+
+ expected = "3.0 (native)"
+ current = open(format_path, "r").read().rstrip()
+
+ if current == expected:
+ return
+
+ print(f"{project}: fixing debian/source/format ({current} => {expected})")
+ open(format_path, "w").write(f"{expected}\n")
+
+
+def get_last_version_from_changelog(project):
+ repo_path = lib.git.get_repo_path(project)
+ changelog_path = f"{repo_path}/debian/changelog"
+
+ assert os.path.exists(changelog_path), f"{project}: missing debian/changelog"
+
+ changelog = open(changelog_path).read()
+ assert changelog, f"{project}: debian/changelog is empty"
+
+ ret = changelog.split("(", 1)[1].split(")", 1)[0]
+ assert ret, f"{project}: couldn't find last version in debian/changelog"
+
+ return ret
+
+
+def changelog_add_entry_if_needed(project, version):
+ """ Adjust the changelog if the version in the changelog is different from
+ the given version. """
+ version_changelog = get_last_version_from_changelog(project)
+
+ # Don't use a lower number (OS#6173)
+ try:
+ if packaging.version.parse(version_changelog.split("-")[0]) > \
+ packaging.version.parse(version.split("-")[0]):
+ print(f"{project}: WARNING: version from changelog"
+ f" ({version_changelog}) is higher than version based on git tag"
+ f" ({version}), using version from changelog (git tag not pushed"
+ " yet?)")
+ return
+ except packaging.version.InvalidVersion:
+ # packaging.version.parse can parse the version numbers used in Osmocom
+ # projects (where we need the above check), but not e.g. some versions
+ # from wireshark. Don't abort here if that is the case.
+ pass
+
+ if version_changelog == version:
+ return
+
+ print(f"{project}: adding debian/changelog entry ({version_changelog} =>"
+ f" {version})")
+ changelog_add_entry(project, version)
+
+
+def build_source_package(project):
+ fix_source_format(project)
+ print(f"{project}: building debian source package")
+ lib.run_cmd(["dpkg-buildpackage", "-S", "-uc", "-us", "-d"],
+ cwd=lib.git.get_repo_path(project))
+
+
+def move_files_to_output(project):
+ path_output = lib.get_output_path(project)
+ lib.run_cmd(f"mv *.tar* *.dsc {shlex.quote(path_output)}", shell=True,
+ cwd=lib.config.path_cache)