Merge lp:~nskaggs/checkbox/pilot into lp:~canonical-platform-qa/checkbox/easing-login-pain

Proposed by Nicholas Skaggs
Status: Superseded
Proposed branch: lp:~nskaggs/checkbox/pilot
Merge into: lp:~canonical-platform-qa/checkbox/easing-login-pain
Diff against target: 88771 lines (+46762/-11223)
264 files modified
checkbox-ng/checkbox_ng/__init__.py (+1/-1)
checkbox-ng/checkbox_ng/commands/newcli.py (+21/-11)
checkbox-ng/checkbox_ng/commands/sru.py (+1/-1)
checkbox-ng/checkbox_ng/misc.py (+27/-3)
checkbox-ng/checkbox_ng/test_misc.py (+1/-1)
checkbox-ng/checkbox_ng/ui.py (+4/-1)
checkbox-ng/docs/changelog.rst (+18/-4)
checkbox-ng/launchers/checkbox-cli2 (+596/-0)
checkbox-ng/po/POTFILES.in (+0/-6)
checkbox-ng/po/checkbox-ng.pot (+206/-360)
checkbox-ng/po/es.po (+207/-361)
checkbox-ng/po/pl.po (+209/-365)
checkbox-ng/po/zh_TW.po (+433/-0)
checkbox-ng/setup.py (+2/-2)
checkbox-support/checkbox_support/parsers/submission.py (+40/-0)
checkbox-support/checkbox_support/parsers/tests/fixtures/submission_snap_packages.xml (+12/-0)
checkbox-support/checkbox_support/parsers/tests/test_submission.py (+16/-0)
checkbox-support/checkbox_support/parsers/udevadm.py (+5/-3)
checkbox-support/setup.py (+1/-1)
checkbox-touch/Makefile (+22/-0)
checkbox-touch/build-me (+76/-9)
checkbox-touch/checkbox-touch.qml (+116/-101)
checkbox-touch/components/CheckboxTouchApplication.qml (+24/-7)
checkbox-touch/components/CommandOutputPage.qml (+2/-0)
checkbox-touch/components/InteractIntroPage.qml (+1/-1)
checkbox-touch/components/PasswordDialog.qml (+3/-0)
checkbox-touch/components/PieChart.qml (+79/-0)
checkbox-touch/components/QmlConfinedPage.qml (+29/-4)
checkbox-touch/components/QmlNativePage.qml (+1/-0)
checkbox-touch/components/ResultsPage.qml (+25/-14)
checkbox-touch/components/ResumeSessionPage.qml (+1/-1)
checkbox-touch/components/SelectionPage.qml (+34/-7)
checkbox-touch/components/TestVerificationPage.qml (+2/-0)
checkbox-touch/components/UserInteractSummaryPage.qml (+2/-1)
checkbox-touch/components/WelcomePage.qml (+5/-5)
checkbox-touch/confinement/generate.py (+20/-16)
checkbox-touch/confinement/plainbox-confined-shell.qml (+3/-2)
checkbox-touch/get-libs (+2/-4)
checkbox-touch/manifest.json (+8/-8)
checkbox-touch/po/checkbox-touch.pot (+305/-15)
checkbox-touch/po/es.po (+309/-19)
checkbox-touch/po/fr.po (+333/-0)
checkbox-touch/po/hu.po (+309/-19)
checkbox-touch/po/pl.po (+319/-20)
checkbox-touch/po/ug.po (+324/-0)
checkbox-touch/po/zh_TW.po (+327/-0)
checkbox-touch/py/checkbox_touch.py (+70/-8)
checkbox-touch/sso-login.qml (+3/-1)
checkbox-touch/tests/autopilot/autopilot-provider/units/autopilot.pxu (+27/-0)
checkbox-touch/tests/autopilot/checkbox_touch/test_checkbox_touch.py (+61/-40)
checkbox-touch/tests/autopilot/checkbox_touch/test_sudo_tests.py (+86/-0)
plainbox/docs/author/index.rst (+1/-0)
plainbox/docs/author/qml-job-tutorial.rst (+369/-0)
plainbox/docs/changelog.rst (+94/-3)
plainbox/docs/dev/resources.rst (+31/-42)
plainbox/docs/manpages/plainbox-exporter-units.rst (+31/-24)
plainbox/docs/manpages/plainbox-job-units.rst (+72/-12)
plainbox/docs/manpages/plainbox-template-units.rst (+3/-0)
plainbox/docs/manpages/plainbox-test-plan-units.rst (+20/-2)
plainbox/docs/ref/plainbox.impl.proxy.rst (+0/-5)
plainbox/docs/ref/plainbox.impl.session.legacy.rst (+0/-5)
plainbox/plainbox/__init__.py (+1/-1)
plainbox/plainbox/abc.py (+2/-2)
plainbox/plainbox/data/plainbox-qml-modules/Plainbox/QmlJob.qml (+1/-0)
plainbox/plainbox/data/qml-shell/plainbox_qml_shell.qml (+2/-1)
plainbox/plainbox/impl/commands/cmd_startprovider.py (+7/-1)
plainbox/plainbox/impl/commands/inv_list.py (+1/-1)
plainbox/plainbox/impl/commands/inv_run.py (+23/-5)
plainbox/plainbox/impl/commands/inv_special.py (+8/-5)
plainbox/plainbox/impl/commands/inv_startprovider.py (+39/-31)
plainbox/plainbox/impl/ctrl.py (+53/-35)
plainbox/plainbox/impl/depmgr.py (+1/-0)
plainbox/plainbox/impl/exporter/__init__.py (+10/-2)
plainbox/plainbox/impl/exporter/xlsx.py (+36/-8)
plainbox/plainbox/impl/ingredients.py (+42/-1)
plainbox/plainbox/impl/providers/categories/po/es.po (+2/-2)
plainbox/plainbox/impl/providers/categories/po/fr.po (+236/-0)
plainbox/plainbox/impl/providers/categories/po/pl.po (+2/-2)
plainbox/plainbox/impl/providers/categories/po/ug.po (+236/-0)
plainbox/plainbox/impl/providers/categories/po/zh_TW.po (+236/-0)
plainbox/plainbox/impl/providers/exporters/data/hexr.xml (+12/-0)
plainbox/plainbox/impl/providers/manifest/manage.py (+50/-3)
plainbox/plainbox/impl/providers/manifest/po/pl.po (+2/-2)
plainbox/plainbox/impl/providers/manifest/po/zh_TW.po (+107/-0)
plainbox/plainbox/impl/providers/stubbox/po/de.po (+2/-2)
plainbox/plainbox/impl/providers/stubbox/po/en_GB.po (+2/-2)
plainbox/plainbox/impl/providers/stubbox/po/pl.po (+2/-2)
plainbox/plainbox/impl/providers/stubbox/po/pt.po (+2/-2)
plainbox/plainbox/impl/providers/stubbox/po/ug.po (+524/-0)
plainbox/plainbox/impl/resource.py (+65/-46)
plainbox/plainbox/impl/result.py (+12/-0)
plainbox/plainbox/impl/runner.py (+9/-5)
plainbox/plainbox/impl/secure/providers/v1.py (+18/-18)
plainbox/plainbox/impl/session/assistant.py (+274/-44)
plainbox/plainbox/impl/session/restart.py (+214/-0)
plainbox/plainbox/impl/session/state.py (+7/-4)
plainbox/plainbox/impl/session/test_assistant.py (+5/-1)
plainbox/plainbox/impl/test_ctrl.py (+58/-14)
plainbox/plainbox/impl/test_resource.py (+22/-22)
plainbox/plainbox/impl/unit/job.py (+121/-19)
plainbox/plainbox/impl/unit/packaging.py (+16/-0)
plainbox/plainbox/impl/unit/template.py (+37/-32)
plainbox/plainbox/impl/unit/test_job.py (+72/-15)
plainbox/plainbox/impl/unit/test_testplan.py (+35/-4)
plainbox/plainbox/impl/unit/testplan.py (+26/-4)
plainbox/plainbox/qml_shell/qml_shell.qml (+6/-1)
plainbox/po/POTFILES.in (+0/-3)
plainbox/po/de.po (+727/-624)
plainbox/po/en_AU.po (+731/-628)
plainbox/po/en_CA.po (+731/-628)
plainbox/po/en_GB.po (+751/-692)
plainbox/po/es.po (+728/-625)
plainbox/po/fr.po (+4198/-0)
plainbox/po/ja.po (+727/-624)
plainbox/po/pl.po (+727/-667)
plainbox/po/plainbox.pot (+729/-626)
plainbox/po/pt.po (+731/-628)
plainbox/po/ru.po (+730/-627)
plainbox/po/tr.po (+731/-628)
plainbox/po/uk.po (+727/-624)
plainbox/po/zh_TW.po (+732/-629)
plainbox/requirements/deb-core.txt (+1/-0)
plainbox/setup.py (+2/-1)
providers/2015.com.canonical.certification:qml-tests/data/camera-06.qml (+11/-3)
providers/2015.com.canonical.certification:qml-tests/data/screen-08.qml (+148/-0)
providers/2015.com.canonical.certification:qml-tests/units/qml-tests.pxu (+9/-0)
providers/coreapps/2014.com.ubuntu.clock:clock-tests/.bzrignore (+2/-0)
providers/coreapps/2014.com.ubuntu.clock:clock-tests/jobs/clock-alarms.pxu (+242/-0)
providers/coreapps/2014.com.ubuntu.clock:clock-tests/jobs/clock-setting.pxu (+29/-0)
providers/coreapps/2014.com.ubuntu.clock:clock-tests/jobs/clock-worldcity.pxu (+32/-0)
providers/coreapps/2014.com.ubuntu.clock:clock-tests/manage.py (+21/-0)
providers/coreapps/2014.com.ubuntu.clock:clock-tests/whitelists/clock-alarm.whitelist (+2/-0)
providers/coreapps/2014.com.ubuntu.clock:clock-tests/whitelists/clock-setting.whitelist (+1/-0)
providers/coreapps/2014.com.ubuntu.clock:clock-tests/whitelists/clock-worldcity.whitelist (+1/-0)
providers/coreapps/2015.com.ubuntu.dekko:dekko-tests/jobs/dekko-firstrun.pxu (+55/-0)
providers/coreapps/2015.com.ubuntu.dekko:dekko-tests/jobs/dekko-manage-mail.pxu (+88/-0)
providers/coreapps/2015.com.ubuntu.dekko:dekko-tests/jobs/dekko-manage-settings.pxu (+58/-0)
providers/coreapps/2015.com.ubuntu.dekko:dekko-tests/jobs/dekko-sending-mail.pxu (+70/-0)
providers/coreapps/2015.com.ubuntu.dekko:dekko-tests/manage.py (+21/-0)
providers/coreapps/2015.com.ubuntu.dekko:dekko-tests/whitelists/dekko-firstrun.whitelist (+1/-0)
providers/coreapps/2015.com.ubuntu.dekko:dekko-tests/whitelists/dekko-manage-mail.whitelist (+1/-0)
providers/coreapps/2015.com.ubuntu.dekko:dekko-tests/whitelists/dekko-manage-settings.whitelist (+1/-0)
providers/coreapps/2015.com.ubuntu.dekko:dekko-tests/whitelists/dekko-sending-mail.whitelist (+1/-0)
providers/coreapps/2015.com.ubuntu.music:music-tests/jobs/music-external.pxu (+62/-0)
providers/coreapps/2015.com.ubuntu.music:music-tests/jobs/music-library.pxu (+131/-0)
providers/coreapps/2015.com.ubuntu.music:music-tests/jobs/music-playlists.pxu (+73/-0)
providers/coreapps/2015.com.ubuntu.music:music-tests/jobs/music-queue.pxu (+44/-0)
providers/coreapps/2015.com.ubuntu.music:music-tests/jobs/music-recent.pxu (+28/-0)
providers/coreapps/2015.com.ubuntu.music:music-tests/manage.py (+21/-0)
providers/coreapps/2015.com.ubuntu.music:music-tests/whitelists/music-external.whitelist (+1/-0)
providers/coreapps/2015.com.ubuntu.music:music-tests/whitelists/music-library.whitelist (+1/-0)
providers/coreapps/2015.com.ubuntu.music:music-tests/whitelists/music-playlists.whitelist (+1/-0)
providers/coreapps/2015.com.ubuntu.music:music-tests/whitelists/music-queue.whitelist (+1/-0)
providers/coreapps/2015.com.ubuntu.music:music-tests/whitelists/music-recent.whitelist (+1/-0)
providers/coreapps/2015.com.ubuntu.weather:weather-tests/jobs/weather-firstrun.pxu (+71/-0)
providers/coreapps/2015.com.ubuntu.weather:weather-tests/jobs/weather-forecasts.pxu (+64/-0)
providers/coreapps/2015.com.ubuntu.weather:weather-tests/jobs/weather-locations.pxu (+83/-0)
providers/coreapps/2015.com.ubuntu.weather:weather-tests/jobs/weather-settings.pxu (+42/-0)
providers/coreapps/2015.com.ubuntu.weather:weather-tests/manage.py (+21/-0)
providers/coreapps/2015.com.ubuntu.weather:weather-tests/whitelists/weather-firstrun.whitelist (+1/-0)
providers/coreapps/2015.com.ubuntu.weather:weather-tests/whitelists/weather-forecasts.whitelist (+1/-0)
providers/coreapps/2015.com.ubuntu.weather:weather-tests/whitelists/weather-locations.whitelist (+1/-0)
providers/coreapps/2015.com.ubuntu.weather:weather-tests/whitelists/weather-settings.whitelist (+1/-0)
providers/plainbox-provider-checkbox/bin/brightness_test (+2/-2)
providers/plainbox-provider-checkbox/bin/camera_test (+1/-1)
providers/plainbox-provider-checkbox/bin/disk_info (+3/-1)
providers/plainbox-provider-checkbox/bin/disk_smart (+2/-1)
providers/plainbox-provider-checkbox/bin/dmitest (+2/-1)
providers/plainbox-provider-checkbox/bin/fwts_test (+5/-3)
providers/plainbox-provider-checkbox/bin/graphics_driver (+2/-2)
providers/plainbox-provider-checkbox/bin/key_test (+0/-1)
providers/plainbox-provider-checkbox/bin/memory_compare (+7/-1)
providers/plainbox-provider-checkbox/bin/network (+60/-40)
providers/plainbox-provider-checkbox/bin/pm_test (+26/-33)
providers/plainbox-provider-checkbox/bin/rotation_test_using_dbus (+47/-0)
providers/plainbox-provider-checkbox/bin/sleep_time_check (+9/-3)
providers/plainbox-provider-checkbox/jobs/audio.txt.in (+11/-11)
providers/plainbox-provider-checkbox/jobs/benchmarks.txt.in (+2/-2)
providers/plainbox-provider-checkbox/jobs/bluetooth.txt.in (+1/-1)
providers/plainbox-provider-checkbox/jobs/cpu.txt.in (+5/-5)
providers/plainbox-provider-checkbox/jobs/disk.txt.in (+12/-6)
providers/plainbox-provider-checkbox/jobs/ethernet.txt.in (+106/-111)
providers/plainbox-provider-checkbox/jobs/firmware.txt.in (+2/-2)
providers/plainbox-provider-checkbox/jobs/graphics.txt.in (+1/-24)
providers/plainbox-provider-checkbox/jobs/info.txt.in (+7/-4)
providers/plainbox-provider-checkbox/jobs/keys.txt.in (+1/-1)
providers/plainbox-provider-checkbox/jobs/led.txt.in (+1/-1)
providers/plainbox-provider-checkbox/jobs/mediacard.txt.in (+8/-8)
providers/plainbox-provider-checkbox/jobs/memory.txt.in (+4/-1)
providers/plainbox-provider-checkbox/jobs/miscellanea.txt.in (+46/-46)
providers/plainbox-provider-checkbox/jobs/mobilebroadband.txt.in (+46/-58)
providers/plainbox-provider-checkbox/jobs/networking.txt.in (+18/-20)
providers/plainbox-provider-checkbox/jobs/optical.txt.in (+3/-2)
providers/plainbox-provider-checkbox/jobs/panel_clock_test.txt.in (+1/-1)
providers/plainbox-provider-checkbox/jobs/power-management.txt.in (+1/-1)
providers/plainbox-provider-checkbox/jobs/stress.txt.in (+33/-5)
providers/plainbox-provider-checkbox/jobs/suspend.txt.in (+212/-76)
providers/plainbox-provider-checkbox/jobs/touchscreen.txt.in (+29/-14)
providers/plainbox-provider-checkbox/jobs/usb.txt.in (+8/-7)
providers/plainbox-provider-checkbox/jobs/user_apps.txt.in (+10/-10)
providers/plainbox-provider-checkbox/jobs/virtualization.txt.in (+2/-1)
providers/plainbox-provider-checkbox/jobs/wireless.txt.in (+191/-66)
providers/plainbox-provider-checkbox/manage.py (+1/-1)
providers/plainbox-provider-checkbox/po/fr.po (+6245/-0)
providers/plainbox-provider-checkbox/po/pl.po (+2/-2)
providers/plainbox-provider-checkbox/po/zh_TW.po (+6245/-0)
providers/plainbox-provider-checkbox/units/autotesting.pxu (+113/-0)
providers/plainbox-provider-checkbox/units/default.pxu (+114/-0)
providers/plainbox-provider-checkbox/units/hwsubmit.pxu (+35/-0)
providers/plainbox-provider-checkbox/units/smoke.pxu (+30/-0)
providers/plainbox-provider-checkbox/units/sniff.pxu (+35/-0)
providers/plainbox-provider-checkbox/whitelists/autotesting.whitelist (+0/-118)
providers/plainbox-provider-checkbox/whitelists/default.whitelist (+0/-131)
providers/plainbox-provider-checkbox/whitelists/hwsubmit.whitelist (+0/-31)
providers/plainbox-provider-checkbox/whitelists/smoke.whitelist (+0/-27)
providers/plainbox-provider-checkbox/whitelists/sniff.whitelist (+0/-36)
providers/plainbox-provider-checkbox/whitelists/sru.whitelist (+0/-122)
providers/plainbox-provider-piglit/po/pl.po (+2/-2)
providers/plainbox-provider-piglit/po/ug.po (+298/-0)
providers/plainbox-provider-piglit/po/zh_TW.po (+298/-0)
providers/plainbox-provider-resource-generic/jobs/resource.pxu (+0/-5)
providers/plainbox-provider-resource-generic/manage.py (+1/-1)
providers/plainbox-provider-resource-generic/po/fr.po (+236/-0)
providers/plainbox-provider-resource-generic/po/ug.po (+196/-0)
providers/plainbox-provider-resource-generic/po/zh_TW.po (+196/-0)
providers/plainbox-provider-sru/.bzrignore (+2/-0)
providers/plainbox-provider-sru/.gitignore (+2/-0)
providers/plainbox-provider-sru/README.rst (+5/-0)
providers/plainbox-provider-sru/manage.py (+22/-0)
providers/plainbox-provider-sru/po/2013_com_canonical_certification_sru.pot (+22/-0)
providers/plainbox-provider-sru/po/POTFILES.in (+2/-0)
providers/plainbox-provider-sru/units/sru.pxu (+139/-0)
providers/plainbox-provider-tpm/COPYING (+674/-0)
providers/plainbox-provider-tpm/README.rst (+5/-0)
providers/plainbox-provider-tpm/bin/dmi-sysfs-resource (+59/-0)
providers/plainbox-provider-tpm/bin/tpm-sysfs-resource (+80/-0)
providers/plainbox-provider-tpm/iterate.sh (+27/-0)
providers/plainbox-provider-tpm/manage.py (+31/-0)
providers/plainbox-provider-tpm/po/POTFILES.in (+10/-0)
providers/plainbox-provider-tpm/po/pl.po (+455/-0)
providers/plainbox-provider-tpm/po/plainbox-provider-tpm.pot (+448/-0)
providers/plainbox-provider-tpm/po/zh_TW.po (+449/-0)
providers/plainbox-provider-tpm/units/category.pxu (+21/-0)
providers/plainbox-provider-tpm/units/lenovo.pxu (+61/-0)
providers/plainbox-provider-tpm/units/manifest.pxu (+22/-0)
providers/plainbox-provider-tpm/units/packaging.pxu (+28/-0)
providers/plainbox-provider-tpm/units/sysfs.pxu (+93/-0)
providers/plainbox-provider-tpm/units/test-plan.pxu (+70/-0)
providers/plainbox-provider-tpm/units/tpm.pxu (+279/-0)
providers/plainbox-provider-tpm/units/unused.pxu (+28/-0)
providers/plainbox-provider-ubuntu-touch/po/fr.po (+5272/-0)
providers/plainbox-provider-ubuntu-touch/po/pl.po (+2/-2)
support/release/README (+77/-1)
support/release/lp-roadmap-query (+2/-2)
support/release/release_checkbox.py (+48/-21)
support/release/releasectl (+36/-11)
support/requirements/deb-base.txt (+0/-1)
test-in-lxc.sh (+1/-1)
tools/canonical-hw-collection/canonical-hw-collection (+25/-23)
tools/canonical-hw-collection/setup.py (+1/-1)
tools/restart-demo/2015.pl.zygoon:restart-demo/manage.py (+22/-0)
tools/restart-demo/2015.pl.zygoon:restart-demo/units/jobs.pxu (+18/-0)
tools/restart-demo/2015.pl.zygoon:restart-demo/units/testplan.pxu (+8/-0)
tools/restart-demo/restart-demo.py (+109/-0)
To merge this branch: bzr merge lp:~nskaggs/checkbox/pilot
Reviewer Review Type Date Requested Status
Canonical Platform QA Team Pending
Review via email: mp+272994@code.launchpad.net

This proposal has been superseded by a proposal from 2016-01-05.

Description of the change

This is the code for version 1.0 in the store of pilot. It likely won't ever really be merged down into checkbox itself.

In other words, herein lies the hackery and bundled providers. Yummy.

To post a comment you must log in.
lp:~nskaggs/checkbox/pilot updated
4026. By Nicholas Skaggs

new logo, remove unneeded signal

4027. By Nicholas Skaggs

fix icon sizing :p

4028. By Nicholas Skaggs

make it a confined app, update icon again

4029. By Nicholas Skaggs

add system info to all providers

4030. By Nicholas Skaggs

fix system info jobs

4031. By Nicholas Skaggs

use _256 version of icon. Fix apparmor confinement. Clarify system-information tests

4032. By Nicholas Skaggs

fix for 1501509, per nik90

4033. By Nicholas Skaggs

add more input hints

4034. By Nicholas Skaggs

fix policy version

4035. By Nicholas Skaggs

fix policy

4036. By Nicholas Skaggs

back to unconfined

4037. By Nicholas Skaggs

store version

4038. By Nicholas Skaggs

remove PT reference, and clarify ubuntu SSO login

4039. By Nicholas Skaggs

bump for store version 1.1.3

4040. By Nicholas Skaggs

rebase to trunk

4041. By Nicholas Skaggs

fix weather test error

4042. By Nicholas Skaggs

merge-down trunk. This killed hacks for re-run screen and submission screen

4043. By Nicholas Skaggs

re-merge checkbox trunk

4044. By Nicholas Skaggs

remove the coreapps providers from tree

Unmerged revisions

4044. By Nicholas Skaggs

remove the coreapps providers from tree

4043. By Nicholas Skaggs

re-merge checkbox trunk

4042. By Nicholas Skaggs

merge-down trunk. This killed hacks for re-run screen and submission screen

4041. By Nicholas Skaggs

fix weather test error

4040. By Nicholas Skaggs

rebase to trunk

4039. By Nicholas Skaggs

bump for store version 1.1.3

4038. By Nicholas Skaggs

remove PT reference, and clarify ubuntu SSO login

4037. By Nicholas Skaggs

store version

4036. By Nicholas Skaggs

back to unconfined

4035. By Nicholas Skaggs

