diff --git a/osc/commandline.py b/osc/commandline.py index f9dd846f..6cd4e27d 100644 --- a/osc/commandline.py +++ b/osc/commandline.py @@ -5156,7 +5156,7 @@ Please submit there instead, or use --nodevelproject to force direct submission. help='Disable results for all direct affect packages inside of the project') @cmdln.option('-M', '--multibuild-package', action='append', default=[], help='Only show results for the specified multibuild package') - @cmdln.option('-w', '--watch', action='store_true', default=False, + @cmdln.option('-w', '--watch', action='store_true', help='watch the results until all finished building') @cmdln.option('', '--xml', action='store_true', default=False, help='generate output in XML (former results_meta)') @@ -5239,6 +5239,8 @@ Please submit there instead, or use --nodevelproject to force direct submission. # as well when adding a new option! @cmdln.option('-q', '--hide-legend', action='store_true', help='hide the legend') + @cmdln.option('-w', '--watch', action='store_true', + help='watch the results until all finished building, only supported with --xml') @cmdln.option('-c', '--csv', action='store_true', help='csv output') @cmdln.option('', '--xml', action='store_true', default=False, @@ -5277,9 +5279,20 @@ Please submit there instead, or use --nodevelproject to force direct submission. project = store_read_project(wd) if opts.xml: - print(''.join(show_prj_results_meta(apiurl, project, opts.repo, opts.arch))) + kwargs = {} + if opts.repo: + kwargs['repository'] = opts.repo + if opts.arch: + kwargs['arch'] = opts.arch + kwargs['wait'] = opts.watch + for results in get_package_results(apiurl, project, **kwargs): + print(results) return + if opts.watch: + print('Please implement support for osc prjresults --watch without --xml.') + return 2 + print('\n'.join(get_prj_results(apiurl, project, hide_legend=opts.hide_legend, \ csv=opts.csv, status_filter=opts.status_filter, \ name_filter=opts.name_filter, repo=opts.repo, \ diff --git a/osc/core.py b/osc/core.py index 08207d00..f5a5ef0f 100644 --- a/osc/core.py +++ b/osc/core.py @@ -5735,7 +5735,7 @@ def get_results(apiurl, project, package, verbose=False, printJoin='', *args, ** return r -def get_package_results(apiurl, project, package, wait=False, *args, **kwargs): +def get_package_results(apiurl, project, package=None, wait=False, *args, **kwargs): """generator that returns a the package results as an xml structure""" xml = '' waiting_states = ('blocked', 'scheduled', 'dispatching', 'building', diff --git a/tests/results_fixtures/oscrc b/tests/results_fixtures/oscrc new file mode 100644 index 00000000..a30e040c --- /dev/null +++ b/tests/results_fixtures/oscrc @@ -0,0 +1,103 @@ +[general] +# URL to access API server, e.g. https://api.opensuse.org +# you also need a section [https://api.opensuse.org] with the credentials +apiurl = http://localhost +# Downloaded packages are cached here. Must be writable by you. +#packagecachedir = /var/tmp/osbuild-packagecache +# Wrapper to call build as root (sudo, su -, ...) +#su-wrapper = su -c +# rootdir to setup the chroot environment +# can contain %(repo)s, %(arch)s, %(project)s and %(package)s for replacement, e.g. +# /srv/oscbuild/%(repo)s-%(arch)s or +# /srv/oscbuild/%(repo)s-%(arch)s-%(project)s-%(package)s +#build-root = /var/tmp/build-root +# compile with N jobs (default: "getconf _NPROCESSORS_ONLN") +#build-jobs = N +# build-type to use - values can be (depending on the capabilities of the 'build' script) +# empty - chroot build +# kvm - kvm VM build (needs build-device, build-swap, build-memory) +# xen - xen VM build (needs build-device, build-swap, build-memory) +# experimental: +# qemu - qemu VM build +# lxc - lxc build +#build-type = +# build-device is the disk-image file to use as root for VM builds +# e.g. /var/tmp/FILE.root +#build-device = /var/tmp/FILE.root +# build-swap is the disk-image to use as swap for VM builds +# e.g. /var/tmp/FILE.swap +#build-swap = /var/tmp/FILE.swap +# build-memory is the amount of memory used in the VM +# value in MB - e.g. 512 +#build-memory = 512 +# build-vmdisk-rootsize is the size of the disk-image used as root in a VM build +# values in MB - e.g. 4096 +#build-vmdisk-rootsize = 4096 +# build-vmdisk-swapsize is the size of the disk-image used as swap in a VM build +# values in MB - e.g. 1024 +#build-vmdisk-swapsize = 1024 +# Numeric uid:gid to assign to the "abuild" user in the build-root +# or "caller" to use the current users uid:gid +# This is convenient when sharing the buildroot with ordinary userids +# on the host. +# This should not be 0 +# build-uid = +# extra packages to install when building packages locally (osc build) +# this corresponds to osc build's -x option and can be overridden with that +# -x '' can also be given on the command line to override this setting, or +# you can have an empty setting here. +#extra-pkgs = vim gdb strace +# build platform is used if the platform argument is omitted to osc build +#build_repository = openSUSE_Factory +# default project for getpac or bco +#getpac_default_project = openSUSE:Factory +# alternate filesystem layout: have multiple subdirs, where colons were. +#checkout_no_colon = 0 +# local files to ignore with status, addremove, .... +#exclude_glob = .osc CVS .svn .* _linkerror *~ #*# *.orig *.bak *.changes.* +# keep passwords in plaintext. If you see this comment, your osc +# already uses the encrypted password, and only keeps them in plain text +# for backwards compatibility. Default will change to 0 in future releases. +# You can remove the plaintext password without harm, if you do not need +# backwards compatibility. +#plaintext_passwd = 1 +# limit the age of requests shown with 'osc req list'. +# this is a default only, can be overridden by 'osc req list -D NNN' +# Use 0 for unlimted. +#request_list_days = 0 +# show info useful for debugging +#debug = 1 +# show HTTP traffic useful for debugging +#http_debug = 1 +# Skip signature verification of packages used for build. +#no_verify = 1 +# jump into the debugger in case of errors +#post_mortem = 1 +# print call traces in case of errors +#traceback = 1 +# use KDE/Gnome/MacOS/Windows keyring for credentials if available +#use_keyring = 1 +# check for unversioned/removed files before commit +#check_filelist = 1 +# check for pending requests after executing an action (e.g. checkout, update, commit) +#check_for_request_on_action = 0 +# what to do with the source package if the submitrequest has been accepted. If +# nothing is specified the API default is used +#submitrequest_on_accept_action = cleanup|update|noupdate +#review requests interactively (default: off) +#request_show_review = 1 +# Directory with executables to validate sources, esp before committing +#source_validator_directory = /usr/lib/osc/source_validators + +[http://localhost] +user=Admin +pass=opensuse +# set aliases for this apiurl +# aliases = foo, bar +# email used in .changes, unless the one from osc meta prj will be used +# email = +# additional headers to pass to a request, e.g. for special authentication +#http_headers = Host: foofoobar, +# User: mumblegack +# Force using of keyring for this API +#keyring = 1 diff --git a/tests/results_fixtures/result-dirty.xml b/tests/results_fixtures/result-dirty.xml new file mode 100644 index 00000000..d6d39440 --- /dev/null +++ b/tests/results_fixtures/result-dirty.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/tests/results_fixtures/result.xml b/tests/results_fixtures/result.xml new file mode 100644 index 00000000..f50eeccd --- /dev/null +++ b/tests/results_fixtures/result.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/tests/suite.py b/tests/suite.py index 0373e24a..6d94d446 100644 --- a/tests/suite.py +++ b/tests/suite.py @@ -23,6 +23,7 @@ import test_request import test_setlinkrev import test_prdiff import test_conf +import test_results suite = unittest.TestSuite() suite.addTests(test_addfiles.suite()) @@ -40,6 +41,7 @@ suite.addTests(test_request.suite()) suite.addTests(test_setlinkrev.suite()) suite.addTests(test_prdiff.suite()) suite.addTests(test_conf.suite()) +suite.addTests(test_results.suite()) if have_xmlrunner: result = xmlrunner.XMLTestRunner(output=os.path.join(os.getcwd(), 'junit-xml-results')).run(suite) diff --git a/tests/test_results.py b/tests/test_results.py new file mode 100644 index 00000000..856560cd --- /dev/null +++ b/tests/test_results.py @@ -0,0 +1,56 @@ +import osc.commandline +from common import GET, OscTestCase +import os +import sys + +def suite(): + import unittest + return unittest.makeSuite(TestResults) + +class TestResults(OscTestCase): + def setUp(self): + OscTestCase.setUp(self, copytree=False) + + def _get_fixtures_name(self): + return 'results_fixtures' + + def _get_fixtures_dir(self): + return os.path.join(os.path.dirname(__file__), self._get_fixtures_name()) + + def _run_osc(self, *args): + """Runs osc, returning captured STDOUT as a string.""" + cli = osc.commandline.Osc() + argv = ['osc', '--no-keyring', '--no-gnome-keyring'] + argv.extend(args) + cli.main(argv=argv) + return sys.stdout.getvalue() + + def _get_fixture(self, filename): + return open(os.path.join(self._get_fixtures_dir(), filename), 'r').read() + + @GET('http://localhost/build/testproject/_result', file='result.xml') + def testPrjresults(self): + out = self._run_osc('prjresults', '--xml', 'testproject') + self.assertEqualMultiline(out, self._get_fixture('result.xml')+'\n') + + @GET('http://localhost/build/testproject/_result', file='result-dirty.xml') + @GET('http://localhost/build/testproject/_result?oldstate=c57e2ee592dbbf26ebf19cc4f1bc1e83', file='result.xml') + def testPrjresultsWatch(self): + out = self._run_osc('prjresults', '--watch', '--xml', 'testproject') + self.assertEqualMultiline(out, self._get_fixture('result-dirty.xml')+'\n'+self._get_fixture('result.xml')+'\n') + + @GET('http://localhost/build/testproject/_result?package=python-MarkupSafe&multibuild=1&locallink=1', file='result.xml') + def testResults(self): + out = self._run_osc('results', '--xml', 'testproject', 'python-MarkupSafe') + self.assertEqualMultiline(out, self._get_fixture('result.xml')) + + @GET('http://localhost/build/testproject/_result?package=python-MarkupSafe&multibuild=1&locallink=1', file='result-dirty.xml') + @GET('http://localhost/build/testproject/_result?package=python-MarkupSafe&oldstate=c57e2ee592dbbf26ebf19cc4f1bc1e83&multibuild=1&locallink=1', file='result.xml') + def testResultsWatch(self): + out = self._run_osc('results', '--watch', '--xml', 'testproject', 'python-MarkupSafe') + self.assertEqualMultiline(out, self._get_fixture('result-dirty.xml')+self._get_fixture('result.xml')) + +if __name__ == '__main__': + import unittest + unittest.main() +