laforge has submitted this change. ( 
https://gerrit.osmocom.org/c/osmo-ci/+/32228 )

Change subject: obs: update_obs_project: add --delete arg
......................................................................

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
---
M scripts/obs/lib/git.py
M scripts/obs/lib/osc.py
M scripts/obs/update_obs_project.py
3 files changed, 56 insertions(+), 3 deletions(-)

Approvals:
  pespin: Looks good to me, but someone else must approve
  Jenkins Builder: Verified
  laforge: Looks good to me, approved




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 @@
     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 @@
     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 @@
     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 @@

 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 @@
         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 @@
     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 @@
             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 @@
     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 @@
     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 @@
                         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)


--
To view, visit https://gerrit.osmocom.org/c/osmo-ci/+/32228
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-ci
Gerrit-Branch: master
Gerrit-Change-Id: Ib5ccf93a5a0cf8981fc35976bb9e0d3a29721b8d
Gerrit-Change-Number: 32228
Gerrit-PatchSet: 2
Gerrit-Owner: osmith <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <[email protected]>
Gerrit-Reviewer: pespin <[email protected]>
Gerrit-MessageType: merged

Reply via email to