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
This commit is contained in:
Tomas Kopecek 2020-04-02 10:55:37 +02:00
commit ae05aa7654
2 changed files with 56 additions and 34 deletions

View file

@ -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] <target> <srpm path or scm url>")
usage = _("""\
usage: %prog build [options] <target> <srpm path or scm url>
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] <tag> <package> [<package> ...]")
"""[info] Print the latest builds for a tag"""
usage = _("""\
usage: %prog latest-build [options] <tag> <package> [<package> ...]
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=<target>'
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",

View file

@ -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] <target> <srpm path or scm url>
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] <target> <srpm path or scm url>
(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] <target> <srpm path or scm url>
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] <target> <srpm path or scm url>
(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] <target> <srpm path or scm url>
(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] <target> <srpm path or scm url>
(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] <target> <srpm path or scm url>
(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)