This is an automated email from the git hooks/post-receive script.
praiskup pushed a commit to branch master
in repository copr/copr.
The following commit(s) were added to refs/heads/master by this push:
new 6851f23 cli: add script to list package build order in copr or koji
6851f23 is described below
commit 6851f23de150e4ff8e5a1e11dd94b99136ed2e75
Author: Dominik Turecek <dturecek(a)redhat.com>
AuthorDate: Tue Mar 17 12:48:35 2020 +0100
cli: add script to list package build order in copr or koji
Merges: #1291
---
cli/copr-cli.spec | 3 +
cli/copr_cli/package_build_order.py | 142 ++++++++++++++++++++++++++++++++++++
2 files changed, 145 insertions(+)
diff --git a/cli/copr-cli.spec b/cli/copr-cli.spec
index c3a9480..a18cd9a 100644
--- a/cli/copr-cli.spec
+++ b/cli/copr-cli.spec
@@ -32,6 +32,7 @@ Requires: python3-copr >= 1.89
Requires: python3-jinja2
Requires: python3-simplejson
Requires: python3-humanize
+Requires: python3-koji
Recommends: python3-progress
@@ -99,6 +100,7 @@ install -p man/copr.1 %{buildroot}/%{_mandir}/man1/
install -d %{buildroot}%{_datadir}/cheat
cp -a man/copr-cli.cheat %{buildroot}%{_datadir}/cheat/copr-cli
ln -s %{_datadir}/cheat/copr-cli %{buildroot}%{_datadir}/cheat/copr
+install -m 755 copr_cli/package_build_order.py %{buildroot}/%{_bindir}/package-build-order
%check
@@ -117,6 +119,7 @@ ln -s %{_datadir}/cheat/copr-cli %{buildroot}%{_datadir}/cheat/copr
%{_datadir}/cheat/copr-cli
%{_datadir}/cheat/copr
%{python_sitelib}/*
+%{_bindir}/package-build-order
%changelog
diff --git a/cli/copr_cli/package_build_order.py b/cli/copr_cli/package_build_order.py
new file mode 100755
index 0000000..38da2d0
--- /dev/null
+++ b/cli/copr_cli/package_build_order.py
@@ -0,0 +1,142 @@
+#!/usr/bin/python3
+"""List packages of a given copr project in the order in which they were built."""
+
+import os
+import sys
+import argparse
+from configparser import ConfigParser
+
+from copr.v3 import BuildProxy, BuildChrootProxy, config_from_file
+from copr.v3.exceptions import CoprNoConfigException, CoprNoResultException, CoprRequestException
+
+from koji import ClientSession, GenericError, BUILD_STATES
+
+
+def package_order_from_copr(args):
+ """List package build order from Copr"""
+ if not args.project:
+ print("You need to specify Copr project to list package build order.")
+ sys.exit(1)
+
+ if not args.config:
+ args.config = "~/.config/copr"
+
+ try:
+ config_file = config_from_file(args.config)
+ except CoprNoConfigException:
+ print("Couldn't find copr config file at {0}.".format(args.config))
+ sys.exit(1)
+
+ try:
+ build_proxy = BuildProxy(config_file)
+ build_chroot_proxy = BuildChrootProxy(config_file)
+ project = args.project.split("/")
+ username = project[0]
+ projectname = project[1]
+ build_list = build_proxy.get_list(username, projectname)
+ except CoprNoResultException:
+ print("No copr project {0}/{1}.".format(username, projectname))
+ sys.exit(1)
+ except CoprRequestException:
+ print("Failed to get information from Copr.")
+ sys.exit(1)
+
+ build_list.reverse()
+ processed_packages = []
+ for build in build_list:
+ if args.chroot and args.chroot not in build["chroots"]:
+ continue
+ if build["state"] != "succeeded":
+ if not args.chroot:
+ continue
+ if len(build["chroots"]) == 1:
+ continue
+ build_chroot = build_chroot_proxy.get(build["id"], args.chroot)
+ if build_chroot.state != "succeeded":
+ continue
+
+ package = "{0}-{1}".format(build["source_package"]["name"], build["source_package"]["version"])
+ if not package:
+ continue
+ if not args.list_each:
+ if package in processed_packages:
+ continue
+ processed_packages.append(package)
+
+ print(package)
+
+
+def package_order_from_koji(args):
+ """List package build order from Koji"""
+ if not args.username and not args.tag:
+ print("You need to specify either username or tag to list build order in Koji.")
+ sys.exit(1)
+
+ for path in [args.config, "~/.config/koji", "/etc/koji.conf"]:
+ if path and os.path.exists(path):
+ args.config = path
+
+ if not args.config:
+ print("Couldn't find koji config file.")
+
+ config_file = ConfigParser()
+ config_file.read(args.config)
+
+ koji_url = config_file.get("koji", "server")
+ session = ClientSession(koji_url)
+
+ if args.tag:
+ try:
+ builds = session.listTagged(tag=args.tag, owner=args.username)
+ except GenericError:
+ print("No tag {0}.".format(args.tag))
+ sys.exit(1)
+
+ elif args.username:
+ user = session.getUser(args.username)
+ if not user:
+ print("No user {0}.".format(args.username))
+ sys.exit(1)
+
+ user_id = user["id"]
+ builds = session.listBuilds(userID=user_id)
+
+ processed_packages = []
+ for build in sorted(builds, key=lambda i: i["completion_time"]):
+ if build["state"] != BUILD_STATES["COMPLETE"]:
+ continue
+ package = build["nvr"]
+ if not package:
+ continue
+ if not args.list_each:
+ if package in processed_packages:
+ continue
+ processed_packages.append(package)
+
+ print(package)
+
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--config", type=str, help="Path to copr/koji config")
+ parser.add_argument("--list-each", "-e", action="store_true", default=False,
+ help="List each occurence of every package in the project")
+
+ subparsers = parser.add_subparsers(title="commands")
+
+ parser_copr = subparsers.add_parser("copr", help="List package build order in Copr")
+ parser_copr.add_argument("--project", "-p", type=str, help="Copr project in `owner/project` format")
+ parser_copr.add_argument("--chroot", "-c", type=str, help="List this chroot only")
+ parser_copr.set_defaults(func=package_order_from_copr)
+
+ parser_koji = subparsers.add_parser("koji", help="List package build order in Koji")
+ parser_koji.add_argument("--username", "-u", type=str, help="Koji username")
+ parser_koji.add_argument("--tag", "-t", type=str, help="Koji tag")
+ parser_koji.set_defaults(func=package_order_from_koji)
+
+ args = parser.parse_args()
+ try:
+ args.func(args)
+ except AttributeError:
+ parser.print_help()
+ sys.exit(0)
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.