fix policy

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'checkbox-ng/checkbox_ng/__init__.py'
--- checkbox-ng/checkbox_ng/__init__.py 2015-07-16 20:50:36 +0000
+++ checkbox-ng/checkbox_ng/__init__.py 2016-01-05 21:24:37 +0000
@@ -24,4 +24,4 @@
24CheckBoxNG is a new version of CheckBox built on top of PlainBox24CheckBoxNG is a new version of CheckBox built on top of PlainBox
25"""25"""
2626
27__version__ = (0, 21, 0, "dev", 0)27__version__ = (0, 24, 0, "dev", 0)
2828
=== modified file 'checkbox-ng/checkbox_ng/commands/newcli.py'
--- checkbox-ng/checkbox_ng/commands/newcli.py 2015-09-08 13:11:18 +0000
+++ checkbox-ng/checkbox_ng/commands/newcli.py 2016-01-05 21:24:37 +0000
@@ -46,8 +46,9 @@
46from plainbox.impl.secure.qualifiers import RegExpJobQualifier46from plainbox.impl.secure.qualifiers import RegExpJobQualifier
47from plainbox.impl.secure.qualifiers import select_jobs47from plainbox.impl.secure.qualifiers import select_jobs
48from plainbox.impl.session import SessionMetaData48from plainbox.impl.session import SessionMetaData
49from plainbox.impl.session.jobs import InhibitionCause
50from plainbox.impl.transport import TransportError
49from plainbox.impl.transport import get_all_transports51from plainbox.impl.transport import get_all_transports
50from plainbox.impl.transport import TransportError
51from plainbox.vendor.textland import get_display52from plainbox.vendor.textland import get_display
5253
53from checkbox_ng.misc import SelectableJobTreeNode54from checkbox_ng.misc import SelectableJobTreeNode
@@ -318,7 +319,7 @@
318 # NOTE: tree.selection is correct but ordered badly. To retain319 # NOTE: tree.selection is correct but ordered badly. To retain
319 # the original ordering we should just treat it as a mask and320 # the original ordering we should just treat it as a mask and
320 # use it to filter jobs from desired_job_list.321 # use it to filter jobs from desired_job_list.
321 wanted_set = frozenset(tree.selection)322 wanted_set = frozenset(tree.selection + tree.resource_jobs)
322 job_list = [job for job in self.manager.state.run_list323 job_list = [job for job in self.manager.state.run_list
323 if job in wanted_set]324 if job in wanted_set]
324 self._update_desired_job_list(job_list)325 self._update_desired_job_list(job_list)
@@ -435,7 +436,7 @@
435 self.config.email_address)436 self.config.email_address)
436 transport = transport_cls(self.config.lp_url, options_string)437 transport = transport_cls(self.config.lp_url, options_string)
437 # TRANSLATORS: Do not translate the {} format markers.438 # TRANSLATORS: Do not translate the {} format markers.
438 print(_("Submitting results to {0} for email_address {1})").format(439 print(_("Submitting results to {0} for email_address {1}").format(
439 self.config.lp_url, self.config.email_address))440 self.config.lp_url, self.config.email_address))
440 with open(self.submission_file, encoding='utf-8') as stream:441 with open(self.submission_file, encoding='utf-8') as stream:
441 try:442 try:
@@ -460,7 +461,7 @@
460 from checkbox_ng.certification import InvalidSecureIDError461 from checkbox_ng.certification import InvalidSecureIDError
461 transport_cls = get_all_transports().get('certification')462 transport_cls = get_all_transports().get('certification')
462 # TRANSLATORS: Do not translate the {} format markers.463 # TRANSLATORS: Do not translate the {} format markers.
463 print(_("Submitting results to {0} for secure_id {1})").format(464 print(_("Submitting results to {0} for secure_id {1}").format(
464 self.config.c3_url, self.config.secure_id))465 self.config.c3_url, self.config.secure_id))
465 option_chunks = []466 option_chunks = []
466 option_chunks.append("secure_id={0}".format(self.config.secure_id))467 option_chunks.append("secure_id={0}".format(self.config.secure_id))
@@ -491,19 +492,23 @@
491 print(str(exc))492 print(str(exc))
492493
493 def maybe_rerun_jobs(self):494 def maybe_rerun_jobs(self):
494 def rerun_predicate(job_state):
495 return job_state.result.outcome in (
496 IJobResult.OUTCOME_FAIL, IJobResult.OUTCOME_CRASH)
497 # create a list of jobs that qualify for rerunning495 # create a list of jobs that qualify for rerunning
498 rerun_candidates = []496 rerun_candidates = []
499 for job in self.manager.state.run_list:497 for job in self.manager.state.run_list:
500 if rerun_predicate(self.manager.state.job_state_map[job.id]):498 job_state = self.manager.state.job_state_map[job.id]
499 if job_state.result.outcome in (
500 IJobResult.OUTCOME_FAIL, IJobResult.OUTCOME_CRASH,
501 IJobResult.OUTCOME_NOT_SUPPORTED):
501 rerun_candidates.append(job)502 rerun_candidates.append(job)
503
502 # bail-out early if no job qualifies for rerunning504 # bail-out early if no job qualifies for rerunning
503 if not rerun_candidates:505 if not rerun_candidates:
504 return False506 return False
505 tree = SelectableJobTreeNode.create_tree(507 tree = SelectableJobTreeNode.create_tree(
506 self.manager.state, rerun_candidates)508 self.manager.state, rerun_candidates)
509 # nothing to select in root node and categories - bailing out
510 if not tree.jobs and not tree._categories:
511 return False
507 # deselect all by default512 # deselect all by default
508 tree.set_descendants_state(False)513 tree.set_descendants_state(False)
509 self.display.run(ShowRerun(tree, _("Select jobs to re-run")))514 self.display.run(ShowRerun(tree, _("Select jobs to re-run")))
@@ -511,10 +516,15 @@
511 if not wanted_set:516 if not wanted_set:
512 # nothing selected - nothing to run517 # nothing selected - nothing to run
513 return False518 return False
514 rerun_job_list = [job for job in self.manager.state.run_list519 # include resource jobs that selected jobs depend on
515 if job in wanted_set]520 resources_to_rerun = []
521 for job in wanted_set:
522 job_state = self.manager.state.job_state_map[job.id]
523 for inhibitor in job_state.readiness_inhibitor_list:
524 if inhibitor.cause == InhibitionCause.FAILED_DEP:
525 resources_to_rerun.append(inhibitor.related_job)
516 # reset outcome of jobs that are selected for re-running526 # reset outcome of jobs that are selected for re-running
517 for job in wanted_set:527 for job in list(wanted_set) + resources_to_rerun:
518 from plainbox.impl.result import MemoryJobResult528 from plainbox.impl.result import MemoryJobResult
519 self.manager.state.job_state_map[job.id].result = \529 self.manager.state.job_state_map[job.id].result = \
520 MemoryJobResult({})530 MemoryJobResult({})
521531
=== modified file 'checkbox-ng/checkbox_ng/commands/sru.py'
--- checkbox-ng/checkbox_ng/commands/sru.py 2015-09-07 13:40:15 +0000
+++ checkbox-ng/checkbox_ng/commands/sru.py 2016-01-05 21:24:37 +0000
@@ -128,7 +128,7 @@
128128
129 def _collect_info(self, rc, sa):129 def _collect_info(self, rc, sa):
130 sa.select_providers('*')130 sa.select_providers('*')
131 sa.start_new_session(_("Hardware Collection Session"))131 sa.start_new_session(_("SRU Session"))
132 sa.select_test_plan(self.config.test_plan)132 sa.select_test_plan(self.config.test_plan)
133 sa.bootstrap()133 sa.bootstrap()
134 for job_id in sa.get_static_todo_list():134 for job_id in sa.get_static_todo_list():
135135
=== modified file 'checkbox-ng/checkbox_ng/misc.py'
--- checkbox-ng/checkbox_ng/misc.py 2015-09-17 13:32:38 +0000
+++ checkbox-ng/checkbox_ng/misc.py 2016-01-05 21:24:37 +0000
@@ -145,6 +145,28 @@
145 builder.auto_add_job(job)145 builder.auto_add_job(job)
146 return builder.root_node146 return builder.root_node
147147
148 @classmethod
149 def create_simple_tree(cls, sa, job_list):
150 """
151 Build a rooted JobTreeNode from a job list.
152
153 :argument sa:
154 A session assistant object
155 :argument job_list:
156 List of jobs to consider for building the tree.
157 """
158 root_node = cls()
159 for job in job_list:
160 cat_name = sa.get_category(job.category_id).tr_name()
161 matches = [n for n in root_node.categories if n.name == cat_name]
162 if not matches:
163 node = cls(cat_name)
164 root_node.add_category(node)
165 else:
166 node = matches[0]
167 node.add_job(job)
168 return root_node
169
148170
149class TreeBuilder:171class TreeBuilder:
150172
@@ -349,11 +371,13 @@
349 for job in self.job_selection:371 for job in self.job_selection:
350 if self.job_selection[job]:372 if self.job_selection[job]:
351 self._selection_list.append(job)373 self._selection_list.append(job)
352 # Don't forget to append the collected resource jobs to the final
353 # selection
354 self._selection_list.extend(self._resource_jobs)
355 return self._selection_list374 return self._selection_list
356375
376 @property
377 def resource_jobs(self):
378 """Return all the resource jobs."""
379 return self._resource_jobs
380
357 def set_ancestors_state(self, new_state):381 def set_ancestors_state(self, new_state):
358 """382 """
359 Set the selection state of all ancestors consistently383 Set the selection state of all ancestors consistently
360384
=== modified file 'checkbox-ng/checkbox_ng/test_misc.py'
--- checkbox-ng/checkbox_ng/test_misc.py 2015-09-17 13:32:38 +0000
+++ checkbox-ng/checkbox_ng/test_misc.py 2016-01-05 21:24:37 +0000
@@ -180,4 +180,4 @@
180 # Note that in addition to the selected (D) test, we need the180 # Note that in addition to the selected (D) test, we need the
181 # tree selection to contain the resource (F), even though the181 # tree selection to contain the resource (F), even though the
182 # user never saw it in the previous tests for visual presentation.182 # user never saw it in the previous tests for visual presentation.
183 self.assertEqual(self.tree.selection, [self.D, self.F])183 self.assertEqual(self.tree.selection, [self.D])
184184
=== modified file 'checkbox-ng/checkbox_ng/ui.py'
--- checkbox-ng/checkbox_ng/ui.py 2015-06-10 15:04:50 +0000
+++ checkbox-ng/checkbox_ng/ui.py 2016-01-05 21:24:37 +0000
@@ -77,12 +77,13 @@
77 """77 """
78 Display the appropriate menu and return the selected options78 Display the appropriate menu and return the selected options
79 """79 """
80 def __init__(self, title, menu, selection=[0]):80 def __init__(self, title, menu, selection=[0], multiple_allowed=True):
81 self.image = TextImage(Size(0, 0))81 self.image = TextImage(Size(0, 0))
82 self.title = title82 self.title = title
83 self.menu = menu83 self.menu = menu
84 self.option_count = len(menu)84 self.option_count = len(menu)
85 self.position = 0 # Zero-based index of the selected menu option85 self.position = 0 # Zero-based index of the selected menu option
86 self.multiple_allowed = multiple_allowed
86 if self.option_count:87 if self.option_count:
87 self.selection = selection88 self.selection = selection
88 else:89 else:
@@ -110,6 +111,8 @@
110 self.selection.remove(self.position)111 self.selection.remove(self.position)
111 elif self.position < self.option_count:112 elif self.position < self.option_count:
112 self.selection.append(self.position)113 self.selection.append(self.position)
114 if not self.multiple_allowed:
115 self.selection = [self.position]
113 self.repaint(event)116 self.repaint(event)
114 return self.image117 return self.image
115118
116119
=== modified file 'checkbox-ng/docs/changelog.rst'
--- checkbox-ng/docs/changelog.rst 2014-09-16 12:53:41 +0000
+++ checkbox-ng/docs/changelog.rst 2016-01-05 21:24:37 +0000
@@ -6,18 +6,32 @@
6 accounting of development history please inspect the source history6 accounting of development history please inspect the source history
7 directly.7 directly.
88
9.. _version_0_23:
10
11CheckboxNG 0.23 (unreleased)
12^^^^^^^^^^^^^^^^^^^^^^^^^^^^
13
14* Bugfixes: https://launchpad.net/checkbox-ng/+milestone/0.23
15
16.. _version_0_22:
17
18CheckboxNG 0.22
19^^^^^^^^^^^^^^^
20
21* Bugfixes: https://launchpad.net/checkbox-ng/+milestone/0.22
22
9CheckboxNG 0.323CheckboxNG 0.3
10--------------24^^^^^^^^^^^^^^
1125
12* Bugfixes: https://launchpad.net/checkbox-ng/+milestone/0.326* Bugfixes: https://launchpad.net/checkbox-ng/+milestone/0.3
1327
14CheckboxNG 0.228CheckboxNG 0.2
15--------------29^^^^^^^^^^^^^^
1630
17???31* Bugfixes: https://launchpad.net/checkbox-ng/+milestone/0.2
1832
19CheckboxNG 0.133CheckboxNG 0.1
20--------------34^^^^^^^^^^^^^^
2135
22* Initial release36* Initial release
23* Support for displaying configuration37* Support for displaying configuration
2438
=== added file 'checkbox-ng/launchers/checkbox-cli2'
--- checkbox-ng/launchers/checkbox-cli2 1970-01-01 00:00:00 +0000
+++ checkbox-ng/launchers/checkbox-cli2 2016-01-05 21:24:37 +0000
@@ -0,0 +1,596 @@
1#!/usr/bin/env python3
2# This file is part of Checkbox.
3#
4# Copyright 2015 Canonical Ltd.
5# Written by:
6# Sylvain Pineau <sylvain.pineau@canonical.com>
7#
8# Checkbox is free software: you can redistribute it and/or modify
9# it under the terms of the GNU General Public License version 3,
10# as published by the Free Software Foundation.
11#
12# Checkbox is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License
18# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.
19
20"""
21Checkbox CLI Application.
22
23WARNING: this is not a launcher interpreter.
24"""
25
26from argparse import SUPPRESS
27from shutil import copyfileobj
28import gettext
29import io
30import json
31import logging
32import os
33import sys
34
35from guacamole import Command
36from guacamole.core import Ingredient
37from guacamole.ingredients import ansi
38from guacamole.ingredients import argparse
39from guacamole.ingredients import cmdtree
40from guacamole.recipes.cmd import CommandRecipe
41
42# TODO: use public APIs here
43from plainbox.abc import IJobResult
44from plainbox.i18n import ngettext
45from plainbox.i18n import pgettext as C_
46from plainbox.impl.commands.inv_run import seconds_to_human_duration
47from plainbox.impl.commands.inv_run import Action
48from plainbox.impl.commands.inv_run import ActionUI
49from plainbox.impl.commands.inv_run import NormalUI
50from plainbox.impl.commands.inv_run import ReRunJob
51from plainbox.impl.color import Colorizer
52from plainbox.impl.exporter import ByteStringStreamTranslator
53from plainbox.impl.ingredients import CanonicalCrashIngredient
54from plainbox.impl.ingredients import RenderingContextIngredient
55from plainbox.impl.ingredients import SessionAssistantIngredient
56from plainbox.impl.result import tr_outcome
57from plainbox.impl.result import JobResultBuilder
58from plainbox.impl.result import MemoryJobResult
59from plainbox.impl.session.assistant import SA_RESTARTABLE
60from plainbox.impl.session.jobs import InhibitionCause
61from plainbox.vendor.textland import get_display
62
63from checkbox_ng.misc import SelectableJobTreeNode
64from checkbox_ng.ui import ScrollableTreeNode
65from checkbox_ng.ui import ShowMenu
66from checkbox_ng.ui import ShowRerun
67
68
69_ = gettext.gettext
70
71_logger = logging.getLogger("checkbox-cli")
72
73
74class DisplayIngredient(Ingredient):
75
76 """Ingredient that adds a Textland display to guacamole."""
77
78 def late_init(self, context):
79 """Add a DisplayIngredient as ``display`` to the guacamole context."""
80 context.display = get_display()
81
82
83class CheckboxCommandRecipe(CommandRecipe):
84
85 """A recipe for using Checkbox-enhanced commands."""
86
87 def get_ingredients(self):
88 """Get a list of ingredients for guacamole."""
89 return [
90 cmdtree.CommandTreeBuilder(self.command),
91 cmdtree.CommandTreeDispatcher(),
92 argparse.ParserIngredient(),
93 CanonicalCrashIngredient(),
94 ansi.ANSIIngredient(),
95 SessionAssistantIngredient(),
96 RenderingContextIngredient(),
97 DisplayIngredient()
98 ]
99
100
101class CheckboxUI(NormalUI):
102
103 def considering_job(self, job, job_state):
104 pass
105
106
107class CheckboxCommand(Command):
108
109 """
110 A command with Checkbox-enhanced ingredients.
111
112 This command has two additional items in the guacamole execution context,
113 the :class:`DisplayIngredient` object ``display`` and the
114 :class:`SessionAssistant` object ``sa``.
115 """
116
117 bug_report_url = "https://bugs.launchpad.net/checkbox-ng/+filebug"
118
119 def main(self, argv=None, exit=True):
120 """
121 Shortcut for running a command.
122
123 See :meth:`guacamole.recipes.Recipe.main()` for details.
124 """
125 return CheckboxCommandRecipe(self).main(argv, exit)
126
127
128class checkbox_cli(CheckboxCommand):
129
130 """Tool to run Checkbox jobs interactively from the command line."""
131
132 app_id = 'checkbox-cli'
133
134 def get_sa_api_version(self):
135 return '0.99'
136
137 def get_sa_api_flags(self):
138 return (SA_RESTARTABLE,)
139
140 def register_arguments(self, parser):
141 """Method called to register command line arguments."""
142 parser.add_argument(
143 '-t', '--test-plan', action="store", metavar=_("TEST-PLAN-ID"),
144 default=None,
145 # TRANSLATORS: this is in imperative form
146 help=_("load the specified test plan"))
147 parser.add_argument(
148 '--secure_id', metavar="SECURE_ID",
149 help=_("Canonical hardware identifier (optional)"))
150 parser.add_argument(
151 '--non-interactive', action='store_true',
152 help=_("skip tests that require interactivity"))
153 parser.add_argument(
154 '--dont-suppress-output', action="store_true", default=False,
155 help=_("don't suppress the output of certain job plugin types"))
156 parser.add_argument(
157 '--staging', action='store_true', default=False,
158 # Hide staging from help message (See pad.lv/1350005)
159 help=SUPPRESS)
160 parser.add_argument(
161 '--resume', dest='session_id', metavar="SESSION_ID",
162 help=SUPPRESS)
163
164 def invoked(self, ctx):
165 """Method called when the command is invoked."""
166 self.ctx = ctx
167 self.transport = self._create_transport()
168 self.C = Colorizer()
169 try:
170 self._do_normal_sequence()
171 self._export_results()
172 if ctx.args.secure_id:
173 self._send_results()
174 ctx.sa.finalize_session()
175 except KeyboardInterrupt:
176 return 1
177
178 def _export_results(self):
179 if self.is_interactive:
180 print(self.C.header(_("Results")))
181 # This requires a bit more finesse, as exporters output bytes
182 # and stdout needs a string.
183 translating_stream = ByteStringStreamTranslator(
184 sys.stdout, "utf-8")
185 self.ctx.sa.export_to_stream(
186 '2013.com.canonical.plainbox::text', (), translating_stream)
187 base_dir = os.path.join(
188 os.getenv(
189 'XDG_DATA_HOME', os.path.expanduser("~/.local/share/")),
190 "checkbox-ng")
191 if not os.path.exists(base_dir):
192 os.makedirs(base_dir)
193 exp_options = ['with-sys-info', 'with-summary', 'with-job-description',
194 'with-text-attachments', 'with-certification-status',
195 'with-job-defs', 'with-io-log', 'with-comments']
196 exporters = [
197 '2013.com.canonical.plainbox::hexr',
198 '2013.com.canonical.plainbox::html',
199 '2013.com.canonical.plainbox::xlsx',
200 '2013.com.canonical.plainbox::json',
201 ]
202 print()
203 for unit_name in exporters:
204 results_path = self.ctx.sa.export_to_file(unit_name, exp_options,
205 base_dir)
206 print("file://{}".format(results_path))
207
208 def _send_results(self):
209 print()
210 print(_("Sending hardware report to Canonical Certification"))
211 print(_("Server URL is: {0}").format(self.transport.url))
212 result = self.ctx.sa.export_to_transport(
213 "2013.com.canonical.plainbox::hexr", self.transport)
214 if 'url' in result:
215 print(result['url'])
216
217 def _create_transport(self):
218 if self.ctx.args.secure_id:
219 return self.ctx.sa.get_canonical_certification_transport(
220 self.ctx.args.secure_id, staging=self.ctx.args.staging)
221
222 def _get_interactively_picked_testplans(self):
223 test_plan_ids = self.ctx.sa.get_test_plans()
224 test_plan_names = [self.ctx.sa.get_test_plan(tp_id).name for tp_id in
225 test_plan_ids]
226 try:
227 selected_index = self.ctx.display.run(
228 ShowMenu(_("Select test plan"),
229 test_plan_names, [],
230 multiple_allowed=False))[0]
231 except IndexError:
232 return None
233 return test_plan_ids[selected_index]
234
235 def _interactively_pick_jobs_to_run(self):
236 job_list = [self.ctx.sa.get_job(job_id) for job_id in
237 self.ctx.sa.get_static_todo_list()]
238 tree = SelectableJobTreeNode.create_simple_tree(self.ctx.sa, job_list)
239 title = _('Choose tests to run on your system:')
240 self.ctx.display.run(ScrollableTreeNode(tree, title))
241 # NOTE: tree.selection is correct but ordered badly. To retain
242 # the original ordering we should just treat it as a mask and
243 # use it to filter jobs from get_static_todo_list.
244 wanted_set = frozenset([job.id for job in tree.selection])
245 job_id_list = [job_id for job_id in self.ctx.sa.get_static_todo_list()
246 if job_id in wanted_set]
247 self.ctx.sa.use_alternate_selection(job_id_list)
248
249 @property
250 def is_interactive(self):
251 """
252 Flag indicating that this is an interactive invocation.
253
254 We can then interact with the user when we encounter OUTCOME_UNDECIDED.
255 """
256 return (sys.stdin.isatty() and sys.stdout.isatty() and not
257 self.ctx.args.non_interactive)
258
259 def _get_ui_for_job(self, job):
260 if self.ctx.args.dont_suppress_output is False and job.plugin in (
261 'local', 'resource', 'attachment'):
262 return CheckboxUI(self.C.c, show_cmd_output=False)
263 else:
264 return CheckboxUI(self.C.c, show_cmd_output=True)
265
266 def _run_single_job_with_ui_loop(self, job, ui):
267 print(self.C.header(job.tr_summary(), fill='-'))
268 print(_("ID: {0}").format(job.id))
269 print(_("Category: {0}").format(
270 self.ctx.sa.get_job_state(job.id).effective_category_id))
271 comments = ""
272 while True:
273 if job.plugin in ('user-interact', 'user-interact-verify',
274 'user-verify', 'manual'):
275 ui.notify_about_purpose(job)
276 if (self.is_interactive and
277 job.plugin in ('user-interact',
278 'user-interact-verify',
279 'manual')):
280 ui.notify_about_steps(job)
281 if job.plugin == 'manual':
282 cmd = 'run'
283 else:
284 cmd = ui.wait_for_interaction_prompt(job)
285 if cmd == 'run' or cmd is None:
286 result_builder = self.ctx.sa.run_job(job.id, ui, False)
287 elif cmd == 'comment':
288 new_comment = input(self.C.BLUE(
289 _('Please enter your comments:') + '\n'))
290 if new_comment:
291 comments += new_comment + '\n'
292 continue
293 elif cmd == 'skip':
294 result_builder = JobResultBuilder(
295 outcome=IJobResult.OUTCOME_SKIP,
296 comments=_("Explicitly skipped before"
297 " execution"))
298 if comments != "":
299 result_builder.comments = comments
300 break
301 elif cmd == 'quit':
302 raise SystemExit()
303 else:
304 result_builder = self.ctx.sa.run_job(job.id, ui, False)
305 else:
306 if 'noreturn' in job.get_flag_set():
307 ui.noreturn_job()
308 result_builder = self.ctx.sa.run_job(job.id, ui, False)
309 if (self.is_interactive and
310 result_builder.outcome == IJobResult.OUTCOME_UNDECIDED):
311 try:
312 if comments != "":
313 result_builder.comments = comments
314 ui.notify_about_verification(job)
315 self._interaction_callback(job, result_builder)
316 except ReRunJob:
317 self.ctx.sa.use_job_result(job.id,
318 result_builder.get_result())
319 continue
320 break
321 return result_builder
322
323 def _pick_action_cmd(self, action_list, prompt=None):
324 return ActionUI(action_list, prompt).run()
325
326 def _interaction_callback(self, job, result_builder,
327 prompt=None, allowed_outcome=None):
328 result = result_builder.get_result()
329 if prompt is None:
330 prompt = _("Select an outcome or an action: ")
331 if allowed_outcome is None:
332 allowed_outcome = [IJobResult.OUTCOME_PASS,
333 IJobResult.OUTCOME_FAIL,
334 IJobResult.OUTCOME_SKIP]
335 allowed_actions = [
336 Action('c', _('add a comment'), 'set-comments')
337 ]
338 if IJobResult.OUTCOME_PASS in allowed_outcome:
339 allowed_actions.append(
340 Action('p', _('set outcome to {0}').format(
341 self.C.GREEN(C_('set outcome to <pass>', 'pass'))),
342 'set-pass'))
343 if IJobResult.OUTCOME_FAIL in allowed_outcome:
344 allowed_actions.append(
345 Action('f', _('set outcome to {0}').format(
346 self.C.RED(C_('set outcome to <fail>', 'fail'))),
347 'set-fail'))
348 if IJobResult.OUTCOME_SKIP in allowed_outcome:
349 allowed_actions.append(
350 Action('s', _('set outcome to {0}').format(
351 self.C.YELLOW(C_('set outcome to <skip>', 'skip'))),
352 'set-skip'))
353 if job.command is not None:
354 allowed_actions.append(
355 Action('r', _('re-run this job'), 're-run'))
356 if result.return_code is not None:
357 if result.return_code == 0:
358 suggested_outcome = IJobResult.OUTCOME_PASS
359 else:
360 suggested_outcome = IJobResult.OUTCOME_FAIL
361 allowed_actions.append(
362 Action('', _('set suggested outcome [{0}]').format(
363 tr_outcome(suggested_outcome)), 'set-suggested'))
364 while result.outcome not in allowed_outcome:
365 print(_("Please decide what to do next:"))
366 print(" " + _("outcome") + ": {0}".format(
367 self.C.result(result)))
368 if result.comments is None:
369 print(" " + _("comments") + ": {0}".format(
370 C_("none comment", "none")))
371 else:
372 print(" " + _("comments") + ": {0}".format(
373 self.C.CYAN(result.comments, bright=False)))
374 cmd = self._pick_action_cmd(allowed_actions)
375 if cmd == 'set-pass':
376 result_builder.outcome = IJobResult.OUTCOME_PASS
377 elif cmd == 'set-fail':
378 result_builder.outcome = IJobResult.OUTCOME_FAIL
379 elif cmd == 'set-skip' or cmd is None:
380 result_builder.outcome = IJobResult.OUTCOME_SKIP
381 elif cmd == 'set-suggested':
382 result_builder.outcome = suggested_outcome
383 elif cmd == 'set-comments':
384 new_comment = input(self.C.BLUE(
385 _('Please enter your comments:') + '\n'))
386 if new_comment:
387 result_builder.add_comment(new_comment)
388 elif cmd == 're-run':
389 raise ReRunJob
390 result = result_builder.get_result()
391
392 def _run_jobs(self, jobs_to_run):
393 estimated_time = 0
394 for job_id in jobs_to_run:
395 job = self.ctx.sa.get_job(job_id)
396 if (job.estimated_duration is not None
397 and estimated_time is not None):
398 estimated_time += job.estimated_duration
399 else:
400 estimated_time = None
401 for job_no, job_id in enumerate(jobs_to_run, start=1):
402 print(self.C.header(
403 _('Running job {} / {}. Estimated time left: {}').format(
404 job_no, len(jobs_to_run),
405 seconds_to_human_duration(max(0, estimated_time))
406 if estimated_time is not None else _("unknown")),
407 fill='-'))
408 job = self.ctx.sa.get_job(job_id)
409 builder = self._run_single_job_with_ui_loop(
410 job, self._get_ui_for_job(job))
411 result = builder.get_result()
412 self.ctx.sa.use_job_result(job_id, result)
413 if (job.estimated_duration is not None
414 and estimated_time is not None):
415 estimated_time -= job.estimated_duration
416
417 def _get_rerun_candidates(self):
418 """Get all the tests that might be selected for rerunning."""
419 def rerun_predicate(job_state):
420 return job_state.result.outcome in (
421 IJobResult.OUTCOME_FAIL, IJobResult.OUTCOME_CRASH,
422 IJobResult.OUTCOME_NOT_SUPPORTED, IJobResult.OUTCOME_SKIP)
423 rerun_candidates = []
424 todo_list = self.ctx.sa.get_static_todo_list()
425 job_states = {job_id: self.ctx.sa.get_job_state(job_id) for job_id
426 in todo_list}
427 for job_id, job_state in job_states.items():
428 if rerun_predicate(job_state):
429 rerun_candidates.append(self.ctx.sa.get_job(job_id))
430 return rerun_candidates
431
432 def _maybe_rerun_jobs(self):
433 # create a list of jobs that qualify for rerunning
434 rerun_candidates = self._get_rerun_candidates()
435 # bail-out early if no job qualifies for rerunning
436 if not rerun_candidates:
437 return False
438 tree = SelectableJobTreeNode.create_simple_tree(self.ctx.sa,
439 rerun_candidates)
440 # nothing to select in root node and categories - bailing out
441 if not tree.jobs and not tree._categories:
442 return False
443 # deselect all by default
444 tree.set_descendants_state(False)
445 self.ctx.display.run(ShowRerun(tree, _("Select jobs to re-run")))
446 wanted_set = frozenset(tree.selection)
447 if not wanted_set:
448 # nothing selected - nothing to run
449 return False
450 rerun_candidates = []
451 # include resource jobs that selected jobs depend on
452 resources_to_rerun = []
453 for job in wanted_set:
454 job_state = self.ctx.sa.get_job_state(job.id)
455 for inhibitor in job_state.readiness_inhibitor_list:
456 if inhibitor.cause == InhibitionCause.FAILED_DEP:
457 resources_to_rerun.append(inhibitor.related_job)
458 # reset outcome of jobs that are selected for re-running
459 for job in list(wanted_set) + resources_to_rerun:
460 self.ctx.sa.get_job_state(job.id).result = MemoryJobResult({})
461 rerun_candidates.append(job.id)
462 self._run_jobs(rerun_candidates)
463 return True
464
465 def _do_normal_sequence(self):
466 self.ctx.sa.select_providers("*")
467 self.ctx.sa.configure_application_restart(
468 lambda session_id: [
469 'sh', '-c', ' '.join([
470 os.path.abspath(__file__),
471 "--resume", session_id])
472 ])
473 resumed = self._maybe_resume_session()
474 if not resumed:
475 print(_("Preparing..."))
476 self.ctx.sa.start_new_session(_("Checkbox CLI Session"))
477 testplan_id = None
478 if self.ctx.args.test_plan:
479 if self.ctx.args.test_plan in self.ctx.sa.get_test_plans():
480 testplan_id = self.ctx.args.test_plan
481 elif self.is_interactive:
482 testplan_id = self._get_interactively_picked_testplans()
483 if not testplan_id:
484 self.ctx.rc.reset()
485 self.ctx.rc.bg = 'red'
486 self.ctx.rc.fg = 'bright_white'
487 self.ctx.rc.bold = 1
488 self.ctx.rc.para(_("Test plan not found!"))
489 raise SystemExit(1)
490 self.ctx.sa.select_test_plan(testplan_id)
491 self.ctx.sa.update_app_blob(json.dumps(
492 {'testplan_id': testplan_id, }).encode("UTF-8"))
493 self.ctx.sa.bootstrap()
494 if self.is_interactive:
495 self._interactively_pick_jobs_to_run()
496 self._run_jobs(self.ctx.sa.get_dynamic_todo_list())
497 if self.is_interactive:
498 while True:
499 if self._maybe_rerun_jobs():
500 continue
501 else:
502 break
503
504 def _handle_last_job_after_resume(self, metadata):
505 last_job = metadata.running_job_name
506 if last_job is None:
507 return
508 print(_("Previous session run tried to execute job: {}").format(
509 last_job))
510 cmd = self._pick_action_cmd([
511 Action('s', _("skip that job"), 'skip'),
512 Action('p', _("mark it as passed and continue"), 'pass'),
513 Action('f', _("mark it as failed and continue"), 'fail'),
514 Action('r', _("run it again"), 'run'),
515 ], _("What do you want to do with that job?"))
516 if cmd == 'skip' or cmd is None:
517 result = MemoryJobResult({
518 'outcome': IJobResult.OUTCOME_SKIP,
519 'comments': _("Skipped after resuming execution")
520 })
521 elif cmd == 'pass':
522 result = MemoryJobResult({
523 'outcome': IJobResult.OUTCOME_PASS,
524 'comments': _("Passed after resuming execution")
525 })
526 elif cmd == 'fail':
527 result = MemoryJobResult({
528 'outcome': IJobResult.OUTCOME_FAIL,
529 'comments': _("Failed after resuming execution")
530 })
531 elif cmd == 'run':
532 result = None
533 if result:
534 self.ctx.sa.use_job_result(last_job, result)
535
536 def _maybe_resume_session(self):
537 # Try to use the first session that can be resumed if the user agrees
538 resume_candidates = list(self.ctx.sa.get_resumable_sessions())
539 resumed = False
540 if resume_candidates:
541 if self.ctx.args.session_id:
542 for candidate in resume_candidates:
543 if candidate.id == self.ctx.args.session_id:
544 resume_candidates = (candidate, )
545 break
546 else:
547 raise RuntimeError("Requested session is not resumable!")
548 elif self.is_interactive:
549 print(self.C.header(_("Resume Incomplete Session")))
550 print(ngettext(
551 "There is {0} incomplete session that might be resumed",
552 "There are {0} incomplete sessions that might be resumed",
553 len(resume_candidates)
554 ).format(len(resume_candidates)))
555 else:
556 return
557 for candidate in resume_candidates:
558 if self.ctx.args.session_id:
559 cmd = 'resume'
560 else:
561 # Skip sessions that the user doesn't want to resume
562 cmd = self._pick_action_cmd([
563 Action('r', _("resume this session"), 'resume'),
564 Action('n', _("next session"), 'next'),
565 Action('c', _("create new session"), 'create')
566 ], _("Do you want to resume session {0!a}?").format(
567 candidate.id))
568 if cmd == 'next':
569 continue
570 elif cmd == 'create' or cmd is None:
571 break
572 elif cmd == 'resume':
573 metadata = self.ctx.sa.resume_session(candidate.id)
574 app_blob = json.loads(metadata.app_blob.decode("UTF-8"))
575 test_plan_id = app_blob['testplan_id']
576 # FIXME selecting again the testplan on resume resets both
577 # the static and dynamic todo lists.
578 # We're then saving the selection from the saved run_list
579 # by accessing the session private context object.
580 selected_id_list = [job.id for job in
581 self.ctx.sa._context.state.run_list]
582 self.ctx.sa.select_test_plan(test_plan_id)
583 self.ctx.sa.bootstrap()
584 self.ctx.sa.use_alternate_selection(selected_id_list)
585 # If we resumed maybe not rerun the same, probably broken
586 # job
587 self._handle_last_job_after_resume(metadata)
588 self._run_jobs(self.ctx.sa.get_dynamic_todo_list())
589 resumed = True
590 # Finally ignore other sessions that can be resumed
591 break
592 return resumed
593
594
595if __name__ == '__main__':
596 checkbox_cli().main()
0597
=== modified file 'checkbox-ng/po/POTFILES.in'
--- checkbox-ng/po/POTFILES.in 2015-06-25 15:42:19 +0000
+++ checkbox-ng/po/POTFILES.in 2016-01-05 21:24:37 +0000
@@ -5,19 +5,13 @@
5./checkbox_ng/commands/cli.py5./checkbox_ng/commands/cli.py
6./checkbox_ng/commands/launcher.py6./checkbox_ng/commands/launcher.py
7./checkbox_ng/commands/newcli.py7./checkbox_ng/commands/newcli.py
8./checkbox_ng/commands/service.py
9./checkbox_ng/commands/sru.py8./checkbox_ng/commands/sru.py
10./checkbox_ng/commands/submit.py9./checkbox_ng/commands/submit.py
11./checkbox_ng/commands/test_sru.py10./checkbox_ng/commands/test_sru.py
12./checkbox_ng/config.py11./checkbox_ng/config.py
13./checkbox_ng/dbus_ex/__init__.py
14./checkbox_ng/dbus_ex/decorators.py
15./checkbox_ng/dbus_ex/service.py
16./checkbox_ng/dbus_ex/test_dbus.py
17./checkbox_ng/launcher.py12./checkbox_ng/launcher.py
18./checkbox_ng/launchpad.py13./checkbox_ng/launchpad.py
19./checkbox_ng/main.py14./checkbox_ng/main.py
20./checkbox_ng/service.py
21./checkbox_ng/test_certification.py15./checkbox_ng/test_certification.py
22./checkbox_ng/test_config.py16./checkbox_ng/test_config.py
23./checkbox_ng/test_main.py17./checkbox_ng/test_main.py
2418
=== modified file 'checkbox-ng/po/checkbox-ng.pot'
--- checkbox-ng/po/checkbox-ng.pot 2015-05-19 05:10:52 +0000
+++ checkbox-ng/po/checkbox-ng.pot 2016-01-05 21:24:37 +0000
@@ -8,7 +8,7 @@
8msgstr ""8msgstr ""
9"Project-Id-Version: PACKAGE VERSION\n"9"Project-Id-Version: PACKAGE VERSION\n"
10"Report-Msgid-Bugs-To: \n"10"Report-Msgid-Bugs-To: \n"
11"POT-Creation-Date: 2015-05-19 13:10+0800\n"11"POT-Creation-Date: 2015-12-23 18:53+0800\n"
12"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"12"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"13"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14"Language-Team: LANGUAGE <LL@li.org>\n"14"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -37,311 +37,247 @@
37msgstr ""37msgstr ""
3838
39#: .././checkbox_ng/certification.py:164 .././checkbox_ng/launchpad.py:18339#: .././checkbox_ng/certification.py:164 .././checkbox_ng/launchpad.py:183
40#, python-brace-format
41msgid "Request to {0} timed out: {1}"40msgid "Request to {0} timed out: {1}"
42msgstr ""41msgstr ""
4342
44#: .././checkbox_ng/certification.py:167 .././checkbox_ng/launchpad.py:18643#: .././checkbox_ng/certification.py:167 .././checkbox_ng/launchpad.py:186
45#, python-brace-format
46msgid "Invalid destination URL: {0}"44msgid "Invalid destination URL: {0}"
47msgstr ""45msgstr ""
4846
49#: .././checkbox_ng/certification.py:170 .././checkbox_ng/launchpad.py:18947#: .././checkbox_ng/certification.py:170 .././checkbox_ng/launchpad.py:189
50#, python-brace-format
51msgid "Unable to connect to {0}: {1}"48msgid "Unable to connect to {0}: {1}"
52msgstr ""49msgstr ""
5350
54#: .././checkbox_ng/certification.py:18851#: .././checkbox_ng/certification.py:189
55msgid "secure_id must be 15 or 18-character alphanumeric string"52msgid "secure_id must be 15 or 18-character alphanumeric string"
56msgstr ""53msgstr ""
5754
58#: .././checkbox_ng/commands/cli.py:7655#: .././checkbox_ng/commands/cli.py:70
59msgid "run check-config"56msgid "run check-config"
60msgstr ""57msgstr ""
6158
59#: .././checkbox_ng/commands/cli.py:71
60#: .././checkbox_ng/commands/launcher.py:108
61msgid "user interface options"
62msgstr ""
63
62#: .././checkbox_ng/commands/cli.py:7764#: .././checkbox_ng/commands/cli.py:77
63msgid "user interface options"65#: .././checkbox_ng/commands/launcher.py:111
64msgstr ""
65
66#: .././checkbox_ng/commands/cli.py:83
67msgid "skip tests that require interactivity"66msgid "skip tests that require interactivity"
68msgstr ""67msgstr ""
6968
70#: .././checkbox_ng/commands/cli.py:8669#: .././checkbox_ng/commands/cli.py:80
71msgid "don't suppress the output of certain job plugin types"70msgid "don't suppress the output of certain job plugin types"
72msgstr ""71msgstr ""
7372
74#: .././checkbox_ng/commands/newcli.py:12173#: .././checkbox_ng/commands/launcher.py:64
75#: .././checkbox_ng/commands/newcli.py:13274#, python-format
75msgid "Unable to load launcher definition: %s"
76msgstr ""
77
78#: .././checkbox_ng/commands/launcher.py:69
79msgid "Unable to start launcher because of errors:"
80msgstr ""
81
82#: .././checkbox_ng/commands/launcher.py:102
83msgid "LAUNCHER"
84msgstr ""
85
86#: .././checkbox_ng/commands/launcher.py:103
87msgid "launcher definition file to use"
88msgstr ""
89
90#: .././checkbox_ng/commands/newcli.py:119
91#: .././checkbox_ng/commands/newcli.py:130
76#, python-format92#, python-format
77msgid "Incorrect pattern %r: %s"93msgid "Incorrect pattern %r: %s"
78msgstr ""94msgstr ""
7995
80#: .././checkbox_ng/commands/newcli.py:14996#: .././checkbox_ng/commands/newcli.py:147
81#, python-format97#, python-format
82msgid "There is no test plan: %s"98msgid "There is no test plan: %s"
83msgstr ""99msgstr ""
84100
85#: .././checkbox_ng/commands/newcli.py:235101#: .././checkbox_ng/commands/newcli.py:236
86#, python-format102#, python-format
87msgid "Selected testplans: %r"103msgid "Selected testplans: %r"
88msgstr ""104msgstr ""
89105
90#: .././checkbox_ng/commands/newcli.py:258106#: .././checkbox_ng/commands/newcli.py:259
91msgid "Suite selection"107msgid "Suite selection"
92msgstr ""108msgstr ""
93109
94#: .././checkbox_ng/commands/newcli.py:261110#: .././checkbox_ng/commands/newcli.py:262
95msgid "No testplan selected, aborting"111msgid "No testplan selected, aborting"
96msgstr ""112msgstr ""
97113
98#: .././checkbox_ng/commands/newcli.py:299114#: .././checkbox_ng/commands/newcli.py:291
99msgid "Selecting Job Generators"115msgid "Selecting Job Generators"
100msgstr ""116msgstr ""
101117
102#: .././checkbox_ng/commands/newcli.py:318118#: .././checkbox_ng/commands/newcli.py:310
103msgid "Selecting Jobs For Execution"119msgid "Selecting Jobs For Execution"
104msgstr ""120msgstr ""
105121
106#: .././checkbox_ng/commands/newcli.py:325122#: .././checkbox_ng/commands/newcli.py:317
107msgid "Choose tests to run on your system:"123msgid "Choose tests to run on your system:"
108msgstr ""124msgstr ""
109125
110#: .././checkbox_ng/commands/newcli.py:337126#: .././checkbox_ng/commands/newcli.py:329
111msgid "Results"127msgid "Results"
112msgstr ""128msgstr ""
113129
114#: .././checkbox_ng/commands/newcli.py:379130#: .././checkbox_ng/commands/newcli.py:368
115msgid "Saving submission file to {}"
116msgstr ""
117
118#. FIXME: replacing extension is ugly
119#: .././checkbox_ng/commands/newcli.py:381
120#: .././checkbox_ng/commands/newcli.py:384
121msgid "View results"131msgid "View results"
122msgstr ""132msgstr ""
123133
124#: .././checkbox_ng/commands/newcli.py:412134#: .././checkbox_ng/commands/newcli.py:397
125#, python-brace-format
126msgid ""135msgid ""
127"\n"136"\n"
128"Submit results to {0}?"137"Submit results to {0}?"
129msgstr ""138msgstr ""
130139
131#: .././checkbox_ng/commands/newcli.py:415140#: .././checkbox_ng/commands/newcli.py:400
132msgid "Secure ID: "141msgid "Secure ID: "
133msgstr ""142msgstr ""
134143
135#: .././checkbox_ng/commands/newcli.py:418144#: .././checkbox_ng/commands/newcli.py:403
136msgid "ERROR: Secure ID must be 15 or 18-character alphanumeric string"145msgid "ERROR: Secure ID must be 15 or 18-character alphanumeric string"
137msgstr ""146msgstr ""
138147
139#: .././checkbox_ng/commands/newcli.py:436148#: .././checkbox_ng/commands/newcli.py:421
140msgid ""149msgid ""
141"\n"150"\n"
142"Submit results to launchpad.net/+hwdb?"151"Submit results to launchpad.net/+hwdb?"
143msgstr ""152msgstr ""
144153
145#: .././checkbox_ng/commands/newcli.py:438154#: .././checkbox_ng/commands/newcli.py:423
146msgid "Email address: "155msgid "Email address: "
147msgstr ""156msgstr ""
148157
149#. TRANSLATORS: Do not translate the {} format markers.158#. TRANSLATORS: Do not translate the {} format markers.
150#: .././checkbox_ng/commands/newcli.py:454159#: .././checkbox_ng/commands/newcli.py:439
151#, python-brace-format160msgid "Submitting results to {0} for email_address {1}"
152msgid "Submitting results to {0} for email_address {1})"
153msgstr ""161msgstr ""
154162
155#. TRANSLATORS: Do not translate the {} format marker.163#. TRANSLATORS: Do not translate the {} format marker.
156#: .././checkbox_ng/commands/newcli.py:465164#: .././checkbox_ng/commands/newcli.py:450
157#, python-brace-format
158msgid "Submission uploaded to: {0}"165msgid "Submission uploaded to: {0}"
159msgstr ""166msgstr ""
160167
161#: .././checkbox_ng/commands/newcli.py:471168#: .././checkbox_ng/commands/newcli.py:456
162#, python-brace-format
163msgid "Bad response from {0} transport"169msgid "Bad response from {0} transport"
164msgstr ""170msgstr ""
165171
166#. TRANSLATORS: Do not translate the {} format markers.172#. TRANSLATORS: Do not translate the {} format markers.
167#: .././checkbox_ng/commands/newcli.py:479173#: .././checkbox_ng/commands/newcli.py:464
168#, python-brace-format174msgid "Submitting results to {0} for secure_id {1}"
169msgid "Submitting results to {0} for secure_id {1})"
170msgstr ""175msgstr ""
171176
172#. TRANSLATORS: Do not translate the {} format marker.177#. TRANSLATORS: Do not translate the {} format marker.
173#: .././checkbox_ng/commands/newcli.py:500178#: .././checkbox_ng/commands/newcli.py:485
174#: .././checkbox_ng/commands/sru.py:142179#: .././checkbox_ng/commands/submit.py:64
175#, python-brace-format
176msgid "Successfully sent, submission status at {0}"180msgid "Successfully sent, submission status at {0}"
177msgstr ""181msgstr ""
178182
179#. TRANSLATORS: Do not translate the {} format marker.183#. TRANSLATORS: Do not translate the {} format marker.
180#: .././checkbox_ng/commands/newcli.py:504184#: .././checkbox_ng/commands/newcli.py:489
181#: .././checkbox_ng/commands/sru.py:145185#: .././checkbox_ng/commands/submit.py:68
182#, python-brace-format
183msgid "Successfully sent, server response: {0}"186msgid "Successfully sent, server response: {0}"
184msgstr ""187msgstr ""
185188
186#: .././checkbox_ng/commands/newcli.py:525189#: .././checkbox_ng/commands/newcli.py:514
187msgid "Select jobs to re-run"190msgid "Select jobs to re-run"
188msgstr ""191msgstr ""
189192
190#: .././checkbox_ng/commands/service.py:79193#: .././checkbox_ng/commands/sru.py:58 .././checkbox_ng/commands/submit.py:121
191msgid "Setting up DBus objects..."194msgid "SECURE-ID"
192msgstr ""195msgstr ""
193196
194#. TODO: load sessions197#: .././checkbox_ng/commands/sru.py:61
195#: .././checkbox_ng/commands/service.py:81198msgid "Canonical hardware identifier"
196msgid "Constructing Service object"199msgstr ""
197msgstr ""200
198201#: .././checkbox_ng/commands/sru.py:65
199#: .././checkbox_ng/commands/service.py:83202msgid "TEST-PLAN-ID"
200msgid "Constructing ServiceWrapper"203msgstr ""
201msgstr ""204
202205#. TRANSLATORS: this is in imperative form
203#: .././checkbox_ng/commands/service.py:85206#: .././checkbox_ng/commands/sru.py:68
204msgid "Publishing all objects on DBus"207msgid "load the specified test plan"
205msgstr ""208msgstr ""
206209
207#: .././checkbox_ng/commands/service.py:88210#: .././checkbox_ng/commands/sru.py:71 .././checkbox_ng/config.py:88
208msgid "Publishing all managed objects (events should fire there)"211msgid "Send the data to non-production test server"
209msgstr ""212msgstr ""
210213
211#: .././checkbox_ng/commands/service.py:90214#: .././checkbox_ng/commands/sru.py:75
212#, python-format215msgid "run check-config before starting"
213msgid "Attempting to claim bus name: %s"216msgstr ""
214msgstr ""217
215
216#: .././checkbox_ng/commands/service.py:93
217#, python-format
218msgid "PlainBox DBus service ready, claimed name: %s"
219msgstr ""
220
221#: .././checkbox_ng/commands/service.py:99
222msgid ""
223"Main loop interrupted! It is recommended to call the Exit() method on the "
224"exported service object instead"
225msgstr ""
226
227#: .././checkbox_ng/commands/service.py:103
228#, python-format
229msgid "Releasing %s"
230msgstr ""
231
232#: .././checkbox_ng/commands/service.py:108
233#, python-format
234msgid "Closing %s"
235msgstr ""
236
237#: .././checkbox_ng/commands/service.py:110
238msgid "Main loop terminated, exiting..."
239msgstr ""
240
241#: .././checkbox_ng/commands/service.py:122
242msgid "spawn dbus service"
243msgstr ""
244
245#: .././checkbox_ng/commands/service.py:129
246msgid "use the specified DBus bus name"
247msgstr ""
248
249#. Handle possible DependencyDuplicateError that can happen if
250#. someone is using plainbox for job development.
251#: .././checkbox_ng/commands/sru.py:88218#: .././checkbox_ng/commands/sru.py:88
252msgid "The job database you are currently using is broken"219msgid "Configuration problems prevent running SRU tests"
253msgstr ""220msgstr ""
254221
255#: .././checkbox_ng/commands/sru.py:89222#: .././checkbox_ng/commands/sru.py:113
256#, python-brace-format223msgid "Results saved to {0}"
257msgid "At least two jobs contend for the name {0}"
258msgstr ""
259
260#: .././checkbox_ng/commands/sru.py:91
261#, python-brace-format
262msgid "Second job defined in: {0}"
263msgstr ""
264
265#: .././checkbox_ng/commands/sru.py:112
266msgid "There were some problems with the selected jobs"
267msgstr ""
268
269#: .././checkbox_ng/commands/sru.py:115
270msgid "Problematic jobs will not be considered"
271msgstr ""224msgstr ""
272225
273#: .././checkbox_ng/commands/sru.py:118226#: .././checkbox_ng/commands/sru.py:118
274#, python-brace-format227msgid "Sending hardware report to Canonical Certification"
275msgid "Saving results to {0}"228msgstr ""
276msgstr ""229
277230#: .././checkbox_ng/commands/sru.py:119
278#: .././checkbox_ng/commands/sru.py:125231msgid "Server URL is: {0}"
279#, python-brace-format232msgstr ""
280msgid "Submitting results to {0} for secure_id {1}"233
281msgstr ""234#: .././checkbox_ng/commands/sru.py:131
282235msgid "SRU Session"
283#: .././checkbox_ng/commands/sru.py:150236msgstr ""
284#, python-brace-format237
285msgid "Problem reading a file: {0}"238#: .././checkbox_ng/commands/sru.py:172
286msgstr ""
287
288#: .././checkbox_ng/commands/sru.py:180
289#, python-brace-format
290msgid "comments: {0}"
291msgstr ""
292
293#: .././checkbox_ng/commands/sru.py:182
294msgid "inhibitors:"
295msgstr ""
296
297#: .././checkbox_ng/commands/sru.py:220
298msgid "Configuration problems prevent running SRU tests"
299msgstr ""
300
301#: .././checkbox_ng/commands/sru.py:236
302msgid "run automated stable release update tests"239msgid "run automated stable release update tests"
303msgstr ""240msgstr ""
304241
305#: .././checkbox_ng/commands/sru.py:241242#. TRANSLATORS: please leave various options (both long and short forms),
306msgid "run check-config before starting"243#. environment variables and paths in their original form. Also keep the
307msgstr ""244#. special @EPILOG@ string. The first line of the translation is special and
308245#. is used as the help message. Please keep the pseudo-statement form and
309#: .././checkbox_ng/commands/sru.py:249246#. don't finish the sentence with a dot. Pay extra attention to whitespace.
310msgid "SECURE-ID"247#. It must be correctly preserved or the result won't work. In particular
311msgstr ""248#. the leading whitespace *must* be preserved and *must* have the same
312249#. length on each line.
313#. TRANSLATORS: Do not translate %(default)250#: .././checkbox_ng/commands/submit.py:81
314#: .././checkbox_ng/commands/sru.py:254251msgid ""
315#, python-format252"\n"
316msgid "associate submission with a machine using this SECURE-ID (%(default)s)"253" submit test results to the Canonical certification website\n"
317msgstr ""254"\n"
318255" This command sends the XML results file to the Certification website.\n"
319#: .././checkbox_ng/commands/sru.py:257256" "
320msgid "FILE"257msgstr ""
321msgstr ""258
322259#: .././checkbox_ng/commands/submit.py:98
323#. TRANSLATORS: Do not translate %(default)s260msgid "submit test results to the Canonical certification website"
324#: .././checkbox_ng/commands/sru.py:262261msgstr ""
325#, python-format262
326msgid "if submission fails save the test report as FILE (%(default)s)"263#: .././checkbox_ng/commands/submit.py:104
327msgstr ""264msgid "The path to the results xml file"
328265msgstr ""
329#: .././checkbox_ng/commands/sru.py:265266
267#: .././checkbox_ng/commands/submit.py:114
268msgid "must be 15 or 18-character alphanumeric string"
269msgstr ""
270
271#: .././checkbox_ng/commands/submit.py:124
272msgid "associate submission with a machine using this SECURE-ID"
273msgstr ""
274
275#: .././checkbox_ng/commands/submit.py:152
330msgid "URL"276msgid "URL"
331msgstr ""277msgstr ""
332278
333#. TRANSLATORS: Do not translate %(default)s279#: .././checkbox_ng/commands/submit.py:154
334#: .././checkbox_ng/commands/sru.py:269280msgid "destination to submit to"
335#, python-format
336msgid "POST the test report XML to this URL (%(default)s)"
337msgstr ""
338
339#: .././checkbox_ng/commands/sru.py:277
340msgid "override --destination to use the staging certification website"
341msgstr ""
342
343#: .././checkbox_ng/commands/sru.py:284
344msgid "don't really run most jobs"
345msgstr ""281msgstr ""
346282
347#: .././checkbox_ng/config.py:43283#: .././checkbox_ng/config.py:43
@@ -376,13 +312,81 @@
376msgid "Optional whitelist with which to run SRU testing"312msgid "Optional whitelist with which to run SRU testing"
377msgstr ""313msgstr ""
378314
315#: .././checkbox_ng/config.py:82
316msgid "Optional test plan with which to run SRU testing"
317msgstr ""
318
319#: .././checkbox_ng/launcher.py:47
320msgid "Application Title"
321msgstr ""
322
323#: .././checkbox_ng/launcher.py:51
324msgid "Welcome Message"
325msgstr ""
326
327#. TODO: valid regexp text validator
328#: .././checkbox_ng/launcher.py:56
329msgid "Pattern that whitelists need to match to be displayed"
330msgstr ""
331
332#. TODO: valid regexp text validator
333#: .././checkbox_ng/launcher.py:61
334msgid "Pattern that whitelists need to match to be selected"
335msgstr ""
336
337#: .././checkbox_ng/launcher.py:67
338msgid "If enabled then suite selection screen is not displayed"
339msgstr ""
340
341#: .././checkbox_ng/launcher.py:73
342msgid "If enabled then test selection screen is not displayed"
343msgstr ""
344
345#. TODO: probably a choice validator
346#: .././checkbox_ng/launcher.py:78
347msgid "Type of the input field?"
348msgstr ""
349
350#: .././checkbox_ng/launcher.py:82
351msgid "Label on the 'send' button"
352msgstr ""
353
354#. TODO: default?
355#: .././checkbox_ng/launcher.py:88
356msgid "If enabled then test results will be also sent to HEXR"
357msgstr ""
358
359#: .././checkbox_ng/launcher.py:93
360msgid "Where to submit the test results to"
361msgstr ""
362
363#: .././checkbox_ng/launcher.py:98
364msgid ""
365"HTTP endpoint to submit data to, using the transport specified with "
366"submit_to."
367msgstr ""
368
369#: .././checkbox_ng/launcher.py:104
370msgid "Secure ID to identify the system this submission belongs to."
371msgstr ""
372
373#: .././checkbox_ng/launcher.py:109
374msgid "Name of custom configuration file"
375msgstr ""
376
377#: .././checkbox_ng/launcher.py:113
378msgid "Don't suppress the output of certain job plugin types."
379msgstr ""
380
381#: .././checkbox_ng/launcher.py:116
382msgid "Section with only exported unit ids as keys (no values)"
383msgstr ""
384
379#: .././checkbox_ng/launchpad.py:66385#: .././checkbox_ng/launchpad.py:66
380#, python-brace-format
381msgid "Cannot get {0} resource job"386msgid "Cannot get {0} resource job"
382msgstr ""387msgstr ""
383388
384#: .././checkbox_ng/launchpad.py:70389#: .././checkbox_ng/launchpad.py:70
385#, python-brace-format
386msgid "{0} has no attribute {1}"390msgid "{0} has no attribute {1}"
387msgstr ""391msgstr ""
388392
@@ -403,180 +407,22 @@
403msgid "The submission was uploaded to Launchpad successfully"407msgid "The submission was uploaded to Launchpad successfully"
404msgstr ""408msgstr ""
405409
406#: .././checkbox_ng/service.py:37
407msgid "DBus parts require 'funcsigs' from pypi."
408msgstr ""
409
410#: .././checkbox_ng/service.py:86
411#, python-format
412msgid "Created DBus wrapper %s for: %r"
413msgstr ""
414
415#: .././checkbox_ng/service.py:90
416#, python-format
417msgid "DBus wrapper %s died"
418msgstr ""
419
420#: .././checkbox_ng/service.py:122
421#, python-format
422msgid "Published DBus wrapper for %r as %s"
423msgstr ""
424
425#: .././checkbox_ng/service.py:169 .././checkbox_ng/service.py:180
426#, python-brace-format
427msgid "object path {0} does not designate an existing object"
428msgstr ""
429
430#: .././checkbox_ng/service.py:188
431#, python-format
432msgid ""
433"Application error: %r should have returned native object but returned "
434"wrapper instead"
435msgstr ""
436
437#: .././checkbox_ng/service.py:195 .././checkbox_ng/service.py:206
438#: .././checkbox_ng/service.py:217
439#, python-brace-format
440msgid "({0}) internal error, unable to lookup object wrapper"
441msgstr ""
442
443#: .././checkbox_ng/service.py:224
444#, python-format
445msgid "wrapped %s called with %s"
446msgstr ""
447
448#: .././checkbox_ng/service.py:240 .././checkbox_ng/service.py:256
449msgid "unsupported translation {!r}"
450msgstr ""
451
452#: .././checkbox_ng/service.py:243
453#, python-format
454msgid "unwrapped %s called with %s"
455msgstr ""
456
457#: .././checkbox_ng/service.py:245
458#, python-format
459msgid "unwrapped %s returned %r"
460msgstr ""
461
462#: .././checkbox_ng/service.py:258
463#, python-format
464msgid "wrapped %s returned %r"
465msgstr ""
466
467#: .././checkbox_ng/service.py:769
468#, python-format
469msgid "Adding result %r to DBus"
470msgstr ""
471
472#: .././checkbox_ng/service.py:788
473#, python-format
474msgid "Removing result %r from DBus"
475msgstr ""
476
477#: .././checkbox_ng/service.py:811
478#, python-format
479msgid "Adding job %r to DBus"
480msgstr ""
481
482#: .././checkbox_ng/service.py:843
483#, python-format
484msgid "Adding job state %r to DBus"
485msgstr ""
486
487#: .././checkbox_ng/service.py:875
488#, python-brace-format
489msgid "Unable to wrap object of type {0}"
490msgstr ""
491
492#: .././checkbox_ng/service.py:1000
493msgid "Remove() completed"
494msgstr ""
495
496#: .././checkbox_ng/service.py:1075
497#, python-format
498msgid "AskForOutcome(%r) suggested outcome is (%s)"
499msgstr ""
500
501#. NOTE: this should:
502#. 1) attempt to cancel the future in the extremely rare case where it
503#. is not started yet
504#. 2) kill the job otherwise
505#: .././checkbox_ng/service.py:1391
506msgid "Kill() is not implemented"
507msgstr ""
508
509#: .././checkbox_ng/service.py:1411
510msgid "RunCommand() should not be called for automated jobs"
511msgstr ""
512
513#: .././checkbox_ng/service.py:1413
514msgid "RunCommand() is starting to run the job"
515msgstr ""
516
517#: .././checkbox_ng/service.py:1417
518msgid "RunCommand() ignored, waiting for command to finish"
519msgstr ""
520
521#: .././checkbox_ng/service.py:1435
522msgid "SetOutcome() called while the command is still running!"
523msgstr ""
524
525#: .././checkbox_ng/service.py:1442
526msgid "SetOutcome() called before RunCommand()"
527msgstr ""
528
529#. TRANSLATORS: don't translate 'manual' translate it as
530#. 'of type manual' and leave the 'manual' string
531#. intact.
532#: .././checkbox_ng/service.py:1447
533#, python-format
534msgid "But the job is not manual, it is %s"
535msgstr ""
536
537#: .././checkbox_ng/service.py:1480
538msgid "outcome_from_command() called too early!"
539msgstr ""
540
541#: .././checkbox_ng/service.py:1481
542msgid "There is nothing to return yet"
543msgstr ""
544
545#: .././checkbox_ng/service.py:1522
546msgid "Sending ShowInteractiveUI() and not starting the job..."
547msgstr ""
548
549#: .././checkbox_ng/service.py:1526
550#, python-format
551msgid "Running %r right away"
552msgstr ""
553
554#: .././checkbox_ng/service.py:1563
555#, python-format
556msgid "calling JobResultAvailable(%r, %r)"
557msgstr ""
558
559#: .././checkbox_ng/service.py:1570
560msgid ""
561"sending AskForOutcome() after job finished running with OUTCOME_UNDECIDED"
562msgstr ""
563
564#: .././checkbox_ng/ui.py:73410#: .././checkbox_ng/ui.py:73
565msgid "< Continue >"411msgid "< Continue >"
566msgstr ""412msgstr ""
567413
568#: .././checkbox_ng/ui.py:191 .././checkbox_ng/ui.py:318414#: .././checkbox_ng/ui.py:194 .././checkbox_ng/ui.py:321
569msgid "Enter"415msgid "Enter"
570msgstr ""416msgstr ""
571417
572#: .././checkbox_ng/ui.py:194 .././checkbox_ng/ui.py:321418#: .././checkbox_ng/ui.py:197 .././checkbox_ng/ui.py:324
573msgid ": Expand/Collapse"419msgid ": Expand/Collapse"
574msgstr ""420msgstr ""
575421
576#: .././checkbox_ng/ui.py:210422#: .././checkbox_ng/ui.py:213
577msgid "Start "423msgid "Start "
578msgstr ""424msgstr ""
579425
580#: .././checkbox_ng/ui.py:342426#: .././checkbox_ng/ui.py:345
581msgid "inish"427msgid "inish"
582msgstr ""428msgstr ""
583429
=== modified file 'checkbox-ng/po/es.po'
--- checkbox-ng/po/es.po 2015-09-15 05:10:23 +0000
+++ checkbox-ng/po/es.po 2016-01-05 21:24:37 +0000
@@ -6,16 +6,17 @@
6msgid ""6msgid ""
7msgstr ""7msgstr ""
8"Project-Id-Version: checkbox\n"8"Project-Id-Version: checkbox\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"9"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2015-05-19 13:10+0800\n"10"POT-Creation-Date: 2015-12-23 18:53+0800\n"
11"PO-Revision-Date: 2015-04-05 09:48+0000\n"11"PO-Revision-Date: 2015-04-05 09:48+0000\n"
12"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"12"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
13"Language-Team: Spanish <es@li.org>\n"13"Language-Team: Spanish <es@li.org>\n"
14"MIME-Version: 1.0\n"14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"16"Content-Transfer-Encoding: 8bit\n"
17"X-Launchpad-Export-Date: 2015-09-15 05:10+0000\n"17"X-Launchpad-Export-Date: 2015-12-26 05:07+0000\n"
18"X-Generator: Launchpad (build 17737)\n"18"X-Generator: Launchpad (build 17865)\n"
19"Language: es\n"
1920
20#: .././checkbox_ng/certification.py:13521#: .././checkbox_ng/certification.py:135
21msgid "Secure ID not specified"22msgid "Secure ID not specified"
@@ -37,312 +38,247 @@
37msgstr ""38msgstr ""
3839
39#: .././checkbox_ng/certification.py:164 .././checkbox_ng/launchpad.py:18340#: .././checkbox_ng/certification.py:164 .././checkbox_ng/launchpad.py:183
40#, python-brace-format
41msgid "Request to {0} timed out: {1}"41msgid "Request to {0} timed out: {1}"
42msgstr "Se agotó el tiempo de espera de conexión con {0}: {1}"42msgstr "Se agotó el tiempo de espera de conexión con {0}: {1}"
4343
44#: .././checkbox_ng/certification.py:167 .././checkbox_ng/launchpad.py:18644#: .././checkbox_ng/certification.py:167 .././checkbox_ng/launchpad.py:186
45#, python-brace-format
46msgid "Invalid destination URL: {0}"45msgid "Invalid destination URL: {0}"
47msgstr "URL de destino no válido: {0}"46msgstr "URL de destino no válido: {0}"
4847
49#: .././checkbox_ng/certification.py:170 .././checkbox_ng/launchpad.py:18948#: .././checkbox_ng/certification.py:170 .././checkbox_ng/launchpad.py:189
50#, python-brace-format
51msgid "Unable to connect to {0}: {1}"49msgid "Unable to connect to {0}: {1}"
52msgstr "No se pudo conectar con {0}: {1}"50msgstr "No se pudo conectar con {0}: {1}"
5351
54#: .././checkbox_ng/certification.py:18852#: .././checkbox_ng/certification.py:189
55msgid "secure_id must be 15 or 18-character alphanumeric string"53msgid "secure_id must be 15 or 18-character alphanumeric string"
56msgstr ""54msgstr ""
5755
58#: .././checkbox_ng/commands/cli.py:7656#: .././checkbox_ng/commands/cli.py:70
59msgid "run check-config"57msgid "run check-config"
60msgstr ""58msgstr ""
6159
62#: .././checkbox_ng/commands/cli.py:7760#: .././checkbox_ng/commands/cli.py:71
61#: .././checkbox_ng/commands/launcher.py:108
63msgid "user interface options"62msgid "user interface options"
64msgstr "opciones de interfaz de usuario"63msgstr "opciones de interfaz de usuario"
6564
66#: .././checkbox_ng/commands/cli.py:8365#: .././checkbox_ng/commands/cli.py:77
66#: .././checkbox_ng/commands/launcher.py:111
67msgid "skip tests that require interactivity"67msgid "skip tests that require interactivity"
68msgstr ""68msgstr ""
6969
70#: .././checkbox_ng/commands/cli.py:8670#: .././checkbox_ng/commands/cli.py:80
71msgid "don't suppress the output of certain job plugin types"71msgid "don't suppress the output of certain job plugin types"
72msgstr ""72msgstr ""
7373
74#: .././checkbox_ng/commands/newcli.py:12174#: .././checkbox_ng/commands/launcher.py:64
75#: .././checkbox_ng/commands/newcli.py:13275#, python-format
76msgid "Unable to load launcher definition: %s"
77msgstr ""
78
79#: .././checkbox_ng/commands/launcher.py:69
80msgid "Unable to start launcher because of errors:"
81msgstr ""
82
83#: .././checkbox_ng/commands/launcher.py:102
84msgid "LAUNCHER"
85msgstr ""
86
87#: .././checkbox_ng/commands/launcher.py:103
88msgid "launcher definition file to use"
89msgstr ""
90
91#: .././checkbox_ng/commands/newcli.py:119
92#: .././checkbox_ng/commands/newcli.py:130
76#, python-format93#, python-format
77msgid "Incorrect pattern %r: %s"94msgid "Incorrect pattern %r: %s"
78msgstr ""95msgstr ""
7996
80#: .././checkbox_ng/commands/newcli.py:14997#: .././checkbox_ng/commands/newcli.py:147
81#, python-format98#, python-format
82msgid "There is no test plan: %s"99msgid "There is no test plan: %s"
83msgstr ""100msgstr ""
84101
85#: .././checkbox_ng/commands/newcli.py:235102#: .././checkbox_ng/commands/newcli.py:236
86#, python-format103#, python-format
87msgid "Selected testplans: %r"104msgid "Selected testplans: %r"
88msgstr ""105msgstr ""
89106
90#: .././checkbox_ng/commands/newcli.py:258107#: .././checkbox_ng/commands/newcli.py:259
91msgid "Suite selection"108msgid "Suite selection"
92msgstr ""109msgstr ""
93110
94#: .././checkbox_ng/commands/newcli.py:261111#: .././checkbox_ng/commands/newcli.py:262
95msgid "No testplan selected, aborting"112msgid "No testplan selected, aborting"
96msgstr ""113msgstr ""
97114
98#: .././checkbox_ng/commands/newcli.py:299115#: .././checkbox_ng/commands/newcli.py:291
99msgid "Selecting Job Generators"116msgid "Selecting Job Generators"
100msgstr ""117msgstr ""
101118
102#: .././checkbox_ng/commands/newcli.py:318119#: .././checkbox_ng/commands/newcli.py:310
103msgid "Selecting Jobs For Execution"120msgid "Selecting Jobs For Execution"
104msgstr ""121msgstr ""
105122
106#: .././checkbox_ng/commands/newcli.py:325123#: .././checkbox_ng/commands/newcli.py:317
107msgid "Choose tests to run on your system:"124msgid "Choose tests to run on your system:"
108msgstr ""125msgstr ""
109126
110#: .././checkbox_ng/commands/newcli.py:337127#: .././checkbox_ng/commands/newcli.py:329
111msgid "Results"128msgid "Results"
112msgstr "Resultados"129msgstr "Resultados"
113130
114#: .././checkbox_ng/commands/newcli.py:379131#: .././checkbox_ng/commands/newcli.py:368
115msgid "Saving submission file to {}"
116msgstr ""
117
118#. FIXME: replacing extension is ugly
119#: .././checkbox_ng/commands/newcli.py:381
120#: .././checkbox_ng/commands/newcli.py:384
121msgid "View results"132msgid "View results"
122msgstr ""133msgstr ""
123134
124#: .././checkbox_ng/commands/newcli.py:412135#: .././checkbox_ng/commands/newcli.py:397
125#, python-brace-format
126msgid ""136msgid ""
127"\n"137"\n"
128"Submit results to {0}?"138"Submit results to {0}?"
129msgstr ""139msgstr ""
130140
131#: .././checkbox_ng/commands/newcli.py:415141#: .././checkbox_ng/commands/newcli.py:400
132msgid "Secure ID: "142msgid "Secure ID: "
133msgstr ""143msgstr ""
134144
135#: .././checkbox_ng/commands/newcli.py:418145#: .././checkbox_ng/commands/newcli.py:403
136msgid "ERROR: Secure ID must be 15 or 18-character alphanumeric string"146msgid "ERROR: Secure ID must be 15 or 18-character alphanumeric string"
137msgstr ""147msgstr ""
138148
139#: .././checkbox_ng/commands/newcli.py:436149#: .././checkbox_ng/commands/newcli.py:421
140msgid ""150msgid ""
141"\n"151"\n"
142"Submit results to launchpad.net/+hwdb?"152"Submit results to launchpad.net/+hwdb?"
143msgstr ""153msgstr ""
144154
145#: .././checkbox_ng/commands/newcli.py:438155#: .././checkbox_ng/commands/newcli.py:423
146msgid "Email address: "156msgid "Email address: "
147msgstr ""157msgstr ""
148158
149#. TRANSLATORS: Do not translate the {} format markers.159#. TRANSLATORS: Do not translate the {} format markers.
150#: .././checkbox_ng/commands/newcli.py:454160#: .././checkbox_ng/commands/newcli.py:439
151#, python-brace-format161msgid "Submitting results to {0} for email_address {1}"
152msgid "Submitting results to {0} for email_address {1})"
153msgstr ""162msgstr ""
154163
155#. TRANSLATORS: Do not translate the {} format marker.164#. TRANSLATORS: Do not translate the {} format marker.
156#: .././checkbox_ng/commands/newcli.py:465165#: .././checkbox_ng/commands/newcli.py:450
157#, python-brace-format
158msgid "Submission uploaded to: {0}"166msgid "Submission uploaded to: {0}"
159msgstr ""167msgstr ""
160168
161#: .././checkbox_ng/commands/newcli.py:471169#: .././checkbox_ng/commands/newcli.py:456
162#, python-brace-format
163msgid "Bad response from {0} transport"170msgid "Bad response from {0} transport"
164msgstr ""171msgstr ""
165172
166#. TRANSLATORS: Do not translate the {} format markers.173#. TRANSLATORS: Do not translate the {} format markers.
167#: .././checkbox_ng/commands/newcli.py:479174#: .././checkbox_ng/commands/newcli.py:464
168#, python-brace-format175msgid "Submitting results to {0} for secure_id {1}"
169msgid "Submitting results to {0} for secure_id {1})"
170msgstr ""176msgstr ""
171177
172#. TRANSLATORS: Do not translate the {} format marker.178#. TRANSLATORS: Do not translate the {} format marker.
173#: .././checkbox_ng/commands/newcli.py:500179#: .././checkbox_ng/commands/newcli.py:485
174#: .././checkbox_ng/commands/sru.py:142180#: .././checkbox_ng/commands/submit.py:64
175#, python-brace-format
176msgid "Successfully sent, submission status at {0}"181msgid "Successfully sent, submission status at {0}"
177msgstr ""182msgstr ""
178183
179#. TRANSLATORS: Do not translate the {} format marker.184#. TRANSLATORS: Do not translate the {} format marker.
180#: .././checkbox_ng/commands/newcli.py:504185#: .././checkbox_ng/commands/newcli.py:489
181#: .././checkbox_ng/commands/sru.py:145186#: .././checkbox_ng/commands/submit.py:68
182#, python-brace-format
183msgid "Successfully sent, server response: {0}"187msgid "Successfully sent, server response: {0}"
184msgstr ""188msgstr ""
185189
186#: .././checkbox_ng/commands/newcli.py:525190#: .././checkbox_ng/commands/newcli.py:514
187msgid "Select jobs to re-run"191msgid "Select jobs to re-run"
188msgstr ""192msgstr ""
189193
190#: .././checkbox_ng/commands/service.py:79194#: .././checkbox_ng/commands/sru.py:58 .././checkbox_ng/commands/submit.py:121
191msgid "Setting up DBus objects..."195msgid "SECURE-ID"
192msgstr ""196msgstr ""
193197
194#. TODO: load sessions198#: .././checkbox_ng/commands/sru.py:61
195#: .././checkbox_ng/commands/service.py:81199msgid "Canonical hardware identifier"
196msgid "Constructing Service object"200msgstr ""
197msgstr ""201
198202#: .././checkbox_ng/commands/sru.py:65
199#: .././checkbox_ng/commands/service.py:83203msgid "TEST-PLAN-ID"
200msgid "Constructing ServiceWrapper"204msgstr ""
201msgstr ""205
202206#. TRANSLATORS: this is in imperative form
203#: .././checkbox_ng/commands/service.py:85207#: .././checkbox_ng/commands/sru.py:68
204msgid "Publishing all objects on DBus"208msgid "load the specified test plan"
205msgstr ""209msgstr ""
206210
207#: .././checkbox_ng/commands/service.py:88211#: .././checkbox_ng/commands/sru.py:71 .././checkbox_ng/config.py:88
208msgid "Publishing all managed objects (events should fire there)"212msgid "Send the data to non-production test server"
209msgstr ""213msgstr ""
210214
211#: .././checkbox_ng/commands/service.py:90215#: .././checkbox_ng/commands/sru.py:75
212#, python-format216msgid "run check-config before starting"
213msgid "Attempting to claim bus name: %s"217msgstr ""
214msgstr ""218
215
216#: .././checkbox_ng/commands/service.py:93
217#, python-format
218msgid "PlainBox DBus service ready, claimed name: %s"
219msgstr ""
220
221#: .././checkbox_ng/commands/service.py:99
222msgid ""
223"Main loop interrupted! It is recommended to call the Exit() method on the "
224"exported service object instead"
225msgstr ""
226
227#: .././checkbox_ng/commands/service.py:103
228#, python-format
229msgid "Releasing %s"
230msgstr ""
231
232#: .././checkbox_ng/commands/service.py:108
233#, python-format
234msgid "Closing %s"
235msgstr ""
236
237#: .././checkbox_ng/commands/service.py:110
238msgid "Main loop terminated, exiting..."
239msgstr ""
240
241#: .././checkbox_ng/commands/service.py:122
242msgid "spawn dbus service"
243msgstr ""
244
245#: .././checkbox_ng/commands/service.py:129
246msgid "use the specified DBus bus name"
247msgstr ""
248
249#. Handle possible DependencyDuplicateError that can happen if
250#. someone is using plainbox for job development.
251#: .././checkbox_ng/commands/sru.py:88219#: .././checkbox_ng/commands/sru.py:88
252msgid "The job database you are currently using is broken"220msgid "Configuration problems prevent running SRU tests"
253msgstr ""221msgstr ""
254222
255#: .././checkbox_ng/commands/sru.py:89223#: .././checkbox_ng/commands/sru.py:113
256#, python-brace-format224msgid "Results saved to {0}"
257msgid "At least two jobs contend for the name {0}"
258msgstr ""
259
260#: .././checkbox_ng/commands/sru.py:91
261#, python-brace-format
262msgid "Second job defined in: {0}"
263msgstr ""
264
265#: .././checkbox_ng/commands/sru.py:112
266msgid "There were some problems with the selected jobs"
267msgstr ""
268
269#: .././checkbox_ng/commands/sru.py:115
270msgid "Problematic jobs will not be considered"
271msgstr ""225msgstr ""
272226
273#: .././checkbox_ng/commands/sru.py:118227#: .././checkbox_ng/commands/sru.py:118
274#, python-brace-format228msgid "Sending hardware report to Canonical Certification"
275msgid "Saving results to {0}"229msgstr ""
276msgstr ""230
277231#: .././checkbox_ng/commands/sru.py:119
278#: .././checkbox_ng/commands/sru.py:125232msgid "Server URL is: {0}"
279#, python-brace-format233msgstr ""
280msgid "Submitting results to {0} for secure_id {1}"234
281msgstr ""235#: .././checkbox_ng/commands/sru.py:131
282236msgid "SRU Session"
283#: .././checkbox_ng/commands/sru.py:150237msgstr ""
284#, python-brace-format238
285msgid "Problem reading a file: {0}"239#: .././checkbox_ng/commands/sru.py:172
286msgstr ""
287
288#: .././checkbox_ng/commands/sru.py:180
289#, python-brace-format
290msgid "comments: {0}"
291msgstr ""
292
293#: .././checkbox_ng/commands/sru.py:182
294msgid "inhibitors:"
295msgstr ""
296
297#: .././checkbox_ng/commands/sru.py:220
298msgid "Configuration problems prevent running SRU tests"
299msgstr ""
300
301#: .././checkbox_ng/commands/sru.py:236
302msgid "run automated stable release update tests"240msgid "run automated stable release update tests"
303msgstr ""241msgstr ""
304242
305#: .././checkbox_ng/commands/sru.py:241243#. TRANSLATORS: please leave various options (both long and short forms),
306msgid "run check-config before starting"244#. environment variables and paths in their original form. Also keep the
307msgstr ""245#. special @EPILOG@ string. The first line of the translation is special and
308246#. is used as the help message. Please keep the pseudo-statement form and
309#: .././checkbox_ng/commands/sru.py:249247#. don't finish the sentence with a dot. Pay extra attention to whitespace.
310msgid "SECURE-ID"248#. It must be correctly preserved or the result won't work. In particular
311msgstr ""249#. the leading whitespace *must* be preserved and *must* have the same
312250#. length on each line.
313#. TRANSLATORS: Do not translate %(default)251#: .././checkbox_ng/commands/submit.py:81
314#: .././checkbox_ng/commands/sru.py:254
315#, python-format
316msgid ""252msgid ""
317"associate submission with a machine using this SECURE-ID (%(default)s)"253"\n"
318msgstr ""254" submit test results to the Canonical certification website\n"
319255"\n"
320#: .././checkbox_ng/commands/sru.py:257256" This command sends the XML results file to the Certification website.\n"
321msgid "FILE"257" "
322msgstr ""258msgstr ""
323259
324#. TRANSLATORS: Do not translate %(default)s260#: .././checkbox_ng/commands/submit.py:98
325#: .././checkbox_ng/commands/sru.py:262261msgid "submit test results to the Canonical certification website"
326#, python-format262msgstr ""
327msgid "if submission fails save the test report as FILE (%(default)s)"263
328msgstr ""264#: .././checkbox_ng/commands/submit.py:104
329265msgid "The path to the results xml file"
330#: .././checkbox_ng/commands/sru.py:265266msgstr ""
267
268#: .././checkbox_ng/commands/submit.py:114
269msgid "must be 15 or 18-character alphanumeric string"
270msgstr ""
271
272#: .././checkbox_ng/commands/submit.py:124
273msgid "associate submission with a machine using this SECURE-ID"
274msgstr ""
275
276#: .././checkbox_ng/commands/submit.py:152
331msgid "URL"277msgid "URL"
332msgstr ""278msgstr ""
333279
334#. TRANSLATORS: Do not translate %(default)s280#: .././checkbox_ng/commands/submit.py:154
335#: .././checkbox_ng/commands/sru.py:269281msgid "destination to submit to"
336#, python-format
337msgid "POST the test report XML to this URL (%(default)s)"
338msgstr ""
339
340#: .././checkbox_ng/commands/sru.py:277
341msgid "override --destination to use the staging certification website"
342msgstr ""
343
344#: .././checkbox_ng/commands/sru.py:284
345msgid "don't really run most jobs"
346msgstr ""282msgstr ""
347283
348#: .././checkbox_ng/config.py:43284#: .././checkbox_ng/config.py:43
@@ -377,13 +313,81 @@
377msgid "Optional whitelist with which to run SRU testing"313msgid "Optional whitelist with which to run SRU testing"
378msgstr ""314msgstr ""
379315
316#: .././checkbox_ng/config.py:82
317msgid "Optional test plan with which to run SRU testing"
318msgstr ""
319
320#: .././checkbox_ng/launcher.py:47
321msgid "Application Title"
322msgstr ""
323
324#: .././checkbox_ng/launcher.py:51
325msgid "Welcome Message"
326msgstr ""
327
328#. TODO: valid regexp text validator
329#: .././checkbox_ng/launcher.py:56
330msgid "Pattern that whitelists need to match to be displayed"
331msgstr ""
332
333#. TODO: valid regexp text validator
334#: .././checkbox_ng/launcher.py:61
335msgid "Pattern that whitelists need to match to be selected"
336msgstr ""
337
338#: .././checkbox_ng/launcher.py:67
339msgid "If enabled then suite selection screen is not displayed"
340msgstr ""
341
342#: .././checkbox_ng/launcher.py:73
343msgid "If enabled then test selection screen is not displayed"
344msgstr ""
345
346#. TODO: probably a choice validator
347#: .././checkbox_ng/launcher.py:78
348msgid "Type of the input field?"
349msgstr ""
350
351#: .././checkbox_ng/launcher.py:82
352msgid "Label on the 'send' button"
353msgstr ""
354
355#. TODO: default?
356#: .././checkbox_ng/launcher.py:88
357msgid "If enabled then test results will be also sent to HEXR"
358msgstr ""
359
360#: .././checkbox_ng/launcher.py:93
361msgid "Where to submit the test results to"
362msgstr ""
363
364#: .././checkbox_ng/launcher.py:98
365msgid ""
366"HTTP endpoint to submit data to, using the transport specified with "
367"submit_to."
368msgstr ""
369
370#: .././checkbox_ng/launcher.py:104
371msgid "Secure ID to identify the system this submission belongs to."
372msgstr ""
373
374#: .././checkbox_ng/launcher.py:109
375msgid "Name of custom configuration file"
376msgstr ""
377
378#: .././checkbox_ng/launcher.py:113
379msgid "Don't suppress the output of certain job plugin types."
380msgstr ""
381
382#: .././checkbox_ng/launcher.py:116
383msgid "Section with only exported unit ids as keys (no values)"
384msgstr ""
385
380#: .././checkbox_ng/launchpad.py:66386#: .././checkbox_ng/launchpad.py:66
381#, python-brace-format
382msgid "Cannot get {0} resource job"387msgid "Cannot get {0} resource job"
383msgstr ""388msgstr ""
384389
385#: .././checkbox_ng/launchpad.py:70390#: .././checkbox_ng/launchpad.py:70
386#, python-brace-format
387msgid "{0} has no attribute {1}"391msgid "{0} has no attribute {1}"
388msgstr ""392msgstr ""
389393
@@ -404,180 +408,22 @@
404msgid "The submission was uploaded to Launchpad successfully"408msgid "The submission was uploaded to Launchpad successfully"
405msgstr ""409msgstr ""
406410
407#: .././checkbox_ng/service.py:37
408msgid "DBus parts require 'funcsigs' from pypi."
409msgstr ""
410
411#: .././checkbox_ng/service.py:86
412#, python-format
413msgid "Created DBus wrapper %s for: %r"
414msgstr ""
415
416#: .././checkbox_ng/service.py:90
417#, python-format
418msgid "DBus wrapper %s died"
419msgstr ""
420
421#: .././checkbox_ng/service.py:122
422#, python-format
423msgid "Published DBus wrapper for %r as %s"
424msgstr ""
425
426#: .././checkbox_ng/service.py:169 .././checkbox_ng/service.py:180
427#, python-brace-format
428msgid "object path {0} does not designate an existing object"
429msgstr ""
430
431#: .././checkbox_ng/service.py:188
432#, python-format
433msgid ""
434"Application error: %r should have returned native object but returned "
435"wrapper instead"
436msgstr ""
437
438#: .././checkbox_ng/service.py:195 .././checkbox_ng/service.py:206
439#: .././checkbox_ng/service.py:217
440#, python-brace-format
441msgid "({0}) internal error, unable to lookup object wrapper"
442msgstr ""
443
444#: .././checkbox_ng/service.py:224
445#, python-format
446msgid "wrapped %s called with %s"
447msgstr ""
448
449#: .././checkbox_ng/service.py:240 .././checkbox_ng/service.py:256
450msgid "unsupported translation {!r}"
451msgstr ""
452
453#: .././checkbox_ng/service.py:243
454#, python-format
455msgid "unwrapped %s called with %s"
456msgstr ""
457
458#: .././checkbox_ng/service.py:245
459#, python-format
460msgid "unwrapped %s returned %r"
461msgstr ""
462
463#: .././checkbox_ng/service.py:258
464#, python-format
465msgid "wrapped %s returned %r"
466msgstr ""
467
468#: .././checkbox_ng/service.py:769
469#, python-format
470msgid "Adding result %r to DBus"
471msgstr ""
472
473#: .././checkbox_ng/service.py:788
474#, python-format
475msgid "Removing result %r from DBus"
476msgstr ""
477
478#: .././checkbox_ng/service.py:811
479#, python-format
480msgid "Adding job %r to DBus"
481msgstr ""
482
483#: .././checkbox_ng/service.py:843
484#, python-format
485msgid "Adding job state %r to DBus"
486msgstr ""
487
488#: .././checkbox_ng/service.py:875
489#, python-brace-format
490msgid "Unable to wrap object of type {0}"
491msgstr ""
492
493#: .././checkbox_ng/service.py:1000
494msgid "Remove() completed"
495msgstr ""
496
497#: .././checkbox_ng/service.py:1075
498#, python-format
499msgid "AskForOutcome(%r) suggested outcome is (%s)"
500msgstr ""
501
502#. NOTE: this should:
503#. 1) attempt to cancel the future in the extremely rare case where it
504#. is not started yet
505#. 2) kill the job otherwise
506#: .././checkbox_ng/service.py:1391
507msgid "Kill() is not implemented"
508msgstr ""
509
510#: .././checkbox_ng/service.py:1411
511msgid "RunCommand() should not be called for automated jobs"
512msgstr ""
513
514#: .././checkbox_ng/service.py:1413
515msgid "RunCommand() is starting to run the job"
516msgstr ""
517
518#: .././checkbox_ng/service.py:1417
519msgid "RunCommand() ignored, waiting for command to finish"
520msgstr ""
521
522#: .././checkbox_ng/service.py:1435
523msgid "SetOutcome() called while the command is still running!"
524msgstr ""
525
526#: .././checkbox_ng/service.py:1442
527msgid "SetOutcome() called before RunCommand()"
528msgstr ""
529
530#. TRANSLATORS: don't translate 'manual' translate it as
531#. 'of type manual' and leave the 'manual' string
532#. intact.
533#: .././checkbox_ng/service.py:1447
534#, python-format
535msgid "But the job is not manual, it is %s"
536msgstr ""
537
538#: .././checkbox_ng/service.py:1480
539msgid "outcome_from_command() called too early!"
540msgstr ""
541
542#: .././checkbox_ng/service.py:1481
543msgid "There is nothing to return yet"
544msgstr ""
545
546#: .././checkbox_ng/service.py:1522
547msgid "Sending ShowInteractiveUI() and not starting the job..."
548msgstr ""
549
550#: .././checkbox_ng/service.py:1526
551#, python-format
552msgid "Running %r right away"
553msgstr ""
554
555#: .././checkbox_ng/service.py:1563
556#, python-format
557msgid "calling JobResultAvailable(%r, %r)"
558msgstr ""
559
560#: .././checkbox_ng/service.py:1570
561msgid ""
562"sending AskForOutcome() after job finished running with OUTCOME_UNDECIDED"
563msgstr ""
564
565#: .././checkbox_ng/ui.py:73411#: .././checkbox_ng/ui.py:73
566msgid "< Continue >"412msgid "< Continue >"
567msgstr ""413msgstr ""
568414
569#: .././checkbox_ng/ui.py:191 .././checkbox_ng/ui.py:318415#: .././checkbox_ng/ui.py:194 .././checkbox_ng/ui.py:321
570msgid "Enter"416msgid "Enter"
571msgstr ""417msgstr ""
572418
573#: .././checkbox_ng/ui.py:194 .././checkbox_ng/ui.py:321419#: .././checkbox_ng/ui.py:197 .././checkbox_ng/ui.py:324
574msgid ": Expand/Collapse"420msgid ": Expand/Collapse"
575msgstr ""421msgstr ""
576422
577#: .././checkbox_ng/ui.py:210423#: .././checkbox_ng/ui.py:213
578msgid "Start "424msgid "Start "
579msgstr ""425msgstr ""
580426
581#: .././checkbox_ng/ui.py:342427#: .././checkbox_ng/ui.py:345
582msgid "inish"428msgid "inish"
583msgstr ""429msgstr ""
584430
=== modified file 'checkbox-ng/po/pl.po'
--- checkbox-ng/po/pl.po 2015-09-15 05:10:23 +0000
+++ checkbox-ng/po/pl.po 2016-01-05 21:24:37 +0000
@@ -7,15 +7,15 @@
7msgstr ""7msgstr ""
8"Project-Id-Version: checkbox-ng 0.4\n"8"Project-Id-Version: checkbox-ng 0.4\n"
9"Report-Msgid-Bugs-To: \n"9"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2015-05-19 13:10+0800\n"10"POT-Creation-Date: 2015-12-23 18:53+0800\n"
11"PO-Revision-Date: 2014-04-17 06:45+0000\n"11"PO-Revision-Date: 2014-04-17 06:45+0000\n"
12"Last-Translator: Zygmunt Krynicki <zygmunt.krynicki@canonical.com>\n"12"Last-Translator: Zygmunt Krynicki <zygmunt.krynicki@canonical.com>\n"
13"Language-Team: polski <>\n"13"Language-Team: polski <>\n"
14"MIME-Version: 1.0\n"14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"16"Content-Transfer-Encoding: 8bit\n"
17"X-Launchpad-Export-Date: 2015-09-15 05:10+0000\n"17"X-Launchpad-Export-Date: 2015-12-26 05:07+0000\n"
18"X-Generator: Launchpad (build 17737)\n"18"X-Generator: Launchpad (build 17865)\n"
19"Language: Polish\n"19"Language: Polish\n"
2020
21#: .././checkbox_ng/certification.py:13521#: .././checkbox_ng/certification.py:135
@@ -38,314 +38,248 @@
38msgstr ""38msgstr ""
3939
40#: .././checkbox_ng/certification.py:164 .././checkbox_ng/launchpad.py:18340#: .././checkbox_ng/certification.py:164 .././checkbox_ng/launchpad.py:183
41#, python-brace-format
42msgid "Request to {0} timed out: {1}"41msgid "Request to {0} timed out: {1}"
43msgstr "Żądanie do {0} przekroczyło czas oczekiwania: {1}"42msgstr "Żądanie do {0} przekroczyło czas oczekiwania: {1}"
4443
45#: .././checkbox_ng/certification.py:167 .././checkbox_ng/launchpad.py:18644#: .././checkbox_ng/certification.py:167 .././checkbox_ng/launchpad.py:186
46#, python-brace-format
47msgid "Invalid destination URL: {0}"45msgid "Invalid destination URL: {0}"
48msgstr "Niewłaściwy docelowy URL: {0}"46msgstr "Niewłaściwy docelowy URL: {0}"
4947
50#: .././checkbox_ng/certification.py:170 .././checkbox_ng/launchpad.py:18948#: .././checkbox_ng/certification.py:170 .././checkbox_ng/launchpad.py:189
51#, python-brace-format
52msgid "Unable to connect to {0}: {1}"49msgid "Unable to connect to {0}: {1}"
53msgstr "Nie można połączyć się z {0}: {1}"50msgstr "Nie można połączyć się z {0}: {1}"
5451
55#: .././checkbox_ng/certification.py:18852#: .././checkbox_ng/certification.py:189
56msgid "secure_id must be 15 or 18-character alphanumeric string"53msgid "secure_id must be 15 or 18-character alphanumeric string"
57msgstr "secure_id musi mieć od 15 do 18 znaków alfanumerycznych"54msgstr "secure_id musi mieć od 15 do 18 znaków alfanumerycznych"
5855
59#: .././checkbox_ng/commands/cli.py:7656#: .././checkbox_ng/commands/cli.py:70
60msgid "run check-config"57msgid "run check-config"
61msgstr ""58msgstr ""
6259
60#: .././checkbox_ng/commands/cli.py:71
61#: .././checkbox_ng/commands/launcher.py:108
62msgid "user interface options"
63msgstr ""
64
63#: .././checkbox_ng/commands/cli.py:7765#: .././checkbox_ng/commands/cli.py:77
64msgid "user interface options"66#: .././checkbox_ng/commands/launcher.py:111
65msgstr ""
66
67#: .././checkbox_ng/commands/cli.py:83
68msgid "skip tests that require interactivity"67msgid "skip tests that require interactivity"
69msgstr "pomiń testy wymagające interaktywności"68msgstr "pomiń testy wymagające interaktywności"
7069
71#: .././checkbox_ng/commands/cli.py:8670#: .././checkbox_ng/commands/cli.py:80
72msgid "don't suppress the output of certain job plugin types"71msgid "don't suppress the output of certain job plugin types"
73msgstr ""72msgstr ""
7473
75#: .././checkbox_ng/commands/newcli.py:12174#: .././checkbox_ng/commands/launcher.py:64
76#: .././checkbox_ng/commands/newcli.py:13275#, python-format
76msgid "Unable to load launcher definition: %s"
77msgstr ""
78
79#: .././checkbox_ng/commands/launcher.py:69
80msgid "Unable to start launcher because of errors:"
81msgstr ""
82
83#: .././checkbox_ng/commands/launcher.py:102
84msgid "LAUNCHER"
85msgstr ""
86
87#: .././checkbox_ng/commands/launcher.py:103
88msgid "launcher definition file to use"
89msgstr ""
90
91#: .././checkbox_ng/commands/newcli.py:119
92#: .././checkbox_ng/commands/newcli.py:130
77#, python-format93#, python-format
78msgid "Incorrect pattern %r: %s"94msgid "Incorrect pattern %r: %s"
79msgstr ""95msgstr ""
8096
81#: .././checkbox_ng/commands/newcli.py:14997#: .././checkbox_ng/commands/newcli.py:147
82#, python-format98#, python-format
83msgid "There is no test plan: %s"99msgid "There is no test plan: %s"
84msgstr ""100msgstr ""
85101
86#: .././checkbox_ng/commands/newcli.py:235102#: .././checkbox_ng/commands/newcli.py:236
87#, python-format103#, python-format
88msgid "Selected testplans: %r"104msgid "Selected testplans: %r"
89msgstr ""105msgstr ""
90106
91#: .././checkbox_ng/commands/newcli.py:258107#: .././checkbox_ng/commands/newcli.py:259
92msgid "Suite selection"108msgid "Suite selection"
93msgstr ""109msgstr ""
94110
95#: .././checkbox_ng/commands/newcli.py:261111#: .././checkbox_ng/commands/newcli.py:262
96msgid "No testplan selected, aborting"112msgid "No testplan selected, aborting"
97msgstr ""113msgstr ""
98114
99#: .././checkbox_ng/commands/newcli.py:299115#: .././checkbox_ng/commands/newcli.py:291
100msgid "Selecting Job Generators"116msgid "Selecting Job Generators"
101msgstr ""117msgstr ""
102118
103#: .././checkbox_ng/commands/newcli.py:318119#: .././checkbox_ng/commands/newcli.py:310
104msgid "Selecting Jobs For Execution"120msgid "Selecting Jobs For Execution"
105msgstr ""121msgstr ""
106122
107#: .././checkbox_ng/commands/newcli.py:325123#: .././checkbox_ng/commands/newcli.py:317
108msgid "Choose tests to run on your system:"124msgid "Choose tests to run on your system:"
109msgstr ""125msgstr ""
110126
111#: .././checkbox_ng/commands/newcli.py:337127#: .././checkbox_ng/commands/newcli.py:329
112msgid "Results"128msgid "Results"
113msgstr ""129msgstr ""
114130
115#: .././checkbox_ng/commands/newcli.py:379131#: .././checkbox_ng/commands/newcli.py:368
116msgid "Saving submission file to {}"
117msgstr "Zapisywanie pliku zgłoszenia do {}"
118
119#. FIXME: replacing extension is ugly
120#: .././checkbox_ng/commands/newcli.py:381
121#: .././checkbox_ng/commands/newcli.py:384
122msgid "View results"132msgid "View results"
123msgstr "Zobacz wyniki"133msgstr "Zobacz wyniki"
124134
125#: .././checkbox_ng/commands/newcli.py:412135#: .././checkbox_ng/commands/newcli.py:397
126#, python-brace-format
127msgid ""136msgid ""
128"\n"137"\n"
129"Submit results to {0}?"138"Submit results to {0}?"
130msgstr ""139msgstr ""
131140
132#: .././checkbox_ng/commands/newcli.py:415141#: .././checkbox_ng/commands/newcli.py:400
133msgid "Secure ID: "142msgid "Secure ID: "
134msgstr "Bezpieczny identyfikator: "143msgstr "Bezpieczny identyfikator: "
135144
136#: .././checkbox_ng/commands/newcli.py:418145#: .././checkbox_ng/commands/newcli.py:403
137msgid "ERROR: Secure ID must be 15 or 18-character alphanumeric string"146msgid "ERROR: Secure ID must be 15 or 18-character alphanumeric string"
138msgstr ""147msgstr ""
139148
140#: .././checkbox_ng/commands/newcli.py:436149#: .././checkbox_ng/commands/newcli.py:421
141msgid ""150msgid ""
142"\n"151"\n"
143"Submit results to launchpad.net/+hwdb?"152"Submit results to launchpad.net/+hwdb?"
144msgstr ""153msgstr ""
145154
146#: .././checkbox_ng/commands/newcli.py:438155#: .././checkbox_ng/commands/newcli.py:423
147msgid "Email address: "156msgid "Email address: "
148msgstr ""157msgstr ""
149158
150#. TRANSLATORS: Do not translate the {} format markers.159#. TRANSLATORS: Do not translate the {} format markers.
151#: .././checkbox_ng/commands/newcli.py:454160#: .././checkbox_ng/commands/newcli.py:439
152#, python-brace-format161msgid "Submitting results to {0} for email_address {1}"
153msgid "Submitting results to {0} for email_address {1})"
154msgstr ""162msgstr ""
155163
156#. TRANSLATORS: Do not translate the {} format marker.164#. TRANSLATORS: Do not translate the {} format marker.
157#: .././checkbox_ng/commands/newcli.py:465165#: .././checkbox_ng/commands/newcli.py:450
158#, python-brace-format
159msgid "Submission uploaded to: {0}"166msgid "Submission uploaded to: {0}"
160msgstr ""167msgstr ""
161168
162#: .././checkbox_ng/commands/newcli.py:471169#: .././checkbox_ng/commands/newcli.py:456
163#, python-brace-format
164msgid "Bad response from {0} transport"170msgid "Bad response from {0} transport"
165msgstr ""171msgstr ""
166172
167#. TRANSLATORS: Do not translate the {} format markers.173#. TRANSLATORS: Do not translate the {} format markers.
168#: .././checkbox_ng/commands/newcli.py:479174#: .././checkbox_ng/commands/newcli.py:464
169#, python-brace-format175msgid "Submitting results to {0} for secure_id {1}"
170msgid "Submitting results to {0} for secure_id {1})"
171msgstr ""176msgstr ""
172177
173#. TRANSLATORS: Do not translate the {} format marker.178#. TRANSLATORS: Do not translate the {} format marker.
174#: .././checkbox_ng/commands/newcli.py:500179#: .././checkbox_ng/commands/newcli.py:485
175#: .././checkbox_ng/commands/sru.py:142180#: .././checkbox_ng/commands/submit.py:64
176#, python-brace-format
177msgid "Successfully sent, submission status at {0}"181msgid "Successfully sent, submission status at {0}"
178msgstr ""182msgstr ""
179183
180#. TRANSLATORS: Do not translate the {} format marker.184#. TRANSLATORS: Do not translate the {} format marker.
181#: .././checkbox_ng/commands/newcli.py:504185#: .././checkbox_ng/commands/newcli.py:489
182#: .././checkbox_ng/commands/sru.py:145186#: .././checkbox_ng/commands/submit.py:68
183#, python-brace-format
184msgid "Successfully sent, server response: {0}"187msgid "Successfully sent, server response: {0}"
185msgstr ""188msgstr ""
186189
187#: .././checkbox_ng/commands/newcli.py:525190#: .././checkbox_ng/commands/newcli.py:514
188msgid "Select jobs to re-run"191msgid "Select jobs to re-run"
189msgstr ""192msgstr ""
190193
191#: .././checkbox_ng/commands/service.py:79194#: .././checkbox_ng/commands/sru.py:58 .././checkbox_ng/commands/submit.py:121
192msgid "Setting up DBus objects..."195msgid "SECURE-ID"
193msgstr ""196msgstr "BEZPIECZNE-ID"
194197
195#. TODO: load sessions198#: .././checkbox_ng/commands/sru.py:61
196#: .././checkbox_ng/commands/service.py:81199msgid "Canonical hardware identifier"
197msgid "Constructing Service object"200msgstr ""
198msgstr ""201
199202#: .././checkbox_ng/commands/sru.py:65
200#: .././checkbox_ng/commands/service.py:83203msgid "TEST-PLAN-ID"
201msgid "Constructing ServiceWrapper"204msgstr ""
202msgstr ""205
203206#. TRANSLATORS: this is in imperative form
204#: .././checkbox_ng/commands/service.py:85207#: .././checkbox_ng/commands/sru.py:68
205msgid "Publishing all objects on DBus"208msgid "load the specified test plan"
206msgstr ""209msgstr ""
207210
208#: .././checkbox_ng/commands/service.py:88211#: .././checkbox_ng/commands/sru.py:71 .././checkbox_ng/config.py:88
209msgid "Publishing all managed objects (events should fire there)"212msgid "Send the data to non-production test server"
210msgstr ""213msgstr ""
211214
212#: .././checkbox_ng/commands/service.py:90215#: .././checkbox_ng/commands/sru.py:75
213#, python-format216msgid "run check-config before starting"
214msgid "Attempting to claim bus name: %s"217msgstr ""
215msgstr ""218
216
217#: .././checkbox_ng/commands/service.py:93
218#, python-format
219msgid "PlainBox DBus service ready, claimed name: %s"
220msgstr ""
221
222#: .././checkbox_ng/commands/service.py:99
223msgid ""
224"Main loop interrupted! It is recommended to call the Exit() method on the "
225"exported service object instead"
226msgstr ""
227
228#: .././checkbox_ng/commands/service.py:103
229#, python-format
230msgid "Releasing %s"
231msgstr ""
232
233#: .././checkbox_ng/commands/service.py:108
234#, python-format
235msgid "Closing %s"
236msgstr ""
237
238#: .././checkbox_ng/commands/service.py:110
239msgid "Main loop terminated, exiting..."
240msgstr ""
241
242#: .././checkbox_ng/commands/service.py:122
243msgid "spawn dbus service"
244msgstr ""
245
246#: .././checkbox_ng/commands/service.py:129
247msgid "use the specified DBus bus name"
248msgstr ""
249
250#. Handle possible DependencyDuplicateError that can happen if
251#. someone is using plainbox for job development.
252#: .././checkbox_ng/commands/sru.py:88219#: .././checkbox_ng/commands/sru.py:88
253msgid "The job database you are currently using is broken"220msgid "Configuration problems prevent running SRU tests"
254msgstr ""221msgstr ""
255"Baza danych zawierająca zadania testowe której teraz używasz jest popsuta"222
256223#: .././checkbox_ng/commands/sru.py:113
257#: .././checkbox_ng/commands/sru.py:89224msgid "Results saved to {0}"
258#, python-brace-format225msgstr ""
259msgid "At least two jobs contend for the name {0}"
260msgstr ""
261
262#: .././checkbox_ng/commands/sru.py:91
263#, python-brace-format
264msgid "Second job defined in: {0}"
265msgstr "Drugie zadanie zdefiniowano w: {0}"
266
267#: .././checkbox_ng/commands/sru.py:112
268msgid "There were some problems with the selected jobs"
269msgstr "Wystąpiły problemy z wybranymi zadaniami"
270
271#: .././checkbox_ng/commands/sru.py:115
272msgid "Problematic jobs will not be considered"
273msgstr "Problematyczne zadania nie zostaną wzięte pod uwagę"
274226
275#: .././checkbox_ng/commands/sru.py:118227#: .././checkbox_ng/commands/sru.py:118
276#, python-brace-format228msgid "Sending hardware report to Canonical Certification"
277msgid "Saving results to {0}"229msgstr ""
278msgstr ""230
279231#: .././checkbox_ng/commands/sru.py:119
280#: .././checkbox_ng/commands/sru.py:125232msgid "Server URL is: {0}"
281#, python-brace-format233msgstr ""
282msgid "Submitting results to {0} for secure_id {1}"234
283msgstr ""235#: .././checkbox_ng/commands/sru.py:131
284236msgid "SRU Session"
285#: .././checkbox_ng/commands/sru.py:150237msgstr ""
286#, python-brace-format238
287msgid "Problem reading a file: {0}"239#: .././checkbox_ng/commands/sru.py:172
288msgstr ""
289
290#: .././checkbox_ng/commands/sru.py:180
291#, python-brace-format
292msgid "comments: {0}"
293msgstr "komentarze: {0}"
294
295#: .././checkbox_ng/commands/sru.py:182
296msgid "inhibitors:"
297msgstr "ograniczniki:"
298
299#: .././checkbox_ng/commands/sru.py:220
300msgid "Configuration problems prevent running SRU tests"
301msgstr ""
302
303#: .././checkbox_ng/commands/sru.py:236
304msgid "run automated stable release update tests"240msgid "run automated stable release update tests"
305msgstr "uruchom automatyczne testy aktualizacji wydania stabilnego"241msgstr "uruchom automatyczne testy aktualizacji wydania stabilnego"
306242
307#: .././checkbox_ng/commands/sru.py:241243#. TRANSLATORS: please leave various options (both long and short forms),
308msgid "run check-config before starting"244#. environment variables and paths in their original form. Also keep the
309msgstr ""245#. special @EPILOG@ string. The first line of the translation is special and
310246#. is used as the help message. Please keep the pseudo-statement form and
311#: .././checkbox_ng/commands/sru.py:249247#. don't finish the sentence with a dot. Pay extra attention to whitespace.
312msgid "SECURE-ID"248#. It must be correctly preserved or the result won't work. In particular
313msgstr "BEZPIECZNE-ID"249#. the leading whitespace *must* be preserved and *must* have the same
314250#. length on each line.
315#. TRANSLATORS: Do not translate %(default)251#: .././checkbox_ng/commands/submit.py:81
316#: .././checkbox_ng/commands/sru.py:254
317#, python-format
318msgid ""252msgid ""
319"associate submission with a machine using this SECURE-ID (%(default)s)"253"\n"
320msgstr ""254" submit test results to the Canonical certification website\n"
321255"\n"
322#: .././checkbox_ng/commands/sru.py:257256" This command sends the XML results file to the Certification website.\n"
323msgid "FILE"257" "
324msgstr "PLIK"258msgstr ""
325259
326#. TRANSLATORS: Do not translate %(default)s260#: .././checkbox_ng/commands/submit.py:98
327#: .././checkbox_ng/commands/sru.py:262261msgid "submit test results to the Canonical certification website"
328#, python-format262msgstr ""
329msgid "if submission fails save the test report as FILE (%(default)s)"263
330msgstr ""264#: .././checkbox_ng/commands/submit.py:104
331265msgid "The path to the results xml file"
332#: .././checkbox_ng/commands/sru.py:265266msgstr ""
267
268#: .././checkbox_ng/commands/submit.py:114
269msgid "must be 15 or 18-character alphanumeric string"
270msgstr ""
271
272#: .././checkbox_ng/commands/submit.py:124
273msgid "associate submission with a machine using this SECURE-ID"
274msgstr ""
275
276#: .././checkbox_ng/commands/submit.py:152
333msgid "URL"277msgid "URL"
334msgstr "URL"278msgstr "URL"
335279
336#. TRANSLATORS: Do not translate %(default)s280#: .././checkbox_ng/commands/submit.py:154
337#: .././checkbox_ng/commands/sru.py:269281msgid "destination to submit to"
338#, python-format282msgstr ""
339msgid "POST the test report XML to this URL (%(default)s)"
340msgstr ""
341
342#: .././checkbox_ng/commands/sru.py:277
343msgid "override --destination to use the staging certification website"
344msgstr ""
345
346#: .././checkbox_ng/commands/sru.py:284
347msgid "don't really run most jobs"
348msgstr "tak na prawdę nie uruchamiaj większości zadań"
349283
350#: .././checkbox_ng/config.py:43284#: .././checkbox_ng/config.py:43
351msgid "Secure ID of the system"285msgid "Secure ID of the system"
@@ -379,13 +313,81 @@
379msgid "Optional whitelist with which to run SRU testing"313msgid "Optional whitelist with which to run SRU testing"
380msgstr ""314msgstr ""
381315
316#: .././checkbox_ng/config.py:82
317msgid "Optional test plan with which to run SRU testing"
318msgstr ""
319
320#: .././checkbox_ng/launcher.py:47
321msgid "Application Title"
322msgstr ""
323
324#: .././checkbox_ng/launcher.py:51
325msgid "Welcome Message"
326msgstr ""
327
328#. TODO: valid regexp text validator
329#: .././checkbox_ng/launcher.py:56
330msgid "Pattern that whitelists need to match to be displayed"
331msgstr ""
332
333#. TODO: valid regexp text validator
334#: .././checkbox_ng/launcher.py:61
335msgid "Pattern that whitelists need to match to be selected"
336msgstr ""
337
338#: .././checkbox_ng/launcher.py:67
339msgid "If enabled then suite selection screen is not displayed"
340msgstr ""
341
342#: .././checkbox_ng/launcher.py:73
343msgid "If enabled then test selection screen is not displayed"
344msgstr ""
345
346#. TODO: probably a choice validator
347#: .././checkbox_ng/launcher.py:78
348msgid "Type of the input field?"
349msgstr ""
350
351#: .././checkbox_ng/launcher.py:82
352msgid "Label on the 'send' button"
353msgstr ""
354
355#. TODO: default?
356#: .././checkbox_ng/launcher.py:88
357msgid "If enabled then test results will be also sent to HEXR"
358msgstr ""
359
360#: .././checkbox_ng/launcher.py:93
361msgid "Where to submit the test results to"
362msgstr ""
363
364#: .././checkbox_ng/launcher.py:98
365msgid ""
366"HTTP endpoint to submit data to, using the transport specified with "
367"submit_to."
368msgstr ""
369
370#: .././checkbox_ng/launcher.py:104
371msgid "Secure ID to identify the system this submission belongs to."
372msgstr ""
373
374#: .././checkbox_ng/launcher.py:109
375msgid "Name of custom configuration file"
376msgstr ""
377
378#: .././checkbox_ng/launcher.py:113
379msgid "Don't suppress the output of certain job plugin types."
380msgstr ""
381
382#: .././checkbox_ng/launcher.py:116
383msgid "Section with only exported unit ids as keys (no values)"
384msgstr ""
385
382#: .././checkbox_ng/launchpad.py:66386#: .././checkbox_ng/launchpad.py:66
383#, python-brace-format
384msgid "Cannot get {0} resource job"387msgid "Cannot get {0} resource job"
385msgstr "Nie można uzyskać zadania zasobu {0}"388msgstr "Nie można uzyskać zadania zasobu {0}"
386389
387#: .././checkbox_ng/launchpad.py:70390#: .././checkbox_ng/launchpad.py:70
388#, python-brace-format
389msgid "{0} has no attribute {1}"391msgid "{0} has no attribute {1}"
390msgstr "{0} nie ma atrybutu {1}"392msgstr "{0} nie ma atrybutu {1}"
391393
@@ -406,180 +408,22 @@
406msgid "The submission was uploaded to Launchpad successfully"408msgid "The submission was uploaded to Launchpad successfully"
407msgstr ""409msgstr ""
408410
409#: .././checkbox_ng/service.py:37
410msgid "DBus parts require 'funcsigs' from pypi."
411msgstr ""
412
413#: .././checkbox_ng/service.py:86
414#, python-format
415msgid "Created DBus wrapper %s for: %r"
416msgstr ""
417
418#: .././checkbox_ng/service.py:90
419#, python-format
420msgid "DBus wrapper %s died"
421msgstr ""
422
423#: .././checkbox_ng/service.py:122
424#, python-format
425msgid "Published DBus wrapper for %r as %s"
426msgstr ""
427
428#: .././checkbox_ng/service.py:169 .././checkbox_ng/service.py:180
429#, python-brace-format
430msgid "object path {0} does not designate an existing object"
431msgstr ""
432
433#: .././checkbox_ng/service.py:188
434#, python-format
435msgid ""
436"Application error: %r should have returned native object but returned "
437"wrapper instead"
438msgstr ""
439
440#: .././checkbox_ng/service.py:195 .././checkbox_ng/service.py:206
441#: .././checkbox_ng/service.py:217
442#, python-brace-format
443msgid "({0}) internal error, unable to lookup object wrapper"
444msgstr ""
445
446#: .././checkbox_ng/service.py:224
447#, python-format
448msgid "wrapped %s called with %s"
449msgstr ""
450
451#: .././checkbox_ng/service.py:240 .././checkbox_ng/service.py:256
452msgid "unsupported translation {!r}"
453msgstr ""
454
455#: .././checkbox_ng/service.py:243
456#, python-format
457msgid "unwrapped %s called with %s"
458msgstr ""
459
460#: .././checkbox_ng/service.py:245
461#, python-format
462msgid "unwrapped %s returned %r"
463msgstr ""
464
465#: .././checkbox_ng/service.py:258
466#, python-format
467msgid "wrapped %s returned %r"
468msgstr ""
469
470#: .././checkbox_ng/service.py:769
471#, python-format
472msgid "Adding result %r to DBus"
473msgstr ""
474
475#: .././checkbox_ng/service.py:788
476#, python-format
477msgid "Removing result %r from DBus"
478msgstr ""
479
480#: .././checkbox_ng/service.py:811
481#, python-format
482msgid "Adding job %r to DBus"
483msgstr ""
484
485#: .././checkbox_ng/service.py:843
486#, python-format
487msgid "Adding job state %r to DBus"
488msgstr ""
489
490#: .././checkbox_ng/service.py:875
491#, python-brace-format
492msgid "Unable to wrap object of type {0}"
493msgstr ""
494
495#: .././checkbox_ng/service.py:1000
496msgid "Remove() completed"
497msgstr ""
498
499#: .././checkbox_ng/service.py:1075
500#, python-format
501msgid "AskForOutcome(%r) suggested outcome is (%s)"
502msgstr ""
503
504#. NOTE: this should:
505#. 1) attempt to cancel the future in the extremely rare case where it
506#. is not started yet
507#. 2) kill the job otherwise
508#: .././checkbox_ng/service.py:1391
509msgid "Kill() is not implemented"
510msgstr ""
511
512#: .././checkbox_ng/service.py:1411
513msgid "RunCommand() should not be called for automated jobs"
514msgstr ""
515
516#: .././checkbox_ng/service.py:1413
517msgid "RunCommand() is starting to run the job"
518msgstr ""
519
520#: .././checkbox_ng/service.py:1417
521msgid "RunCommand() ignored, waiting for command to finish"
522msgstr ""
523
524#: .././checkbox_ng/service.py:1435
525msgid "SetOutcome() called while the command is still running!"
526msgstr ""
527
528#: .././checkbox_ng/service.py:1442
529msgid "SetOutcome() called before RunCommand()"
530msgstr "funkcja SetOutcome() wywołana przed RunCommand()"
531
532#. TRANSLATORS: don't translate 'manual' translate it as
533#. 'of type manual' and leave the 'manual' string
534#. intact.
535#: .././checkbox_ng/service.py:1447
536#, python-format
537msgid "But the job is not manual, it is %s"
538msgstr "Lecz zadanie nie jest typu manual, jest typu %s"
539
540#: .././checkbox_ng/service.py:1480
541msgid "outcome_from_command() called too early!"
542msgstr "funkcja outcome_from_command() została wywołana zbyt wcześnie"
543
544#: .././checkbox_ng/service.py:1481
545msgid "There is nothing to return yet"
546msgstr "Nie ma jeszcze nic do zwrócenia"
547
548#: .././checkbox_ng/service.py:1522
549msgid "Sending ShowInteractiveUI() and not starting the job..."
550msgstr "Wysyłanie ShowInteractiveUI() i nie uruchamianie zadania..."
551
552#: .././checkbox_ng/service.py:1526
553#, python-format
554msgid "Running %r right away"
555msgstr "Uruchamianie %r od razu"
556
557#: .././checkbox_ng/service.py:1563
558#, python-format
559msgid "calling JobResultAvailable(%r, %r)"
560msgstr "wywoływanie JobResourceAvailalbe(%r, %r)"
561
562#: .././checkbox_ng/service.py:1570
563msgid ""
564"sending AskForOutcome() after job finished running with OUTCOME_UNDECIDED"
565msgstr ""
566
567#: .././checkbox_ng/ui.py:73411#: .././checkbox_ng/ui.py:73
568msgid "< Continue >"412msgid "< Continue >"
569msgstr ""413msgstr ""
570414
571#: .././checkbox_ng/ui.py:191 .././checkbox_ng/ui.py:318415#: .././checkbox_ng/ui.py:194 .././checkbox_ng/ui.py:321
572msgid "Enter"416msgid "Enter"
573msgstr ""417msgstr ""
574418
575#: .././checkbox_ng/ui.py:194 .././checkbox_ng/ui.py:321419#: .././checkbox_ng/ui.py:197 .././checkbox_ng/ui.py:324
576msgid ": Expand/Collapse"420msgid ": Expand/Collapse"
577msgstr ""421msgstr ""
578422
579#: .././checkbox_ng/ui.py:210423#: .././checkbox_ng/ui.py:213
580msgid "Start "424msgid "Start "
581msgstr ""425msgstr ""
582426
583#: .././checkbox_ng/ui.py:342427#: .././checkbox_ng/ui.py:345
584msgid "inish"428msgid "inish"
585msgstr ""429msgstr ""
586430
=== added file 'checkbox-ng/po/zh_TW.po'
--- checkbox-ng/po/zh_TW.po 1970-01-01 00:00:00 +0000
+++ checkbox-ng/po/zh_TW.po 2016-01-05 21:24:37 +0000
@@ -0,0 +1,433 @@
1# Chinese (Traditional) translation for checkbox
2# Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015
3# This file is distributed under the same license as the checkbox package.
4# FIRST AUTHOR <EMAIL@ADDRESS>, 2015.
5#
6msgid ""
7msgstr ""
8"Project-Id-Version: checkbox\n"
9"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2015-12-23 18:53+0800\n"
11"PO-Revision-Date: 2015-12-23 03:46+0000\n"
12"Last-Translator: Po-Hsu Lin <po-hsu.lin@canonical.com>\n"
13"Language-Team: Chinese (Traditional) <zh_TW@li.org>\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"X-Launchpad-Export-Date: 2015-12-26 05:07+0000\n"
18"X-Generator: Launchpad (build 17865)\n"
19"Language: \n"
20
21#: .././checkbox_ng/certification.py:135
22msgid "Secure ID not specified"
23msgstr ""
24
25#: .././checkbox_ng/certification.py:138
26#, python-format
27msgid "Sending to %s, hardware id is %s"
28msgstr ""
29
30#: .././checkbox_ng/certification.py:144
31#, python-format
32msgid "submit_to_hexr set to %s by config"
33msgstr ""
34
35#: .././checkbox_ng/certification.py:148
36#, python-format
37msgid "submit_to_hexr set to %s by UI"
38msgstr ""
39
40#: .././checkbox_ng/certification.py:164 .././checkbox_ng/launchpad.py:183
41msgid "Request to {0} timed out: {1}"
42msgstr "至 {0} 的要求逾時:{1}"
43
44#: .././checkbox_ng/certification.py:167 .././checkbox_ng/launchpad.py:186
45msgid "Invalid destination URL: {0}"
46msgstr "無效的目標網址:{0}"
47
48#: .././checkbox_ng/certification.py:170 .././checkbox_ng/launchpad.py:189
49msgid "Unable to connect to {0}: {1}"
50msgstr "無法連線至 {0}: {1}"
51
52#: .././checkbox_ng/certification.py:189
53msgid "secure_id must be 15 or 18-character alphanumeric string"
54msgstr ""
55
56#: .././checkbox_ng/commands/cli.py:70
57msgid "run check-config"
58msgstr "執行 check-config"
59
60#: .././checkbox_ng/commands/cli.py:71
61#: .././checkbox_ng/commands/launcher.py:108
62msgid "user interface options"
63msgstr "使用者介面選項"
64
65#: .././checkbox_ng/commands/cli.py:77
66#: .././checkbox_ng/commands/launcher.py:111
67msgid "skip tests that require interactivity"
68msgstr ""
69
70#: .././checkbox_ng/commands/cli.py:80
71msgid "don't suppress the output of certain job plugin types"
72msgstr ""
73
74#: .././checkbox_ng/commands/launcher.py:64
75#, python-format
76msgid "Unable to load launcher definition: %s"
77msgstr ""
78
79#: .././checkbox_ng/commands/launcher.py:69
80msgid "Unable to start launcher because of errors:"
81msgstr ""
82
83#: .././checkbox_ng/commands/launcher.py:102
84msgid "LAUNCHER"
85msgstr ""
86
87#: .././checkbox_ng/commands/launcher.py:103
88msgid "launcher definition file to use"
89msgstr ""
90
91#: .././checkbox_ng/commands/newcli.py:119
92#: .././checkbox_ng/commands/newcli.py:130
93#, python-format
94msgid "Incorrect pattern %r: %s"
95msgstr ""
96
97#: .././checkbox_ng/commands/newcli.py:147
98#, python-format
99msgid "There is no test plan: %s"
100msgstr "無此測試計畫:%s"
101
102#: .././checkbox_ng/commands/newcli.py:236
103#, python-format
104msgid "Selected testplans: %r"
105msgstr "已選擇的測試計畫:%r"
106
107#: .././checkbox_ng/commands/newcli.py:259
108msgid "Suite selection"
109msgstr ""
110
111#: .././checkbox_ng/commands/newcli.py:262
112msgid "No testplan selected, aborting"
113msgstr "沒有選擇任何測試計畫,程式中止"
114
115#: .././checkbox_ng/commands/newcli.py:291
116msgid "Selecting Job Generators"
117msgstr ""
118
119#: .././checkbox_ng/commands/newcli.py:310
120msgid "Selecting Jobs For Execution"
121msgstr ""
122
123#: .././checkbox_ng/commands/newcli.py:317
124msgid "Choose tests to run on your system:"
125msgstr "選擇要在您的系統上執行的測試項目:"
126
127#: .././checkbox_ng/commands/newcli.py:329
128msgid "Results"
129msgstr "結果"
130
131#: .././checkbox_ng/commands/newcli.py:368
132msgid "View results"
133msgstr "查看結果"
134
135#: .././checkbox_ng/commands/newcli.py:397
136msgid ""
137"\n"
138"Submit results to {0}?"
139msgstr ""
140"\n"
141"傳送結果至 {0}?"
142
143#: .././checkbox_ng/commands/newcli.py:400
144msgid "Secure ID: "
145msgstr ""
146
147#: .././checkbox_ng/commands/newcli.py:403
148msgid "ERROR: Secure ID must be 15 or 18-character alphanumeric string"
149msgstr ""
150
151#: .././checkbox_ng/commands/newcli.py:421
152msgid ""
153"\n"
154"Submit results to launchpad.net/+hwdb?"
155msgstr ""
156"\n"
157"傳送結果至 launchpad.net/+hwdb?"
158
159#: .././checkbox_ng/commands/newcli.py:423
160msgid "Email address: "
161msgstr "電子郵件地址: "
162
163#. TRANSLATORS: Do not translate the {} format markers.
164#: .././checkbox_ng/commands/newcli.py:439
165msgid "Submitting results to {0} for email_address {1}"
166msgstr ""
167
168#. TRANSLATORS: Do not translate the {} format marker.
169#: .././checkbox_ng/commands/newcli.py:450
170msgid "Submission uploaded to: {0}"
171msgstr ""
172
173#: .././checkbox_ng/commands/newcli.py:456
174msgid "Bad response from {0} transport"
175msgstr ""
176
177#. TRANSLATORS: Do not translate the {} format markers.
178#: .././checkbox_ng/commands/newcli.py:464
179msgid "Submitting results to {0} for secure_id {1}"
180msgstr ""
181
182#. TRANSLATORS: Do not translate the {} format marker.
183#: .././checkbox_ng/commands/newcli.py:485
184#: .././checkbox_ng/commands/submit.py:64
185msgid "Successfully sent, submission status at {0}"
186msgstr ""
187
188#. TRANSLATORS: Do not translate the {} format marker.
189#: .././checkbox_ng/commands/newcli.py:489
190#: .././checkbox_ng/commands/submit.py:68
191msgid "Successfully sent, server response: {0}"
192msgstr "傳送成功,伺服器回應:{0}"
193
194#: .././checkbox_ng/commands/newcli.py:514
195msgid "Select jobs to re-run"
196msgstr ""
197
198#: .././checkbox_ng/commands/sru.py:58 .././checkbox_ng/commands/submit.py:121
199msgid "SECURE-ID"
200msgstr ""
201
202#: .././checkbox_ng/commands/sru.py:61
203msgid "Canonical hardware identifier"
204msgstr ""
205
206#: .././checkbox_ng/commands/sru.py:65
207msgid "TEST-PLAN-ID"
208msgstr ""
209
210#. TRANSLATORS: this is in imperative form
211#: .././checkbox_ng/commands/sru.py:68
212msgid "load the specified test plan"
213msgstr ""
214
215#: .././checkbox_ng/commands/sru.py:71 .././checkbox_ng/config.py:88
216msgid "Send the data to non-production test server"
217msgstr ""
218
219#: .././checkbox_ng/commands/sru.py:75
220msgid "run check-config before starting"
221msgstr "開始前執行 check-config"
222
223#: .././checkbox_ng/commands/sru.py:88
224msgid "Configuration problems prevent running SRU tests"
225msgstr "設定問題導致無法進行 SRU 測試"
226
227#: .././checkbox_ng/commands/sru.py:113
228msgid "Results saved to {0}"
229msgstr ""
230
231#: .././checkbox_ng/commands/sru.py:118
232msgid "Sending hardware report to Canonical Certification"
233msgstr ""
234
235#: .././checkbox_ng/commands/sru.py:119
236msgid "Server URL is: {0}"
237msgstr ""
238
239#: .././checkbox_ng/commands/sru.py:131
240msgid "SRU Session"
241msgstr ""
242
243#: .././checkbox_ng/commands/sru.py:172
244msgid "run automated stable release update tests"
245msgstr "執行自動化穩定發行版更新測試"
246
247#. TRANSLATORS: please leave various options (both long and short forms),
248#. environment variables and paths in their original form. Also keep the
249#. special @EPILOG@ string. The first line of the translation is special and
250#. is used as the help message. Please keep the pseudo-statement form and
251#. don't finish the sentence with a dot. Pay extra attention to whitespace.
252#. It must be correctly preserved or the result won't work. In particular
253#. the leading whitespace *must* be preserved and *must* have the same
254#. length on each line.
255#: .././checkbox_ng/commands/submit.py:81
256msgid ""
257"\n"
258" submit test results to the Canonical certification website\n"
259"\n"
260" This command sends the XML results file to the Certification website.\n"
261" "
262msgstr ""
263
264#: .././checkbox_ng/commands/submit.py:98
265msgid "submit test results to the Canonical certification website"
266msgstr ""
267
268#: .././checkbox_ng/commands/submit.py:104
269msgid "The path to the results xml file"
270msgstr ""
271
272#: .././checkbox_ng/commands/submit.py:114
273msgid "must be 15 or 18-character alphanumeric string"
274msgstr ""
275
276#: .././checkbox_ng/commands/submit.py:124
277msgid "associate submission with a machine using this SECURE-ID"
278msgstr ""
279
280#: .././checkbox_ng/commands/submit.py:152
281msgid "URL"
282msgstr "網址"
283
284#: .././checkbox_ng/commands/submit.py:154
285msgid "destination to submit to"
286msgstr ""
287
288#: .././checkbox_ng/config.py:43
289msgid "Secure ID of the system"
290msgstr ""
291
292#: .././checkbox_ng/config.py:48
293msgid "Whether to send the submission data to c3"
294msgstr "是否要將結果傳送至 C3"
295
296#: .././checkbox_ng/config.py:52
297msgid "Whether to also send the submission data to HEXR"
298msgstr "是否也要將結果傳送至 HEXR"
299
300#: .././checkbox_ng/config.py:58
301msgid "Email address to log into the Launchpad HWDB"
302msgstr "登入 Launchpad 硬體資料庫用的電子郵件地址"
303
304#: .././checkbox_ng/config.py:63
305msgid "URL of the certification website"
306msgstr ""
307
308#: .././checkbox_ng/config.py:69
309msgid "URL of the launchpad hardware database"
310msgstr "launchpad 硬體資料庫網址"
311
312#: .././checkbox_ng/config.py:74
313msgid "Location of the fallback file"
314msgstr ""
315
316#: .././checkbox_ng/config.py:78
317msgid "Optional whitelist with which to run SRU testing"
318msgstr ""
319
320#: .././checkbox_ng/config.py:82
321msgid "Optional test plan with which to run SRU testing"
322msgstr ""
323
324#: .././checkbox_ng/launcher.py:47
325msgid "Application Title"
326msgstr ""
327
328#: .././checkbox_ng/launcher.py:51
329msgid "Welcome Message"
330msgstr ""
331
332#. TODO: valid regexp text validator
333#: .././checkbox_ng/launcher.py:56
334msgid "Pattern that whitelists need to match to be displayed"
335msgstr ""
336
337#. TODO: valid regexp text validator
338#: .././checkbox_ng/launcher.py:61
339msgid "Pattern that whitelists need to match to be selected"
340msgstr ""
341
342#: .././checkbox_ng/launcher.py:67
343msgid "If enabled then suite selection screen is not displayed"
344msgstr ""
345
346#: .././checkbox_ng/launcher.py:73
347msgid "If enabled then test selection screen is not displayed"
348msgstr ""
349
350#. TODO: probably a choice validator
351#: .././checkbox_ng/launcher.py:78
352msgid "Type of the input field?"
353msgstr ""
354
355#: .././checkbox_ng/launcher.py:82
356msgid "Label on the 'send' button"
357msgstr ""
358
359#. TODO: default?
360#: .././checkbox_ng/launcher.py:88
361msgid "If enabled then test results will be also sent to HEXR"
362msgstr ""
363
364#: .././checkbox_ng/launcher.py:93
365msgid "Where to submit the test results to"
366msgstr ""
367
368#: .././checkbox_ng/launcher.py:98
369msgid ""
370"HTTP endpoint to submit data to, using the transport specified with "
371"submit_to."
372msgstr ""
373
374#: .././checkbox_ng/launcher.py:104
375msgid "Secure ID to identify the system this submission belongs to."
376msgstr ""
377
378#: .././checkbox_ng/launcher.py:109
379msgid "Name of custom configuration file"
380msgstr ""
381
382#: .././checkbox_ng/launcher.py:113
383msgid "Don't suppress the output of certain job plugin types."
384msgstr ""
385
386#: .././checkbox_ng/launcher.py:116
387msgid "Section with only exported unit ids as keys (no values)"
388msgstr ""
389
390#: .././checkbox_ng/launchpad.py:66
391msgid "Cannot get {0} resource job"
392msgstr ""
393
394#: .././checkbox_ng/launchpad.py:70
395msgid "{0} has no attribute {1}"
396msgstr "{0} 沒有 {1} 屬性"
397
398#: .././checkbox_ng/launchpad.py:97
399msgid "DMI resources not found"
400msgstr "找不到 DMI 資源"
401
402#: .././checkbox_ng/launchpad.py:110
403msgid "System ID not found"
404msgstr ""
405
406#: .././checkbox_ng/launchpad.py:196
407#, python-format
408msgid "Success! Server said %s"
409msgstr "成功!伺服器回應 %s"
410
411#: .././checkbox_ng/launchpad.py:197
412msgid "The submission was uploaded to Launchpad successfully"
413msgstr "測試報告已成功上傳至 Launchpad"
414
415#: .././checkbox_ng/ui.py:73
416msgid "< Continue >"
417msgstr "< 繼續 >"
418
419#: .././checkbox_ng/ui.py:194 .././checkbox_ng/ui.py:321
420msgid "Enter"
421msgstr "Enter 鍵"
422
423#: .././checkbox_ng/ui.py:197 .././checkbox_ng/ui.py:324
424msgid ": Expand/Collapse"
425msgstr ":展開 / 收起"
426
427#: .././checkbox_ng/ui.py:213
428msgid "Start "
429msgstr "開始 "
430
431#: .././checkbox_ng/ui.py:345
432msgid "inish"
433msgstr ""
0434
=== modified file 'checkbox-ng/setup.py'
--- checkbox-ng/setup.py 2015-09-17 13:32:38 +0000
+++ checkbox-ng/setup.py 2016-01-05 21:24:37 +0000
@@ -55,7 +55,7 @@
5555
56setup(56setup(
57 name="checkbox-ng",57 name="checkbox-ng",
58 version="0.21.dev0",58 version="0.24.dev0",
59 url="https://launchpad.net/checkbox-ng/",59 url="https://launchpad.net/checkbox-ng/",
60 packages=find_packages(),60 packages=find_packages(),
61 author="Zygmunt Krynicki",61 author="Zygmunt Krynicki",
@@ -65,7 +65,7 @@
65 description="Checkbox - Command Line Test Runner",65 description="Checkbox - Command Line Test Runner",
66 long_description=long_description,66 long_description=long_description,
67 install_requires=install_requires,67 install_requires=install_requires,
68 scripts = ['launchers/checkbox-cli'],68 scripts = ['launchers/checkbox-cli', 'launchers/checkbox-cli2'],
69 entry_points={69 entry_points={
70 'console_scripts': [70 'console_scripts': [
71 'checkbox=checkbox_ng.main:main',71 'checkbox=checkbox_ng.main:main',
7272
=== modified file 'checkbox-support/checkbox_support/parsers/submission.py'
--- checkbox-support/checkbox_support/parsers/submission.py 2015-07-13 13:02:37 +0000
+++ checkbox-support/checkbox_support/parsers/submission.py 2016-01-05 21:24:37 +0000
@@ -304,6 +304,18 @@
304 logger.debug(package_version)304 logger.debug(package_version)
305 message["packages"].append(package_version)305 message["packages"].append(package_version)
306306
307 def addSnapPackageVersion(self, **snap_package_version):
308 if not self.messages or (self.messages[-1]["type"]
309 != "set-snap-packages"):
310 self.messages.append({
311 "type": "set-snap-packages",
312 "snap-packages": []})
313
314 message = self.messages[-1]
315 logger.debug("ADDING Snap Package Version:")
316 logger.debug(snap_package_version)
317 message["snap-packages"].append(snap_package_version)
318
307 def addTestResult(self, **test_result):319 def addTestResult(self, **test_result):
308 if not self.messages or self.messages[-1]["type"] != "add-results":320 if not self.messages or self.messages[-1]["type"] != "add-results":
309 self.messages.append({321 self.messages.append({
@@ -633,6 +645,8 @@
633 register(("test_run", "raw_dmi_device",), self.addRawDmiDeviceState)645 register(("test_run", "raw_dmi_device",), self.addRawDmiDeviceState)
634 register(("test_run", "distribution",), self.setDistribution)646 register(("test_run", "distribution",), self.setDistribution)
635 register(("test_run", "package_version",), self.addPackageVersion)647 register(("test_run", "package_version",), self.addPackageVersion)
648 register(("test_run", "snap_package_version",),
649 self.addSnapPackageVersion)
636 register(("test_run", "test_result",), self.addTestResult)650 register(("test_run", "test_result",), self.addTestResult)
637 register(("test_run", "modprobe",), self.addModprobeInfo)651 register(("test_run", "modprobe",), self.addModprobeInfo)
638 register(("test_run", "dkms_info",), self.addDkmsInfo)652 register(("test_run", "dkms_info",), self.addDkmsInfo)
@@ -840,6 +854,19 @@
840 def addPackageVersion(self, test_run, package_version):854 def addPackageVersion(self, test_run, package_version):
841 test_run.addPackageVersion(**package_version)855 test_run.addPackageVersion(**package_version)
842856
857 def addSnapPackage(self, snap_package):
858 snap_package_version = {
859 "name": snap_package["name"],
860 "date": snap_package["properties"]["date"],
861 "version": snap_package["properties"]["version"],
862 "developer": snap_package["properties"]["developer"],
863 }
864 self.dispatcher.publishEvent(
865 "snap_package_version", snap_package_version)
866
867 def addSnapPackageVersion(self, test_run, snap_package_version):
868 test_run.addSnapPackageVersion(**snap_package_version)
869
843 def addQuestion(self, question):870 def addQuestion(self, question):
844 answer_to_status = {871 answer_to_status = {
845 "fail": FAIL,872 "fail": FAIL,
@@ -1084,6 +1111,18 @@
1084 }1111 }
1085 result.addPackage(package)1112 result.addPackage(package)
10861113
1114 def parseSnapPackages(self, result, node):
1115 """Parse the <snap_packages> part of a submission."""
1116 for child in node.getchildren():
1117 assert child.tag == "snap_package", \
1118 "Unexpected tag <%s>, expected <snap_package>" % child.tag
1119
1120 snap_package = {
1121 "name": child.get("name"),
1122 "properties": self._getProperties(child),
1123 }
1124 result.addSnapPackage(snap_package)
1125
1087 def parseProcessors(self, result, node):1126 def parseProcessors(self, result, node):
1088 """Parse the <processors> part of a submission."""1127 """Parse the <processors> part of a submission."""
1089 processors = []1128 processors = []
@@ -1179,6 +1218,7 @@
1179 parsers = {1218 parsers = {
1180 "lsbrelease": self.parseLSBRelease,1219 "lsbrelease": self.parseLSBRelease,
1181 "packages": self.parsePackages,1220 "packages": self.parsePackages,
1221 "snap_packages": self.parseSnapPackages,
1182 }1222 }
11831223
1184 for child in node.getchildren():1224 for child in node.getchildren():
11851225
=== added file 'checkbox-support/checkbox_support/parsers/tests/fixtures/submission_snap_packages.xml'
--- checkbox-support/checkbox_support/parsers/tests/fixtures/submission_snap_packages.xml 1970-01-01 00:00:00 +0000
+++ checkbox-support/checkbox_support/parsers/tests/fixtures/submission_snap_packages.xml 2016-01-05 21:24:37 +0000
@@ -0,0 +1,12 @@
1<?xml version="1.0" ?>
2<system version="1.0">
3<software>
4<snap_packages>
5<snap_package id="0" name="ubuntu-core">
6<property name="date" type="str">2015-10-13</property>
7<property name="version" type="str">14</property>
8<property name="developer" type="str">ubuntu</property>
9</snap_package>
10</snap_packages>
11</software>
12</system>
013
=== modified file 'checkbox-support/checkbox_support/parsers/tests/test_submission.py'
--- checkbox-support/checkbox_support/parsers/tests/test_submission.py 2015-06-10 14:29:19 +0000
+++ checkbox-support/checkbox_support/parsers/tests/test_submission.py 2016-01-05 21:24:37 +0000
@@ -94,6 +94,10 @@
94 self.result.setdefault("package_versions", [])94 self.result.setdefault("package_versions", [])
95 self.result["package_versions"].append(package_version)95 self.result["package_versions"].append(package_version)
9696
97 def addSnapPackageVersion(self, **snap_package_version):
98 self.result.setdefault("snap_package_versions", [])
99 self.result["snap_package_versions"].append(snap_package_version)
100
97 def addTestResult(self, **test_result):101 def addTestResult(self, **test_result):
98 self.result.setdefault("test_results", [])102 self.result.setdefault("test_results", [])
99 self.result["test_results"].append(test_result)103 self.result["test_results"].append(test_result)
@@ -330,6 +334,18 @@
330 self.assertEqual(package_version["name"], "accountsservice")334 self.assertEqual(package_version["name"], "accountsservice")
331 self.assertEqual(package_version["version"], "0.6.21-6ubuntu2")335 self.assertEqual(package_version["version"], "0.6.21-6ubuntu2")
332336
337 def test_snap_package_versions(self):
338 """Snap Package versions are in the snap_packages element."""
339 result = self.getResult("submission_snap_packages.xml")
340 self.assertTrue("snap_package_versions" in result)
341 self.assertEqual(len(result["snap_package_versions"]), 1)
342
343 package_version = result["snap_package_versions"][0]
344 self.assertEqual(package_version["name"], "ubuntu-core")
345 self.assertEqual(package_version["version"], "14")
346 self.assertEqual(package_version["date"], "2015-10-13")
347 self.assertEqual(package_version["developer"], "ubuntu")
348
333 def test_package_modaliases(self):349 def test_package_modaliases(self):
334 """350 """
335 Modaliases information is in the packages element if a package351 Modaliases information is in the packages element if a package
336352
=== modified file 'checkbox-support/checkbox_support/parsers/udevadm.py'
--- checkbox-support/checkbox_support/parsers/udevadm.py 2015-08-11 11:01:48 +0000
+++ checkbox-support/checkbox_support/parsers/udevadm.py 2016-01-05 21:24:37 +0000
@@ -635,9 +635,11 @@
635 def interface(self):635 def interface(self):
636 if self._interface is not None:636 if self._interface is not None:
637 return self._interface637 return self._interface
638 if (self.category in ("NETWORK", "WIRELESS") and638 if self.category in ("NETWORK", "WIRELESS"):
639 "INTERFACE" in self._environment):639 if "INTERFACE" in self._environment:
640 return self._environment["INTERFACE"]640 return self._environment["INTERFACE"]
641 else:
642 return 'UNKNOWN'
641 return None643 return None
642644
643 @interface.setter645 @interface.setter
644646
=== modified file 'checkbox-support/setup.py'
--- checkbox-support/setup.py 2015-07-13 12:32:59 +0000
+++ checkbox-support/setup.py 2016-01-05 21:24:37 +0000
@@ -38,7 +38,7 @@
3838
39setup(39setup(
40 name="checkbox-support",40 name="checkbox-support",
41 version="0.21.dev",41 version="0.24.dev0",
42 url="https://launchpad.net/checkbox/",42 url="https://launchpad.net/checkbox/",
43 packages=find_packages(),43 packages=find_packages(),
44 test_suite='checkbox_support.tests.test_suite',44 test_suite='checkbox_support.tests.test_suite',
4545
=== modified file 'checkbox-touch/Makefile'
--- checkbox-touch/Makefile 2015-09-18 16:40:09 +0000
+++ checkbox-touch/Makefile 2016-01-05 21:24:37 +0000
@@ -8,6 +8,14 @@
8# sudo apt-get install python-autopilot autopilot-qt8# sudo apt-get install python-autopilot autopilot-qt
9#############################################################9#############################################################
1010
11TRANSLATION_ROOT=.
12
13APP_ID=com.ubuntu.checkbox
14
15MO_FILES=$(foreach infile,$(basename $(notdir $(wildcard ./po/*.po))),$(TRANSLATION_ROOT)/share/locale/$(infile)/LC_MESSAGES/$(APP_ID).mo)
16QMLJS_FILES:=$(shell find . -name "*.qml" -o -name "*.js" | grep -v ./tests)
17PY_FILES=$(wildcard ./py/*.py) build-me get-libs
18
11all:19all:
1220
13autopilot:21autopilot:
@@ -21,3 +29,17 @@
21run:29run:
22 /usr/bin/qmlscene $@ checkbox-touch.qml30 /usr/bin/qmlscene $@ checkbox-touch.qml
2331
32build-translations: $(MO_FILES)
33 echo $(MO_FILES)
34
35po:
36 mkdir -p $(CURDIR)/po
37
38po/checkbox-touch.pot: $(QMLJS_FILES) $(PY_FILES) | po
39 xgettext -o po/checkbox-touch.pot --qt --c++ --add-comments=TRANSLATORS --keyword=tr --keyword=tr:1,2 $(QMLJS_FILES) --from-code=UTF-8
40 xgettext -o po/checkbox-touch.pot --join-existing --language=python --add-comments=TRANSLATORS --keyword=_ --keyword=N_ $(PY_FILES)
41
42
43$(TRANSLATION_ROOT)/share/locale/%/LC_MESSAGES/$(APP_ID).mo: po/%.po
44 mkdir -p $(TRANSLATION_ROOT)/share/locale/$*/LC_MESSAGES && msgfmt -o $@ $^
45
2446
=== modified file 'checkbox-touch/build-me'
--- checkbox-touch/build-me 2015-07-29 08:13:09 +0000
+++ checkbox-touch/build-me 2016-01-05 21:24:37 +0000
@@ -1,5 +1,6 @@
1#!/usr/bin/env python31#!/usr/bin/env python3
2import argparse2import argparse
3from contextlib import contextmanager
3from distutils.dir_util import copy_tree4from distutils.dir_util import copy_tree
4from datetime import datetime5from datetime import datetime
5import json6import json
@@ -9,6 +10,9 @@
9import sys10import sys
10import textwrap11import textwrap
1112
13from confinement.generate import generate_confinement
14from py.embedded_providers import EmbeddedProvider1PlugInCollection
15
12# DEFAULT_PROVIDERS is a list of providers directory names as listed in16# DEFAULT_PROVIDERS is a list of providers directory names as listed in
13# ../providers. NOTE: those are directory names, not provider names as reported17# ../providers. NOTE: those are directory names, not provider names as reported
14# by manage.py info18# by manage.py info
@@ -19,6 +23,24 @@
19]23]
2024
2125
26@contextmanager
27def chdir(path):
28 previous_path = os.getcwd()
29 os.chdir(path)
30 yield
31 os.chdir(previous_path)
32
33
34def get_confined_jobs(path):
35 collection = EmbeddedProvider1PlugInCollection(path)
36 # this should be run within provider's directory, so there should be
37 # only one provider loaded
38 provider = collection.get_all_plugin_objects()[0]
39 for job in provider.job_list:
40 if job.plugin == 'qml' and 'confined' in job.get_flag_set():
41 yield job
42
43
22def check_libs_present():44def check_libs_present():
23 """45 """
24 Check if paths listed in NECESSARY_PATHS are present.46 Check if paths listed in NECESSARY_PATHS are present.
@@ -51,8 +73,7 @@
51 try:73 try:
52 revno = subprocess.check_output(74 revno = subprocess.check_output(
53 ["git", "-C", path, "show", "-s", "--format=%h", "HEAD"],75 ["git", "-C", path, "show", "-s", "--format=%h", "HEAD"],
54 stderr=subprocess.STDOUT).decode(76 stderr=subprocess.STDOUT).decode(sys.stdout.encoding).strip()
55 sys.stdout.encoding).strip()
56 return "git {}".format(revno)77 return "git {}".format(revno)
57 except subprocess.CalledProcessError:78 except subprocess.CalledProcessError:
58 # problem encountered when run git revision - falling through79 # problem encountered when run git revision - falling through
@@ -91,7 +112,13 @@
91 "revision": get_revision_string(),112 "revision": get_revision_string(),
92 "clickBuildDate": str(datetime.now().date()),113 "clickBuildDate": str(datetime.now().date()),
93 "testplan": args.testplan,114 "testplan": args.testplan,
94 "providersDir": "providers"115 "providersDir": "providers",
116 "submission": {
117 "inputForm": "sso-login.qml",
118 "name": "Community Practitest",
119 "type": "oauth",
120 "url": "https://ubuntu-community-testing.staging.ubuntu.com/v1/upload"
121 },
95 }122 }
96 settings_file = open('settings.json', 'w')123 settings_file = open('settings.json', 'w')
97 settings_file.write(json.dumps(settings, sort_keys=True, indent=4))124 settings_file.write(json.dumps(settings, sort_keys=True, indent=4))
@@ -118,6 +145,18 @@
118 if not validate_providers():145 if not validate_providers():
119 sys.exit('Provider validation failed.')146 sys.exit('Provider validation failed.')
120147
148 current_manifest = json.loads(open('manifest.json', 'rt').read())
149 hooks = {
150 'checkbox-touch': current_manifest['hooks']['checkbox-touch']
151 }
152 for hook in build_confinement(current_manifest['version']):
153 hooks.update(hook)
154 new_manifest = current_manifest.copy()
155 new_manifest['hooks'] = hooks
156 with open('manifest.json', 'wt') as f:
157 f.write(json.dumps(new_manifest, sort_keys=True, indent=4))
158 build_i18n()
159
121 generate_desktop_file()160 generate_desktop_file()
122161
123 if not os.path.exists('../build-cbt'):162 if not os.path.exists('../build-cbt'):
@@ -152,20 +191,48 @@
152 return False191 return False
153 else:192 else:
154 print(("Problem encountered when validating '{}'."193 print(("Problem encountered when validating '{}'."
155 " Output:\n{}").format(provider_dir, e.output.decode(194 " Output:\n{}").format(
156 sys.stdout.encoding)))195 provider_dir, e.output.decode(sys.stdout.encoding)))
157 providers_valid = False196 providers_valid = False
158 return providers_valid197 return providers_valid
159198
160199
200def build_confinement(checkbox_version):
201 print("Generating confinement")
202 checkbox_name = "com.ubuntu.checkbox_checkbox-touch_" + checkbox_version
203 new_hooks = []
204 for provider_dir in os.listdir('providers'):
205 with chdir(os.path.join('providers', provider_dir)):
206 for job in get_confined_jobs('.'):
207 print(" job: {}".format(job.id))
208 qml_file = os.path.relpath(
209 job.qml_file, 'data')
210 new_hooks.append(generate_confinement(
211 provider_dir, job.partial_id, checkbox_name, qml_file))
212 return new_hooks
213
214
215def build_i18n():
216 print("Building i18n")
217 for provider_dir in os.listdir('providers'):
218 try:
219 subprocess.check_output(
220 [os.path.join('providers', provider_dir, 'manage.py'),
221 'i18n'], stderr=subprocess.STDOUT)
222 except (OSError, subprocess.CalledProcessError) as e:
223 print("Problem encountered while building translations for ",
224 "provider '{}'.".format(provider_dir))
225 raise e
226
227
161def generate_desktop_file():228def generate_desktop_file():
162 template = textwrap.dedent("""229 template = textwrap.dedent("""
163 # This file has been generated by build-me script230 # This file has been generated by build-me script
164 [Desktop Entry]231 [Desktop Entry]
165 Name=Checkbox232 Name=Pilot
166 Comment=System testing utility for Ubuntu233 Comment=Community testing utility for Ubuntu
167 Exec=qmlscene --settings=settings.json {import_options} $@ checkbox-touch.qml234 Exec=qmlscene --settings=settings.json {import_options} $@ checkbox-touch.qml
168 Icon=checkbox-touch.svg235 Icon=pilot_256.png
169 Terminal=false236 Terminal=false
170 Type=Application237 Type=Application
171 X-Ubuntu-Touch=true238 X-Ubuntu-Touch=true
@@ -176,7 +243,7 @@
176 provider_data_dir = os.path.join('providers', provider, 'data')243 provider_data_dir = os.path.join('providers', provider, 'data')
177 if os.path.exists(provider_data_dir):244 if os.path.exists(provider_data_dir):
178 import_opts.append("-I " + provider_data_dir)245 import_opts.append("-I " + provider_data_dir)
179 with open('checkbox-touch.desktop', 'wt', encoding='utf-8') as f:246 with open('pilot.desktop', 'wt', encoding='utf-8') as f:
180 f.write(template.format(import_options=" ".join(import_opts)))247 f.write(template.format(import_options=" ".join(import_opts)))
181248
182249
183250
=== modified file 'checkbox-touch/checkbox-touch.qml'
--- checkbox-touch/checkbox-touch.qml 2015-09-30 06:12:53 +0000
+++ checkbox-touch/checkbox-touch.qml 2016-01-05 21:24:37 +0000
@@ -84,6 +84,7 @@
84 }84 }
8585
86 Component.onCompleted: {86 Component.onCompleted: {
87 i18n.domain = "com.ubuntu.checkbox";
87 if (args.values["autopilot"]) {88 if (args.values["autopilot"]) {
88 // autopilot-testing mode89 // autopilot-testing mode
89 appSettings["testplan"] = "2015.com.canonical.certification::checkbox-touch-autopilot";90 appSettings["testplan"] = "2015.com.canonical.certification::checkbox-touch-autopilot";
@@ -164,8 +165,7 @@
164 Component.onCompleted: {165 Component.onCompleted: {
165 // register to py.initiated signal166 // register to py.initiated signal
166 py.onInitiated.connect(function() {167 py.onInitiated.connect(function() {
167 construct("checkbox_touch.create_app_object", [168 construct("checkbox_touch.create_app_object", []);
168 appSettings["providersDir"]]);
169 });169 });
170 }170 }
171 }171 }
@@ -191,12 +191,16 @@
191191
192 WelcomePage {192 WelcomePage {
193 id: welcomePage193 id: welcomePage
194 // TRANSLATORS: %1 means program version, %2 repository revision and %3
195 // date when the package was built
196 // TRANSLATORS: keep the '\n' characters at the end of each line
194 welcomeText: i18n.tr("Welcome to Checkbox Touch\nVersion: %1\n(%2 %3)")197 welcomeText: i18n.tr("Welcome to Checkbox Touch\nVersion: %1\n(%2 %3)")
195 .arg(app.applicationVersion).arg(appSettings.revision).arg(appSettings.clickBuildDate)198 .arg(app.applicationVersion).arg(appSettings.revision).arg(appSettings.clickBuildDate)
196 onStartTestingTriggered: {199 onStartTestingTriggered: {
197 if (appSettings.testplan != "") {200 if (appSettings.testplan != "") {
198 app.rememberTestplan(appSettings.testplan, function() {201 app.rememberTestplan(appSettings.testplan, function() {
199 categorySelectionPage.setup();202 categorySelectionPage.setup();
203 enableButton();
200 });204 });
201 } else {205 } else {
202 app.getTestplans(function(response) {206 app.getTestplans(function(response) {
@@ -209,9 +213,9 @@
209 else {213 else {
210 testplanSelectionPage.setup(tp_list)214 testplanSelectionPage.setup(tp_list)
211 }215 }
216 enableButton();
212 });217 });
213 }218 }
214 enableButton();
215 }219 }
216 onAboutClicked: pageStack.push(aboutPage)220 onAboutClicked: pageStack.push(aboutPage)
217 }221 }
@@ -271,8 +275,8 @@
271 id: resumeSessionPage275 id: resumeSessionPage
272 onRerunLast: app.resumeSession(true, processNextTest)276 onRerunLast: app.resumeSession(true, processNextTest)
273 onContinueSession: app.resumeSession(false, processNextTest)277 onContinueSession: app.resumeSession(false, processNextTest)
274 resumeText: i18n.tr("Checkbox did not finish completely.\nDo you want \278 resumeText: i18n.tr("Checkbox session got suspended.\nDo you want \
275 to rerun last test, continue to the next test, or restart from the beginning?")279 to rerun last test, continue to the next test, or start a new session?")
276 onRestartSession: {280 onRestartSession: {
277 pageStack.clear();281 pageStack.clear();
278 pageStack.push(welcomePage);282 pageStack.push(welcomePage);
@@ -314,14 +318,20 @@
314318
315 function setup(continuation) {319 function setup(continuation) {
316 app.getCategories(function(response) {320 app.getCategories(function(response) {
317 var category_info_list = response.category_info_list;321 var uncategorised_id = "2013.com.canonical.plainbox::uncategorised"
318 model.clear();322 if (response.category_info_list.length === 1 &&
319 for (var i=0; i<category_info_list.length; i++) {323 response.category_info_list[0].mod_id == uncategorised_id) {
320 var category_info = category_info_list[i]; 324 selectionDone(uncategorised_id);
321 model.append(category_info);325 } else {
326 var category_info_list = response.category_info_list;
327 model.clear();
328 for (var i=0; i<category_info_list.length; i++) {
329 var category_info = category_info_list[i];
330 model.append(category_info);
331 }
332 modelUpdated();
333 pageStack.push(categorySelectionPage);
322 }334 }
323 modelUpdated();
324 pageStack.push(categorySelectionPage);
325 // if called from welcome page, no continuation is given335 // if called from welcome page, no continuation is given
326 if (continuation) continuation();336 if (continuation) continuation();
327 });337 });
@@ -339,7 +349,7 @@
339 id: testSelectionPage349 id: testSelectionPage
340 objectName: "testSelectionPage"350 objectName: "testSelectionPage"
341 title: i18n.tr("Select tests")351 title: i18n.tr("Select tests")
342 continueText: i18n.tr("Start Testing")352 continueText: i18n.tr("Start testing")
343 largeBuffer: args.values["autopilot"]353 largeBuffer: args.values["autopilot"]
344354
345 function setup(continuation) {355 function setup(continuation) {
@@ -381,6 +391,11 @@
381 pageStack.push(rerunSelectionPage)391 pageStack.push(rerunSelectionPage)
382 }392 }
383 onSelectionDone: {393 onSelectionDone: {
394 if (!selected_id_list.length) {
395 showResultsScreen();
396 unlatchContinue();
397 return;
398 }
384 app.rememberTestSelection(selected_id_list, function() {399 app.rememberTestSelection(selected_id_list, function() {
385 processNextTest();400 processNextTest();
386 unlatchContinue();401 unlatchContinue();
@@ -443,23 +458,27 @@
443 app.getNextTest(function(test) {458 app.getNextTest(function(test) {
444 pageStack.clear();459 pageStack.clear();
445 if (test.plugin === undefined) { 460 if (test.plugin === undefined) {
446 return maybeShowRerunScreen();461 return showResultsScreen();
447 }462 }
448 if (test.user) {463 if (test.user) {
449 // running this test will require to be run as a different464 // running this test will require to be run as a different
450 // user (therefore requiring user to enter sudo password)465 // user (therefore requiring user to enter sudo password)
451 if (!appSettings.sudoPasswordProvided) {466 if (!appSettings.sudoPasswordProvided) {
452 // ask user for password467 // ask user for password
453 passwordDialog.passwordEntered.connect(function(pass) {468 var rememberContinuation = function(pass) {
469 passwordDialog.passwordEntered.disconnect(rememberContinuation);
454 app.rememberPassword(pass, function(){470 app.rememberPassword(pass, function(){
455 appSettings.sudoPasswordProvided = true;471 appSettings.sudoPasswordProvided = true;
456 performTest(test);472 performTest(test);
457 });473 });
458 });474 }
459 passwordDialog.dialogCancelled.connect(function() {475 var cancelContinuation = function() {
476 passwordDialog.dialogCancelled.disconnect(cancelContinuation);
460 test.outcome = "skip";477 test.outcome = "skip";
461 completeTest(test);478 completeTest(test);
462 });479 };
480 passwordDialog.passwordEntered.connect(rememberContinuation);
481 passwordDialog.dialogCancelled.connect(cancelContinuation);
463 PopupUtils.open(passwordDialog.dialogComponent);482 PopupUtils.open(passwordDialog.dialogComponent);
464 return;483 return;
465 }484 }
@@ -509,72 +528,74 @@
509 app.runTestActivity(test, continuation);528 app.runTestActivity(test, continuation);
510529
511 }530 }
512 function maybeShowRerunScreen() {
513 app.getRerunCandidates(function(result) {
514 if (result == false) {
515 showResultsScreen();
516 return;
517 }
518 rerunSelectionPage.setup(result);
519 });
520 }
521531
522 function showResultsScreen() {532 function showResultsScreen() {
523 pageStack.clear();533 var endTesting = function() {
524 app.getResults(function(results) {534 pageStack.clear();
525 var resultsPage = createPage("components/ResultsPage.qml");535 app.clearSession(function() {
526 resultsPage.results = results;536 app.startSession();
527 if (appSettings["submission"]) {537 pageStack.push(welcomePage);
528 resultsPage.submissionName = appSettings["submission"].name;538 });
529 }539 };
530 resultsPage.endTesting.connect(function() {540 var saveReport = function() {
531 pageStack.clear();541 app.exportResults('2013.com.canonical.plainbox::html', [], function(uri) {
532 app.clearSession(function() {542 var htmlReportUrl = uri;
533 app.startSession();543 app.exportResults('2013.com.canonical.plainbox::xlsx', ["with-sys-info", "with-summary", "with-job-description", "with-text-attachments", "with-unit-categories"], function(uri) {
534 pageStack.push(welcomePage);544 CbtDialogLogic.showDialog(mainView, i18n.tr("Reports have been saved to your Documents folder"),
535 });545 [{ "text": i18n.tr("OK"), "color": UbuntuColors.green}, {"text": i18n.tr("View Report"), "color": UbuntuColors.green, "onClicked": function(uri) {
536 });546 var webviewer = Qt.createComponent(Qt.resolvedUrl("components/WebViewer.qml")).createObject();
537 resultsPage.saveReportClicked.connect(function() {547 webviewer.uri = htmlReportUrl;
538 app.exportResults('2013.com.canonical.plainbox::html', [], function(uri) {548 pageStack.push(webviewer);
539 console.log(uri)549 }}]);
540 var htmlReportUrl = uri;550 });
541 app.exportResults('2013.com.canonical.plainbox::xlsx', ["with-sys-info", "with-summary", "with-job-description", "with-text-attachments", "with-unit-categories"], function(uri) {551 });
542 console.log(uri)552 };
543 CbtDialogLogic.showDialog(resultsPage, i18n.tr("Reports have been saved to your Documents folder"),553 var submitReport = function(resultsPage) {
544 [{ "text": i18n.tr("OK"), "color": UbuntuColors.green}, {"text": i18n.tr("View Report"), "color": UbuntuColors.green, "onClicked": function(uri) {554 // resultsPage param is for having control over unlatching
545 var webviewer = Qt.createComponent(Qt.resolvedUrl("components/WebViewer.qml")).createObject();555 getSubmissionInput(function() {
546 webviewer.uri = htmlReportUrl;556 app.submitResults(appSettings["submission"], function(reply) {
547 pageStack.push(webviewer);557 // pretty-stringify reply
548 }}]);558 var s = ""
549 });559 for (var i in reply) {
550 });560 s += i + ': ' + reply[i] + '\n';
551 });561 }
552 resultsPage.submitReportClicked.connect(function() {562 CbtDialogLogic.showDialog(
553 getSubmissionInput(function() {563 resultsPage,
554 app.submitResults(appSettings["submission"], function(reply) {564 i18n.tr("Report has been submited.\n" + s),
555 // pretty-stringify reply565 [{"text": i18n.tr("OK"), "color": UbuntuColors.green}]);
556 var s = ""
557 for (var i in reply) {
558 s += i + ': ' + reply[i] + '\n';
559 }
560 CbtDialogLogic.showDialog(
561 resultsPage,
562 i18n.tr("Report has been submitted.\n" + s),
563 [{"text": i18n.tr("OK"), "color": UbuntuColors.green}]);
564 },
565 function(error) {
566 ErrorLogic.showError(mainView,
567 i18n.tr("Could not submit results. Reason:\n" + error),
568 function(){},
569 i18n.tr("OK"));
570 resultsPage.unlatchSubmission();
571 })
572 },566 },
573 function() {567 function(error) {
568 ErrorLogic.showError(mainView,
569 i18n.tr("Could not submit results. Reason:\n" + error),
570 function(){},
571 i18n.tr("OK"));
574 resultsPage.unlatchSubmission();572 resultsPage.unlatchSubmission();
575 });573 })
576 });574 },
577 pageStack.push(resultsPage);575 function() {
576 resultsPage.unlatchSubmission();
577 });
578 };
579
580 pageStack.clear();
581 app.getRerunCandidates(function(rerunCandidates) {
582 app.getResults(function(results) {
583 var resultsPage = createPage("components/ResultsPage.qml");
584 resultsPage.results = results;
585 if (appSettings["submission"]) {
586 resultsPage.submissionName = appSettings["submission"].name;
587 }
588 resultsPage.endTesting.connect(endTesting);
589 resultsPage.saveReportClicked.connect(saveReport);
590 resultsPage.submitReportClicked.connect(function() {submitReport(resultsPage);});
591 if (rerunCandidates.length>0) {
592 resultsPage.rerunEnabled = true;
593 resultsPage.rerunTests.connect(function() {
594 rerunSelectionPage.setup(rerunCandidates);
595 });
596 }
597 pageStack.push(resultsPage);
598 });
578 });599 });
579 }600 }
580601
@@ -637,7 +658,7 @@
637 }658 }
638 function performConfinedQmlTest(test) {659 function performConfinedQmlTest(test) {
639 runTestActivity(test, function(test) {660 runTestActivity(test, function(test) {
640 var qmlNativePage = createPage("components/QmlConfinedPage.qm;");661 var qmlNativePage = createPage("components/QmlConfinedPage.qml", test);
641 qmlNativePage.applicationVersion = app.applicationVersion;662 qmlNativePage.applicationVersion = app.applicationVersion;
642 qmlNativePage.testDone.connect(completeTest);663 qmlNativePage.testDone.connect(completeTest);
643 pageStack.push(qmlNativePage);664 pageStack.push(qmlNativePage);
@@ -646,29 +667,23 @@
646667
647 function showVerificationScreen(test) {668 function showVerificationScreen(test) {
648 var verificationPage = createPage("components/TestVerificationPage.qml", test);669 var verificationPage = createPage("components/TestVerificationPage.qml", test);
649 verificationPage.testDone.connect(completeTest);670 var maybeCommentVerification = function(test) {
671 if (test.outcome == 'fail' &&
672 test.flags.indexOf('explicit-fail') > -1) {
673 commentsDialog.commentDefaultText = test["comments"] || "";
674 commentsDialog.commentAdded.connect(function(comment) {
675 test["comments"] = comment;
676 completeTest(test);
677 });
678 PopupUtils.open(commentsDialog.dialogComponent);
679 } else {
680 completeTest(test);
681 }
682 }
683 verificationPage.testDone.connect(maybeCommentVerification);
650 pageStack.push(verificationPage);684 pageStack.push(verificationPage);
651 }685 }
652 function getSubmissionInput(continuation, cancelContinuation) {686 function getSubmissionInput(continuation, cancelContinuation) {
653 if (appSettings.submission.inputForm) {
654 var dlg_cmp = Qt.createComponent(Qt.resolvedUrl(appSettings.submission.inputForm));
655 var dlg = dlg_cmp.createObject(mainView);
656
657 dlg.cancelClicked.connect(function() {
658 cancelContinuation();
659 return;
660 });
661
662 dlg.submissionDetailsFilled.connect(function(submissionDetails) {
663 for (var attr in submissionDetails) {
664 appSettings.submission[attr] = submissionDetails[attr];
665 }
666 continuation();
667 });
668 PopupUtils.open(dlg.dialogComponent);
669 return; // inputForm gets precedence over input
670 }
671
672 if (!appSettings.submission.input) {687 if (!appSettings.submission.input) {
673 // no input to process688 // no input to process
674 continuation();689 continuation();
675690
=== modified file 'checkbox-touch/components/CheckboxTouchApplication.qml'
--- checkbox-touch/components/CheckboxTouchApplication.qml 2015-09-30 06:12:53 +0000
+++ checkbox-touch/components/CheckboxTouchApplication.qml 2016-01-05 21:24:37 +0000
@@ -62,13 +62,14 @@
62 if (!result["session_id"]) {62 if (!result["session_id"]) {
63 pageStack.pop();63 pageStack.pop();
64 ErrorLogic.showError(mainView,64 ErrorLogic.showError(mainView,
65 i18n.tr("Could not resume session "),65 i18n.tr("Could not resume session"),
66 function() {66 function() {
67 startSession();67 startSession();
68 return;68 return;
69 },69 },
70 i18n.tr("Start new session"));70 i18n.tr("Start new session"));
71 } else {71 } else {
72 sessionDir = result['session_dir'];
72 sessionReady();73 sessionReady();
73 continuation();74 continuation();
74 }75 }
@@ -95,7 +96,11 @@
95 });96 });
96 }97 }
97 function rememberTestplan(testplan, continuation) {98 function rememberTestplan(testplan, continuation) {
98 request("remember_testplan", [testplan], continuation, function(error) {99 var handleResult = function(result) {
100 sessionDir = result['session_dir'];
101 continuation();
102 }
103 request("remember_testplan", [testplan], handleResult, function(error) {
99 console.error("Unable to save testplan selection");104 console.error("Unable to save testplan selection");
100 });105 });
101 }106 }
@@ -174,6 +179,12 @@
174 }179 }
175 });180 });
176 }181 }
182 function dropPermissions(appId, services, continuation, continuation_error) {
183 request("drop_permissions", [appId, services], continuation, function(error) {
184 console.error("Unable to remove permissions");
185 if (continuation_error) continuation_error(error);
186 });
187 }
177188
178 function rememberPassword(password, continuation) {189 function rememberPassword(password, continuation) {
179 // using low-level py.call() to 'silently' pass password string through pyotherside190 // using low-level py.call() to 'silently' pass password string through pyotherside
@@ -202,12 +213,18 @@
202 // Internal handler that triggers a call to python to query for runtime and213 // Internal handler that triggers a call to python to query for runtime and
203 // application versions.214 // application versions.
204 onObjectReady: {215 onObjectReady: {
205 request("get_version_pair", [], function(result) {216 request("load_providers", [appSettings["providersDir"]], function(result) {
206 app.applicationVersion = result.application_version;217 request("get_version_pair", [], function(result) {
207 app.plainboxVersion = result.plainbox_version;218 app.applicationVersion = result.application_version;
208 appReady();219 app.plainboxVersion = result.plainbox_version;
220 appReady();
221 }, function(error) {
222 console.error("Unable to query for version: " + error);
223 });
224
209 }, function(error) {225 }, function(error) {
210 console.error("Unable to query for version: " + error);226 console.error("Unable to load providers: " + error);
227 ErrorLogic.showError(mainView, i18n.tr("No providers available!"), Qt.quit);
211 });228 });
212 }229 }
213}230}
214231
=== modified file 'checkbox-touch/components/CommandOutputPage.qml'
--- checkbox-touch/components/CommandOutputPage.qml 2015-09-07 20:06:44 +0000
+++ checkbox-touch/components/CommandOutputPage.qml 2016-01-05 21:24:37 +0000
@@ -50,6 +50,7 @@
50 id: skipAction50 id: skipAction
51 objectName: "copyOutputAction"51 objectName: "copyOutputAction"
52 iconName: "edit-copy"52 iconName: "edit-copy"
53 // TRANSLATORS: a verb (call to action)
53 text: i18n.tr("Copy")54 text: i18n.tr("Copy")
54 onTriggered: Clipboard.push(mimeData)55 onTriggered: Clipboard.push(mimeData)
55 }56 }
@@ -93,6 +94,7 @@
9394
94 Button {95 Button {
95 Layout.fillWidth: true96 Layout.fillWidth: true
97 // TRANSLATORS: This is a label on the button that goes back a page
96 text: i18n.tr("Back")98 text: i18n.tr("Back")
97 onClicked: pageStack.pop()99 onClicked: pageStack.pop()
98 }100 }
99101
=== modified file 'checkbox-touch/components/InteractIntroPage.qml'
--- checkbox-touch/components/InteractIntroPage.qml 2015-09-15 10:58:58 +0000
+++ checkbox-touch/components/InteractIntroPage.qml 2016-01-05 21:24:37 +0000
@@ -96,7 +96,7 @@
96 objectName: "startTestButton"96 objectName: "startTestButton"
97 unlatchedColor: UbuntuColors.green97 unlatchedColor: UbuntuColors.green
98 Layout.fillWidth: true98 Layout.fillWidth: true
99 text: i18n.tr("Test")99 text: i18n.tr("Start the test")
100 onLatchedClicked: {100 onLatchedClicked: {
101 userInteractVerifyIntroPage.state = "testing"101 userInteractVerifyIntroPage.state = "testing"
102 testStarted();102 testStarted();
103103
=== modified file 'checkbox-touch/components/PasswordDialog.qml'
--- checkbox-touch/components/PasswordDialog.qml 2015-03-10 12:19:22 +0000
+++ checkbox-touch/components/PasswordDialog.qml 2016-01-05 21:24:37 +0000
@@ -50,6 +50,7 @@
5050
51 TextField {51 TextField {
52 id: passwordBox52 id: passwordBox
53 objectName: "passwordBox"
53 placeholderText: i18n.tr("password")54 placeholderText: i18n.tr("password")
54 echoMode: TextInput.Password55 echoMode: TextInput.Password
55 onAccepted: okButton.clicked(text)56 onAccepted: okButton.clicked(text)
@@ -57,6 +58,7 @@
5758
58 Button {59 Button {
59 id: okButton60 id: okButton
61 objectName: "okButton"
60 text: i18n.tr("OK")62 text: i18n.tr("OK")
61 color: UbuntuColors.green63 color: UbuntuColors.green
62 onClicked: {64 onClicked: {
@@ -69,6 +71,7 @@
69 }71 }
7072
71 Button {73 Button {
74 objectName: "cancelButton"
72 text: i18n.tr("Cancel")75 text: i18n.tr("Cancel")
73 color: UbuntuColors.red76 color: UbuntuColors.red
74 onClicked: {77 onClicked: {
7578
=== added file 'checkbox-touch/components/PieChart.qml'
--- checkbox-touch/components/PieChart.qml 1970-01-01 00:00:00 +0000
+++ checkbox-touch/components/PieChart.qml 2016-01-05 21:24:37 +0000
@@ -0,0 +1,79 @@
1/*
2 * This file is part of Checkbox
3 *
4 * Copyright 2015 Canonical Ltd.
5 *
6 * Authors:
7 * - Sylvain Pineau <sylvain.pineau@canonical.com>
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; version 3.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 */
21
22/*! \Pie Chart component
23
24 Using the canvas element.
25*/
26
27import QtQuick 2.0
28
29Canvas {
30 id: canvas
31
32 property var chartData;
33 property var borderColor: "#ECECEC";
34 property int borderWidth: 1;
35 property real progress: 0;
36 property alias duration: animation.duration;
37
38 onPaint: {
39 var centreX = width / 2;
40 var centreY = height / 2;
41 var size = Math.min(width, height) / 2;
42 var total = 0;
43 for (var i = 0; i < chartData.length; i++) total += chartData[i].value;
44 var arcTotal = -Math.PI / 2;
45 var ctx = getContext("2d");
46 ctx.reset();
47 for (var i = 0; i < chartData.length; i++) {
48 var arc = progress * chartData[i].value / total * Math.PI / 50;
49 ctx.beginPath();
50 ctx.fillStyle = chartData[i].color;
51 ctx.moveTo(centreX, centreY);
52 ctx.arc(centreX, centreY, size, arcTotal, arc + arcTotal);
53 ctx.lineTo(centreX, centreY);
54 ctx.fill();
55 ctx.lineWidth = borderWidth;
56 ctx.strokeStyle = borderColor;
57 ctx.stroke();
58 arcTotal += arc;
59 }
60 animation.start();
61 }
62
63 onProgressChanged: {
64 requestPaint();
65 }
66
67 function repaint() {
68 progress = 0;
69 animation.start();
70 }
71
72 PropertyAnimation {
73 id: animation;
74 target: canvas;
75 property: "progress";
76 to: 100;
77 duration: 1000; // milliseconds
78 }
79}
080
=== modified file 'checkbox-touch/components/QmlConfinedPage.qml'
--- checkbox-touch/components/QmlConfinedPage.qml 2015-09-15 11:07:31 +0000
+++ checkbox-touch/components/QmlConfinedPage.qml 2016-01-05 21:24:37 +0000
@@ -46,6 +46,7 @@
46 property string name: "Checkbox-touch qml confined shell"46 property string name: "Checkbox-touch qml confined shell"
47 property alias pageStack: qmlNativePage.pageStack47 property alias pageStack: qmlNativePage.pageStack
48 property string sessionDir: app.sessionDir48 property string sessionDir: app.sessionDir
49 property var python: app.py
49 function getTest() {50 function getTest() {
50 return test;51 return test;
51 }52 }
@@ -106,11 +107,35 @@
106 Layout.fillWidth: true107 Layout.fillWidth: true
107 text: i18n.tr("Start the test")108 text: i18n.tr("Start the test")
108 onClicked: {109 onClicked: {
109 busyIndicatorGroup.visible = true;110 var appName = "com.ubuntu.checkbox_" + test["partial_id"];
110 var appName = "com.ubuntu.checkbox_" + test["partial_id"] + "_" + applicationVersion + ".desktop";111 // load the test qml file to check which permissions should be cleared
111 console.log("Launching " + appName);112 var testItemComponent = Qt.createComponent(Qt.resolvedUrl(test['qml_file']));
112 Qt.openUrlExternally("application:///" + appName);113 if (testItemComponent.status == Component.Error) {
114 console.error("Error creating testItemComponent. Possible cause: Problem with job's qml file. Error:", testItemComponent.errorString());
115 test['outcome'] = 'fail';
116 testDone(test);
117 return;
118 }
119 var testItem = testItemComponent.createObject(dummyContainer, {"testingShell": testingShell});
120 var clearedPermissions = testItem.clearedPermissions;
121 testItem.destroy();
122 var runConfinedTestApp = function() {
123 busyIndicatorGroup.visible = true;
124 Qt.openUrlExternally("application:///" + appName + "_" + applicationVersion+ ".desktop");
125 }
126 if (clearedPermissions) {
127 app.dropPermissions(appName, clearedPermissions, function() {
128 runConfinedTestApp();
129 });
130 } else {
131 runConfinedTestApp();
132 }
133
113 }134 }
114 }135 }
136 Item {
137 id: dummyContainer
138 visible: false
139 }
115 }140 }
116}141}
117142
=== modified file 'checkbox-touch/components/QmlNativePage.qml'
--- checkbox-touch/components/QmlNativePage.qml 2015-09-15 11:07:44 +0000
+++ checkbox-touch/components/QmlNativePage.qml 2016-01-05 21:24:37 +0000
@@ -42,6 +42,7 @@
42 property string name: "Checkbox-touch qml shell"42 property string name: "Checkbox-touch qml shell"
43 property alias pageStack: qmlNativePage.pageStack43 property alias pageStack: qmlNativePage.pageStack
44 property string sessionDir: app.sessionDir44 property string sessionDir: app.sessionDir
45 property var python: app.py
45 function getTest() {46 function getTest() {
46 return test;47 return test;
47 }48 }
4849
=== modified file 'checkbox-touch/components/ResultsPage.qml'
--- checkbox-touch/components/ResultsPage.qml 2015-09-04 13:15:26 +0000
+++ checkbox-touch/components/ResultsPage.qml 2016-01-05 21:24:37 +0000
@@ -28,7 +28,6 @@
28import QtQuick 2.028import QtQuick 2.0
29import Ubuntu.Components 1.129import Ubuntu.Components 1.1
30import QtQuick.Layouts 1.130import QtQuick.Layouts 1.1
31import jbQuick.Charts 1.0
3231
33Page {32Page {
34 title: i18n.tr("Test Results")33 title: i18n.tr("Test Results")
@@ -37,9 +36,11 @@
37 objectName: "resultsPage"36 objectName: "resultsPage"
38 property var results: {"totalPassed": 0, "totalFailed": 0, "totalSkipped": 0}37 property var results: {"totalPassed": 0, "totalFailed": 0, "totalSkipped": 0}
39 property string submissionName: ""38 property string submissionName: ""
39 property var rerunEnabled: false
40 signal saveReportClicked()40 signal saveReportClicked()
41 signal submitReportClicked()41 signal submitReportClicked()
42 signal endTesting()42 signal endTesting()
43 signal rerunTests()
4344
44 function unlatchSubmission() {45 function unlatchSubmission() {
45 submitResultsButton.unlatch();46 submitResultsButton.unlatch();
@@ -48,7 +49,15 @@
48 head {49 head {
49 actions: [50 actions: [
50 Action {51 Action {
51 iconName: "window-close"52 id: rerunAction
53 objectName: "rerunAction"
54 iconName: "view-refresh"
55 text: i18n.tr("Rerun")
56 onTriggered: rerunTests();
57 visible: rerunEnabled
58 },
59 Action {
60 iconName: "close"
52 text: i18n.tr("Close")61 text: i18n.tr("Close")
53 onTriggered: endTesting();62 onTriggered: endTesting();
54 }63 }
@@ -84,7 +93,7 @@
8493
85 Label {94 Label {
86 fontSize: "x-large"95 fontSize: "x-large"
87 text: "Summary"96 text: i18n.tr("Summary")
88 }97 }
8998
90 MouseArea {99 MouseArea {
@@ -92,14 +101,9 @@
92 Layout.fillWidth: true101 Layout.fillWidth: true
93 property var easter: 0102 property var easter: 0
94103
95 Chart {104 PieChart {
96 id: chart_pie;105 id: chart_pie;
97 anchors.fill: parent106 anchors.fill: parent
98 chartAnimated: true;
99 chartAnimationEasing: Easing.Linear;
100 chartAnimationDuration: 1000;
101 chartType: Charts.ChartType.PIE;
102 chartOptions: {"segmentStrokeColor": "#ECECEC"};
103 }107 }
104 Image {108 Image {
105 id: img109 id: img
@@ -128,7 +132,7 @@
128 }132 }
129 Text {133 Text {
130 objectName: "passedLabel"134 objectName: "passedLabel"
131 text: results.totalPassed + " tests passed"135 text: results.totalPassed + " " + i18n.tr("tests passed")
132 }136 }
133 }137 }
134 Row {138 Row {
@@ -139,7 +143,7 @@
139 }143 }
140 Text {144 Text {
141 objectName: "failedLabel"145 objectName: "failedLabel"
142 text: results.totalFailed + " tests failed"146 text: results.totalFailed + " " + i18n.tr("tests failed")
143 }147 }
144 }148 }
145 Row {149 Row {
@@ -150,7 +154,7 @@
150 }154 }
151 Text {155 Text {
152 objectName: "skippedLabel"156 objectName: "skippedLabel"
153 text: results.totalSkipped + " tests skipped"157 text: results.totalSkipped + " " + i18n.tr("tests skipped")
154 }158 }
155 }159 }
156 }160 }
@@ -160,15 +164,22 @@
160 unlatchedColor: UbuntuColors.green164 unlatchedColor: UbuntuColors.green
161 Layout.fillWidth: true165 Layout.fillWidth: true
162 text: i18n.tr("Save detailed report")166 text: i18n.tr("Save detailed report")
163 onLatchedClicked: saveReportClicked();167 onLatchedClicked: {
168 rerunAction.enabled = false;
169 saveReportClicked();
170 }
164 }171 }
165 LatchButton {172 LatchButton {
166 id: submitResultsButton173 id: submitResultsButton
167 unlatchedColor: UbuntuColors.green174 unlatchedColor: UbuntuColors.green
168 visible: submissionName175 visible: submissionName
169 Layout.fillWidth: true176 Layout.fillWidth: true
177 // TRANSLATORS: follwing string will be followed by a service name, e.g. "certification website"
170 text: i18n.tr("Submit results to " + submissionName)178 text: i18n.tr("Submit results to " + submissionName)
171 onLatchedClicked: submitReportClicked();179 onLatchedClicked: {
180 rerunAction.enabled = false;
181 submitReportClicked();
182 }
172 }183 }
173 }184 }
174}185}
175186
=== modified file 'checkbox-touch/components/ResumeSessionPage.qml'
--- checkbox-touch/components/ResumeSessionPage.qml 2015-07-17 08:36:57 +0000
+++ checkbox-touch/components/ResumeSessionPage.qml 2016-01-05 21:24:37 +0000
@@ -114,7 +114,7 @@
114 Layout.fillHeight: true114 Layout.fillHeight: true
115 Layout.fillWidth: true115 Layout.fillWidth: true
116 color: "white"116 color: "white"
117 text: i18n.tr("Restart")117 text: i18n.tr("Start new session")
118 }118 }
119 onLatchedClicked: {119 onLatchedClicked: {
120 restartSession();120 restartSession();
121121
=== modified file 'checkbox-touch/components/SelectionPage.qml'
--- checkbox-touch/components/SelectionPage.qml 2015-09-18 14:28:20 +0000
+++ checkbox-touch/components/SelectionPage.qml 2016-01-05 21:24:37 +0000
@@ -42,15 +42,22 @@
42 visible: false42 visible: false
43 flickable: null43 flickable: null
44 property var selectedCount : 044 property var selectedCount : 0
45 state : selectedCount > 0 ? "nonempty selection" : "empty selection"45 property var disabledSelectedCount: 0
46 state : selectedCount > 0 ? "nonempty selection" :
47 (disabledSelectedCount > 0 ? "disabled only selection" : "empty selection")
4648
47 // A function that needs to be called after changes are done to the model49 // A function that needs to be called after changes are done to the model
48 // to re-count number of selected items on the list50 // to re-count number of selected items on the list
49 function modelUpdated() {51 function modelUpdated() {
50 selectedCount = 0;52 selectedCount = 0;
53 disabledSelectedCount = 0;
51 for (var i=0; i < selectionModel.count; i++) {54 for (var i=0; i < selectionModel.count; i++) {
52 if (selectionModel.get(i).mod_selected) {55 if (selectionModel.get(i).mod_selected) {
53 selectedCount++;56 if (selectionModel.get(i).mod_disabled) {
57 disabledSelectedCount++;
58 } else {
59 selectedCount++;
60 }
54 }61 }
55 }62 }
56 }63 }
@@ -68,16 +75,31 @@
68 continueButton.unlatch();75 continueButton.unlatch();
69 }76 }
70 function deselectAll() {77 function deselectAll() {
78 selectedCount = 0;
79 disabledSelectedCount = 0;
71 for (var i=0; i<selectionModel.count; i++) {80 for (var i=0; i<selectionModel.count; i++) {
72 selectionModel.setProperty(i, "mod_selected", false);81 if (!selectionModel.get(i)["mod_disabled"]) {
82 selectionModel.setProperty(i, "mod_selected", false);
83 } else {
84 if (selectionModel.get(i).mod_selected) {
85 disabledSelectedCount++;
86 }
87 }
73 }88 }
74 selectedCount = 0;
75 }89 }
76 function selectAll() {90 function selectAll() {
91 selectedCount = 0;
92 disabledSelectedCount = 0;
77 for (var i=0; i<selectionModel.count; i++) {93 for (var i=0; i<selectionModel.count; i++) {
78 selectionModel.setProperty(i, "mod_selected", true);94 if (!selectionModel.get(i)["mod_disabled"]) {
95 selectionModel.setProperty(i, "mod_selected", true);
96 selectedCount++;
97 } else {
98 if (selectionModel.get(i).mod_selected) {
99 disabledSelectedCount++;
100 }
101 }
79 }102 }
80 selectedCount = selectionModel.count;
81 }103 }
82104
83 head {105 head {
@@ -89,7 +111,7 @@
89 text: i18n.tr("Toggle selection")111 text: i18n.tr("Toggle selection")
90 visible: !onlyOneAllowed112 visible: !onlyOneAllowed
91 onTriggered: {113 onTriggered: {
92 if (state === "empty selection") {114 if (state === "empty selection" || state == "disabled only selection") {
93 selectAll();115 selectAll();
94 }116 }
95 else if (state === "nonempty selection") {117 else if (state === "nonempty selection") {
@@ -110,6 +132,10 @@
110 State {132 State {
111 name: "nonempty selection"133 name: "nonempty selection"
112 PropertyChanges { target: continueButton; enabled: true }134 PropertyChanges { target: continueButton; enabled: true }
135 },
136 State {
137 name: "disabled only selection"
138 PropertyChanges { target: continueButton; enabled: true }
113 }139 }
114 ]140 ]
115141
@@ -166,6 +192,7 @@
166 delegate: ListItemWrappable {192 delegate: ListItemWrappable {
167 objectName: "listItem"193 objectName: "listItem"
168 text: mod_name194 text: mod_name
195 enabled: !mod_disabled
169 property var item_mod_id: mod_id196 property var item_mod_id: mod_id
170 /* Create a checkbox-lookalike that doesn't have the internal onTrigger197 /* Create a checkbox-lookalike that doesn't have the internal onTrigger
171 * signal handler that overrides the binding to the model.mod_selected198 * signal handler that overrides the binding to the model.mod_selected
172199
=== modified file 'checkbox-touch/components/TestVerificationPage.qml'
--- checkbox-touch/components/TestVerificationPage.qml 2015-09-15 11:00:43 +0000
+++ checkbox-touch/components/TestVerificationPage.qml 2016-01-05 21:24:37 +0000
@@ -68,6 +68,7 @@
68 objectName: "passButton"68 objectName: "passButton"
69 unlatchedColor: UbuntuColors.green69 unlatchedColor: UbuntuColors.green
70 Layout.fillWidth: true70 Layout.fillWidth: true
71 // TRANSLATORS: this string is on a button that marks the given test as passed
71 text: i18n.tr("Pass")72 text: i18n.tr("Pass")
72 onLatchedClicked: {73 onLatchedClicked: {
73 test["outcome"] = "pass";74 test["outcome"] = "pass";
@@ -81,6 +82,7 @@
81 objectName: "failButton"82 objectName: "failButton"
82 unlatchedColor: UbuntuColors.red83 unlatchedColor: UbuntuColors.red
83 Layout.fillWidth: true84 Layout.fillWidth: true
85 // TRANSLATORS: this string is on a button that marks the given test as failed
84 text: i18n.tr("Fail")86 text: i18n.tr("Fail")
85 onLatchedClicked: {87 onLatchedClicked: {
86 test["outcome"] = "fail";88 test["outcome"] = "fail";
8789
=== modified file 'checkbox-touch/components/UserInteractSummaryPage.qml'
--- checkbox-touch/components/UserInteractSummaryPage.qml 2015-09-15 11:02:02 +0000
+++ checkbox-touch/components/UserInteractSummaryPage.qml 2016-01-05 21:24:37 +0000
@@ -56,6 +56,7 @@
56 Label {56 Label {
57 fontSize: "large"57 fontSize: "large"
58 Layout.fillHeight: true58 Layout.fillHeight: true
59 // TRANSLATORS: this string will be followed by either "PASSED" or "FAILED"
59 text : i18n.tr("This test ")60 text : i18n.tr("This test ")
60 wrapMode: Text.WrapAtWordBoundaryOrAnywhere61 wrapMode: Text.WrapAtWordBoundaryOrAnywhere
61 }62 }
@@ -84,7 +85,7 @@
84 Layout.fillHeight: true85 Layout.fillHeight: true
85 Layout.fillWidth: true86 Layout.fillWidth: true
86 wrapMode: Text.WrapAtWordBoundaryOrAnywhere87 wrapMode: Text.WrapAtWordBoundaryOrAnywhere
87 text : i18n.tr("You can go back to rerun it or continue to the next test.")88 text : i18n.tr("You can go back to rerun the test or continue to the next test.")
88 }89 }
8990
90 Button {91 Button {
9192
=== modified file 'checkbox-touch/components/WelcomePage.qml'
--- checkbox-touch/components/WelcomePage.qml 2015-07-17 08:36:57 +0000
+++ checkbox-touch/components/WelcomePage.qml 2016-01-05 21:24:37 +0000
@@ -32,7 +32,7 @@
32 signal aboutClicked();32 signal aboutClicked();
33 property alias welcomeText: welcomeText.text33 property alias welcomeText: welcomeText.text
3434
35 title: i18n.tr("System Testing")35 title: i18n.tr("Community Testing")
36 visible: false36 visible: false
3737
38 function enableButton() {38 function enableButton() {
@@ -60,7 +60,7 @@
60 bottom: startTestButton.top60 bottom: startTestButton.top
61 }61 }
6262
63 text: i18n.tr("Welcome text")63 text: ""
64 fontSize: "large"64 fontSize: "large"
65 verticalAlignment: Text.AlignVCenter65 verticalAlignment: Text.AlignVCenter
66 horizontalAlignment: Text.AlignHCenter66 horizontalAlignment: Text.AlignHCenter
@@ -70,13 +70,13 @@
70 states: [70 states: [
71 State {71 State {
72 name: "loading"72 name: "loading"
73 PropertyChanges { target: startTestButton; enabled: false; color: UbuntuColors.warmGrey; text: i18n.tr("Checkbox is loading...") }73 PropertyChanges { target: startTestButton; enabled: false; color: UbuntuColors.warmGrey; text: i18n.tr("Pilot is loading...") }
74 PropertyChanges { target: loadingSpinner; running: true}74 PropertyChanges { target: loadingSpinner; running: true}
7575
76 },76 },
77 State {77 State {
78 name: "loaded"78 name: "loaded"
79 PropertyChanges { target: startTestButton; enabled: true; color: UbuntuColors.green; text: i18n.tr("Start Testing")}79 PropertyChanges { target: startTestButton; enabled: true; color: UbuntuColors.green; text: i18n.tr("Start testing")}
80 PropertyChanges { target: loadingSpinner; running: false}80 PropertyChanges { target: loadingSpinner; running: false}
81 }81 }
82 ]82 ]
@@ -114,7 +114,7 @@
114 }114 }
115115
116 unlatchedColor: UbuntuColors.green116 unlatchedColor: UbuntuColors.green
117 text: i18n.tr("Start Testing")117 text: i18n.tr("Start testing")
118 onLatchedClicked: startTestingTriggered();118 onLatchedClicked: startTestingTriggered();
119 }119 }
120}120}
121121
=== renamed file 'checkbox-touch/confinement/generate-confinement.py' => 'checkbox-touch/confinement/generate.py'
--- checkbox-touch/confinement/generate-confinement.py 2015-07-23 10:54:18 +0000
+++ checkbox-touch/confinement/generate.py 2016-01-05 21:24:37 +0000
@@ -17,6 +17,7 @@
17# You should have received a copy of the GNU General Public License17# You should have received a copy of the GNU General Public License
18# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.18# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.
19import argparse19import argparse
20import json
20import os21import os
21import string22import string
22import sys23import sys
@@ -49,15 +50,9 @@
49X-Ubuntu-Touch=true50X-Ubuntu-Touch=true
50"""51"""
5152
52HOOK = """
53"${partial_id}": {
54 "apparmor": "providers/${provider_name}/data/confined/${partial_id}.apparmor",
55 "desktop": "providers/${provider_name}/data/confined/${partial_id}.desktop",
56 "content-hub": "providers/${provider_name}/data/confined/${partial_id}-ch.json"
57}
58"""
5953
60def generate_confinement(provider_name, partial_id, full_checkbox_name, qml_file):54def generate_confinement(provider_name, partial_id, full_checkbox_name,
55 qml_file):
61 # generate content-hub file56 # generate content-hub file
62 target_dir = os.path.join('data', 'confined')57 target_dir = os.path.join('data', 'confined')
63 if not os.path.exists(target_dir):58 if not os.path.exists(target_dir):
@@ -72,17 +67,24 @@
72 with open(apparmor_path, "wt") as f:67 with open(apparmor_path, "wt") as f:
73 f.write(APPARMOR)68 f.write(APPARMOR)
7469
75
76 # generate desktop file70 # generate desktop file
77 desktop_path = os.path.join(target_dir, partial_id + '.desktop')71 desktop_path = os.path.join(target_dir, partial_id + '.desktop')
78 template = string.Template(DESKTOP)72 template = string.Template(DESKTOP)
79 with open(desktop_path, "wt") as f:73 with open(desktop_path, "wt") as f:
80 f.write(template.substitute(partial_id=partial_id, provider_name=provider_name, full_checkbox_name=full_checkbox_name, qml_file=qml_file))74 f.write(template.substitute(
75 partial_id=partial_id, provider_name=provider_name,
76 full_checkbox_name=full_checkbox_name, qml_file=qml_file))
8177
82def generate_hook(provider_name, partial_id):78 base = 'providers/{provider_name}/data/confined/{partial_id}'.format(
83 return string.Template(HOOK).substitute(
84 provider_name=provider_name, partial_id=partial_id)79 provider_name=provider_name, partial_id=partial_id)
8580 hook = {
81 partial_id: {
82 'apparmor': base + '.apparmor',
83 'desktop': base + '.desktop',
84 'content-hub': base + '-ch.json',
85 }
86 }
87 return hook
8688
8789
88def main():90def main():
@@ -91,7 +93,8 @@
91 parser.add_argument('--checkbox_version', action='store', type=str)93 parser.add_argument('--checkbox_version', action='store', type=str)
92 parser.add_argument('job_ids', nargs='+')94 parser.add_argument('job_ids', nargs='+')
93 args = parser.parse_args()95 args = parser.parse_args()
94 checkbox_name = "com.ubuntu.checkbox_checkbox-touch_" + args.checkbox_version96 checkbox_name = ("com.ubuntu.checkbox_checkbox-touch_" +
97 args.checkbox_version)
9598
96 # check if current dir looks like a provider - very dumb heuristic99 # check if current dir looks like a provider - very dumb heuristic
97 if not os.path.exists('manage.py'):100 if not os.path.exists('manage.py'):
@@ -100,8 +103,9 @@
100103
101 hooks = ''104 hooks = ''
102 for job in args.job_ids:105 for job in args.job_ids:
103 generate_confinement(provider_name, job, checkbox_name, job + '.qml')106 hook = generate_confinement(
104 hooks += generate_hook(provider_name, job)107 provider_name, job, checkbox_name, job + '.qml')
108 hooks += json.dumps(hook, sort_keys=True, indent=4)[1:-1]
105109
106 print("Add following hooks to your checkbox-touch.manifest:")110 print("Add following hooks to your checkbox-touch.manifest:")
107 print(hooks)111 print(hooks)
108112
=== modified file 'checkbox-touch/confinement/plainbox-confined-shell.qml'
--- checkbox-touch/confinement/plainbox-confined-shell.qml 2015-07-23 10:48:33 +0000
+++ checkbox-touch/confinement/plainbox-confined-shell.qml 2016-01-05 21:24:37 +0000
@@ -33,7 +33,8 @@
33 // information and functionality passed to qml job component33 // information and functionality passed to qml job component
34 property var testingShell: {34 property var testingShell: {
35 "name": "Checkbox-touch qml confined shell",35 "name": "Checkbox-touch qml confined shell",
36 "pageStack": pageStack36 "pageStack": pageStack,
37 "python": py
37 }38 }
38 property var activeTransfer;39 property var activeTransfer;
3940
@@ -94,7 +95,7 @@
94 anchors.fill: parent95 anchors.fill: parent
95 Label {96 Label {
96 anchors.fill: parent97 anchors.fill: parent
97 text: i18n.tr("sending results - you should not see this page :-)")98 text: i18n.tr("Sending report - you should not see this page :-)")
98 }99 }
99 }100 }
100 ContentPeer {101 ContentPeer {
101102
=== modified file 'checkbox-touch/get-libs'
--- checkbox-touch/get-libs 2015-09-01 18:06:45 +0000
+++ checkbox-touch/get-libs 2016-01-05 21:24:37 +0000
@@ -72,8 +72,7 @@
72 'python3-extras', 'python3-evdev']72 'python3-extras', 'python3-evdev']
73 packages = ['libpython3.4', 'pyotherside', 'python3-xlsxwriter',73 packages = ['libpython3.4', 'pyotherside', 'python3-xlsxwriter',
74 'python3-jinja2', 'python3-markupsafe', 'python3-padme',74 'python3-jinja2', 'python3-markupsafe', 'python3-padme',
75 'qml-module-qtquick-qchartjs', 'python3-requests',75 'python3-requests', 'python3-urllib3', 'python3-guacamole']
76 'python3-urllib3']
77 if get_autopilot:76 if get_autopilot:
78 packages += ap_packages77 packages += ap_packages
79 # uris will serve as a database of uris from which to download packages78 # uris will serve as a database of uris from which to download packages
@@ -221,7 +220,7 @@
221 # ./usr/lib/python3/dist-packages are copied to ./lib/py.220 # ./usr/lib/python3/dist-packages are copied to ./lib/py.
222 python3_libs = ['python3-xlsxwriter', 'python3-jinja2',221 python3_libs = ['python3-xlsxwriter', 'python3-jinja2',
223 'python3-markupsafe', 'python3-padme', 'python3-requests',222 'python3-markupsafe', 'python3-padme', 'python3-requests',
224 'python3-urllib3']223 'python3-urllib3', 'python3-guacamole']
225224
226 # additional libs needed to support autopilot tests. these were obtained by225 # additional libs needed to support autopilot tests. these were obtained by
227 # running apt-cache depends on python3-autopilot226 # running apt-cache depends on python3-autopilot
@@ -246,7 +245,6 @@
246 # ./usr/lib/{architecture}/qt5/qmlare copied to ./lib/{architecture}.245 # ./usr/lib/{architecture}/qt5/qmlare copied to ./lib/{architecture}.
247 # {architecture} may be one of multiarch_list246 # {architecture} may be one of multiarch_list
248 qml_plugins_urls = [uris['pyotherside', arch] for arch in arch_list]247 qml_plugins_urls = [uris['pyotherside', arch] for arch in arch_list]
249 qml_plugins_urls += [uris['qml-module-qtquick-qchartjs', arch] for arch in arch_list]
250 for qml_plugin in qml_plugins_urls:248 for qml_plugin in qml_plugins_urls:
251 with tempfile.TemporaryDirectory() as tmp:249 with tempfile.TemporaryDirectory() as tmp:
252 get_package_from_url_and_extract(qml_plugin, tmp)250 get_package_from_url_and_extract(qml_plugin, tmp)
253251
=== modified file 'checkbox-touch/manifest.json'
--- checkbox-touch/manifest.json 2015-07-31 13:07:18 +0000
+++ checkbox-touch/manifest.json 2016-01-05 21:24:37 +0000
@@ -1,19 +1,19 @@
1{1{
2 "architecture": ["armhf", "i386", "amd64"],2 "architecture": ["armhf", "i386", "amd64"],
3 "description": "System testing utility for Ubuntu",3 "description": "Community testing utility for Ubuntu",
4 "framework": "ubuntu-sdk-14.10",4 "framework": "ubuntu-sdk-14.10",
5 "hooks": {5 "hooks": {
6 "checkbox-touch": {6 "pilot": {
7 "apparmor": "checkbox-touch.json",7 "apparmor": "checkbox-touch.json",
8 "desktop": "checkbox-touch.desktop"8 "desktop": "pilot.desktop"
9 }9 }
10 },10 },
11 "maintainer": "Zygmunt Krynicki <zkrynicki@ubuntu.com>",11 "maintainer": "Ubuntu App Cats <ubuntu-touch-coreapps@lists.launchpad.net>",
12 "name": "com.ubuntu.checkbox",12 "name": "com.ubuntu.pilot",
13 "title": "Checkbox",13 "title": "Pilot",
14 "version": "1.2.1",14 "version": "1.3",
15 "x-source": {15 "x-source": {
16 "vcs-bzr": "lp:checkbox",16 "vcs-bzr": "lp:checkbox",
17 "vcs-bzr-revno": "checkbox-touch-v1.2.1"17 "vcs-bzr-revno": "checkbox-touch-v1.3.dev0"
18 }18 }
19}19}
2020
=== added file 'checkbox-touch/pilot_256.png'
21Binary files checkbox-touch/pilot_256.png 1970-01-01 00:00:00 +0000 and checkbox-touch/pilot_256.png 2016-01-05 21:24:37 +0000 differ21Binary files checkbox-touch/pilot_256.png 1970-01-01 00:00:00 +0000 and checkbox-touch/pilot_256.png 2016-01-05 21:24:37 +0000 differ
=== added file 'checkbox-touch/pilot_512.png'
22Binary files checkbox-touch/pilot_512.png 1970-01-01 00:00:00 +0000 and checkbox-touch/pilot_512.png 2016-01-05 21:24:37 +0000 differ22Binary files checkbox-touch/pilot_512.png 1970-01-01 00:00:00 +0000 and checkbox-touch/pilot_512.png 2016-01-05 21:24:37 +0000 differ
=== modified file 'checkbox-touch/po/checkbox-touch.pot'
--- checkbox-touch/po/checkbox-touch.pot 2014-08-11 14:17:45 +0000
+++ checkbox-touch/po/checkbox-touch.pot 2016-01-05 21:24:37 +0000
@@ -8,7 +8,7 @@
8msgstr ""8msgstr ""
9"Project-Id-Version: PACKAGE VERSION\n"9"Project-Id-Version: PACKAGE VERSION\n"
10"Report-Msgid-Bugs-To: \n"10"Report-Msgid-Bugs-To: \n"
11"POT-Creation-Date: 2014-08-11 15:18+0200\n"11"POT-Creation-Date: 2015-10-15 12:23+0200\n"
12"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"12"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"13"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14"Language-Team: LANGUAGE <LL@li.org>\n"14"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,18 +17,308 @@
17"Content-Type: text/plain; charset=CHARSET\n"17"Content-Type: text/plain; charset=CHARSET\n"
18"Content-Transfer-Encoding: 8bit\n"18"Content-Transfer-Encoding: 8bit\n"
1919
20#: main.qml:26
21msgid "Simple"
22msgstr ""
23
24#: main.qml:39
25msgid "Hello.."
26msgstr ""
27
28#: main.qml:46
29msgid "Tap me!"
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches