Merge lp:~nskaggs/checkbox/pilot into lp:~canonical-platform-qa/checkbox/easing-login-pain
- pilot
- Merge into easing-login-pain
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 |
Related bugs: |
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.
Commit message
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.
- 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
1 | === modified file 'checkbox-ng/checkbox_ng/__init__.py' | |||
2 | --- checkbox-ng/checkbox_ng/__init__.py 2015-07-16 20:50:36 +0000 | |||
3 | +++ checkbox-ng/checkbox_ng/__init__.py 2016-01-05 21:24:37 +0000 | |||
4 | @@ -24,4 +24,4 @@ | |||
5 | 24 | CheckBoxNG is a new version of CheckBox built on top of PlainBox | 24 | CheckBoxNG is a new version of CheckBox built on top of PlainBox |
6 | 25 | """ | 25 | """ |
7 | 26 | 26 | ||
9 | 27 | __version__ = (0, 21, 0, "dev", 0) | 27 | __version__ = (0, 24, 0, "dev", 0) |
10 | 28 | 28 | ||
11 | === modified file 'checkbox-ng/checkbox_ng/commands/newcli.py' | |||
12 | --- checkbox-ng/checkbox_ng/commands/newcli.py 2015-09-08 13:11:18 +0000 | |||
13 | +++ checkbox-ng/checkbox_ng/commands/newcli.py 2016-01-05 21:24:37 +0000 | |||
14 | @@ -46,8 +46,9 @@ | |||
15 | 46 | from plainbox.impl.secure.qualifiers import RegExpJobQualifier | 46 | from plainbox.impl.secure.qualifiers import RegExpJobQualifier |
16 | 47 | from plainbox.impl.secure.qualifiers import select_jobs | 47 | from plainbox.impl.secure.qualifiers import select_jobs |
17 | 48 | from plainbox.impl.session import SessionMetaData | 48 | from plainbox.impl.session import SessionMetaData |
18 | 49 | from plainbox.impl.session.jobs import InhibitionCause | ||
19 | 50 | from plainbox.impl.transport import TransportError | ||
20 | 49 | from plainbox.impl.transport import get_all_transports | 51 | from plainbox.impl.transport import get_all_transports |
21 | 50 | from plainbox.impl.transport import TransportError | ||
22 | 51 | from plainbox.vendor.textland import get_display | 52 | from plainbox.vendor.textland import get_display |
23 | 52 | 53 | ||
24 | 53 | from checkbox_ng.misc import SelectableJobTreeNode | 54 | from checkbox_ng.misc import SelectableJobTreeNode |
25 | @@ -318,7 +319,7 @@ | |||
26 | 318 | # NOTE: tree.selection is correct but ordered badly. To retain | 319 | # NOTE: tree.selection is correct but ordered badly. To retain |
27 | 319 | # the original ordering we should just treat it as a mask and | 320 | # the original ordering we should just treat it as a mask and |
28 | 320 | # use it to filter jobs from desired_job_list. | 321 | # use it to filter jobs from desired_job_list. |
30 | 321 | wanted_set = frozenset(tree.selection) | 322 | wanted_set = frozenset(tree.selection + tree.resource_jobs) |
31 | 322 | job_list = [job for job in self.manager.state.run_list | 323 | job_list = [job for job in self.manager.state.run_list |
32 | 323 | if job in wanted_set] | 324 | if job in wanted_set] |
33 | 324 | self._update_desired_job_list(job_list) | 325 | self._update_desired_job_list(job_list) |
34 | @@ -435,7 +436,7 @@ | |||
35 | 435 | self.config.email_address) | 436 | self.config.email_address) |
36 | 436 | transport = transport_cls(self.config.lp_url, options_string) | 437 | transport = transport_cls(self.config.lp_url, options_string) |
37 | 437 | # TRANSLATORS: Do not translate the {} format markers. | 438 | # TRANSLATORS: Do not translate the {} format markers. |
39 | 438 | print(_("Submitting results to {0} for email_address {1})").format( | 439 | print(_("Submitting results to {0} for email_address {1}").format( |
40 | 439 | self.config.lp_url, self.config.email_address)) | 440 | self.config.lp_url, self.config.email_address)) |
41 | 440 | with open(self.submission_file, encoding='utf-8') as stream: | 441 | with open(self.submission_file, encoding='utf-8') as stream: |
42 | 441 | try: | 442 | try: |
43 | @@ -460,7 +461,7 @@ | |||
44 | 460 | from checkbox_ng.certification import InvalidSecureIDError | 461 | from checkbox_ng.certification import InvalidSecureIDError |
45 | 461 | transport_cls = get_all_transports().get('certification') | 462 | transport_cls = get_all_transports().get('certification') |
46 | 462 | # TRANSLATORS: Do not translate the {} format markers. | 463 | # TRANSLATORS: Do not translate the {} format markers. |
48 | 463 | print(_("Submitting results to {0} for secure_id {1})").format( | 464 | print(_("Submitting results to {0} for secure_id {1}").format( |
49 | 464 | self.config.c3_url, self.config.secure_id)) | 465 | self.config.c3_url, self.config.secure_id)) |
50 | 465 | option_chunks = [] | 466 | option_chunks = [] |
51 | 466 | option_chunks.append("secure_id={0}".format(self.config.secure_id)) | 467 | option_chunks.append("secure_id={0}".format(self.config.secure_id)) |
52 | @@ -491,19 +492,23 @@ | |||
53 | 491 | print(str(exc)) | 492 | print(str(exc)) |
54 | 492 | 493 | ||
55 | 493 | def maybe_rerun_jobs(self): | 494 | def maybe_rerun_jobs(self): |
56 | 494 | def rerun_predicate(job_state): | ||
57 | 495 | return job_state.result.outcome in ( | ||
58 | 496 | IJobResult.OUTCOME_FAIL, IJobResult.OUTCOME_CRASH) | ||
59 | 497 | # create a list of jobs that qualify for rerunning | 495 | # create a list of jobs that qualify for rerunning |
60 | 498 | rerun_candidates = [] | 496 | rerun_candidates = [] |
61 | 499 | for job in self.manager.state.run_list: | 497 | for job in self.manager.state.run_list: |
63 | 500 | if rerun_predicate(self.manager.state.job_state_map[job.id]): | 498 | job_state = self.manager.state.job_state_map[job.id] |
64 | 499 | if job_state.result.outcome in ( | ||
65 | 500 | IJobResult.OUTCOME_FAIL, IJobResult.OUTCOME_CRASH, | ||
66 | 501 | IJobResult.OUTCOME_NOT_SUPPORTED): | ||
67 | 501 | rerun_candidates.append(job) | 502 | rerun_candidates.append(job) |
68 | 503 | |||
69 | 502 | # bail-out early if no job qualifies for rerunning | 504 | # bail-out early if no job qualifies for rerunning |
70 | 503 | if not rerun_candidates: | 505 | if not rerun_candidates: |
71 | 504 | return False | 506 | return False |
72 | 505 | tree = SelectableJobTreeNode.create_tree( | 507 | tree = SelectableJobTreeNode.create_tree( |
73 | 506 | self.manager.state, rerun_candidates) | 508 | self.manager.state, rerun_candidates) |
74 | 509 | # nothing to select in root node and categories - bailing out | ||
75 | 510 | if not tree.jobs and not tree._categories: | ||
76 | 511 | return False | ||
77 | 507 | # deselect all by default | 512 | # deselect all by default |
78 | 508 | tree.set_descendants_state(False) | 513 | tree.set_descendants_state(False) |
79 | 509 | self.display.run(ShowRerun(tree, _("Select jobs to re-run"))) | 514 | self.display.run(ShowRerun(tree, _("Select jobs to re-run"))) |
80 | @@ -511,10 +516,15 @@ | |||
81 | 511 | if not wanted_set: | 516 | if not wanted_set: |
82 | 512 | # nothing selected - nothing to run | 517 | # nothing selected - nothing to run |
83 | 513 | return False | 518 | return False |
86 | 514 | rerun_job_list = [job for job in self.manager.state.run_list | 519 | # include resource jobs that selected jobs depend on |
87 | 515 | if job in wanted_set] | 520 | resources_to_rerun = [] |
88 | 521 | for job in wanted_set: | ||
89 | 522 | job_state = self.manager.state.job_state_map[job.id] | ||
90 | 523 | for inhibitor in job_state.readiness_inhibitor_list: | ||
91 | 524 | if inhibitor.cause == InhibitionCause.FAILED_DEP: | ||
92 | 525 | resources_to_rerun.append(inhibitor.related_job) | ||
93 | 516 | # reset outcome of jobs that are selected for re-running | 526 | # reset outcome of jobs that are selected for re-running |
95 | 517 | for job in wanted_set: | 527 | for job in list(wanted_set) + resources_to_rerun: |
96 | 518 | from plainbox.impl.result import MemoryJobResult | 528 | from plainbox.impl.result import MemoryJobResult |
97 | 519 | self.manager.state.job_state_map[job.id].result = \ | 529 | self.manager.state.job_state_map[job.id].result = \ |
98 | 520 | MemoryJobResult({}) | 530 | MemoryJobResult({}) |
99 | 521 | 531 | ||
100 | === modified file 'checkbox-ng/checkbox_ng/commands/sru.py' | |||
101 | --- checkbox-ng/checkbox_ng/commands/sru.py 2015-09-07 13:40:15 +0000 | |||
102 | +++ checkbox-ng/checkbox_ng/commands/sru.py 2016-01-05 21:24:37 +0000 | |||
103 | @@ -128,7 +128,7 @@ | |||
104 | 128 | 128 | ||
105 | 129 | def _collect_info(self, rc, sa): | 129 | def _collect_info(self, rc, sa): |
106 | 130 | sa.select_providers('*') | 130 | sa.select_providers('*') |
108 | 131 | sa.start_new_session(_("Hardware Collection Session")) | 131 | sa.start_new_session(_("SRU Session")) |
109 | 132 | sa.select_test_plan(self.config.test_plan) | 132 | sa.select_test_plan(self.config.test_plan) |
110 | 133 | sa.bootstrap() | 133 | sa.bootstrap() |
111 | 134 | for job_id in sa.get_static_todo_list(): | 134 | for job_id in sa.get_static_todo_list(): |
112 | 135 | 135 | ||
113 | === modified file 'checkbox-ng/checkbox_ng/misc.py' | |||
114 | --- checkbox-ng/checkbox_ng/misc.py 2015-09-17 13:32:38 +0000 | |||
115 | +++ checkbox-ng/checkbox_ng/misc.py 2016-01-05 21:24:37 +0000 | |||
116 | @@ -145,6 +145,28 @@ | |||
117 | 145 | builder.auto_add_job(job) | 145 | builder.auto_add_job(job) |
118 | 146 | return builder.root_node | 146 | return builder.root_node |
119 | 147 | 147 | ||
120 | 148 | @classmethod | ||
121 | 149 | def create_simple_tree(cls, sa, job_list): | ||
122 | 150 | """ | ||
123 | 151 | Build a rooted JobTreeNode from a job list. | ||
124 | 152 | |||
125 | 153 | :argument sa: | ||
126 | 154 | A session assistant object | ||
127 | 155 | :argument job_list: | ||
128 | 156 | List of jobs to consider for building the tree. | ||
129 | 157 | """ | ||
130 | 158 | root_node = cls() | ||
131 | 159 | for job in job_list: | ||
132 | 160 | cat_name = sa.get_category(job.category_id).tr_name() | ||
133 | 161 | matches = [n for n in root_node.categories if n.name == cat_name] | ||
134 | 162 | if not matches: | ||
135 | 163 | node = cls(cat_name) | ||
136 | 164 | root_node.add_category(node) | ||
137 | 165 | else: | ||
138 | 166 | node = matches[0] | ||
139 | 167 | node.add_job(job) | ||
140 | 168 | return root_node | ||
141 | 169 | |||
142 | 148 | 170 | ||
143 | 149 | class TreeBuilder: | 171 | class TreeBuilder: |
144 | 150 | 172 | ||
145 | @@ -349,11 +371,13 @@ | |||
146 | 349 | for job in self.job_selection: | 371 | for job in self.job_selection: |
147 | 350 | if self.job_selection[job]: | 372 | if self.job_selection[job]: |
148 | 351 | self._selection_list.append(job) | 373 | self._selection_list.append(job) |
149 | 352 | # Don't forget to append the collected resource jobs to the final | ||
150 | 353 | # selection | ||
151 | 354 | self._selection_list.extend(self._resource_jobs) | ||
152 | 355 | return self._selection_list | 374 | return self._selection_list |
153 | 356 | 375 | ||
154 | 376 | @property | ||
155 | 377 | def resource_jobs(self): | ||
156 | 378 | """Return all the resource jobs.""" | ||
157 | 379 | return self._resource_jobs | ||
158 | 380 | |||
159 | 357 | def set_ancestors_state(self, new_state): | 381 | def set_ancestors_state(self, new_state): |
160 | 358 | """ | 382 | """ |
161 | 359 | Set the selection state of all ancestors consistently | 383 | Set the selection state of all ancestors consistently |
162 | 360 | 384 | ||
163 | === modified file 'checkbox-ng/checkbox_ng/test_misc.py' | |||
164 | --- checkbox-ng/checkbox_ng/test_misc.py 2015-09-17 13:32:38 +0000 | |||
165 | +++ checkbox-ng/checkbox_ng/test_misc.py 2016-01-05 21:24:37 +0000 | |||
166 | @@ -180,4 +180,4 @@ | |||
167 | 180 | # Note that in addition to the selected (D) test, we need the | 180 | # Note that in addition to the selected (D) test, we need the |
168 | 181 | # tree selection to contain the resource (F), even though the | 181 | # tree selection to contain the resource (F), even though the |
169 | 182 | # user never saw it in the previous tests for visual presentation. | 182 | # user never saw it in the previous tests for visual presentation. |
171 | 183 | self.assertEqual(self.tree.selection, [self.D, self.F]) | 183 | self.assertEqual(self.tree.selection, [self.D]) |
172 | 184 | 184 | ||
173 | === modified file 'checkbox-ng/checkbox_ng/ui.py' | |||
174 | --- checkbox-ng/checkbox_ng/ui.py 2015-06-10 15:04:50 +0000 | |||
175 | +++ checkbox-ng/checkbox_ng/ui.py 2016-01-05 21:24:37 +0000 | |||
176 | @@ -77,12 +77,13 @@ | |||
177 | 77 | """ | 77 | """ |
178 | 78 | Display the appropriate menu and return the selected options | 78 | Display the appropriate menu and return the selected options |
179 | 79 | """ | 79 | """ |
181 | 80 | def __init__(self, title, menu, selection=[0]): | 80 | def __init__(self, title, menu, selection=[0], multiple_allowed=True): |
182 | 81 | self.image = TextImage(Size(0, 0)) | 81 | self.image = TextImage(Size(0, 0)) |
183 | 82 | self.title = title | 82 | self.title = title |
184 | 83 | self.menu = menu | 83 | self.menu = menu |
185 | 84 | self.option_count = len(menu) | 84 | self.option_count = len(menu) |
186 | 85 | self.position = 0 # Zero-based index of the selected menu option | 85 | self.position = 0 # Zero-based index of the selected menu option |
187 | 86 | self.multiple_allowed = multiple_allowed | ||
188 | 86 | if self.option_count: | 87 | if self.option_count: |
189 | 87 | self.selection = selection | 88 | self.selection = selection |
190 | 88 | else: | 89 | else: |
191 | @@ -110,6 +111,8 @@ | |||
192 | 110 | self.selection.remove(self.position) | 111 | self.selection.remove(self.position) |
193 | 111 | elif self.position < self.option_count: | 112 | elif self.position < self.option_count: |
194 | 112 | self.selection.append(self.position) | 113 | self.selection.append(self.position) |
195 | 114 | if not self.multiple_allowed: | ||
196 | 115 | self.selection = [self.position] | ||
197 | 113 | self.repaint(event) | 116 | self.repaint(event) |
198 | 114 | return self.image | 117 | return self.image |
199 | 115 | 118 | ||
200 | 116 | 119 | ||
201 | === modified file 'checkbox-ng/docs/changelog.rst' | |||
202 | --- checkbox-ng/docs/changelog.rst 2014-09-16 12:53:41 +0000 | |||
203 | +++ checkbox-ng/docs/changelog.rst 2016-01-05 21:24:37 +0000 | |||
204 | @@ -6,18 +6,32 @@ | |||
205 | 6 | accounting of development history please inspect the source history | 6 | accounting of development history please inspect the source history |
206 | 7 | directly. | 7 | directly. |
207 | 8 | 8 | ||
208 | 9 | .. _version_0_23: | ||
209 | 10 | |||
210 | 11 | CheckboxNG 0.23 (unreleased) | ||
211 | 12 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
212 | 13 | |||
213 | 14 | * Bugfixes: https://launchpad.net/checkbox-ng/+milestone/0.23 | ||
214 | 15 | |||
215 | 16 | .. _version_0_22: | ||
216 | 17 | |||
217 | 18 | CheckboxNG 0.22 | ||
218 | 19 | ^^^^^^^^^^^^^^^ | ||
219 | 20 | |||
220 | 21 | * Bugfixes: https://launchpad.net/checkbox-ng/+milestone/0.22 | ||
221 | 22 | |||
222 | 9 | CheckboxNG 0.3 | 23 | CheckboxNG 0.3 |
224 | 10 | -------------- | 24 | ^^^^^^^^^^^^^^ |
225 | 11 | 25 | ||
226 | 12 | * Bugfixes: https://launchpad.net/checkbox-ng/+milestone/0.3 | 26 | * Bugfixes: https://launchpad.net/checkbox-ng/+milestone/0.3 |
227 | 13 | 27 | ||
228 | 14 | CheckboxNG 0.2 | 28 | CheckboxNG 0.2 |
230 | 15 | -------------- | 29 | ^^^^^^^^^^^^^^ |
231 | 16 | 30 | ||
233 | 17 | ??? | 31 | * Bugfixes: https://launchpad.net/checkbox-ng/+milestone/0.2 |
234 | 18 | 32 | ||
235 | 19 | CheckboxNG 0.1 | 33 | CheckboxNG 0.1 |
237 | 20 | -------------- | 34 | ^^^^^^^^^^^^^^ |
238 | 21 | 35 | ||
239 | 22 | * Initial release | 36 | * Initial release |
240 | 23 | * Support for displaying configuration | 37 | * Support for displaying configuration |
241 | 24 | 38 | ||
242 | === added file 'checkbox-ng/launchers/checkbox-cli2' | |||
243 | --- checkbox-ng/launchers/checkbox-cli2 1970-01-01 00:00:00 +0000 | |||
244 | +++ checkbox-ng/launchers/checkbox-cli2 2016-01-05 21:24:37 +0000 | |||
245 | @@ -0,0 +1,596 @@ | |||
246 | 1 | #!/usr/bin/env python3 | ||
247 | 2 | # This file is part of Checkbox. | ||
248 | 3 | # | ||
249 | 4 | # Copyright 2015 Canonical Ltd. | ||
250 | 5 | # Written by: | ||
251 | 6 | # Sylvain Pineau <sylvain.pineau@canonical.com> | ||
252 | 7 | # | ||
253 | 8 | # Checkbox is free software: you can redistribute it and/or modify | ||
254 | 9 | # it under the terms of the GNU General Public License version 3, | ||
255 | 10 | # as published by the Free Software Foundation. | ||
256 | 11 | # | ||
257 | 12 | # Checkbox is distributed in the hope that it will be useful, | ||
258 | 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
259 | 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
260 | 15 | # GNU General Public License for more details. | ||
261 | 16 | # | ||
262 | 17 | # You should have received a copy of the GNU General Public License | ||
263 | 18 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. | ||
264 | 19 | |||
265 | 20 | """ | ||
266 | 21 | Checkbox CLI Application. | ||
267 | 22 | |||
268 | 23 | WARNING: this is not a launcher interpreter. | ||
269 | 24 | """ | ||
270 | 25 | |||
271 | 26 | from argparse import SUPPRESS | ||
272 | 27 | from shutil import copyfileobj | ||
273 | 28 | import gettext | ||
274 | 29 | import io | ||
275 | 30 | import json | ||
276 | 31 | import logging | ||
277 | 32 | import os | ||
278 | 33 | import sys | ||
279 | 34 | |||
280 | 35 | from guacamole import Command | ||
281 | 36 | from guacamole.core import Ingredient | ||
282 | 37 | from guacamole.ingredients import ansi | ||
283 | 38 | from guacamole.ingredients import argparse | ||
284 | 39 | from guacamole.ingredients import cmdtree | ||
285 | 40 | from guacamole.recipes.cmd import CommandRecipe | ||
286 | 41 | |||
287 | 42 | # TODO: use public APIs here | ||
288 | 43 | from plainbox.abc import IJobResult | ||
289 | 44 | from plainbox.i18n import ngettext | ||
290 | 45 | from plainbox.i18n import pgettext as C_ | ||
291 | 46 | from plainbox.impl.commands.inv_run import seconds_to_human_duration | ||
292 | 47 | from plainbox.impl.commands.inv_run import Action | ||
293 | 48 | from plainbox.impl.commands.inv_run import ActionUI | ||
294 | 49 | from plainbox.impl.commands.inv_run import NormalUI | ||
295 | 50 | from plainbox.impl.commands.inv_run import ReRunJob | ||
296 | 51 | from plainbox.impl.color import Colorizer | ||
297 | 52 | from plainbox.impl.exporter import ByteStringStreamTranslator | ||
298 | 53 | from plainbox.impl.ingredients import CanonicalCrashIngredient | ||
299 | 54 | from plainbox.impl.ingredients import RenderingContextIngredient | ||
300 | 55 | from plainbox.impl.ingredients import SessionAssistantIngredient | ||
301 | 56 | from plainbox.impl.result import tr_outcome | ||
302 | 57 | from plainbox.impl.result import JobResultBuilder | ||
303 | 58 | from plainbox.impl.result import MemoryJobResult | ||
304 | 59 | from plainbox.impl.session.assistant import SA_RESTARTABLE | ||
305 | 60 | from plainbox.impl.session.jobs import InhibitionCause | ||
306 | 61 | from plainbox.vendor.textland import get_display | ||
307 | 62 | |||
308 | 63 | from checkbox_ng.misc import SelectableJobTreeNode | ||
309 | 64 | from checkbox_ng.ui import ScrollableTreeNode | ||
310 | 65 | from checkbox_ng.ui import ShowMenu | ||
311 | 66 | from checkbox_ng.ui import ShowRerun | ||
312 | 67 | |||
313 | 68 | |||
314 | 69 | _ = gettext.gettext | ||
315 | 70 | |||
316 | 71 | _logger = logging.getLogger("checkbox-cli") | ||
317 | 72 | |||
318 | 73 | |||
319 | 74 | class DisplayIngredient(Ingredient): | ||
320 | 75 | |||
321 | 76 | """Ingredient that adds a Textland display to guacamole.""" | ||
322 | 77 | |||
323 | 78 | def late_init(self, context): | ||
324 | 79 | """Add a DisplayIngredient as ``display`` to the guacamole context.""" | ||
325 | 80 | context.display = get_display() | ||
326 | 81 | |||
327 | 82 | |||
328 | 83 | class CheckboxCommandRecipe(CommandRecipe): | ||
329 | 84 | |||
330 | 85 | """A recipe for using Checkbox-enhanced commands.""" | ||
331 | 86 | |||
332 | 87 | def get_ingredients(self): | ||
333 | 88 | """Get a list of ingredients for guacamole.""" | ||
334 | 89 | return [ | ||
335 | 90 | cmdtree.CommandTreeBuilder(self.command), | ||
336 | 91 | cmdtree.CommandTreeDispatcher(), | ||
337 | 92 | argparse.ParserIngredient(), | ||
338 | 93 | CanonicalCrashIngredient(), | ||
339 | 94 | ansi.ANSIIngredient(), | ||
340 | 95 | SessionAssistantIngredient(), | ||
341 | 96 | RenderingContextIngredient(), | ||
342 | 97 | DisplayIngredient() | ||
343 | 98 | ] | ||
344 | 99 | |||
345 | 100 | |||
346 | 101 | class CheckboxUI(NormalUI): | ||
347 | 102 | |||
348 | 103 | def considering_job(self, job, job_state): | ||
349 | 104 | pass | ||
350 | 105 | |||
351 | 106 | |||
352 | 107 | class CheckboxCommand(Command): | ||
353 | 108 | |||
354 | 109 | """ | ||
355 | 110 | A command with Checkbox-enhanced ingredients. | ||
356 | 111 | |||
357 | 112 | This command has two additional items in the guacamole execution context, | ||
358 | 113 | the :class:`DisplayIngredient` object ``display`` and the | ||
359 | 114 | :class:`SessionAssistant` object ``sa``. | ||
360 | 115 | """ | ||
361 | 116 | |||
362 | 117 | bug_report_url = "https://bugs.launchpad.net/checkbox-ng/+filebug" | ||
363 | 118 | |||
364 | 119 | def main(self, argv=None, exit=True): | ||
365 | 120 | """ | ||
366 | 121 | Shortcut for running a command. | ||
367 | 122 | |||
368 | 123 | See :meth:`guacamole.recipes.Recipe.main()` for details. | ||
369 | 124 | """ | ||
370 | 125 | return CheckboxCommandRecipe(self).main(argv, exit) | ||
371 | 126 | |||
372 | 127 | |||
373 | 128 | class checkbox_cli(CheckboxCommand): | ||
374 | 129 | |||
375 | 130 | """Tool to run Checkbox jobs interactively from the command line.""" | ||
376 | 131 | |||
377 | 132 | app_id = 'checkbox-cli' | ||
378 | 133 | |||
379 | 134 | def get_sa_api_version(self): | ||
380 | 135 | return '0.99' | ||
381 | 136 | |||
382 | 137 | def get_sa_api_flags(self): | ||
383 | 138 | return (SA_RESTARTABLE,) | ||
384 | 139 | |||
385 | 140 | def register_arguments(self, parser): | ||
386 | 141 | """Method called to register command line arguments.""" | ||
387 | 142 | parser.add_argument( | ||
388 | 143 | '-t', '--test-plan', action="store", metavar=_("TEST-PLAN-ID"), | ||
389 | 144 | default=None, | ||
390 | 145 | # TRANSLATORS: this is in imperative form | ||
391 | 146 | help=_("load the specified test plan")) | ||
392 | 147 | parser.add_argument( | ||
393 | 148 | '--secure_id', metavar="SECURE_ID", | ||
394 | 149 | help=_("Canonical hardware identifier (optional)")) | ||
395 | 150 | parser.add_argument( | ||
396 | 151 | '--non-interactive', action='store_true', | ||
397 | 152 | help=_("skip tests that require interactivity")) | ||
398 | 153 | parser.add_argument( | ||
399 | 154 | '--dont-suppress-output', action="store_true", default=False, | ||
400 | 155 | help=_("don't suppress the output of certain job plugin types")) | ||
401 | 156 | parser.add_argument( | ||
402 | 157 | '--staging', action='store_true', default=False, | ||
403 | 158 | # Hide staging from help message (See pad.lv/1350005) | ||
404 | 159 | help=SUPPRESS) | ||
405 | 160 | parser.add_argument( | ||
406 | 161 | '--resume', dest='session_id', metavar="SESSION_ID", | ||
407 | 162 | help=SUPPRESS) | ||
408 | 163 | |||
409 | 164 | def invoked(self, ctx): | ||
410 | 165 | """Method called when the command is invoked.""" | ||
411 | 166 | self.ctx = ctx | ||
412 | 167 | self.transport = self._create_transport() | ||
413 | 168 | self.C = Colorizer() | ||
414 | 169 | try: | ||
415 | 170 | self._do_normal_sequence() | ||
416 | 171 | self._export_results() | ||
417 | 172 | if ctx.args.secure_id: | ||
418 | 173 | self._send_results() | ||
419 | 174 | ctx.sa.finalize_session() | ||
420 | 175 | except KeyboardInterrupt: | ||
421 | 176 | return 1 | ||
422 | 177 | |||
423 | 178 | def _export_results(self): | ||
424 | 179 | if self.is_interactive: | ||
425 | 180 | print(self.C.header(_("Results"))) | ||
426 | 181 | # This requires a bit more finesse, as exporters output bytes | ||
427 | 182 | # and stdout needs a string. | ||
428 | 183 | translating_stream = ByteStringStreamTranslator( | ||
429 | 184 | sys.stdout, "utf-8") | ||
430 | 185 | self.ctx.sa.export_to_stream( | ||
431 | 186 | '2013.com.canonical.plainbox::text', (), translating_stream) | ||
432 | 187 | base_dir = os.path.join( | ||
433 | 188 | os.getenv( | ||
434 | 189 | 'XDG_DATA_HOME', os.path.expanduser("~/.local/share/")), | ||
435 | 190 | "checkbox-ng") | ||
436 | 191 | if not os.path.exists(base_dir): | ||
437 | 192 | os.makedirs(base_dir) | ||
438 | 193 | exp_options = ['with-sys-info', 'with-summary', 'with-job-description', | ||
439 | 194 | 'with-text-attachments', 'with-certification-status', | ||
440 | 195 | 'with-job-defs', 'with-io-log', 'with-comments'] | ||
441 | 196 | exporters = [ | ||
442 | 197 | '2013.com.canonical.plainbox::hexr', | ||
443 | 198 | '2013.com.canonical.plainbox::html', | ||
444 | 199 | '2013.com.canonical.plainbox::xlsx', | ||
445 | 200 | '2013.com.canonical.plainbox::json', | ||
446 | 201 | ] | ||
447 | 202 | print() | ||
448 | 203 | for unit_name in exporters: | ||
449 | 204 | results_path = self.ctx.sa.export_to_file(unit_name, exp_options, | ||
450 | 205 | base_dir) | ||
451 | 206 | print("file://{}".format(results_path)) | ||
452 | 207 | |||
453 | 208 | def _send_results(self): | ||
454 | 209 | print() | ||
455 | 210 | print(_("Sending hardware report to Canonical Certification")) | ||
456 | 211 | print(_("Server URL is: {0}").format(self.transport.url)) | ||
457 | 212 | result = self.ctx.sa.export_to_transport( | ||
458 | 213 | "2013.com.canonical.plainbox::hexr", self.transport) | ||
459 | 214 | if 'url' in result: | ||
460 | 215 | print(result['url']) | ||
461 | 216 | |||
462 | 217 | def _create_transport(self): | ||
463 | 218 | if self.ctx.args.secure_id: | ||
464 | 219 | return self.ctx.sa.get_canonical_certification_transport( | ||
465 | 220 | self.ctx.args.secure_id, staging=self.ctx.args.staging) | ||
466 | 221 | |||
467 | 222 | def _get_interactively_picked_testplans(self): | ||
468 | 223 | test_plan_ids = self.ctx.sa.get_test_plans() | ||
469 | 224 | test_plan_names = [self.ctx.sa.get_test_plan(tp_id).name for tp_id in | ||
470 | 225 | test_plan_ids] | ||
471 | 226 | try: | ||
472 | 227 | selected_index = self.ctx.display.run( | ||
473 | 228 | ShowMenu(_("Select test plan"), | ||
474 | 229 | test_plan_names, [], | ||
475 | 230 | multiple_allowed=False))[0] | ||
476 | 231 | except IndexError: | ||
477 | 232 | return None | ||
478 | 233 | return test_plan_ids[selected_index] | ||
479 | 234 | |||
480 | 235 | def _interactively_pick_jobs_to_run(self): | ||
481 | 236 | job_list = [self.ctx.sa.get_job(job_id) for job_id in | ||
482 | 237 | self.ctx.sa.get_static_todo_list()] | ||
483 | 238 | tree = SelectableJobTreeNode.create_simple_tree(self.ctx.sa, job_list) | ||
484 | 239 | title = _('Choose tests to run on your system:') | ||
485 | 240 | self.ctx.display.run(ScrollableTreeNode(tree, title)) | ||
486 | 241 | # NOTE: tree.selection is correct but ordered badly. To retain | ||
487 | 242 | # the original ordering we should just treat it as a mask and | ||
488 | 243 | # use it to filter jobs from get_static_todo_list. | ||
489 | 244 | wanted_set = frozenset([job.id for job in tree.selection]) | ||
490 | 245 | job_id_list = [job_id for job_id in self.ctx.sa.get_static_todo_list() | ||
491 | 246 | if job_id in wanted_set] | ||
492 | 247 | self.ctx.sa.use_alternate_selection(job_id_list) | ||
493 | 248 | |||
494 | 249 | @property | ||
495 | 250 | def is_interactive(self): | ||
496 | 251 | """ | ||
497 | 252 | Flag indicating that this is an interactive invocation. | ||
498 | 253 | |||
499 | 254 | We can then interact with the user when we encounter OUTCOME_UNDECIDED. | ||
500 | 255 | """ | ||
501 | 256 | return (sys.stdin.isatty() and sys.stdout.isatty() and not | ||
502 | 257 | self.ctx.args.non_interactive) | ||
503 | 258 | |||
504 | 259 | def _get_ui_for_job(self, job): | ||
505 | 260 | if self.ctx.args.dont_suppress_output is False and job.plugin in ( | ||
506 | 261 | 'local', 'resource', 'attachment'): | ||
507 | 262 | return CheckboxUI(self.C.c, show_cmd_output=False) | ||
508 | 263 | else: | ||
509 | 264 | return CheckboxUI(self.C.c, show_cmd_output=True) | ||
510 | 265 | |||
511 | 266 | def _run_single_job_with_ui_loop(self, job, ui): | ||
512 | 267 | print(self.C.header(job.tr_summary(), fill='-')) | ||
513 | 268 | print(_("ID: {0}").format(job.id)) | ||
514 | 269 | print(_("Category: {0}").format( | ||
515 | 270 | self.ctx.sa.get_job_state(job.id).effective_category_id)) | ||
516 | 271 | comments = "" | ||
517 | 272 | while True: | ||
518 | 273 | if job.plugin in ('user-interact', 'user-interact-verify', | ||
519 | 274 | 'user-verify', 'manual'): | ||
520 | 275 | ui.notify_about_purpose(job) | ||
521 | 276 | if (self.is_interactive and | ||
522 | 277 | job.plugin in ('user-interact', | ||
523 | 278 | 'user-interact-verify', | ||
524 | 279 | 'manual')): | ||
525 | 280 | ui.notify_about_steps(job) | ||
526 | 281 | if job.plugin == 'manual': | ||
527 | 282 | cmd = 'run' | ||
528 | 283 | else: | ||
529 | 284 | cmd = ui.wait_for_interaction_prompt(job) | ||
530 | 285 | if cmd == 'run' or cmd is None: | ||
531 | 286 | result_builder = self.ctx.sa.run_job(job.id, ui, False) | ||
532 | 287 | elif cmd == 'comment': | ||
533 | 288 | new_comment = input(self.C.BLUE( | ||
534 | 289 | _('Please enter your comments:') + '\n')) | ||
535 | 290 | if new_comment: | ||
536 | 291 | comments += new_comment + '\n' | ||
537 | 292 | continue | ||
538 | 293 | elif cmd == 'skip': | ||
539 | 294 | result_builder = JobResultBuilder( | ||
540 | 295 | outcome=IJobResult.OUTCOME_SKIP, | ||
541 | 296 | comments=_("Explicitly skipped before" | ||
542 | 297 | " execution")) | ||
543 | 298 | if comments != "": | ||
544 | 299 | result_builder.comments = comments | ||
545 | 300 | break | ||
546 | 301 | elif cmd == 'quit': | ||
547 | 302 | raise SystemExit() | ||
548 | 303 | else: | ||
549 | 304 | result_builder = self.ctx.sa.run_job(job.id, ui, False) | ||
550 | 305 | else: | ||
551 | 306 | if 'noreturn' in job.get_flag_set(): | ||
552 | 307 | ui.noreturn_job() | ||
553 | 308 | result_builder = self.ctx.sa.run_job(job.id, ui, False) | ||
554 | 309 | if (self.is_interactive and | ||
555 | 310 | result_builder.outcome == IJobResult.OUTCOME_UNDECIDED): | ||
556 | 311 | try: | ||
557 | 312 | if comments != "": | ||
558 | 313 | result_builder.comments = comments | ||
559 | 314 | ui.notify_about_verification(job) | ||
560 | 315 | self._interaction_callback(job, result_builder) | ||
561 | 316 | except ReRunJob: | ||
562 | 317 | self.ctx.sa.use_job_result(job.id, | ||
563 | 318 | result_builder.get_result()) | ||
564 | 319 | continue | ||
565 | 320 | break | ||
566 | 321 | return result_builder | ||
567 | 322 | |||
568 | 323 | def _pick_action_cmd(self, action_list, prompt=None): | ||
569 | 324 | return ActionUI(action_list, prompt).run() | ||
570 | 325 | |||
571 | 326 | def _interaction_callback(self, job, result_builder, | ||
572 | 327 | prompt=None, allowed_outcome=None): | ||
573 | 328 | result = result_builder.get_result() | ||
574 | 329 | if prompt is None: | ||
575 | 330 | prompt = _("Select an outcome or an action: ") | ||
576 | 331 | if allowed_outcome is None: | ||
577 | 332 | allowed_outcome = [IJobResult.OUTCOME_PASS, | ||
578 | 333 | IJobResult.OUTCOME_FAIL, | ||
579 | 334 | IJobResult.OUTCOME_SKIP] | ||
580 | 335 | allowed_actions = [ | ||
581 | 336 | Action('c', _('add a comment'), 'set-comments') | ||
582 | 337 | ] | ||
583 | 338 | if IJobResult.OUTCOME_PASS in allowed_outcome: | ||
584 | 339 | allowed_actions.append( | ||
585 | 340 | Action('p', _('set outcome to {0}').format( | ||
586 | 341 | self.C.GREEN(C_('set outcome to <pass>', 'pass'))), | ||
587 | 342 | 'set-pass')) | ||
588 | 343 | if IJobResult.OUTCOME_FAIL in allowed_outcome: | ||
589 | 344 | allowed_actions.append( | ||
590 | 345 | Action('f', _('set outcome to {0}').format( | ||
591 | 346 | self.C.RED(C_('set outcome to <fail>', 'fail'))), | ||
592 | 347 | 'set-fail')) | ||
593 | 348 | if IJobResult.OUTCOME_SKIP in allowed_outcome: | ||
594 | 349 | allowed_actions.append( | ||
595 | 350 | Action('s', _('set outcome to {0}').format( | ||
596 | 351 | self.C.YELLOW(C_('set outcome to <skip>', 'skip'))), | ||
597 | 352 | 'set-skip')) | ||
598 | 353 | if job.command is not None: | ||
599 | 354 | allowed_actions.append( | ||
600 | 355 | Action('r', _('re-run this job'), 're-run')) | ||
601 | 356 | if result.return_code is not None: | ||
602 | 357 | if result.return_code == 0: | ||
603 | 358 | suggested_outcome = IJobResult.OUTCOME_PASS | ||
604 | 359 | else: | ||
605 | 360 | suggested_outcome = IJobResult.OUTCOME_FAIL | ||
606 | 361 | allowed_actions.append( | ||
607 | 362 | Action('', _('set suggested outcome [{0}]').format( | ||
608 | 363 | tr_outcome(suggested_outcome)), 'set-suggested')) | ||
609 | 364 | while result.outcome not in allowed_outcome: | ||
610 | 365 | print(_("Please decide what to do next:")) | ||
611 | 366 | print(" " + _("outcome") + ": {0}".format( | ||
612 | 367 | self.C.result(result))) | ||
613 | 368 | if result.comments is None: | ||
614 | 369 | print(" " + _("comments") + ": {0}".format( | ||
615 | 370 | C_("none comment", "none"))) | ||
616 | 371 | else: | ||
617 | 372 | print(" " + _("comments") + ": {0}".format( | ||
618 | 373 | self.C.CYAN(result.comments, bright=False))) | ||
619 | 374 | cmd = self._pick_action_cmd(allowed_actions) | ||
620 | 375 | if cmd == 'set-pass': | ||
621 | 376 | result_builder.outcome = IJobResult.OUTCOME_PASS | ||
622 | 377 | elif cmd == 'set-fail': | ||
623 | 378 | result_builder.outcome = IJobResult.OUTCOME_FAIL | ||
624 | 379 | elif cmd == 'set-skip' or cmd is None: | ||
625 | 380 | result_builder.outcome = IJobResult.OUTCOME_SKIP | ||
626 | 381 | elif cmd == 'set-suggested': | ||
627 | 382 | result_builder.outcome = suggested_outcome | ||
628 | 383 | elif cmd == 'set-comments': | ||
629 | 384 | new_comment = input(self.C.BLUE( | ||
630 | 385 | _('Please enter your comments:') + '\n')) | ||
631 | 386 | if new_comment: | ||
632 | 387 | result_builder.add_comment(new_comment) | ||
633 | 388 | elif cmd == 're-run': | ||
634 | 389 | raise ReRunJob | ||
635 | 390 | result = result_builder.get_result() | ||
636 | 391 | |||
637 | 392 | def _run_jobs(self, jobs_to_run): | ||
638 | 393 | estimated_time = 0 | ||
639 | 394 | for job_id in jobs_to_run: | ||
640 | 395 | job = self.ctx.sa.get_job(job_id) | ||
641 | 396 | if (job.estimated_duration is not None | ||
642 | 397 | and estimated_time is not None): | ||
643 | 398 | estimated_time += job.estimated_duration | ||
644 | 399 | else: | ||
645 | 400 | estimated_time = None | ||
646 | 401 | for job_no, job_id in enumerate(jobs_to_run, start=1): | ||
647 | 402 | print(self.C.header( | ||
648 | 403 | _('Running job {} / {}. Estimated time left: {}').format( | ||
649 | 404 | job_no, len(jobs_to_run), | ||
650 | 405 | seconds_to_human_duration(max(0, estimated_time)) | ||
651 | 406 | if estimated_time is not None else _("unknown")), | ||
652 | 407 | fill='-')) | ||
653 | 408 | job = self.ctx.sa.get_job(job_id) | ||
654 | 409 | builder = self._run_single_job_with_ui_loop( | ||
655 | 410 | job, self._get_ui_for_job(job)) | ||
656 | 411 | result = builder.get_result() | ||
657 | 412 | self.ctx.sa.use_job_result(job_id, result) | ||
658 | 413 | if (job.estimated_duration is not None | ||
659 | 414 | and estimated_time is not None): | ||
660 | 415 | estimated_time -= job.estimated_duration | ||
661 | 416 | |||
662 | 417 | def _get_rerun_candidates(self): | ||
663 | 418 | """Get all the tests that might be selected for rerunning.""" | ||
664 | 419 | def rerun_predicate(job_state): | ||
665 | 420 | return job_state.result.outcome in ( | ||
666 | 421 | IJobResult.OUTCOME_FAIL, IJobResult.OUTCOME_CRASH, | ||
667 | 422 | IJobResult.OUTCOME_NOT_SUPPORTED, IJobResult.OUTCOME_SKIP) | ||
668 | 423 | rerun_candidates = [] | ||
669 | 424 | todo_list = self.ctx.sa.get_static_todo_list() | ||
670 | 425 | job_states = {job_id: self.ctx.sa.get_job_state(job_id) for job_id | ||
671 | 426 | in todo_list} | ||
672 | 427 | for job_id, job_state in job_states.items(): | ||
673 | 428 | if rerun_predicate(job_state): | ||
674 | 429 | rerun_candidates.append(self.ctx.sa.get_job(job_id)) | ||
675 | 430 | return rerun_candidates | ||
676 | 431 | |||
677 | 432 | def _maybe_rerun_jobs(self): | ||
678 | 433 | # create a list of jobs that qualify for rerunning | ||
679 | 434 | rerun_candidates = self._get_rerun_candidates() | ||
680 | 435 | # bail-out early if no job qualifies for rerunning | ||
681 | 436 | if not rerun_candidates: | ||
682 | 437 | return False | ||
683 | 438 | tree = SelectableJobTreeNode.create_simple_tree(self.ctx.sa, | ||
684 | 439 | rerun_candidates) | ||
685 | 440 | # nothing to select in root node and categories - bailing out | ||
686 | 441 | if not tree.jobs and not tree._categories: | ||
687 | 442 | return False | ||
688 | 443 | # deselect all by default | ||
689 | 444 | tree.set_descendants_state(False) | ||
690 | 445 | self.ctx.display.run(ShowRerun(tree, _("Select jobs to re-run"))) | ||
691 | 446 | wanted_set = frozenset(tree.selection) | ||
692 | 447 | if not wanted_set: | ||
693 | 448 | # nothing selected - nothing to run | ||
694 | 449 | return False | ||
695 | 450 | rerun_candidates = [] | ||
696 | 451 | # include resource jobs that selected jobs depend on | ||
697 | 452 | resources_to_rerun = [] | ||
698 | 453 | for job in wanted_set: | ||
699 | 454 | job_state = self.ctx.sa.get_job_state(job.id) | ||
700 | 455 | for inhibitor in job_state.readiness_inhibitor_list: | ||
701 | 456 | if inhibitor.cause == InhibitionCause.FAILED_DEP: | ||
702 | 457 | resources_to_rerun.append(inhibitor.related_job) | ||
703 | 458 | # reset outcome of jobs that are selected for re-running | ||
704 | 459 | for job in list(wanted_set) + resources_to_rerun: | ||
705 | 460 | self.ctx.sa.get_job_state(job.id).result = MemoryJobResult({}) | ||
706 | 461 | rerun_candidates.append(job.id) | ||
707 | 462 | self._run_jobs(rerun_candidates) | ||
708 | 463 | return True | ||
709 | 464 | |||
710 | 465 | def _do_normal_sequence(self): | ||
711 | 466 | self.ctx.sa.select_providers("*") | ||
712 | 467 | self.ctx.sa.configure_application_restart( | ||
713 | 468 | lambda session_id: [ | ||
714 | 469 | 'sh', '-c', ' '.join([ | ||
715 | 470 | os.path.abspath(__file__), | ||
716 | 471 | "--resume", session_id]) | ||
717 | 472 | ]) | ||
718 | 473 | resumed = self._maybe_resume_session() | ||
719 | 474 | if not resumed: | ||
720 | 475 | print(_("Preparing...")) | ||
721 | 476 | self.ctx.sa.start_new_session(_("Checkbox CLI Session")) | ||
722 | 477 | testplan_id = None | ||
723 | 478 | if self.ctx.args.test_plan: | ||
724 | 479 | if self.ctx.args.test_plan in self.ctx.sa.get_test_plans(): | ||
725 | 480 | testplan_id = self.ctx.args.test_plan | ||
726 | 481 | elif self.is_interactive: | ||
727 | 482 | testplan_id = self._get_interactively_picked_testplans() | ||
728 | 483 | if not testplan_id: | ||
729 | 484 | self.ctx.rc.reset() | ||
730 | 485 | self.ctx.rc.bg = 'red' | ||
731 | 486 | self.ctx.rc.fg = 'bright_white' | ||
732 | 487 | self.ctx.rc.bold = 1 | ||
733 | 488 | self.ctx.rc.para(_("Test plan not found!")) | ||
734 | 489 | raise SystemExit(1) | ||
735 | 490 | self.ctx.sa.select_test_plan(testplan_id) | ||
736 | 491 | self.ctx.sa.update_app_blob(json.dumps( | ||
737 | 492 | {'testplan_id': testplan_id, }).encode("UTF-8")) | ||
738 | 493 | self.ctx.sa.bootstrap() | ||
739 | 494 | if self.is_interactive: | ||
740 | 495 | self._interactively_pick_jobs_to_run() | ||
741 | 496 | self._run_jobs(self.ctx.sa.get_dynamic_todo_list()) | ||
742 | 497 | if self.is_interactive: | ||
743 | 498 | while True: | ||
744 | 499 | if self._maybe_rerun_jobs(): | ||
745 | 500 | continue | ||
746 | 501 | else: | ||
747 | 502 | break | ||
748 | 503 | |||
749 | 504 | def _handle_last_job_after_resume(self, metadata): | ||
750 | 505 | last_job = metadata.running_job_name | ||
751 | 506 | if last_job is None: | ||
752 | 507 | return | ||
753 | 508 | print(_("Previous session run tried to execute job: {}").format( | ||
754 | 509 | last_job)) | ||
755 | 510 | cmd = self._pick_action_cmd([ | ||
756 | 511 | Action('s', _("skip that job"), 'skip'), | ||
757 | 512 | Action('p', _("mark it as passed and continue"), 'pass'), | ||
758 | 513 | Action('f', _("mark it as failed and continue"), 'fail'), | ||
759 | 514 | Action('r', _("run it again"), 'run'), | ||
760 | 515 | ], _("What do you want to do with that job?")) | ||
761 | 516 | if cmd == 'skip' or cmd is None: | ||
762 | 517 | result = MemoryJobResult({ | ||
763 | 518 | 'outcome': IJobResult.OUTCOME_SKIP, | ||
764 | 519 | 'comments': _("Skipped after resuming execution") | ||
765 | 520 | }) | ||
766 | 521 | elif cmd == 'pass': | ||
767 | 522 | result = MemoryJobResult({ | ||
768 | 523 | 'outcome': IJobResult.OUTCOME_PASS, | ||
769 | 524 | 'comments': _("Passed after resuming execution") | ||
770 | 525 | }) | ||
771 | 526 | elif cmd == 'fail': | ||
772 | 527 | result = MemoryJobResult({ | ||
773 | 528 | 'outcome': IJobResult.OUTCOME_FAIL, | ||
774 | 529 | 'comments': _("Failed after resuming execution") | ||
775 | 530 | }) | ||
776 | 531 | elif cmd == 'run': | ||
777 | 532 | result = None | ||
778 | 533 | if result: | ||
779 | 534 | self.ctx.sa.use_job_result(last_job, result) | ||
780 | 535 | |||
781 | 536 | def _maybe_resume_session(self): | ||
782 | 537 | # Try to use the first session that can be resumed if the user agrees | ||
783 | 538 | resume_candidates = list(self.ctx.sa.get_resumable_sessions()) | ||
784 | 539 | resumed = False | ||
785 | 540 | if resume_candidates: | ||
786 | 541 | if self.ctx.args.session_id: | ||
787 | 542 | for candidate in resume_candidates: | ||
788 | 543 | if candidate.id == self.ctx.args.session_id: | ||
789 | 544 | resume_candidates = (candidate, ) | ||
790 | 545 | break | ||
791 | 546 | else: | ||
792 | 547 | raise RuntimeError("Requested session is not resumable!") | ||
793 | 548 | elif self.is_interactive: | ||
794 | 549 | print(self.C.header(_("Resume Incomplete Session"))) | ||
795 | 550 | print(ngettext( | ||
796 | 551 | "There is {0} incomplete session that might be resumed", | ||
797 | 552 | "There are {0} incomplete sessions that might be resumed", | ||
798 | 553 | len(resume_candidates) | ||
799 | 554 | ).format(len(resume_candidates))) | ||
800 | 555 | else: | ||
801 | 556 | return | ||
802 | 557 | for candidate in resume_candidates: | ||
803 | 558 | if self.ctx.args.session_id: | ||
804 | 559 | cmd = 'resume' | ||
805 | 560 | else: | ||
806 | 561 | # Skip sessions that the user doesn't want to resume | ||
807 | 562 | cmd = self._pick_action_cmd([ | ||
808 | 563 | Action('r', _("resume this session"), 'resume'), | ||
809 | 564 | Action('n', _("next session"), 'next'), | ||
810 | 565 | Action('c', _("create new session"), 'create') | ||
811 | 566 | ], _("Do you want to resume session {0!a}?").format( | ||
812 | 567 | candidate.id)) | ||
813 | 568 | if cmd == 'next': | ||
814 | 569 | continue | ||
815 | 570 | elif cmd == 'create' or cmd is None: | ||
816 | 571 | break | ||
817 | 572 | elif cmd == 'resume': | ||
818 | 573 | metadata = self.ctx.sa.resume_session(candidate.id) | ||
819 | 574 | app_blob = json.loads(metadata.app_blob.decode("UTF-8")) | ||
820 | 575 | test_plan_id = app_blob['testplan_id'] | ||
821 | 576 | # FIXME selecting again the testplan on resume resets both | ||
822 | 577 | # the static and dynamic todo lists. | ||
823 | 578 | # We're then saving the selection from the saved run_list | ||
824 | 579 | # by accessing the session private context object. | ||
825 | 580 | selected_id_list = [job.id for job in | ||
826 | 581 | self.ctx.sa._context.state.run_list] | ||
827 | 582 | self.ctx.sa.select_test_plan(test_plan_id) | ||
828 | 583 | self.ctx.sa.bootstrap() | ||
829 | 584 | self.ctx.sa.use_alternate_selection(selected_id_list) | ||
830 | 585 | # If we resumed maybe not rerun the same, probably broken | ||
831 | 586 | # job | ||
832 | 587 | self._handle_last_job_after_resume(metadata) | ||
833 | 588 | self._run_jobs(self.ctx.sa.get_dynamic_todo_list()) | ||
834 | 589 | resumed = True | ||
835 | 590 | # Finally ignore other sessions that can be resumed | ||
836 | 591 | break | ||
837 | 592 | return resumed | ||
838 | 593 | |||
839 | 594 | |||
840 | 595 | if __name__ == '__main__': | ||
841 | 596 | checkbox_cli().main() | ||
842 | 0 | 597 | ||
843 | === modified file 'checkbox-ng/po/POTFILES.in' | |||
844 | --- checkbox-ng/po/POTFILES.in 2015-06-25 15:42:19 +0000 | |||
845 | +++ checkbox-ng/po/POTFILES.in 2016-01-05 21:24:37 +0000 | |||
846 | @@ -5,19 +5,13 @@ | |||
847 | 5 | ./checkbox_ng/commands/cli.py | 5 | ./checkbox_ng/commands/cli.py |
848 | 6 | ./checkbox_ng/commands/launcher.py | 6 | ./checkbox_ng/commands/launcher.py |
849 | 7 | ./checkbox_ng/commands/newcli.py | 7 | ./checkbox_ng/commands/newcli.py |
850 | 8 | ./checkbox_ng/commands/service.py | ||
851 | 9 | ./checkbox_ng/commands/sru.py | 8 | ./checkbox_ng/commands/sru.py |
852 | 10 | ./checkbox_ng/commands/submit.py | 9 | ./checkbox_ng/commands/submit.py |
853 | 11 | ./checkbox_ng/commands/test_sru.py | 10 | ./checkbox_ng/commands/test_sru.py |
854 | 12 | ./checkbox_ng/config.py | 11 | ./checkbox_ng/config.py |
855 | 13 | ./checkbox_ng/dbus_ex/__init__.py | ||
856 | 14 | ./checkbox_ng/dbus_ex/decorators.py | ||
857 | 15 | ./checkbox_ng/dbus_ex/service.py | ||
858 | 16 | ./checkbox_ng/dbus_ex/test_dbus.py | ||
859 | 17 | ./checkbox_ng/launcher.py | 12 | ./checkbox_ng/launcher.py |
860 | 18 | ./checkbox_ng/launchpad.py | 13 | ./checkbox_ng/launchpad.py |
861 | 19 | ./checkbox_ng/main.py | 14 | ./checkbox_ng/main.py |
862 | 20 | ./checkbox_ng/service.py | ||
863 | 21 | ./checkbox_ng/test_certification.py | 15 | ./checkbox_ng/test_certification.py |
864 | 22 | ./checkbox_ng/test_config.py | 16 | ./checkbox_ng/test_config.py |
865 | 23 | ./checkbox_ng/test_main.py | 17 | ./checkbox_ng/test_main.py |
866 | 24 | 18 | ||
867 | === modified file 'checkbox-ng/po/checkbox-ng.pot' | |||
868 | --- checkbox-ng/po/checkbox-ng.pot 2015-05-19 05:10:52 +0000 | |||
869 | +++ checkbox-ng/po/checkbox-ng.pot 2016-01-05 21:24:37 +0000 | |||
870 | @@ -8,7 +8,7 @@ | |||
871 | 8 | msgstr "" | 8 | msgstr "" |
872 | 9 | "Project-Id-Version: PACKAGE VERSION\n" | 9 | "Project-Id-Version: PACKAGE VERSION\n" |
873 | 10 | "Report-Msgid-Bugs-To: \n" | 10 | "Report-Msgid-Bugs-To: \n" |
875 | 11 | "POT-Creation-Date: 2015-05-19 13:10+0800\n" | 11 | "POT-Creation-Date: 2015-12-23 18:53+0800\n" |
876 | 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" | 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
877 | 13 | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | 13 | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" |
878 | 14 | "Language-Team: LANGUAGE <LL@li.org>\n" | 14 | "Language-Team: LANGUAGE <LL@li.org>\n" |
879 | @@ -37,311 +37,247 @@ | |||
880 | 37 | msgstr "" | 37 | msgstr "" |
881 | 38 | 38 | ||
882 | 39 | #: .././checkbox_ng/certification.py:164 .././checkbox_ng/launchpad.py:183 | 39 | #: .././checkbox_ng/certification.py:164 .././checkbox_ng/launchpad.py:183 |
883 | 40 | #, python-brace-format | ||
884 | 41 | msgid "Request to {0} timed out: {1}" | 40 | msgid "Request to {0} timed out: {1}" |
885 | 42 | msgstr "" | 41 | msgstr "" |
886 | 43 | 42 | ||
887 | 44 | #: .././checkbox_ng/certification.py:167 .././checkbox_ng/launchpad.py:186 | 43 | #: .././checkbox_ng/certification.py:167 .././checkbox_ng/launchpad.py:186 |
888 | 45 | #, python-brace-format | ||
889 | 46 | msgid "Invalid destination URL: {0}" | 44 | msgid "Invalid destination URL: {0}" |
890 | 47 | msgstr "" | 45 | msgstr "" |
891 | 48 | 46 | ||
892 | 49 | #: .././checkbox_ng/certification.py:170 .././checkbox_ng/launchpad.py:189 | 47 | #: .././checkbox_ng/certification.py:170 .././checkbox_ng/launchpad.py:189 |
893 | 50 | #, python-brace-format | ||
894 | 51 | msgid "Unable to connect to {0}: {1}" | 48 | msgid "Unable to connect to {0}: {1}" |
895 | 52 | msgstr "" | 49 | msgstr "" |
896 | 53 | 50 | ||
898 | 54 | #: .././checkbox_ng/certification.py:188 | 51 | #: .././checkbox_ng/certification.py:189 |
899 | 55 | msgid "secure_id must be 15 or 18-character alphanumeric string" | 52 | msgid "secure_id must be 15 or 18-character alphanumeric string" |
900 | 56 | msgstr "" | 53 | msgstr "" |
901 | 57 | 54 | ||
903 | 58 | #: .././checkbox_ng/commands/cli.py:76 | 55 | #: .././checkbox_ng/commands/cli.py:70 |
904 | 59 | msgid "run check-config" | 56 | msgid "run check-config" |
905 | 60 | msgstr "" | 57 | msgstr "" |
906 | 61 | 58 | ||
907 | 59 | #: .././checkbox_ng/commands/cli.py:71 | ||
908 | 60 | #: .././checkbox_ng/commands/launcher.py:108 | ||
909 | 61 | msgid "user interface options" | ||
910 | 62 | msgstr "" | ||
911 | 63 | |||
912 | 62 | #: .././checkbox_ng/commands/cli.py:77 | 64 | #: .././checkbox_ng/commands/cli.py:77 |
917 | 63 | msgid "user interface options" | 65 | #: .././checkbox_ng/commands/launcher.py:111 |
914 | 64 | msgstr "" | ||
915 | 65 | |||
916 | 66 | #: .././checkbox_ng/commands/cli.py:83 | ||
918 | 67 | msgid "skip tests that require interactivity" | 66 | msgid "skip tests that require interactivity" |
919 | 68 | msgstr "" | 67 | msgstr "" |
920 | 69 | 68 | ||
922 | 70 | #: .././checkbox_ng/commands/cli.py:86 | 69 | #: .././checkbox_ng/commands/cli.py:80 |
923 | 71 | msgid "don't suppress the output of certain job plugin types" | 70 | msgid "don't suppress the output of certain job plugin types" |
924 | 72 | msgstr "" | 71 | msgstr "" |
925 | 73 | 72 | ||
928 | 74 | #: .././checkbox_ng/commands/newcli.py:121 | 73 | #: .././checkbox_ng/commands/launcher.py:64 |
929 | 75 | #: .././checkbox_ng/commands/newcli.py:132 | 74 | #, python-format |
930 | 75 | msgid "Unable to load launcher definition: %s" | ||
931 | 76 | msgstr "" | ||
932 | 77 | |||
933 | 78 | #: .././checkbox_ng/commands/launcher.py:69 | ||
934 | 79 | msgid "Unable to start launcher because of errors:" | ||
935 | 80 | msgstr "" | ||
936 | 81 | |||
937 | 82 | #: .././checkbox_ng/commands/launcher.py:102 | ||
938 | 83 | msgid "LAUNCHER" | ||
939 | 84 | msgstr "" | ||
940 | 85 | |||
941 | 86 | #: .././checkbox_ng/commands/launcher.py:103 | ||
942 | 87 | msgid "launcher definition file to use" | ||
943 | 88 | msgstr "" | ||
944 | 89 | |||
945 | 90 | #: .././checkbox_ng/commands/newcli.py:119 | ||
946 | 91 | #: .././checkbox_ng/commands/newcli.py:130 | ||
947 | 76 | #, python-format | 92 | #, python-format |
948 | 77 | msgid "Incorrect pattern %r: %s" | 93 | msgid "Incorrect pattern %r: %s" |
949 | 78 | msgstr "" | 94 | msgstr "" |
950 | 79 | 95 | ||
952 | 80 | #: .././checkbox_ng/commands/newcli.py:149 | 96 | #: .././checkbox_ng/commands/newcli.py:147 |
953 | 81 | #, python-format | 97 | #, python-format |
954 | 82 | msgid "There is no test plan: %s" | 98 | msgid "There is no test plan: %s" |
955 | 83 | msgstr "" | 99 | msgstr "" |
956 | 84 | 100 | ||
958 | 85 | #: .././checkbox_ng/commands/newcli.py:235 | 101 | #: .././checkbox_ng/commands/newcli.py:236 |
959 | 86 | #, python-format | 102 | #, python-format |
960 | 87 | msgid "Selected testplans: %r" | 103 | msgid "Selected testplans: %r" |
961 | 88 | msgstr "" | 104 | msgstr "" |
962 | 89 | 105 | ||
964 | 90 | #: .././checkbox_ng/commands/newcli.py:258 | 106 | #: .././checkbox_ng/commands/newcli.py:259 |
965 | 91 | msgid "Suite selection" | 107 | msgid "Suite selection" |
966 | 92 | msgstr "" | 108 | msgstr "" |
967 | 93 | 109 | ||
969 | 94 | #: .././checkbox_ng/commands/newcli.py:261 | 110 | #: .././checkbox_ng/commands/newcli.py:262 |
970 | 95 | msgid "No testplan selected, aborting" | 111 | msgid "No testplan selected, aborting" |
971 | 96 | msgstr "" | 112 | msgstr "" |
972 | 97 | 113 | ||
974 | 98 | #: .././checkbox_ng/commands/newcli.py:299 | 114 | #: .././checkbox_ng/commands/newcli.py:291 |
975 | 99 | msgid "Selecting Job Generators" | 115 | msgid "Selecting Job Generators" |
976 | 100 | msgstr "" | 116 | msgstr "" |
977 | 101 | 117 | ||
979 | 102 | #: .././checkbox_ng/commands/newcli.py:318 | 118 | #: .././checkbox_ng/commands/newcli.py:310 |
980 | 103 | msgid "Selecting Jobs For Execution" | 119 | msgid "Selecting Jobs For Execution" |
981 | 104 | msgstr "" | 120 | msgstr "" |
982 | 105 | 121 | ||
984 | 106 | #: .././checkbox_ng/commands/newcli.py:325 | 122 | #: .././checkbox_ng/commands/newcli.py:317 |
985 | 107 | msgid "Choose tests to run on your system:" | 123 | msgid "Choose tests to run on your system:" |
986 | 108 | msgstr "" | 124 | msgstr "" |
987 | 109 | 125 | ||
989 | 110 | #: .././checkbox_ng/commands/newcli.py:337 | 126 | #: .././checkbox_ng/commands/newcli.py:329 |
990 | 111 | msgid "Results" | 127 | msgid "Results" |
991 | 112 | msgstr "" | 128 | msgstr "" |
992 | 113 | 129 | ||
1000 | 114 | #: .././checkbox_ng/commands/newcli.py:379 | 130 | #: .././checkbox_ng/commands/newcli.py:368 |
994 | 115 | msgid "Saving submission file to {}" | ||
995 | 116 | msgstr "" | ||
996 | 117 | |||
997 | 118 | #. FIXME: replacing extension is ugly | ||
998 | 119 | #: .././checkbox_ng/commands/newcli.py:381 | ||
999 | 120 | #: .././checkbox_ng/commands/newcli.py:384 | ||
1001 | 121 | msgid "View results" | 131 | msgid "View results" |
1002 | 122 | msgstr "" | 132 | msgstr "" |
1003 | 123 | 133 | ||
1006 | 124 | #: .././checkbox_ng/commands/newcli.py:412 | 134 | #: .././checkbox_ng/commands/newcli.py:397 |
1005 | 125 | #, python-brace-format | ||
1007 | 126 | msgid "" | 135 | msgid "" |
1008 | 127 | "\n" | 136 | "\n" |
1009 | 128 | "Submit results to {0}?" | 137 | "Submit results to {0}?" |
1010 | 129 | msgstr "" | 138 | msgstr "" |
1011 | 130 | 139 | ||
1013 | 131 | #: .././checkbox_ng/commands/newcli.py:415 | 140 | #: .././checkbox_ng/commands/newcli.py:400 |
1014 | 132 | msgid "Secure ID: " | 141 | msgid "Secure ID: " |
1015 | 133 | msgstr "" | 142 | msgstr "" |
1016 | 134 | 143 | ||
1018 | 135 | #: .././checkbox_ng/commands/newcli.py:418 | 144 | #: .././checkbox_ng/commands/newcli.py:403 |
1019 | 136 | msgid "ERROR: Secure ID must be 15 or 18-character alphanumeric string" | 145 | msgid "ERROR: Secure ID must be 15 or 18-character alphanumeric string" |
1020 | 137 | msgstr "" | 146 | msgstr "" |
1021 | 138 | 147 | ||
1023 | 139 | #: .././checkbox_ng/commands/newcli.py:436 | 148 | #: .././checkbox_ng/commands/newcli.py:421 |
1024 | 140 | msgid "" | 149 | msgid "" |
1025 | 141 | "\n" | 150 | "\n" |
1026 | 142 | "Submit results to launchpad.net/+hwdb?" | 151 | "Submit results to launchpad.net/+hwdb?" |
1027 | 143 | msgstr "" | 152 | msgstr "" |
1028 | 144 | 153 | ||
1030 | 145 | #: .././checkbox_ng/commands/newcli.py:438 | 154 | #: .././checkbox_ng/commands/newcli.py:423 |
1031 | 146 | msgid "Email address: " | 155 | msgid "Email address: " |
1032 | 147 | msgstr "" | 156 | msgstr "" |
1033 | 148 | 157 | ||
1034 | 149 | #. TRANSLATORS: Do not translate the {} format markers. | 158 | #. TRANSLATORS: Do not translate the {} format markers. |
1038 | 150 | #: .././checkbox_ng/commands/newcli.py:454 | 159 | #: .././checkbox_ng/commands/newcli.py:439 |
1039 | 151 | #, python-brace-format | 160 | msgid "Submitting results to {0} for email_address {1}" |
1037 | 152 | msgid "Submitting results to {0} for email_address {1})" | ||
1040 | 153 | msgstr "" | 161 | msgstr "" |
1041 | 154 | 162 | ||
1042 | 155 | #. TRANSLATORS: Do not translate the {} format marker. | 163 | #. TRANSLATORS: Do not translate the {} format marker. |
1045 | 156 | #: .././checkbox_ng/commands/newcli.py:465 | 164 | #: .././checkbox_ng/commands/newcli.py:450 |
1044 | 157 | #, python-brace-format | ||
1046 | 158 | msgid "Submission uploaded to: {0}" | 165 | msgid "Submission uploaded to: {0}" |
1047 | 159 | msgstr "" | 166 | msgstr "" |
1048 | 160 | 167 | ||
1051 | 161 | #: .././checkbox_ng/commands/newcli.py:471 | 168 | #: .././checkbox_ng/commands/newcli.py:456 |
1050 | 162 | #, python-brace-format | ||
1052 | 163 | msgid "Bad response from {0} transport" | 169 | msgid "Bad response from {0} transport" |
1053 | 164 | msgstr "" | 170 | msgstr "" |
1054 | 165 | 171 | ||
1055 | 166 | #. TRANSLATORS: Do not translate the {} format markers. | 172 | #. TRANSLATORS: Do not translate the {} format markers. |
1059 | 167 | #: .././checkbox_ng/commands/newcli.py:479 | 173 | #: .././checkbox_ng/commands/newcli.py:464 |
1060 | 168 | #, python-brace-format | 174 | msgid "Submitting results to {0} for secure_id {1}" |
1058 | 169 | msgid "Submitting results to {0} for secure_id {1})" | ||
1061 | 170 | msgstr "" | 175 | msgstr "" |
1062 | 171 | 176 | ||
1063 | 172 | #. TRANSLATORS: Do not translate the {} format marker. | 177 | #. TRANSLATORS: Do not translate the {} format marker. |
1067 | 173 | #: .././checkbox_ng/commands/newcli.py:500 | 178 | #: .././checkbox_ng/commands/newcli.py:485 |
1068 | 174 | #: .././checkbox_ng/commands/sru.py:142 | 179 | #: .././checkbox_ng/commands/submit.py:64 |
1066 | 175 | #, python-brace-format | ||
1069 | 176 | msgid "Successfully sent, submission status at {0}" | 180 | msgid "Successfully sent, submission status at {0}" |
1070 | 177 | msgstr "" | 181 | msgstr "" |
1071 | 178 | 182 | ||
1072 | 179 | #. TRANSLATORS: Do not translate the {} format marker. | 183 | #. TRANSLATORS: Do not translate the {} format marker. |
1076 | 180 | #: .././checkbox_ng/commands/newcli.py:504 | 184 | #: .././checkbox_ng/commands/newcli.py:489 |
1077 | 181 | #: .././checkbox_ng/commands/sru.py:145 | 185 | #: .././checkbox_ng/commands/submit.py:68 |
1075 | 182 | #, python-brace-format | ||
1078 | 183 | msgid "Successfully sent, server response: {0}" | 186 | msgid "Successfully sent, server response: {0}" |
1079 | 184 | msgstr "" | 187 | msgstr "" |
1080 | 185 | 188 | ||
1082 | 186 | #: .././checkbox_ng/commands/newcli.py:525 | 189 | #: .././checkbox_ng/commands/newcli.py:514 |
1083 | 187 | msgid "Select jobs to re-run" | 190 | msgid "Select jobs to re-run" |
1084 | 188 | msgstr "" | 191 | msgstr "" |
1085 | 189 | 192 | ||
1147 | 190 | #: .././checkbox_ng/commands/service.py:79 | 193 | #: .././checkbox_ng/commands/sru.py:58 .././checkbox_ng/commands/submit.py:121 |
1148 | 191 | msgid "Setting up DBus objects..." | 194 | msgid "SECURE-ID" |
1149 | 192 | msgstr "" | 195 | msgstr "" |
1150 | 193 | 196 | ||
1151 | 194 | #. TODO: load sessions | 197 | #: .././checkbox_ng/commands/sru.py:61 |
1152 | 195 | #: .././checkbox_ng/commands/service.py:81 | 198 | msgid "Canonical hardware identifier" |
1153 | 196 | msgid "Constructing Service object" | 199 | msgstr "" |
1154 | 197 | msgstr "" | 200 | |
1155 | 198 | 201 | #: .././checkbox_ng/commands/sru.py:65 | |
1156 | 199 | #: .././checkbox_ng/commands/service.py:83 | 202 | msgid "TEST-PLAN-ID" |
1157 | 200 | msgid "Constructing ServiceWrapper" | 203 | msgstr "" |
1158 | 201 | msgstr "" | 204 | |
1159 | 202 | 205 | #. TRANSLATORS: this is in imperative form | |
1160 | 203 | #: .././checkbox_ng/commands/service.py:85 | 206 | #: .././checkbox_ng/commands/sru.py:68 |
1161 | 204 | msgid "Publishing all objects on DBus" | 207 | msgid "load the specified test plan" |
1162 | 205 | msgstr "" | 208 | msgstr "" |
1163 | 206 | 209 | ||
1164 | 207 | #: .././checkbox_ng/commands/service.py:88 | 210 | #: .././checkbox_ng/commands/sru.py:71 .././checkbox_ng/config.py:88 |
1165 | 208 | msgid "Publishing all managed objects (events should fire there)" | 211 | msgid "Send the data to non-production test server" |
1166 | 209 | msgstr "" | 212 | msgstr "" |
1167 | 210 | 213 | ||
1168 | 211 | #: .././checkbox_ng/commands/service.py:90 | 214 | #: .././checkbox_ng/commands/sru.py:75 |
1169 | 212 | #, python-format | 215 | msgid "run check-config before starting" |
1170 | 213 | msgid "Attempting to claim bus name: %s" | 216 | msgstr "" |
1171 | 214 | msgstr "" | 217 | |
1111 | 215 | |||
1112 | 216 | #: .././checkbox_ng/commands/service.py:93 | ||
1113 | 217 | #, python-format | ||
1114 | 218 | msgid "PlainBox DBus service ready, claimed name: %s" | ||
1115 | 219 | msgstr "" | ||
1116 | 220 | |||
1117 | 221 | #: .././checkbox_ng/commands/service.py:99 | ||
1118 | 222 | msgid "" | ||
1119 | 223 | "Main loop interrupted! It is recommended to call the Exit() method on the " | ||
1120 | 224 | "exported service object instead" | ||
1121 | 225 | msgstr "" | ||
1122 | 226 | |||
1123 | 227 | #: .././checkbox_ng/commands/service.py:103 | ||
1124 | 228 | #, python-format | ||
1125 | 229 | msgid "Releasing %s" | ||
1126 | 230 | msgstr "" | ||
1127 | 231 | |||
1128 | 232 | #: .././checkbox_ng/commands/service.py:108 | ||
1129 | 233 | #, python-format | ||
1130 | 234 | msgid "Closing %s" | ||
1131 | 235 | msgstr "" | ||
1132 | 236 | |||
1133 | 237 | #: .././checkbox_ng/commands/service.py:110 | ||
1134 | 238 | msgid "Main loop terminated, exiting..." | ||
1135 | 239 | msgstr "" | ||
1136 | 240 | |||
1137 | 241 | #: .././checkbox_ng/commands/service.py:122 | ||
1138 | 242 | msgid "spawn dbus service" | ||
1139 | 243 | msgstr "" | ||
1140 | 244 | |||
1141 | 245 | #: .././checkbox_ng/commands/service.py:129 | ||
1142 | 246 | msgid "use the specified DBus bus name" | ||
1143 | 247 | msgstr "" | ||
1144 | 248 | |||
1145 | 249 | #. Handle possible DependencyDuplicateError that can happen if | ||
1146 | 250 | #. someone is using plainbox for job development. | ||
1172 | 251 | #: .././checkbox_ng/commands/sru.py:88 | 218 | #: .././checkbox_ng/commands/sru.py:88 |
1192 | 252 | msgid "The job database you are currently using is broken" | 219 | msgid "Configuration problems prevent running SRU tests" |
1193 | 253 | msgstr "" | 220 | msgstr "" |
1194 | 254 | 221 | ||
1195 | 255 | #: .././checkbox_ng/commands/sru.py:89 | 222 | #: .././checkbox_ng/commands/sru.py:113 |
1196 | 256 | #, python-brace-format | 223 | msgid "Results saved to {0}" |
1178 | 257 | msgid "At least two jobs contend for the name {0}" | ||
1179 | 258 | msgstr "" | ||
1180 | 259 | |||
1181 | 260 | #: .././checkbox_ng/commands/sru.py:91 | ||
1182 | 261 | #, python-brace-format | ||
1183 | 262 | msgid "Second job defined in: {0}" | ||
1184 | 263 | msgstr "" | ||
1185 | 264 | |||
1186 | 265 | #: .././checkbox_ng/commands/sru.py:112 | ||
1187 | 266 | msgid "There were some problems with the selected jobs" | ||
1188 | 267 | msgstr "" | ||
1189 | 268 | |||
1190 | 269 | #: .././checkbox_ng/commands/sru.py:115 | ||
1191 | 270 | msgid "Problematic jobs will not be considered" | ||
1197 | 271 | msgstr "" | 224 | msgstr "" |
1198 | 272 | 225 | ||
1199 | 273 | #: .././checkbox_ng/commands/sru.py:118 | 226 | #: .././checkbox_ng/commands/sru.py:118 |
1228 | 274 | #, python-brace-format | 227 | msgid "Sending hardware report to Canonical Certification" |
1229 | 275 | msgid "Saving results to {0}" | 228 | msgstr "" |
1230 | 276 | msgstr "" | 229 | |
1231 | 277 | 230 | #: .././checkbox_ng/commands/sru.py:119 | |
1232 | 278 | #: .././checkbox_ng/commands/sru.py:125 | 231 | msgid "Server URL is: {0}" |
1233 | 279 | #, python-brace-format | 232 | msgstr "" |
1234 | 280 | msgid "Submitting results to {0} for secure_id {1}" | 233 | |
1235 | 281 | msgstr "" | 234 | #: .././checkbox_ng/commands/sru.py:131 |
1236 | 282 | 235 | msgid "SRU Session" | |
1237 | 283 | #: .././checkbox_ng/commands/sru.py:150 | 236 | msgstr "" |
1238 | 284 | #, python-brace-format | 237 | |
1239 | 285 | msgid "Problem reading a file: {0}" | 238 | #: .././checkbox_ng/commands/sru.py:172 |
1212 | 286 | msgstr "" | ||
1213 | 287 | |||
1214 | 288 | #: .././checkbox_ng/commands/sru.py:180 | ||
1215 | 289 | #, python-brace-format | ||
1216 | 290 | msgid "comments: {0}" | ||
1217 | 291 | msgstr "" | ||
1218 | 292 | |||
1219 | 293 | #: .././checkbox_ng/commands/sru.py:182 | ||
1220 | 294 | msgid "inhibitors:" | ||
1221 | 295 | msgstr "" | ||
1222 | 296 | |||
1223 | 297 | #: .././checkbox_ng/commands/sru.py:220 | ||
1224 | 298 | msgid "Configuration problems prevent running SRU tests" | ||
1225 | 299 | msgstr "" | ||
1226 | 300 | |||
1227 | 301 | #: .././checkbox_ng/commands/sru.py:236 | ||
1240 | 302 | msgid "run automated stable release update tests" | 239 | msgid "run automated stable release update tests" |
1241 | 303 | msgstr "" | 240 | msgstr "" |
1242 | 304 | 241 | ||
1268 | 305 | #: .././checkbox_ng/commands/sru.py:241 | 242 | #. TRANSLATORS: please leave various options (both long and short forms), |
1269 | 306 | msgid "run check-config before starting" | 243 | #. environment variables and paths in their original form. Also keep the |
1270 | 307 | msgstr "" | 244 | #. special @EPILOG@ string. The first line of the translation is special and |
1271 | 308 | 245 | #. is used as the help message. Please keep the pseudo-statement form and | |
1272 | 309 | #: .././checkbox_ng/commands/sru.py:249 | 246 | #. don't finish the sentence with a dot. Pay extra attention to whitespace. |
1273 | 310 | msgid "SECURE-ID" | 247 | #. It must be correctly preserved or the result won't work. In particular |
1274 | 311 | msgstr "" | 248 | #. the leading whitespace *must* be preserved and *must* have the same |
1275 | 312 | 249 | #. length on each line. | |
1276 | 313 | #. TRANSLATORS: Do not translate %(default) | 250 | #: .././checkbox_ng/commands/submit.py:81 |
1277 | 314 | #: .././checkbox_ng/commands/sru.py:254 | 251 | msgid "" |
1278 | 315 | #, python-format | 252 | "\n" |
1279 | 316 | msgid "associate submission with a machine using this SECURE-ID (%(default)s)" | 253 | " submit test results to the Canonical certification website\n" |
1280 | 317 | msgstr "" | 254 | "\n" |
1281 | 318 | 255 | " This command sends the XML results file to the Certification website.\n" | |
1282 | 319 | #: .././checkbox_ng/commands/sru.py:257 | 256 | " " |
1283 | 320 | msgid "FILE" | 257 | msgstr "" |
1284 | 321 | msgstr "" | 258 | |
1285 | 322 | 259 | #: .././checkbox_ng/commands/submit.py:98 | |
1286 | 323 | #. TRANSLATORS: Do not translate %(default)s | 260 | msgid "submit test results to the Canonical certification website" |
1287 | 324 | #: .././checkbox_ng/commands/sru.py:262 | 261 | msgstr "" |
1288 | 325 | #, python-format | 262 | |
1289 | 326 | msgid "if submission fails save the test report as FILE (%(default)s)" | 263 | #: .././checkbox_ng/commands/submit.py:104 |
1290 | 327 | msgstr "" | 264 | msgid "The path to the results xml file" |
1291 | 328 | 265 | msgstr "" | |
1292 | 329 | #: .././checkbox_ng/commands/sru.py:265 | 266 | |
1293 | 267 | #: .././checkbox_ng/commands/submit.py:114 | ||
1294 | 268 | msgid "must be 15 or 18-character alphanumeric string" | ||
1295 | 269 | msgstr "" | ||
1296 | 270 | |||
1297 | 271 | #: .././checkbox_ng/commands/submit.py:124 | ||
1298 | 272 | msgid "associate submission with a machine using this SECURE-ID" | ||
1299 | 273 | msgstr "" | ||
1300 | 274 | |||
1301 | 275 | #: .././checkbox_ng/commands/submit.py:152 | ||
1302 | 330 | msgid "URL" | 276 | msgid "URL" |
1303 | 331 | msgstr "" | 277 | msgstr "" |
1304 | 332 | 278 | ||
1317 | 333 | #. TRANSLATORS: Do not translate %(default)s | 279 | #: .././checkbox_ng/commands/submit.py:154 |
1318 | 334 | #: .././checkbox_ng/commands/sru.py:269 | 280 | msgid "destination to submit to" |
1307 | 335 | #, python-format | ||
1308 | 336 | msgid "POST the test report XML to this URL (%(default)s)" | ||
1309 | 337 | msgstr "" | ||
1310 | 338 | |||
1311 | 339 | #: .././checkbox_ng/commands/sru.py:277 | ||
1312 | 340 | msgid "override --destination to use the staging certification website" | ||
1313 | 341 | msgstr "" | ||
1314 | 342 | |||
1315 | 343 | #: .././checkbox_ng/commands/sru.py:284 | ||
1316 | 344 | msgid "don't really run most jobs" | ||
1319 | 345 | msgstr "" | 281 | msgstr "" |
1320 | 346 | 282 | ||
1321 | 347 | #: .././checkbox_ng/config.py:43 | 283 | #: .././checkbox_ng/config.py:43 |
1322 | @@ -376,13 +312,81 @@ | |||
1323 | 376 | msgid "Optional whitelist with which to run SRU testing" | 312 | msgid "Optional whitelist with which to run SRU testing" |
1324 | 377 | msgstr "" | 313 | msgstr "" |
1325 | 378 | 314 | ||
1326 | 315 | #: .././checkbox_ng/config.py:82 | ||
1327 | 316 | msgid "Optional test plan with which to run SRU testing" | ||
1328 | 317 | msgstr "" | ||
1329 | 318 | |||
1330 | 319 | #: .././checkbox_ng/launcher.py:47 | ||
1331 | 320 | msgid "Application Title" | ||
1332 | 321 | msgstr "" | ||
1333 | 322 | |||
1334 | 323 | #: .././checkbox_ng/launcher.py:51 | ||
1335 | 324 | msgid "Welcome Message" | ||
1336 | 325 | msgstr "" | ||
1337 | 326 | |||
1338 | 327 | #. TODO: valid regexp text validator | ||
1339 | 328 | #: .././checkbox_ng/launcher.py:56 | ||
1340 | 329 | msgid "Pattern that whitelists need to match to be displayed" | ||
1341 | 330 | msgstr "" | ||
1342 | 331 | |||
1343 | 332 | #. TODO: valid regexp text validator | ||
1344 | 333 | #: .././checkbox_ng/launcher.py:61 | ||
1345 | 334 | msgid "Pattern that whitelists need to match to be selected" | ||
1346 | 335 | msgstr "" | ||
1347 | 336 | |||
1348 | 337 | #: .././checkbox_ng/launcher.py:67 | ||
1349 | 338 | msgid "If enabled then suite selection screen is not displayed" | ||
1350 | 339 | msgstr "" | ||
1351 | 340 | |||
1352 | 341 | #: .././checkbox_ng/launcher.py:73 | ||
1353 | 342 | msgid "If enabled then test selection screen is not displayed" | ||
1354 | 343 | msgstr "" | ||
1355 | 344 | |||
1356 | 345 | #. TODO: probably a choice validator | ||
1357 | 346 | #: .././checkbox_ng/launcher.py:78 | ||
1358 | 347 | msgid "Type of the input field?" | ||
1359 | 348 | msgstr "" | ||
1360 | 349 | |||
1361 | 350 | #: .././checkbox_ng/launcher.py:82 | ||
1362 | 351 | msgid "Label on the 'send' button" | ||
1363 | 352 | msgstr "" | ||
1364 | 353 | |||
1365 | 354 | #. TODO: default? | ||
1366 | 355 | #: .././checkbox_ng/launcher.py:88 | ||
1367 | 356 | msgid "If enabled then test results will be also sent to HEXR" | ||
1368 | 357 | msgstr "" | ||
1369 | 358 | |||
1370 | 359 | #: .././checkbox_ng/launcher.py:93 | ||
1371 | 360 | msgid "Where to submit the test results to" | ||
1372 | 361 | msgstr "" | ||
1373 | 362 | |||
1374 | 363 | #: .././checkbox_ng/launcher.py:98 | ||
1375 | 364 | msgid "" | ||
1376 | 365 | "HTTP endpoint to submit data to, using the transport specified with " | ||
1377 | 366 | "submit_to." | ||
1378 | 367 | msgstr "" | ||
1379 | 368 | |||
1380 | 369 | #: .././checkbox_ng/launcher.py:104 | ||
1381 | 370 | msgid "Secure ID to identify the system this submission belongs to." | ||
1382 | 371 | msgstr "" | ||
1383 | 372 | |||
1384 | 373 | #: .././checkbox_ng/launcher.py:109 | ||
1385 | 374 | msgid "Name of custom configuration file" | ||
1386 | 375 | msgstr "" | ||
1387 | 376 | |||
1388 | 377 | #: .././checkbox_ng/launcher.py:113 | ||
1389 | 378 | msgid "Don't suppress the output of certain job plugin types." | ||
1390 | 379 | msgstr "" | ||
1391 | 380 | |||
1392 | 381 | #: .././checkbox_ng/launcher.py:116 | ||
1393 | 382 | msgid "Section with only exported unit ids as keys (no values)" | ||
1394 | 383 | msgstr "" | ||
1395 | 384 | |||
1396 | 379 | #: .././checkbox_ng/launchpad.py:66 | 385 | #: .././checkbox_ng/launchpad.py:66 |
1397 | 380 | #, python-brace-format | ||
1398 | 381 | msgid "Cannot get {0} resource job" | 386 | msgid "Cannot get {0} resource job" |
1399 | 382 | msgstr "" | 387 | msgstr "" |
1400 | 383 | 388 | ||
1401 | 384 | #: .././checkbox_ng/launchpad.py:70 | 389 | #: .././checkbox_ng/launchpad.py:70 |
1402 | 385 | #, python-brace-format | ||
1403 | 386 | msgid "{0} has no attribute {1}" | 390 | msgid "{0} has no attribute {1}" |
1404 | 387 | msgstr "" | 391 | msgstr "" |
1405 | 388 | 392 | ||
1406 | @@ -403,180 +407,22 @@ | |||
1407 | 403 | msgid "The submission was uploaded to Launchpad successfully" | 407 | msgid "The submission was uploaded to Launchpad successfully" |
1408 | 404 | msgstr "" | 408 | msgstr "" |
1409 | 405 | 409 | ||
1410 | 406 | #: .././checkbox_ng/service.py:37 | ||
1411 | 407 | msgid "DBus parts require 'funcsigs' from pypi." | ||
1412 | 408 | msgstr "" | ||
1413 | 409 | |||
1414 | 410 | #: .././checkbox_ng/service.py:86 | ||
1415 | 411 | #, python-format | ||
1416 | 412 | msgid "Created DBus wrapper %s for: %r" | ||
1417 | 413 | msgstr "" | ||
1418 | 414 | |||
1419 | 415 | #: .././checkbox_ng/service.py:90 | ||
1420 | 416 | #, python-format | ||
1421 | 417 | msgid "DBus wrapper %s died" | ||
1422 | 418 | msgstr "" | ||
1423 | 419 | |||
1424 | 420 | #: .././checkbox_ng/service.py:122 | ||
1425 | 421 | #, python-format | ||
1426 | 422 | msgid "Published DBus wrapper for %r as %s" | ||
1427 | 423 | msgstr "" | ||
1428 | 424 | |||
1429 | 425 | #: .././checkbox_ng/service.py:169 .././checkbox_ng/service.py:180 | ||
1430 | 426 | #, python-brace-format | ||
1431 | 427 | msgid "object path {0} does not designate an existing object" | ||
1432 | 428 | msgstr "" | ||
1433 | 429 | |||
1434 | 430 | #: .././checkbox_ng/service.py:188 | ||
1435 | 431 | #, python-format | ||
1436 | 432 | msgid "" | ||
1437 | 433 | "Application error: %r should have returned native object but returned " | ||
1438 | 434 | "wrapper instead" | ||
1439 | 435 | msgstr "" | ||
1440 | 436 | |||
1441 | 437 | #: .././checkbox_ng/service.py:195 .././checkbox_ng/service.py:206 | ||
1442 | 438 | #: .././checkbox_ng/service.py:217 | ||
1443 | 439 | #, python-brace-format | ||
1444 | 440 | msgid "({0}) internal error, unable to lookup object wrapper" | ||
1445 | 441 | msgstr "" | ||
1446 | 442 | |||
1447 | 443 | #: .././checkbox_ng/service.py:224 | ||
1448 | 444 | #, python-format | ||
1449 | 445 | msgid "wrapped %s called with %s" | ||
1450 | 446 | msgstr "" | ||
1451 | 447 | |||
1452 | 448 | #: .././checkbox_ng/service.py:240 .././checkbox_ng/service.py:256 | ||
1453 | 449 | msgid "unsupported translation {!r}" | ||
1454 | 450 | msgstr "" | ||
1455 | 451 | |||
1456 | 452 | #: .././checkbox_ng/service.py:243 | ||
1457 | 453 | #, python-format | ||
1458 | 454 | msgid "unwrapped %s called with %s" | ||
1459 | 455 | msgstr "" | ||
1460 | 456 | |||
1461 | 457 | #: .././checkbox_ng/service.py:245 | ||
1462 | 458 | #, python-format | ||
1463 | 459 | msgid "unwrapped %s returned %r" | ||
1464 | 460 | msgstr "" | ||
1465 | 461 | |||
1466 | 462 | #: .././checkbox_ng/service.py:258 | ||
1467 | 463 | #, python-format | ||
1468 | 464 | msgid "wrapped %s returned %r" | ||
1469 | 465 | msgstr "" | ||
1470 | 466 | |||
1471 | 467 | #: .././checkbox_ng/service.py:769 | ||
1472 | 468 | #, python-format | ||
1473 | 469 | msgid "Adding result %r to DBus" | ||
1474 | 470 | msgstr "" | ||
1475 | 471 | |||
1476 | 472 | #: .././checkbox_ng/service.py:788 | ||
1477 | 473 | #, python-format | ||
1478 | 474 | msgid "Removing result %r from DBus" | ||
1479 | 475 | msgstr "" | ||
1480 | 476 | |||
1481 | 477 | #: .././checkbox_ng/service.py:811 | ||
1482 | 478 | #, python-format | ||
1483 | 479 | msgid "Adding job %r to DBus" | ||
1484 | 480 | msgstr "" | ||
1485 | 481 | |||
1486 | 482 | #: .././checkbox_ng/service.py:843 | ||
1487 | 483 | #, python-format | ||
1488 | 484 | msgid "Adding job state %r to DBus" | ||
1489 | 485 | msgstr "" | ||
1490 | 486 | |||
1491 | 487 | #: .././checkbox_ng/service.py:875 | ||
1492 | 488 | #, python-brace-format | ||
1493 | 489 | msgid "Unable to wrap object of type {0}" | ||
1494 | 490 | msgstr "" | ||
1495 | 491 | |||
1496 | 492 | #: .././checkbox_ng/service.py:1000 | ||
1497 | 493 | msgid "Remove() completed" | ||
1498 | 494 | msgstr "" | ||
1499 | 495 | |||
1500 | 496 | #: .././checkbox_ng/service.py:1075 | ||
1501 | 497 | #, python-format | ||
1502 | 498 | msgid "AskForOutcome(%r) suggested outcome is (%s)" | ||
1503 | 499 | msgstr "" | ||
1504 | 500 | |||
1505 | 501 | #. NOTE: this should: | ||
1506 | 502 | #. 1) attempt to cancel the future in the extremely rare case where it | ||
1507 | 503 | #. is not started yet | ||
1508 | 504 | #. 2) kill the job otherwise | ||
1509 | 505 | #: .././checkbox_ng/service.py:1391 | ||
1510 | 506 | msgid "Kill() is not implemented" | ||
1511 | 507 | msgstr "" | ||
1512 | 508 | |||
1513 | 509 | #: .././checkbox_ng/service.py:1411 | ||
1514 | 510 | msgid "RunCommand() should not be called for automated jobs" | ||
1515 | 511 | msgstr "" | ||
1516 | 512 | |||
1517 | 513 | #: .././checkbox_ng/service.py:1413 | ||
1518 | 514 | msgid "RunCommand() is starting to run the job" | ||
1519 | 515 | msgstr "" | ||
1520 | 516 | |||
1521 | 517 | #: .././checkbox_ng/service.py:1417 | ||
1522 | 518 | msgid "RunCommand() ignored, waiting for command to finish" | ||
1523 | 519 | msgstr "" | ||
1524 | 520 | |||
1525 | 521 | #: .././checkbox_ng/service.py:1435 | ||
1526 | 522 | msgid "SetOutcome() called while the command is still running!" | ||
1527 | 523 | msgstr "" | ||
1528 | 524 | |||
1529 | 525 | #: .././checkbox_ng/service.py:1442 | ||
1530 | 526 | msgid "SetOutcome() called before RunCommand()" | ||
1531 | 527 | msgstr "" | ||
1532 | 528 | |||
1533 | 529 | #. TRANSLATORS: don't translate 'manual' translate it as | ||
1534 | 530 | #. 'of type manual' and leave the 'manual' string | ||
1535 | 531 | #. intact. | ||
1536 | 532 | #: .././checkbox_ng/service.py:1447 | ||
1537 | 533 | #, python-format | ||
1538 | 534 | msgid "But the job is not manual, it is %s" | ||
1539 | 535 | msgstr "" | ||
1540 | 536 | |||
1541 | 537 | #: .././checkbox_ng/service.py:1480 | ||
1542 | 538 | msgid "outcome_from_command() called too early!" | ||
1543 | 539 | msgstr "" | ||
1544 | 540 | |||
1545 | 541 | #: .././checkbox_ng/service.py:1481 | ||
1546 | 542 | msgid "There is nothing to return yet" | ||
1547 | 543 | msgstr "" | ||
1548 | 544 | |||
1549 | 545 | #: .././checkbox_ng/service.py:1522 | ||
1550 | 546 | msgid "Sending ShowInteractiveUI() and not starting the job..." | ||
1551 | 547 | msgstr "" | ||
1552 | 548 | |||
1553 | 549 | #: .././checkbox_ng/service.py:1526 | ||
1554 | 550 | #, python-format | ||
1555 | 551 | msgid "Running %r right away" | ||
1556 | 552 | msgstr "" | ||
1557 | 553 | |||
1558 | 554 | #: .././checkbox_ng/service.py:1563 | ||
1559 | 555 | #, python-format | ||
1560 | 556 | msgid "calling JobResultAvailable(%r, %r)" | ||
1561 | 557 | msgstr "" | ||
1562 | 558 | |||
1563 | 559 | #: .././checkbox_ng/service.py:1570 | ||
1564 | 560 | msgid "" | ||
1565 | 561 | "sending AskForOutcome() after job finished running with OUTCOME_UNDECIDED" | ||
1566 | 562 | msgstr "" | ||
1567 | 563 | |||
1568 | 564 | #: .././checkbox_ng/ui.py:73 | 410 | #: .././checkbox_ng/ui.py:73 |
1569 | 565 | msgid "< Continue >" | 411 | msgid "< Continue >" |
1570 | 566 | msgstr "" | 412 | msgstr "" |
1571 | 567 | 413 | ||
1573 | 568 | #: .././checkbox_ng/ui.py:191 .././checkbox_ng/ui.py:318 | 414 | #: .././checkbox_ng/ui.py:194 .././checkbox_ng/ui.py:321 |
1574 | 569 | msgid "Enter" | 415 | msgid "Enter" |
1575 | 570 | msgstr "" | 416 | msgstr "" |
1576 | 571 | 417 | ||
1578 | 572 | #: .././checkbox_ng/ui.py:194 .././checkbox_ng/ui.py:321 | 418 | #: .././checkbox_ng/ui.py:197 .././checkbox_ng/ui.py:324 |
1579 | 573 | msgid ": Expand/Collapse" | 419 | msgid ": Expand/Collapse" |
1580 | 574 | msgstr "" | 420 | msgstr "" |
1581 | 575 | 421 | ||
1583 | 576 | #: .././checkbox_ng/ui.py:210 | 422 | #: .././checkbox_ng/ui.py:213 |
1584 | 577 | msgid "Start " | 423 | msgid "Start " |
1585 | 578 | msgstr "" | 424 | msgstr "" |
1586 | 579 | 425 | ||
1588 | 580 | #: .././checkbox_ng/ui.py:342 | 426 | #: .././checkbox_ng/ui.py:345 |
1589 | 581 | msgid "inish" | 427 | msgid "inish" |
1590 | 582 | msgstr "" | 428 | msgstr "" |
1591 | 583 | 429 | ||
1592 | === modified file 'checkbox-ng/po/es.po' | |||
1593 | --- checkbox-ng/po/es.po 2015-09-15 05:10:23 +0000 | |||
1594 | +++ checkbox-ng/po/es.po 2016-01-05 21:24:37 +0000 | |||
1595 | @@ -6,16 +6,17 @@ | |||
1596 | 6 | msgid "" | 6 | msgid "" |
1597 | 7 | msgstr "" | 7 | msgstr "" |
1598 | 8 | "Project-Id-Version: checkbox\n" | 8 | "Project-Id-Version: checkbox\n" |
1601 | 9 | "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" | 9 | "Report-Msgid-Bugs-To: \n" |
1602 | 10 | "POT-Creation-Date: 2015-05-19 13:10+0800\n" | 10 | "POT-Creation-Date: 2015-12-23 18:53+0800\n" |
1603 | 11 | "PO-Revision-Date: 2015-04-05 09:48+0000\n" | 11 | "PO-Revision-Date: 2015-04-05 09:48+0000\n" |
1604 | 12 | "Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n" | 12 | "Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n" |
1605 | 13 | "Language-Team: Spanish <es@li.org>\n" | 13 | "Language-Team: Spanish <es@li.org>\n" |
1606 | 14 | "MIME-Version: 1.0\n" | 14 | "MIME-Version: 1.0\n" |
1607 | 15 | "Content-Type: text/plain; charset=UTF-8\n" | 15 | "Content-Type: text/plain; charset=UTF-8\n" |
1608 | 16 | "Content-Transfer-Encoding: 8bit\n" | 16 | "Content-Transfer-Encoding: 8bit\n" |
1611 | 17 | "X-Launchpad-Export-Date: 2015-09-15 05:10+0000\n" | 17 | "X-Launchpad-Export-Date: 2015-12-26 05:07+0000\n" |
1612 | 18 | "X-Generator: Launchpad (build 17737)\n" | 18 | "X-Generator: Launchpad (build 17865)\n" |
1613 | 19 | "Language: es\n" | ||
1614 | 19 | 20 | ||
1615 | 20 | #: .././checkbox_ng/certification.py:135 | 21 | #: .././checkbox_ng/certification.py:135 |
1616 | 21 | msgid "Secure ID not specified" | 22 | msgid "Secure ID not specified" |
1617 | @@ -37,312 +38,247 @@ | |||
1618 | 37 | msgstr "" | 38 | msgstr "" |
1619 | 38 | 39 | ||
1620 | 39 | #: .././checkbox_ng/certification.py:164 .././checkbox_ng/launchpad.py:183 | 40 | #: .././checkbox_ng/certification.py:164 .././checkbox_ng/launchpad.py:183 |
1621 | 40 | #, python-brace-format | ||
1622 | 41 | msgid "Request to {0} timed out: {1}" | 41 | msgid "Request to {0} timed out: {1}" |
1623 | 42 | msgstr "Se agotó el tiempo de espera de conexión con {0}: {1}" | 42 | msgstr "Se agotó el tiempo de espera de conexión con {0}: {1}" |
1624 | 43 | 43 | ||
1625 | 44 | #: .././checkbox_ng/certification.py:167 .././checkbox_ng/launchpad.py:186 | 44 | #: .././checkbox_ng/certification.py:167 .././checkbox_ng/launchpad.py:186 |
1626 | 45 | #, python-brace-format | ||
1627 | 46 | msgid "Invalid destination URL: {0}" | 45 | msgid "Invalid destination URL: {0}" |
1628 | 47 | msgstr "URL de destino no válido: {0}" | 46 | msgstr "URL de destino no válido: {0}" |
1629 | 48 | 47 | ||
1630 | 49 | #: .././checkbox_ng/certification.py:170 .././checkbox_ng/launchpad.py:189 | 48 | #: .././checkbox_ng/certification.py:170 .././checkbox_ng/launchpad.py:189 |
1631 | 50 | #, python-brace-format | ||
1632 | 51 | msgid "Unable to connect to {0}: {1}" | 49 | msgid "Unable to connect to {0}: {1}" |
1633 | 52 | msgstr "No se pudo conectar con {0}: {1}" | 50 | msgstr "No se pudo conectar con {0}: {1}" |
1634 | 53 | 51 | ||
1636 | 54 | #: .././checkbox_ng/certification.py:188 | 52 | #: .././checkbox_ng/certification.py:189 |
1637 | 55 | msgid "secure_id must be 15 or 18-character alphanumeric string" | 53 | msgid "secure_id must be 15 or 18-character alphanumeric string" |
1638 | 56 | msgstr "" | 54 | msgstr "" |
1639 | 57 | 55 | ||
1641 | 58 | #: .././checkbox_ng/commands/cli.py:76 | 56 | #: .././checkbox_ng/commands/cli.py:70 |
1642 | 59 | msgid "run check-config" | 57 | msgid "run check-config" |
1643 | 60 | msgstr "" | 58 | msgstr "" |
1644 | 61 | 59 | ||
1646 | 62 | #: .././checkbox_ng/commands/cli.py:77 | 60 | #: .././checkbox_ng/commands/cli.py:71 |
1647 | 61 | #: .././checkbox_ng/commands/launcher.py:108 | ||
1648 | 63 | msgid "user interface options" | 62 | msgid "user interface options" |
1649 | 64 | msgstr "opciones de interfaz de usuario" | 63 | msgstr "opciones de interfaz de usuario" |
1650 | 65 | 64 | ||
1652 | 66 | #: .././checkbox_ng/commands/cli.py:83 | 65 | #: .././checkbox_ng/commands/cli.py:77 |
1653 | 66 | #: .././checkbox_ng/commands/launcher.py:111 | ||
1654 | 67 | msgid "skip tests that require interactivity" | 67 | msgid "skip tests that require interactivity" |
1655 | 68 | msgstr "" | 68 | msgstr "" |
1656 | 69 | 69 | ||
1658 | 70 | #: .././checkbox_ng/commands/cli.py:86 | 70 | #: .././checkbox_ng/commands/cli.py:80 |
1659 | 71 | msgid "don't suppress the output of certain job plugin types" | 71 | msgid "don't suppress the output of certain job plugin types" |
1660 | 72 | msgstr "" | 72 | msgstr "" |
1661 | 73 | 73 | ||
1664 | 74 | #: .././checkbox_ng/commands/newcli.py:121 | 74 | #: .././checkbox_ng/commands/launcher.py:64 |
1665 | 75 | #: .././checkbox_ng/commands/newcli.py:132 | 75 | #, python-format |
1666 | 76 | msgid "Unable to load launcher definition: %s" | ||
1667 | 77 | msgstr "" | ||
1668 | 78 | |||
1669 | 79 | #: .././checkbox_ng/commands/launcher.py:69 | ||
1670 | 80 | msgid "Unable to start launcher because of errors:" | ||
1671 | 81 | msgstr "" | ||
1672 | 82 | |||
1673 | 83 | #: .././checkbox_ng/commands/launcher.py:102 | ||
1674 | 84 | msgid "LAUNCHER" | ||
1675 | 85 | msgstr "" | ||
1676 | 86 | |||
1677 | 87 | #: .././checkbox_ng/commands/launcher.py:103 | ||
1678 | 88 | msgid "launcher definition file to use" | ||
1679 | 89 | msgstr "" | ||
1680 | 90 | |||
1681 | 91 | #: .././checkbox_ng/commands/newcli.py:119 | ||
1682 | 92 | #: .././checkbox_ng/commands/newcli.py:130 | ||
1683 | 76 | #, python-format | 93 | #, python-format |
1684 | 77 | msgid "Incorrect pattern %r: %s" | 94 | msgid "Incorrect pattern %r: %s" |
1685 | 78 | msgstr "" | 95 | msgstr "" |
1686 | 79 | 96 | ||
1688 | 80 | #: .././checkbox_ng/commands/newcli.py:149 | 97 | #: .././checkbox_ng/commands/newcli.py:147 |
1689 | 81 | #, python-format | 98 | #, python-format |
1690 | 82 | msgid "There is no test plan: %s" | 99 | msgid "There is no test plan: %s" |
1691 | 83 | msgstr "" | 100 | msgstr "" |
1692 | 84 | 101 | ||
1694 | 85 | #: .././checkbox_ng/commands/newcli.py:235 | 102 | #: .././checkbox_ng/commands/newcli.py:236 |
1695 | 86 | #, python-format | 103 | #, python-format |
1696 | 87 | msgid "Selected testplans: %r" | 104 | msgid "Selected testplans: %r" |
1697 | 88 | msgstr "" | 105 | msgstr "" |
1698 | 89 | 106 | ||
1700 | 90 | #: .././checkbox_ng/commands/newcli.py:258 | 107 | #: .././checkbox_ng/commands/newcli.py:259 |
1701 | 91 | msgid "Suite selection" | 108 | msgid "Suite selection" |
1702 | 92 | msgstr "" | 109 | msgstr "" |
1703 | 93 | 110 | ||
1705 | 94 | #: .././checkbox_ng/commands/newcli.py:261 | 111 | #: .././checkbox_ng/commands/newcli.py:262 |
1706 | 95 | msgid "No testplan selected, aborting" | 112 | msgid "No testplan selected, aborting" |
1707 | 96 | msgstr "" | 113 | msgstr "" |
1708 | 97 | 114 | ||
1710 | 98 | #: .././checkbox_ng/commands/newcli.py:299 | 115 | #: .././checkbox_ng/commands/newcli.py:291 |
1711 | 99 | msgid "Selecting Job Generators" | 116 | msgid "Selecting Job Generators" |
1712 | 100 | msgstr "" | 117 | msgstr "" |
1713 | 101 | 118 | ||
1715 | 102 | #: .././checkbox_ng/commands/newcli.py:318 | 119 | #: .././checkbox_ng/commands/newcli.py:310 |
1716 | 103 | msgid "Selecting Jobs For Execution" | 120 | msgid "Selecting Jobs For Execution" |
1717 | 104 | msgstr "" | 121 | msgstr "" |
1718 | 105 | 122 | ||
1720 | 106 | #: .././checkbox_ng/commands/newcli.py:325 | 123 | #: .././checkbox_ng/commands/newcli.py:317 |
1721 | 107 | msgid "Choose tests to run on your system:" | 124 | msgid "Choose tests to run on your system:" |
1722 | 108 | msgstr "" | 125 | msgstr "" |
1723 | 109 | 126 | ||
1725 | 110 | #: .././checkbox_ng/commands/newcli.py:337 | 127 | #: .././checkbox_ng/commands/newcli.py:329 |
1726 | 111 | msgid "Results" | 128 | msgid "Results" |
1727 | 112 | msgstr "Resultados" | 129 | msgstr "Resultados" |
1728 | 113 | 130 | ||
1736 | 114 | #: .././checkbox_ng/commands/newcli.py:379 | 131 | #: .././checkbox_ng/commands/newcli.py:368 |
1730 | 115 | msgid "Saving submission file to {}" | ||
1731 | 116 | msgstr "" | ||
1732 | 117 | |||
1733 | 118 | #. FIXME: replacing extension is ugly | ||
1734 | 119 | #: .././checkbox_ng/commands/newcli.py:381 | ||
1735 | 120 | #: .././checkbox_ng/commands/newcli.py:384 | ||
1737 | 121 | msgid "View results" | 132 | msgid "View results" |
1738 | 122 | msgstr "" | 133 | msgstr "" |
1739 | 123 | 134 | ||
1742 | 124 | #: .././checkbox_ng/commands/newcli.py:412 | 135 | #: .././checkbox_ng/commands/newcli.py:397 |
1741 | 125 | #, python-brace-format | ||
1743 | 126 | msgid "" | 136 | msgid "" |
1744 | 127 | "\n" | 137 | "\n" |
1745 | 128 | "Submit results to {0}?" | 138 | "Submit results to {0}?" |
1746 | 129 | msgstr "" | 139 | msgstr "" |
1747 | 130 | 140 | ||
1749 | 131 | #: .././checkbox_ng/commands/newcli.py:415 | 141 | #: .././checkbox_ng/commands/newcli.py:400 |
1750 | 132 | msgid "Secure ID: " | 142 | msgid "Secure ID: " |
1751 | 133 | msgstr "" | 143 | msgstr "" |
1752 | 134 | 144 | ||
1754 | 135 | #: .././checkbox_ng/commands/newcli.py:418 | 145 | #: .././checkbox_ng/commands/newcli.py:403 |
1755 | 136 | msgid "ERROR: Secure ID must be 15 or 18-character alphanumeric string" | 146 | msgid "ERROR: Secure ID must be 15 or 18-character alphanumeric string" |
1756 | 137 | msgstr "" | 147 | msgstr "" |
1757 | 138 | 148 | ||
1759 | 139 | #: .././checkbox_ng/commands/newcli.py:436 | 149 | #: .././checkbox_ng/commands/newcli.py:421 |
1760 | 140 | msgid "" | 150 | msgid "" |
1761 | 141 | "\n" | 151 | "\n" |
1762 | 142 | "Submit results to launchpad.net/+hwdb?" | 152 | "Submit results to launchpad.net/+hwdb?" |
1763 | 143 | msgstr "" | 153 | msgstr "" |
1764 | 144 | 154 | ||
1766 | 145 | #: .././checkbox_ng/commands/newcli.py:438 | 155 | #: .././checkbox_ng/commands/newcli.py:423 |
1767 | 146 | msgid "Email address: " | 156 | msgid "Email address: " |
1768 | 147 | msgstr "" | 157 | msgstr "" |
1769 | 148 | 158 | ||
1770 | 149 | #. TRANSLATORS: Do not translate the {} format markers. | 159 | #. TRANSLATORS: Do not translate the {} format markers. |
1774 | 150 | #: .././checkbox_ng/commands/newcli.py:454 | 160 | #: .././checkbox_ng/commands/newcli.py:439 |
1775 | 151 | #, python-brace-format | 161 | msgid "Submitting results to {0} for email_address {1}" |
1773 | 152 | msgid "Submitting results to {0} for email_address {1})" | ||
1776 | 153 | msgstr "" | 162 | msgstr "" |
1777 | 154 | 163 | ||
1778 | 155 | #. TRANSLATORS: Do not translate the {} format marker. | 164 | #. TRANSLATORS: Do not translate the {} format marker. |
1781 | 156 | #: .././checkbox_ng/commands/newcli.py:465 | 165 | #: .././checkbox_ng/commands/newcli.py:450 |
1780 | 157 | #, python-brace-format | ||
1782 | 158 | msgid "Submission uploaded to: {0}" | 166 | msgid "Submission uploaded to: {0}" |
1783 | 159 | msgstr "" | 167 | msgstr "" |
1784 | 160 | 168 | ||
1787 | 161 | #: .././checkbox_ng/commands/newcli.py:471 | 169 | #: .././checkbox_ng/commands/newcli.py:456 |
1786 | 162 | #, python-brace-format | ||
1788 | 163 | msgid "Bad response from {0} transport" | 170 | msgid "Bad response from {0} transport" |
1789 | 164 | msgstr "" | 171 | msgstr "" |
1790 | 165 | 172 | ||
1791 | 166 | #. TRANSLATORS: Do not translate the {} format markers. | 173 | #. TRANSLATORS: Do not translate the {} format markers. |
1795 | 167 | #: .././checkbox_ng/commands/newcli.py:479 | 174 | #: .././checkbox_ng/commands/newcli.py:464 |
1796 | 168 | #, python-brace-format | 175 | msgid "Submitting results to {0} for secure_id {1}" |
1794 | 169 | msgid "Submitting results to {0} for secure_id {1})" | ||
1797 | 170 | msgstr "" | 176 | msgstr "" |
1798 | 171 | 177 | ||
1799 | 172 | #. TRANSLATORS: Do not translate the {} format marker. | 178 | #. TRANSLATORS: Do not translate the {} format marker. |
1803 | 173 | #: .././checkbox_ng/commands/newcli.py:500 | 179 | #: .././checkbox_ng/commands/newcli.py:485 |
1804 | 174 | #: .././checkbox_ng/commands/sru.py:142 | 180 | #: .././checkbox_ng/commands/submit.py:64 |
1802 | 175 | #, python-brace-format | ||
1805 | 176 | msgid "Successfully sent, submission status at {0}" | 181 | msgid "Successfully sent, submission status at {0}" |
1806 | 177 | msgstr "" | 182 | msgstr "" |
1807 | 178 | 183 | ||
1808 | 179 | #. TRANSLATORS: Do not translate the {} format marker. | 184 | #. TRANSLATORS: Do not translate the {} format marker. |
1812 | 180 | #: .././checkbox_ng/commands/newcli.py:504 | 185 | #: .././checkbox_ng/commands/newcli.py:489 |
1813 | 181 | #: .././checkbox_ng/commands/sru.py:145 | 186 | #: .././checkbox_ng/commands/submit.py:68 |
1811 | 182 | #, python-brace-format | ||
1814 | 183 | msgid "Successfully sent, server response: {0}" | 187 | msgid "Successfully sent, server response: {0}" |
1815 | 184 | msgstr "" | 188 | msgstr "" |
1816 | 185 | 189 | ||
1818 | 186 | #: .././checkbox_ng/commands/newcli.py:525 | 190 | #: .././checkbox_ng/commands/newcli.py:514 |
1819 | 187 | msgid "Select jobs to re-run" | 191 | msgid "Select jobs to re-run" |
1820 | 188 | msgstr "" | 192 | msgstr "" |
1821 | 189 | 193 | ||
1883 | 190 | #: .././checkbox_ng/commands/service.py:79 | 194 | #: .././checkbox_ng/commands/sru.py:58 .././checkbox_ng/commands/submit.py:121 |
1884 | 191 | msgid "Setting up DBus objects..." | 195 | msgid "SECURE-ID" |
1885 | 192 | msgstr "" | 196 | msgstr "" |
1886 | 193 | 197 | ||
1887 | 194 | #. TODO: load sessions | 198 | #: .././checkbox_ng/commands/sru.py:61 |
1888 | 195 | #: .././checkbox_ng/commands/service.py:81 | 199 | msgid "Canonical hardware identifier" |
1889 | 196 | msgid "Constructing Service object" | 200 | msgstr "" |
1890 | 197 | msgstr "" | 201 | |
1891 | 198 | 202 | #: .././checkbox_ng/commands/sru.py:65 | |
1892 | 199 | #: .././checkbox_ng/commands/service.py:83 | 203 | msgid "TEST-PLAN-ID" |
1893 | 200 | msgid "Constructing ServiceWrapper" | 204 | msgstr "" |
1894 | 201 | msgstr "" | 205 | |
1895 | 202 | 206 | #. TRANSLATORS: this is in imperative form | |
1896 | 203 | #: .././checkbox_ng/commands/service.py:85 | 207 | #: .././checkbox_ng/commands/sru.py:68 |
1897 | 204 | msgid "Publishing all objects on DBus" | 208 | msgid "load the specified test plan" |
1898 | 205 | msgstr "" | 209 | msgstr "" |
1899 | 206 | 210 | ||
1900 | 207 | #: .././checkbox_ng/commands/service.py:88 | 211 | #: .././checkbox_ng/commands/sru.py:71 .././checkbox_ng/config.py:88 |
1901 | 208 | msgid "Publishing all managed objects (events should fire there)" | 212 | msgid "Send the data to non-production test server" |
1902 | 209 | msgstr "" | 213 | msgstr "" |
1903 | 210 | 214 | ||
1904 | 211 | #: .././checkbox_ng/commands/service.py:90 | 215 | #: .././checkbox_ng/commands/sru.py:75 |
1905 | 212 | #, python-format | 216 | msgid "run check-config before starting" |
1906 | 213 | msgid "Attempting to claim bus name: %s" | 217 | msgstr "" |
1907 | 214 | msgstr "" | 218 | |
1847 | 215 | |||
1848 | 216 | #: .././checkbox_ng/commands/service.py:93 | ||
1849 | 217 | #, python-format | ||
1850 | 218 | msgid "PlainBox DBus service ready, claimed name: %s" | ||
1851 | 219 | msgstr "" | ||
1852 | 220 | |||
1853 | 221 | #: .././checkbox_ng/commands/service.py:99 | ||
1854 | 222 | msgid "" | ||
1855 | 223 | "Main loop interrupted! It is recommended to call the Exit() method on the " | ||
1856 | 224 | "exported service object instead" | ||
1857 | 225 | msgstr "" | ||
1858 | 226 | |||
1859 | 227 | #: .././checkbox_ng/commands/service.py:103 | ||
1860 | 228 | #, python-format | ||
1861 | 229 | msgid "Releasing %s" | ||
1862 | 230 | msgstr "" | ||
1863 | 231 | |||
1864 | 232 | #: .././checkbox_ng/commands/service.py:108 | ||
1865 | 233 | #, python-format | ||
1866 | 234 | msgid "Closing %s" | ||
1867 | 235 | msgstr "" | ||
1868 | 236 | |||
1869 | 237 | #: .././checkbox_ng/commands/service.py:110 | ||
1870 | 238 | msgid "Main loop terminated, exiting..." | ||
1871 | 239 | msgstr "" | ||
1872 | 240 | |||
1873 | 241 | #: .././checkbox_ng/commands/service.py:122 | ||
1874 | 242 | msgid "spawn dbus service" | ||
1875 | 243 | msgstr "" | ||
1876 | 244 | |||
1877 | 245 | #: .././checkbox_ng/commands/service.py:129 | ||
1878 | 246 | msgid "use the specified DBus bus name" | ||
1879 | 247 | msgstr "" | ||
1880 | 248 | |||
1881 | 249 | #. Handle possible DependencyDuplicateError that can happen if | ||
1882 | 250 | #. someone is using plainbox for job development. | ||
1908 | 251 | #: .././checkbox_ng/commands/sru.py:88 | 219 | #: .././checkbox_ng/commands/sru.py:88 |
1928 | 252 | msgid "The job database you are currently using is broken" | 220 | msgid "Configuration problems prevent running SRU tests" |
1929 | 253 | msgstr "" | 221 | msgstr "" |
1930 | 254 | 222 | ||
1931 | 255 | #: .././checkbox_ng/commands/sru.py:89 | 223 | #: .././checkbox_ng/commands/sru.py:113 |
1932 | 256 | #, python-brace-format | 224 | msgid "Results saved to {0}" |
1914 | 257 | msgid "At least two jobs contend for the name {0}" | ||
1915 | 258 | msgstr "" | ||
1916 | 259 | |||
1917 | 260 | #: .././checkbox_ng/commands/sru.py:91 | ||
1918 | 261 | #, python-brace-format | ||
1919 | 262 | msgid "Second job defined in: {0}" | ||
1920 | 263 | msgstr "" | ||
1921 | 264 | |||
1922 | 265 | #: .././checkbox_ng/commands/sru.py:112 | ||
1923 | 266 | msgid "There were some problems with the selected jobs" | ||
1924 | 267 | msgstr "" | ||
1925 | 268 | |||
1926 | 269 | #: .././checkbox_ng/commands/sru.py:115 | ||
1927 | 270 | msgid "Problematic jobs will not be considered" | ||
1933 | 271 | msgstr "" | 225 | msgstr "" |
1934 | 272 | 226 | ||
1935 | 273 | #: .././checkbox_ng/commands/sru.py:118 | 227 | #: .././checkbox_ng/commands/sru.py:118 |
1964 | 274 | #, python-brace-format | 228 | msgid "Sending hardware report to Canonical Certification" |
1965 | 275 | msgid "Saving results to {0}" | 229 | msgstr "" |
1966 | 276 | msgstr "" | 230 | |
1967 | 277 | 231 | #: .././checkbox_ng/commands/sru.py:119 | |
1968 | 278 | #: .././checkbox_ng/commands/sru.py:125 | 232 | msgid "Server URL is: {0}" |
1969 | 279 | #, python-brace-format | 233 | msgstr "" |
1970 | 280 | msgid "Submitting results to {0} for secure_id {1}" | 234 | |
1971 | 281 | msgstr "" | 235 | #: .././checkbox_ng/commands/sru.py:131 |
1972 | 282 | 236 | msgid "SRU Session" | |
1973 | 283 | #: .././checkbox_ng/commands/sru.py:150 | 237 | msgstr "" |
1974 | 284 | #, python-brace-format | 238 | |
1975 | 285 | msgid "Problem reading a file: {0}" | 239 | #: .././checkbox_ng/commands/sru.py:172 |
1948 | 286 | msgstr "" | ||
1949 | 287 | |||
1950 | 288 | #: .././checkbox_ng/commands/sru.py:180 | ||
1951 | 289 | #, python-brace-format | ||
1952 | 290 | msgid "comments: {0}" | ||
1953 | 291 | msgstr "" | ||
1954 | 292 | |||
1955 | 293 | #: .././checkbox_ng/commands/sru.py:182 | ||
1956 | 294 | msgid "inhibitors:" | ||
1957 | 295 | msgstr "" | ||
1958 | 296 | |||
1959 | 297 | #: .././checkbox_ng/commands/sru.py:220 | ||
1960 | 298 | msgid "Configuration problems prevent running SRU tests" | ||
1961 | 299 | msgstr "" | ||
1962 | 300 | |||
1963 | 301 | #: .././checkbox_ng/commands/sru.py:236 | ||
1976 | 302 | msgid "run automated stable release update tests" | 240 | msgid "run automated stable release update tests" |
1977 | 303 | msgstr "" | 241 | msgstr "" |
1978 | 304 | 242 | ||
1990 | 305 | #: .././checkbox_ng/commands/sru.py:241 | 243 | #. TRANSLATORS: please leave various options (both long and short forms), |
1991 | 306 | msgid "run check-config before starting" | 244 | #. environment variables and paths in their original form. Also keep the |
1992 | 307 | msgstr "" | 245 | #. special @EPILOG@ string. The first line of the translation is special and |
1993 | 308 | 246 | #. is used as the help message. Please keep the pseudo-statement form and | |
1994 | 309 | #: .././checkbox_ng/commands/sru.py:249 | 247 | #. don't finish the sentence with a dot. Pay extra attention to whitespace. |
1995 | 310 | msgid "SECURE-ID" | 248 | #. It must be correctly preserved or the result won't work. In particular |
1996 | 311 | msgstr "" | 249 | #. the leading whitespace *must* be preserved and *must* have the same |
1997 | 312 | 250 | #. length on each line. | |
1998 | 313 | #. TRANSLATORS: Do not translate %(default) | 251 | #: .././checkbox_ng/commands/submit.py:81 |
1988 | 314 | #: .././checkbox_ng/commands/sru.py:254 | ||
1989 | 315 | #, python-format | ||
1999 | 316 | msgid "" | 252 | msgid "" |
2014 | 317 | "associate submission with a machine using this SECURE-ID (%(default)s)" | 253 | "\n" |
2015 | 318 | msgstr "" | 254 | " submit test results to the Canonical certification website\n" |
2016 | 319 | 255 | "\n" | |
2017 | 320 | #: .././checkbox_ng/commands/sru.py:257 | 256 | " This command sends the XML results file to the Certification website.\n" |
2018 | 321 | msgid "FILE" | 257 | " " |
2019 | 322 | msgstr "" | 258 | msgstr "" |
2020 | 323 | 259 | ||
2021 | 324 | #. TRANSLATORS: Do not translate %(default)s | 260 | #: .././checkbox_ng/commands/submit.py:98 |
2022 | 325 | #: .././checkbox_ng/commands/sru.py:262 | 261 | msgid "submit test results to the Canonical certification website" |
2023 | 326 | #, python-format | 262 | msgstr "" |
2024 | 327 | msgid "if submission fails save the test report as FILE (%(default)s)" | 263 | |
2025 | 328 | msgstr "" | 264 | #: .././checkbox_ng/commands/submit.py:104 |
2026 | 329 | 265 | msgid "The path to the results xml file" | |
2027 | 330 | #: .././checkbox_ng/commands/sru.py:265 | 266 | msgstr "" |
2028 | 267 | |||
2029 | 268 | #: .././checkbox_ng/commands/submit.py:114 | ||
2030 | 269 | msgid "must be 15 or 18-character alphanumeric string" | ||
2031 | 270 | msgstr "" | ||
2032 | 271 | |||
2033 | 272 | #: .././checkbox_ng/commands/submit.py:124 | ||
2034 | 273 | msgid "associate submission with a machine using this SECURE-ID" | ||
2035 | 274 | msgstr "" | ||
2036 | 275 | |||
2037 | 276 | #: .././checkbox_ng/commands/submit.py:152 | ||
2038 | 331 | msgid "URL" | 277 | msgid "URL" |
2039 | 332 | msgstr "" | 278 | msgstr "" |
2040 | 333 | 279 | ||
2053 | 334 | #. TRANSLATORS: Do not translate %(default)s | 280 | #: .././checkbox_ng/commands/submit.py:154 |
2054 | 335 | #: .././checkbox_ng/commands/sru.py:269 | 281 | msgid "destination to submit to" |
2043 | 336 | #, python-format | ||
2044 | 337 | msgid "POST the test report XML to this URL (%(default)s)" | ||
2045 | 338 | msgstr "" | ||
2046 | 339 | |||
2047 | 340 | #: .././checkbox_ng/commands/sru.py:277 | ||
2048 | 341 | msgid "override --destination to use the staging certification website" | ||
2049 | 342 | msgstr "" | ||
2050 | 343 | |||
2051 | 344 | #: .././checkbox_ng/commands/sru.py:284 | ||
2052 | 345 | msgid "don't really run most jobs" | ||
2055 | 346 | msgstr "" | 282 | msgstr "" |
2056 | 347 | 283 | ||
2057 | 348 | #: .././checkbox_ng/config.py:43 | 284 | #: .././checkbox_ng/config.py:43 |
2058 | @@ -377,13 +313,81 @@ | |||
2059 | 377 | msgid "Optional whitelist with which to run SRU testing" | 313 | msgid "Optional whitelist with which to run SRU testing" |
2060 | 378 | msgstr "" | 314 | msgstr "" |
2061 | 379 | 315 | ||
2062 | 316 | #: .././checkbox_ng/config.py:82 | ||
2063 | 317 | msgid "Optional test plan with which to run SRU testing" | ||
2064 | 318 | msgstr "" | ||
2065 | 319 | |||
2066 | 320 | #: .././checkbox_ng/launcher.py:47 | ||
2067 | 321 | msgid "Application Title" | ||
2068 | 322 | msgstr "" | ||
2069 | 323 | |||
2070 | 324 | #: .././checkbox_ng/launcher.py:51 | ||
2071 | 325 | msgid "Welcome Message" | ||
2072 | 326 | msgstr "" | ||
2073 | 327 | |||
2074 | 328 | #. TODO: valid regexp text validator | ||
2075 | 329 | #: .././checkbox_ng/launcher.py:56 | ||
2076 | 330 | msgid "Pattern that whitelists need to match to be displayed" | ||
2077 | 331 | msgstr "" | ||
2078 | 332 | |||
2079 | 333 | #. TODO: valid regexp text validator | ||
2080 | 334 | #: .././checkbox_ng/launcher.py:61 | ||
2081 | 335 | msgid "Pattern that whitelists need to match to be selected" | ||
2082 | 336 | msgstr "" | ||
2083 | 337 | |||
2084 | 338 | #: .././checkbox_ng/launcher.py:67 | ||
2085 | 339 | msgid "If enabled then suite selection screen is not displayed" | ||
2086 | 340 | msgstr "" | ||
2087 | 341 | |||
2088 | 342 | #: .././checkbox_ng/launcher.py:73 | ||
2089 | 343 | msgid "If enabled then test selection screen is not displayed" | ||
2090 | 344 | msgstr "" | ||
2091 | 345 | |||
2092 | 346 | #. TODO: probably a choice validator | ||
2093 | 347 | #: .././checkbox_ng/launcher.py:78 | ||
2094 | 348 | msgid "Type of the input field?" | ||
2095 | 349 | msgstr "" | ||
2096 | 350 | |||
2097 | 351 | #: .././checkbox_ng/launcher.py:82 | ||
2098 | 352 | msgid "Label on the 'send' button" | ||
2099 | 353 | msgstr "" | ||
2100 | 354 | |||
2101 | 355 | #. TODO: default? | ||
2102 | 356 | #: .././checkbox_ng/launcher.py:88 | ||
2103 | 357 | msgid "If enabled then test results will be also sent to HEXR" | ||
2104 | 358 | msgstr "" | ||
2105 | 359 | |||
2106 | 360 | #: .././checkbox_ng/launcher.py:93 | ||
2107 | 361 | msgid "Where to submit the test results to" | ||
2108 | 362 | msgstr "" | ||
2109 | 363 | |||
2110 | 364 | #: .././checkbox_ng/launcher.py:98 | ||
2111 | 365 | msgid "" | ||
2112 | 366 | "HTTP endpoint to submit data to, using the transport specified with " | ||
2113 | 367 | "submit_to." | ||
2114 | 368 | msgstr "" | ||
2115 | 369 | |||
2116 | 370 | #: .././checkbox_ng/launcher.py:104 | ||
2117 | 371 | msgid "Secure ID to identify the system this submission belongs to." | ||
2118 | 372 | msgstr "" | ||
2119 | 373 | |||
2120 | 374 | #: .././checkbox_ng/launcher.py:109 | ||
2121 | 375 | msgid "Name of custom configuration file" | ||
2122 | 376 | msgstr "" | ||
2123 | 377 | |||
2124 | 378 | #: .././checkbox_ng/launcher.py:113 | ||
2125 | 379 | msgid "Don't suppress the output of certain job plugin types." | ||
2126 | 380 | msgstr "" | ||
2127 | 381 | |||
2128 | 382 | #: .././checkbox_ng/launcher.py:116 | ||
2129 | 383 | msgid "Section with only exported unit ids as keys (no values)" | ||
2130 | 384 | msgstr "" | ||
2131 | 385 | |||
2132 | 380 | #: .././checkbox_ng/launchpad.py:66 | 386 | #: .././checkbox_ng/launchpad.py:66 |
2133 | 381 | #, python-brace-format | ||
2134 | 382 | msgid "Cannot get {0} resource job" | 387 | msgid "Cannot get {0} resource job" |
2135 | 383 | msgstr "" | 388 | msgstr "" |
2136 | 384 | 389 | ||
2137 | 385 | #: .././checkbox_ng/launchpad.py:70 | 390 | #: .././checkbox_ng/launchpad.py:70 |
2138 | 386 | #, python-brace-format | ||
2139 | 387 | msgid "{0} has no attribute {1}" | 391 | msgid "{0} has no attribute {1}" |
2140 | 388 | msgstr "" | 392 | msgstr "" |
2141 | 389 | 393 | ||
2142 | @@ -404,180 +408,22 @@ | |||
2143 | 404 | msgid "The submission was uploaded to Launchpad successfully" | 408 | msgid "The submission was uploaded to Launchpad successfully" |
2144 | 405 | msgstr "" | 409 | msgstr "" |
2145 | 406 | 410 | ||
2146 | 407 | #: .././checkbox_ng/service.py:37 | ||
2147 | 408 | msgid "DBus parts require 'funcsigs' from pypi." | ||
2148 | 409 | msgstr "" | ||
2149 | 410 | |||
2150 | 411 | #: .././checkbox_ng/service.py:86 | ||
2151 | 412 | #, python-format | ||
2152 | 413 | msgid "Created DBus wrapper %s for: %r" | ||
2153 | 414 | msgstr "" | ||
2154 | 415 | |||
2155 | 416 | #: .././checkbox_ng/service.py:90 | ||
2156 | 417 | #, python-format | ||
2157 | 418 | msgid "DBus wrapper %s died" | ||
2158 | 419 | msgstr "" | ||
2159 | 420 | |||
2160 | 421 | #: .././checkbox_ng/service.py:122 | ||
2161 | 422 | #, python-format | ||
2162 | 423 | msgid "Published DBus wrapper for %r as %s" | ||
2163 | 424 | msgstr "" | ||
2164 | 425 | |||
2165 | 426 | #: .././checkbox_ng/service.py:169 .././checkbox_ng/service.py:180 | ||
2166 | 427 | #, python-brace-format | ||
2167 | 428 | msgid "object path {0} does not designate an existing object" | ||
2168 | 429 | msgstr "" | ||
2169 | 430 | |||
2170 | 431 | #: .././checkbox_ng/service.py:188 | ||
2171 | 432 | #, python-format | ||
2172 | 433 | msgid "" | ||
2173 | 434 | "Application error: %r should have returned native object but returned " | ||
2174 | 435 | "wrapper instead" | ||
2175 | 436 | msgstr "" | ||
2176 | 437 | |||
2177 | 438 | #: .././checkbox_ng/service.py:195 .././checkbox_ng/service.py:206 | ||
2178 | 439 | #: .././checkbox_ng/service.py:217 | ||
2179 | 440 | #, python-brace-format | ||
2180 | 441 | msgid "({0}) internal error, unable to lookup object wrapper" | ||
2181 | 442 | msgstr "" | ||
2182 | 443 | |||
2183 | 444 | #: .././checkbox_ng/service.py:224 | ||
2184 | 445 | #, python-format | ||
2185 | 446 | msgid "wrapped %s called with %s" | ||
2186 | 447 | msgstr "" | ||
2187 | 448 | |||
2188 | 449 | #: .././checkbox_ng/service.py:240 .././checkbox_ng/service.py:256 | ||
2189 | 450 | msgid "unsupported translation {!r}" | ||
2190 | 451 | msgstr "" | ||
2191 | 452 | |||
2192 | 453 | #: .././checkbox_ng/service.py:243 | ||
2193 | 454 | #, python-format | ||
2194 | 455 | msgid "unwrapped %s called with %s" | ||
2195 | 456 | msgstr "" | ||
2196 | 457 | |||
2197 | 458 | #: .././checkbox_ng/service.py:245 | ||
2198 | 459 | #, python-format | ||
2199 | 460 | msgid "unwrapped %s returned %r" | ||
2200 | 461 | msgstr "" | ||
2201 | 462 | |||
2202 | 463 | #: .././checkbox_ng/service.py:258 | ||
2203 | 464 | #, python-format | ||
2204 | 465 | msgid "wrapped %s returned %r" | ||
2205 | 466 | msgstr "" | ||
2206 | 467 | |||
2207 | 468 | #: .././checkbox_ng/service.py:769 | ||
2208 | 469 | #, python-format | ||
2209 | 470 | msgid "Adding result %r to DBus" | ||
2210 | 471 | msgstr "" | ||
2211 | 472 | |||
2212 | 473 | #: .././checkbox_ng/service.py:788 | ||
2213 | 474 | #, python-format | ||
2214 | 475 | msgid "Removing result %r from DBus" | ||
2215 | 476 | msgstr "" | ||
2216 | 477 | |||
2217 | 478 | #: .././checkbox_ng/service.py:811 | ||
2218 | 479 | #, python-format | ||
2219 | 480 | msgid "Adding job %r to DBus" | ||
2220 | 481 | msgstr "" | ||
2221 | 482 | |||
2222 | 483 | #: .././checkbox_ng/service.py:843 | ||
2223 | 484 | #, python-format | ||
2224 | 485 | msgid "Adding job state %r to DBus" | ||
2225 | 486 | msgstr "" | ||
2226 | 487 | |||
2227 | 488 | #: .././checkbox_ng/service.py:875 | ||
2228 | 489 | #, python-brace-format | ||
2229 | 490 | msgid "Unable to wrap object of type {0}" | ||
2230 | 491 | msgstr "" | ||
2231 | 492 | |||
2232 | 493 | #: .././checkbox_ng/service.py:1000 | ||
2233 | 494 | msgid "Remove() completed" | ||
2234 | 495 | msgstr "" | ||
2235 | 496 | |||
2236 | 497 | #: .././checkbox_ng/service.py:1075 | ||
2237 | 498 | #, python-format | ||
2238 | 499 | msgid "AskForOutcome(%r) suggested outcome is (%s)" | ||
2239 | 500 | msgstr "" | ||
2240 | 501 | |||
2241 | 502 | #. NOTE: this should: | ||
2242 | 503 | #. 1) attempt to cancel the future in the extremely rare case where it | ||
2243 | 504 | #. is not started yet | ||
2244 | 505 | #. 2) kill the job otherwise | ||
2245 | 506 | #: .././checkbox_ng/service.py:1391 | ||
2246 | 507 | msgid "Kill() is not implemented" | ||
2247 | 508 | msgstr "" | ||
2248 | 509 | |||
2249 | 510 | #: .././checkbox_ng/service.py:1411 | ||
2250 | 511 | msgid "RunCommand() should not be called for automated jobs" | ||
2251 | 512 | msgstr "" | ||
2252 | 513 | |||
2253 | 514 | #: .././checkbox_ng/service.py:1413 | ||
2254 | 515 | msgid "RunCommand() is starting to run the job" | ||
2255 | 516 | msgstr "" | ||
2256 | 517 | |||
2257 | 518 | #: .././checkbox_ng/service.py:1417 | ||
2258 | 519 | msgid "RunCommand() ignored, waiting for command to finish" | ||
2259 | 520 | msgstr "" | ||
2260 | 521 | |||
2261 | 522 | #: .././checkbox_ng/service.py:1435 | ||
2262 | 523 | msgid "SetOutcome() called while the command is still running!" | ||
2263 | 524 | msgstr "" | ||
2264 | 525 | |||
2265 | 526 | #: .././checkbox_ng/service.py:1442 | ||
2266 | 527 | msgid "SetOutcome() called before RunCommand()" | ||
2267 | 528 | msgstr "" | ||
2268 | 529 | |||
2269 | 530 | #. TRANSLATORS: don't translate 'manual' translate it as | ||
2270 | 531 | #. 'of type manual' and leave the 'manual' string | ||
2271 | 532 | #. intact. | ||
2272 | 533 | #: .././checkbox_ng/service.py:1447 | ||
2273 | 534 | #, python-format | ||
2274 | 535 | msgid "But the job is not manual, it is %s" | ||
2275 | 536 | msgstr "" | ||
2276 | 537 | |||
2277 | 538 | #: .././checkbox_ng/service.py:1480 | ||
2278 | 539 | msgid "outcome_from_command() called too early!" | ||
2279 | 540 | msgstr "" | ||
2280 | 541 | |||
2281 | 542 | #: .././checkbox_ng/service.py:1481 | ||
2282 | 543 | msgid "There is nothing to return yet" | ||
2283 | 544 | msgstr "" | ||
2284 | 545 | |||
2285 | 546 | #: .././checkbox_ng/service.py:1522 | ||
2286 | 547 | msgid "Sending ShowInteractiveUI() and not starting the job..." | ||
2287 | 548 | msgstr "" | ||
2288 | 549 | |||
2289 | 550 | #: .././checkbox_ng/service.py:1526 | ||
2290 | 551 | #, python-format | ||
2291 | 552 | msgid "Running %r right away" | ||
2292 | 553 | msgstr "" | ||
2293 | 554 | |||
2294 | 555 | #: .././checkbox_ng/service.py:1563 | ||
2295 | 556 | #, python-format | ||
2296 | 557 | msgid "calling JobResultAvailable(%r, %r)" | ||
2297 | 558 | msgstr "" | ||
2298 | 559 | |||
2299 | 560 | #: .././checkbox_ng/service.py:1570 | ||
2300 | 561 | msgid "" | ||
2301 | 562 | "sending AskForOutcome() after job finished running with OUTCOME_UNDECIDED" | ||
2302 | 563 | msgstr "" | ||
2303 | 564 | |||
2304 | 565 | #: .././checkbox_ng/ui.py:73 | 411 | #: .././checkbox_ng/ui.py:73 |
2305 | 566 | msgid "< Continue >" | 412 | msgid "< Continue >" |
2306 | 567 | msgstr "" | 413 | msgstr "" |
2307 | 568 | 414 | ||
2309 | 569 | #: .././checkbox_ng/ui.py:191 .././checkbox_ng/ui.py:318 | 415 | #: .././checkbox_ng/ui.py:194 .././checkbox_ng/ui.py:321 |
2310 | 570 | msgid "Enter" | 416 | msgid "Enter" |
2311 | 571 | msgstr "" | 417 | msgstr "" |
2312 | 572 | 418 | ||
2314 | 573 | #: .././checkbox_ng/ui.py:194 .././checkbox_ng/ui.py:321 | 419 | #: .././checkbox_ng/ui.py:197 .././checkbox_ng/ui.py:324 |
2315 | 574 | msgid ": Expand/Collapse" | 420 | msgid ": Expand/Collapse" |
2316 | 575 | msgstr "" | 421 | msgstr "" |
2317 | 576 | 422 | ||
2319 | 577 | #: .././checkbox_ng/ui.py:210 | 423 | #: .././checkbox_ng/ui.py:213 |
2320 | 578 | msgid "Start " | 424 | msgid "Start " |
2321 | 579 | msgstr "" | 425 | msgstr "" |
2322 | 580 | 426 | ||
2324 | 581 | #: .././checkbox_ng/ui.py:342 | 427 | #: .././checkbox_ng/ui.py:345 |
2325 | 582 | msgid "inish" | 428 | msgid "inish" |
2326 | 583 | msgstr "" | 429 | msgstr "" |
2327 | 584 | 430 | ||
2328 | === modified file 'checkbox-ng/po/pl.po' | |||
2329 | --- checkbox-ng/po/pl.po 2015-09-15 05:10:23 +0000 | |||
2330 | +++ checkbox-ng/po/pl.po 2016-01-05 21:24:37 +0000 | |||
2331 | @@ -7,15 +7,15 @@ | |||
2332 | 7 | msgstr "" | 7 | msgstr "" |
2333 | 8 | "Project-Id-Version: checkbox-ng 0.4\n" | 8 | "Project-Id-Version: checkbox-ng 0.4\n" |
2334 | 9 | "Report-Msgid-Bugs-To: \n" | 9 | "Report-Msgid-Bugs-To: \n" |
2336 | 10 | "POT-Creation-Date: 2015-05-19 13:10+0800\n" | 10 | "POT-Creation-Date: 2015-12-23 18:53+0800\n" |
2337 | 11 | "PO-Revision-Date: 2014-04-17 06:45+0000\n" | 11 | "PO-Revision-Date: 2014-04-17 06:45+0000\n" |
2338 | 12 | "Last-Translator: Zygmunt Krynicki <zygmunt.krynicki@canonical.com>\n" | 12 | "Last-Translator: Zygmunt Krynicki <zygmunt.krynicki@canonical.com>\n" |
2339 | 13 | "Language-Team: polski <>\n" | 13 | "Language-Team: polski <>\n" |
2340 | 14 | "MIME-Version: 1.0\n" | 14 | "MIME-Version: 1.0\n" |
2341 | 15 | "Content-Type: text/plain; charset=UTF-8\n" | 15 | "Content-Type: text/plain; charset=UTF-8\n" |
2342 | 16 | "Content-Transfer-Encoding: 8bit\n" | 16 | "Content-Transfer-Encoding: 8bit\n" |
2345 | 17 | "X-Launchpad-Export-Date: 2015-09-15 05:10+0000\n" | 17 | "X-Launchpad-Export-Date: 2015-12-26 05:07+0000\n" |
2346 | 18 | "X-Generator: Launchpad (build 17737)\n" | 18 | "X-Generator: Launchpad (build 17865)\n" |
2347 | 19 | "Language: Polish\n" | 19 | "Language: Polish\n" |
2348 | 20 | 20 | ||
2349 | 21 | #: .././checkbox_ng/certification.py:135 | 21 | #: .././checkbox_ng/certification.py:135 |
2350 | @@ -38,314 +38,248 @@ | |||
2351 | 38 | msgstr "" | 38 | msgstr "" |
2352 | 39 | 39 | ||
2353 | 40 | #: .././checkbox_ng/certification.py:164 .././checkbox_ng/launchpad.py:183 | 40 | #: .././checkbox_ng/certification.py:164 .././checkbox_ng/launchpad.py:183 |
2354 | 41 | #, python-brace-format | ||
2355 | 42 | msgid "Request to {0} timed out: {1}" | 41 | msgid "Request to {0} timed out: {1}" |
2356 | 43 | msgstr "Żądanie do {0} przekroczyło czas oczekiwania: {1}" | 42 | msgstr "Żądanie do {0} przekroczyło czas oczekiwania: {1}" |
2357 | 44 | 43 | ||
2358 | 45 | #: .././checkbox_ng/certification.py:167 .././checkbox_ng/launchpad.py:186 | 44 | #: .././checkbox_ng/certification.py:167 .././checkbox_ng/launchpad.py:186 |
2359 | 46 | #, python-brace-format | ||
2360 | 47 | msgid "Invalid destination URL: {0}" | 45 | msgid "Invalid destination URL: {0}" |
2361 | 48 | msgstr "Niewłaściwy docelowy URL: {0}" | 46 | msgstr "Niewłaściwy docelowy URL: {0}" |
2362 | 49 | 47 | ||
2363 | 50 | #: .././checkbox_ng/certification.py:170 .././checkbox_ng/launchpad.py:189 | 48 | #: .././checkbox_ng/certification.py:170 .././checkbox_ng/launchpad.py:189 |
2364 | 51 | #, python-brace-format | ||
2365 | 52 | msgid "Unable to connect to {0}: {1}" | 49 | msgid "Unable to connect to {0}: {1}" |
2366 | 53 | msgstr "Nie można połączyć się z {0}: {1}" | 50 | msgstr "Nie można połączyć się z {0}: {1}" |
2367 | 54 | 51 | ||
2369 | 55 | #: .././checkbox_ng/certification.py:188 | 52 | #: .././checkbox_ng/certification.py:189 |
2370 | 56 | msgid "secure_id must be 15 or 18-character alphanumeric string" | 53 | msgid "secure_id must be 15 or 18-character alphanumeric string" |
2371 | 57 | msgstr "secure_id musi mieć od 15 do 18 znaków alfanumerycznych" | 54 | msgstr "secure_id musi mieć od 15 do 18 znaków alfanumerycznych" |
2372 | 58 | 55 | ||
2374 | 59 | #: .././checkbox_ng/commands/cli.py:76 | 56 | #: .././checkbox_ng/commands/cli.py:70 |
2375 | 60 | msgid "run check-config" | 57 | msgid "run check-config" |
2376 | 61 | msgstr "" | 58 | msgstr "" |
2377 | 62 | 59 | ||
2378 | 60 | #: .././checkbox_ng/commands/cli.py:71 | ||
2379 | 61 | #: .././checkbox_ng/commands/launcher.py:108 | ||
2380 | 62 | msgid "user interface options" | ||
2381 | 63 | msgstr "" | ||
2382 | 64 | |||
2383 | 63 | #: .././checkbox_ng/commands/cli.py:77 | 65 | #: .././checkbox_ng/commands/cli.py:77 |
2388 | 64 | msgid "user interface options" | 66 | #: .././checkbox_ng/commands/launcher.py:111 |
2385 | 65 | msgstr "" | ||
2386 | 66 | |||
2387 | 67 | #: .././checkbox_ng/commands/cli.py:83 | ||
2389 | 68 | msgid "skip tests that require interactivity" | 67 | msgid "skip tests that require interactivity" |
2390 | 69 | msgstr "pomiń testy wymagające interaktywności" | 68 | msgstr "pomiń testy wymagające interaktywności" |
2391 | 70 | 69 | ||
2393 | 71 | #: .././checkbox_ng/commands/cli.py:86 | 70 | #: .././checkbox_ng/commands/cli.py:80 |
2394 | 72 | msgid "don't suppress the output of certain job plugin types" | 71 | msgid "don't suppress the output of certain job plugin types" |
2395 | 73 | msgstr "" | 72 | msgstr "" |
2396 | 74 | 73 | ||
2399 | 75 | #: .././checkbox_ng/commands/newcli.py:121 | 74 | #: .././checkbox_ng/commands/launcher.py:64 |
2400 | 76 | #: .././checkbox_ng/commands/newcli.py:132 | 75 | #, python-format |
2401 | 76 | msgid "Unable to load launcher definition: %s" | ||
2402 | 77 | msgstr "" | ||
2403 | 78 | |||
2404 | 79 | #: .././checkbox_ng/commands/launcher.py:69 | ||
2405 | 80 | msgid "Unable to start launcher because of errors:" | ||
2406 | 81 | msgstr "" | ||
2407 | 82 | |||
2408 | 83 | #: .././checkbox_ng/commands/launcher.py:102 | ||
2409 | 84 | msgid "LAUNCHER" | ||
2410 | 85 | msgstr "" | ||
2411 | 86 | |||
2412 | 87 | #: .././checkbox_ng/commands/launcher.py:103 | ||
2413 | 88 | msgid "launcher definition file to use" | ||
2414 | 89 | msgstr "" | ||
2415 | 90 | |||
2416 | 91 | #: .././checkbox_ng/commands/newcli.py:119 | ||
2417 | 92 | #: .././checkbox_ng/commands/newcli.py:130 | ||
2418 | 77 | #, python-format | 93 | #, python-format |
2419 | 78 | msgid "Incorrect pattern %r: %s" | 94 | msgid "Incorrect pattern %r: %s" |
2420 | 79 | msgstr "" | 95 | msgstr "" |
2421 | 80 | 96 | ||
2423 | 81 | #: .././checkbox_ng/commands/newcli.py:149 | 97 | #: .././checkbox_ng/commands/newcli.py:147 |
2424 | 82 | #, python-format | 98 | #, python-format |
2425 | 83 | msgid "There is no test plan: %s" | 99 | msgid "There is no test plan: %s" |
2426 | 84 | msgstr "" | 100 | msgstr "" |
2427 | 85 | 101 | ||
2429 | 86 | #: .././checkbox_ng/commands/newcli.py:235 | 102 | #: .././checkbox_ng/commands/newcli.py:236 |
2430 | 87 | #, python-format | 103 | #, python-format |
2431 | 88 | msgid "Selected testplans: %r" | 104 | msgid "Selected testplans: %r" |
2432 | 89 | msgstr "" | 105 | msgstr "" |
2433 | 90 | 106 | ||
2435 | 91 | #: .././checkbox_ng/commands/newcli.py:258 | 107 | #: .././checkbox_ng/commands/newcli.py:259 |
2436 | 92 | msgid "Suite selection" | 108 | msgid "Suite selection" |
2437 | 93 | msgstr "" | 109 | msgstr "" |
2438 | 94 | 110 | ||
2440 | 95 | #: .././checkbox_ng/commands/newcli.py:261 | 111 | #: .././checkbox_ng/commands/newcli.py:262 |
2441 | 96 | msgid "No testplan selected, aborting" | 112 | msgid "No testplan selected, aborting" |
2442 | 97 | msgstr "" | 113 | msgstr "" |
2443 | 98 | 114 | ||
2445 | 99 | #: .././checkbox_ng/commands/newcli.py:299 | 115 | #: .././checkbox_ng/commands/newcli.py:291 |
2446 | 100 | msgid "Selecting Job Generators" | 116 | msgid "Selecting Job Generators" |
2447 | 101 | msgstr "" | 117 | msgstr "" |
2448 | 102 | 118 | ||
2450 | 103 | #: .././checkbox_ng/commands/newcli.py:318 | 119 | #: .././checkbox_ng/commands/newcli.py:310 |
2451 | 104 | msgid "Selecting Jobs For Execution" | 120 | msgid "Selecting Jobs For Execution" |
2452 | 105 | msgstr "" | 121 | msgstr "" |
2453 | 106 | 122 | ||
2455 | 107 | #: .././checkbox_ng/commands/newcli.py:325 | 123 | #: .././checkbox_ng/commands/newcli.py:317 |
2456 | 108 | msgid "Choose tests to run on your system:" | 124 | msgid "Choose tests to run on your system:" |
2457 | 109 | msgstr "" | 125 | msgstr "" |
2458 | 110 | 126 | ||
2460 | 111 | #: .././checkbox_ng/commands/newcli.py:337 | 127 | #: .././checkbox_ng/commands/newcli.py:329 |
2461 | 112 | msgid "Results" | 128 | msgid "Results" |
2462 | 113 | msgstr "" | 129 | msgstr "" |
2463 | 114 | 130 | ||
2471 | 115 | #: .././checkbox_ng/commands/newcli.py:379 | 131 | #: .././checkbox_ng/commands/newcli.py:368 |
2465 | 116 | msgid "Saving submission file to {}" | ||
2466 | 117 | msgstr "Zapisywanie pliku zgłoszenia do {}" | ||
2467 | 118 | |||
2468 | 119 | #. FIXME: replacing extension is ugly | ||
2469 | 120 | #: .././checkbox_ng/commands/newcli.py:381 | ||
2470 | 121 | #: .././checkbox_ng/commands/newcli.py:384 | ||
2472 | 122 | msgid "View results" | 132 | msgid "View results" |
2473 | 123 | msgstr "Zobacz wyniki" | 133 | msgstr "Zobacz wyniki" |
2474 | 124 | 134 | ||
2477 | 125 | #: .././checkbox_ng/commands/newcli.py:412 | 135 | #: .././checkbox_ng/commands/newcli.py:397 |
2476 | 126 | #, python-brace-format | ||
2478 | 127 | msgid "" | 136 | msgid "" |
2479 | 128 | "\n" | 137 | "\n" |
2480 | 129 | "Submit results to {0}?" | 138 | "Submit results to {0}?" |
2481 | 130 | msgstr "" | 139 | msgstr "" |
2482 | 131 | 140 | ||
2484 | 132 | #: .././checkbox_ng/commands/newcli.py:415 | 141 | #: .././checkbox_ng/commands/newcli.py:400 |
2485 | 133 | msgid "Secure ID: " | 142 | msgid "Secure ID: " |
2486 | 134 | msgstr "Bezpieczny identyfikator: " | 143 | msgstr "Bezpieczny identyfikator: " |
2487 | 135 | 144 | ||
2489 | 136 | #: .././checkbox_ng/commands/newcli.py:418 | 145 | #: .././checkbox_ng/commands/newcli.py:403 |
2490 | 137 | msgid "ERROR: Secure ID must be 15 or 18-character alphanumeric string" | 146 | msgid "ERROR: Secure ID must be 15 or 18-character alphanumeric string" |
2491 | 138 | msgstr "" | 147 | msgstr "" |
2492 | 139 | 148 | ||
2494 | 140 | #: .././checkbox_ng/commands/newcli.py:436 | 149 | #: .././checkbox_ng/commands/newcli.py:421 |
2495 | 141 | msgid "" | 150 | msgid "" |
2496 | 142 | "\n" | 151 | "\n" |
2497 | 143 | "Submit results to launchpad.net/+hwdb?" | 152 | "Submit results to launchpad.net/+hwdb?" |
2498 | 144 | msgstr "" | 153 | msgstr "" |
2499 | 145 | 154 | ||
2501 | 146 | #: .././checkbox_ng/commands/newcli.py:438 | 155 | #: .././checkbox_ng/commands/newcli.py:423 |
2502 | 147 | msgid "Email address: " | 156 | msgid "Email address: " |
2503 | 148 | msgstr "" | 157 | msgstr "" |
2504 | 149 | 158 | ||
2505 | 150 | #. TRANSLATORS: Do not translate the {} format markers. | 159 | #. TRANSLATORS: Do not translate the {} format markers. |
2509 | 151 | #: .././checkbox_ng/commands/newcli.py:454 | 160 | #: .././checkbox_ng/commands/newcli.py:439 |
2510 | 152 | #, python-brace-format | 161 | msgid "Submitting results to {0} for email_address {1}" |
2508 | 153 | msgid "Submitting results to {0} for email_address {1})" | ||
2511 | 154 | msgstr "" | 162 | msgstr "" |
2512 | 155 | 163 | ||
2513 | 156 | #. TRANSLATORS: Do not translate the {} format marker. | 164 | #. TRANSLATORS: Do not translate the {} format marker. |
2516 | 157 | #: .././checkbox_ng/commands/newcli.py:465 | 165 | #: .././checkbox_ng/commands/newcli.py:450 |
2515 | 158 | #, python-brace-format | ||
2517 | 159 | msgid "Submission uploaded to: {0}" | 166 | msgid "Submission uploaded to: {0}" |
2518 | 160 | msgstr "" | 167 | msgstr "" |
2519 | 161 | 168 | ||
2522 | 162 | #: .././checkbox_ng/commands/newcli.py:471 | 169 | #: .././checkbox_ng/commands/newcli.py:456 |
2521 | 163 | #, python-brace-format | ||
2523 | 164 | msgid "Bad response from {0} transport" | 170 | msgid "Bad response from {0} transport" |
2524 | 165 | msgstr "" | 171 | msgstr "" |
2525 | 166 | 172 | ||
2526 | 167 | #. TRANSLATORS: Do not translate the {} format markers. | 173 | #. TRANSLATORS: Do not translate the {} format markers. |
2530 | 168 | #: .././checkbox_ng/commands/newcli.py:479 | 174 | #: .././checkbox_ng/commands/newcli.py:464 |
2531 | 169 | #, python-brace-format | 175 | msgid "Submitting results to {0} for secure_id {1}" |
2529 | 170 | msgid "Submitting results to {0} for secure_id {1})" | ||
2532 | 171 | msgstr "" | 176 | msgstr "" |
2533 | 172 | 177 | ||
2534 | 173 | #. TRANSLATORS: Do not translate the {} format marker. | 178 | #. TRANSLATORS: Do not translate the {} format marker. |
2538 | 174 | #: .././checkbox_ng/commands/newcli.py:500 | 179 | #: .././checkbox_ng/commands/newcli.py:485 |
2539 | 175 | #: .././checkbox_ng/commands/sru.py:142 | 180 | #: .././checkbox_ng/commands/submit.py:64 |
2537 | 176 | #, python-brace-format | ||
2540 | 177 | msgid "Successfully sent, submission status at {0}" | 181 | msgid "Successfully sent, submission status at {0}" |
2541 | 178 | msgstr "" | 182 | msgstr "" |
2542 | 179 | 183 | ||
2543 | 180 | #. TRANSLATORS: Do not translate the {} format marker. | 184 | #. TRANSLATORS: Do not translate the {} format marker. |
2547 | 181 | #: .././checkbox_ng/commands/newcli.py:504 | 185 | #: .././checkbox_ng/commands/newcli.py:489 |
2548 | 182 | #: .././checkbox_ng/commands/sru.py:145 | 186 | #: .././checkbox_ng/commands/submit.py:68 |
2546 | 183 | #, python-brace-format | ||
2549 | 184 | msgid "Successfully sent, server response: {0}" | 187 | msgid "Successfully sent, server response: {0}" |
2550 | 185 | msgstr "" | 188 | msgstr "" |
2551 | 186 | 189 | ||
2553 | 187 | #: .././checkbox_ng/commands/newcli.py:525 | 190 | #: .././checkbox_ng/commands/newcli.py:514 |
2554 | 188 | msgid "Select jobs to re-run" | 191 | msgid "Select jobs to re-run" |
2555 | 189 | msgstr "" | 192 | msgstr "" |
2556 | 190 | 193 | ||
2618 | 191 | #: .././checkbox_ng/commands/service.py:79 | 194 | #: .././checkbox_ng/commands/sru.py:58 .././checkbox_ng/commands/submit.py:121 |
2619 | 192 | msgid "Setting up DBus objects..." | 195 | msgid "SECURE-ID" |
2620 | 193 | msgstr "" | 196 | msgstr "BEZPIECZNE-ID" |
2621 | 194 | 197 | ||
2622 | 195 | #. TODO: load sessions | 198 | #: .././checkbox_ng/commands/sru.py:61 |
2623 | 196 | #: .././checkbox_ng/commands/service.py:81 | 199 | msgid "Canonical hardware identifier" |
2624 | 197 | msgid "Constructing Service object" | 200 | msgstr "" |
2625 | 198 | msgstr "" | 201 | |
2626 | 199 | 202 | #: .././checkbox_ng/commands/sru.py:65 | |
2627 | 200 | #: .././checkbox_ng/commands/service.py:83 | 203 | msgid "TEST-PLAN-ID" |
2628 | 201 | msgid "Constructing ServiceWrapper" | 204 | msgstr "" |
2629 | 202 | msgstr "" | 205 | |
2630 | 203 | 206 | #. TRANSLATORS: this is in imperative form | |
2631 | 204 | #: .././checkbox_ng/commands/service.py:85 | 207 | #: .././checkbox_ng/commands/sru.py:68 |
2632 | 205 | msgid "Publishing all objects on DBus" | 208 | msgid "load the specified test plan" |
2633 | 206 | msgstr "" | 209 | msgstr "" |
2634 | 207 | 210 | ||
2635 | 208 | #: .././checkbox_ng/commands/service.py:88 | 211 | #: .././checkbox_ng/commands/sru.py:71 .././checkbox_ng/config.py:88 |
2636 | 209 | msgid "Publishing all managed objects (events should fire there)" | 212 | msgid "Send the data to non-production test server" |
2637 | 210 | msgstr "" | 213 | msgstr "" |
2638 | 211 | 214 | ||
2639 | 212 | #: .././checkbox_ng/commands/service.py:90 | 215 | #: .././checkbox_ng/commands/sru.py:75 |
2640 | 213 | #, python-format | 216 | msgid "run check-config before starting" |
2641 | 214 | msgid "Attempting to claim bus name: %s" | 217 | msgstr "" |
2642 | 215 | msgstr "" | 218 | |
2582 | 216 | |||
2583 | 217 | #: .././checkbox_ng/commands/service.py:93 | ||
2584 | 218 | #, python-format | ||
2585 | 219 | msgid "PlainBox DBus service ready, claimed name: %s" | ||
2586 | 220 | msgstr "" | ||
2587 | 221 | |||
2588 | 222 | #: .././checkbox_ng/commands/service.py:99 | ||
2589 | 223 | msgid "" | ||
2590 | 224 | "Main loop interrupted! It is recommended to call the Exit() method on the " | ||
2591 | 225 | "exported service object instead" | ||
2592 | 226 | msgstr "" | ||
2593 | 227 | |||
2594 | 228 | #: .././checkbox_ng/commands/service.py:103 | ||
2595 | 229 | #, python-format | ||
2596 | 230 | msgid "Releasing %s" | ||
2597 | 231 | msgstr "" | ||
2598 | 232 | |||
2599 | 233 | #: .././checkbox_ng/commands/service.py:108 | ||
2600 | 234 | #, python-format | ||
2601 | 235 | msgid "Closing %s" | ||
2602 | 236 | msgstr "" | ||
2603 | 237 | |||
2604 | 238 | #: .././checkbox_ng/commands/service.py:110 | ||
2605 | 239 | msgid "Main loop terminated, exiting..." | ||
2606 | 240 | msgstr "" | ||
2607 | 241 | |||
2608 | 242 | #: .././checkbox_ng/commands/service.py:122 | ||
2609 | 243 | msgid "spawn dbus service" | ||
2610 | 244 | msgstr "" | ||
2611 | 245 | |||
2612 | 246 | #: .././checkbox_ng/commands/service.py:129 | ||
2613 | 247 | msgid "use the specified DBus bus name" | ||
2614 | 248 | msgstr "" | ||
2615 | 249 | |||
2616 | 250 | #. Handle possible DependencyDuplicateError that can happen if | ||
2617 | 251 | #. someone is using plainbox for job development. | ||
2643 | 252 | #: .././checkbox_ng/commands/sru.py:88 | 219 | #: .././checkbox_ng/commands/sru.py:88 |
2665 | 253 | msgid "The job database you are currently using is broken" | 220 | msgid "Configuration problems prevent running SRU tests" |
2666 | 254 | msgstr "" | 221 | msgstr "" |
2667 | 255 | "Baza danych zawierająca zadania testowe której teraz używasz jest popsuta" | 222 | |
2668 | 256 | 223 | #: .././checkbox_ng/commands/sru.py:113 | |
2669 | 257 | #: .././checkbox_ng/commands/sru.py:89 | 224 | msgid "Results saved to {0}" |
2670 | 258 | #, python-brace-format | 225 | msgstr "" |
2650 | 259 | msgid "At least two jobs contend for the name {0}" | ||
2651 | 260 | msgstr "" | ||
2652 | 261 | |||
2653 | 262 | #: .././checkbox_ng/commands/sru.py:91 | ||
2654 | 263 | #, python-brace-format | ||
2655 | 264 | msgid "Second job defined in: {0}" | ||
2656 | 265 | msgstr "Drugie zadanie zdefiniowano w: {0}" | ||
2657 | 266 | |||
2658 | 267 | #: .././checkbox_ng/commands/sru.py:112 | ||
2659 | 268 | msgid "There were some problems with the selected jobs" | ||
2660 | 269 | msgstr "Wystąpiły problemy z wybranymi zadaniami" | ||
2661 | 270 | |||
2662 | 271 | #: .././checkbox_ng/commands/sru.py:115 | ||
2663 | 272 | msgid "Problematic jobs will not be considered" | ||
2664 | 273 | msgstr "Problematyczne zadania nie zostaną wzięte pod uwagę" | ||
2671 | 274 | 226 | ||
2672 | 275 | #: .././checkbox_ng/commands/sru.py:118 | 227 | #: .././checkbox_ng/commands/sru.py:118 |
2701 | 276 | #, python-brace-format | 228 | msgid "Sending hardware report to Canonical Certification" |
2702 | 277 | msgid "Saving results to {0}" | 229 | msgstr "" |
2703 | 278 | msgstr "" | 230 | |
2704 | 279 | 231 | #: .././checkbox_ng/commands/sru.py:119 | |
2705 | 280 | #: .././checkbox_ng/commands/sru.py:125 | 232 | msgid "Server URL is: {0}" |
2706 | 281 | #, python-brace-format | 233 | msgstr "" |
2707 | 282 | msgid "Submitting results to {0} for secure_id {1}" | 234 | |
2708 | 283 | msgstr "" | 235 | #: .././checkbox_ng/commands/sru.py:131 |
2709 | 284 | 236 | msgid "SRU Session" | |
2710 | 285 | #: .././checkbox_ng/commands/sru.py:150 | 237 | msgstr "" |
2711 | 286 | #, python-brace-format | 238 | |
2712 | 287 | msgid "Problem reading a file: {0}" | 239 | #: .././checkbox_ng/commands/sru.py:172 |
2685 | 288 | msgstr "" | ||
2686 | 289 | |||
2687 | 290 | #: .././checkbox_ng/commands/sru.py:180 | ||
2688 | 291 | #, python-brace-format | ||
2689 | 292 | msgid "comments: {0}" | ||
2690 | 293 | msgstr "komentarze: {0}" | ||
2691 | 294 | |||
2692 | 295 | #: .././checkbox_ng/commands/sru.py:182 | ||
2693 | 296 | msgid "inhibitors:" | ||
2694 | 297 | msgstr "ograniczniki:" | ||
2695 | 298 | |||
2696 | 299 | #: .././checkbox_ng/commands/sru.py:220 | ||
2697 | 300 | msgid "Configuration problems prevent running SRU tests" | ||
2698 | 301 | msgstr "" | ||
2699 | 302 | |||
2700 | 303 | #: .././checkbox_ng/commands/sru.py:236 | ||
2713 | 304 | msgid "run automated stable release update tests" | 240 | msgid "run automated stable release update tests" |
2714 | 305 | msgstr "uruchom automatyczne testy aktualizacji wydania stabilnego" | 241 | msgstr "uruchom automatyczne testy aktualizacji wydania stabilnego" |
2715 | 306 | 242 | ||
2727 | 307 | #: .././checkbox_ng/commands/sru.py:241 | 243 | #. TRANSLATORS: please leave various options (both long and short forms), |
2728 | 308 | msgid "run check-config before starting" | 244 | #. environment variables and paths in their original form. Also keep the |
2729 | 309 | msgstr "" | 245 | #. special @EPILOG@ string. The first line of the translation is special and |
2730 | 310 | 246 | #. is used as the help message. Please keep the pseudo-statement form and | |
2731 | 311 | #: .././checkbox_ng/commands/sru.py:249 | 247 | #. don't finish the sentence with a dot. Pay extra attention to whitespace. |
2732 | 312 | msgid "SECURE-ID" | 248 | #. It must be correctly preserved or the result won't work. In particular |
2733 | 313 | msgstr "BEZPIECZNE-ID" | 249 | #. the leading whitespace *must* be preserved and *must* have the same |
2734 | 314 | 250 | #. length on each line. | |
2735 | 315 | #. TRANSLATORS: Do not translate %(default) | 251 | #: .././checkbox_ng/commands/submit.py:81 |
2725 | 316 | #: .././checkbox_ng/commands/sru.py:254 | ||
2726 | 317 | #, python-format | ||
2736 | 318 | msgid "" | 252 | msgid "" |
2751 | 319 | "associate submission with a machine using this SECURE-ID (%(default)s)" | 253 | "\n" |
2752 | 320 | msgstr "" | 254 | " submit test results to the Canonical certification website\n" |
2753 | 321 | 255 | "\n" | |
2754 | 322 | #: .././checkbox_ng/commands/sru.py:257 | 256 | " This command sends the XML results file to the Certification website.\n" |
2755 | 323 | msgid "FILE" | 257 | " " |
2756 | 324 | msgstr "PLIK" | 258 | msgstr "" |
2757 | 325 | 259 | ||
2758 | 326 | #. TRANSLATORS: Do not translate %(default)s | 260 | #: .././checkbox_ng/commands/submit.py:98 |
2759 | 327 | #: .././checkbox_ng/commands/sru.py:262 | 261 | msgid "submit test results to the Canonical certification website" |
2760 | 328 | #, python-format | 262 | msgstr "" |
2761 | 329 | msgid "if submission fails save the test report as FILE (%(default)s)" | 263 | |
2762 | 330 | msgstr "" | 264 | #: .././checkbox_ng/commands/submit.py:104 |
2763 | 331 | 265 | msgid "The path to the results xml file" | |
2764 | 332 | #: .././checkbox_ng/commands/sru.py:265 | 266 | msgstr "" |
2765 | 267 | |||
2766 | 268 | #: .././checkbox_ng/commands/submit.py:114 | ||
2767 | 269 | msgid "must be 15 or 18-character alphanumeric string" | ||
2768 | 270 | msgstr "" | ||
2769 | 271 | |||
2770 | 272 | #: .././checkbox_ng/commands/submit.py:124 | ||
2771 | 273 | msgid "associate submission with a machine using this SECURE-ID" | ||
2772 | 274 | msgstr "" | ||
2773 | 275 | |||
2774 | 276 | #: .././checkbox_ng/commands/submit.py:152 | ||
2775 | 333 | msgid "URL" | 277 | msgid "URL" |
2776 | 334 | msgstr "URL" | 278 | msgstr "URL" |
2777 | 335 | 279 | ||
2791 | 336 | #. TRANSLATORS: Do not translate %(default)s | 280 | #: .././checkbox_ng/commands/submit.py:154 |
2792 | 337 | #: .././checkbox_ng/commands/sru.py:269 | 281 | msgid "destination to submit to" |
2793 | 338 | #, python-format | 282 | msgstr "" |
2781 | 339 | msgid "POST the test report XML to this URL (%(default)s)" | ||
2782 | 340 | msgstr "" | ||
2783 | 341 | |||
2784 | 342 | #: .././checkbox_ng/commands/sru.py:277 | ||
2785 | 343 | msgid "override --destination to use the staging certification website" | ||
2786 | 344 | msgstr "" | ||
2787 | 345 | |||
2788 | 346 | #: .././checkbox_ng/commands/sru.py:284 | ||
2789 | 347 | msgid "don't really run most jobs" | ||
2790 | 348 | msgstr "tak na prawdę nie uruchamiaj większości zadań" | ||
2794 | 349 | 283 | ||
2795 | 350 | #: .././checkbox_ng/config.py:43 | 284 | #: .././checkbox_ng/config.py:43 |
2796 | 351 | msgid "Secure ID of the system" | 285 | msgid "Secure ID of the system" |
2797 | @@ -379,13 +313,81 @@ | |||
2798 | 379 | msgid "Optional whitelist with which to run SRU testing" | 313 | msgid "Optional whitelist with which to run SRU testing" |
2799 | 380 | msgstr "" | 314 | msgstr "" |
2800 | 381 | 315 | ||
2801 | 316 | #: .././checkbox_ng/config.py:82 | ||
2802 | 317 | msgid "Optional test plan with which to run SRU testing" | ||
2803 | 318 | msgstr "" | ||
2804 | 319 | |||
2805 | 320 | #: .././checkbox_ng/launcher.py:47 | ||
2806 | 321 | msgid "Application Title" | ||
2807 | 322 | msgstr "" | ||
2808 | 323 | |||
2809 | 324 | #: .././checkbox_ng/launcher.py:51 | ||
2810 | 325 | msgid "Welcome Message" | ||
2811 | 326 | msgstr "" | ||
2812 | 327 | |||
2813 | 328 | #. TODO: valid regexp text validator | ||
2814 | 329 | #: .././checkbox_ng/launcher.py:56 | ||
2815 | 330 | msgid "Pattern that whitelists need to match to be displayed" | ||
2816 | 331 | msgstr "" | ||
2817 | 332 | |||
2818 | 333 | #. TODO: valid regexp text validator | ||
2819 | 334 | #: .././checkbox_ng/launcher.py:61 | ||
2820 | 335 | msgid "Pattern that whitelists need to match to be selected" | ||
2821 | 336 | msgstr "" | ||
2822 | 337 | |||
2823 | 338 | #: .././checkbox_ng/launcher.py:67 | ||
2824 | 339 | msgid "If enabled then suite selection screen is not displayed" | ||
2825 | 340 | msgstr "" | ||
2826 | 341 | |||
2827 | 342 | #: .././checkbox_ng/launcher.py:73 | ||
2828 | 343 | msgid "If enabled then test selection screen is not displayed" | ||
2829 | 344 | msgstr "" | ||
2830 | 345 | |||
2831 | 346 | #. TODO: probably a choice validator | ||
2832 | 347 | #: .././checkbox_ng/launcher.py:78 | ||
2833 | 348 | msgid "Type of the input field?" | ||
2834 | 349 | msgstr "" | ||
2835 | 350 | |||
2836 | 351 | #: .././checkbox_ng/launcher.py:82 | ||
2837 | 352 | msgid "Label on the 'send' button" | ||
2838 | 353 | msgstr "" | ||
2839 | 354 | |||
2840 | 355 | #. TODO: default? | ||
2841 | 356 | #: .././checkbox_ng/launcher.py:88 | ||
2842 | 357 | msgid "If enabled then test results will be also sent to HEXR" | ||
2843 | 358 | msgstr "" | ||
2844 | 359 | |||
2845 | 360 | #: .././checkbox_ng/launcher.py:93 | ||
2846 | 361 | msgid "Where to submit the test results to" | ||
2847 | 362 | msgstr "" | ||
2848 | 363 | |||
2849 | 364 | #: .././checkbox_ng/launcher.py:98 | ||
2850 | 365 | msgid "" | ||
2851 | 366 | "HTTP endpoint to submit data to, using the transport specified with " | ||
2852 | 367 | "submit_to." | ||
2853 | 368 | msgstr "" | ||
2854 | 369 | |||
2855 | 370 | #: .././checkbox_ng/launcher.py:104 | ||
2856 | 371 | msgid "Secure ID to identify the system this submission belongs to." | ||
2857 | 372 | msgstr "" | ||
2858 | 373 | |||
2859 | 374 | #: .././checkbox_ng/launcher.py:109 | ||
2860 | 375 | msgid "Name of custom configuration file" | ||
2861 | 376 | msgstr "" | ||
2862 | 377 | |||
2863 | 378 | #: .././checkbox_ng/launcher.py:113 | ||
2864 | 379 | msgid "Don't suppress the output of certain job plugin types." | ||
2865 | 380 | msgstr "" | ||
2866 | 381 | |||
2867 | 382 | #: .././checkbox_ng/launcher.py:116 | ||
2868 | 383 | msgid "Section with only exported unit ids as keys (no values)" | ||
2869 | 384 | msgstr "" | ||
2870 | 385 | |||
2871 | 382 | #: .././checkbox_ng/launchpad.py:66 | 386 | #: .././checkbox_ng/launchpad.py:66 |
2872 | 383 | #, python-brace-format | ||
2873 | 384 | msgid "Cannot get {0} resource job" | 387 | msgid "Cannot get {0} resource job" |
2874 | 385 | msgstr "Nie można uzyskać zadania zasobu {0}" | 388 | msgstr "Nie można uzyskać zadania zasobu {0}" |
2875 | 386 | 389 | ||
2876 | 387 | #: .././checkbox_ng/launchpad.py:70 | 390 | #: .././checkbox_ng/launchpad.py:70 |
2877 | 388 | #, python-brace-format | ||
2878 | 389 | msgid "{0} has no attribute {1}" | 391 | msgid "{0} has no attribute {1}" |
2879 | 390 | msgstr "{0} nie ma atrybutu {1}" | 392 | msgstr "{0} nie ma atrybutu {1}" |
2880 | 391 | 393 | ||
2881 | @@ -406,180 +408,22 @@ | |||
2882 | 406 | msgid "The submission was uploaded to Launchpad successfully" | 408 | msgid "The submission was uploaded to Launchpad successfully" |
2883 | 407 | msgstr "" | 409 | msgstr "" |
2884 | 408 | 410 | ||
2885 | 409 | #: .././checkbox_ng/service.py:37 | ||
2886 | 410 | msgid "DBus parts require 'funcsigs' from pypi." | ||
2887 | 411 | msgstr "" | ||
2888 | 412 | |||
2889 | 413 | #: .././checkbox_ng/service.py:86 | ||
2890 | 414 | #, python-format | ||
2891 | 415 | msgid "Created DBus wrapper %s for: %r" | ||
2892 | 416 | msgstr "" | ||
2893 | 417 | |||
2894 | 418 | #: .././checkbox_ng/service.py:90 | ||
2895 | 419 | #, python-format | ||
2896 | 420 | msgid "DBus wrapper %s died" | ||
2897 | 421 | msgstr "" | ||
2898 | 422 | |||
2899 | 423 | #: .././checkbox_ng/service.py:122 | ||
2900 | 424 | #, python-format | ||
2901 | 425 | msgid "Published DBus wrapper for %r as %s" | ||
2902 | 426 | msgstr "" | ||
2903 | 427 | |||
2904 | 428 | #: .././checkbox_ng/service.py:169 .././checkbox_ng/service.py:180 | ||
2905 | 429 | #, python-brace-format | ||
2906 | 430 | msgid "object path {0} does not designate an existing object" | ||
2907 | 431 | msgstr "" | ||
2908 | 432 | |||
2909 | 433 | #: .././checkbox_ng/service.py:188 | ||
2910 | 434 | #, python-format | ||
2911 | 435 | msgid "" | ||
2912 | 436 | "Application error: %r should have returned native object but returned " | ||
2913 | 437 | "wrapper instead" | ||
2914 | 438 | msgstr "" | ||
2915 | 439 | |||
2916 | 440 | #: .././checkbox_ng/service.py:195 .././checkbox_ng/service.py:206 | ||
2917 | 441 | #: .././checkbox_ng/service.py:217 | ||
2918 | 442 | #, python-brace-format | ||
2919 | 443 | msgid "({0}) internal error, unable to lookup object wrapper" | ||
2920 | 444 | msgstr "" | ||
2921 | 445 | |||
2922 | 446 | #: .././checkbox_ng/service.py:224 | ||
2923 | 447 | #, python-format | ||
2924 | 448 | msgid "wrapped %s called with %s" | ||
2925 | 449 | msgstr "" | ||
2926 | 450 | |||
2927 | 451 | #: .././checkbox_ng/service.py:240 .././checkbox_ng/service.py:256 | ||
2928 | 452 | msgid "unsupported translation {!r}" | ||
2929 | 453 | msgstr "" | ||
2930 | 454 | |||
2931 | 455 | #: .././checkbox_ng/service.py:243 | ||
2932 | 456 | #, python-format | ||
2933 | 457 | msgid "unwrapped %s called with %s" | ||
2934 | 458 | msgstr "" | ||
2935 | 459 | |||
2936 | 460 | #: .././checkbox_ng/service.py:245 | ||
2937 | 461 | #, python-format | ||
2938 | 462 | msgid "unwrapped %s returned %r" | ||
2939 | 463 | msgstr "" | ||
2940 | 464 | |||
2941 | 465 | #: .././checkbox_ng/service.py:258 | ||
2942 | 466 | #, python-format | ||
2943 | 467 | msgid "wrapped %s returned %r" | ||
2944 | 468 | msgstr "" | ||
2945 | 469 | |||
2946 | 470 | #: .././checkbox_ng/service.py:769 | ||
2947 | 471 | #, python-format | ||
2948 | 472 | msgid "Adding result %r to DBus" | ||
2949 | 473 | msgstr "" | ||
2950 | 474 | |||
2951 | 475 | #: .././checkbox_ng/service.py:788 | ||
2952 | 476 | #, python-format | ||
2953 | 477 | msgid "Removing result %r from DBus" | ||
2954 | 478 | msgstr "" | ||
2955 | 479 | |||
2956 | 480 | #: .././checkbox_ng/service.py:811 | ||
2957 | 481 | #, python-format | ||
2958 | 482 | msgid "Adding job %r to DBus" | ||
2959 | 483 | msgstr "" | ||
2960 | 484 | |||
2961 | 485 | #: .././checkbox_ng/service.py:843 | ||
2962 | 486 | #, python-format | ||
2963 | 487 | msgid "Adding job state %r to DBus" | ||
2964 | 488 | msgstr "" | ||
2965 | 489 | |||
2966 | 490 | #: .././checkbox_ng/service.py:875 | ||
2967 | 491 | #, python-brace-format | ||
2968 | 492 | msgid "Unable to wrap object of type {0}" | ||
2969 | 493 | msgstr "" | ||
2970 | 494 | |||
2971 | 495 | #: .././checkbox_ng/service.py:1000 | ||
2972 | 496 | msgid "Remove() completed" | ||
2973 | 497 | msgstr "" | ||
2974 | 498 | |||
2975 | 499 | #: .././checkbox_ng/service.py:1075 | ||
2976 | 500 | #, python-format | ||
2977 | 501 | msgid "AskForOutcome(%r) suggested outcome is (%s)" | ||
2978 | 502 | msgstr "" | ||
2979 | 503 | |||
2980 | 504 | #. NOTE: this should: | ||
2981 | 505 | #. 1) attempt to cancel the future in the extremely rare case where it | ||
2982 | 506 | #. is not started yet | ||
2983 | 507 | #. 2) kill the job otherwise | ||
2984 | 508 | #: .././checkbox_ng/service.py:1391 | ||
2985 | 509 | msgid "Kill() is not implemented" | ||
2986 | 510 | msgstr "" | ||
2987 | 511 | |||
2988 | 512 | #: .././checkbox_ng/service.py:1411 | ||
2989 | 513 | msgid "RunCommand() should not be called for automated jobs" | ||
2990 | 514 | msgstr "" | ||
2991 | 515 | |||
2992 | 516 | #: .././checkbox_ng/service.py:1413 | ||
2993 | 517 | msgid "RunCommand() is starting to run the job" | ||
2994 | 518 | msgstr "" | ||
2995 | 519 | |||
2996 | 520 | #: .././checkbox_ng/service.py:1417 | ||
2997 | 521 | msgid "RunCommand() ignored, waiting for command to finish" | ||
2998 | 522 | msgstr "" | ||
2999 | 523 | |||
3000 | 524 | #: .././checkbox_ng/service.py:1435 | ||
3001 | 525 | msgid "SetOutcome() called while the command is still running!" | ||
3002 | 526 | msgstr "" | ||
3003 | 527 | |||
3004 | 528 | #: .././checkbox_ng/service.py:1442 | ||
3005 | 529 | msgid "SetOutcome() called before RunCommand()" | ||
3006 | 530 | msgstr "funkcja SetOutcome() wywołana przed RunCommand()" | ||
3007 | 531 | |||
3008 | 532 | #. TRANSLATORS: don't translate 'manual' translate it as | ||
3009 | 533 | #. 'of type manual' and leave the 'manual' string | ||
3010 | 534 | #. intact. | ||
3011 | 535 | #: .././checkbox_ng/service.py:1447 | ||
3012 | 536 | #, python-format | ||
3013 | 537 | msgid "But the job is not manual, it is %s" | ||
3014 | 538 | msgstr "Lecz zadanie nie jest typu manual, jest typu %s" | ||
3015 | 539 | |||
3016 | 540 | #: .././checkbox_ng/service.py:1480 | ||
3017 | 541 | msgid "outcome_from_command() called too early!" | ||
3018 | 542 | msgstr "funkcja outcome_from_command() została wywołana zbyt wcześnie" | ||
3019 | 543 | |||
3020 | 544 | #: .././checkbox_ng/service.py:1481 | ||
3021 | 545 | msgid "There is nothing to return yet" | ||
3022 | 546 | msgstr "Nie ma jeszcze nic do zwrócenia" | ||
3023 | 547 | |||
3024 | 548 | #: .././checkbox_ng/service.py:1522 | ||
3025 | 549 | msgid "Sending ShowInteractiveUI() and not starting the job..." | ||
3026 | 550 | msgstr "Wysyłanie ShowInteractiveUI() i nie uruchamianie zadania..." | ||
3027 | 551 | |||
3028 | 552 | #: .././checkbox_ng/service.py:1526 | ||
3029 | 553 | #, python-format | ||
3030 | 554 | msgid "Running %r right away" | ||
3031 | 555 | msgstr "Uruchamianie %r od razu" | ||
3032 | 556 | |||
3033 | 557 | #: .././checkbox_ng/service.py:1563 | ||
3034 | 558 | #, python-format | ||
3035 | 559 | msgid "calling JobResultAvailable(%r, %r)" | ||
3036 | 560 | msgstr "wywoływanie JobResourceAvailalbe(%r, %r)" | ||
3037 | 561 | |||
3038 | 562 | #: .././checkbox_ng/service.py:1570 | ||
3039 | 563 | msgid "" | ||
3040 | 564 | "sending AskForOutcome() after job finished running with OUTCOME_UNDECIDED" | ||
3041 | 565 | msgstr "" | ||
3042 | 566 | |||
3043 | 567 | #: .././checkbox_ng/ui.py:73 | 411 | #: .././checkbox_ng/ui.py:73 |
3044 | 568 | msgid "< Continue >" | 412 | msgid "< Continue >" |
3045 | 569 | msgstr "" | 413 | msgstr "" |
3046 | 570 | 414 | ||
3048 | 571 | #: .././checkbox_ng/ui.py:191 .././checkbox_ng/ui.py:318 | 415 | #: .././checkbox_ng/ui.py:194 .././checkbox_ng/ui.py:321 |
3049 | 572 | msgid "Enter" | 416 | msgid "Enter" |
3050 | 573 | msgstr "" | 417 | msgstr "" |
3051 | 574 | 418 | ||
3053 | 575 | #: .././checkbox_ng/ui.py:194 .././checkbox_ng/ui.py:321 | 419 | #: .././checkbox_ng/ui.py:197 .././checkbox_ng/ui.py:324 |
3054 | 576 | msgid ": Expand/Collapse" | 420 | msgid ": Expand/Collapse" |
3055 | 577 | msgstr "" | 421 | msgstr "" |
3056 | 578 | 422 | ||
3058 | 579 | #: .././checkbox_ng/ui.py:210 | 423 | #: .././checkbox_ng/ui.py:213 |
3059 | 580 | msgid "Start " | 424 | msgid "Start " |
3060 | 581 | msgstr "" | 425 | msgstr "" |
3061 | 582 | 426 | ||
3063 | 583 | #: .././checkbox_ng/ui.py:342 | 427 | #: .././checkbox_ng/ui.py:345 |
3064 | 584 | msgid "inish" | 428 | msgid "inish" |
3065 | 585 | msgstr "" | 429 | msgstr "" |
3066 | 586 | 430 | ||
3067 | === added file 'checkbox-ng/po/zh_TW.po' | |||
3068 | --- checkbox-ng/po/zh_TW.po 1970-01-01 00:00:00 +0000 | |||
3069 | +++ checkbox-ng/po/zh_TW.po 2016-01-05 21:24:37 +0000 | |||
3070 | @@ -0,0 +1,433 @@ | |||
3071 | 1 | # Chinese (Traditional) translation for checkbox | ||
3072 | 2 | # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 | ||
3073 | 3 | # This file is distributed under the same license as the checkbox package. | ||
3074 | 4 | # FIRST AUTHOR <EMAIL@ADDRESS>, 2015. | ||
3075 | 5 | # | ||
3076 | 6 | msgid "" | ||
3077 | 7 | msgstr "" | ||
3078 | 8 | "Project-Id-Version: checkbox\n" | ||
3079 | 9 | "Report-Msgid-Bugs-To: \n" | ||
3080 | 10 | "POT-Creation-Date: 2015-12-23 18:53+0800\n" | ||
3081 | 11 | "PO-Revision-Date: 2015-12-23 03:46+0000\n" | ||
3082 | 12 | "Last-Translator: Po-Hsu Lin <po-hsu.lin@canonical.com>\n" | ||
3083 | 13 | "Language-Team: Chinese (Traditional) <zh_TW@li.org>\n" | ||
3084 | 14 | "MIME-Version: 1.0\n" | ||
3085 | 15 | "Content-Type: text/plain; charset=UTF-8\n" | ||
3086 | 16 | "Content-Transfer-Encoding: 8bit\n" | ||
3087 | 17 | "X-Launchpad-Export-Date: 2015-12-26 05:07+0000\n" | ||
3088 | 18 | "X-Generator: Launchpad (build 17865)\n" | ||
3089 | 19 | "Language: \n" | ||
3090 | 20 | |||
3091 | 21 | #: .././checkbox_ng/certification.py:135 | ||
3092 | 22 | msgid "Secure ID not specified" | ||
3093 | 23 | msgstr "" | ||
3094 | 24 | |||
3095 | 25 | #: .././checkbox_ng/certification.py:138 | ||
3096 | 26 | #, python-format | ||
3097 | 27 | msgid "Sending to %s, hardware id is %s" | ||
3098 | 28 | msgstr "" | ||
3099 | 29 | |||
3100 | 30 | #: .././checkbox_ng/certification.py:144 | ||
3101 | 31 | #, python-format | ||
3102 | 32 | msgid "submit_to_hexr set to %s by config" | ||
3103 | 33 | msgstr "" | ||
3104 | 34 | |||
3105 | 35 | #: .././checkbox_ng/certification.py:148 | ||
3106 | 36 | #, python-format | ||
3107 | 37 | msgid "submit_to_hexr set to %s by UI" | ||
3108 | 38 | msgstr "" | ||
3109 | 39 | |||
3110 | 40 | #: .././checkbox_ng/certification.py:164 .././checkbox_ng/launchpad.py:183 | ||
3111 | 41 | msgid "Request to {0} timed out: {1}" | ||
3112 | 42 | msgstr "至 {0} 的要求逾時:{1}" | ||
3113 | 43 | |||
3114 | 44 | #: .././checkbox_ng/certification.py:167 .././checkbox_ng/launchpad.py:186 | ||
3115 | 45 | msgid "Invalid destination URL: {0}" | ||
3116 | 46 | msgstr "無效的目標網址:{0}" | ||
3117 | 47 | |||
3118 | 48 | #: .././checkbox_ng/certification.py:170 .././checkbox_ng/launchpad.py:189 | ||
3119 | 49 | msgid "Unable to connect to {0}: {1}" | ||
3120 | 50 | msgstr "無法連線至 {0}: {1}" | ||
3121 | 51 | |||
3122 | 52 | #: .././checkbox_ng/certification.py:189 | ||
3123 | 53 | msgid "secure_id must be 15 or 18-character alphanumeric string" | ||
3124 | 54 | msgstr "" | ||
3125 | 55 | |||
3126 | 56 | #: .././checkbox_ng/commands/cli.py:70 | ||
3127 | 57 | msgid "run check-config" | ||
3128 | 58 | msgstr "執行 check-config" | ||
3129 | 59 | |||
3130 | 60 | #: .././checkbox_ng/commands/cli.py:71 | ||
3131 | 61 | #: .././checkbox_ng/commands/launcher.py:108 | ||
3132 | 62 | msgid "user interface options" | ||
3133 | 63 | msgstr "使用者介面選項" | ||
3134 | 64 | |||
3135 | 65 | #: .././checkbox_ng/commands/cli.py:77 | ||
3136 | 66 | #: .././checkbox_ng/commands/launcher.py:111 | ||
3137 | 67 | msgid "skip tests that require interactivity" | ||
3138 | 68 | msgstr "" | ||
3139 | 69 | |||
3140 | 70 | #: .././checkbox_ng/commands/cli.py:80 | ||
3141 | 71 | msgid "don't suppress the output of certain job plugin types" | ||
3142 | 72 | msgstr "" | ||
3143 | 73 | |||
3144 | 74 | #: .././checkbox_ng/commands/launcher.py:64 | ||
3145 | 75 | #, python-format | ||
3146 | 76 | msgid "Unable to load launcher definition: %s" | ||
3147 | 77 | msgstr "" | ||
3148 | 78 | |||
3149 | 79 | #: .././checkbox_ng/commands/launcher.py:69 | ||
3150 | 80 | msgid "Unable to start launcher because of errors:" | ||
3151 | 81 | msgstr "" | ||
3152 | 82 | |||
3153 | 83 | #: .././checkbox_ng/commands/launcher.py:102 | ||
3154 | 84 | msgid "LAUNCHER" | ||
3155 | 85 | msgstr "" | ||
3156 | 86 | |||
3157 | 87 | #: .././checkbox_ng/commands/launcher.py:103 | ||
3158 | 88 | msgid "launcher definition file to use" | ||
3159 | 89 | msgstr "" | ||
3160 | 90 | |||
3161 | 91 | #: .././checkbox_ng/commands/newcli.py:119 | ||
3162 | 92 | #: .././checkbox_ng/commands/newcli.py:130 | ||
3163 | 93 | #, python-format | ||
3164 | 94 | msgid "Incorrect pattern %r: %s" | ||
3165 | 95 | msgstr "" | ||
3166 | 96 | |||
3167 | 97 | #: .././checkbox_ng/commands/newcli.py:147 | ||
3168 | 98 | #, python-format | ||
3169 | 99 | msgid "There is no test plan: %s" | ||
3170 | 100 | msgstr "無此測試計畫:%s" | ||
3171 | 101 | |||
3172 | 102 | #: .././checkbox_ng/commands/newcli.py:236 | ||
3173 | 103 | #, python-format | ||
3174 | 104 | msgid "Selected testplans: %r" | ||
3175 | 105 | msgstr "已選擇的測試計畫:%r" | ||
3176 | 106 | |||
3177 | 107 | #: .././checkbox_ng/commands/newcli.py:259 | ||
3178 | 108 | msgid "Suite selection" | ||
3179 | 109 | msgstr "" | ||
3180 | 110 | |||
3181 | 111 | #: .././checkbox_ng/commands/newcli.py:262 | ||
3182 | 112 | msgid "No testplan selected, aborting" | ||
3183 | 113 | msgstr "沒有選擇任何測試計畫,程式中止" | ||
3184 | 114 | |||
3185 | 115 | #: .././checkbox_ng/commands/newcli.py:291 | ||
3186 | 116 | msgid "Selecting Job Generators" | ||
3187 | 117 | msgstr "" | ||
3188 | 118 | |||
3189 | 119 | #: .././checkbox_ng/commands/newcli.py:310 | ||
3190 | 120 | msgid "Selecting Jobs For Execution" | ||
3191 | 121 | msgstr "" | ||
3192 | 122 | |||
3193 | 123 | #: .././checkbox_ng/commands/newcli.py:317 | ||
3194 | 124 | msgid "Choose tests to run on your system:" | ||
3195 | 125 | msgstr "選擇要在您的系統上執行的測試項目:" | ||
3196 | 126 | |||
3197 | 127 | #: .././checkbox_ng/commands/newcli.py:329 | ||
3198 | 128 | msgid "Results" | ||
3199 | 129 | msgstr "結果" | ||
3200 | 130 | |||
3201 | 131 | #: .././checkbox_ng/commands/newcli.py:368 | ||
3202 | 132 | msgid "View results" | ||
3203 | 133 | msgstr "查看結果" | ||
3204 | 134 | |||
3205 | 135 | #: .././checkbox_ng/commands/newcli.py:397 | ||
3206 | 136 | msgid "" | ||
3207 | 137 | "\n" | ||
3208 | 138 | "Submit results to {0}?" | ||
3209 | 139 | msgstr "" | ||
3210 | 140 | "\n" | ||
3211 | 141 | "傳送結果至 {0}?" | ||
3212 | 142 | |||
3213 | 143 | #: .././checkbox_ng/commands/newcli.py:400 | ||
3214 | 144 | msgid "Secure ID: " | ||
3215 | 145 | msgstr "" | ||
3216 | 146 | |||
3217 | 147 | #: .././checkbox_ng/commands/newcli.py:403 | ||
3218 | 148 | msgid "ERROR: Secure ID must be 15 or 18-character alphanumeric string" | ||
3219 | 149 | msgstr "" | ||
3220 | 150 | |||
3221 | 151 | #: .././checkbox_ng/commands/newcli.py:421 | ||
3222 | 152 | msgid "" | ||
3223 | 153 | "\n" | ||
3224 | 154 | "Submit results to launchpad.net/+hwdb?" | ||
3225 | 155 | msgstr "" | ||
3226 | 156 | "\n" | ||
3227 | 157 | "傳送結果至 launchpad.net/+hwdb?" | ||
3228 | 158 | |||
3229 | 159 | #: .././checkbox_ng/commands/newcli.py:423 | ||
3230 | 160 | msgid "Email address: " | ||
3231 | 161 | msgstr "電子郵件地址: " | ||
3232 | 162 | |||
3233 | 163 | #. TRANSLATORS: Do not translate the {} format markers. | ||
3234 | 164 | #: .././checkbox_ng/commands/newcli.py:439 | ||
3235 | 165 | msgid "Submitting results to {0} for email_address {1}" | ||
3236 | 166 | msgstr "" | ||
3237 | 167 | |||
3238 | 168 | #. TRANSLATORS: Do not translate the {} format marker. | ||
3239 | 169 | #: .././checkbox_ng/commands/newcli.py:450 | ||
3240 | 170 | msgid "Submission uploaded to: {0}" | ||
3241 | 171 | msgstr "" | ||
3242 | 172 | |||
3243 | 173 | #: .././checkbox_ng/commands/newcli.py:456 | ||
3244 | 174 | msgid "Bad response from {0} transport" | ||
3245 | 175 | msgstr "" | ||
3246 | 176 | |||
3247 | 177 | #. TRANSLATORS: Do not translate the {} format markers. | ||
3248 | 178 | #: .././checkbox_ng/commands/newcli.py:464 | ||
3249 | 179 | msgid "Submitting results to {0} for secure_id {1}" | ||
3250 | 180 | msgstr "" | ||
3251 | 181 | |||
3252 | 182 | #. TRANSLATORS: Do not translate the {} format marker. | ||
3253 | 183 | #: .././checkbox_ng/commands/newcli.py:485 | ||
3254 | 184 | #: .././checkbox_ng/commands/submit.py:64 | ||
3255 | 185 | msgid "Successfully sent, submission status at {0}" | ||
3256 | 186 | msgstr "" | ||
3257 | 187 | |||
3258 | 188 | #. TRANSLATORS: Do not translate the {} format marker. | ||
3259 | 189 | #: .././checkbox_ng/commands/newcli.py:489 | ||
3260 | 190 | #: .././checkbox_ng/commands/submit.py:68 | ||
3261 | 191 | msgid "Successfully sent, server response: {0}" | ||
3262 | 192 | msgstr "傳送成功,伺服器回應:{0}" | ||
3263 | 193 | |||
3264 | 194 | #: .././checkbox_ng/commands/newcli.py:514 | ||
3265 | 195 | msgid "Select jobs to re-run" | ||
3266 | 196 | msgstr "" | ||
3267 | 197 | |||
3268 | 198 | #: .././checkbox_ng/commands/sru.py:58 .././checkbox_ng/commands/submit.py:121 | ||
3269 | 199 | msgid "SECURE-ID" | ||
3270 | 200 | msgstr "" | ||
3271 | 201 | |||
3272 | 202 | #: .././checkbox_ng/commands/sru.py:61 | ||
3273 | 203 | msgid "Canonical hardware identifier" | ||
3274 | 204 | msgstr "" | ||
3275 | 205 | |||
3276 | 206 | #: .././checkbox_ng/commands/sru.py:65 | ||
3277 | 207 | msgid "TEST-PLAN-ID" | ||
3278 | 208 | msgstr "" | ||
3279 | 209 | |||
3280 | 210 | #. TRANSLATORS: this is in imperative form | ||
3281 | 211 | #: .././checkbox_ng/commands/sru.py:68 | ||
3282 | 212 | msgid "load the specified test plan" | ||
3283 | 213 | msgstr "" | ||
3284 | 214 | |||
3285 | 215 | #: .././checkbox_ng/commands/sru.py:71 .././checkbox_ng/config.py:88 | ||
3286 | 216 | msgid "Send the data to non-production test server" | ||
3287 | 217 | msgstr "" | ||
3288 | 218 | |||
3289 | 219 | #: .././checkbox_ng/commands/sru.py:75 | ||
3290 | 220 | msgid "run check-config before starting" | ||
3291 | 221 | msgstr "開始前執行 check-config" | ||
3292 | 222 | |||
3293 | 223 | #: .././checkbox_ng/commands/sru.py:88 | ||
3294 | 224 | msgid "Configuration problems prevent running SRU tests" | ||
3295 | 225 | msgstr "設定問題導致無法進行 SRU 測試" | ||
3296 | 226 | |||
3297 | 227 | #: .././checkbox_ng/commands/sru.py:113 | ||
3298 | 228 | msgid "Results saved to {0}" | ||
3299 | 229 | msgstr "" | ||
3300 | 230 | |||
3301 | 231 | #: .././checkbox_ng/commands/sru.py:118 | ||
3302 | 232 | msgid "Sending hardware report to Canonical Certification" | ||
3303 | 233 | msgstr "" | ||
3304 | 234 | |||
3305 | 235 | #: .././checkbox_ng/commands/sru.py:119 | ||
3306 | 236 | msgid "Server URL is: {0}" | ||
3307 | 237 | msgstr "" | ||
3308 | 238 | |||
3309 | 239 | #: .././checkbox_ng/commands/sru.py:131 | ||
3310 | 240 | msgid "SRU Session" | ||
3311 | 241 | msgstr "" | ||
3312 | 242 | |||
3313 | 243 | #: .././checkbox_ng/commands/sru.py:172 | ||
3314 | 244 | msgid "run automated stable release update tests" | ||
3315 | 245 | msgstr "執行自動化穩定發行版更新測試" | ||
3316 | 246 | |||
3317 | 247 | #. TRANSLATORS: please leave various options (both long and short forms), | ||
3318 | 248 | #. environment variables and paths in their original form. Also keep the | ||
3319 | 249 | #. special @EPILOG@ string. The first line of the translation is special and | ||
3320 | 250 | #. is used as the help message. Please keep the pseudo-statement form and | ||
3321 | 251 | #. don't finish the sentence with a dot. Pay extra attention to whitespace. | ||
3322 | 252 | #. It must be correctly preserved or the result won't work. In particular | ||
3323 | 253 | #. the leading whitespace *must* be preserved and *must* have the same | ||
3324 | 254 | #. length on each line. | ||
3325 | 255 | #: .././checkbox_ng/commands/submit.py:81 | ||
3326 | 256 | msgid "" | ||
3327 | 257 | "\n" | ||
3328 | 258 | " submit test results to the Canonical certification website\n" | ||
3329 | 259 | "\n" | ||
3330 | 260 | " This command sends the XML results file to the Certification website.\n" | ||
3331 | 261 | " " | ||
3332 | 262 | msgstr "" | ||
3333 | 263 | |||
3334 | 264 | #: .././checkbox_ng/commands/submit.py:98 | ||
3335 | 265 | msgid "submit test results to the Canonical certification website" | ||
3336 | 266 | msgstr "" | ||
3337 | 267 | |||
3338 | 268 | #: .././checkbox_ng/commands/submit.py:104 | ||
3339 | 269 | msgid "The path to the results xml file" | ||
3340 | 270 | msgstr "" | ||
3341 | 271 | |||
3342 | 272 | #: .././checkbox_ng/commands/submit.py:114 | ||
3343 | 273 | msgid "must be 15 or 18-character alphanumeric string" | ||
3344 | 274 | msgstr "" | ||
3345 | 275 | |||
3346 | 276 | #: .././checkbox_ng/commands/submit.py:124 | ||
3347 | 277 | msgid "associate submission with a machine using this SECURE-ID" | ||
3348 | 278 | msgstr "" | ||
3349 | 279 | |||
3350 | 280 | #: .././checkbox_ng/commands/submit.py:152 | ||
3351 | 281 | msgid "URL" | ||
3352 | 282 | msgstr "網址" | ||
3353 | 283 | |||
3354 | 284 | #: .././checkbox_ng/commands/submit.py:154 | ||
3355 | 285 | msgid "destination to submit to" | ||
3356 | 286 | msgstr "" | ||
3357 | 287 | |||
3358 | 288 | #: .././checkbox_ng/config.py:43 | ||
3359 | 289 | msgid "Secure ID of the system" | ||
3360 | 290 | msgstr "" | ||
3361 | 291 | |||
3362 | 292 | #: .././checkbox_ng/config.py:48 | ||
3363 | 293 | msgid "Whether to send the submission data to c3" | ||
3364 | 294 | msgstr "是否要將結果傳送至 C3" | ||
3365 | 295 | |||
3366 | 296 | #: .././checkbox_ng/config.py:52 | ||
3367 | 297 | msgid "Whether to also send the submission data to HEXR" | ||
3368 | 298 | msgstr "是否也要將結果傳送至 HEXR" | ||
3369 | 299 | |||
3370 | 300 | #: .././checkbox_ng/config.py:58 | ||
3371 | 301 | msgid "Email address to log into the Launchpad HWDB" | ||
3372 | 302 | msgstr "登入 Launchpad 硬體資料庫用的電子郵件地址" | ||
3373 | 303 | |||
3374 | 304 | #: .././checkbox_ng/config.py:63 | ||
3375 | 305 | msgid "URL of the certification website" | ||
3376 | 306 | msgstr "" | ||
3377 | 307 | |||
3378 | 308 | #: .././checkbox_ng/config.py:69 | ||
3379 | 309 | msgid "URL of the launchpad hardware database" | ||
3380 | 310 | msgstr "launchpad 硬體資料庫網址" | ||
3381 | 311 | |||
3382 | 312 | #: .././checkbox_ng/config.py:74 | ||
3383 | 313 | msgid "Location of the fallback file" | ||
3384 | 314 | msgstr "" | ||
3385 | 315 | |||
3386 | 316 | #: .././checkbox_ng/config.py:78 | ||
3387 | 317 | msgid "Optional whitelist with which to run SRU testing" | ||
3388 | 318 | msgstr "" | ||
3389 | 319 | |||
3390 | 320 | #: .././checkbox_ng/config.py:82 | ||
3391 | 321 | msgid "Optional test plan with which to run SRU testing" | ||
3392 | 322 | msgstr "" | ||
3393 | 323 | |||
3394 | 324 | #: .././checkbox_ng/launcher.py:47 | ||
3395 | 325 | msgid "Application Title" | ||
3396 | 326 | msgstr "" | ||
3397 | 327 | |||
3398 | 328 | #: .././checkbox_ng/launcher.py:51 | ||
3399 | 329 | msgid "Welcome Message" | ||
3400 | 330 | msgstr "" | ||
3401 | 331 | |||
3402 | 332 | #. TODO: valid regexp text validator | ||
3403 | 333 | #: .././checkbox_ng/launcher.py:56 | ||
3404 | 334 | msgid "Pattern that whitelists need to match to be displayed" | ||
3405 | 335 | msgstr "" | ||
3406 | 336 | |||
3407 | 337 | #. TODO: valid regexp text validator | ||
3408 | 338 | #: .././checkbox_ng/launcher.py:61 | ||
3409 | 339 | msgid "Pattern that whitelists need to match to be selected" | ||
3410 | 340 | msgstr "" | ||
3411 | 341 | |||
3412 | 342 | #: .././checkbox_ng/launcher.py:67 | ||
3413 | 343 | msgid "If enabled then suite selection screen is not displayed" | ||
3414 | 344 | msgstr "" | ||
3415 | 345 | |||
3416 | 346 | #: .././checkbox_ng/launcher.py:73 | ||
3417 | 347 | msgid "If enabled then test selection screen is not displayed" | ||
3418 | 348 | msgstr "" | ||
3419 | 349 | |||
3420 | 350 | #. TODO: probably a choice validator | ||
3421 | 351 | #: .././checkbox_ng/launcher.py:78 | ||
3422 | 352 | msgid "Type of the input field?" | ||
3423 | 353 | msgstr "" | ||
3424 | 354 | |||
3425 | 355 | #: .././checkbox_ng/launcher.py:82 | ||
3426 | 356 | msgid "Label on the 'send' button" | ||
3427 | 357 | msgstr "" | ||
3428 | 358 | |||
3429 | 359 | #. TODO: default? | ||
3430 | 360 | #: .././checkbox_ng/launcher.py:88 | ||
3431 | 361 | msgid "If enabled then test results will be also sent to HEXR" | ||
3432 | 362 | msgstr "" | ||
3433 | 363 | |||
3434 | 364 | #: .././checkbox_ng/launcher.py:93 | ||
3435 | 365 | msgid "Where to submit the test results to" | ||
3436 | 366 | msgstr "" | ||
3437 | 367 | |||
3438 | 368 | #: .././checkbox_ng/launcher.py:98 | ||
3439 | 369 | msgid "" | ||
3440 | 370 | "HTTP endpoint to submit data to, using the transport specified with " | ||
3441 | 371 | "submit_to." | ||
3442 | 372 | msgstr "" | ||
3443 | 373 | |||
3444 | 374 | #: .././checkbox_ng/launcher.py:104 | ||
3445 | 375 | msgid "Secure ID to identify the system this submission belongs to." | ||
3446 | 376 | msgstr "" | ||
3447 | 377 | |||
3448 | 378 | #: .././checkbox_ng/launcher.py:109 | ||
3449 | 379 | msgid "Name of custom configuration file" | ||
3450 | 380 | msgstr "" | ||
3451 | 381 | |||
3452 | 382 | #: .././checkbox_ng/launcher.py:113 | ||
3453 | 383 | msgid "Don't suppress the output of certain job plugin types." | ||
3454 | 384 | msgstr "" | ||
3455 | 385 | |||
3456 | 386 | #: .././checkbox_ng/launcher.py:116 | ||
3457 | 387 | msgid "Section with only exported unit ids as keys (no values)" | ||
3458 | 388 | msgstr "" | ||
3459 | 389 | |||
3460 | 390 | #: .././checkbox_ng/launchpad.py:66 | ||
3461 | 391 | msgid "Cannot get {0} resource job" | ||
3462 | 392 | msgstr "" | ||
3463 | 393 | |||
3464 | 394 | #: .././checkbox_ng/launchpad.py:70 | ||
3465 | 395 | msgid "{0} has no attribute {1}" | ||
3466 | 396 | msgstr "{0} 沒有 {1} 屬性" | ||
3467 | 397 | |||
3468 | 398 | #: .././checkbox_ng/launchpad.py:97 | ||
3469 | 399 | msgid "DMI resources not found" | ||
3470 | 400 | msgstr "找不到 DMI 資源" | ||
3471 | 401 | |||
3472 | 402 | #: .././checkbox_ng/launchpad.py:110 | ||
3473 | 403 | msgid "System ID not found" | ||
3474 | 404 | msgstr "" | ||
3475 | 405 | |||
3476 | 406 | #: .././checkbox_ng/launchpad.py:196 | ||
3477 | 407 | #, python-format | ||
3478 | 408 | msgid "Success! Server said %s" | ||
3479 | 409 | msgstr "成功!伺服器回應 %s" | ||
3480 | 410 | |||
3481 | 411 | #: .././checkbox_ng/launchpad.py:197 | ||
3482 | 412 | msgid "The submission was uploaded to Launchpad successfully" | ||
3483 | 413 | msgstr "測試報告已成功上傳至 Launchpad" | ||
3484 | 414 | |||
3485 | 415 | #: .././checkbox_ng/ui.py:73 | ||
3486 | 416 | msgid "< Continue >" | ||
3487 | 417 | msgstr "< 繼續 >" | ||
3488 | 418 | |||
3489 | 419 | #: .././checkbox_ng/ui.py:194 .././checkbox_ng/ui.py:321 | ||
3490 | 420 | msgid "Enter" | ||
3491 | 421 | msgstr "Enter 鍵" | ||
3492 | 422 | |||
3493 | 423 | #: .././checkbox_ng/ui.py:197 .././checkbox_ng/ui.py:324 | ||
3494 | 424 | msgid ": Expand/Collapse" | ||
3495 | 425 | msgstr ":展開 / 收起" | ||
3496 | 426 | |||
3497 | 427 | #: .././checkbox_ng/ui.py:213 | ||
3498 | 428 | msgid "Start " | ||
3499 | 429 | msgstr "開始 " | ||
3500 | 430 | |||
3501 | 431 | #: .././checkbox_ng/ui.py:345 | ||
3502 | 432 | msgid "inish" | ||
3503 | 433 | msgstr "" | ||
3504 | 0 | 434 | ||
3505 | === modified file 'checkbox-ng/setup.py' | |||
3506 | --- checkbox-ng/setup.py 2015-09-17 13:32:38 +0000 | |||
3507 | +++ checkbox-ng/setup.py 2016-01-05 21:24:37 +0000 | |||
3508 | @@ -55,7 +55,7 @@ | |||
3509 | 55 | 55 | ||
3510 | 56 | setup( | 56 | setup( |
3511 | 57 | name="checkbox-ng", | 57 | name="checkbox-ng", |
3513 | 58 | version="0.21.dev0", | 58 | version="0.24.dev0", |
3514 | 59 | url="https://launchpad.net/checkbox-ng/", | 59 | url="https://launchpad.net/checkbox-ng/", |
3515 | 60 | packages=find_packages(), | 60 | packages=find_packages(), |
3516 | 61 | author="Zygmunt Krynicki", | 61 | author="Zygmunt Krynicki", |
3517 | @@ -65,7 +65,7 @@ | |||
3518 | 65 | description="Checkbox - Command Line Test Runner", | 65 | description="Checkbox - Command Line Test Runner", |
3519 | 66 | long_description=long_description, | 66 | long_description=long_description, |
3520 | 67 | install_requires=install_requires, | 67 | install_requires=install_requires, |
3522 | 68 | scripts = ['launchers/checkbox-cli'], | 68 | scripts = ['launchers/checkbox-cli', 'launchers/checkbox-cli2'], |
3523 | 69 | entry_points={ | 69 | entry_points={ |
3524 | 70 | 'console_scripts': [ | 70 | 'console_scripts': [ |
3525 | 71 | 'checkbox=checkbox_ng.main:main', | 71 | 'checkbox=checkbox_ng.main:main', |
3526 | 72 | 72 | ||
3527 | === modified file 'checkbox-support/checkbox_support/parsers/submission.py' | |||
3528 | --- checkbox-support/checkbox_support/parsers/submission.py 2015-07-13 13:02:37 +0000 | |||
3529 | +++ checkbox-support/checkbox_support/parsers/submission.py 2016-01-05 21:24:37 +0000 | |||
3530 | @@ -304,6 +304,18 @@ | |||
3531 | 304 | logger.debug(package_version) | 304 | logger.debug(package_version) |
3532 | 305 | message["packages"].append(package_version) | 305 | message["packages"].append(package_version) |
3533 | 306 | 306 | ||
3534 | 307 | def addSnapPackageVersion(self, **snap_package_version): | ||
3535 | 308 | if not self.messages or (self.messages[-1]["type"] | ||
3536 | 309 | != "set-snap-packages"): | ||
3537 | 310 | self.messages.append({ | ||
3538 | 311 | "type": "set-snap-packages", | ||
3539 | 312 | "snap-packages": []}) | ||
3540 | 313 | |||
3541 | 314 | message = self.messages[-1] | ||
3542 | 315 | logger.debug("ADDING Snap Package Version:") | ||
3543 | 316 | logger.debug(snap_package_version) | ||
3544 | 317 | message["snap-packages"].append(snap_package_version) | ||
3545 | 318 | |||
3546 | 307 | def addTestResult(self, **test_result): | 319 | def addTestResult(self, **test_result): |
3547 | 308 | if not self.messages or self.messages[-1]["type"] != "add-results": | 320 | if not self.messages or self.messages[-1]["type"] != "add-results": |
3548 | 309 | self.messages.append({ | 321 | self.messages.append({ |
3549 | @@ -633,6 +645,8 @@ | |||
3550 | 633 | register(("test_run", "raw_dmi_device",), self.addRawDmiDeviceState) | 645 | register(("test_run", "raw_dmi_device",), self.addRawDmiDeviceState) |
3551 | 634 | register(("test_run", "distribution",), self.setDistribution) | 646 | register(("test_run", "distribution",), self.setDistribution) |
3552 | 635 | register(("test_run", "package_version",), self.addPackageVersion) | 647 | register(("test_run", "package_version",), self.addPackageVersion) |
3553 | 648 | register(("test_run", "snap_package_version",), | ||
3554 | 649 | self.addSnapPackageVersion) | ||
3555 | 636 | register(("test_run", "test_result",), self.addTestResult) | 650 | register(("test_run", "test_result",), self.addTestResult) |
3556 | 637 | register(("test_run", "modprobe",), self.addModprobeInfo) | 651 | register(("test_run", "modprobe",), self.addModprobeInfo) |
3557 | 638 | register(("test_run", "dkms_info",), self.addDkmsInfo) | 652 | register(("test_run", "dkms_info",), self.addDkmsInfo) |
3558 | @@ -840,6 +854,19 @@ | |||
3559 | 840 | def addPackageVersion(self, test_run, package_version): | 854 | def addPackageVersion(self, test_run, package_version): |
3560 | 841 | test_run.addPackageVersion(**package_version) | 855 | test_run.addPackageVersion(**package_version) |
3561 | 842 | 856 | ||
3562 | 857 | def addSnapPackage(self, snap_package): | ||
3563 | 858 | snap_package_version = { | ||
3564 | 859 | "name": snap_package["name"], | ||
3565 | 860 | "date": snap_package["properties"]["date"], | ||
3566 | 861 | "version": snap_package["properties"]["version"], | ||
3567 | 862 | "developer": snap_package["properties"]["developer"], | ||
3568 | 863 | } | ||
3569 | 864 | self.dispatcher.publishEvent( | ||
3570 | 865 | "snap_package_version", snap_package_version) | ||
3571 | 866 | |||
3572 | 867 | def addSnapPackageVersion(self, test_run, snap_package_version): | ||
3573 | 868 | test_run.addSnapPackageVersion(**snap_package_version) | ||
3574 | 869 | |||
3575 | 843 | def addQuestion(self, question): | 870 | def addQuestion(self, question): |
3576 | 844 | answer_to_status = { | 871 | answer_to_status = { |
3577 | 845 | "fail": FAIL, | 872 | "fail": FAIL, |
3578 | @@ -1084,6 +1111,18 @@ | |||
3579 | 1084 | } | 1111 | } |
3580 | 1085 | result.addPackage(package) | 1112 | result.addPackage(package) |
3581 | 1086 | 1113 | ||
3582 | 1114 | def parseSnapPackages(self, result, node): | ||
3583 | 1115 | """Parse the <snap_packages> part of a submission.""" | ||
3584 | 1116 | for child in node.getchildren(): | ||
3585 | 1117 | assert child.tag == "snap_package", \ | ||
3586 | 1118 | "Unexpected tag <%s>, expected <snap_package>" % child.tag | ||
3587 | 1119 | |||
3588 | 1120 | snap_package = { | ||
3589 | 1121 | "name": child.get("name"), | ||
3590 | 1122 | "properties": self._getProperties(child), | ||
3591 | 1123 | } | ||
3592 | 1124 | result.addSnapPackage(snap_package) | ||
3593 | 1125 | |||
3594 | 1087 | def parseProcessors(self, result, node): | 1126 | def parseProcessors(self, result, node): |
3595 | 1088 | """Parse the <processors> part of a submission.""" | 1127 | """Parse the <processors> part of a submission.""" |
3596 | 1089 | processors = [] | 1128 | processors = [] |
3597 | @@ -1179,6 +1218,7 @@ | |||
3598 | 1179 | parsers = { | 1218 | parsers = { |
3599 | 1180 | "lsbrelease": self.parseLSBRelease, | 1219 | "lsbrelease": self.parseLSBRelease, |
3600 | 1181 | "packages": self.parsePackages, | 1220 | "packages": self.parsePackages, |
3601 | 1221 | "snap_packages": self.parseSnapPackages, | ||
3602 | 1182 | } | 1222 | } |
3603 | 1183 | 1223 | ||
3604 | 1184 | for child in node.getchildren(): | 1224 | for child in node.getchildren(): |
3605 | 1185 | 1225 | ||
3606 | === added file 'checkbox-support/checkbox_support/parsers/tests/fixtures/submission_snap_packages.xml' | |||
3607 | --- checkbox-support/checkbox_support/parsers/tests/fixtures/submission_snap_packages.xml 1970-01-01 00:00:00 +0000 | |||
3608 | +++ checkbox-support/checkbox_support/parsers/tests/fixtures/submission_snap_packages.xml 2016-01-05 21:24:37 +0000 | |||
3609 | @@ -0,0 +1,12 @@ | |||
3610 | 1 | <?xml version="1.0" ?> | ||
3611 | 2 | <system version="1.0"> | ||
3612 | 3 | <software> | ||
3613 | 4 | <snap_packages> | ||
3614 | 5 | <snap_package id="0" name="ubuntu-core"> | ||
3615 | 6 | <property name="date" type="str">2015-10-13</property> | ||
3616 | 7 | <property name="version" type="str">14</property> | ||
3617 | 8 | <property name="developer" type="str">ubuntu</property> | ||
3618 | 9 | </snap_package> | ||
3619 | 10 | </snap_packages> | ||
3620 | 11 | </software> | ||
3621 | 12 | </system> | ||
3622 | 0 | 13 | ||
3623 | === modified file 'checkbox-support/checkbox_support/parsers/tests/test_submission.py' | |||
3624 | --- checkbox-support/checkbox_support/parsers/tests/test_submission.py 2015-06-10 14:29:19 +0000 | |||
3625 | +++ checkbox-support/checkbox_support/parsers/tests/test_submission.py 2016-01-05 21:24:37 +0000 | |||
3626 | @@ -94,6 +94,10 @@ | |||
3627 | 94 | self.result.setdefault("package_versions", []) | 94 | self.result.setdefault("package_versions", []) |
3628 | 95 | self.result["package_versions"].append(package_version) | 95 | self.result["package_versions"].append(package_version) |
3629 | 96 | 96 | ||
3630 | 97 | def addSnapPackageVersion(self, **snap_package_version): | ||
3631 | 98 | self.result.setdefault("snap_package_versions", []) | ||
3632 | 99 | self.result["snap_package_versions"].append(snap_package_version) | ||
3633 | 100 | |||
3634 | 97 | def addTestResult(self, **test_result): | 101 | def addTestResult(self, **test_result): |
3635 | 98 | self.result.setdefault("test_results", []) | 102 | self.result.setdefault("test_results", []) |
3636 | 99 | self.result["test_results"].append(test_result) | 103 | self.result["test_results"].append(test_result) |
3637 | @@ -330,6 +334,18 @@ | |||
3638 | 330 | self.assertEqual(package_version["name"], "accountsservice") | 334 | self.assertEqual(package_version["name"], "accountsservice") |
3639 | 331 | self.assertEqual(package_version["version"], "0.6.21-6ubuntu2") | 335 | self.assertEqual(package_version["version"], "0.6.21-6ubuntu2") |
3640 | 332 | 336 | ||
3641 | 337 | def test_snap_package_versions(self): | ||
3642 | 338 | """Snap Package versions are in the snap_packages element.""" | ||
3643 | 339 | result = self.getResult("submission_snap_packages.xml") | ||
3644 | 340 | self.assertTrue("snap_package_versions" in result) | ||
3645 | 341 | self.assertEqual(len(result["snap_package_versions"]), 1) | ||
3646 | 342 | |||
3647 | 343 | package_version = result["snap_package_versions"][0] | ||
3648 | 344 | self.assertEqual(package_version["name"], "ubuntu-core") | ||
3649 | 345 | self.assertEqual(package_version["version"], "14") | ||
3650 | 346 | self.assertEqual(package_version["date"], "2015-10-13") | ||
3651 | 347 | self.assertEqual(package_version["developer"], "ubuntu") | ||
3652 | 348 | |||
3653 | 333 | def test_package_modaliases(self): | 349 | def test_package_modaliases(self): |
3654 | 334 | """ | 350 | """ |
3655 | 335 | Modaliases information is in the packages element if a package | 351 | Modaliases information is in the packages element if a package |
3656 | 336 | 352 | ||
3657 | === modified file 'checkbox-support/checkbox_support/parsers/udevadm.py' | |||
3658 | --- checkbox-support/checkbox_support/parsers/udevadm.py 2015-08-11 11:01:48 +0000 | |||
3659 | +++ checkbox-support/checkbox_support/parsers/udevadm.py 2016-01-05 21:24:37 +0000 | |||
3660 | @@ -635,9 +635,11 @@ | |||
3661 | 635 | def interface(self): | 635 | def interface(self): |
3662 | 636 | if self._interface is not None: | 636 | if self._interface is not None: |
3663 | 637 | return self._interface | 637 | return self._interface |
3667 | 638 | if (self.category in ("NETWORK", "WIRELESS") and | 638 | if self.category in ("NETWORK", "WIRELESS"): |
3668 | 639 | "INTERFACE" in self._environment): | 639 | if "INTERFACE" in self._environment: |
3669 | 640 | return self._environment["INTERFACE"] | 640 | return self._environment["INTERFACE"] |
3670 | 641 | else: | ||
3671 | 642 | return 'UNKNOWN' | ||
3672 | 641 | return None | 643 | return None |
3673 | 642 | 644 | ||
3674 | 643 | @interface.setter | 645 | @interface.setter |
3675 | 644 | 646 | ||
3676 | === modified file 'checkbox-support/setup.py' | |||
3677 | --- checkbox-support/setup.py 2015-07-13 12:32:59 +0000 | |||
3678 | +++ checkbox-support/setup.py 2016-01-05 21:24:37 +0000 | |||
3679 | @@ -38,7 +38,7 @@ | |||
3680 | 38 | 38 | ||
3681 | 39 | setup( | 39 | setup( |
3682 | 40 | name="checkbox-support", | 40 | name="checkbox-support", |
3684 | 41 | version="0.21.dev", | 41 | version="0.24.dev0", |
3685 | 42 | url="https://launchpad.net/checkbox/", | 42 | url="https://launchpad.net/checkbox/", |
3686 | 43 | packages=find_packages(), | 43 | packages=find_packages(), |
3687 | 44 | test_suite='checkbox_support.tests.test_suite', | 44 | test_suite='checkbox_support.tests.test_suite', |
3688 | 45 | 45 | ||
3689 | === modified file 'checkbox-touch/Makefile' | |||
3690 | --- checkbox-touch/Makefile 2015-09-18 16:40:09 +0000 | |||
3691 | +++ checkbox-touch/Makefile 2016-01-05 21:24:37 +0000 | |||
3692 | @@ -8,6 +8,14 @@ | |||
3693 | 8 | # sudo apt-get install python-autopilot autopilot-qt | 8 | # sudo apt-get install python-autopilot autopilot-qt |
3694 | 9 | ############################################################# | 9 | ############################################################# |
3695 | 10 | 10 | ||
3696 | 11 | TRANSLATION_ROOT=. | ||
3697 | 12 | |||
3698 | 13 | APP_ID=com.ubuntu.checkbox | ||
3699 | 14 | |||
3700 | 15 | MO_FILES=$(foreach infile,$(basename $(notdir $(wildcard ./po/*.po))),$(TRANSLATION_ROOT)/share/locale/$(infile)/LC_MESSAGES/$(APP_ID).mo) | ||
3701 | 16 | QMLJS_FILES:=$(shell find . -name "*.qml" -o -name "*.js" | grep -v ./tests) | ||
3702 | 17 | PY_FILES=$(wildcard ./py/*.py) build-me get-libs | ||
3703 | 18 | |||
3704 | 11 | all: | 19 | all: |
3705 | 12 | 20 | ||
3706 | 13 | autopilot: | 21 | autopilot: |
3707 | @@ -21,3 +29,17 @@ | |||
3708 | 21 | run: | 29 | run: |
3709 | 22 | /usr/bin/qmlscene $@ checkbox-touch.qml | 30 | /usr/bin/qmlscene $@ checkbox-touch.qml |
3710 | 23 | 31 | ||
3711 | 32 | build-translations: $(MO_FILES) | ||
3712 | 33 | echo $(MO_FILES) | ||
3713 | 34 | |||
3714 | 35 | po: | ||
3715 | 36 | mkdir -p $(CURDIR)/po | ||
3716 | 37 | |||
3717 | 38 | po/checkbox-touch.pot: $(QMLJS_FILES) $(PY_FILES) | po | ||
3718 | 39 | xgettext -o po/checkbox-touch.pot --qt --c++ --add-comments=TRANSLATORS --keyword=tr --keyword=tr:1,2 $(QMLJS_FILES) --from-code=UTF-8 | ||
3719 | 40 | xgettext -o po/checkbox-touch.pot --join-existing --language=python --add-comments=TRANSLATORS --keyword=_ --keyword=N_ $(PY_FILES) | ||
3720 | 41 | |||
3721 | 42 | |||
3722 | 43 | $(TRANSLATION_ROOT)/share/locale/%/LC_MESSAGES/$(APP_ID).mo: po/%.po | ||
3723 | 44 | mkdir -p $(TRANSLATION_ROOT)/share/locale/$*/LC_MESSAGES && msgfmt -o $@ $^ | ||
3724 | 45 | |||
3725 | 24 | 46 | ||
3726 | === modified file 'checkbox-touch/build-me' | |||
3727 | --- checkbox-touch/build-me 2015-07-29 08:13:09 +0000 | |||
3728 | +++ checkbox-touch/build-me 2016-01-05 21:24:37 +0000 | |||
3729 | @@ -1,5 +1,6 @@ | |||
3730 | 1 | #!/usr/bin/env python3 | 1 | #!/usr/bin/env python3 |
3731 | 2 | import argparse | 2 | import argparse |
3732 | 3 | from contextlib import contextmanager | ||
3733 | 3 | from distutils.dir_util import copy_tree | 4 | from distutils.dir_util import copy_tree |
3734 | 4 | from datetime import datetime | 5 | from datetime import datetime |
3735 | 5 | import json | 6 | import json |
3736 | @@ -9,6 +10,9 @@ | |||
3737 | 9 | import sys | 10 | import sys |
3738 | 10 | import textwrap | 11 | import textwrap |
3739 | 11 | 12 | ||
3740 | 13 | from confinement.generate import generate_confinement | ||
3741 | 14 | from py.embedded_providers import EmbeddedProvider1PlugInCollection | ||
3742 | 15 | |||
3743 | 12 | # DEFAULT_PROVIDERS is a list of providers directory names as listed in | 16 | # DEFAULT_PROVIDERS is a list of providers directory names as listed in |
3744 | 13 | # ../providers. NOTE: those are directory names, not provider names as reported | 17 | # ../providers. NOTE: those are directory names, not provider names as reported |
3745 | 14 | # by manage.py info | 18 | # by manage.py info |
3746 | @@ -19,6 +23,24 @@ | |||
3747 | 19 | ] | 23 | ] |
3748 | 20 | 24 | ||
3749 | 21 | 25 | ||
3750 | 26 | @contextmanager | ||
3751 | 27 | def chdir(path): | ||
3752 | 28 | previous_path = os.getcwd() | ||
3753 | 29 | os.chdir(path) | ||
3754 | 30 | yield | ||
3755 | 31 | os.chdir(previous_path) | ||
3756 | 32 | |||
3757 | 33 | |||
3758 | 34 | def get_confined_jobs(path): | ||
3759 | 35 | collection = EmbeddedProvider1PlugInCollection(path) | ||
3760 | 36 | # this should be run within provider's directory, so there should be | ||
3761 | 37 | # only one provider loaded | ||
3762 | 38 | provider = collection.get_all_plugin_objects()[0] | ||
3763 | 39 | for job in provider.job_list: | ||
3764 | 40 | if job.plugin == 'qml' and 'confined' in job.get_flag_set(): | ||
3765 | 41 | yield job | ||
3766 | 42 | |||
3767 | 43 | |||
3768 | 22 | def check_libs_present(): | 44 | def check_libs_present(): |
3769 | 23 | """ | 45 | """ |
3770 | 24 | Check if paths listed in NECESSARY_PATHS are present. | 46 | Check if paths listed in NECESSARY_PATHS are present. |
3771 | @@ -51,8 +73,7 @@ | |||
3772 | 51 | try: | 73 | try: |
3773 | 52 | revno = subprocess.check_output( | 74 | revno = subprocess.check_output( |
3774 | 53 | ["git", "-C", path, "show", "-s", "--format=%h", "HEAD"], | 75 | ["git", "-C", path, "show", "-s", "--format=%h", "HEAD"], |
3777 | 54 | stderr=subprocess.STDOUT).decode( | 76 | stderr=subprocess.STDOUT).decode(sys.stdout.encoding).strip() |
3776 | 55 | sys.stdout.encoding).strip() | ||
3778 | 56 | return "git {}".format(revno) | 77 | return "git {}".format(revno) |
3779 | 57 | except subprocess.CalledProcessError: | 78 | except subprocess.CalledProcessError: |
3780 | 58 | # problem encountered when run git revision - falling through | 79 | # problem encountered when run git revision - falling through |
3781 | @@ -91,7 +112,13 @@ | |||
3782 | 91 | "revision": get_revision_string(), | 112 | "revision": get_revision_string(), |
3783 | 92 | "clickBuildDate": str(datetime.now().date()), | 113 | "clickBuildDate": str(datetime.now().date()), |
3784 | 93 | "testplan": args.testplan, | 114 | "testplan": args.testplan, |
3786 | 94 | "providersDir": "providers" | 115 | "providersDir": "providers", |
3787 | 116 | "submission": { | ||
3788 | 117 | "inputForm": "sso-login.qml", | ||
3789 | 118 | "name": "Community Practitest", | ||
3790 | 119 | "type": "oauth", | ||
3791 | 120 | "url": "https://ubuntu-community-testing.staging.ubuntu.com/v1/upload" | ||
3792 | 121 | }, | ||
3793 | 95 | } | 122 | } |
3794 | 96 | settings_file = open('settings.json', 'w') | 123 | settings_file = open('settings.json', 'w') |
3795 | 97 | settings_file.write(json.dumps(settings, sort_keys=True, indent=4)) | 124 | settings_file.write(json.dumps(settings, sort_keys=True, indent=4)) |
3796 | @@ -118,6 +145,18 @@ | |||
3797 | 118 | if not validate_providers(): | 145 | if not validate_providers(): |
3798 | 119 | sys.exit('Provider validation failed.') | 146 | sys.exit('Provider validation failed.') |
3799 | 120 | 147 | ||
3800 | 148 | current_manifest = json.loads(open('manifest.json', 'rt').read()) | ||
3801 | 149 | hooks = { | ||
3802 | 150 | 'checkbox-touch': current_manifest['hooks']['checkbox-touch'] | ||
3803 | 151 | } | ||
3804 | 152 | for hook in build_confinement(current_manifest['version']): | ||
3805 | 153 | hooks.update(hook) | ||
3806 | 154 | new_manifest = current_manifest.copy() | ||
3807 | 155 | new_manifest['hooks'] = hooks | ||
3808 | 156 | with open('manifest.json', 'wt') as f: | ||
3809 | 157 | f.write(json.dumps(new_manifest, sort_keys=True, indent=4)) | ||
3810 | 158 | build_i18n() | ||
3811 | 159 | |||
3812 | 121 | generate_desktop_file() | 160 | generate_desktop_file() |
3813 | 122 | 161 | ||
3814 | 123 | if not os.path.exists('../build-cbt'): | 162 | if not os.path.exists('../build-cbt'): |
3815 | @@ -152,20 +191,48 @@ | |||
3816 | 152 | return False | 191 | return False |
3817 | 153 | else: | 192 | else: |
3818 | 154 | print(("Problem encountered when validating '{}'." | 193 | print(("Problem encountered when validating '{}'." |
3821 | 155 | " Output:\n{}").format(provider_dir, e.output.decode( | 194 | " Output:\n{}").format( |
3822 | 156 | sys.stdout.encoding))) | 195 | provider_dir, e.output.decode(sys.stdout.encoding))) |
3823 | 157 | providers_valid = False | 196 | providers_valid = False |
3824 | 158 | return providers_valid | 197 | return providers_valid |
3825 | 159 | 198 | ||
3826 | 160 | 199 | ||
3827 | 200 | def build_confinement(checkbox_version): | ||
3828 | 201 | print("Generating confinement") | ||
3829 | 202 | checkbox_name = "com.ubuntu.checkbox_checkbox-touch_" + checkbox_version | ||
3830 | 203 | new_hooks = [] | ||
3831 | 204 | for provider_dir in os.listdir('providers'): | ||
3832 | 205 | with chdir(os.path.join('providers', provider_dir)): | ||
3833 | 206 | for job in get_confined_jobs('.'): | ||
3834 | 207 | print(" job: {}".format(job.id)) | ||
3835 | 208 | qml_file = os.path.relpath( | ||
3836 | 209 | job.qml_file, 'data') | ||
3837 | 210 | new_hooks.append(generate_confinement( | ||
3838 | 211 | provider_dir, job.partial_id, checkbox_name, qml_file)) | ||
3839 | 212 | return new_hooks | ||
3840 | 213 | |||
3841 | 214 | |||
3842 | 215 | def build_i18n(): | ||
3843 | 216 | print("Building i18n") | ||
3844 | 217 | for provider_dir in os.listdir('providers'): | ||
3845 | 218 | try: | ||
3846 | 219 | subprocess.check_output( | ||
3847 | 220 | [os.path.join('providers', provider_dir, 'manage.py'), | ||
3848 | 221 | 'i18n'], stderr=subprocess.STDOUT) | ||
3849 | 222 | except (OSError, subprocess.CalledProcessError) as e: | ||
3850 | 223 | print("Problem encountered while building translations for ", | ||
3851 | 224 | "provider '{}'.".format(provider_dir)) | ||
3852 | 225 | raise e | ||
3853 | 226 | |||
3854 | 227 | |||
3855 | 161 | def generate_desktop_file(): | 228 | def generate_desktop_file(): |
3856 | 162 | template = textwrap.dedent(""" | 229 | template = textwrap.dedent(""" |
3857 | 163 | # This file has been generated by build-me script | 230 | # This file has been generated by build-me script |
3858 | 164 | [Desktop Entry] | 231 | [Desktop Entry] |
3861 | 165 | Name=Checkbox | 232 | Name=Pilot |
3862 | 166 | Comment=System testing utility for Ubuntu | 233 | Comment=Community testing utility for Ubuntu |
3863 | 167 | Exec=qmlscene --settings=settings.json {import_options} $@ checkbox-touch.qml | 234 | Exec=qmlscene --settings=settings.json {import_options} $@ checkbox-touch.qml |
3865 | 168 | Icon=checkbox-touch.svg | 235 | Icon=pilot_256.png |
3866 | 169 | Terminal=false | 236 | Terminal=false |
3867 | 170 | Type=Application | 237 | Type=Application |
3868 | 171 | X-Ubuntu-Touch=true | 238 | X-Ubuntu-Touch=true |
3869 | @@ -176,7 +243,7 @@ | |||
3870 | 176 | provider_data_dir = os.path.join('providers', provider, 'data') | 243 | provider_data_dir = os.path.join('providers', provider, 'data') |
3871 | 177 | if os.path.exists(provider_data_dir): | 244 | if os.path.exists(provider_data_dir): |
3872 | 178 | import_opts.append("-I " + provider_data_dir) | 245 | import_opts.append("-I " + provider_data_dir) |
3874 | 179 | with open('checkbox-touch.desktop', 'wt', encoding='utf-8') as f: | 246 | with open('pilot.desktop', 'wt', encoding='utf-8') as f: |
3875 | 180 | f.write(template.format(import_options=" ".join(import_opts))) | 247 | f.write(template.format(import_options=" ".join(import_opts))) |
3876 | 181 | 248 | ||
3877 | 182 | 249 | ||
3878 | 183 | 250 | ||
3879 | === modified file 'checkbox-touch/checkbox-touch.qml' | |||
3880 | --- checkbox-touch/checkbox-touch.qml 2015-09-30 06:12:53 +0000 | |||
3881 | +++ checkbox-touch/checkbox-touch.qml 2016-01-05 21:24:37 +0000 | |||
3882 | @@ -84,6 +84,7 @@ | |||
3883 | 84 | } | 84 | } |
3884 | 85 | 85 | ||
3885 | 86 | Component.onCompleted: { | 86 | Component.onCompleted: { |
3886 | 87 | i18n.domain = "com.ubuntu.checkbox"; | ||
3887 | 87 | if (args.values["autopilot"]) { | 88 | if (args.values["autopilot"]) { |
3888 | 88 | // autopilot-testing mode | 89 | // autopilot-testing mode |
3889 | 89 | appSettings["testplan"] = "2015.com.canonical.certification::checkbox-touch-autopilot"; | 90 | appSettings["testplan"] = "2015.com.canonical.certification::checkbox-touch-autopilot"; |
3890 | @@ -164,8 +165,7 @@ | |||
3891 | 164 | Component.onCompleted: { | 165 | Component.onCompleted: { |
3892 | 165 | // register to py.initiated signal | 166 | // register to py.initiated signal |
3893 | 166 | py.onInitiated.connect(function() { | 167 | py.onInitiated.connect(function() { |
3896 | 167 | construct("checkbox_touch.create_app_object", [ | 168 | construct("checkbox_touch.create_app_object", []); |
3895 | 168 | appSettings["providersDir"]]); | ||
3897 | 169 | }); | 169 | }); |
3898 | 170 | } | 170 | } |
3899 | 171 | } | 171 | } |
3900 | @@ -191,12 +191,16 @@ | |||
3901 | 191 | 191 | ||
3902 | 192 | WelcomePage { | 192 | WelcomePage { |
3903 | 193 | id: welcomePage | 193 | id: welcomePage |
3904 | 194 | // TRANSLATORS: %1 means program version, %2 repository revision and %3 | ||
3905 | 195 | // date when the package was built | ||
3906 | 196 | // TRANSLATORS: keep the '\n' characters at the end of each line | ||
3907 | 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)") |
3908 | 195 | .arg(app.applicationVersion).arg(appSettings.revision).arg(appSettings.clickBuildDate) | 198 | .arg(app.applicationVersion).arg(appSettings.revision).arg(appSettings.clickBuildDate) |
3909 | 196 | onStartTestingTriggered: { | 199 | onStartTestingTriggered: { |
3910 | 197 | if (appSettings.testplan != "") { | 200 | if (appSettings.testplan != "") { |
3911 | 198 | app.rememberTestplan(appSettings.testplan, function() { | 201 | app.rememberTestplan(appSettings.testplan, function() { |
3912 | 199 | categorySelectionPage.setup(); | 202 | categorySelectionPage.setup(); |
3913 | 203 | enableButton(); | ||
3914 | 200 | }); | 204 | }); |
3915 | 201 | } else { | 205 | } else { |
3916 | 202 | app.getTestplans(function(response) { | 206 | app.getTestplans(function(response) { |
3917 | @@ -209,9 +213,9 @@ | |||
3918 | 209 | else { | 213 | else { |
3919 | 210 | testplanSelectionPage.setup(tp_list) | 214 | testplanSelectionPage.setup(tp_list) |
3920 | 211 | } | 215 | } |
3921 | 216 | enableButton(); | ||
3922 | 212 | }); | 217 | }); |
3923 | 213 | } | 218 | } |
3924 | 214 | enableButton(); | ||
3925 | 215 | } | 219 | } |
3926 | 216 | onAboutClicked: pageStack.push(aboutPage) | 220 | onAboutClicked: pageStack.push(aboutPage) |
3927 | 217 | } | 221 | } |
3928 | @@ -271,8 +275,8 @@ | |||
3929 | 271 | id: resumeSessionPage | 275 | id: resumeSessionPage |
3930 | 272 | onRerunLast: app.resumeSession(true, processNextTest) | 276 | onRerunLast: app.resumeSession(true, processNextTest) |
3931 | 273 | onContinueSession: app.resumeSession(false, processNextTest) | 277 | onContinueSession: app.resumeSession(false, processNextTest) |
3934 | 274 | resumeText: i18n.tr("Checkbox did not finish completely.\nDo you want \ | 278 | resumeText: i18n.tr("Checkbox session got suspended.\nDo you want \ |
3935 | 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?") |
3936 | 276 | onRestartSession: { | 280 | onRestartSession: { |
3937 | 277 | pageStack.clear(); | 281 | pageStack.clear(); |
3938 | 278 | pageStack.push(welcomePage); | 282 | pageStack.push(welcomePage); |
3939 | @@ -314,14 +318,20 @@ | |||
3940 | 314 | 318 | ||
3941 | 315 | function setup(continuation) { | 319 | function setup(continuation) { |
3942 | 316 | app.getCategories(function(response) { | 320 | app.getCategories(function(response) { |
3948 | 317 | var category_info_list = response.category_info_list; | 321 | var uncategorised_id = "2013.com.canonical.plainbox::uncategorised" |
3949 | 318 | model.clear(); | 322 | if (response.category_info_list.length === 1 && |
3950 | 319 | for (var i=0; i<category_info_list.length; i++) { | 323 | response.category_info_list[0].mod_id == uncategorised_id) { |
3951 | 320 | var category_info = category_info_list[i]; | 324 | selectionDone(uncategorised_id); |
3952 | 321 | model.append(category_info); | 325 | } else { |
3953 | 326 | var category_info_list = response.category_info_list; | ||
3954 | 327 | model.clear(); | ||
3955 | 328 | for (var i=0; i<category_info_list.length; i++) { | ||
3956 | 329 | var category_info = category_info_list[i]; | ||
3957 | 330 | model.append(category_info); | ||
3958 | 331 | } | ||
3959 | 332 | modelUpdated(); | ||
3960 | 333 | pageStack.push(categorySelectionPage); | ||
3961 | 322 | } | 334 | } |
3962 | 323 | modelUpdated(); | ||
3963 | 324 | pageStack.push(categorySelectionPage); | ||
3964 | 325 | // if called from welcome page, no continuation is given | 335 | // if called from welcome page, no continuation is given |
3965 | 326 | if (continuation) continuation(); | 336 | if (continuation) continuation(); |
3966 | 327 | }); | 337 | }); |
3967 | @@ -339,7 +349,7 @@ | |||
3968 | 339 | id: testSelectionPage | 349 | id: testSelectionPage |
3969 | 340 | objectName: "testSelectionPage" | 350 | objectName: "testSelectionPage" |
3970 | 341 | title: i18n.tr("Select tests") | 351 | title: i18n.tr("Select tests") |
3972 | 342 | continueText: i18n.tr("Start Testing") | 352 | continueText: i18n.tr("Start testing") |
3973 | 343 | largeBuffer: args.values["autopilot"] | 353 | largeBuffer: args.values["autopilot"] |
3974 | 344 | 354 | ||
3975 | 345 | function setup(continuation) { | 355 | function setup(continuation) { |
3976 | @@ -381,6 +391,11 @@ | |||
3977 | 381 | pageStack.push(rerunSelectionPage) | 391 | pageStack.push(rerunSelectionPage) |
3978 | 382 | } | 392 | } |
3979 | 383 | onSelectionDone: { | 393 | onSelectionDone: { |
3980 | 394 | if (!selected_id_list.length) { | ||
3981 | 395 | showResultsScreen(); | ||
3982 | 396 | unlatchContinue(); | ||
3983 | 397 | return; | ||
3984 | 398 | } | ||
3985 | 384 | app.rememberTestSelection(selected_id_list, function() { | 399 | app.rememberTestSelection(selected_id_list, function() { |
3986 | 385 | processNextTest(); | 400 | processNextTest(); |
3987 | 386 | unlatchContinue(); | 401 | unlatchContinue(); |
3988 | @@ -443,23 +458,27 @@ | |||
3989 | 443 | app.getNextTest(function(test) { | 458 | app.getNextTest(function(test) { |
3990 | 444 | pageStack.clear(); | 459 | pageStack.clear(); |
3991 | 445 | if (test.plugin === undefined) { | 460 | if (test.plugin === undefined) { |
3993 | 446 | return maybeShowRerunScreen(); | 461 | return showResultsScreen(); |
3994 | 447 | } | 462 | } |
3995 | 448 | if (test.user) { | 463 | if (test.user) { |
3996 | 449 | // running this test will require to be run as a different | 464 | // running this test will require to be run as a different |
3997 | 450 | // user (therefore requiring user to enter sudo password) | 465 | // user (therefore requiring user to enter sudo password) |
3998 | 451 | if (!appSettings.sudoPasswordProvided) { | 466 | if (!appSettings.sudoPasswordProvided) { |
3999 | 452 | // ask user for password | 467 | // ask user for password |
4001 | 453 | passwordDialog.passwordEntered.connect(function(pass) { | 468 | var rememberContinuation = function(pass) { |
4002 | 469 | passwordDialog.passwordEntered.disconnect(rememberContinuation); | ||
4003 | 454 | app.rememberPassword(pass, function(){ | 470 | app.rememberPassword(pass, function(){ |
4004 | 455 | appSettings.sudoPasswordProvided = true; | 471 | appSettings.sudoPasswordProvided = true; |
4005 | 456 | performTest(test); | 472 | performTest(test); |
4006 | 457 | }); | 473 | }); |
4009 | 458 | }); | 474 | } |
4010 | 459 | passwordDialog.dialogCancelled.connect(function() { | 475 | var cancelContinuation = function() { |
4011 | 476 | passwordDialog.dialogCancelled.disconnect(cancelContinuation); | ||
4012 | 460 | test.outcome = "skip"; | 477 | test.outcome = "skip"; |
4013 | 461 | completeTest(test); | 478 | completeTest(test); |
4015 | 462 | }); | 479 | }; |
4016 | 480 | passwordDialog.passwordEntered.connect(rememberContinuation); | ||
4017 | 481 | passwordDialog.dialogCancelled.connect(cancelContinuation); | ||
4018 | 463 | PopupUtils.open(passwordDialog.dialogComponent); | 482 | PopupUtils.open(passwordDialog.dialogComponent); |
4019 | 464 | return; | 483 | return; |
4020 | 465 | } | 484 | } |
4021 | @@ -509,72 +528,74 @@ | |||
4022 | 509 | app.runTestActivity(test, continuation); | 528 | app.runTestActivity(test, continuation); |
4023 | 510 | 529 | ||
4024 | 511 | } | 530 | } |
4025 | 512 | function maybeShowRerunScreen() { | ||
4026 | 513 | app.getRerunCandidates(function(result) { | ||
4027 | 514 | if (result == false) { | ||
4028 | 515 | showResultsScreen(); | ||
4029 | 516 | return; | ||
4030 | 517 | } | ||
4031 | 518 | rerunSelectionPage.setup(result); | ||
4032 | 519 | }); | ||
4033 | 520 | } | ||
4034 | 521 | 531 | ||
4035 | 522 | function showResultsScreen() { | 532 | function showResultsScreen() { |
4085 | 523 | pageStack.clear(); | 533 | var endTesting = function() { |
4086 | 524 | app.getResults(function(results) { | 534 | pageStack.clear(); |
4087 | 525 | var resultsPage = createPage("components/ResultsPage.qml"); | 535 | app.clearSession(function() { |
4088 | 526 | resultsPage.results = results; | 536 | app.startSession(); |
4089 | 527 | if (appSettings["submission"]) { | 537 | pageStack.push(welcomePage); |
4090 | 528 | resultsPage.submissionName = appSettings["submission"].name; | 538 | }); |
4091 | 529 | } | 539 | }; |
4092 | 530 | resultsPage.endTesting.connect(function() { | 540 | var saveReport = function() { |
4093 | 531 | pageStack.clear(); | 541 | app.exportResults('2013.com.canonical.plainbox::html', [], function(uri) { |
4094 | 532 | app.clearSession(function() { | 542 | var htmlReportUrl = uri; |
4095 | 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) { |
4096 | 534 | pageStack.push(welcomePage); | 544 | CbtDialogLogic.showDialog(mainView, i18n.tr("Reports have been saved to your Documents folder"), |
4097 | 535 | }); | 545 | [{ "text": i18n.tr("OK"), "color": UbuntuColors.green}, {"text": i18n.tr("View Report"), "color": UbuntuColors.green, "onClicked": function(uri) { |
4098 | 536 | }); | 546 | var webviewer = Qt.createComponent(Qt.resolvedUrl("components/WebViewer.qml")).createObject(); |
4099 | 537 | resultsPage.saveReportClicked.connect(function() { | 547 | webviewer.uri = htmlReportUrl; |
4100 | 538 | app.exportResults('2013.com.canonical.plainbox::html', [], function(uri) { | 548 | pageStack.push(webviewer); |
4101 | 539 | console.log(uri) | 549 | }}]); |
4102 | 540 | var htmlReportUrl = uri; | 550 | }); |
4103 | 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 | }); |
4104 | 542 | console.log(uri) | 552 | }; |
4105 | 543 | CbtDialogLogic.showDialog(resultsPage, i18n.tr("Reports have been saved to your Documents folder"), | 553 | var submitReport = function(resultsPage) { |
4106 | 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 |
4107 | 545 | var webviewer = Qt.createComponent(Qt.resolvedUrl("components/WebViewer.qml")).createObject(); | 555 | getSubmissionInput(function() { |
4108 | 546 | webviewer.uri = htmlReportUrl; | 556 | app.submitResults(appSettings["submission"], function(reply) { |
4109 | 547 | pageStack.push(webviewer); | 557 | // pretty-stringify reply |
4110 | 548 | }}]); | 558 | var s = "" |
4111 | 549 | }); | 559 | for (var i in reply) { |
4112 | 550 | }); | 560 | s += i + ': ' + reply[i] + '\n'; |
4113 | 551 | }); | 561 | } |
4114 | 552 | resultsPage.submitReportClicked.connect(function() { | 562 | CbtDialogLogic.showDialog( |
4115 | 553 | getSubmissionInput(function() { | 563 | resultsPage, |
4116 | 554 | app.submitResults(appSettings["submission"], function(reply) { | 564 | i18n.tr("Report has been submited.\n" + s), |
4117 | 555 | // pretty-stringify reply | 565 | [{"text": i18n.tr("OK"), "color": UbuntuColors.green}]); |
4069 | 556 | var s = "" | ||
4070 | 557 | for (var i in reply) { | ||
4071 | 558 | s += i + ': ' + reply[i] + '\n'; | ||
4072 | 559 | } | ||
4073 | 560 | CbtDialogLogic.showDialog( | ||
4074 | 561 | resultsPage, | ||
4075 | 562 | i18n.tr("Report has been submitted.\n" + s), | ||
4076 | 563 | [{"text": i18n.tr("OK"), "color": UbuntuColors.green}]); | ||
4077 | 564 | }, | ||
4078 | 565 | function(error) { | ||
4079 | 566 | ErrorLogic.showError(mainView, | ||
4080 | 567 | i18n.tr("Could not submit results. Reason:\n" + error), | ||
4081 | 568 | function(){}, | ||
4082 | 569 | i18n.tr("OK")); | ||
4083 | 570 | resultsPage.unlatchSubmission(); | ||
4084 | 571 | }) | ||
4118 | 572 | }, | 566 | }, |
4120 | 573 | function() { | 567 | function(error) { |
4121 | 568 | ErrorLogic.showError(mainView, | ||
4122 | 569 | i18n.tr("Could not submit results. Reason:\n" + error), | ||
4123 | 570 | function(){}, | ||
4124 | 571 | i18n.tr("OK")); | ||
4125 | 574 | resultsPage.unlatchSubmission(); | 572 | resultsPage.unlatchSubmission(); |
4129 | 575 | }); | 573 | }) |
4130 | 576 | }); | 574 | }, |
4131 | 577 | pageStack.push(resultsPage); | 575 | function() { |
4132 | 576 | resultsPage.unlatchSubmission(); | ||
4133 | 577 | }); | ||
4134 | 578 | }; | ||
4135 | 579 | |||
4136 | 580 | pageStack.clear(); | ||
4137 | 581 | app.getRerunCandidates(function(rerunCandidates) { | ||
4138 | 582 | app.getResults(function(results) { | ||
4139 | 583 | var resultsPage = createPage("components/ResultsPage.qml"); | ||
4140 | 584 | resultsPage.results = results; | ||
4141 | 585 | if (appSettings["submission"]) { | ||
4142 | 586 | resultsPage.submissionName = appSettings["submission"].name; | ||
4143 | 587 | } | ||
4144 | 588 | resultsPage.endTesting.connect(endTesting); | ||
4145 | 589 | resultsPage.saveReportClicked.connect(saveReport); | ||
4146 | 590 | resultsPage.submitReportClicked.connect(function() {submitReport(resultsPage);}); | ||
4147 | 591 | if (rerunCandidates.length>0) { | ||
4148 | 592 | resultsPage.rerunEnabled = true; | ||
4149 | 593 | resultsPage.rerunTests.connect(function() { | ||
4150 | 594 | rerunSelectionPage.setup(rerunCandidates); | ||
4151 | 595 | }); | ||
4152 | 596 | } | ||
4153 | 597 | pageStack.push(resultsPage); | ||
4154 | 598 | }); | ||
4155 | 578 | }); | 599 | }); |
4156 | 579 | } | 600 | } |
4157 | 580 | 601 | ||
4158 | @@ -637,7 +658,7 @@ | |||
4159 | 637 | } | 658 | } |
4160 | 638 | function performConfinedQmlTest(test) { | 659 | function performConfinedQmlTest(test) { |
4161 | 639 | runTestActivity(test, function(test) { | 660 | runTestActivity(test, function(test) { |
4163 | 640 | var qmlNativePage = createPage("components/QmlConfinedPage.qm;"); | 661 | var qmlNativePage = createPage("components/QmlConfinedPage.qml", test); |
4164 | 641 | qmlNativePage.applicationVersion = app.applicationVersion; | 662 | qmlNativePage.applicationVersion = app.applicationVersion; |
4165 | 642 | qmlNativePage.testDone.connect(completeTest); | 663 | qmlNativePage.testDone.connect(completeTest); |
4166 | 643 | pageStack.push(qmlNativePage); | 664 | pageStack.push(qmlNativePage); |
4167 | @@ -646,29 +667,23 @@ | |||
4168 | 646 | 667 | ||
4169 | 647 | function showVerificationScreen(test) { | 668 | function showVerificationScreen(test) { |
4170 | 648 | var verificationPage = createPage("components/TestVerificationPage.qml", test); | 669 | var verificationPage = createPage("components/TestVerificationPage.qml", test); |
4172 | 649 | verificationPage.testDone.connect(completeTest); | 670 | var maybeCommentVerification = function(test) { |
4173 | 671 | if (test.outcome == 'fail' && | ||
4174 | 672 | test.flags.indexOf('explicit-fail') > -1) { | ||
4175 | 673 | commentsDialog.commentDefaultText = test["comments"] || ""; | ||
4176 | 674 | commentsDialog.commentAdded.connect(function(comment) { | ||
4177 | 675 | test["comments"] = comment; | ||
4178 | 676 | completeTest(test); | ||
4179 | 677 | }); | ||
4180 | 678 | PopupUtils.open(commentsDialog.dialogComponent); | ||
4181 | 679 | } else { | ||
4182 | 680 | completeTest(test); | ||
4183 | 681 | } | ||
4184 | 682 | } | ||
4185 | 683 | verificationPage.testDone.connect(maybeCommentVerification); | ||
4186 | 650 | pageStack.push(verificationPage); | 684 | pageStack.push(verificationPage); |
4187 | 651 | } | 685 | } |
4188 | 652 | function getSubmissionInput(continuation, cancelContinuation) { | 686 | function getSubmissionInput(continuation, cancelContinuation) { |
4189 | 653 | if (appSettings.submission.inputForm) { | ||
4190 | 654 | var dlg_cmp = Qt.createComponent(Qt.resolvedUrl(appSettings.submission.inputForm)); | ||
4191 | 655 | var dlg = dlg_cmp.createObject(mainView); | ||
4192 | 656 | |||
4193 | 657 | dlg.cancelClicked.connect(function() { | ||
4194 | 658 | cancelContinuation(); | ||
4195 | 659 | return; | ||
4196 | 660 | }); | ||
4197 | 661 | |||
4198 | 662 | dlg.submissionDetailsFilled.connect(function(submissionDetails) { | ||
4199 | 663 | for (var attr in submissionDetails) { | ||
4200 | 664 | appSettings.submission[attr] = submissionDetails[attr]; | ||
4201 | 665 | } | ||
4202 | 666 | continuation(); | ||
4203 | 667 | }); | ||
4204 | 668 | PopupUtils.open(dlg.dialogComponent); | ||
4205 | 669 | return; // inputForm gets precedence over input | ||
4206 | 670 | } | ||
4207 | 671 | |||
4208 | 672 | if (!appSettings.submission.input) { | 687 | if (!appSettings.submission.input) { |
4209 | 673 | // no input to process | 688 | // no input to process |
4210 | 674 | continuation(); | 689 | continuation(); |
4211 | 675 | 690 | ||
4212 | === modified file 'checkbox-touch/components/CheckboxTouchApplication.qml' | |||
4213 | --- checkbox-touch/components/CheckboxTouchApplication.qml 2015-09-30 06:12:53 +0000 | |||
4214 | +++ checkbox-touch/components/CheckboxTouchApplication.qml 2016-01-05 21:24:37 +0000 | |||
4215 | @@ -62,13 +62,14 @@ | |||
4216 | 62 | if (!result["session_id"]) { | 62 | if (!result["session_id"]) { |
4217 | 63 | pageStack.pop(); | 63 | pageStack.pop(); |
4218 | 64 | ErrorLogic.showError(mainView, | 64 | ErrorLogic.showError(mainView, |
4220 | 65 | i18n.tr("Could not resume session "), | 65 | i18n.tr("Could not resume session"), |
4221 | 66 | function() { | 66 | function() { |
4222 | 67 | startSession(); | 67 | startSession(); |
4223 | 68 | return; | 68 | return; |
4224 | 69 | }, | 69 | }, |
4225 | 70 | i18n.tr("Start new session")); | 70 | i18n.tr("Start new session")); |
4226 | 71 | } else { | 71 | } else { |
4227 | 72 | sessionDir = result['session_dir']; | ||
4228 | 72 | sessionReady(); | 73 | sessionReady(); |
4229 | 73 | continuation(); | 74 | continuation(); |
4230 | 74 | } | 75 | } |
4231 | @@ -95,7 +96,11 @@ | |||
4232 | 95 | }); | 96 | }); |
4233 | 96 | } | 97 | } |
4234 | 97 | function rememberTestplan(testplan, continuation) { | 98 | function rememberTestplan(testplan, continuation) { |
4236 | 98 | request("remember_testplan", [testplan], continuation, function(error) { | 99 | var handleResult = function(result) { |
4237 | 100 | sessionDir = result['session_dir']; | ||
4238 | 101 | continuation(); | ||
4239 | 102 | } | ||
4240 | 103 | request("remember_testplan", [testplan], handleResult, function(error) { | ||
4241 | 99 | console.error("Unable to save testplan selection"); | 104 | console.error("Unable to save testplan selection"); |
4242 | 100 | }); | 105 | }); |
4243 | 101 | } | 106 | } |
4244 | @@ -174,6 +179,12 @@ | |||
4245 | 174 | } | 179 | } |
4246 | 175 | }); | 180 | }); |
4247 | 176 | } | 181 | } |
4248 | 182 | function dropPermissions(appId, services, continuation, continuation_error) { | ||
4249 | 183 | request("drop_permissions", [appId, services], continuation, function(error) { | ||
4250 | 184 | console.error("Unable to remove permissions"); | ||
4251 | 185 | if (continuation_error) continuation_error(error); | ||
4252 | 186 | }); | ||
4253 | 187 | } | ||
4254 | 177 | 188 | ||
4255 | 178 | function rememberPassword(password, continuation) { | 189 | function rememberPassword(password, continuation) { |
4256 | 179 | // using low-level py.call() to 'silently' pass password string through pyotherside | 190 | // using low-level py.call() to 'silently' pass password string through pyotherside |
4257 | @@ -202,12 +213,18 @@ | |||
4258 | 202 | // Internal handler that triggers a call to python to query for runtime and | 213 | // Internal handler that triggers a call to python to query for runtime and |
4259 | 203 | // application versions. | 214 | // application versions. |
4260 | 204 | onObjectReady: { | 215 | onObjectReady: { |
4265 | 205 | request("get_version_pair", [], function(result) { | 216 | request("load_providers", [appSettings["providersDir"]], function(result) { |
4266 | 206 | app.applicationVersion = result.application_version; | 217 | request("get_version_pair", [], function(result) { |
4267 | 207 | app.plainboxVersion = result.plainbox_version; | 218 | app.applicationVersion = result.application_version; |
4268 | 208 | appReady(); | 219 | app.plainboxVersion = result.plainbox_version; |
4269 | 220 | appReady(); | ||
4270 | 221 | }, function(error) { | ||
4271 | 222 | console.error("Unable to query for version: " + error); | ||
4272 | 223 | }); | ||
4273 | 224 | |||
4274 | 209 | }, function(error) { | 225 | }, function(error) { |
4276 | 210 | console.error("Unable to query for version: " + error); | 226 | console.error("Unable to load providers: " + error); |
4277 | 227 | ErrorLogic.showError(mainView, i18n.tr("No providers available!"), Qt.quit); | ||
4278 | 211 | }); | 228 | }); |
4279 | 212 | } | 229 | } |
4280 | 213 | } | 230 | } |
4281 | 214 | 231 | ||
4282 | === modified file 'checkbox-touch/components/CommandOutputPage.qml' | |||
4283 | --- checkbox-touch/components/CommandOutputPage.qml 2015-09-07 20:06:44 +0000 | |||
4284 | +++ checkbox-touch/components/CommandOutputPage.qml 2016-01-05 21:24:37 +0000 | |||
4285 | @@ -50,6 +50,7 @@ | |||
4286 | 50 | id: skipAction | 50 | id: skipAction |
4287 | 51 | objectName: "copyOutputAction" | 51 | objectName: "copyOutputAction" |
4288 | 52 | iconName: "edit-copy" | 52 | iconName: "edit-copy" |
4289 | 53 | // TRANSLATORS: a verb (call to action) | ||
4290 | 53 | text: i18n.tr("Copy") | 54 | text: i18n.tr("Copy") |
4291 | 54 | onTriggered: Clipboard.push(mimeData) | 55 | onTriggered: Clipboard.push(mimeData) |
4292 | 55 | } | 56 | } |
4293 | @@ -93,6 +94,7 @@ | |||
4294 | 93 | 94 | ||
4295 | 94 | Button { | 95 | Button { |
4296 | 95 | Layout.fillWidth: true | 96 | Layout.fillWidth: true |
4297 | 97 | // TRANSLATORS: This is a label on the button that goes back a page | ||
4298 | 96 | text: i18n.tr("Back") | 98 | text: i18n.tr("Back") |
4299 | 97 | onClicked: pageStack.pop() | 99 | onClicked: pageStack.pop() |
4300 | 98 | } | 100 | } |
4301 | 99 | 101 | ||
4302 | === modified file 'checkbox-touch/components/InteractIntroPage.qml' | |||
4303 | --- checkbox-touch/components/InteractIntroPage.qml 2015-09-15 10:58:58 +0000 | |||
4304 | +++ checkbox-touch/components/InteractIntroPage.qml 2016-01-05 21:24:37 +0000 | |||
4305 | @@ -96,7 +96,7 @@ | |||
4306 | 96 | objectName: "startTestButton" | 96 | objectName: "startTestButton" |
4307 | 97 | unlatchedColor: UbuntuColors.green | 97 | unlatchedColor: UbuntuColors.green |
4308 | 98 | Layout.fillWidth: true | 98 | Layout.fillWidth: true |
4310 | 99 | text: i18n.tr("Test") | 99 | text: i18n.tr("Start the test") |
4311 | 100 | onLatchedClicked: { | 100 | onLatchedClicked: { |
4312 | 101 | userInteractVerifyIntroPage.state = "testing" | 101 | userInteractVerifyIntroPage.state = "testing" |
4313 | 102 | testStarted(); | 102 | testStarted(); |
4314 | 103 | 103 | ||
4315 | === modified file 'checkbox-touch/components/PasswordDialog.qml' | |||
4316 | --- checkbox-touch/components/PasswordDialog.qml 2015-03-10 12:19:22 +0000 | |||
4317 | +++ checkbox-touch/components/PasswordDialog.qml 2016-01-05 21:24:37 +0000 | |||
4318 | @@ -50,6 +50,7 @@ | |||
4319 | 50 | 50 | ||
4320 | 51 | TextField { | 51 | TextField { |
4321 | 52 | id: passwordBox | 52 | id: passwordBox |
4322 | 53 | objectName: "passwordBox" | ||
4323 | 53 | placeholderText: i18n.tr("password") | 54 | placeholderText: i18n.tr("password") |
4324 | 54 | echoMode: TextInput.Password | 55 | echoMode: TextInput.Password |
4325 | 55 | onAccepted: okButton.clicked(text) | 56 | onAccepted: okButton.clicked(text) |
4326 | @@ -57,6 +58,7 @@ | |||
4327 | 57 | 58 | ||
4328 | 58 | Button { | 59 | Button { |
4329 | 59 | id: okButton | 60 | id: okButton |
4330 | 61 | objectName: "okButton" | ||
4331 | 60 | text: i18n.tr("OK") | 62 | text: i18n.tr("OK") |
4332 | 61 | color: UbuntuColors.green | 63 | color: UbuntuColors.green |
4333 | 62 | onClicked: { | 64 | onClicked: { |
4334 | @@ -69,6 +71,7 @@ | |||
4335 | 69 | } | 71 | } |
4336 | 70 | 72 | ||
4337 | 71 | Button { | 73 | Button { |
4338 | 74 | objectName: "cancelButton" | ||
4339 | 72 | text: i18n.tr("Cancel") | 75 | text: i18n.tr("Cancel") |
4340 | 73 | color: UbuntuColors.red | 76 | color: UbuntuColors.red |
4341 | 74 | onClicked: { | 77 | onClicked: { |
4342 | 75 | 78 | ||
4343 | === added file 'checkbox-touch/components/PieChart.qml' | |||
4344 | --- checkbox-touch/components/PieChart.qml 1970-01-01 00:00:00 +0000 | |||
4345 | +++ checkbox-touch/components/PieChart.qml 2016-01-05 21:24:37 +0000 | |||
4346 | @@ -0,0 +1,79 @@ | |||
4347 | 1 | /* | ||
4348 | 2 | * This file is part of Checkbox | ||
4349 | 3 | * | ||
4350 | 4 | * Copyright 2015 Canonical Ltd. | ||
4351 | 5 | * | ||
4352 | 6 | * Authors: | ||
4353 | 7 | * - Sylvain Pineau <sylvain.pineau@canonical.com> | ||
4354 | 8 | * | ||
4355 | 9 | * This program is free software; you can redistribute it and/or modify | ||
4356 | 10 | * it under the terms of the GNU General Public License as published by | ||
4357 | 11 | * the Free Software Foundation; version 3. | ||
4358 | 12 | * | ||
4359 | 13 | * This program is distributed in the hope that it will be useful, | ||
4360 | 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
4361 | 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
4362 | 16 | * GNU General Public License for more details. | ||
4363 | 17 | * | ||
4364 | 18 | * You should have received a copy of the GNU General Public License | ||
4365 | 19 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
4366 | 20 | */ | ||
4367 | 21 | |||
4368 | 22 | /*! \Pie Chart component | ||
4369 | 23 | |||
4370 | 24 | Using the canvas element. | ||
4371 | 25 | */ | ||
4372 | 26 | |||
4373 | 27 | import QtQuick 2.0 | ||
4374 | 28 | |||
4375 | 29 | Canvas { | ||
4376 | 30 | id: canvas | ||
4377 | 31 | |||
4378 | 32 | property var chartData; | ||
4379 | 33 | property var borderColor: "#ECECEC"; | ||
4380 | 34 | property int borderWidth: 1; | ||
4381 | 35 | property real progress: 0; | ||
4382 | 36 | property alias duration: animation.duration; | ||
4383 | 37 | |||
4384 | 38 | onPaint: { | ||
4385 | 39 | var centreX = width / 2; | ||
4386 | 40 | var centreY = height / 2; | ||
4387 | 41 | var size = Math.min(width, height) / 2; | ||
4388 | 42 | var total = 0; | ||
4389 | 43 | for (var i = 0; i < chartData.length; i++) total += chartData[i].value; | ||
4390 | 44 | var arcTotal = -Math.PI / 2; | ||
4391 | 45 | var ctx = getContext("2d"); | ||
4392 | 46 | ctx.reset(); | ||
4393 | 47 | for (var i = 0; i < chartData.length; i++) { | ||
4394 | 48 | var arc = progress * chartData[i].value / total * Math.PI / 50; | ||
4395 | 49 | ctx.beginPath(); | ||
4396 | 50 | ctx.fillStyle = chartData[i].color; | ||
4397 | 51 | ctx.moveTo(centreX, centreY); | ||
4398 | 52 | ctx.arc(centreX, centreY, size, arcTotal, arc + arcTotal); | ||
4399 | 53 | ctx.lineTo(centreX, centreY); | ||
4400 | 54 | ctx.fill(); | ||
4401 | 55 | ctx.lineWidth = borderWidth; | ||
4402 | 56 | ctx.strokeStyle = borderColor; | ||
4403 | 57 | ctx.stroke(); | ||
4404 | 58 | arcTotal += arc; | ||
4405 | 59 | } | ||
4406 | 60 | animation.start(); | ||
4407 | 61 | } | ||
4408 | 62 | |||
4409 | 63 | onProgressChanged: { | ||
4410 | 64 | requestPaint(); | ||
4411 | 65 | } | ||
4412 | 66 | |||
4413 | 67 | function repaint() { | ||
4414 | 68 | progress = 0; | ||
4415 | 69 | animation.start(); | ||
4416 | 70 | } | ||
4417 | 71 | |||
4418 | 72 | PropertyAnimation { | ||
4419 | 73 | id: animation; | ||
4420 | 74 | target: canvas; | ||
4421 | 75 | property: "progress"; | ||
4422 | 76 | to: 100; | ||
4423 | 77 | duration: 1000; // milliseconds | ||
4424 | 78 | } | ||
4425 | 79 | } | ||
4426 | 0 | 80 | ||
4427 | === modified file 'checkbox-touch/components/QmlConfinedPage.qml' | |||
4428 | --- checkbox-touch/components/QmlConfinedPage.qml 2015-09-15 11:07:31 +0000 | |||
4429 | +++ checkbox-touch/components/QmlConfinedPage.qml 2016-01-05 21:24:37 +0000 | |||
4430 | @@ -46,6 +46,7 @@ | |||
4431 | 46 | property string name: "Checkbox-touch qml confined shell" | 46 | property string name: "Checkbox-touch qml confined shell" |
4432 | 47 | property alias pageStack: qmlNativePage.pageStack | 47 | property alias pageStack: qmlNativePage.pageStack |
4433 | 48 | property string sessionDir: app.sessionDir | 48 | property string sessionDir: app.sessionDir |
4434 | 49 | property var python: app.py | ||
4435 | 49 | function getTest() { | 50 | function getTest() { |
4436 | 50 | return test; | 51 | return test; |
4437 | 51 | } | 52 | } |
4438 | @@ -106,11 +107,35 @@ | |||
4439 | 106 | Layout.fillWidth: true | 107 | Layout.fillWidth: true |
4440 | 107 | text: i18n.tr("Start the test") | 108 | text: i18n.tr("Start the test") |
4441 | 108 | onClicked: { | 109 | onClicked: { |
4446 | 109 | busyIndicatorGroup.visible = true; | 110 | var appName = "com.ubuntu.checkbox_" + test["partial_id"]; |
4447 | 110 | var appName = "com.ubuntu.checkbox_" + test["partial_id"] + "_" + applicationVersion + ".desktop"; | 111 | // load the test qml file to check which permissions should be cleared |
4448 | 111 | console.log("Launching " + appName); | 112 | var testItemComponent = Qt.createComponent(Qt.resolvedUrl(test['qml_file'])); |
4449 | 112 | Qt.openUrlExternally("application:///" + appName); | 113 | if (testItemComponent.status == Component.Error) { |
4450 | 114 | console.error("Error creating testItemComponent. Possible cause: Problem with job's qml file. Error:", testItemComponent.errorString()); | ||
4451 | 115 | test['outcome'] = 'fail'; | ||
4452 | 116 | testDone(test); | ||
4453 | 117 | return; | ||
4454 | 118 | } | ||
4455 | 119 | var testItem = testItemComponent.createObject(dummyContainer, {"testingShell": testingShell}); | ||
4456 | 120 | var clearedPermissions = testItem.clearedPermissions; | ||
4457 | 121 | testItem.destroy(); | ||
4458 | 122 | var runConfinedTestApp = function() { | ||
4459 | 123 | busyIndicatorGroup.visible = true; | ||
4460 | 124 | Qt.openUrlExternally("application:///" + appName + "_" + applicationVersion+ ".desktop"); | ||
4461 | 125 | } | ||
4462 | 126 | if (clearedPermissions) { | ||
4463 | 127 | app.dropPermissions(appName, clearedPermissions, function() { | ||
4464 | 128 | runConfinedTestApp(); | ||
4465 | 129 | }); | ||
4466 | 130 | } else { | ||
4467 | 131 | runConfinedTestApp(); | ||
4468 | 132 | } | ||
4469 | 133 | |||
4470 | 113 | } | 134 | } |
4471 | 114 | } | 135 | } |
4472 | 136 | Item { | ||
4473 | 137 | id: dummyContainer | ||
4474 | 138 | visible: false | ||
4475 | 139 | } | ||
4476 | 115 | } | 140 | } |
4477 | 116 | } | 141 | } |
4478 | 117 | 142 | ||
4479 | === modified file 'checkbox-touch/components/QmlNativePage.qml' | |||
4480 | --- checkbox-touch/components/QmlNativePage.qml 2015-09-15 11:07:44 +0000 | |||
4481 | +++ checkbox-touch/components/QmlNativePage.qml 2016-01-05 21:24:37 +0000 | |||
4482 | @@ -42,6 +42,7 @@ | |||
4483 | 42 | property string name: "Checkbox-touch qml shell" | 42 | property string name: "Checkbox-touch qml shell" |
4484 | 43 | property alias pageStack: qmlNativePage.pageStack | 43 | property alias pageStack: qmlNativePage.pageStack |
4485 | 44 | property string sessionDir: app.sessionDir | 44 | property string sessionDir: app.sessionDir |
4486 | 45 | property var python: app.py | ||
4487 | 45 | function getTest() { | 46 | function getTest() { |
4488 | 46 | return test; | 47 | return test; |
4489 | 47 | } | 48 | } |
4490 | 48 | 49 | ||
4491 | === modified file 'checkbox-touch/components/ResultsPage.qml' | |||
4492 | --- checkbox-touch/components/ResultsPage.qml 2015-09-04 13:15:26 +0000 | |||
4493 | +++ checkbox-touch/components/ResultsPage.qml 2016-01-05 21:24:37 +0000 | |||
4494 | @@ -28,7 +28,6 @@ | |||
4495 | 28 | import QtQuick 2.0 | 28 | import QtQuick 2.0 |
4496 | 29 | import Ubuntu.Components 1.1 | 29 | import Ubuntu.Components 1.1 |
4497 | 30 | import QtQuick.Layouts 1.1 | 30 | import QtQuick.Layouts 1.1 |
4498 | 31 | import jbQuick.Charts 1.0 | ||
4499 | 32 | 31 | ||
4500 | 33 | Page { | 32 | Page { |
4501 | 34 | title: i18n.tr("Test Results") | 33 | title: i18n.tr("Test Results") |
4502 | @@ -37,9 +36,11 @@ | |||
4503 | 37 | objectName: "resultsPage" | 36 | objectName: "resultsPage" |
4504 | 38 | property var results: {"totalPassed": 0, "totalFailed": 0, "totalSkipped": 0} | 37 | property var results: {"totalPassed": 0, "totalFailed": 0, "totalSkipped": 0} |
4505 | 39 | property string submissionName: "" | 38 | property string submissionName: "" |
4506 | 39 | property var rerunEnabled: false | ||
4507 | 40 | signal saveReportClicked() | 40 | signal saveReportClicked() |
4508 | 41 | signal submitReportClicked() | 41 | signal submitReportClicked() |
4509 | 42 | signal endTesting() | 42 | signal endTesting() |
4510 | 43 | signal rerunTests() | ||
4511 | 43 | 44 | ||
4512 | 44 | function unlatchSubmission() { | 45 | function unlatchSubmission() { |
4513 | 45 | submitResultsButton.unlatch(); | 46 | submitResultsButton.unlatch(); |
4514 | @@ -48,7 +49,15 @@ | |||
4515 | 48 | head { | 49 | head { |
4516 | 49 | actions: [ | 50 | actions: [ |
4517 | 50 | Action { | 51 | Action { |
4519 | 51 | iconName: "window-close" | 52 | id: rerunAction |
4520 | 53 | objectName: "rerunAction" | ||
4521 | 54 | iconName: "view-refresh" | ||
4522 | 55 | text: i18n.tr("Rerun") | ||
4523 | 56 | onTriggered: rerunTests(); | ||
4524 | 57 | visible: rerunEnabled | ||
4525 | 58 | }, | ||
4526 | 59 | Action { | ||
4527 | 60 | iconName: "close" | ||
4528 | 52 | text: i18n.tr("Close") | 61 | text: i18n.tr("Close") |
4529 | 53 | onTriggered: endTesting(); | 62 | onTriggered: endTesting(); |
4530 | 54 | } | 63 | } |
4531 | @@ -84,7 +93,7 @@ | |||
4532 | 84 | 93 | ||
4533 | 85 | Label { | 94 | Label { |
4534 | 86 | fontSize: "x-large" | 95 | fontSize: "x-large" |
4536 | 87 | text: "Summary" | 96 | text: i18n.tr("Summary") |
4537 | 88 | } | 97 | } |
4538 | 89 | 98 | ||
4539 | 90 | MouseArea { | 99 | MouseArea { |
4540 | @@ -92,14 +101,9 @@ | |||
4541 | 92 | Layout.fillWidth: true | 101 | Layout.fillWidth: true |
4542 | 93 | property var easter: 0 | 102 | property var easter: 0 |
4543 | 94 | 103 | ||
4545 | 95 | Chart { | 104 | PieChart { |
4546 | 96 | id: chart_pie; | 105 | id: chart_pie; |
4547 | 97 | anchors.fill: parent | 106 | anchors.fill: parent |
4548 | 98 | chartAnimated: true; | ||
4549 | 99 | chartAnimationEasing: Easing.Linear; | ||
4550 | 100 | chartAnimationDuration: 1000; | ||
4551 | 101 | chartType: Charts.ChartType.PIE; | ||
4552 | 102 | chartOptions: {"segmentStrokeColor": "#ECECEC"}; | ||
4553 | 103 | } | 107 | } |
4554 | 104 | Image { | 108 | Image { |
4555 | 105 | id: img | 109 | id: img |
4556 | @@ -128,7 +132,7 @@ | |||
4557 | 128 | } | 132 | } |
4558 | 129 | Text { | 133 | Text { |
4559 | 130 | objectName: "passedLabel" | 134 | objectName: "passedLabel" |
4561 | 131 | text: results.totalPassed + " tests passed" | 135 | text: results.totalPassed + " " + i18n.tr("tests passed") |
4562 | 132 | } | 136 | } |
4563 | 133 | } | 137 | } |
4564 | 134 | Row { | 138 | Row { |
4565 | @@ -139,7 +143,7 @@ | |||
4566 | 139 | } | 143 | } |
4567 | 140 | Text { | 144 | Text { |
4568 | 141 | objectName: "failedLabel" | 145 | objectName: "failedLabel" |
4570 | 142 | text: results.totalFailed + " tests failed" | 146 | text: results.totalFailed + " " + i18n.tr("tests failed") |
4571 | 143 | } | 147 | } |
4572 | 144 | } | 148 | } |
4573 | 145 | Row { | 149 | Row { |
4574 | @@ -150,7 +154,7 @@ | |||
4575 | 150 | } | 154 | } |
4576 | 151 | Text { | 155 | Text { |
4577 | 152 | objectName: "skippedLabel" | 156 | objectName: "skippedLabel" |
4579 | 153 | text: results.totalSkipped + " tests skipped" | 157 | text: results.totalSkipped + " " + i18n.tr("tests skipped") |
4580 | 154 | } | 158 | } |
4581 | 155 | } | 159 | } |
4582 | 156 | } | 160 | } |
4583 | @@ -160,15 +164,22 @@ | |||
4584 | 160 | unlatchedColor: UbuntuColors.green | 164 | unlatchedColor: UbuntuColors.green |
4585 | 161 | Layout.fillWidth: true | 165 | Layout.fillWidth: true |
4586 | 162 | text: i18n.tr("Save detailed report") | 166 | text: i18n.tr("Save detailed report") |
4588 | 163 | onLatchedClicked: saveReportClicked(); | 167 | onLatchedClicked: { |
4589 | 168 | rerunAction.enabled = false; | ||
4590 | 169 | saveReportClicked(); | ||
4591 | 170 | } | ||
4592 | 164 | } | 171 | } |
4593 | 165 | LatchButton { | 172 | LatchButton { |
4594 | 166 | id: submitResultsButton | 173 | id: submitResultsButton |
4595 | 167 | unlatchedColor: UbuntuColors.green | 174 | unlatchedColor: UbuntuColors.green |
4596 | 168 | visible: submissionName | 175 | visible: submissionName |
4597 | 169 | Layout.fillWidth: true | 176 | Layout.fillWidth: true |
4598 | 177 | // TRANSLATORS: follwing string will be followed by a service name, e.g. "certification website" | ||
4599 | 170 | text: i18n.tr("Submit results to " + submissionName) | 178 | text: i18n.tr("Submit results to " + submissionName) |
4601 | 171 | onLatchedClicked: submitReportClicked(); | 179 | onLatchedClicked: { |
4602 | 180 | rerunAction.enabled = false; | ||
4603 | 181 | submitReportClicked(); | ||
4604 | 182 | } | ||
4605 | 172 | } | 183 | } |
4606 | 173 | } | 184 | } |
4607 | 174 | } | 185 | } |
4608 | 175 | 186 | ||
4609 | === modified file 'checkbox-touch/components/ResumeSessionPage.qml' | |||
4610 | --- checkbox-touch/components/ResumeSessionPage.qml 2015-07-17 08:36:57 +0000 | |||
4611 | +++ checkbox-touch/components/ResumeSessionPage.qml 2016-01-05 21:24:37 +0000 | |||
4612 | @@ -114,7 +114,7 @@ | |||
4613 | 114 | Layout.fillHeight: true | 114 | Layout.fillHeight: true |
4614 | 115 | Layout.fillWidth: true | 115 | Layout.fillWidth: true |
4615 | 116 | color: "white" | 116 | color: "white" |
4617 | 117 | text: i18n.tr("Restart") | 117 | text: i18n.tr("Start new session") |
4618 | 118 | } | 118 | } |
4619 | 119 | onLatchedClicked: { | 119 | onLatchedClicked: { |
4620 | 120 | restartSession(); | 120 | restartSession(); |
4621 | 121 | 121 | ||
4622 | === modified file 'checkbox-touch/components/SelectionPage.qml' | |||
4623 | --- checkbox-touch/components/SelectionPage.qml 2015-09-18 14:28:20 +0000 | |||
4624 | +++ checkbox-touch/components/SelectionPage.qml 2016-01-05 21:24:37 +0000 | |||
4625 | @@ -42,15 +42,22 @@ | |||
4626 | 42 | visible: false | 42 | visible: false |
4627 | 43 | flickable: null | 43 | flickable: null |
4628 | 44 | property var selectedCount : 0 | 44 | property var selectedCount : 0 |
4630 | 45 | state : selectedCount > 0 ? "nonempty selection" : "empty selection" | 45 | property var disabledSelectedCount: 0 |
4631 | 46 | state : selectedCount > 0 ? "nonempty selection" : | ||
4632 | 47 | (disabledSelectedCount > 0 ? "disabled only selection" : "empty selection") | ||
4633 | 46 | 48 | ||
4634 | 47 | // A function that needs to be called after changes are done to the model | 49 | // A function that needs to be called after changes are done to the model |
4635 | 48 | // to re-count number of selected items on the list | 50 | // to re-count number of selected items on the list |
4636 | 49 | function modelUpdated() { | 51 | function modelUpdated() { |
4637 | 50 | selectedCount = 0; | 52 | selectedCount = 0; |
4638 | 53 | disabledSelectedCount = 0; | ||
4639 | 51 | for (var i=0; i < selectionModel.count; i++) { | 54 | for (var i=0; i < selectionModel.count; i++) { |
4640 | 52 | if (selectionModel.get(i).mod_selected) { | 55 | if (selectionModel.get(i).mod_selected) { |
4642 | 53 | selectedCount++; | 56 | if (selectionModel.get(i).mod_disabled) { |
4643 | 57 | disabledSelectedCount++; | ||
4644 | 58 | } else { | ||
4645 | 59 | selectedCount++; | ||
4646 | 60 | } | ||
4647 | 54 | } | 61 | } |
4648 | 55 | } | 62 | } |
4649 | 56 | } | 63 | } |
4650 | @@ -68,16 +75,31 @@ | |||
4651 | 68 | continueButton.unlatch(); | 75 | continueButton.unlatch(); |
4652 | 69 | } | 76 | } |
4653 | 70 | function deselectAll() { | 77 | function deselectAll() { |
4654 | 78 | selectedCount = 0; | ||
4655 | 79 | disabledSelectedCount = 0; | ||
4656 | 71 | for (var i=0; i<selectionModel.count; i++) { | 80 | for (var i=0; i<selectionModel.count; i++) { |
4658 | 72 | selectionModel.setProperty(i, "mod_selected", false); | 81 | if (!selectionModel.get(i)["mod_disabled"]) { |
4659 | 82 | selectionModel.setProperty(i, "mod_selected", false); | ||
4660 | 83 | } else { | ||
4661 | 84 | if (selectionModel.get(i).mod_selected) { | ||
4662 | 85 | disabledSelectedCount++; | ||
4663 | 86 | } | ||
4664 | 87 | } | ||
4665 | 73 | } | 88 | } |
4666 | 74 | selectedCount = 0; | ||
4667 | 75 | } | 89 | } |
4668 | 76 | function selectAll() { | 90 | function selectAll() { |
4669 | 91 | selectedCount = 0; | ||
4670 | 92 | disabledSelectedCount = 0; | ||
4671 | 77 | for (var i=0; i<selectionModel.count; i++) { | 93 | for (var i=0; i<selectionModel.count; i++) { |
4673 | 78 | selectionModel.setProperty(i, "mod_selected", true); | 94 | if (!selectionModel.get(i)["mod_disabled"]) { |
4674 | 95 | selectionModel.setProperty(i, "mod_selected", true); | ||
4675 | 96 | selectedCount++; | ||
4676 | 97 | } else { | ||
4677 | 98 | if (selectionModel.get(i).mod_selected) { | ||
4678 | 99 | disabledSelectedCount++; | ||
4679 | 100 | } | ||
4680 | 101 | } | ||
4681 | 79 | } | 102 | } |
4682 | 80 | selectedCount = selectionModel.count; | ||
4683 | 81 | } | 103 | } |
4684 | 82 | 104 | ||
4685 | 83 | head { | 105 | head { |
4686 | @@ -89,7 +111,7 @@ | |||
4687 | 89 | text: i18n.tr("Toggle selection") | 111 | text: i18n.tr("Toggle selection") |
4688 | 90 | visible: !onlyOneAllowed | 112 | visible: !onlyOneAllowed |
4689 | 91 | onTriggered: { | 113 | onTriggered: { |
4691 | 92 | if (state === "empty selection") { | 114 | if (state === "empty selection" || state == "disabled only selection") { |
4692 | 93 | selectAll(); | 115 | selectAll(); |
4693 | 94 | } | 116 | } |
4694 | 95 | else if (state === "nonempty selection") { | 117 | else if (state === "nonempty selection") { |
4695 | @@ -110,6 +132,10 @@ | |||
4696 | 110 | State { | 132 | State { |
4697 | 111 | name: "nonempty selection" | 133 | name: "nonempty selection" |
4698 | 112 | PropertyChanges { target: continueButton; enabled: true } | 134 | PropertyChanges { target: continueButton; enabled: true } |
4699 | 135 | }, | ||
4700 | 136 | State { | ||
4701 | 137 | name: "disabled only selection" | ||
4702 | 138 | PropertyChanges { target: continueButton; enabled: true } | ||
4703 | 113 | } | 139 | } |
4704 | 114 | ] | 140 | ] |
4705 | 115 | 141 | ||
4706 | @@ -166,6 +192,7 @@ | |||
4707 | 166 | delegate: ListItemWrappable { | 192 | delegate: ListItemWrappable { |
4708 | 167 | objectName: "listItem" | 193 | objectName: "listItem" |
4709 | 168 | text: mod_name | 194 | text: mod_name |
4710 | 195 | enabled: !mod_disabled | ||
4711 | 169 | property var item_mod_id: mod_id | 196 | property var item_mod_id: mod_id |
4712 | 170 | /* Create a checkbox-lookalike that doesn't have the internal onTrigger | 197 | /* Create a checkbox-lookalike that doesn't have the internal onTrigger |
4713 | 171 | * signal handler that overrides the binding to the model.mod_selected | 198 | * signal handler that overrides the binding to the model.mod_selected |
4714 | 172 | 199 | ||
4715 | === modified file 'checkbox-touch/components/TestVerificationPage.qml' | |||
4716 | --- checkbox-touch/components/TestVerificationPage.qml 2015-09-15 11:00:43 +0000 | |||
4717 | +++ checkbox-touch/components/TestVerificationPage.qml 2016-01-05 21:24:37 +0000 | |||
4718 | @@ -68,6 +68,7 @@ | |||
4719 | 68 | objectName: "passButton" | 68 | objectName: "passButton" |
4720 | 69 | unlatchedColor: UbuntuColors.green | 69 | unlatchedColor: UbuntuColors.green |
4721 | 70 | Layout.fillWidth: true | 70 | Layout.fillWidth: true |
4722 | 71 | // TRANSLATORS: this string is on a button that marks the given test as passed | ||
4723 | 71 | text: i18n.tr("Pass") | 72 | text: i18n.tr("Pass") |
4724 | 72 | onLatchedClicked: { | 73 | onLatchedClicked: { |
4725 | 73 | test["outcome"] = "pass"; | 74 | test["outcome"] = "pass"; |
4726 | @@ -81,6 +82,7 @@ | |||
4727 | 81 | objectName: "failButton" | 82 | objectName: "failButton" |
4728 | 82 | unlatchedColor: UbuntuColors.red | 83 | unlatchedColor: UbuntuColors.red |
4729 | 83 | Layout.fillWidth: true | 84 | Layout.fillWidth: true |
4730 | 85 | // TRANSLATORS: this string is on a button that marks the given test as failed | ||
4731 | 84 | text: i18n.tr("Fail") | 86 | text: i18n.tr("Fail") |
4732 | 85 | onLatchedClicked: { | 87 | onLatchedClicked: { |
4733 | 86 | test["outcome"] = "fail"; | 88 | test["outcome"] = "fail"; |
4734 | 87 | 89 | ||
4735 | === modified file 'checkbox-touch/components/UserInteractSummaryPage.qml' | |||
4736 | --- checkbox-touch/components/UserInteractSummaryPage.qml 2015-09-15 11:02:02 +0000 | |||
4737 | +++ checkbox-touch/components/UserInteractSummaryPage.qml 2016-01-05 21:24:37 +0000 | |||
4738 | @@ -56,6 +56,7 @@ | |||
4739 | 56 | Label { | 56 | Label { |
4740 | 57 | fontSize: "large" | 57 | fontSize: "large" |
4741 | 58 | Layout.fillHeight: true | 58 | Layout.fillHeight: true |
4742 | 59 | // TRANSLATORS: this string will be followed by either "PASSED" or "FAILED" | ||
4743 | 59 | text : i18n.tr("This test ") | 60 | text : i18n.tr("This test ") |
4744 | 60 | wrapMode: Text.WrapAtWordBoundaryOrAnywhere | 61 | wrapMode: Text.WrapAtWordBoundaryOrAnywhere |
4745 | 61 | } | 62 | } |
4746 | @@ -84,7 +85,7 @@ | |||
4747 | 84 | Layout.fillHeight: true | 85 | Layout.fillHeight: true |
4748 | 85 | Layout.fillWidth: true | 86 | Layout.fillWidth: true |
4749 | 86 | wrapMode: Text.WrapAtWordBoundaryOrAnywhere | 87 | wrapMode: Text.WrapAtWordBoundaryOrAnywhere |
4751 | 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.") |
4752 | 88 | } | 89 | } |
4753 | 89 | 90 | ||
4754 | 90 | Button { | 91 | Button { |
4755 | 91 | 92 | ||
4756 | === modified file 'checkbox-touch/components/WelcomePage.qml' | |||
4757 | --- checkbox-touch/components/WelcomePage.qml 2015-07-17 08:36:57 +0000 | |||
4758 | +++ checkbox-touch/components/WelcomePage.qml 2016-01-05 21:24:37 +0000 | |||
4759 | @@ -32,7 +32,7 @@ | |||
4760 | 32 | signal aboutClicked(); | 32 | signal aboutClicked(); |
4761 | 33 | property alias welcomeText: welcomeText.text | 33 | property alias welcomeText: welcomeText.text |
4762 | 34 | 34 | ||
4764 | 35 | title: i18n.tr("System Testing") | 35 | title: i18n.tr("Community Testing") |
4765 | 36 | visible: false | 36 | visible: false |
4766 | 37 | 37 | ||
4767 | 38 | function enableButton() { | 38 | function enableButton() { |
4768 | @@ -60,7 +60,7 @@ | |||
4769 | 60 | bottom: startTestButton.top | 60 | bottom: startTestButton.top |
4770 | 61 | } | 61 | } |
4771 | 62 | 62 | ||
4773 | 63 | text: i18n.tr("Welcome text") | 63 | text: "" |
4774 | 64 | fontSize: "large" | 64 | fontSize: "large" |
4775 | 65 | verticalAlignment: Text.AlignVCenter | 65 | verticalAlignment: Text.AlignVCenter |
4776 | 66 | horizontalAlignment: Text.AlignHCenter | 66 | horizontalAlignment: Text.AlignHCenter |
4777 | @@ -70,13 +70,13 @@ | |||
4778 | 70 | states: [ | 70 | states: [ |
4779 | 71 | State { | 71 | State { |
4780 | 72 | name: "loading" | 72 | name: "loading" |
4782 | 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...") } |
4783 | 74 | PropertyChanges { target: loadingSpinner; running: true} | 74 | PropertyChanges { target: loadingSpinner; running: true} |
4784 | 75 | 75 | ||
4785 | 76 | }, | 76 | }, |
4786 | 77 | State { | 77 | State { |
4787 | 78 | name: "loaded" | 78 | name: "loaded" |
4789 | 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")} |
4790 | 80 | PropertyChanges { target: loadingSpinner; running: false} | 80 | PropertyChanges { target: loadingSpinner; running: false} |
4791 | 81 | } | 81 | } |
4792 | 82 | ] | 82 | ] |
4793 | @@ -114,7 +114,7 @@ | |||
4794 | 114 | } | 114 | } |
4795 | 115 | 115 | ||
4796 | 116 | unlatchedColor: UbuntuColors.green | 116 | unlatchedColor: UbuntuColors.green |
4798 | 117 | text: i18n.tr("Start Testing") | 117 | text: i18n.tr("Start testing") |
4799 | 118 | onLatchedClicked: startTestingTriggered(); | 118 | onLatchedClicked: startTestingTriggered(); |
4800 | 119 | } | 119 | } |
4801 | 120 | } | 120 | } |
4802 | 121 | 121 | ||
4803 | === renamed file 'checkbox-touch/confinement/generate-confinement.py' => 'checkbox-touch/confinement/generate.py' | |||
4804 | --- checkbox-touch/confinement/generate-confinement.py 2015-07-23 10:54:18 +0000 | |||
4805 | +++ checkbox-touch/confinement/generate.py 2016-01-05 21:24:37 +0000 | |||
4806 | @@ -17,6 +17,7 @@ | |||
4807 | 17 | # You should have received a copy of the GNU General Public License | 17 | # You should have received a copy of the GNU General Public License |
4808 | 18 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. | 18 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. |
4809 | 19 | import argparse | 19 | import argparse |
4810 | 20 | import json | ||
4811 | 20 | import os | 21 | import os |
4812 | 21 | import string | 22 | import string |
4813 | 22 | import sys | 23 | import sys |
4814 | @@ -49,15 +50,9 @@ | |||
4815 | 49 | X-Ubuntu-Touch=true | 50 | X-Ubuntu-Touch=true |
4816 | 50 | """ | 51 | """ |
4817 | 51 | 52 | ||
4818 | 52 | HOOK = """ | ||
4819 | 53 | "${partial_id}": { | ||
4820 | 54 | "apparmor": "providers/${provider_name}/data/confined/${partial_id}.apparmor", | ||
4821 | 55 | "desktop": "providers/${provider_name}/data/confined/${partial_id}.desktop", | ||
4822 | 56 | "content-hub": "providers/${provider_name}/data/confined/${partial_id}-ch.json" | ||
4823 | 57 | } | ||
4824 | 58 | """ | ||
4825 | 59 | 53 | ||
4827 | 60 | def generate_confinement(provider_name, partial_id, full_checkbox_name, qml_file): | 54 | def generate_confinement(provider_name, partial_id, full_checkbox_name, |
4828 | 55 | qml_file): | ||
4829 | 61 | # generate content-hub file | 56 | # generate content-hub file |
4830 | 62 | target_dir = os.path.join('data', 'confined') | 57 | target_dir = os.path.join('data', 'confined') |
4831 | 63 | if not os.path.exists(target_dir): | 58 | if not os.path.exists(target_dir): |
4832 | @@ -72,17 +67,24 @@ | |||
4833 | 72 | with open(apparmor_path, "wt") as f: | 67 | with open(apparmor_path, "wt") as f: |
4834 | 73 | f.write(APPARMOR) | 68 | f.write(APPARMOR) |
4835 | 74 | 69 | ||
4836 | 75 | |||
4837 | 76 | # generate desktop file | 70 | # generate desktop file |
4838 | 77 | desktop_path = os.path.join(target_dir, partial_id + '.desktop') | 71 | desktop_path = os.path.join(target_dir, partial_id + '.desktop') |
4839 | 78 | template = string.Template(DESKTOP) | 72 | template = string.Template(DESKTOP) |
4840 | 79 | with open(desktop_path, "wt") as f: | 73 | with open(desktop_path, "wt") as f: |
4842 | 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( |
4843 | 75 | partial_id=partial_id, provider_name=provider_name, | ||
4844 | 76 | full_checkbox_name=full_checkbox_name, qml_file=qml_file)) | ||
4845 | 81 | 77 | ||
4848 | 82 | def generate_hook(provider_name, partial_id): | 78 | base = 'providers/{provider_name}/data/confined/{partial_id}'.format( |
4847 | 83 | return string.Template(HOOK).substitute( | ||
4849 | 84 | provider_name=provider_name, partial_id=partial_id) | 79 | provider_name=provider_name, partial_id=partial_id) |
4851 | 85 | 80 | hook = { | |
4852 | 81 | partial_id: { | ||
4853 | 82 | 'apparmor': base + '.apparmor', | ||
4854 | 83 | 'desktop': base + '.desktop', | ||
4855 | 84 | 'content-hub': base + '-ch.json', | ||
4856 | 85 | } | ||
4857 | 86 | } | ||
4858 | 87 | return hook | ||
4859 | 86 | 88 | ||
4860 | 87 | 89 | ||
4861 | 88 | def main(): | 90 | def main(): |
4862 | @@ -91,7 +93,8 @@ | |||
4863 | 91 | parser.add_argument('--checkbox_version', action='store', type=str) | 93 | parser.add_argument('--checkbox_version', action='store', type=str) |
4864 | 92 | parser.add_argument('job_ids', nargs='+') | 94 | parser.add_argument('job_ids', nargs='+') |
4865 | 93 | args = parser.parse_args() | 95 | args = parser.parse_args() |
4867 | 94 | checkbox_name = "com.ubuntu.checkbox_checkbox-touch_" + args.checkbox_version | 96 | checkbox_name = ("com.ubuntu.checkbox_checkbox-touch_" + |
4868 | 97 | args.checkbox_version) | ||
4869 | 95 | 98 | ||
4870 | 96 | # check if current dir looks like a provider - very dumb heuristic | 99 | # check if current dir looks like a provider - very dumb heuristic |
4871 | 97 | if not os.path.exists('manage.py'): | 100 | if not os.path.exists('manage.py'): |
4872 | @@ -100,8 +103,9 @@ | |||
4873 | 100 | 103 | ||
4874 | 101 | hooks = '' | 104 | hooks = '' |
4875 | 102 | for job in args.job_ids: | 105 | for job in args.job_ids: |
4878 | 103 | generate_confinement(provider_name, job, checkbox_name, job + '.qml') | 106 | hook = generate_confinement( |
4879 | 104 | hooks += generate_hook(provider_name, job) | 107 | provider_name, job, checkbox_name, job + '.qml') |
4880 | 108 | hooks += json.dumps(hook, sort_keys=True, indent=4)[1:-1] | ||
4881 | 105 | 109 | ||
4882 | 106 | print("Add following hooks to your checkbox-touch.manifest:") | 110 | print("Add following hooks to your checkbox-touch.manifest:") |
4883 | 107 | print(hooks) | 111 | print(hooks) |
4884 | 108 | 112 | ||
4885 | === modified file 'checkbox-touch/confinement/plainbox-confined-shell.qml' | |||
4886 | --- checkbox-touch/confinement/plainbox-confined-shell.qml 2015-07-23 10:48:33 +0000 | |||
4887 | +++ checkbox-touch/confinement/plainbox-confined-shell.qml 2016-01-05 21:24:37 +0000 | |||
4888 | @@ -33,7 +33,8 @@ | |||
4889 | 33 | // information and functionality passed to qml job component | 33 | // information and functionality passed to qml job component |
4890 | 34 | property var testingShell: { | 34 | property var testingShell: { |
4891 | 35 | "name": "Checkbox-touch qml confined shell", | 35 | "name": "Checkbox-touch qml confined shell", |
4893 | 36 | "pageStack": pageStack | 36 | "pageStack": pageStack, |
4894 | 37 | "python": py | ||
4895 | 37 | } | 38 | } |
4896 | 38 | property var activeTransfer; | 39 | property var activeTransfer; |
4897 | 39 | 40 | ||
4898 | @@ -94,7 +95,7 @@ | |||
4899 | 94 | anchors.fill: parent | 95 | anchors.fill: parent |
4900 | 95 | Label { | 96 | Label { |
4901 | 96 | anchors.fill: parent | 97 | anchors.fill: parent |
4903 | 97 | text: i18n.tr("sending results - you should not see this page :-)") | 98 | text: i18n.tr("Sending report - you should not see this page :-)") |
4904 | 98 | } | 99 | } |
4905 | 99 | } | 100 | } |
4906 | 100 | ContentPeer { | 101 | ContentPeer { |
4907 | 101 | 102 | ||
4908 | === modified file 'checkbox-touch/get-libs' | |||
4909 | --- checkbox-touch/get-libs 2015-09-01 18:06:45 +0000 | |||
4910 | +++ checkbox-touch/get-libs 2016-01-05 21:24:37 +0000 | |||
4911 | @@ -72,8 +72,7 @@ | |||
4912 | 72 | 'python3-extras', 'python3-evdev'] | 72 | 'python3-extras', 'python3-evdev'] |
4913 | 73 | packages = ['libpython3.4', 'pyotherside', 'python3-xlsxwriter', | 73 | packages = ['libpython3.4', 'pyotherside', 'python3-xlsxwriter', |
4914 | 74 | 'python3-jinja2', 'python3-markupsafe', 'python3-padme', | 74 | 'python3-jinja2', 'python3-markupsafe', 'python3-padme', |
4917 | 75 | 'qml-module-qtquick-qchartjs', 'python3-requests', | 75 | 'python3-requests', 'python3-urllib3', 'python3-guacamole'] |
4916 | 76 | 'python3-urllib3'] | ||
4918 | 77 | if get_autopilot: | 76 | if get_autopilot: |
4919 | 78 | packages += ap_packages | 77 | packages += ap_packages |
4920 | 79 | # uris will serve as a database of uris from which to download packages | 78 | # uris will serve as a database of uris from which to download packages |
4921 | @@ -221,7 +220,7 @@ | |||
4922 | 221 | # ./usr/lib/python3/dist-packages are copied to ./lib/py. | 220 | # ./usr/lib/python3/dist-packages are copied to ./lib/py. |
4923 | 222 | python3_libs = ['python3-xlsxwriter', 'python3-jinja2', | 221 | python3_libs = ['python3-xlsxwriter', 'python3-jinja2', |
4924 | 223 | 'python3-markupsafe', 'python3-padme', 'python3-requests', | 222 | 'python3-markupsafe', 'python3-padme', 'python3-requests', |
4926 | 224 | 'python3-urllib3'] | 223 | 'python3-urllib3', 'python3-guacamole'] |
4927 | 225 | 224 | ||
4928 | 226 | # additional libs needed to support autopilot tests. these were obtained by | 225 | # additional libs needed to support autopilot tests. these were obtained by |
4929 | 227 | # running apt-cache depends on python3-autopilot | 226 | # running apt-cache depends on python3-autopilot |
4930 | @@ -246,7 +245,6 @@ | |||
4931 | 246 | # ./usr/lib/{architecture}/qt5/qmlare copied to ./lib/{architecture}. | 245 | # ./usr/lib/{architecture}/qt5/qmlare copied to ./lib/{architecture}. |
4932 | 247 | # {architecture} may be one of multiarch_list | 246 | # {architecture} may be one of multiarch_list |
4933 | 248 | qml_plugins_urls = [uris['pyotherside', arch] for arch in arch_list] | 247 | qml_plugins_urls = [uris['pyotherside', arch] for arch in arch_list] |
4934 | 249 | qml_plugins_urls += [uris['qml-module-qtquick-qchartjs', arch] for arch in arch_list] | ||
4935 | 250 | for qml_plugin in qml_plugins_urls: | 248 | for qml_plugin in qml_plugins_urls: |
4936 | 251 | with tempfile.TemporaryDirectory() as tmp: | 249 | with tempfile.TemporaryDirectory() as tmp: |
4937 | 252 | get_package_from_url_and_extract(qml_plugin, tmp) | 250 | get_package_from_url_and_extract(qml_plugin, tmp) |
4938 | 253 | 251 | ||
4939 | === modified file 'checkbox-touch/manifest.json' | |||
4940 | --- checkbox-touch/manifest.json 2015-07-31 13:07:18 +0000 | |||
4941 | +++ checkbox-touch/manifest.json 2016-01-05 21:24:37 +0000 | |||
4942 | @@ -1,19 +1,19 @@ | |||
4943 | 1 | { | 1 | { |
4944 | 2 | "architecture": ["armhf", "i386", "amd64"], | 2 | "architecture": ["armhf", "i386", "amd64"], |
4946 | 3 | "description": "System testing utility for Ubuntu", | 3 | "description": "Community testing utility for Ubuntu", |
4947 | 4 | "framework": "ubuntu-sdk-14.10", | 4 | "framework": "ubuntu-sdk-14.10", |
4948 | 5 | "hooks": { | 5 | "hooks": { |
4950 | 6 | "checkbox-touch": { | 6 | "pilot": { |
4951 | 7 | "apparmor": "checkbox-touch.json", | 7 | "apparmor": "checkbox-touch.json", |
4953 | 8 | "desktop": "checkbox-touch.desktop" | 8 | "desktop": "pilot.desktop" |
4954 | 9 | } | 9 | } |
4955 | 10 | }, | 10 | }, |
4960 | 11 | "maintainer": "Zygmunt Krynicki <zkrynicki@ubuntu.com>", | 11 | "maintainer": "Ubuntu App Cats <ubuntu-touch-coreapps@lists.launchpad.net>", |
4961 | 12 | "name": "com.ubuntu.checkbox", | 12 | "name": "com.ubuntu.pilot", |
4962 | 13 | "title": "Checkbox", | 13 | "title": "Pilot", |
4963 | 14 | "version": "1.2.1", | 14 | "version": "1.3", |
4964 | 15 | "x-source": { | 15 | "x-source": { |
4965 | 16 | "vcs-bzr": "lp:checkbox", | 16 | "vcs-bzr": "lp:checkbox", |
4967 | 17 | "vcs-bzr-revno": "checkbox-touch-v1.2.1" | 17 | "vcs-bzr-revno": "checkbox-touch-v1.3.dev0" |
4968 | 18 | } | 18 | } |
4969 | 19 | } | 19 | } |
4970 | 20 | 20 | ||
4971 | === added file 'checkbox-touch/pilot_256.png' | |||
4972 | 21 | Binary 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 | 21 | Binary 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 |
4973 | === added file 'checkbox-touch/pilot_512.png' | |||
4974 | 22 | Binary 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 | 22 | Binary 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 |
4975 | === modified file 'checkbox-touch/po/checkbox-touch.pot' | |||
4976 | --- checkbox-touch/po/checkbox-touch.pot 2014-08-11 14:17:45 +0000 | |||
4977 | +++ checkbox-touch/po/checkbox-touch.pot 2016-01-05 21:24:37 +0000 | |||
4978 | @@ -8,7 +8,7 @@ | |||
4979 | 8 | msgstr "" | 8 | msgstr "" |
4980 | 9 | "Project-Id-Version: PACKAGE VERSION\n" | 9 | "Project-Id-Version: PACKAGE VERSION\n" |
4981 | 10 | "Report-Msgid-Bugs-To: \n" | 10 | "Report-Msgid-Bugs-To: \n" |
4983 | 11 | "POT-Creation-Date: 2014-08-11 15:18+0200\n" | 11 | "POT-Creation-Date: 2015-10-15 12:23+0200\n" |
4984 | 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" | 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
4985 | 13 | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | 13 | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" |
4986 | 14 | "Language-Team: LANGUAGE <LL@li.org>\n" | 14 | "Language-Team: LANGUAGE <LL@li.org>\n" |
4987 | @@ -17,18 +17,308 @@ | |||
4988 | 17 | "Content-Type: text/plain; charset=CHARSET\n" | 17 | "Content-Type: text/plain; charset=CHARSET\n" |
4989 | 18 | "Content-Transfer-Encoding: 8bit\n" | 18 | "Content-Transfer-Encoding: 8bit\n" |
4990 | 19 | 19 | ||
4991 | 20 | #: main.qml:26 | ||
4992 | 21 | msgid "Simple" | ||
4993 | 22 | msgstr "" | ||
4994 | 23 | |||
4995 | 24 | #: main.qml:39 | ||
4996 | 25 | msgid "Hello.." | ||
4997 | 26 | msgstr "" | ||
4998 | 27 | |||
4999 | 28 | #: main.qml:46 | ||
5000 | 29 | msgid "Tap me!" |