Merge lp:~pieq/checkbox/fix-1609325-longer-SID into lp:checkbox

Proposed by Pierre Equoy
Status: Merged
Approved by: Maciej Kisielewski
Approved revision: 4461
Merged at revision: 4458
Proposed branch: lp:~pieq/checkbox/fix-1609325-longer-SID
Merge into: lp:checkbox
Diff against target: 2149 lines (+402/-404)
9 files modified
checkbox-ng/checkbox_ng/certification.py (+2/-2)
checkbox-ng/checkbox_ng/commands/newcli.py (+2/-2)
checkbox-ng/checkbox_ng/commands/submit.py (+1/-1)
checkbox-ng/checkbox_ng/test_certification.py (+5/-5)
checkbox-ng/po/checkbox-ng.pot (+69/-121)
plainbox/plainbox/impl/transport.py (+3/-3)
plainbox/po/POTFILES.in (+0/-1)
plainbox/po/plainbox.pot (+318/-267)
tools/canonical-hw-collection/canonical-hw-collection (+2/-2)
To merge this branch: bzr merge lp:~pieq/checkbox/fix-1609325-longer-SID
Reviewer Review Type Date Requested Status
Maciej Kisielewski Approve
Paul Larson Approve
Review via email: mp+301922@code.launchpad.net

Description of the change

Allow Secure IDs of more than 18 chars to be used when submitting to Certification

HEXR now uses Secure IDs (SID) made of 22 alphanumeric characters. However,
most scripts used in Checkbox/Plainbox were expecting 15 or 18 characters.

To test, you can use different ways of submitting:

1. run a launcher pointing to certification-staging to run a test plan, then submit it to staging using an existing SID (you can create some hardware on C3 staging if needed)

The launcher looks like this:

--------------------------------
#!/usr/bin/env checkbox-cli

[launcher]
launcher_version = 1
app_id = 2016.com.ceqa:system-testing
stock_reports = text, submission_files, certification-staging

[ui]
type = interactive

[transport:c3]
secure_id = mXat4w43eMNP3Y2sSdi6oG
--------------------------------

(of course you have to adjust the secure_id to your needs)

2. run the 'checkbox submit' tool (see --help for more info)

3. use the 'canonical-hw-collection' script

To post a comment you must log in.
Revision history for this message
Paul Larson (pwlars) wrote :

regexp confirmed for 15+, looks good. +1

review: Approve
Revision history for this message
Maciej Kisielewski (kissiel) wrote :

There is a unit-test for SECURE_ID in test_certification.py that needs updating.
Update that and I'm +1 :)

review: Needs Fixing
4461. By Pierre Equoy

checkbox-ng: Adapt unit test for longer SID

Revision history for this message
Pierre Equoy (pieq) wrote :

Fixed unit test to only raise exception for SID shorter than 15 chars.

Revision history for this message
Maciej Kisielewski (kissiel) wrote :

