aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOliver Smith <osmith@sysmocom.de>2023-04-04 17:54:45 +0200
committerOliver Smith <osmith@sysmocom.de>2023-04-06 10:59:28 +0200
commitccb0dba7f3513e1948e86b064b6b84a432b37644 (patch)
tree849dbfcf81ba5518664a5c5f64acaa2610fb7b01
parentff8ec46ac5f2fa0301fcf36fb1d0b178f33c4422 (diff)
obs: update_obs_project: add --delete arg
Add a new argument to delete packages from OBS if the git branch does not exist anymore, but the packages still exists in OBS. Related: OS#5981 Change-Id: Ib5ccf93a5a0cf8981fc35976bb9e0d3a29721b8d
-rw-r--r--scripts/obs/lib/git.py8
-rw-r--r--scripts/obs/lib/osc.py6
-rwxr-xr-xscripts/obs/update_obs_project.py32
3 files changed, 43 insertions, 3 deletions
diff --git a/scripts/obs/lib/git.py b/scripts/obs/lib/git.py
index 15cb276..0194f77 100644
--- a/scripts/obs/lib/git.py
+++ b/scripts/obs/lib/git.py
@@ -90,7 +90,7 @@ def get_head(project):
return ret.output.rstrip()
-def get_head_remote(project, branch):
+def get_head_remote(project, branch, branch_missing_ok=True):
if not branch:
branch = get_default_branch(project)
repo_url = get_repo_url(project)
@@ -99,7 +99,13 @@ def get_head_remote(project, branch):
ls_remote = lib.run_cmd(["git", "ls-remote", repo_url, f"heads/{branch}"])
ret = ls_remote.output.split("\t")[0]
+
+ # If the branch is missing from the remote, git ls-remote exits with 0 and
+ # the output is empty
if not ret:
+ if branch_missing_ok:
+ print(f"{project}: branch not found: {branch}")
+ return None
lib.exit_error_cmd(ls_remote, "failed to find head commit for"
f" {project} in output")
diff --git a/scripts/obs/lib/osc.py b/scripts/obs/lib/osc.py
index c2f6ad4..c9040ec 100644
--- a/scripts/obs/lib/osc.py
+++ b/scripts/obs/lib/osc.py
@@ -142,3 +142,9 @@ def update_package(package, version):
run_osc(["commit", "-m", f"upgrade to {version}"], cwd=path_temp_osc_pkg)
remove_temp_osc()
+
+
+def delete_package(package, commit_msg):
+ print(f"{package}: removing from OBS ({commit_msg})")
+ run_osc(["rdelete", "-m", commit_msg, lib.args.obs_project,
+ os.path.basename(package)])
diff --git a/scripts/obs/update_obs_project.py b/scripts/obs/update_obs_project.py
index da796ad..8c4da5e 100755
--- a/scripts/obs/update_obs_project.py
+++ b/scripts/obs/update_obs_project.py
@@ -14,6 +14,7 @@ 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
@@ -51,6 +52,14 @@ def build_srcpkg(package, 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
@@ -66,6 +75,7 @@ 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 in ["master", "latest"]:
""" Check if we can skip this package by comparing the OBS version with
@@ -75,12 +85,17 @@ def build_srcpkg_if_needed(pkgs_remote, package, is_meta_pkg):
latest_version = conflict_version if conflict_version else "1.0.0"
else:
if feed == "master":
- latest_version = lib.git.get_head_remote(package, branch)
+ 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
@@ -164,6 +179,7 @@ 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)
@@ -178,6 +194,14 @@ def exit_with_summary():
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")
+ exit(1)
+
+
def main():
parser = argparse.ArgumentParser(
description="Generate source packages and upload them to OBS.")
@@ -188,12 +212,16 @@ 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")
args = parser.parse_args()
+ validate_args(args)
lib.set_args(args)
packages = parse_packages(args.package)