From ae05aa765403c06b5c16e9ef837c874e2ca073ef Mon Sep 17 00:00:00 2001 From: Tomas Kopecek Date: Apr 02 2020 08:55:37 +0000 Subject: PR#2071: Better help for build/latest-build Merges #2071 https://pagure.io/koji/pull-request/2071 Fixes: #1808 https://pagure.io/koji/issue/1808 cli: Print a warning in latest-build if the tag is not a buildroot --- diff --git a/cli/koji_cli/commands.py b/cli/koji_cli/commands.py index f831097..8880732 100644 --- a/cli/koji_cli/commands.py +++ b/cli/koji_cli/commands.py @@ -11,6 +11,7 @@ import random import re import stat import sys +import textwrap import time import traceback from collections import OrderedDict, defaultdict @@ -454,7 +455,19 @@ def handle_remove_pkg(goptions, session, args): def handle_build(options, session, args): "[build] Build a package from source" - usage = _("usage: %prog build [options] ") + + usage = _("""\ + usage: %prog build [options] + + The first option is the build target, not to be confused with the destination + tag (where the build eventually lands) or build tag (where the buildroot + contents are pulled from). + + You can list all available build targets using the '%prog list-targets' command. + More detail can be found in the documentation. + https://docs.pagure.org/koji/HOWTO/#package-organization""") + + usage = textwrap.dedent(usage) parser = OptionParser(usage=get_usage_str(usage)) parser.add_option("--skip-tag", action="store_true", help=_("Do not attempt to tag package")) @@ -2334,8 +2347,19 @@ def handle_revoke_cg_access(goptions, session, args): def anon_handle_latest_build(goptions, session, args): - "[info] Print the latest builds for a tag" - usage = _("usage: %prog latest-build [options] [ ...]") + """[info] Print the latest builds for a tag""" + usage = _("""\ + usage: %prog latest-build [options] [ ...] + + The first option should be the name of a tag, not the name of a build target. + If you want to know the latest build in buildroots for a given build target, + then you should use the name of the build tag for that target. You can find + this value by running '%prog list-targets --name=' + + More information on tags and build targets can be found in the documentation. + https://docs.pagure.org/koji/HOWTO/#package-organization""") + + usage = textwrap.dedent(usage) parser = OptionParser(usage=get_usage_str(usage)) parser.add_option("--arch", help=_("List all of the latest packages for this arch")) parser.add_option("--all", action="store_true", diff --git a/tests/test_cli/test_build.py b/tests/test_cli/test_build.py index 101afd6..0766916 100644 --- a/tests/test_cli/test_build.py +++ b/tests/test_cli/test_build.py @@ -3,14 +3,11 @@ import mock import os import six import sys -try: - import unittest2 as unittest -except ImportError: - import unittest from koji_cli.commands import handle_build, _progress_callback +from . import utils -class TestBuild(unittest.TestCase): +class TestBuild(utils.CliTestCase): # Show long diffs in error output... maxDiff = None @@ -22,6 +19,19 @@ class TestBuild(unittest.TestCase): self.options.poll_interval = 0 # Mock out the xmlrpc server self.session = mock.MagicMock() + self.error_format = """Usage: %s build [options] + +The first option is the build target, not to be confused with the destination +tag (where the build eventually lands) or build tag (where the buildroot +contents are pulled from). + +You can list all available build targets using the '%s list-targets' command. +More detail can be found in the documentation. +https://docs.pagure.org/koji/HOWTO/#package-organization +(Specify the --help global option for a list of other help options) + +%s: error: {message} +""" % (self.progname, self.progname, self.progname) @mock.patch('sys.stdout', new_callable=six.StringIO) @mock.patch('koji_cli.commands.activate_session') @@ -147,11 +157,7 @@ Task info: weburl/taskinfo?taskID=1 actual_stdout = stdout.getvalue() actual_stderr = stderr.getvalue() expected_stdout = '' - expected_stderr = """Usage: %s build [options] -(Specify the --help global option for a list of other help options) - -%s: error: Exactly two arguments (a build target and a SCM URL or srpm file) are required -""" % (progname, progname) + expected_stderr = self.format_error_message("Exactly two arguments (a build target and a SCM URL or srpm file) are required") self.assertMultiLineEqual(actual_stdout, expected_stdout) self.assertMultiLineEqual(actual_stderr, expected_stderr) @@ -193,6 +199,14 @@ Task info: weburl/taskinfo?taskID=1 actual_stdout = stdout.getvalue() actual_stderr = stderr.getvalue() expected_stdout = """Usage: %s build [options] + +The first option is the build target, not to be confused with the destination +tag (where the build eventually lands) or build tag (where the buildroot +contents are pulled from). + +You can list all available build targets using the '%s list-targets' command. +More detail can be found in the documentation. +https://docs.pagure.org/koji/HOWTO/#package-organization (Specify the --help global option for a list of other help options) Options: @@ -213,7 +227,7 @@ Options: --repo-id=REPO_ID Use a specific repo --noprogress Do not display progress of the upload --background Run the build at a lower priority -""" % progname +""" % (progname, progname) expected_stderr = '' self.assertMultiLineEqual(actual_stdout, expected_stdout) self.assertMultiLineEqual(actual_stderr, expected_stderr) @@ -259,11 +273,7 @@ Options: actual_stdout = stdout.getvalue() actual_stderr = stderr.getvalue() expected_stdout = '' - expected_stderr = """Usage: %s build [options] -(Specify the --help global option for a list of other help options) - -%s: error: --arch_override is only allowed for --scratch builds -""" % (progname, progname) + expected_stderr = self.format_error_message("--arch_override is only allowed for --scratch builds") self.assertMultiLineEqual(actual_stdout, expected_stdout) self.assertMultiLineEqual(actual_stderr, expected_stderr) @@ -354,11 +364,7 @@ Task info: weburl/taskinfo?taskID=1 with self.assertRaises(SystemExit) as cm: handle_build(self.options, self.session, args) actual = stderr.getvalue() - expected = """Usage: %s build [options] -(Specify the --help global option for a list of other help options) - -%s: error: Unknown build target: target -""" % (progname, progname) + expected = self.format_error_message( "Unknown build target: target") self.assertMultiLineEqual(actual, expected) # Finally, assert that things were called as we expected. activate_session_mock.assert_called_once_with(self.session, self.options) @@ -405,11 +411,7 @@ Task info: weburl/taskinfo?taskID=1 with self.assertRaises(SystemExit) as cm: handle_build(self.options, self.session, args) actual = stderr.getvalue() - expected = """Usage: %s build [options] -(Specify the --help global option for a list of other help options) - -%s: error: Unknown destination tag: dest_tag_name -""" % (progname, progname) + expected = self.format_error_message("Unknown destination tag: dest_tag_name") self.assertMultiLineEqual(actual, expected) # Finally, assert that things were called as we expected. activate_session_mock.assert_called_once_with(self.session, self.options) @@ -456,11 +458,7 @@ Task info: weburl/taskinfo?taskID=1 with self.assertRaises(SystemExit) as cm: handle_build(self.options, self.session, args) actual = stderr.getvalue() - expected = """Usage: %s build [options] -(Specify the --help global option for a list of other help options) - -%s: error: Destination tag dest_tag_name is locked -""" % (progname, progname) + expected = self.format_error_message("Destination tag dest_tag_name is locked") self.assertMultiLineEqual(actual, expected) # Finally, assert that things were called as we expected. activate_session_mock.assert_called_once_with(self.session, self.options)