+1, let's land it!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'checkbox-ng/checkbox_ng/certification.py'
2--- checkbox-ng/checkbox_ng/certification.py 2016-07-26 12:41:32 +0000
3+++ checkbox-ng/checkbox_ng/certification.py 2016-08-03 18:15:33 +0000
4@@ -56,7 +56,7 @@
5 Initialize the Certification Transport.
6
7 The options string may contain 'secure_id' which must be
8- a 15- or 18-character alphanumeric ID for the system.
9+ a 15-character (or longer) alphanumeric ID for the system.
10
11 It may also contain a submit_to_hexr boolean, set to 1
12 to enable submission to hexr.
13@@ -178,4 +178,4 @@
14 def _validate_secure_id(self, secure_id):
15 if not re.match(SECURE_ID_PATTERN, secure_id):
16 raise InvalidSecureIDError(
17- _("secure_id must be 15 or 18-character alphanumeric string"))
18+ _("secure_id must be 15-character (or more) alphanumeric string"))
19
20=== modified file 'checkbox-ng/checkbox_ng/commands/newcli.py'
21--- checkbox-ng/checkbox_ng/commands/newcli.py 2016-02-25 18:35:48 +0000
22+++ checkbox-ng/checkbox_ng/commands/newcli.py 2016-08-03 18:15:33 +0000
23@@ -404,8 +404,8 @@
24 self.config.secure_id = input(_("Secure ID: "))
25 except ValidationError:
26 print(
27- _("ERROR: Secure ID must be 15 or "
28- "18-character alphanumeric string"))
29+ _("ERROR: Secure ID must be 15-character "
30+ "(or more) alphanumeric string"))
31 else:
32 again = False
33 self.submit_certification_results()
34
35=== modified file 'checkbox-ng/checkbox_ng/commands/submit.py'
36--- checkbox-ng/checkbox_ng/commands/submit.py 2016-07-26 12:41:32 +0000
37+++ checkbox-ng/checkbox_ng/commands/submit.py 2016-08-03 18:15:33 +0000
38@@ -111,7 +111,7 @@
39 def secureid(secure_id):
40 if not re.match(SECURE_ID_PATTERN, secure_id):
41 raise ArgumentTypeError(
42- _("must be 15 or 18-character alphanumeric string"))
43+ _("must be 15-character (or more) alphanumeric string"))
44 return secure_id
45
46 required_check = False
47
48=== modified file 'checkbox-ng/checkbox_ng/test_certification.py'
49--- checkbox-ng/checkbox_ng/test_certification.py 2016-07-26 12:41:32 +0000
50+++ checkbox-ng/checkbox_ng/test_certification.py 2016-08-03 18:15:33 +0000
51@@ -71,11 +71,11 @@
52 self.assertTrue(transport._submit_to_hexr is True)
53
54 def test_invalid_length_secure_id_are_rejected(self):
55- for length in (14, 16, 20):
56- dummy_id = "a" * length
57- option_string = "secure_id={}".format(dummy_id)
58- with self.assertRaises(InvalidSecureIDError):
59- CertificationTransport(self.valid_url, option_string)
60+ length = 14
61+ dummy_id = "a" * length
62+ option_string = "secure_id={}".format(dummy_id)
63+ with self.assertRaises(InvalidSecureIDError):
64+ CertificationTransport(self.valid_url, option_string)
65
66 def test_invalid_characters_in_secure_id_are_rejected(self):
67 option_string = "secure_id=aA0#"
68
69=== modified file 'checkbox-ng/po/checkbox-ng.pot'
70--- checkbox-ng/po/checkbox-ng.pot 2016-01-11 08:07:21 +0000
71+++ checkbox-ng/po/checkbox-ng.pot 2016-08-03 18:15:33 +0000
72@@ -8,7 +8,7 @@
73 msgstr ""
74 "Project-Id-Version: PACKAGE VERSION\n"
75 "Report-Msgid-Bugs-To: \n"
76-"POT-Creation-Date: 2016-01-11 16:06+0800\n"
77+"POT-Creation-Date: 2016-08-03 16:58+0200\n"
78 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
79 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
80 "Language-Team: LANGUAGE <LL@li.org>\n"
81@@ -17,39 +17,42 @@
82 "Content-Type: text/plain; charset=CHARSET\n"
83 "Content-Transfer-Encoding: 8bit\n"
84
85-#: .././checkbox_ng/certification.py:135
86+#: .././checkbox_ng/certification.py:127
87 msgid "Secure ID not specified"
88 msgstr ""
89
90-#: .././checkbox_ng/certification.py:138
91+#: .././checkbox_ng/certification.py:130
92 #, python-format
93-msgid "Sending to %s, hardware id is %s"
94+msgid "Sending to %s, Secure ID is %s"
95 msgstr ""
96
97-#: .././checkbox_ng/certification.py:144
98+#: .././checkbox_ng/certification.py:136
99 #, python-format
100 msgid "submit_to_hexr set to %s by config"
101 msgstr ""
102
103-#: .././checkbox_ng/certification.py:148
104+#: .././checkbox_ng/certification.py:140
105 #, python-format
106 msgid "submit_to_hexr set to %s by UI"
107 msgstr ""
108
109-#: .././checkbox_ng/certification.py:164 .././checkbox_ng/launchpad.py:183
110+#: .././checkbox_ng/certification.py:156 .././checkbox_ng/launchpad.py:183
111+#, python-brace-format
112 msgid "Request to {0} timed out: {1}"
113 msgstr ""
114
115-#: .././checkbox_ng/certification.py:167 .././checkbox_ng/launchpad.py:186
116+#: .././checkbox_ng/certification.py:159 .././checkbox_ng/launchpad.py:186
117+#, python-brace-format
118 msgid "Invalid destination URL: {0}"
119 msgstr ""
120
121-#: .././checkbox_ng/certification.py:170 .././checkbox_ng/launchpad.py:189
122+#: .././checkbox_ng/certification.py:162 .././checkbox_ng/launchpad.py:189
123+#, python-brace-format
124 msgid "Unable to connect to {0}: {1}"
125 msgstr ""
126
127-#: .././checkbox_ng/certification.py:189
128-msgid "secure_id must be 15 or 18-character alphanumeric string"
129+#: .././checkbox_ng/certification.py:181
130+msgid "secure_id must be 15-character (or more) alphanumeric string"
131 msgstr ""
132
133 #: .././checkbox_ng/commands/cli.py:70
134@@ -57,12 +60,12 @@
135 msgstr ""
136
137 #: .././checkbox_ng/commands/cli.py:71
138-#: .././checkbox_ng/commands/launcher.py:108
139+#: .././checkbox_ng/commands/launcher.py:110
140 msgid "user interface options"
141 msgstr ""
142
143 #: .././checkbox_ng/commands/cli.py:77
144-#: .././checkbox_ng/commands/launcher.py:111
145+#: .././checkbox_ng/commands/launcher.py:113
146 msgid "skip tests that require interactivity"
147 msgstr ""
148
149@@ -75,118 +78,125 @@
150 msgid "Unable to load launcher definition: %s"
151 msgstr ""
152
153-#: .././checkbox_ng/commands/launcher.py:69
154+#: .././checkbox_ng/commands/launcher.py:71
155 msgid "Unable to start launcher because of errors:"
156 msgstr ""
157
158-#: .././checkbox_ng/commands/launcher.py:102
159+#: .././checkbox_ng/commands/launcher.py:104
160 msgid "LAUNCHER"
161 msgstr ""
162
163-#: .././checkbox_ng/commands/launcher.py:103
164+#: .././checkbox_ng/commands/launcher.py:105
165 msgid "launcher definition file to use"
166 msgstr ""
167
168-#: .././checkbox_ng/commands/newcli.py:119
169-#: .././checkbox_ng/commands/newcli.py:130
170+#: .././checkbox_ng/commands/newcli.py:123
171+#: .././checkbox_ng/commands/newcli.py:134
172 #, python-format
173 msgid "Incorrect pattern %r: %s"
174 msgstr ""
175
176-#: .././checkbox_ng/commands/newcli.py:147
177+#: .././checkbox_ng/commands/newcli.py:151
178 #, python-format
179 msgid "There is no test plan: %s"
180 msgstr ""
181
182-#: .././checkbox_ng/commands/newcli.py:236
183+#: .././checkbox_ng/commands/newcli.py:240
184 #, python-format
185 msgid "Selected testplans: %r"
186 msgstr ""
187
188-#: .././checkbox_ng/commands/newcli.py:259
189+#: .././checkbox_ng/commands/newcli.py:263
190 msgid "Suite selection"
191 msgstr ""
192
193-#: .././checkbox_ng/commands/newcli.py:262
194+#: .././checkbox_ng/commands/newcli.py:266
195 msgid "No testplan selected, aborting"
196 msgstr ""
197
198-#: .././checkbox_ng/commands/newcli.py:291
199+#: .././checkbox_ng/commands/newcli.py:295
200 msgid "Selecting Job Generators"
201 msgstr ""
202
203-#: .././checkbox_ng/commands/newcli.py:310
204+#: .././checkbox_ng/commands/newcli.py:314
205 msgid "Selecting Jobs For Execution"
206 msgstr ""
207
208-#: .././checkbox_ng/commands/newcli.py:317
209+#: .././checkbox_ng/commands/newcli.py:321
210 msgid "Choose tests to run on your system:"
211 msgstr ""
212
213-#: .././checkbox_ng/commands/newcli.py:329
214+#: .././checkbox_ng/commands/newcli.py:333
215 msgid "Results"
216 msgstr ""
217
218-#: .././checkbox_ng/commands/newcli.py:368
219+#: .././checkbox_ng/commands/newcli.py:372
220 msgid "View results"
221 msgstr ""
222
223-#: .././checkbox_ng/commands/newcli.py:397
224+#: .././checkbox_ng/commands/newcli.py:401
225+#, python-brace-format
226 msgid ""
227 "\n"
228 "Submit results to {0}?"
229 msgstr ""
230
231-#: .././checkbox_ng/commands/newcli.py:400
232+#: .././checkbox_ng/commands/newcli.py:404
233 msgid "Secure ID: "
234 msgstr ""
235
236-#: .././checkbox_ng/commands/newcli.py:403
237-msgid "ERROR: Secure ID must be 15 or 18-character alphanumeric string"
238+#: .././checkbox_ng/commands/newcli.py:407
239+msgid "ERROR: Secure ID must be 15-character (or more) alphanumeric string"
240 msgstr ""
241
242-#: .././checkbox_ng/commands/newcli.py:421
243+#: .././checkbox_ng/commands/newcli.py:425
244 msgid ""
245 "\n"
246 "Submit results to launchpad.net/+hwdb?"
247 msgstr ""
248
249-#: .././checkbox_ng/commands/newcli.py:423
250+#: .././checkbox_ng/commands/newcli.py:427
251 msgid "Email address: "
252 msgstr ""
253
254 #. TRANSLATORS: Do not translate the {} format markers.
255-#: .././checkbox_ng/commands/newcli.py:439
256+#: .././checkbox_ng/commands/newcli.py:443
257+#, python-brace-format
258 msgid "Submitting results to {0} for email_address {1}"
259 msgstr ""
260
261 #. TRANSLATORS: Do not translate the {} format marker.
262-#: .././checkbox_ng/commands/newcli.py:450
263+#: .././checkbox_ng/commands/newcli.py:454
264+#, python-brace-format
265 msgid "Submission uploaded to: {0}"
266 msgstr ""
267
268-#: .././checkbox_ng/commands/newcli.py:456
269+#: .././checkbox_ng/commands/newcli.py:460
270+#, python-brace-format
271 msgid "Bad response from {0} transport"
272 msgstr ""
273
274 #. TRANSLATORS: Do not translate the {} format markers.
275-#: .././checkbox_ng/commands/newcli.py:464
276+#: .././checkbox_ng/commands/newcli.py:468
277+#, python-brace-format
278 msgid "Submitting results to {0} for secure_id {1}"
279 msgstr ""
280
281 #. TRANSLATORS: Do not translate the {} format marker.
282-#: .././checkbox_ng/commands/newcli.py:485
283+#: .././checkbox_ng/commands/newcli.py:489
284 #: .././checkbox_ng/commands/submit.py:64
285+#, python-brace-format
286 msgid "Successfully sent, submission status at {0}"
287 msgstr ""
288
289 #. TRANSLATORS: Do not translate the {} format marker.
290-#: .././checkbox_ng/commands/newcli.py:489
291+#: .././checkbox_ng/commands/newcli.py:493
292 #: .././checkbox_ng/commands/submit.py:68
293+#, python-brace-format
294 msgid "Successfully sent, server response: {0}"
295 msgstr ""
296
297-#: .././checkbox_ng/commands/newcli.py:514
298+#: .././checkbox_ng/commands/newcli.py:518
299 msgid "Select jobs to re-run"
300 msgstr ""
301
302@@ -207,7 +217,7 @@
303 msgid "load the specified test plan"
304 msgstr ""
305
306-#: .././checkbox_ng/commands/sru.py:71 .././checkbox_ng/config.py:88
307+#: .././checkbox_ng/commands/sru.py:71 .././checkbox_ng/config.py:86
308 msgid "Send the data to non-production test server"
309 msgstr ""
310
311@@ -220,6 +230,7 @@
312 msgstr ""
313
314 #: .././checkbox_ng/commands/sru.py:113
315+#, python-brace-format
316 msgid "Results saved to {0}"
317 msgstr ""
318
319@@ -228,6 +239,7 @@
320 msgstr ""
321
322 #: .././checkbox_ng/commands/sru.py:119
323+#, python-brace-format
324 msgid "Server URL is: {0}"
325 msgstr ""
326
327@@ -265,7 +277,7 @@
328 msgstr ""
329
330 #: .././checkbox_ng/commands/submit.py:114
331-msgid "must be 15 or 18-character alphanumeric string"
332+msgid "must be 15-character (or more) alphanumeric string"
333 msgstr ""
334
335 #: .././checkbox_ng/commands/submit.py:124
336@@ -280,113 +292,49 @@
337 msgid "destination to submit to"
338 msgstr ""
339
340-#: .././checkbox_ng/config.py:43
341+#: .././checkbox_ng/config.py:41
342 msgid "Secure ID of the system"
343 msgstr ""
344
345-#: .././checkbox_ng/config.py:48
346+#: .././checkbox_ng/config.py:46
347 msgid "Whether to send the submission data to c3"
348 msgstr ""
349
350-#: .././checkbox_ng/config.py:52
351+#: .././checkbox_ng/config.py:50
352 msgid "Whether to also send the submission data to HEXR"
353 msgstr ""
354
355-#: .././checkbox_ng/config.py:58
356+#: .././checkbox_ng/config.py:56
357 msgid "Email address to log into the Launchpad HWDB"
358 msgstr ""
359
360-#: .././checkbox_ng/config.py:63
361+#: .././checkbox_ng/config.py:61
362 msgid "URL of the certification website"
363 msgstr ""
364
365-#: .././checkbox_ng/config.py:69
366+#: .././checkbox_ng/config.py:67
367 msgid "URL of the launchpad hardware database"
368 msgstr ""
369
370-#: .././checkbox_ng/config.py:74
371+#: .././checkbox_ng/config.py:72
372 msgid "Location of the fallback file"
373 msgstr ""
374
375-#: .././checkbox_ng/config.py:78
376+#: .././checkbox_ng/config.py:76
377 msgid "Optional whitelist with which to run SRU testing"
378 msgstr ""
379
380-#: .././checkbox_ng/config.py:82
381+#: .././checkbox_ng/config.py:80
382 msgid "Optional test plan with which to run SRU testing"
383 msgstr ""
384
385-#: .././checkbox_ng/launcher.py:47
386-msgid "Application Title"
387-msgstr ""
388-
389-#: .././checkbox_ng/launcher.py:51
390-msgid "Welcome Message"
391-msgstr ""
392-
393-#. TODO: valid regexp text validator
394-#: .././checkbox_ng/launcher.py:56
395-msgid "Pattern that whitelists need to match to be displayed"
396-msgstr ""
397-
398-#. TODO: valid regexp text validator
399-#: .././checkbox_ng/launcher.py:61
400-msgid "Pattern that whitelists need to match to be selected"
401-msgstr ""
402-
403-#: .././checkbox_ng/launcher.py:67
404-msgid "If enabled then suite selection screen is not displayed"
405-msgstr ""
406-
407-#: .././checkbox_ng/launcher.py:73
408-msgid "If enabled then test selection screen is not displayed"
409-msgstr ""
410-
411-#. TODO: probably a choice validator
412-#: .././checkbox_ng/launcher.py:78
413-msgid "Type of the input field?"
414-msgstr ""
415-
416-#: .././checkbox_ng/launcher.py:82
417-msgid "Label on the 'send' button"
418-msgstr ""
419-
420-#. TODO: default?
421-#: .././checkbox_ng/launcher.py:88
422-msgid "If enabled then test results will be also sent to HEXR"
423-msgstr ""
424-
425-#: .././checkbox_ng/launcher.py:93
426-msgid "Where to submit the test results to"
427-msgstr ""
428-
429-#: .././checkbox_ng/launcher.py:98
430-msgid ""
431-"HTTP endpoint to submit data to, using the transport specified with "
432-"submit_to."
433-msgstr ""
434-
435-#: .././checkbox_ng/launcher.py:104
436-msgid "Secure ID to identify the system this submission belongs to."
437-msgstr ""
438-
439-#: .././checkbox_ng/launcher.py:109
440-msgid "Name of custom configuration file"
441-msgstr ""
442-
443-#: .././checkbox_ng/launcher.py:113
444-msgid "Don't suppress the output of certain job plugin types."
445-msgstr ""
446-
447-#: .././checkbox_ng/launcher.py:116
448-msgid "Section with only exported unit ids as keys (no values)"
449-msgstr ""
450-
451 #: .././checkbox_ng/launchpad.py:66
452+#, python-brace-format
453 msgid "Cannot get {0} resource job"
454 msgstr ""
455
456 #: .././checkbox_ng/launchpad.py:70
457+#, python-brace-format
458 msgid "{0} has no attribute {1}"
459 msgstr ""
460
461@@ -411,18 +359,18 @@
462 msgid "< Continue >"
463 msgstr ""
464
465-#: .././checkbox_ng/ui.py:194 .././checkbox_ng/ui.py:321
466+#: .././checkbox_ng/ui.py:197 .././checkbox_ng/ui.py:325
467 msgid "Enter"
468 msgstr ""
469
470-#: .././checkbox_ng/ui.py:197 .././checkbox_ng/ui.py:324
471+#: .././checkbox_ng/ui.py:200 .././checkbox_ng/ui.py:328
472 msgid ": Expand/Collapse"
473 msgstr ""
474
475-#: .././checkbox_ng/ui.py:213
476+#: .././checkbox_ng/ui.py:216
477 msgid "Start "
478 msgstr ""
479
480-#: .././checkbox_ng/ui.py:345
481+#: .././checkbox_ng/ui.py:349
482 msgid "inish"
483 msgstr ""
484
485=== modified file 'plainbox/plainbox/impl/transport.py'
486--- plainbox/plainbox/impl/transport.py 2016-03-18 00:37:50 +0000
487+++ plainbox/plainbox/impl/transport.py 2016-08-03 18:15:33 +0000
488@@ -109,7 +109,7 @@
489 raise ValueError(_("No valid options in option string"))
490
491
492-SECURE_ID_PATTERN = r"^[a-zA-Z0-9]{15}$|^[a-zA-Z0-9]{18}$"
493+SECURE_ID_PATTERN = r"^[a-zA-Z0-9]{15,}$"
494
495
496 class InvalidSecureIDError(ValueError):
497@@ -142,7 +142,7 @@
498 Initialize the Certification Transport.
499
500 The options string may contain 'secure_id' which must be
501- a 15- or 18-character alphanumeric ID for the system.
502+ a 15-character (or more) alphanumeric ID for the system.
503
504 It may also contain a submit_to_hexr boolean, set to 1
505 to enable submission to hexr.
506@@ -264,7 +264,7 @@
507 def _validate_secure_id(self, secure_id):
508 if not re.match(SECURE_ID_PATTERN, secure_id):
509 raise InvalidSecureIDError(
510- _("secure_id must be 15 or 18-character alphanumeric string"))
511+ _("secure_id must be a 15 characters (or more) alphanumeric string"))
512
513
514 def oauth_available():
515
516=== modified file 'plainbox/po/POTFILES.in'
517--- plainbox/po/POTFILES.in 2015-09-21 07:12:05 +0000
518+++ plainbox/po/POTFILES.in 2016-08-03 18:15:33 +0000
519@@ -132,7 +132,6 @@
520 ./plainbox/impl/testing_utils.py
521 ./plainbox/impl/transport.py
522 ./plainbox/impl/unit/__init__.py
523-./plainbox/impl/unit/_legacy.py
524 ./plainbox/impl/unit/category.py
525 ./plainbox/impl/unit/exporter.py
526 ./plainbox/impl/unit/file.py
527
528=== modified file 'plainbox/po/plainbox.pot'
529--- plainbox/po/plainbox.pot 2016-01-11 08:07:21 +0000
530+++ plainbox/po/plainbox.pot 2016-08-03 18:15:33 +0000
531@@ -8,7 +8,7 @@
532 msgstr ""
533 "Project-Id-Version: PACKAGE VERSION\n"
534 "Report-Msgid-Bugs-To: \n"
535-"POT-Creation-Date: 2016-01-11 16:06+0800\n"
536+"POT-Creation-Date: 2016-08-03 16:58+0200\n"
537 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
538 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
539 "Language-Team: LANGUAGE <LL@li.org>\n"
540@@ -40,6 +40,7 @@
541 #. TRANSLATORS: '--help' and '--version' are not translatable,
542 #. but '[options]' and '<command>' are.
543 #: .././plainbox/impl/box.py:82
544+#, python-brace-format
545 msgid "{0} [--help] [--version] | [options] <command> ..."
546 msgstr ""
547
548@@ -100,7 +101,7 @@
549 msgid "Dispatching command..."
550 msgstr ""
551
552-#: .././plainbox/impl/clitools.py:460 .././plainbox/provider_manager.py:1403
553+#: .././plainbox/impl/clitools.py:460 .././plainbox/provider_manager.py:1425
554 #: .././plainbox/vendor/argparse/py32-argparse.py:1625
555 msgid "show program's version number and exit"
556 msgstr ""
557@@ -794,6 +795,7 @@
558 msgstr ""
559
560 #: .././plainbox/impl/commands/inv_check_config.py:43
561+#, python-brace-format
562 msgid " - {0} (not present)"
563 msgstr ""
564
565@@ -810,6 +812,7 @@
566 msgstr ""
567
568 #: .././plainbox/impl/commands/inv_check_config.py:61
569+#, python-brace-format
570 msgid " - variable {0}: {1}"
571 msgstr ""
572
573@@ -855,10 +858,12 @@
574 msgstr ""
575
576 #: .././plainbox/impl/commands/inv_run.py:171
577+#, python-brace-format
578 msgid "ID: {0}"
579 msgstr ""
580
581 #: .././plainbox/impl/commands/inv_run.py:172
582+#, python-brace-format
583 msgid "Category: {0}"
584 msgstr ""
585
586@@ -916,6 +921,7 @@
587 msgstr ""
588
589 #: .././plainbox/impl/commands/inv_run.py:439
590+#, python-brace-format
591 msgid "There is {0} incomplete session that might be resumed"
592 msgid_plural "There are {0} incomplete sessions that might be resumed"
593 msgstr[0] ""
594@@ -1026,14 +1032,17 @@
595 msgstr ""
596
597 #: .././plainbox/impl/commands/inv_run.py:625
598+#, python-brace-format
599 msgid "At least two jobs contend for the id {0}"
600 msgstr ""
601
602 #: .././plainbox/impl/commands/inv_run.py:628
603+#, python-brace-format
604 msgid "First job defined in: {0}"
605 msgstr ""
606
607 #: .././plainbox/impl/commands/inv_run.py:630
608+#, python-brace-format
609 msgid "Second job defined in: {0}"
610 msgstr ""
611
612@@ -1083,6 +1092,7 @@
613 #: .././plainbox/impl/commands/inv_run.py:897
614 #: .././plainbox/impl/commands/inv_run.py:902
615 #: .././plainbox/impl/commands/inv_run.py:907
616+#, python-brace-format
617 msgid "set outcome to {0}"
618 msgstr ""
619
620@@ -1106,6 +1116,7 @@
621 msgstr ""
622
623 #: .././plainbox/impl/commands/inv_run.py:919
624+#, python-brace-format
625 msgid "set suggested outcome [{0}]"
626 msgstr ""
627
628@@ -1144,6 +1155,7 @@
629 msgstr ""
630
631 #: .././plainbox/impl/commands/inv_run.py:968
632+#, python-brace-format
633 msgid "This session is about {0:.2f}{percent} complete"
634 msgstr ""
635
636@@ -1164,10 +1176,12 @@
637 msgstr ""
638
639 #: .././plainbox/impl/commands/inv_run.py:984
640+#, python-brace-format
641 msgid "Size of the desired job list: {0}"
642 msgstr ""
643
644 #: .././plainbox/impl/commands/inv_run.py:986
645+#, python-brace-format
646 msgid "Size of the effective execution plan: {0}"
647 msgstr ""
648
649@@ -1208,6 +1222,7 @@
650 msgstr ""
651
652 #: .././plainbox/impl/commands/inv_session.py:82
653+#, python-brace-format
654 msgid "session {0} (not saved yet)"
655 msgstr ""
656
657@@ -1229,6 +1244,7 @@
658 msgstr ""
659
660 #: .././plainbox/impl/commands/inv_session.py:108
661+#, python-brace-format
662 msgid "application-specific blob: {0}"
663 msgstr ""
664
665@@ -1245,10 +1261,12 @@
666 msgstr ""
667
668 #: .././plainbox/impl/commands/inv_session.py:115
669+#, python-brace-format
670 msgid "data size: {0}"
671 msgstr ""
672
673 #: .././plainbox/impl/commands/inv_session.py:117
674+#, python-brace-format
675 msgid "Resuming session {0} ..."
676 msgstr ""
677
678@@ -1262,6 +1280,7 @@
679
680 #: .././plainbox/impl/commands/inv_session.py:133
681 #: .././plainbox/impl/commands/inv_session.py:151
682+#, python-brace-format
683 msgid "No such session: {0}"
684 msgstr ""
685
686@@ -1270,6 +1289,7 @@
687 msgstr ""
688
689 #: .././plainbox/impl/commands/inv_session.py:140
690+#, python-brace-format
691 msgid "Created archive: {0}"
692 msgstr ""
693
694@@ -1319,14 +1339,9 @@
695 msgid "Instantiating unit: %s"
696 msgstr ""
697
698-#: .././plainbox/impl/ctrl.py:318
699-#, python-format
700-msgid "Ignoring invalid instantiated unit %s: %s"
701-msgstr ""
702-
703-#: .././plainbox/impl/ctrl.py:344
704-#, python-format
705-msgid "Ignoring invalid generated job %s: %s"
706+#: .././plainbox/impl/ctrl.py:318 .././plainbox/impl/ctrl.py:344
707+#, python-format
708+msgid "Ignoring invalid generated job %s"
709 msgstr ""
710
711 #. TRANSLATORS: keep the word "local" untranslated. It is a
712@@ -1376,23 +1391,28 @@
713 msgid "Symlink nest for executables: %s"
714 msgstr ""
715
716-#: .././plainbox/impl/ctrl.py:611
717+#: .././plainbox/impl/ctrl.py:612
718 #, python-format
719 msgid "Job temporary current working directory: %s"
720 msgstr ""
721
722-#: .././plainbox/impl/ctrl.py:968
723+#: .././plainbox/impl/ctrl.py:621
724+#, python-format
725+msgid "There was a problem with temporary cwd %s, %s"
726+msgstr ""
727+
728+#: .././plainbox/impl/ctrl.py:973
729 #, python-format
730 msgid "Generating job repr for job: %r"
731 msgstr ""
732
733 #. run the command
734-#: .././plainbox/impl/ctrl.py:1042
735+#: .././plainbox/impl/ctrl.py:1048
736 #, python-format
737 msgid "job[%s] executing %r withenv %r in cwd %r"
738 msgstr ""
739
740-#: .././plainbox/impl/ctrl.py:1178
741+#: .././plainbox/impl/ctrl.py:1205
742 #, python-format
743 msgid "Cannot check if plainbox-trusted-launcher-1 is available: %s"
744 msgstr ""
745@@ -1471,11 +1491,11 @@
746 msgid "Unsupported platform: %s"
747 msgstr ""
748
749-#: .././plainbox/impl/exporter/__init__.py:250
750+#: .././plainbox/impl/exporter/__init__.py:248
751 msgid "Uncategorised"
752 msgstr ""
753
754-#: .././plainbox/impl/exporter/__init__.py:384
755+#: .././plainbox/impl/exporter/__init__.py:382
756 #, python-format
757 msgid ""
758 "Incorrect stream encoding. Got %s, expected %s. some characters won't be "
759@@ -1483,6 +1503,7 @@
760 msgstr ""
761
762 #: .././plainbox/impl/exporter/text.py:59
763+#, python-brace-format
764 msgid " history: {0}\n"
765 msgstr ""
766
767@@ -1753,93 +1774,93 @@
768 msgid "unable to parse imports statement {0!r}: expected 'as' keyword"
769 msgstr ""
770
771-#: .././plainbox/impl/result.py:126
772+#: .././plainbox/impl/result.py:131
773 msgctxt "textual outcome"
774 msgid "job didn't run"
775 msgstr ""
776
777-#: .././plainbox/impl/result.py:127
778+#: .././plainbox/impl/result.py:132
779 msgctxt "chart label"
780 msgid "not started"
781 msgstr ""
782
783-#: .././plainbox/impl/result.py:137
784+#: .././plainbox/impl/result.py:142
785 msgctxt "textual outcome"
786 msgid "job passed"
787 msgstr ""
788
789-#: .././plainbox/impl/result.py:138
790+#: .././plainbox/impl/result.py:143
791 msgctxt "chart label"
792 msgid "passed"
793 msgstr ""
794
795-#: .././plainbox/impl/result.py:148
796+#: .././plainbox/impl/result.py:153
797 msgctxt "textual outcome"
798 msgid "job failed"
799 msgstr ""
800
801-#: .././plainbox/impl/result.py:149
802+#: .././plainbox/impl/result.py:154
803 msgctxt "chart label"
804 msgid "failed"
805 msgstr ""
806
807-#: .././plainbox/impl/result.py:159
808+#: .././plainbox/impl/result.py:164
809 msgctxt "textual outcome"
810 msgid "job skipped"
811 msgstr ""
812
813-#: .././plainbox/impl/result.py:160
814+#: .././plainbox/impl/result.py:165
815 msgctxt "chart label"
816 msgid "skipped"
817 msgstr ""
818
819-#: .././plainbox/impl/result.py:170
820+#: .././plainbox/impl/result.py:175
821 msgctxt "textual outcome"
822 msgid "job cannot be started"
823 msgstr ""
824
825-#: .././plainbox/impl/result.py:171
826+#: .././plainbox/impl/result.py:176
827 msgctxt "chart label"
828 msgid "not supported"
829 msgstr ""
830
831-#: .././plainbox/impl/result.py:181
832+#: .././plainbox/impl/result.py:186
833 msgctxt "textual outcome"
834 msgid "job is not implemented"
835 msgstr ""
836
837-#: .././plainbox/impl/result.py:182
838+#: .././plainbox/impl/result.py:187
839 msgctxt "chart label"
840 msgid "not implemented"
841 msgstr ""
842
843-#: .././plainbox/impl/result.py:192
844+#: .././plainbox/impl/result.py:197
845 msgctxt "textual outcome"
846 msgid "job needs verification"
847 msgstr ""
848
849-#: .././plainbox/impl/result.py:193
850+#: .././plainbox/impl/result.py:198
851 msgctxt "chart label"
852 msgid "undecided"
853 msgstr ""
854
855-#: .././plainbox/impl/result.py:203
856+#: .././plainbox/impl/result.py:208
857 msgctxt "textual outcome"
858 msgid "job crashed"
859 msgstr ""
860
861-#: .././plainbox/impl/result.py:204
862+#: .././plainbox/impl/result.py:209
863 msgctxt "chart label"
864 msgid "crashed"
865 msgstr ""
866
867 #. TRANSLATORS: please keep DiskJobResult.io_log untranslated
868-#: .././plainbox/impl/result.py:535
869+#: .././plainbox/impl/result.py:548
870 #, python-format
871 msgid "Expensive DiskJobResult.io_log property access from %s:%d"
872 msgstr ""
873
874-#: .././plainbox/impl/result.py:557
875+#: .././plainbox/impl/result.py:570
876 #, python-format
877 msgid "Encoded %r into string %r"
878 msgstr ""
879@@ -1869,7 +1890,7 @@
880 msgid "bad job plugin value"
881 msgstr ""
882
883-#: .././plainbox/impl/runner.py:727 .././plainbox/impl/runner.py:800
884+#: .././plainbox/impl/runner.py:727 .././plainbox/impl/runner.py:804
885 msgid "No suitable execution controller is available)"
886 msgstr ""
887
888@@ -1878,100 +1899,110 @@
889 msgid "job[%s] starting qml shell: %s"
890 msgstr ""
891
892-#: .././plainbox/impl/runner.py:755
893+#: .././plainbox/impl/runner.py:760
894 #, python-format
895 msgid "job[%s] shell return code: %r"
896 msgstr ""
897
898-#: .././plainbox/impl/runner.py:785
899+#: .././plainbox/impl/runner.py:789
900 msgid "Job skipped in dry-run mode"
901 msgstr ""
902
903-#: .././plainbox/impl/runner.py:861
904+#: .././plainbox/impl/runner.py:865
905 #, python-format
906 msgid "job[%s] extcmd delegate: %r"
907 msgstr ""
908
909-#: .././plainbox/impl/runner.py:876
910+#: .././plainbox/impl/runner.py:880
911+#, python-brace-format
912 msgid "job {0} has no command to run"
913 msgstr ""
914
915-#: .././plainbox/impl/runner.py:903
916+#: .././plainbox/impl/runner.py:907
917 #, python-format
918 msgid "job[%s] starting command: %s"
919 msgstr ""
920
921-#: .././plainbox/impl/runner.py:908
922+#: .././plainbox/impl/runner.py:915
923 #, python-format
924 msgid "job[%s] command return code: %r"
925 msgstr ""
926
927-#: .././plainbox/impl/runner.py:944 .././plainbox/impl/session/state.py:483
928+#: .././plainbox/impl/runner.py:951 .././plainbox/impl/session/state.py:486
929 msgid "No exec controller supports job {}"
930 msgstr ""
931
932-#: .././plainbox/impl/runner.py:946 .././plainbox/impl/session/state.py:485
933+#: .././plainbox/impl/runner.py:953 .././plainbox/impl/session/state.py:488
934 #, python-format
935 msgid "Selected execution controller %s (score %d) for job %r"
936 msgstr ""
937
938-#: .././plainbox/impl/runner.py:974
939+#: .././plainbox/impl/runner.py:981
940+#, python-brace-format
941 msgid "Job {0} created leftover filesystem artefacts in its working directory"
942 msgstr ""
943
944-#: .././plainbox/impl/runner.py:977
945+#: .././plainbox/impl/runner.py:984
946 #, python-format
947 msgid "Leftover file/directory: %r"
948 msgstr ""
949
950-#: .././plainbox/impl/runner.py:980
951+#: .././plainbox/impl/runner.py:987
952 msgid ""
953 "Please store desired files in $PLAINBOX_SESSION_SHARE and use regular "
954 "temporary files for everything else"
955 msgstr ""
956
957-#: .././plainbox/impl/secure/config.py:87
958+#: .././plainbox/impl/secure/config.py:89
959 msgid "unset"
960 msgstr ""
961
962-#: .././plainbox/impl/secure/config.py:124
963+#: .././plainbox/impl/secure/config.py:126
964 msgid "unsupported kind"
965 msgstr ""
966
967-#: .././plainbox/impl/secure/config.py:572
968+#: .././plainbox/impl/secure/config.py:637
969 #, python-format
970 msgid "Loading configuration from %s"
971 msgstr ""
972
973-#: .././plainbox/impl/secure/config.py:699
974+#: .././plainbox/impl/secure/config.py:775
975 msgid "expected a boolean"
976 msgstr ""
977
978-#: .././plainbox/impl/secure/config.py:700
979+#: .././plainbox/impl/secure/config.py:776
980 msgid "expected an integer"
981 msgstr ""
982
983-#: .././plainbox/impl/secure/config.py:701
984+#: .././plainbox/impl/secure/config.py:777
985 msgid "expected a floating point number"
986 msgstr ""
987
988-#: .././plainbox/impl/secure/config.py:702
989+#: .././plainbox/impl/secure/config.py:778
990 msgid "expected a string"
991 msgstr ""
992
993-#: .././plainbox/impl/secure/config.py:717
994+#: .././plainbox/impl/secure/config.py:779
995+msgid "expected a list of strings"
996+msgstr ""
997+
998+#: .././plainbox/impl/secure/config.py:794
999 msgid "does not match pattern: {!r}"
1000 msgstr ""
1001
1002-#: .././plainbox/impl/secure/config.py:736
1003-msgid "must be one of {}"
1004-msgstr ""
1005-
1006-#: .././plainbox/impl/secure/config.py:760
1007+#: .././plainbox/impl/secure/config.py:813
1008+msgid "{} must be one of {}. Got '{}'"
1009+msgstr ""
1010+
1011+#: .././plainbox/impl/secure/config.py:831
1012+msgid "{} must be a subset of {}. Got {}"
1013+msgstr ""
1014+
1015+#: .././plainbox/impl/secure/config.py:856
1016 msgid "must be set to something"
1017 msgstr ""
1018
1019-#: .././plainbox/impl/secure/config.py:781
1020+#: .././plainbox/impl/secure/config.py:877
1021 msgid "cannot be empty"
1022 msgstr ""
1023
1024@@ -2041,159 +2072,159 @@
1025 msgid "command line argument {!a}"
1026 msgstr ""
1027
1028-#: .././plainbox/impl/secure/plugins.py:407
1029+#: .././plainbox/impl/secure/plugins.py:417
1030 #, python-format
1031 msgid "Unable to prepare plugin %s: %s"
1032 msgstr ""
1033
1034-#: .././plainbox/impl/secure/plugins.py:423
1035+#: .././plainbox/impl/secure/plugins.py:433
1036 msgid "discovery_time is meaningful after calling load()"
1037 msgstr ""
1038
1039-#: .././plainbox/impl/secure/plugins.py:493
1040+#: .././plainbox/impl/secure/plugins.py:502
1041 #, python-format
1042 msgid "Unable to import %s"
1043 msgstr ""
1044
1045-#: .././plainbox/impl/secure/plugins.py:569
1046+#: .././plainbox/impl/secure/plugins.py:579
1047 #, python-format
1048 msgid "Unable to load %r: %s"
1049 msgstr ""
1050
1051-#: .././plainbox/impl/secure/plugins.py:708
1052+#: .././plainbox/impl/secure/plugins.py:718
1053 #, python-format
1054 msgid "Loading everything in %r"
1055 msgstr ""
1056
1057-#: .././plainbox/impl/secure/plugins.py:725
1058+#: .././plainbox/impl/secure/plugins.py:735
1059 #, python-format
1060 msgid "Loading %r"
1061 msgstr ""
1062
1063-#: .././plainbox/impl/secure/plugins.py:728
1064+#: .././plainbox/impl/secure/plugins.py:738
1065 #, python-format
1066 msgid "Unable to load: %r"
1067 msgstr ""
1068
1069-#: .././plainbox/impl/secure/plugins.py:731
1070+#: .././plainbox/impl/secure/plugins.py:741
1071 #, python-format
1072 msgid "Wrapping %r"
1073 msgstr ""
1074
1075-#: .././plainbox/impl/secure/plugins.py:745
1076+#: .././plainbox/impl/secure/plugins.py:755
1077 #, python-format
1078 msgid "Importing %s"
1079 msgstr ""
1080
1081-#: .././plainbox/impl/secure/plugins.py:750
1082+#: .././plainbox/impl/secure/plugins.py:760
1083 #, python-format
1084 msgid "Calling %r with %r"
1085 msgstr ""
1086
1087-#: .././plainbox/impl/secure/providers/v1.py:89
1088+#: .././plainbox/impl/secure/providers/v1.py:93
1089 msgid "Cannot load {!r}: {}"
1090 msgstr ""
1091
1092-#: .././plainbox/impl/secure/providers/v1.py:260
1093+#: .././plainbox/impl/secure/providers/v1.py:264
1094 #, python-format
1095 msgid "Loading units from %r..."
1096 msgstr ""
1097
1098-#: .././plainbox/impl/secure/providers/v1.py:266
1099+#: .././plainbox/impl/secure/providers/v1.py:270
1100 msgid "Cannot load job definitions from {!r}: {}"
1101 msgstr ""
1102
1103-#: .././plainbox/impl/secure/providers/v1.py:275
1104+#: .././plainbox/impl/secure/providers/v1.py:279
1105 msgid "Unknown unit type: {!r}"
1106 msgstr ""
1107
1108-#: .././plainbox/impl/secure/providers/v1.py:280
1109+#: .././plainbox/impl/secure/providers/v1.py:284
1110 msgid "Cannot define unit from record {!r}: {}"
1111 msgstr ""
1112
1113-#: .././plainbox/impl/secure/providers/v1.py:286
1114+#: .././plainbox/impl/secure/providers/v1.py:290
1115 msgid "Problem in unit definition, {}"
1116 msgstr ""
1117
1118-#: .././plainbox/impl/secure/providers/v1.py:292
1119+#: .././plainbox/impl/secure/providers/v1.py:296
1120 msgid "Problem in unit definition, field {}: {}"
1121 msgstr ""
1122
1123-#: .././plainbox/impl/secure/providers/v1.py:295
1124+#: .././plainbox/impl/secure/providers/v1.py:299
1125 #, python-format
1126 msgid "Loaded %r"
1127 msgstr ""
1128
1129-#: .././plainbox/impl/secure/providers/v1.py:1241
1130-#: .././plainbox/impl/secure/providers/v1.py:1270
1131+#: .././plainbox/impl/secure/providers/v1.py:1245
1132+#: .././plainbox/impl/secure/providers/v1.py:1274
1133 msgid "must look like RFC3720 IQN"
1134 msgstr ""
1135
1136-#: .././plainbox/impl/secure/providers/v1.py:1287
1137-msgid "must be a sequence of digits separated by dots"
1138+#: .././plainbox/impl/secure/providers/v1.py:1321
1139+msgid "must be a PEP440 compatible version"
1140 msgstr ""
1141
1142-#: .././plainbox/impl/secure/providers/v1.py:1297
1143+#: .././plainbox/impl/secure/providers/v1.py:1331
1144 msgid "no such directory"
1145 msgstr ""
1146
1147-#: .././plainbox/impl/secure/providers/v1.py:1307
1148+#: .././plainbox/impl/secure/providers/v1.py:1341
1149 msgid "cannot be relative"
1150 msgstr ""
1151
1152-#: .././plainbox/impl/secure/providers/v1.py:1328
1153+#: .././plainbox/impl/secure/providers/v1.py:1362
1154 msgid "Flag indicating if the provider is relocatable"
1155 msgstr ""
1156
1157-#: .././plainbox/impl/secure/providers/v1.py:1334
1158+#: .././plainbox/impl/secure/providers/v1.py:1368
1159 msgid "Base directory with provider data"
1160 msgstr ""
1161
1162-#: .././plainbox/impl/secure/providers/v1.py:1344
1163+#: .././plainbox/impl/secure/providers/v1.py:1378
1164 msgid "Name of the provider"
1165 msgstr ""
1166
1167-#: .././plainbox/impl/secure/providers/v1.py:1353
1168+#: .././plainbox/impl/secure/providers/v1.py:1387
1169 msgid "Namespace of the provider"
1170 msgstr ""
1171
1172-#: .././plainbox/impl/secure/providers/v1.py:1368
1173+#: .././plainbox/impl/secure/providers/v1.py:1402
1174 msgid "Version of the provider"
1175 msgstr ""
1176
1177-#: .././plainbox/impl/secure/providers/v1.py:1377
1178+#: .././plainbox/impl/secure/providers/v1.py:1411
1179 msgid "Description of the provider"
1180 msgstr ""
1181
1182-#: .././plainbox/impl/secure/providers/v1.py:1381
1183+#: .././plainbox/impl/secure/providers/v1.py:1415
1184 msgid "Name of the gettext domain for translations"
1185 msgstr ""
1186
1187-#: .././plainbox/impl/secure/providers/v1.py:1400
1188+#: .././plainbox/impl/secure/providers/v1.py:1434
1189 msgid "Pathname of the directory with unit definitions"
1190 msgstr ""
1191
1192-#: .././plainbox/impl/secure/providers/v1.py:1436
1193+#: .././plainbox/impl/secure/providers/v1.py:1470
1194 msgid "Pathname of the directory with job definitions"
1195 msgstr ""
1196
1197-#: .././plainbox/impl/secure/providers/v1.py:1472
1198+#: .././plainbox/impl/secure/providers/v1.py:1506
1199 msgid "Pathname of the directory with whitelists definitions"
1200 msgstr ""
1201
1202-#: .././plainbox/impl/secure/providers/v1.py:1509
1203+#: .././plainbox/impl/secure/providers/v1.py:1543
1204 msgid "Pathname of the directory with provider data"
1205 msgstr ""
1206
1207-#: .././plainbox/impl/secure/providers/v1.py:1545
1208+#: .././plainbox/impl/secure/providers/v1.py:1579
1209 msgid "Pathname of the directory with provider executables"
1210 msgstr ""
1211
1212-#: .././plainbox/impl/secure/providers/v1.py:1581
1213+#: .././plainbox/impl/secure/providers/v1.py:1615
1214 msgid "Pathname of the directory with locale data"
1215 msgstr ""
1216
1217-#: .././plainbox/impl/secure/providers/v1.py:1681
1218+#: .././plainbox/impl/secure/providers/v1.py:1715
1219 msgid "Problem in provider definition, field {!a}: {}"
1220 msgstr ""
1221
1222@@ -2282,42 +2313,42 @@
1223 msgid "{!r} is not overridable"
1224 msgstr ""
1225
1226-#: .././plainbox/impl/session/manager.py:99
1227-#: .././plainbox/impl/session/manager.py:457
1228+#: .././plainbox/impl/session/manager.py:100
1229+#: .././plainbox/impl/session/manager.py:458
1230 msgid ""
1231 "session manager currently doesn't support sessions involving multiple "
1232 "devices (a.k.a multi-node testing)"
1233 msgstr ""
1234
1235-#: .././plainbox/impl/session/manager.py:365
1236+#: .././plainbox/impl/session/manager.py:366
1237 #, python-format
1238 msgid "Saving %d byte of checkpoint data to %r"
1239 msgid_plural "Saving %d bytes of checkpoint data to %r"
1240 msgstr[0] ""
1241 msgstr[1] ""
1242
1243-#: .././plainbox/impl/session/manager.py:400
1244+#: .././plainbox/impl/session/manager.py:401
1245 msgid ""
1246 "attmpting to add a context for device {} which is already represented in "
1247 "this session manager"
1248 msgstr ""
1249
1250-#: .././plainbox/impl/session/manager.py:430
1251+#: .././plainbox/impl/session/manager.py:431
1252 msgid ""
1253 "attempting to remove a device context not present in this session manager"
1254 msgstr ""
1255
1256-#: .././plainbox/impl/session/manager.py:441
1257+#: .././plainbox/impl/session/manager.py:442
1258 #, python-format
1259 msgid "Device context %s added to session manager %s"
1260 msgstr ""
1261
1262-#: .././plainbox/impl/session/manager.py:451
1263+#: .././plainbox/impl/session/manager.py:452
1264 #, python-format
1265 msgid "Device context %s removed from session manager %s"
1266 msgstr ""
1267
1268-#: .././plainbox/impl/session/manager.py:462
1269+#: .././plainbox/impl/session/manager.py:463
1270 msgid "Propagating test plans to all devices"
1271 msgstr ""
1272
1273@@ -2513,39 +2544,41 @@
1274 msgid "app_id must be either None or str"
1275 msgstr ""
1276
1277-#: .././plainbox/impl/session/state.py:393
1278-msgid "attempting to add the same provider twice"
1279-msgstr ""
1280-
1281-#: .././plainbox/impl/session/state.py:415
1282-msgid "attempting to add the same unit twice"
1283-msgstr ""
1284-
1285-#: .././plainbox/impl/session/state.py:431
1286+#: .././plainbox/impl/session/state.py:394
1287+#, python-format
1288+msgid "attempting to add the same provider twice: %s"
1289+msgstr ""
1290+
1291+#: .././plainbox/impl/session/state.py:418
1292+#, python-format
1293+msgid "attempting to add the same unit twice: %s"
1294+msgstr ""
1295+
1296+#: .././plainbox/impl/session/state.py:434
1297 msgid "attempting to remove unit not in this context"
1298 msgstr ""
1299
1300-#: .././plainbox/impl/session/state.py:492
1301+#: .././plainbox/impl/session/state.py:495
1302 #, python-format
1303 msgid "Provider %s added to context %s"
1304 msgstr ""
1305
1306-#: .././plainbox/impl/session/state.py:500
1307+#: .././plainbox/impl/session/state.py:503
1308 #, python-format
1309 msgid "Unit %s added to context %s"
1310 msgstr ""
1311
1312-#: .././plainbox/impl/session/state.py:514
1313+#: .././plainbox/impl/session/state.py:517
1314 #, python-format
1315 msgid "Unit %s removed from context %s"
1316 msgstr ""
1317
1318-#: .././plainbox/impl/session/state.py:719
1319+#: .././plainbox/impl/session/state.py:722
1320 #, python-format
1321 msgid "Job %s result changed to %r"
1322 msgstr ""
1323
1324-#: .././plainbox/impl/session/state.py:835
1325+#: .././plainbox/impl/session/state.py:838
1326 msgid "cannot remove jobs that are on the run list: {}"
1327 msgstr ""
1328
1329@@ -2807,62 +2840,61 @@
1330 msgid "Cannot synchronize directory %r: %s"
1331 msgstr ""
1332
1333-#: .././plainbox/impl/transport.py:98
1334+#: .././plainbox/impl/transport.py:109
1335 msgid "No valid options in option string"
1336 msgstr ""
1337
1338-#: .././plainbox/impl/transport.py:204
1339+#: .././plainbox/impl/transport.py:215
1340 #, python-format
1341-msgid "Sending to %s, hardware id is %s"
1342+msgid "Sending to %s, Secure ID is %s"
1343 msgstr ""
1344
1345-#: .././plainbox/impl/transport.py:212
1346+#: .././plainbox/impl/transport.py:223
1347 #, python-format
1348 msgid "submit_to_hexr set to %s by config"
1349 msgstr ""
1350
1351-#: .././plainbox/impl/transport.py:216
1352+#: .././plainbox/impl/transport.py:227
1353 #, python-format
1354 msgid "submit_to_hexr set to %s by UI"
1355 msgstr ""
1356
1357-#: .././plainbox/impl/transport.py:232
1358+#: .././plainbox/impl/transport.py:243
1359+#, python-brace-format
1360 msgid "Request to {0} timed out: {1}"
1361 msgstr ""
1362
1363-#: .././plainbox/impl/transport.py:235
1364+#: .././plainbox/impl/transport.py:246
1365+#, python-brace-format
1366 msgid "Invalid destination URL: {0}"
1367 msgstr ""
1368
1369-#: .././plainbox/impl/transport.py:238
1370+#: .././plainbox/impl/transport.py:249
1371+#, python-brace-format
1372 msgid "Unable to connect to {0}: {1}"
1373 msgstr ""
1374
1375-#: .././plainbox/impl/transport.py:256
1376-msgid "secure_id must be 15 or 18-character alphanumeric string"
1377+#: .././plainbox/impl/transport.py:267
1378+msgid "secure_id must be a 15 characters (or more) alphanumeric string"
1379 msgstr ""
1380
1381-#: .././plainbox/impl/transport.py:271
1382+#: .././plainbox/impl/transport.py:404
1383 msgid "Unable to import {}: {}"
1384 msgstr ""
1385
1386-#: .././plainbox/impl/unit/_legacy.py:298
1387-msgid "invalid regular expression: {0}"
1388-msgstr ""
1389-
1390-#: .././plainbox/impl/unit/category.py:102
1391+#: .././plainbox/impl/unit/category.py:101
1392 msgid "category"
1393 msgstr ""
1394
1395-#: .././plainbox/impl/unit/category.py:119
1396-#: .././plainbox/impl/unit/exporter.py:123 .././plainbox/impl/unit/job.py:714
1397-#: .././plainbox/impl/unit/testplan.py:563
1398+#: .././plainbox/impl/unit/category.py:118
1399+#: .././plainbox/impl/unit/exporter.py:123 .././plainbox/impl/unit/job.py:717
1400+#: .././plainbox/impl/unit/testplan.py:619
1401 msgid "please use only one line"
1402 msgstr ""
1403
1404-#: .././plainbox/impl/unit/category.py:125
1405-#: .././plainbox/impl/unit/exporter.py:129 .././plainbox/impl/unit/job.py:720
1406-#: .././plainbox/impl/unit/testplan.py:569
1407+#: .././plainbox/impl/unit/category.py:124
1408+#: .././plainbox/impl/unit/exporter.py:129 .././plainbox/impl/unit/job.py:723
1409+#: .././plainbox/impl/unit/testplan.py:625
1410 msgid "please stay under 80 characters"
1411 msgstr ""
1412
1413@@ -2879,135 +2911,135 @@
1414 "please use .pxu as an extension for all files with plainbox units, see: {}"
1415 msgstr ""
1416
1417-#: .././plainbox/impl/unit/file.py:152 .././plainbox/impl/unit/job.py:730
1418-#: .././plainbox/impl/unit/job.py:1004
1419+#: .././plainbox/impl/unit/file.py:152 .././plainbox/impl/unit/job.py:733
1420+#: .././plainbox/impl/unit/job.py:1007
1421 msgid "valid values are: {}"
1422 msgstr ""
1423
1424-#: .././plainbox/impl/unit/job.py:450
1425+#: .././plainbox/impl/unit/job.py:453
1426 msgid "PURPOSE"
1427 msgstr ""
1428
1429-#: .././plainbox/impl/unit/job.py:451
1430+#: .././plainbox/impl/unit/job.py:454
1431 msgid "STEPS"
1432 msgstr ""
1433
1434-#: .././plainbox/impl/unit/job.py:452
1435+#: .././plainbox/impl/unit/job.py:455
1436 msgid "VERIFICATION"
1437 msgstr ""
1438
1439-#: .././plainbox/impl/unit/job.py:583 .././plainbox/impl/unit/job.py:613
1440+#: .././plainbox/impl/unit/job.py:586 .././plainbox/impl/unit/job.py:616
1441 #, python-format
1442 msgid "unable to parse depends: %s"
1443 msgstr ""
1444
1445 #. TRANSLATORS: don't translate record.origin or JobOutputTextSource
1446-#: .././plainbox/impl/unit/job.py:663
1447+#: .././plainbox/impl/unit/job.py:666
1448 msgid "record.origin must be a JobOutputTextSource"
1449 msgstr ""
1450
1451 #. TRANSLATORS: don't translate record.origin.source.job
1452-#: .././plainbox/impl/unit/job.py:666
1453+#: .././plainbox/impl/unit/job.py:669
1454 msgid "record.origin.source.job must be this job"
1455 msgstr ""
1456
1457-#: .././plainbox/impl/unit/job.py:671
1458+#: .././plainbox/impl/unit/job.py:674
1459 msgid "job"
1460 msgstr ""
1461
1462-#: .././plainbox/impl/unit/job.py:703
1463+#: .././plainbox/impl/unit/job.py:706
1464 msgid "use 'id' and 'summary' instead of 'name'"
1465 msgstr ""
1466
1467-#: .././plainbox/impl/unit/job.py:736
1468+#: .././plainbox/impl/unit/job.py:739
1469 msgid ""
1470 "please migrate to job templates, see plainbox-template-unit(7) for details"
1471 msgstr ""
1472
1473-#: .././plainbox/impl/unit/job.py:741
1474+#: .././plainbox/impl/unit/job.py:744
1475 msgid "please migrate to user-interact-verify"
1476 msgstr ""
1477
1478-#: .././plainbox/impl/unit/job.py:747
1479+#: .././plainbox/impl/unit/job.py:750
1480 msgid "command is mandatory for non-manual jobs"
1481 msgstr ""
1482
1483-#: .././plainbox/impl/unit/job.py:751
1484+#: .././plainbox/impl/unit/job.py:754
1485 msgid "command on a manual or qml job makes no sense"
1486 msgstr ""
1487
1488-#: .././plainbox/impl/unit/job.py:757
1489+#: .././plainbox/impl/unit/job.py:760
1490 msgid "please use PLAINBOX_PROVIDER_DATA instead of CHECKBOX_SHARE"
1491 msgstr ""
1492
1493-#: .././plainbox/impl/unit/job.py:764
1494+#: .././plainbox/impl/unit/job.py:767
1495 msgid "please use PLAINBOX_SESSION_SHARE instead of CHECKBOX_DATA"
1496 msgstr ""
1497
1498-#: .././plainbox/impl/unit/job.py:775
1499+#: .././plainbox/impl/unit/job.py:778
1500 msgid ""
1501 "manual jobs must have a description field, or a set of purpose, steps, and "
1502 "verification fields"
1503 msgstr ""
1504
1505-#: .././plainbox/impl/unit/job.py:786
1506+#: .././plainbox/impl/unit/job.py:789
1507 msgid ""
1508 "all jobs should have a description field, or a set of purpose, steps and "
1509 "verification fields"
1510 msgstr ""
1511
1512-#: .././plainbox/impl/unit/job.py:831
1513+#: .././plainbox/impl/unit/job.py:834
1514 msgid "user can only be 'root'"
1515 msgstr ""
1516
1517-#: .././plainbox/impl/unit/job.py:835
1518+#: .././plainbox/impl/unit/job.py:838
1519 msgid "user without a command makes no sense"
1520 msgstr ""
1521
1522-#: .././plainbox/impl/unit/job.py:843
1523+#: .././plainbox/impl/unit/job.py:846
1524 msgid "environ without a command makes no sense"
1525 msgstr ""
1526
1527-#: .././plainbox/impl/unit/job.py:869 .././plainbox/impl/unit/job.py:883
1528-#: .././plainbox/impl/unit/job.py:895 .././plainbox/impl/unit/job.py:928
1529-#: .././plainbox/impl/unit/template.py:438
1530-#: .././plainbox/impl/unit/testplan.py:595
1531+#: .././plainbox/impl/unit/job.py:872 .././plainbox/impl/unit/job.py:886
1532+#: .././plainbox/impl/unit/job.py:898 .././plainbox/impl/unit/job.py:931
1533+#: .././plainbox/impl/unit/template.py:447
1534+#: .././plainbox/impl/unit/testplan.py:651
1535 msgid "the referenced unit is not a job"
1536 msgstr ""
1537
1538-#: .././plainbox/impl/unit/job.py:902 .././plainbox/impl/unit/template.py:445
1539+#: .././plainbox/impl/unit/job.py:905 .././plainbox/impl/unit/template.py:454
1540 msgid "the referenced job is not a resource job"
1541 msgstr ""
1542
1543-#: .././plainbox/impl/unit/job.py:913
1544+#: .././plainbox/impl/unit/job.py:916
1545 msgid "only /bin/sh and /bin/bash are allowed"
1546 msgstr ""
1547
1548-#: .././plainbox/impl/unit/job.py:943
1549+#: .././plainbox/impl/unit/job.py:946
1550 msgid "the referenced unit is not a category"
1551 msgstr ""
1552
1553-#: .././plainbox/impl/unit/job.py:956
1554+#: .././plainbox/impl/unit/job.py:959
1555 msgid ""
1556 "please ensure that the command supports non-C locale then set the preserve-"
1557 "locale flag"
1558 msgstr ""
1559
1560-#: .././plainbox/impl/unit/job.py:967
1561+#: .././plainbox/impl/unit/job.py:970
1562 msgid ""
1563 "explicit-fail makes no sense for job which outcome is automatically "
1564 "determined."
1565 msgstr ""
1566
1567-#: .././plainbox/impl/unit/job.py:976
1568+#: .././plainbox/impl/unit/job.py:979
1569 msgid "has-leftovers makes no sense without a command"
1570 msgstr ""
1571
1572-#: .././plainbox/impl/unit/job.py:988
1573+#: .././plainbox/impl/unit/job.py:991
1574 msgid "use the .qml extension for all QML files"
1575 msgstr ""
1576
1577-#: .././plainbox/impl/unit/job.py:993
1578+#: .././plainbox/impl/unit/job.py:996
1579 msgid "please point to an existing QML file"
1580 msgstr ""
1581
1582@@ -3089,19 +3121,19 @@
1583 msgid "Using null packaging driver"
1584 msgstr ""
1585
1586-#: .././plainbox/impl/unit/template.py:72
1587+#: .././plainbox/impl/unit/template.py:71
1588 msgid "unable to instantiate template: {}"
1589 msgstr ""
1590
1591-#: .././plainbox/impl/unit/template.py:406
1592+#: .././plainbox/impl/unit/template.py:415
1593 msgid "template"
1594 msgstr ""
1595
1596-#: .././plainbox/impl/unit/template.py:426
1597+#: .././plainbox/impl/unit/template.py:435
1598 msgid "template should explicitly define instantiated unit type"
1599 msgstr ""
1600
1601-#: .././plainbox/impl/unit/template.py:466
1602+#: .././plainbox/impl/unit/template.py:475
1603 msgid "at most one import statement is allowed"
1604 msgstr ""
1605
1606@@ -3116,96 +3148,106 @@
1607 "patterns"
1608 msgstr ""
1609
1610-#: .././plainbox/impl/unit/testplan.py:313
1611+#: .././plainbox/impl/unit/testplan.py:329
1612 #, python-format
1613 msgid "unable to parse bootstrap_include: %s"
1614 msgstr ""
1615
1616-#: .././plainbox/impl/unit/testplan.py:599
1617+#: .././plainbox/impl/unit/testplan.py:353
1618+#, python-format
1619+msgid "unable to parse nested_part: %s"
1620+msgstr ""
1621+
1622+#: .././plainbox/impl/unit/testplan.py:361
1623+#, python-format
1624+msgid "unable to find nested part: %s"
1625+msgstr ""
1626+
1627+#: .././plainbox/impl/unit/testplan.py:655
1628 msgid "only local and resource jobs are allowed in bootstrapping_include"
1629 msgstr ""
1630
1631-#: .././plainbox/impl/unit/unit.py:117
1632+#: .././plainbox/impl/unit/unit.py:116
1633 msgid "{}.Meta.fields[{!r}] is not a validator"
1634 msgstr ""
1635
1636-#: .././plainbox/impl/unit/unit.py:129
1637+#: .././plainbox/impl/unit/unit.py:128
1638 msgid "{}.Meta.fields[{!r}][{}] is not a validator"
1639 msgstr ""
1640
1641-#: .././plainbox/impl/unit/unit.py:198
1642+#: .././plainbox/impl/unit/unit.py:197
1643 msgid "unable to deduce message and no message provided"
1644 msgstr ""
1645
1646-#: .././plainbox/impl/unit/unit.py:240
1647+#: .././plainbox/impl/unit/unit.py:239
1648 msgid "field {field!a}, {message}"
1649 msgstr ""
1650
1651-#: .././plainbox/impl/unit/unit.py:244
1652+#: .././plainbox/impl/unit/unit.py:243
1653 msgid "required field missing"
1654 msgstr ""
1655
1656-#: .././plainbox/impl/unit/unit.py:245 .././plainbox/provider_manager.py:999
1657+#: .././plainbox/impl/unit/unit.py:244 .././plainbox/provider_manager.py:1003
1658 msgid "incorrect value supplied"
1659 msgstr ""
1660
1661+#: .././plainbox/impl/unit/unit.py:245
1662+msgid "definition useless in this context"
1663+msgstr ""
1664+
1665 #: .././plainbox/impl/unit/unit.py:246
1666-msgid "definition useless in this context"
1667+msgid "deprecated field used"
1668 msgstr ""
1669
1670 #: .././plainbox/impl/unit/unit.py:247
1671-msgid "deprecated field used"
1672+msgid "value must be variant (parametrized)"
1673 msgstr ""
1674
1675 #: .././plainbox/impl/unit/unit.py:248
1676-msgid "value must be variant (parametrized)"
1677+msgid "value must be invariant (unparametrized)"
1678 msgstr ""
1679
1680 #: .././plainbox/impl/unit/unit.py:249
1681-msgid "value must be invariant (unparametrized)"
1682+msgid "field refers to unknown parameter"
1683 msgstr ""
1684
1685 #: .././plainbox/impl/unit/unit.py:250
1686-msgid "field refers to unknown parameter"
1687+msgid "field value is not unique"
1688 msgstr ""
1689
1690 #: .././plainbox/impl/unit/unit.py:251
1691-msgid "field value is not unique"
1692-msgstr ""
1693-
1694-#: .././plainbox/impl/unit/unit.py:252
1695 msgid "field should be marked as translatable"
1696 msgstr ""
1697
1698+#: .././plainbox/impl/unit/unit.py:253
1699+msgid "field should not be marked as translatable"
1700+msgstr ""
1701+
1702 #: .././plainbox/impl/unit/unit.py:254
1703-msgid "field should not be marked as translatable"
1704+msgid "syntax error inside the field"
1705 msgstr ""
1706
1707 #: .././plainbox/impl/unit/unit.py:255
1708-msgid "syntax error inside the field"
1709-msgstr ""
1710-
1711-#: .././plainbox/impl/unit/unit.py:256
1712 msgid "bad reference to another unit"
1713 msgstr ""
1714
1715-#: .././plainbox/impl/unit/unit.py:348
1716+#: .././plainbox/impl/unit/unit.py:347
1717 msgid "Please define 'name' in {}.Meta"
1718 msgstr ""
1719
1720-#: .././plainbox/impl/unit/unit.py:852
1721+#: .././plainbox/impl/unit/unit.py:851
1722 msgid "unit should explicitly define its type"
1723 msgstr ""
1724
1725-#: .././plainbox/impl/unit/unit_with_id.py:68
1726+#: .././plainbox/impl/unit/unit_with_id.py:66
1727 msgid "{unit} {id!a}, field {field!a}, {message}"
1728 msgstr ""
1729
1730-#: .././plainbox/impl/unit/unit_with_id.py:107
1731+#: .././plainbox/impl/unit/unit_with_id.py:105
1732 msgid "unit-with-id"
1733 msgstr ""
1734
1735-#: .././plainbox/impl/unit/unit_with_id.py:128
1736+#: .././plainbox/impl/unit/unit_with_id.py:126
1737 msgid "identifier cannot define a custom namespace"
1738 msgstr ""
1739
1740@@ -3214,6 +3256,7 @@
1741 msgstr ""
1742
1743 #: .././plainbox/impl/unit/validators.py:556
1744+#, python-brace-format
1745 msgid "clashes with {0} other unit"
1746 msgid_plural "clashes with {0} other units"
1747 msgstr[0] ""
1748@@ -3288,6 +3331,7 @@
1749 #. result won't work. In particular the leading whitespace *must* be
1750 #. preserved and *must* have the same length on each line.
1751 #: .././plainbox/provider_manager.py:119
1752+#, python-brace-format
1753 msgid ""
1754 "\n"
1755 " install this provider in the system\n"
1756@@ -3412,7 +3456,7 @@
1757 #. It must be correctly preserved or the result won't work. In particular
1758 #. the leading whitespace *must* be preserved and *must* have the same
1759 #. length on each line.
1760-#: .././plainbox/provider_manager.py:498
1761+#: .././plainbox/provider_manager.py:502
1762 msgid ""
1763 "\n"
1764 " install/remove this provider, only for development\n"
1765@@ -3441,28 +3485,28 @@
1766 msgstr ""
1767
1768 #. TRANSLATORS: don't translate the extension name
1769-#: .././plainbox/provider_manager.py:536
1770+#: .././plainbox/provider_manager.py:540
1771 msgid "remove the generated .provider file"
1772 msgstr ""
1773
1774-#: .././plainbox/provider_manager.py:539
1775+#: .././plainbox/provider_manager.py:543
1776 msgid "overwrite existing provider files"
1777 msgstr ""
1778
1779-#: .././plainbox/provider_manager.py:543
1780+#: .././plainbox/provider_manager.py:547
1781 msgid "directory to use (defaults to user's home provider path)"
1782 msgstr ""
1783
1784-#: .././plainbox/provider_manager.py:551
1785+#: .././plainbox/provider_manager.py:555
1786 #, python-format
1787 msgid "Removing provider file: %s"
1788 msgstr ""
1789
1790-#: .././plainbox/provider_manager.py:555
1791+#: .././plainbox/provider_manager.py:559
1792 msgid "Provider file already exists: {}"
1793 msgstr ""
1794
1795-#: .././plainbox/provider_manager.py:558
1796+#: .././plainbox/provider_manager.py:562
1797 #, python-format
1798 msgid "Creating provider file: %s"
1799 msgstr ""
1800@@ -3475,7 +3519,7 @@
1801 #. It must be correctly preserved or the result won't work. In particular
1802 #. the leading whitespace *must* be preserved and *must* have the same
1803 #. length on each line.
1804-#: .././plainbox/provider_manager.py:573
1805+#: .././plainbox/provider_manager.py:577
1806 msgid ""
1807 "\n"
1808 " build provider specific executables from source\n"
1809@@ -3514,7 +3558,7 @@
1810 #. It must be correctly preserved or the result won't work. In particular
1811 #. the leading whitespace *must* be preserved and *must* have the same
1812 #. length on each line.
1813-#: .././plainbox/provider_manager.py:722
1814+#: .././plainbox/provider_manager.py:726
1815 msgid ""
1816 "\n"
1817 " clean build results\n"
1818@@ -3553,7 +3597,7 @@
1819 #. It must be correctly preserved or the result won't work. In particular
1820 #. the leading whitespace *must* be preserved and *must* have the same
1821 #. length on each line.
1822-#: .././plainbox/provider_manager.py:825
1823+#: .././plainbox/provider_manager.py:829
1824 msgid ""
1825 "\n"
1826 " display basic information about this provider\n"
1827@@ -3567,78 +3611,81 @@
1828 " "
1829 msgstr ""
1830
1831-#: .././plainbox/provider_manager.py:851
1832+#: .././plainbox/provider_manager.py:855
1833 msgid "[Provider MetaData]"
1834 msgstr ""
1835
1836 #. TRANSLATORS: {} is the name of the test provider
1837-#: .././plainbox/provider_manager.py:853
1838+#: .././plainbox/provider_manager.py:857
1839 msgid "name: {}"
1840 msgstr ""
1841
1842 #. TRANSLATORS: {} is the namespace of the test provider
1843-#: .././plainbox/provider_manager.py:856
1844+#: .././plainbox/provider_manager.py:860
1845 msgid "namespace: {}"
1846 msgstr ""
1847
1848 #. TRANSLATORS: {} is the namespace of the test provider
1849-#: .././plainbox/provider_manager.py:859
1850+#: .././plainbox/provider_manager.py:863
1851 msgid "namespace: {} (derived from name)"
1852 msgstr ""
1853
1854 #. TRANSLATORS: {} is the name of the test provider
1855-#: .././plainbox/provider_manager.py:862
1856+#: .././plainbox/provider_manager.py:866
1857 msgid "description: {}"
1858 msgstr ""
1859
1860 #. TRANSLATORS: {} is the version of the test provider
1861-#: .././plainbox/provider_manager.py:864
1862+#: .././plainbox/provider_manager.py:868
1863 msgid "version: {}"
1864 msgstr ""
1865
1866 #. TRANSLATORS: {} is the gettext translation domain of the provider
1867-#: .././plainbox/provider_manager.py:866
1868+#: .././plainbox/provider_manager.py:870
1869 msgid "gettext domain: {}"
1870 msgstr ""
1871
1872-#: .././plainbox/provider_manager.py:868
1873+#: .././plainbox/provider_manager.py:872
1874 msgid "[Job Definitions]"
1875 msgstr ""
1876
1877-#: .././plainbox/provider_manager.py:871
1878+#: .././plainbox/provider_manager.py:875
1879 msgid "[Test Plans]"
1880 msgstr ""
1881
1882-#: .././plainbox/provider_manager.py:874
1883+#: .././plainbox/provider_manager.py:878
1884 msgid "[Test Plans] (legacy)"
1885 msgstr ""
1886
1887-#: .././plainbox/provider_manager.py:877
1888+#: .././plainbox/provider_manager.py:881
1889+#, python-brace-format
1890 msgid "{0} from {1}"
1891 msgstr ""
1892
1893-#: .././plainbox/provider_manager.py:880
1894+#: .././plainbox/provider_manager.py:884
1895 msgid "[Other Units]"
1896 msgstr ""
1897
1898-#: .././plainbox/provider_manager.py:885
1899+#: .././plainbox/provider_manager.py:889
1900 msgid "Some units could not be parsed correctly"
1901 msgstr ""
1902
1903 #. TRANSLATORS: please don't translate `manage.py validate`
1904-#: .././plainbox/provider_manager.py:887
1905+#: .././plainbox/provider_manager.py:891
1906 msgid "Please run `manage.py validate` for details"
1907 msgstr ""
1908
1909-#: .././plainbox/provider_manager.py:888
1910+#: .././plainbox/provider_manager.py:892
1911 msgid "[Executables]"
1912 msgstr ""
1913
1914-#: .././plainbox/provider_manager.py:898
1915+#: .././plainbox/provider_manager.py:902
1916+#, python-brace-format
1917 msgid "{0} {1}, role {2}"
1918 msgstr ""
1919
1920-#: .././plainbox/provider_manager.py:903
1921+#: .././plainbox/provider_manager.py:907
1922+#, python-brace-format
1923 msgid "{0} {1}, from {2}"
1924 msgstr ""
1925
1926@@ -3650,7 +3697,7 @@
1927 #. It must be correctly preserved or the result won't work. In particular
1928 #. the leading whitespace *must* be preserved and *must* have the same
1929 #. length on each line.
1930-#: .././plainbox/provider_manager.py:918
1931+#: .././plainbox/provider_manager.py:922
1932 msgid ""
1933 "\n"
1934 " perform various static analysis and validation\n"
1935@@ -3675,47 +3722,48 @@
1936 " "
1937 msgstr ""
1938
1939-#: .././plainbox/provider_manager.py:970
1940+#: .././plainbox/provider_manager.py:974
1941 msgid "validation options"
1942 msgstr ""
1943
1944-#: .././plainbox/provider_manager.py:973
1945+#: .././plainbox/provider_manager.py:977
1946 msgid "Be strict about correctness"
1947 msgstr ""
1948
1949-#: .././plainbox/provider_manager.py:976
1950+#: .././plainbox/provider_manager.py:980
1951 msgid "Report deprecated syntax and features"
1952 msgstr ""
1953
1954-#: .././plainbox/provider_manager.py:979
1955+#: .././plainbox/provider_manager.py:983
1956 msgid "Be loose about correctness"
1957 msgstr ""
1958
1959-#: .././plainbox/provider_manager.py:982
1960+#: .././plainbox/provider_manager.py:986
1961 msgid "Support deprecated syntax and features"
1962 msgstr ""
1963
1964-#: .././plainbox/provider_manager.py:998
1965+#: .././plainbox/provider_manager.py:1002
1966 msgid "missing definition of required field"
1967 msgstr ""
1968
1969-#: .././plainbox/provider_manager.py:1000
1970+#: .././plainbox/provider_manager.py:1004
1971 msgid "useless field in this context"
1972 msgstr ""
1973
1974-#: .././plainbox/provider_manager.py:1001
1975+#: .././plainbox/provider_manager.py:1005
1976 msgid "usage of deprecated field"
1977 msgstr ""
1978
1979-#: .././plainbox/provider_manager.py:1002
1980+#: .././plainbox/provider_manager.py:1006
1981 msgid "template field is constant"
1982 msgstr ""
1983
1984-#: .././plainbox/provider_manager.py:1003
1985+#: .././plainbox/provider_manager.py:1007
1986 msgid "template field is variable"
1987 msgstr ""
1988
1989-#: .././plainbox/provider_manager.py:1020
1990+#: .././plainbox/provider_manager.py:1024
1991+#, python-brace-format
1992 msgid "allowed values are: {0}"
1993 msgstr ""
1994
1995@@ -3725,47 +3773,49 @@
1996 #. 2: unit identifier
1997 #. 3: field name
1998 #. 4: explanation of the problem
1999-#: .././plainbox/provider_manager.py:1028
2000+#: .././plainbox/provider_manager.py:1032
2001 msgid "{0}: {1} {2!a}, field {3!a}: {4}"
2002 msgstr ""
2003
2004-#: .././plainbox/provider_manager.py:1039
2005-#: .././plainbox/provider_manager.py:1123
2006+#: .././plainbox/provider_manager.py:1043
2007+#: .././plainbox/provider_manager.py:1127
2008 msgid "The provider seems to be valid"
2009 msgstr ""
2010
2011-#: .././plainbox/provider_manager.py:1051
2012-#: .././plainbox/provider_manager.py:1135
2013+#: .././plainbox/provider_manager.py:1055
2014+#: .././plainbox/provider_manager.py:1139
2015 msgid "NOTE: subsequent units from problematic files are ignored"
2016 msgstr ""
2017
2018-#: .././plainbox/provider_manager.py:1065
2019+#: .././plainbox/provider_manager.py:1069
2020 msgid "Loading provider..."
2021 msgstr ""
2022
2023-#: .././plainbox/provider_manager.py:1067
2024+#: .././plainbox/provider_manager.py:1071
2025 msgid "Loading other providers..."
2026 msgstr ""
2027
2028-#: .././plainbox/provider_manager.py:1084
2029+#: .././plainbox/provider_manager.py:1088
2030 msgid "Validating everything..."
2031 msgstr ""
2032
2033-#: .././plainbox/provider_manager.py:1110
2034+#: .././plainbox/provider_manager.py:1114
2035+#, python-brace-format
2036 msgid "NOTE: {0} advice was hidden"
2037 msgid_plural "NOTE: {0} advices where hidden"
2038 msgstr[0] ""
2039 msgstr[1] ""
2040
2041-#: .././plainbox/provider_manager.py:1115
2042+#: .././plainbox/provider_manager.py:1119
2043 msgid "Run 'manage.py validate --strict --deprecated' for details"
2044 msgstr ""
2045
2046-#: .././plainbox/provider_manager.py:1119
2047+#: .././plainbox/provider_manager.py:1123
2048+#, python-brace-format
2049 msgid "Validation of provider {0} has failed"
2050 msgstr ""
2051
2052-#: .././plainbox/provider_manager.py:1140
2053+#: .././plainbox/provider_manager.py:1144
2054 #, python-format
2055 msgid "Validating unit %s"
2056 msgstr ""
2057@@ -3778,7 +3828,7 @@
2058 #. It must be correctly preserved or the result won't work. In particular
2059 #. the leading whitespace *must* be preserved and *must* have the same
2060 #. length on each line.
2061-#: .././plainbox/provider_manager.py:1189
2062+#: .././plainbox/provider_manager.py:1193
2063 msgid ""
2064 "\n"
2065 " update, merge and build translation catalogs\n"
2066@@ -3788,23 +3838,23 @@
2067 " "
2068 msgstr ""
2069
2070-#: .././plainbox/provider_manager.py:1212
2071+#: .././plainbox/provider_manager.py:1216
2072 msgid "don't actually do anything"
2073 msgstr ""
2074
2075-#: .././plainbox/provider_manager.py:1213
2076+#: .././plainbox/provider_manager.py:1217
2077 msgid "actions to perform"
2078 msgstr ""
2079
2080-#: .././plainbox/provider_manager.py:1216
2081+#: .././plainbox/provider_manager.py:1220
2082 msgid "do not update the translation template"
2083 msgstr ""
2084
2085-#: .././plainbox/provider_manager.py:1219
2086+#: .././plainbox/provider_manager.py:1223
2087 msgid "do not merge translation files with the template"
2088 msgstr ""
2089
2090-#: .././plainbox/provider_manager.py:1222
2091+#: .././plainbox/provider_manager.py:1226
2092 msgid "do not build binary translation files"
2093 msgstr ""
2094
2095@@ -3816,7 +3866,7 @@
2096 #. It must be correctly preserved or the result won't work. In particular
2097 #. the leading whitespace *must* be preserved and *must* have the same
2098 #. length on each line.
2099-#: .././plainbox/provider_manager.py:1304
2100+#: .././plainbox/provider_manager.py:1326
2101 msgid ""
2102 "\n"
2103 " generate packaging meta-data\n"
2104@@ -3828,17 +3878,17 @@
2105 " "
2106 msgstr ""
2107
2108-#: .././plainbox/provider_manager.py:1396
2109+#: .././plainbox/provider_manager.py:1418
2110 msgid "Per-provider management script"
2111 msgstr ""
2112
2113 #. TRANSLATORS: please keep 'manage.py', '--help', '--version'
2114 #. untranslated. Translate only '[options]'
2115-#: .././plainbox/provider_manager.py:1400
2116+#: .././plainbox/provider_manager.py:1422
2117 msgid "manage.py [--help] [--version] [options]"
2118 msgstr ""
2119
2120-#: .././plainbox/provider_manager.py:1485
2121+#: .././plainbox/provider_manager.py:1507
2122 msgid "{}: bad value of {!r}, {}"
2123 msgstr ""
2124
2125@@ -4154,6 +4204,7 @@
2126 msgstr ""
2127
2128 #: .././plainbox/vendor/phablet.py:127
2129+#, python-brace-format
2130 msgid "Programming error: {0}"
2131 msgstr ""
2132
2133
2134=== modified file 'tools/canonical-hw-collection/canonical-hw-collection'
2135--- tools/canonical-hw-collection/canonical-hw-collection 2016-01-18 17:08:02 +0000
2136+++ tools/canonical-hw-collection/canonical-hw-collection 2016-08-03 18:15:33 +0000
2137@@ -37,12 +37,12 @@
2138
2139 """A Canonical-specific identifier of a particular device."""
2140
2141- SECURE_ID_PATTERN = r"^[a-zA-Z0-9]{15}$|^[a-zA-Z0-9]{18}$"
2142+ SECURE_ID_PATTERN = r"^[a-zA-Z0-9]{15,}$"
2143
2144 def __new__(cls, value):
2145 if not re.match(cls.SECURE_ID_PATTERN, value):
2146 raise ValueError(
2147- _("secure_id must be 15 or 18-character alphanumeric string"))
2148+ _("secure_id must be 15-character (or more) alphanumeric string"))
2149 return super().__new__(cls, value)
2150
2151

Subscribers

People subscribed via source and target branches