aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/obs/update_obs_project.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/obs/update_obs_project.py')
-rwxr-xr-xscripts/obs/update_obs_project.py125
1 files changed, 80 insertions, 45 deletions
diff --git a/scripts/obs/update_obs_project.py b/scripts/obs/update_obs_project.py
index 02db7ce..a456218 100755
--- a/scripts/obs/update_obs_project.py
+++ b/scripts/obs/update_obs_project.py
@@ -3,6 +3,7 @@
# Copyright 2022 sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
import argparse
import os
+import sys
import traceback
import lib
import lib.config
@@ -14,25 +15,29 @@ import lib.srcpkg
srcpkgs_built = {} # dict of pkgname: version
srcpkgs_skipped = [] # list of pkgnames
+srcpkgs_deleted = [] # list of pkgnames
srcpkgs_failed_build = [] # list of pkgnames
srcpkgs_failed_upload = [] # list of pkgnames
srcpkgs_updated = [] # list of pkgnames
def parse_packages(packages_arg):
+ ret = []
if packages_arg:
for package in packages_arg:
- lib.check_package(package)
- return packages_arg
+ if package == "ALL_OSMOCOM_PACKAGES":
+ ret += lib.config.projects_osmocom
+ else:
+ ret += [lib.set_proper_package_name(package)]
+ return ret
# Default to all
- ret = []
ret += lib.config.projects_osmocom
ret += lib.config.projects_other
return ret
-def build_srcpkg(feed, branch, package, conflict_version, fetch, is_meta_pkg):
+def build_srcpkg(package, is_meta_pkg):
global srcpkgs_built
global srcpkgs_failed_build
@@ -40,9 +45,9 @@ def build_srcpkg(feed, branch, package, conflict_version, fetch, is_meta_pkg):
try:
if is_meta_pkg:
- version = lib.metapkg.build(feed, conflict_version)
+ version = lib.metapkg.build()
else:
- version = lib.srcpkg.build(package, feed, branch, conflict_version, fetch)
+ version = lib.srcpkg.build(package)
srcpkgs_built[package] = version
except Exception as ex:
traceback.print_exception(type(ex), ex, ex.__traceback__)
@@ -51,6 +56,14 @@ def build_srcpkg(feed, branch, package, conflict_version, fetch, is_meta_pkg):
srcpkgs_failed_build += [package]
+def delete_srcpkg(package):
+ global srcpkgs_deleted
+ branch = lib.args.git_branch
+
+ lib.osc.delete_package(package, f"branch {branch} does not exist anymore")
+ srcpkgs_deleted += [package]
+
+
def is_up_to_date(obs_version, git_latest_version):
if obs_version == git_latest_version:
return True
@@ -62,29 +75,40 @@ def is_up_to_date(obs_version, git_latest_version):
return False
-def build_srcpkg_if_needed(proj, feed, branch, pkgs_remote, package, conflict_version,
- fetch, is_meta_pkg, skip_up_to_date):
+def build_srcpkg_if_needed(pkgs_remote, package, is_meta_pkg):
global srcpkgs_skipped
+ feed = lib.args.feed
+ branch = lib.args.git_branch
+ delete = lib.args.delete
- if feed != "latest":
- print(f"{package}: building source package (feed is {feed})")
- else:
+ if feed in ["master", "latest"]:
+ """ Check if we can skip this package by comparing the OBS version with
+ the git remote. """
if is_meta_pkg:
+ conflict_version = lib.args.conflict_version
latest_version = conflict_version if conflict_version else "1.0.0"
else:
- latest_version = lib.git.get_latest_tag_remote(package)
+ if feed == "master":
+ latest_version = lib.git.get_head_remote(package, branch,
+ branch_missing_ok=delete)
+ else:
+ latest_version = lib.git.get_latest_tag_remote(package)
if latest_version is None:
- print(f"{package}: skipping (no git tag found)")
+ if delete and os.path.basename(package) in pkgs_remote:
+ delete_srcpkg(package)
+ return
+
+ print(f"{package}: skipping (no git tag/branch found)")
srcpkgs_skipped += [package]
return
if os.path.basename(package) not in pkgs_remote:
print(f"{package}: building source package (not in OBS)")
else:
- obs_version = lib.osc.get_package_version(proj, package)
+ obs_version = lib.osc.get_package_version(package)
if is_up_to_date(obs_version, latest_version):
- if skip_up_to_date:
+ if lib.args.skip_up_to_date:
print(f"{package}: skipping ({obs_version} is up-to-date)")
srcpkgs_skipped += [package]
return
@@ -95,32 +119,32 @@ def build_srcpkg_if_needed(proj, feed, branch, pkgs_remote, package, conflict_ve
else:
print(f"{package}: building source package (outdated:"
f" {latest_version} <=> {obs_version} in OBS)")
+ else:
+ print(f"{package}: building source package (feed is {feed})")
- build_srcpkg(feed, branch, package, conflict_version, fetch, is_meta_pkg)
+ build_srcpkg(package, is_meta_pkg)
-def upload_srcpkg(proj, feed, pkgs_remote, package, version):
+def upload_srcpkg(pkgs_remote, package, version):
if os.path.basename(package) not in pkgs_remote:
- lib.osc.create_package(proj, package)
- lib.osc.update_package(proj, package, version)
+ lib.osc.create_package(package)
+ lib.osc.update_package(package, version)
-def build_srcpkgs(proj, feed, branch, pkgs_remote, packages, conflict_version, fetch,
- meta, skip_up_to_date):
+def build_srcpkgs(pkgs_remote, packages):
print()
print("### Building source packages ###")
print()
- if meta:
- build_srcpkg_if_needed(proj, feed, branch, pkgs_remote, f"osmocom-{feed}",
- conflict_version, fetch, True, skip_up_to_date)
+ if lib.args.meta:
+ feed = lib.args.feed
+ build_srcpkg_if_needed(pkgs_remote, f"osmocom-{feed}", True)
for package in packages:
- build_srcpkg_if_needed(proj, feed, branch, pkgs_remote, package,
- conflict_version, fetch, False, skip_up_to_date)
+ build_srcpkg_if_needed(pkgs_remote, package, False)
-def upload_srcpkgs(proj, feed, pkgs_remote):
+def upload_srcpkgs(pkgs_remote):
global srcpkgs_built
global srcpkgs_failed_upload
global srcpkgs_updated
@@ -137,7 +161,7 @@ def upload_srcpkgs(proj, feed, pkgs_remote):
for package, version in srcpkgs_built.items():
try:
- upload_srcpkg(proj, feed, pkgs_remote, package, version)
+ upload_srcpkg(pkgs_remote, package, version)
srcpkgs_updated += [package]
except Exception as ex:
traceback.print_exception(type(ex), ex, ex.__traceback__)
@@ -159,9 +183,10 @@ def exit_with_summary():
print(f"Skipped: {len(srcpkgs_skipped)}")
print(f"Failed (srcpkg build): {len(srcpkgs_failed_build)}")
print(f"Failed (srcpkg upload): {len(srcpkgs_failed_upload)}")
+ print(f"Deleted: {len(srcpkgs_deleted)}")
if not srcpkgs_failed_build and not srcpkgs_failed_upload:
- exit(0)
+ sys.exit(0)
print()
print("List of failed packages:")
@@ -170,7 +195,15 @@ def exit_with_summary():
for package in srcpkgs_failed_upload:
print(f"* {package} (srcpkg upload)")
- exit(1)
+ sys.exit(1)
+
+
+def validate_args(args):
+ # Only with feed=master we check the current commit of a branch on a remote
+ # git repository before trying to update/delete a package from OBS
+ if args.delete and args.feed != "master":
+ print("ERROR: --delete can only be used with --feed=master")
+ sys.exit(1)
def main():
@@ -183,32 +216,34 @@ def main():
dest="skip_up_to_date", action="store_false",
help="for latest feed, build and upload packages even"
" if the version did not change")
+ parser.add_argument("--delete", action="store_true",
+ help="remove packages from OBS if the git branch (-b)"
+ " does not exist anymore")
parser.add_argument("obs_project",
help="OBS project, e.g. home:osmith:nightly")
parser.add_argument("package", nargs="*",
- help="package name, e.g. libosmocore or open5gs,"
- " default is all packages")
+ help="package name, e.g. libosmocore or open5gs or"
+ " ALL_OSMOCOM_PACKAGES, default is all packages")
args = parser.parse_args()
- proj = args.obs_project
- feed = args.feed
- branch = args.git_branch
+ validate_args(args)
+ lib.set_args(args)
packages = parse_packages(args.package)
- lib.set_cmds_verbose(args.verbose)
-
if args.docker:
- lib.docker.run_in_docker_and_exit(__file__, args, True)
+ lib.docker.run_in_docker_and_exit("update_obs_project.py", True)
+
+ lib.osc.check_oscrc()
+ lib.osc.set_apiurl(args.apiurl, args.obs_project)
+
+ if not args.ignore_req:
+ lib.check_required_programs()
- lib.osc.check_proj(proj)
- lib.osc.set_apiurl(args.apiurl)
- lib.check_required_programs()
lib.remove_temp()
- pkgs_remote = lib.osc.get_remote_pkgs(proj)
+ pkgs_remote = lib.osc.get_remote_pkgs()
- build_srcpkgs(proj, feed, branch, pkgs_remote, packages, args.conflict_version,
- args.git_fetch, args.meta, args.skip_up_to_date)
- upload_srcpkgs(proj, feed, pkgs_remote)
+ build_srcpkgs(pkgs_remote, packages)
+ upload_srcpkgs(pkgs_remote)
exit_with_summary()