Merge lp:~cr3/ubuntu/quantal/checkbox/0.14 into lp:ubuntu/quantal/checkbox
- Quantal (12.10)
- 0.14
- Merge into quantal
Proposed by
Marc Tardif
Status: | Merged |
---|---|
Merged at revision: | 44 |
Proposed branch: | lp:~cr3/ubuntu/quantal/checkbox/0.14 |
Merge into: | lp:ubuntu/quantal/checkbox |
Diff against target: |
253616 lines (+100165/-44578) 317 files modified
backend (+16/-5) bin/checkbox-cli (+1/-1) bin/checkbox-gtk (+1/-1) bin/checkbox-qt (+1/-1) bin/checkbox-urwid (+1/-1) checkbox/application.py (+3/-3) checkbox/arguments.py (+1/-1) checkbox/attribute.py (+1/-1) checkbox/component.py (+13/-13) checkbox/contrib/REThread.py (+1/-1) checkbox/contrib/bpickle.py (+81/-60) checkbox/contrib/glock.py (+15/-20) checkbox/contrib/persist.py (+10/-10) checkbox/dispatcher.py (+4/-4) checkbox/job.py (+4/-4) checkbox/lib/cache.py (+2/-2) checkbox/lib/config.py (+22/-25) checkbox/lib/conversion.py (+4/-4) checkbox/lib/enum.py (+2/-2) checkbox/lib/fifo.py (+33/-36) checkbox/lib/log.py (+1/-1) checkbox/lib/path.py (+9/-13) checkbox/lib/process.py (+6/-5) checkbox/lib/redirect.py (+7/-7) checkbox/lib/resolver.py (+8/-15) checkbox/lib/safe.py (+29/-31) checkbox/lib/script.py (+2/-2) checkbox/lib/selector.py (+2/-2) checkbox/lib/signal.py (+2/-2) checkbox/lib/template.py (+8/-9) checkbox/lib/template_i18n.py (+5/-5) checkbox/lib/tests/resolver.py (+2/-2) checkbox/lib/transport.py (+73/-103) checkbox/lib/tz.py (+55/-0) checkbox/lib/update.py (+2/-2) checkbox/lib/url.py (+2/-2) checkbox/message.py (+4/-4) checkbox/parsers/cpuinfo.py (+4/-4) checkbox/parsers/device.py (+1/-1) checkbox/parsers/dmidecode.py (+2/-2) checkbox/parsers/submission.py (+14/-14) checkbox/parsers/tests/cputable.py (+1/-1) checkbox/parsers/tests/description.py (+3/-3) checkbox/parsers/tests/dmidecode.py (+1/-1) checkbox/parsers/tests/udevadm.py (+1/-1) checkbox/parsers/udevadm.py (+3/-5) checkbox/plugin.py (+1/-1) checkbox/properties.py (+10/-10) checkbox/reactor.py (+3/-3) checkbox/report.py (+21/-28) checkbox/reports/launchpad_report.py (+1/-1) checkbox/reports/xml_report.py (+12/-10) checkbox/resource.py (+6/-7) checkbox/tests/report.py (+1/-1) checkbox/user_interface.py (+25/-7) checkbox/variables.py (+28/-28) checkbox_cli/cli_interface.py (+17/-13) checkbox_gtk/gtk_interface.py (+50/-7) checkbox_gtk/hyper_text_view.py (+5/-7) checkbox_qt/qt_interface.py (+105/-54) checkbox_urwid/urwid_interface.py (+40/-17) data/documents/RTF_Russian.rtf (+0/-51) data/images/SVG_Color_Image_Xubuntu.svg (+0/-109) data/whitelists/default.whitelist (+7/-2) data/whitelists/smoke.whitelist (+25/-0) data/whitelists/sniff.whitelist (+25/-0) debian/changelog (+215/-0) debian/checkbox.dirs (+1/-0) debian/control (+55/-12) debian/po/ast.po (+2/-2) debian/po/cs.po (+2/-2) debian/po/de.po (+2/-2) debian/po/en_AU.po (+2/-2) debian/po/en_GB.po (+2/-2) debian/po/es.po (+3/-4) debian/po/fr.po (+2/-2) debian/po/he.po (+2/-2) debian/po/hu.po (+2/-2) debian/po/it.po (+2/-2) debian/po/ja.po (+8/-5) debian/po/nl.po (+2/-2) debian/po/oc.po (+3/-3) debian/po/pl.po (+2/-2) debian/po/pt_BR.po (+22/-16) debian/po/ro.po (+2/-2) debian/po/ru.po (+2/-2) debian/po/tr.po (+119/-0) debian/po/uk.po (+2/-2) debian/po/zh_CN.po (+119/-0) debian/po/zh_TW.po (+5/-3) debian/rules (+9/-2) examples/checkbox-qt.ini (+1/-1) examples/checkbox.ini (+1/-3) gtk/checkbox-gtk.ui (+14/-2) install/config (+40/-9) install/postinst (+0/-7) jobs/audio.txt.in (+22/-4) jobs/autotest.txt.in (+0/-8) jobs/benchmarks.txt.in (+201/-0) jobs/camera.txt.in (+7/-7) jobs/codecs.txt.in (+2/-2) jobs/disk.txt.in (+13/-18) jobs/firewire.txt.in (+11/-11) jobs/graphics.txt.in (+68/-3) jobs/hibernate.txt.in (+7/-2) jobs/info.txt.in (+14/-16) jobs/keys.txt.in (+19/-3) jobs/local.txt.in (+16/-38) jobs/ltp.txt.in (+0/-13) jobs/mago.txt.in (+0/-10) jobs/mediacard.txt.in (+16/-16) jobs/miscellanea.txt.in (+21/-0) jobs/networking.txt.in (+4/-1) jobs/optical.txt.in (+10/-1) jobs/panel_clock_test.txt.in (+5/-3) jobs/phoronix.txt.in (+0/-11) jobs/power-management.txt.in (+59/-8) jobs/qa_regression.txt.in (+0/-9) jobs/resource.txt.in (+5/-0) jobs/smoke.txt.in (+50/-0) jobs/sniff.txt.in (+74/-0) jobs/stress.txt.in (+110/-24) jobs/suspend.txt.in (+90/-30) jobs/touchpad.txt.in (+46/-0) jobs/unity.txt.in (+0/-14) jobs/usb.txt.in (+3/-2) jobs/wireless.txt.in (+6/-6) plugins/apport_prompt.py (+4/-4) plugins/backend_info.py (+9/-5) plugins/error_prompt.py (+3/-2) plugins/jobs_info.py (+80/-22) plugins/jobs_prompt.py (+30/-2) plugins/launchpad_exchange.py (+6/-6) plugins/launchpad_prompt.py (+1/-1) plugins/message_info.py (+20/-6) plugins/recover_prompt.py (+16/-7) plugins/resource_info.py (+1/-1) plugins/suites_prompt.py (+37/-12) plugins/system_info.py (+1/-1) plugins/user_interface.py (+12/-1) po/POTFILES.in (+2/-6) po/ace.po (+756/-355) po/af.po (+756/-355) po/am.po (+756/-355) po/ar.po (+839/-403) po/ast.po (+1451/-682) po/az.po (+777/-370) po/be.po (+795/-367) po/bg.po (+766/-357) po/bn.po (+2526/-532) po/bo.po (+766/-357) po/br.po (+766/-357) po/bs.po (+2492/-466) po/ca.po (+816/-375) po/ca@valencia.po (+766/-357) po/checkbox.pot (+722/-371) po/ckb.po (+759/-355) po/cs.po (+1425/-653) po/cy.po (+752/-351) po/da.po (+981/-378) po/de.po (+1695/-844) po/dv.po (+750/-349) po/el.po (+1515/-747) po/en_AU.po (+1876/-1100) po/en_CA.po (+769/-360) po/en_GB.po (+1823/-1055) po/eo.po (+766/-357) po/es.po (+1508/-605) po/et.po (+756/-355) po/eu.po (+771/-367) po/fa.po (+750/-349) po/fi.po (+1585/-474) po/fr.po (+1231/-437) po/ga.po (+750/-349) po/gd.po (+756/-355) po/gl.po (+795/-367) po/he.po (+770/-355) po/hi.po (+766/-357) po/hr.po (+766/-357) po/hu.po (+2456/-475) po/hy.po (+751/-350) po/id.po (+761/-357) po/is.po (+756/-355) po/it.po (+1608/-840) po/ja.po (+870/-390) po/jbo.po (+750/-349) po/ka.po (+756/-355) po/kk.po (+759/-355) po/km.po (+2764/-593) po/kn.po (+755/-354) po/ko.po (+835/-370) po/ku.po (+756/-355) po/ky.po (+750/-349) po/lt.po (+766/-357) po/lv.po (+934/-369) po/mk.po (+756/-355) po/ml.po (+756/-355) po/mr.po (+756/-355) po/ms.po (+1436/-668) po/my.po (+759/-356) po/nb.po (+762/-356) po/nds.po (+751/-350) po/ne.po (+755/-354) po/nl.po (+1480/-701) po/nn.po (+756/-355) po/oc.po (+899/-409) po/pl.po (+770/-358) po/ps.po (+750/-349) po/pt.po (+769/-359) po/pt_BR.po (+1398/-649) po/ro.po (+1470/-699) po/ru.po (+1551/-572) po/sd.po (+750/-349) po/shn.po (+750/-349) po/si.po (+769/-356) po/sk.po (+797/-381) po/sl.po (+1440/-673) po/sq.po (+778/-366) po/sr.po (+770/-358) po/sv.po (+786/-364) po/ta.po (+756/-355) po/te.po (+756/-355) po/th.po (+759/-355) po/tr.po (+1465/-685) po/ug.po (+1558/-675) po/uk.po (+791/-367) po/ur.po (+750/-349) po/uz.po (+755/-354) po/vi.po (+759/-355) po/zh_CN.po (+2472/-706) po/zh_HK.po (+766/-357) po/zh_TW.po (+827/-372) qt/checkbox-qt.ui (+1/-1) qt/frontend/qtfront.cpp (+231/-161) qt/frontend/qtfront.h (+15/-5) qt/frontend/qtfront.ui (+45/-10) qt/frontend/treemodel.cpp (+57/-36) qt/frontend/treemodel.h (+4/-0) run (+2/-9) scripts/alsa_info (+928/-0) scripts/ansi_parser (+18/-18) scripts/audio_settings (+3/-3) scripts/autotest_filter (+0/-128) scripts/autotest_suite (+0/-118) scripts/block_device_resource (+36/-0) scripts/camera_test (+118/-70) scripts/cdimage_resource (+10/-6) scripts/check_is_laptop (+1/-1) scripts/check_unity (+0/-20) scripts/cking_suite (+11/-9) scripts/clocktest.c (+10/-10) scripts/cpu_offlining (+10/-4) scripts/cpu_scaling_test (+211/-147) scripts/cpu_topology (+25/-23) scripts/cpuinfo_resource (+4/-4) scripts/create_connection (+48/-40) scripts/disk_read_performance_test (+1/-1) scripts/disk_smart (+53/-36) scripts/dmi_resource (+4/-4) scripts/dns_server_test (+2/-2) scripts/dpkg_resource (+15/-9) scripts/filter_packages (+10/-6) scripts/filter_templates (+14/-7) scripts/floppy_test (+35/-23) scripts/fwts_test (+54/-28) scripts/gconf_resource (+8/-7) scripts/gpu_test (+222/-0) scripts/gst_pipeline_test (+24/-31) scripts/hal_resource (+18/-14) scripts/internet_test (+105/-33) scripts/key_test (+412/-0) scripts/keyboard_test (+6/-3) scripts/lsb_resource (+5/-4) scripts/ltp_filter (+0/-90) scripts/ltp_suite (+0/-151) scripts/mago_filter (+0/-98) scripts/mago_suite (+0/-96) scripts/max_diskspace_used (+1/-1) scripts/media_keys_test (+0/-275) scripts/meminfo_resource (+3/-3) scripts/memory_info (+4/-4) scripts/memory_test (+50/-41) scripts/module_resource (+5/-4) scripts/network_bandwidth_test (+38/-30) scripts/network_check (+18/-18) scripts/network_device_info (+3/-3) scripts/network_info (+12/-7) scripts/network_ntp_test (+37/-29) scripts/obex_send (+73/-71) scripts/optical_detect (+3/-3) scripts/optical_read_test (+25/-10) scripts/package_resource (+11/-8) scripts/phoronix_filter (+0/-148) scripts/phoronix_suite (+0/-307) scripts/pm_log_check (+267/-0) scripts/pm_test (+799/-0) scripts/process_wait (+2/-0) scripts/pts_run (+19/-0) scripts/qa_regression_suite (+0/-171) scripts/removable_storage_test (+107/-86) scripts/removable_storage_watcher (+42/-23) scripts/resolution_test (+18/-16) scripts/run_templates (+2/-2) scripts/samba_test (+1/-1) scripts/sleep_test (+0/-355) scripts/threaded_memtest.c (+25/-25) scripts/tomcat_test (+1/-1) scripts/touchpad_test (+190/-0) scripts/udev_resource (+12/-7) scripts/uname_resource (+5/-4) scripts/virt_check (+2/-2) scripts/wake_on_lan_test (+0/-150) scripts/xorg_memory_test (+45/-44) scripts/xrandr_cycle (+40/-32) setup.cfg (+3/-6) setup.py (+2/-2) test (+15/-15) |
To merge this branch: | bzr merge lp:~cr3/ubuntu/quantal/checkbox/0.14 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Ubuntu branches | Pending | ||
Review via email: mp+111701@code.launchpad.net |
Commit message
Description of the change
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'backend' |
2 | --- backend 2011-08-10 21:09:56 +0000 |
3 | +++ backend 2012-06-23 00:59:17 +0000 |
4 | @@ -1,4 +1,4 @@ |
5 | -#!/usr/bin/python |
6 | +#!/usr/bin/python3 |
7 | |
8 | import os |
9 | import sys |
10 | @@ -19,9 +19,16 @@ |
11 | if len(args) < 2: |
12 | parser.error("Missing INPUT and OUTPUT") |
13 | |
14 | + # Set PATH |
15 | if options.path: |
16 | os.environ["PATH"] = options.path |
17 | |
18 | + # Set PYTHONPATH |
19 | + pythonpath = sys.path[0] |
20 | + if "PYTHONPATH" in os.environ: |
21 | + pythonpath = ":".join([pythonpath, os.environ["PYTHONPATH"]]) |
22 | + os.environ["PYTHONPATH"] = pythonpath |
23 | + |
24 | reader = FifoReader(args[0]) |
25 | writer = FifoWriter(args[1]) |
26 | |
27 | @@ -36,12 +43,16 @@ |
28 | if isinstance(message, dict) and "command" in message: |
29 | job = Job(message["command"], message.get("environ"), |
30 | message.get("timeout")) |
31 | - result = job.execute() |
32 | + status, data, duration = job.execute() |
33 | + try: |
34 | + data = data.decode("utf-8") |
35 | + except UnicodeDecodeError: |
36 | + status, data, duration = (FAIL, "Decode error", 0,) |
37 | else: |
38 | - result = (FAIL, "", 0,) |
39 | + status, data, duration = (FAIL, "", 0,) |
40 | |
41 | - writer.write_object(result) |
42 | - except IOError, e: |
43 | + writer.write_object((status, data, duration,)) |
44 | + except IOError: |
45 | break |
46 | |
47 | return 0 |
48 | |
49 | === modified file 'bin/checkbox-cli' |
50 | --- bin/checkbox-cli 2012-02-10 11:19:05 +0000 |
51 | +++ bin/checkbox-cli 2012-06-23 00:59:17 +0000 |
52 | @@ -15,4 +15,4 @@ |
53 | fi |
54 | fi |
55 | |
56 | -python $CHECKBOX_SHARE/run "$@" $CHECKBOX_SHARE/configs/$(basename $0).ini |
57 | +python3 $CHECKBOX_SHARE/run "$@" $CHECKBOX_SHARE/configs/$(basename $0).ini |
58 | |
59 | === modified file 'bin/checkbox-gtk' |
60 | --- bin/checkbox-gtk 2012-02-10 11:19:05 +0000 |
61 | +++ bin/checkbox-gtk 2012-06-23 00:59:17 +0000 |
62 | @@ -15,4 +15,4 @@ |
63 | fi |
64 | fi |
65 | |
66 | -python $CHECKBOX_SHARE/run "$@" $CHECKBOX_SHARE/configs/$(basename $0).ini |
67 | +python3 $CHECKBOX_SHARE/run "$@" $CHECKBOX_SHARE/configs/$(basename $0).ini |
68 | |
69 | === modified file 'bin/checkbox-qt' |
70 | --- bin/checkbox-qt 2012-03-21 02:22:11 +0000 |
71 | +++ bin/checkbox-qt 2012-06-23 00:59:17 +0000 |
72 | @@ -23,4 +23,4 @@ |
73 | (cd $CHECKBOX_FRONTEND; qmake; make; ./checkbox-qt-service &) |
74 | fi |
75 | |
76 | -python $CHECKBOX_SHARE/run "$@" $CHECKBOX_SHARE/configs/$(basename $0).ini |
77 | +python3 $CHECKBOX_SHARE/run "$@" $CHECKBOX_SHARE/configs/$(basename $0).ini |
78 | |
79 | === modified file 'bin/checkbox-urwid' |
80 | --- bin/checkbox-urwid 2012-02-10 11:19:05 +0000 |
81 | +++ bin/checkbox-urwid 2012-06-23 00:59:17 +0000 |
82 | @@ -15,4 +15,4 @@ |
83 | fi |
84 | fi |
85 | |
86 | -python $CHECKBOX_SHARE/run "$@" $CHECKBOX_SHARE/configs/$(basename $0).ini |
87 | +python3 $CHECKBOX_SHARE/run "$@" $CHECKBOX_SHARE/configs/$(basename $0).ini |
88 | |
89 | === modified file 'checkbox/application.py' |
90 | --- checkbox/application.py 2012-03-21 02:22:11 +0000 |
91 | +++ checkbox/application.py 2012-06-23 00:59:17 +0000 |
92 | @@ -35,7 +35,7 @@ |
93 | from checkbox.reactor import Reactor |
94 | |
95 | |
96 | -class Application(object): |
97 | +class Application: |
98 | |
99 | reactor_factory = Reactor |
100 | |
101 | @@ -55,7 +55,7 @@ |
102 | raise |
103 | |
104 | |
105 | -class ApplicationManager(object): |
106 | +class ApplicationManager: |
107 | |
108 | application_factory = Application |
109 | |
110 | @@ -130,7 +130,7 @@ |
111 | |
112 | # Check options |
113 | if options.version: |
114 | - print config.get_defaults().version |
115 | + print(config.get_defaults().version) |
116 | sys.exit(0) |
117 | |
118 | return self.application_factory(config) |
119 | |
120 | === modified file 'checkbox/arguments.py' |
121 | --- checkbox/arguments.py 2009-08-19 15:36:05 +0000 |
122 | +++ checkbox/arguments.py 2012-06-23 00:59:17 +0000 |
123 | @@ -21,7 +21,7 @@ |
124 | from checkbox.lib.decorator import merge_function_metadata |
125 | |
126 | |
127 | -class ArgumentReplacer(object): |
128 | +class ArgumentReplacer: |
129 | """A decorator helper that filters arguments to be passed to a function. |
130 | |
131 | Create one with the original function and a function to replace |
132 | |
133 | === modified file 'checkbox/attribute.py' |
134 | --- checkbox/attribute.py 2009-01-20 18:55:20 +0000 |
135 | +++ checkbox/attribute.py 2012-06-23 00:59:17 +0000 |
136 | @@ -19,7 +19,7 @@ |
137 | from checkbox.variables import Variable |
138 | |
139 | |
140 | -class Attribute(object): |
141 | +class Attribute: |
142 | |
143 | def __init__(self, name, cls, variable_factory=None): |
144 | self.name = name |
145 | |
146 | === modified file 'checkbox/component.py' |
147 | --- checkbox/component.py 2010-03-09 16:58:36 +0000 |
148 | +++ checkbox/component.py 2012-06-23 00:59:17 +0000 |
149 | @@ -29,7 +29,7 @@ |
150 | from checkbox.variables import get_variables |
151 | |
152 | |
153 | -class ComponentSection(object): |
154 | +class ComponentSection: |
155 | """ |
156 | Component section which is essentially a container of modules. These |
157 | map to the modules referenced in the configuration passed as argument |
158 | @@ -99,7 +99,7 @@ |
159 | name, self.name) |
160 | |
161 | if not self.has_module(name): |
162 | - raise Exception, "No such such module: %s" % name |
163 | + raise Exception("No such such module: %s" % name) |
164 | |
165 | filenames = itertools.chain(*[path_expand_recursive(m) |
166 | for m in self.modules]) |
167 | @@ -109,10 +109,10 @@ |
168 | basename = basename.replace(".py", "") |
169 | if basename == name: |
170 | globals = {} |
171 | - exec open(filename) in globals |
172 | + exec(open(filename).read(), globals) |
173 | if "factory" not in globals: |
174 | - raise Exception, "Variable 'factory' not found in: %s" \ |
175 | - % filename |
176 | + raise Exception("Variable 'factory' not found in: %s" \ |
177 | + % filename) |
178 | |
179 | module = globals["factory"]() |
180 | module.__module__ = name |
181 | @@ -122,14 +122,14 @@ |
182 | |
183 | # Set configuration values |
184 | variables = get_variables(module) |
185 | - environ = dict([(k.lower(), v) for k, v in os.environ.iteritems()]) |
186 | - for attribute, variable in variables.iteritems(): |
187 | + environ = dict([(k.lower(), v) for k, v in os.environ.items()]) |
188 | + for attribute, variable in variables.items(): |
189 | if config and attribute.name in config: |
190 | value = config.get(attribute.name) |
191 | variable.set(value) |
192 | else: |
193 | value = variable.get() |
194 | - if isinstance(value, basestring): |
195 | + if isinstance(value, str): |
196 | value = value % environ |
197 | variable.set(value) |
198 | elif isinstance(value, list): |
199 | @@ -137,16 +137,16 @@ |
200 | variable.set(value) |
201 | |
202 | # Check required attributes |
203 | - for attribute, variable in variables.iteritems(): |
204 | + for attribute, variable in variables.items(): |
205 | value = variable.get() |
206 | if value is None and variable._required: |
207 | - raise Exception, "Configuration '%s' missing " \ |
208 | + raise Exception("Configuration '%s' missing " \ |
209 | "required attribute: %s" \ |
210 | - % (config_name, attribute.name) |
211 | + % (config_name, attribute.name)) |
212 | |
213 | return module |
214 | |
215 | - raise Exception, "Failed to find module '%s' in: %s" % (name, filenames) |
216 | + raise Exception("Failed to find module '%s' in: %s" % (name, filenames)) |
217 | |
218 | def load_modules(self): |
219 | """ |
220 | @@ -160,7 +160,7 @@ |
221 | return modules |
222 | |
223 | |
224 | -class ComponentManager(object): |
225 | +class ComponentManager: |
226 | """ |
227 | Component manager which is essentially a container of sections. |
228 | """ |
229 | |
230 | === modified file 'checkbox/contrib/REThread.py' |
231 | --- checkbox/contrib/REThread.py 2009-01-20 16:46:15 +0000 |
232 | +++ checkbox/contrib/REThread.py 2012-06-23 00:59:17 +0000 |
233 | @@ -60,7 +60,7 @@ |
234 | Does nothing if no exception was caught.''' |
235 | |
236 | if self._exception: |
237 | - raise self._exception[0], self._exception[1], self._exception[2] |
238 | + raise self._exception[0](self._exception[1]).with_traceback(self._exception[2]) |
239 | |
240 | # |
241 | # Unit test |
242 | |
243 | === modified file 'checkbox/contrib/bpickle.py' |
244 | --- checkbox/contrib/bpickle.py 2010-03-09 16:58:36 +0000 |
245 | +++ checkbox/contrib/bpickle.py 2012-06-23 00:59:17 +0000 |
246 | @@ -39,129 +39,150 @@ |
247 | |
248 | type_names = [type(obj)] |
249 | for type_name in type_names: |
250 | - if _dt.has_key(type_name): |
251 | + if type_name in _dt: |
252 | return _dt[type_name](obj) |
253 | |
254 | type_names.extend(type_name.__bases__) |
255 | |
256 | - raise ValueError, "Unsupported type: %s" % type(obj) |
257 | + raise ValueError("Unsupported type: %s" % type(obj)) |
258 | |
259 | |
260 | def loads(str, _lt=loads_table): |
261 | if not str: |
262 | - raise ValueError, "Can't load empty string" |
263 | + raise ValueError("Can't load empty string") |
264 | try: |
265 | return _lt[str[0]](str, 0)[0] |
266 | - except KeyError, e: |
267 | - raise ValueError, "Unknown type character: %s" % e |
268 | + except KeyError as e: |
269 | + raise ValueError("Unknown type character: %s" % e) |
270 | except IndexError: |
271 | - raise ValueError, "Corrupted data" |
272 | + raise ValueError("Corrupted data") |
273 | + |
274 | |
275 | def dumps_bool(obj): |
276 | - return "b%d" % int(obj) |
277 | + return ("b%d" % int(obj)).encode("ascii") |
278 | + |
279 | |
280 | def dumps_int(obj): |
281 | - return "i%s;" % obj |
282 | + return ("i%s;" % obj).encode("ascii") |
283 | + |
284 | |
285 | def dumps_float(obj): |
286 | - return "f%r;" % obj |
287 | + return ("f%r;" % obj).encode("ascii") |
288 | + |
289 | + |
290 | +def dumps_bytes(obj): |
291 | + return ("c%s:" % len(obj)).encode("ascii") + obj |
292 | + |
293 | |
294 | def dumps_str(obj): |
295 | - return "s%s:%s" % (len(obj), obj) |
296 | - |
297 | -def dumps_unicode(obj): |
298 | obj = obj.encode("utf-8") |
299 | - return "u%s:%s" % (len(obj), obj) |
300 | + return ("s%s:" % len(obj)).encode("ascii") + obj |
301 | + |
302 | |
303 | def dumps_list(obj, _dt=None): |
304 | - return "l%s;" % "".join([dumps(val, _dt) for val in obj]) |
305 | + return b"l" + b"".join([dumps(val, _dt) for val in obj]) + b";" |
306 | + |
307 | |
308 | def dumps_tuple(obj, _dt=None): |
309 | - return "t%s;" % "".join([dumps(val, _dt) for val in obj]) |
310 | + return b"t" + b"".join([dumps(val, _dt) for val in obj]) + b";" |
311 | + |
312 | |
313 | def dumps_dict(obj, _dt=None): |
314 | res = [] |
315 | - keys = sorted(obj.iterkeys()) |
316 | + keys = sorted(obj.keys()) |
317 | append = res.append |
318 | for key in keys: |
319 | val = obj[key] |
320 | append(dumps(key, _dt)) |
321 | append(dumps(val, _dt)) |
322 | - return "d%s;" % "".join(res) |
323 | + return b"d" + b"".join(res) + b";" |
324 | + |
325 | |
326 | def dumps_none(obj): |
327 | - return "n" |
328 | + return b"n" |
329 | + |
330 | |
331 | def loads_bool(str, pos): |
332 | - return bool(int(str[pos+1])), pos+2 |
333 | + return bool(int(chr(str[pos + 1]))), pos + 2 |
334 | + |
335 | |
336 | def loads_int(str, pos): |
337 | - endpos = str.index(";", pos) |
338 | - return int(str[pos+1:endpos]), endpos+1 |
339 | + endpos = str.index(b";", pos) |
340 | + return int(str[pos + 1:endpos]), endpos + 1 |
341 | + |
342 | |
343 | def loads_float(str, pos): |
344 | - endpos = str.index(";", pos) |
345 | - return float(str[pos+1:endpos]), endpos+1 |
346 | + endpos = str.index(b";", pos) |
347 | + return float(str[pos + 1:endpos]), endpos + 1 |
348 | + |
349 | + |
350 | +def loads_bytes(str, pos): |
351 | + startpos = str.index(b":", pos) + 1 |
352 | + endpos = startpos + int(str[pos + 1:startpos - 1]) |
353 | + return str[startpos:endpos], endpos |
354 | + |
355 | |
356 | def loads_str(str, pos): |
357 | - startpos = str.index(":", pos)+1 |
358 | - endpos = startpos+int(str[pos+1:startpos-1]) |
359 | - return str[startpos:endpos], endpos |
360 | - |
361 | -def loads_unicode(str, pos): |
362 | - startpos = str.index(":", pos)+1 |
363 | - endpos = startpos+int(str[pos+1:startpos-1]) |
364 | + startpos = str.index(b":", pos) + 1 |
365 | + endpos = startpos + int(str[pos + 1:startpos - 1]) |
366 | return str[startpos:endpos].decode("utf-8"), endpos |
367 | |
368 | + |
369 | def loads_list(str, pos, _lt=loads_table): |
370 | pos += 1 |
371 | res = [] |
372 | append = res.append |
373 | - while str[pos] != ";": |
374 | + while str[pos] != ord(";"): |
375 | obj, pos = _lt[str[pos]](str, pos) |
376 | append(obj) |
377 | - return res, pos+1 |
378 | + return res, pos + 1 |
379 | + |
380 | |
381 | def loads_tuple(str, pos, _lt=loads_table): |
382 | pos += 1 |
383 | res = [] |
384 | append = res.append |
385 | - while str[pos] != ";": |
386 | + while str[pos] != ord(";"): |
387 | obj, pos = _lt[str[pos]](str, pos) |
388 | append(obj) |
389 | - return tuple(res), pos+1 |
390 | + return tuple(res), pos + 1 |
391 | + |
392 | |
393 | def loads_dict(str, pos, _lt=loads_table): |
394 | pos += 1 |
395 | res = {} |
396 | - while str[pos] != ";": |
397 | + while str[pos] != ord(";"): |
398 | key, pos = _lt[str[pos]](str, pos) |
399 | val, pos = _lt[str[pos]](str, pos) |
400 | res[key] = val |
401 | - return res, pos+1 |
402 | + return res, pos + 1 |
403 | + |
404 | |
405 | def loads_none(str, pos): |
406 | - return None, pos+1 |
407 | - |
408 | - |
409 | -dumps_table.update({ bool: dumps_bool, |
410 | - int: dumps_int, |
411 | - long: dumps_int, |
412 | - float: dumps_float, |
413 | - str: dumps_str, |
414 | - unicode: dumps_unicode, |
415 | - list: dumps_list, |
416 | - tuple: dumps_tuple, |
417 | - dict: dumps_dict, |
418 | - type(None): dumps_none }) |
419 | - |
420 | -loads_table.update({ "b": loads_bool, |
421 | - "i": loads_int, |
422 | - "f": loads_float, |
423 | - "s": loads_str, |
424 | - "u": loads_unicode, |
425 | - "l": loads_list, |
426 | - "t": loads_tuple, |
427 | - "d": loads_dict, |
428 | - "n": loads_none }) |
429 | - |
430 | + return None, pos + 1 |
431 | + |
432 | + |
433 | +dumps_table.update({ |
434 | + bool: dumps_bool, |
435 | + int: dumps_int, |
436 | + float: dumps_float, |
437 | + bytes: dumps_bytes, |
438 | + str: dumps_str, |
439 | + list: dumps_list, |
440 | + tuple: dumps_tuple, |
441 | + dict: dumps_dict, |
442 | + type(None): dumps_none, |
443 | + }) |
444 | + |
445 | +loads_table.update({ |
446 | + ord("b"): loads_bool, |
447 | + ord("i"): loads_int, |
448 | + ord("f"): loads_float, |
449 | + ord("c"): loads_str, |
450 | + ord("s"): loads_str, |
451 | + ord("u"): loads_str, |
452 | + ord("l"): loads_list, |
453 | + ord("t"): loads_tuple, |
454 | + ord("d"): loads_dict, |
455 | + ord("n"): loads_none, |
456 | + }) |
457 | |
458 | === modified file 'checkbox/contrib/glock.py' |
459 | --- checkbox/contrib/glock.py 2010-03-09 16:58:36 +0000 |
460 | +++ checkbox/contrib/glock.py 2012-06-23 00:59:17 +0000 |
461 | @@ -1,4 +1,4 @@ |
462 | -#!/usr/bin/env python |
463 | +#!/usr/bin/env python3 |
464 | # -*- coding: latin1 -*- |
465 | #---------------------------------------------------------------------------- |
466 | # glock.py: Global mutex |
467 | @@ -70,11 +70,6 @@ |
468 | pass |
469 | |
470 | |
471 | -# Constants |
472 | -# ---------: |
473 | -if sys.version[:3] < '2.2': |
474 | - True, False = 1, 0 # built-in in Python 2.2+ |
475 | - |
476 | #---------------------------------------------------------------------------- |
477 | class GlobalLock: |
478 | #---------------------------------------------------------------------------- |
479 | @@ -177,7 +172,7 @@ |
480 | options = fcntl.LOCK_EX|fcntl.LOCK_NB |
481 | try: |
482 | fcntl.flock(self.fdlock, options) |
483 | - except IOError, message: #(errno 13: perm. denied, |
484 | + except IOError as message: #(errno 13: perm. denied, |
485 | # 36: Resource deadlock avoided) |
486 | if not blocking and self._errnoOf (message) == errno.EWOULDBLOCK: |
487 | raise LockAlreadyAcquired('Lock %s already acquired by ' |
488 | @@ -230,7 +225,7 @@ |
489 | try: |
490 | win32event.ReleaseMutex(self.mutex) |
491 | #print "released mutex" |
492 | - except pywintypes.error, e: |
493 | + except pywintypes.error as e: |
494 | errCode, fctName, errMsg = e.args |
495 | if errCode == 288: |
496 | raise NotOwner("Attempt to release somebody else's lock") |
497 | @@ -264,7 +259,7 @@ |
498 | #---------------------------------------------------------------------------- |
499 | ##TODO: a more serious test with distinct processes ! |
500 | |
501 | - print 'Testing glock.py...' |
502 | + print('Testing glock.py...') |
503 | |
504 | # unfortunately can't test inter-process lock here! |
505 | lockName = 'myFirstLock' |
506 | @@ -283,31 +278,31 @@ |
507 | # Check that <> threads of same process do block: |
508 | import threading, time |
509 | thread = threading.Thread(target=threadMain, args=(l,)) |
510 | - print 'main: locking...', |
511 | + print('main: locking...', end=' ') |
512 | l.acquire() |
513 | - print ' done.' |
514 | + print(' done.') |
515 | thread.start() |
516 | time.sleep(3) |
517 | - print '\nmain: unlocking...', |
518 | + print('\nmain: unlocking...', end=' ') |
519 | l.release() |
520 | - print ' done.' |
521 | + print(' done.') |
522 | time.sleep(0.1) |
523 | |
524 | - print '=> Test of glock.py passed.' |
525 | + print('=> Test of glock.py passed.') |
526 | return l |
527 | |
528 | def threadMain(lock): |
529 | - print 'thread started(%s).' % lock |
530 | + print('thread started(%s).' % lock) |
531 | try: lock.acquire(blocking=False) |
532 | except LockAlreadyAcquired: pass |
533 | else: raise Exception('should have raised LockAlreadyAcquired') |
534 | - print 'thread: locking (should stay blocked for ~ 3 sec)...', |
535 | + print('thread: locking (should stay blocked for ~ 3 sec)...', end=' ') |
536 | lock.acquire() |
537 | - print 'thread: locking done.' |
538 | - print 'thread: unlocking...', |
539 | + print('thread: locking done.') |
540 | + print('thread: unlocking...', end=' ') |
541 | lock.release() |
542 | - print ' done.' |
543 | - print 'thread ended.' |
544 | + print(' done.') |
545 | + print('thread ended.') |
546 | |
547 | #---------------------------------------------------------------------------- |
548 | # M A I N |
549 | |
550 | === modified file 'checkbox/contrib/persist.py' |
551 | --- checkbox/contrib/persist.py 2012-02-23 11:56:50 +0000 |
552 | +++ checkbox/contrib/persist.py 2012-06-23 00:59:17 +0000 |
553 | @@ -41,7 +41,7 @@ |
554 | pass |
555 | |
556 | |
557 | -class Persist(object): |
558 | +class Persist: |
559 | """Persistence handler. |
560 | |
561 | There are three different kinds of opition maps, regarding the |
562 | @@ -257,7 +257,7 @@ |
563 | current = self._traverse(map, path) |
564 | if type(current) is list and value in current: |
565 | return |
566 | - path = path+(sys.maxint,) |
567 | + path = path+(sys.maxsize,) |
568 | self._traverse(map, path, setvalue=value) |
569 | |
570 | def remove(self, path, value=NOTHING, soft=False, weak=False): |
571 | @@ -317,7 +317,7 @@ |
572 | return RootedPersist(self, path) |
573 | |
574 | |
575 | -class RootedPersist(object): |
576 | +class RootedPersist: |
577 | |
578 | def __init__(self, parent, root): |
579 | self.parent = parent |
580 | @@ -408,7 +408,7 @@ |
581 | return ".".join(result) |
582 | |
583 | |
584 | -class Backend(object): |
585 | +class Backend: |
586 | |
587 | def new(self): |
588 | return {} |
589 | @@ -491,7 +491,7 @@ |
590 | if keys: |
591 | return keys() |
592 | elif type(obj) is list: |
593 | - return range(len(obj)) |
594 | + return list(range(len(obj))) |
595 | return NotImplemented |
596 | |
597 | |
598 | @@ -513,18 +513,18 @@ |
599 | class PickleBackend(DiskBackend): |
600 | |
601 | def __init__(self): |
602 | - import cPickle |
603 | + import pickle |
604 | self._pickle = cPickle |
605 | |
606 | def load(self, filepath): |
607 | - file = open(filepath) |
608 | + file = open(filepath, "rb") |
609 | try: |
610 | return self._pickle.load(file) |
611 | finally: |
612 | safe_close(file, self.safe_file_closing) |
613 | |
614 | def save(self, filepath, map): |
615 | - file = open(filepath, "w") |
616 | + file = open(filepath, "wb") |
617 | try: |
618 | self._pickle.dump(map, file, 2) |
619 | finally: |
620 | @@ -538,14 +538,14 @@ |
621 | self._bpickle = bpickle |
622 | |
623 | def load(self, filepath): |
624 | - file = open(filepath) |
625 | + file = open(filepath, "rb") |
626 | try: |
627 | return self._bpickle.loads(file.read()) |
628 | finally: |
629 | safe_close(file, self.safe_file_closing) |
630 | |
631 | def save(self, filepath, map): |
632 | - file = open(filepath, "w") |
633 | + file = open(filepath, "wb") |
634 | try: |
635 | file.write(self._bpickle.dumps(map)) |
636 | finally: |
637 | |
638 | === modified file 'checkbox/dispatcher.py' |
639 | --- checkbox/dispatcher.py 2011-11-18 12:46:21 +0000 |
640 | +++ checkbox/dispatcher.py 2012-06-23 00:59:17 +0000 |
641 | @@ -83,9 +83,9 @@ |
642 | # then behaves like a list using the latest events. |
643 | if self.event_types.issubset(self.kwargs): |
644 | self.notify = notify = super(ListenerQueue, self).notify |
645 | - keys = self.kwargs.keys() |
646 | - for values in product(*self.kwargs.values()): |
647 | - self.kwargs = dict(zip(keys, values)) |
648 | + keys = list(self.kwargs.keys()) |
649 | + for values in product(*list(self.kwargs.values())): |
650 | + self.kwargs = dict(list(zip(keys, values))) |
651 | notify(event) |
652 | |
653 | |
654 | @@ -171,7 +171,7 @@ |
655 | |
656 | def registerHandler(self, event_types, handler, count=None): |
657 | """See Dispatcher.""" |
658 | - if not isinstance(event_types, (list, tuple,)): |
659 | + if not isinstance(event_types, (list, tuple)): |
660 | event_types = (event_types,) |
661 | |
662 | listener = self.listener_factory(event_types, handler, count) |
663 | |
664 | === modified file 'checkbox/job.py' |
665 | --- checkbox/job.py 2012-02-15 00:11:21 +0000 |
666 | +++ checkbox/job.py 2012-06-23 00:59:17 +0000 |
667 | @@ -39,7 +39,7 @@ |
668 | |
669 | DEFAULT_JOB_TIMEOUT = 30 # used in case a job specifies invalid timeout |
670 | |
671 | -class Job(object): |
672 | +class Job: |
673 | |
674 | def __init__(self, command, environ=None, timeout=None): |
675 | if environ is None: |
676 | @@ -93,8 +93,8 @@ |
677 | (signal_to_name(term_signal), |
678 | signal_to_description(term_signal)) |
679 | else: |
680 | - raise Exception, "Command not terminated: %s" \ |
681 | - % self.command |
682 | + raise Exception("Command not terminated: %s" \ |
683 | + % self.command) |
684 | |
685 | duration = process.endtime - process.starttime |
686 | |
687 | @@ -133,7 +133,7 @@ |
688 | def _find_matching_messages(self, **kwargs): |
689 | for filename in self._walk_messages(): |
690 | message = self._read_message(filename,cache=True) |
691 | - for key, value in kwargs.iteritems(): |
692 | + for key, value in kwargs.items(): |
693 | if message.get(key) != value: |
694 | break |
695 | else: |
696 | |
697 | === modified file 'checkbox/lib/cache.py' |
698 | --- checkbox/lib/cache.py 2009-01-20 18:55:20 +0000 |
699 | +++ checkbox/lib/cache.py 2012-06-23 00:59:17 +0000 |
700 | @@ -16,7 +16,7 @@ |
701 | # You should have received a copy of the GNU General Public License |
702 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. |
703 | # |
704 | -class Cache(object): |
705 | +class Cache: |
706 | |
707 | def __init__(self, function): |
708 | self._cache = {} |
709 | @@ -27,7 +27,7 @@ |
710 | return self |
711 | |
712 | def __call__(self, *args): |
713 | - if not self._cache.has_key((self._instance,) + args): |
714 | + if (self._instance,) + args not in self._cache: |
715 | self._cache[(self._instance,) + args] = self._function(self._instance, *args) |
716 | |
717 | return self._cache[(self._instance,) + args] |
718 | |
719 | === modified file 'checkbox/lib/config.py' |
720 | --- checkbox/lib/config.py 2012-02-10 11:19:05 +0000 |
721 | +++ checkbox/lib/config.py 2012-06-23 00:59:17 +0000 |
722 | @@ -19,9 +19,8 @@ |
723 | import os |
724 | import re |
725 | import logging |
726 | -import posixpath |
727 | |
728 | -from ConfigParser import ConfigParser |
729 | +from configparser import ConfigParser |
730 | |
731 | from checkbox.lib.text import split |
732 | |
733 | @@ -32,7 +31,7 @@ |
734 | super(IncludeDict, self).__init__() |
735 | self._parser = parser |
736 | |
737 | - for (key, value) in os.environ.iteritems(): |
738 | + for (key, value) in os.environ.items(): |
739 | if key.startswith("CHECKBOX"): |
740 | super(IncludeDict, self).__setitem__(key.lower(), value) |
741 | |
742 | @@ -41,20 +40,18 @@ |
743 | if isinstance(value, list): |
744 | value = value[0] |
745 | for path in split(value): |
746 | - path = self._parser._interpolate("DEFAULT", None, path, self) |
747 | - path = posixpath.expanduser(path) |
748 | - if not posixpath.exists(path): |
749 | - raise Exception, "No such configuration file: %s" % path |
750 | - if posixpath.isdir(path): |
751 | + path = self._parser._interpolation.before_get( |
752 | + self._parser, "DEFAULT", None, path, self) |
753 | + path = os.path.expanduser(path) |
754 | + if not os.path.exists(path): |
755 | + raise Exception("No such configuration file: %s" % path) |
756 | + if os.path.isdir(path): |
757 | logging.info("Parsing config filenames from directory: %s", |
758 | path) |
759 | - def walk_func(arg, directory, names): |
760 | - for name in names: |
761 | - path = posixpath.join(directory, name) |
762 | - if not posixpath.isdir(path): |
763 | - arg._parser.read(path) |
764 | - |
765 | - posixpath.walk(path, walk_func, self) |
766 | + for dirpath, dirnames, filenames in os.walk(path): |
767 | + for filename in filenames: |
768 | + path = os.path.join(dirpath, filename) |
769 | + self._parser.read(path) |
770 | else: |
771 | logging.info("Parsing config filename: %s", path) |
772 | self._parser.read(path) |
773 | @@ -64,20 +61,20 @@ |
774 | super(IncludeDict, self).__setitem__(key, value) |
775 | |
776 | |
777 | -class ConfigSection(object): |
778 | +class ConfigSection: |
779 | |
780 | def __init__(self, parent, name, attributes={}): |
781 | self.parent = parent |
782 | self.name = name |
783 | self.attributes = {} |
784 | - for key, value in attributes.iteritems(): |
785 | + for key, value in attributes.items(): |
786 | self.attributes[key] = re.sub("\n\.\n", "\n\n", value) |
787 | |
788 | def __getattr__(self, name): |
789 | if name in self.attributes: |
790 | return self.get(name) |
791 | |
792 | - raise AttributeError, name |
793 | + raise AttributeError(name) |
794 | |
795 | def __contains__(self, name): |
796 | return name in self.attributes |
797 | @@ -96,7 +93,7 @@ |
798 | if name in self.attributes: |
799 | return self.get(name) |
800 | |
801 | - raise AttributeError, name |
802 | + raise AttributeError(name) |
803 | |
804 | def get(self, name): |
805 | name_upper = name.upper() |
806 | @@ -106,10 +103,10 @@ |
807 | return os.environ[name_upper] |
808 | |
809 | |
810 | -class Config(object): |
811 | +class Config: |
812 | |
813 | def __init__(self): |
814 | - self._parser = ConfigParser() |
815 | + self._parser = ConfigParser(empty_lines_in_values=False) |
816 | self._parser._defaults = IncludeDict(self._parser) |
817 | |
818 | # Copy attributes from the parser to avoid one additional |
819 | @@ -121,7 +118,7 @@ |
820 | for config in configs: |
821 | match = re.match("(.*)/([^/]+)=(.*)", config) |
822 | if not match: |
823 | - raise Exception, "Invalid config string: %s" % config |
824 | + raise Exception("Invalid config string: %s" % config) |
825 | |
826 | (name, option, value) = match.groups() |
827 | |
828 | @@ -145,11 +142,11 @@ |
829 | def read_file(self, file, filename="<stream>"): |
830 | logging.info("Reading configurations from: %s", filename) |
831 | |
832 | - self._parser.readfp(file, filename) |
833 | + self._parser.read_file(file, filename) |
834 | |
835 | def read_filename(self, filename): |
836 | - if not posixpath.exists(filename): |
837 | - raise Exception, "No such configuration file: %s" % filename |
838 | + if not os.path.exists(filename): |
839 | + raise Exception("No such configuration file: %s" % filename) |
840 | |
841 | file = open(filename, "r") |
842 | return self.read_file(file, filename) |
843 | |
844 | === modified file 'checkbox/lib/conversion.py' |
845 | --- checkbox/lib/conversion.py 2011-11-18 12:46:21 +0000 |
846 | +++ checkbox/lib/conversion.py 2012-06-23 00:59:17 +0000 |
847 | @@ -18,12 +18,13 @@ |
848 | # |
849 | import re |
850 | |
851 | -from dateutil import tz |
852 | from datetime import ( |
853 | datetime, |
854 | timedelta, |
855 | ) |
856 | |
857 | +from checkbox.lib.tz import tzutc |
858 | + |
859 | |
860 | DATETIME_RE = re.compile(r""" |
861 | ^(?P<year>\d\d\d\d)-?(?P<month>\d\d)-?(?P<day>\d\d) |
862 | @@ -108,8 +109,7 @@ |
863 | milliseconds = 999999 |
864 | |
865 | dt = datetime( |
866 | - year, month, day, hour, minute, second, milliseconds, |
867 | - tzinfo=tz.tzutc()) |
868 | + year, month, day, hour, minute, second, milliseconds, tzinfo=tzutc) |
869 | |
870 | tz_sign = time_parts['tz_sign'] |
871 | tz_hour = time_parts['tz_hour'] |
872 | @@ -150,7 +150,7 @@ |
873 | |
874 | :param string: The string representation. |
875 | """ |
876 | - if isinstance(string, basestring): |
877 | + if isinstance(string, str): |
878 | for regex, formatter in TYPE_FORMATS: |
879 | match = regex.match(string) |
880 | if match: |
881 | |
882 | === modified file 'checkbox/lib/enum.py' |
883 | --- checkbox/lib/enum.py 2011-06-13 14:22:39 +0000 |
884 | +++ checkbox/lib/enum.py 2012-06-23 00:59:17 +0000 |
885 | @@ -25,7 +25,7 @@ |
886 | pass |
887 | |
888 | |
889 | -class Enum(object): |
890 | +class Enum: |
891 | |
892 | def __init__(self, *names): |
893 | value = 0 |
894 | @@ -44,7 +44,7 @@ |
895 | "enum value does not define: %s" % value) |
896 | value = getattr(self, value) |
897 | |
898 | - if not isinstance(value, (int, long)): |
899 | + if not isinstance(value, int): |
900 | raise EnumException( |
901 | "enum value is not an integer: %s" % value) |
902 | |
903 | |
904 | === modified file 'checkbox/lib/fifo.py' |
905 | --- checkbox/lib/fifo.py 2011-06-13 14:22:39 +0000 |
906 | +++ checkbox/lib/fifo.py 2012-06-23 00:59:17 +0000 |
907 | @@ -22,26 +22,27 @@ |
908 | from checkbox.contrib.bpickle import dumps, loads |
909 | from checkbox.lib.selector import Selector, SelectorIO |
910 | |
911 | -class FifoBase(object): |
912 | - |
913 | - mode = None |
914 | + |
915 | +class FifoBase: |
916 | + |
917 | + flags = None |
918 | |
919 | def __init__(self, path, timeout=None): |
920 | self.path = path |
921 | - self.file = open(path, self.mode) |
922 | + self.fileno = os.open(path, self.flags) |
923 | self._timeout = timeout |
924 | |
925 | def __del__(self): |
926 | self.close() |
927 | |
928 | def close(self): |
929 | - self.file.close() |
930 | + os.close(self.fileno) |
931 | |
932 | def wait_for(self, operation): |
933 | if self._timeout is not None: |
934 | selector = Selector() |
935 | selector.set_timeout(self._timeout) |
936 | - selector.add_fd(self.file.fileno(), operation) |
937 | + selector.add_fd(self.fileno, operation) |
938 | |
939 | selector.execute() |
940 | |
941 | @@ -49,57 +50,53 @@ |
942 | return False |
943 | return True |
944 | |
945 | + |
946 | class FifoReader(FifoBase): |
947 | |
948 | - #on Linux, opening a FIFO in read-write mode is non-blocking and |
949 | - #succeeds even if other end is not open as per FIFO(7) |
950 | - mode = "w+" |
951 | + flags = os.O_RDWR |
952 | |
953 | - def read_string(self): |
954 | + def read_bytes(self): |
955 | # Check if a connection arrived within the timeout |
956 | if not self.wait_for(SelectorIO.READ): |
957 | return None |
958 | |
959 | size = struct.calcsize("i") |
960 | - length_string = self.file.read(size) |
961 | - if not length_string: |
962 | - return "" |
963 | + length_bytes = os.read(self.fileno, size) |
964 | + if not length_bytes: |
965 | + return b"" |
966 | |
967 | - length = struct.unpack(">i", length_string)[0] |
968 | - return self.file.read(length) |
969 | + length = struct.unpack(">i", length_bytes)[0] |
970 | + return os.read(self.fileno, length) |
971 | |
972 | def read_object(self): |
973 | - string = self.read_string() |
974 | - if not string: |
975 | + _bytes = self.read_bytes() |
976 | + if not _bytes: |
977 | return None |
978 | |
979 | - return loads(string) |
980 | + return loads(_bytes) |
981 | |
982 | |
983 | class FifoWriter(FifoBase): |
984 | |
985 | - #on Linux, opening a FIFO in read-write mode is non-blocking and |
986 | - #succeeds even if other end is not open as per FIFO(7) |
987 | - mode = "w+" |
988 | - |
989 | - def write_string(self, string): |
990 | - |
991 | - # Wait until I can write |
992 | + flags = os.O_RDWR | os.O_CREAT | os.O_TRUNC |
993 | + |
994 | + def write_bytes(self, _bytes): |
995 | + |
996 | + # Wait until I can write |
997 | if not self.wait_for(SelectorIO.WRITE): |
998 | - return None |
999 | + return None |
1000 | |
1001 | - length = len(string) |
1002 | - length_string = struct.pack(">i", length) |
1003 | - self.file.write(length_string) |
1004 | - self.file.write(string) |
1005 | - self.file.flush() |
1006 | + length = len(_bytes) |
1007 | + length_bytes = struct.pack(">i", length) |
1008 | + os.write(self.fileno, length_bytes) |
1009 | + os.write(self.fileno, _bytes) |
1010 | return length |
1011 | |
1012 | def write_object(self, object): |
1013 | - string = dumps(object) |
1014 | - return self.write_string(string) |
1015 | - |
1016 | - |
1017 | -def create_fifo(path, mode=0666): |
1018 | + _bytes = dumps(object) |
1019 | + return self.write_bytes(_bytes) |
1020 | + |
1021 | + |
1022 | +def create_fifo(path, mode=0o666): |
1023 | os.mkfifo(path, mode) |
1024 | return path |
1025 | |
1026 | === modified file 'checkbox/lib/log.py' |
1027 | --- checkbox/lib/log.py 2011-07-01 11:37:27 +0000 |
1028 | +++ checkbox/lib/log.py 2012-06-23 00:59:17 +0000 |
1029 | @@ -36,7 +36,7 @@ |
1030 | if kwargs: |
1031 | args_string += ", " |
1032 | if kwargs: |
1033 | - args_string += ", ".join(["%s=%s" % (k, v) for k, v in kwargs.iteritems()]) |
1034 | + args_string += ", ".join(["%s=%s" % (k, v) for k, v in kwargs.items()]) |
1035 | |
1036 | module = object.__module__ if object.__module__ else inspect.getfile(object) |
1037 | if inspect.ismethod(object): |
1038 | |
1039 | === modified file 'checkbox/lib/path.py' |
1040 | --- checkbox/lib/path.py 2009-01-20 18:55:20 +0000 |
1041 | +++ checkbox/lib/path.py 2012-06-23 00:59:17 +0000 |
1042 | @@ -16,13 +16,13 @@ |
1043 | # You should have received a copy of the GNU General Public License |
1044 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. |
1045 | # |
1046 | -import posixpath |
1047 | +import os |
1048 | |
1049 | from glob import glob |
1050 | |
1051 | |
1052 | def path_split(path): |
1053 | - return path.split(posixpath.sep) |
1054 | + return path.split(os.path.sep) |
1055 | |
1056 | def path_common(l1, l2, common=[]): |
1057 | if len(l1) < 1: |
1058 | @@ -40,26 +40,22 @@ |
1059 | (common, l1, l2) = path_common(path_split(p1), path_split(p2)) |
1060 | p = [] |
1061 | if len(l1) > 0: |
1062 | - p = ["..%s" % posixpath.sep * len(l1)] |
1063 | + p = ["..%s" % os.path.sep * len(l1)] |
1064 | |
1065 | p = p + l2 |
1066 | - return posixpath.join( *p ) |
1067 | + return os.path.join( *p ) |
1068 | |
1069 | def path_expand(path): |
1070 | - path = posixpath.expanduser(path) |
1071 | + path = os.path.expanduser(path) |
1072 | return glob(path) |
1073 | |
1074 | def path_expand_recursive(path): |
1075 | paths = [] |
1076 | for path in path_expand(path): |
1077 | - if posixpath.isdir(path): |
1078 | - def walk_func(arg, directory, names): |
1079 | - for name in names: |
1080 | - path = posixpath.join(directory, name) |
1081 | - if not posixpath.isdir(path): |
1082 | - arg.append(path) |
1083 | - |
1084 | - posixpath.walk(path, walk_func, paths) |
1085 | + if os.path.isdir(path): |
1086 | + for dirpath, dirnames, filenames in os.walk(path): |
1087 | + for filename in filenames: |
1088 | + paths.append(os.path.join(dirpath, filename)) |
1089 | else: |
1090 | paths.append(path) |
1091 | |
1092 | |
1093 | === modified file 'checkbox/lib/process.py' |
1094 | --- checkbox/lib/process.py 2012-03-07 19:46:29 +0000 |
1095 | +++ checkbox/lib/process.py 2012-06-23 00:59:17 +0000 |
1096 | @@ -16,7 +16,7 @@ |
1097 | # You should have received a copy of the GNU General Public License |
1098 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. |
1099 | # |
1100 | -from __future__ import absolute_import |
1101 | + |
1102 | |
1103 | import os |
1104 | import time |
1105 | @@ -56,7 +56,7 @@ |
1106 | # that it would block waiting for a full BUFSIZ unless we explicitly |
1107 | # set the files non blocking, and there would be extra uneeded |
1108 | # overhead like EOL conversion. So I think it's handier to use os.read() |
1109 | - self.outdata = self.errdata = "" |
1110 | + self.outdata = self.errdata = b"" |
1111 | self.starttime = self.endtime = None |
1112 | self._outeof = self._erreof = False |
1113 | |
1114 | @@ -77,7 +77,8 @@ |
1115 | os.dup2(self.outw, STDOUT_FILENO) |
1116 | os.dup2(self.errw, STDERR_FILENO) |
1117 | # stdout and stderr connected to pipe, so close all other files |
1118 | - map(os.close, [self.outr, self.outw, self.errr, self.errw]) |
1119 | + for fileno in self.outr, self.outw, self.errr, self.errw: |
1120 | + os.close(fileno) |
1121 | try: |
1122 | cmd = ["/bin/bash", "-c", cmd] |
1123 | os.execve(cmd[0], cmd, env) |
1124 | @@ -103,12 +104,12 @@ |
1125 | else: |
1126 | if self.outr in ready[0]: |
1127 | outchunk = os.read(self.outr, self.BUFSIZ) |
1128 | - if outchunk == "": |
1129 | + if outchunk == b"": |
1130 | self._outeof = True |
1131 | self.outdata += outchunk |
1132 | if self.errr in ready[0]: |
1133 | errchunk = os.read(self.errr, self.BUFSIZ) |
1134 | - if errchunk == "": |
1135 | + if errchunk == b"": |
1136 | self._erreof = True |
1137 | self.errdata += errchunk |
1138 | if self._outeof and self._erreof: |
1139 | |
1140 | === modified file 'checkbox/lib/redirect.py' |
1141 | --- checkbox/lib/redirect.py 2010-03-09 16:58:36 +0000 |
1142 | +++ checkbox/lib/redirect.py 2012-06-23 00:59:17 +0000 |
1143 | @@ -52,28 +52,28 @@ |
1144 | file = _file_write(file) |
1145 | sys.stdout, file = file, sys.stdout |
1146 | try: |
1147 | - ret = apply(func, args) |
1148 | + ret = func(*args) |
1149 | finally: |
1150 | - print ret |
1151 | + print(ret) |
1152 | sys.stdout, file = file, sys.stdout |
1153 | return ret |
1154 | |
1155 | def redirect_to_string(func, *args): |
1156 | # apply func(*args) with stdout redirected to return string. |
1157 | file = tempfile.TemporaryFile() |
1158 | - apply(redirect_to_file, (file, func) + args) |
1159 | + redirect_to_file(*(file, func) + args) |
1160 | file.seek(0) |
1161 | return file.read() |
1162 | |
1163 | def redirect_to_lines(func, *args): |
1164 | # apply func(*args), returning a list of redirected stdout lines. |
1165 | file = tempfile.TemporaryFile() |
1166 | - apply(redirect_to_file, (file, func) + args) |
1167 | + redirect_to_file(*(file, func) + args) |
1168 | file.seek(0) |
1169 | return file.readlines() |
1170 | |
1171 | |
1172 | -class RedirectTee(object): |
1173 | +class RedirectTee: |
1174 | |
1175 | def __init__(self, *optargs): |
1176 | self._files = [] |
1177 | @@ -114,7 +114,7 @@ |
1178 | return 0 |
1179 | |
1180 | |
1181 | -class RedirectEcho(object): |
1182 | +class RedirectEcho: |
1183 | |
1184 | def __init__(self, input, *output): |
1185 | self._infile = _file_read(input) |
1186 | @@ -124,7 +124,7 @@ |
1187 | self._output = None |
1188 | |
1189 | def read(self, *howmuch): |
1190 | - stuff = apply(self._infile.read, howmuch) |
1191 | + stuff = self._infile.read(*howmuch) |
1192 | if self._output: |
1193 | self._output.write(stuff) |
1194 | return stuff |
1195 | |
1196 | === modified file 'checkbox/lib/resolver.py' |
1197 | --- checkbox/lib/resolver.py 2010-03-09 16:58:36 +0000 |
1198 | +++ checkbox/lib/resolver.py 2012-06-23 00:59:17 +0000 |
1199 | @@ -21,13 +21,10 @@ |
1200 | Main class. Instantiate with the root directory of your items. |
1201 | """ |
1202 | |
1203 | - def __init__(self, compare=None, key=None): |
1204 | - if compare is None: |
1205 | - compare = lambda a, b: cmp(a, b) |
1206 | + def __init__(self, key=None): |
1207 | if key is None: |
1208 | key = lambda k: k |
1209 | |
1210 | - self.compare = compare |
1211 | self.key = key |
1212 | |
1213 | # detect repeated resolution attempts - these indicate some circular dependency |
1214 | @@ -43,7 +40,7 @@ |
1215 | def add(self, item, *dependencies): |
1216 | key = self.key(item) |
1217 | if key in self.items: |
1218 | - raise Exception, "%s: key already exists" % key |
1219 | + raise Exception("%s: key already exists" % key) |
1220 | self.items[key] = item |
1221 | |
1222 | dependency_keys = [self.key(d) for d in dependencies] |
1223 | @@ -69,7 +66,7 @@ |
1224 | msg = "no dependencies found for %s" % key |
1225 | if found: |
1226 | msg += " while resolving %s" % found |
1227 | - raise Exception, msg |
1228 | + raise Exception(msg) |
1229 | |
1230 | dependencies = self.dependencies.get(key, set()) |
1231 | resolved = set() |
1232 | @@ -81,7 +78,7 @@ |
1233 | scapegoat = found |
1234 | else: |
1235 | scapegoat = dependency |
1236 | - raise Exception, "circular dependency involving %s and %s" % (key, scapegoat) |
1237 | + raise Exception("circular dependency involving %s and %s" % (key, scapegoat)) |
1238 | # add resolution |
1239 | self.reentrant_resolution.add(resolution_step) |
1240 | # and its dependencies, if any |
1241 | @@ -104,18 +101,14 @@ |
1242 | if item: |
1243 | # Immediate dependents |
1244 | key = self.key(item) |
1245 | - all_dependents = filter( |
1246 | - lambda x: key in self.resolve(x)[:-1], |
1247 | - self.items.itervalues()) |
1248 | - dependents = filter( |
1249 | - lambda x: self.key(self.get_dependencies(x)[-2]) == key, |
1250 | - all_dependents) |
1251 | + all_dependents = [x for x in iter(self.items.values()) if key in self.resolve(x)[:-1]] |
1252 | + dependents = [x for x in all_dependents if self.key(self.get_dependencies(x)[-2]) == key] |
1253 | else: |
1254 | # First level of dependents |
1255 | - dependents = filter(lambda x: len(self.resolve(x)) == 1, self.items.itervalues()) |
1256 | + dependents = [x for x in iter(self.items.values()) if len(self.resolve(x)) == 1] |
1257 | |
1258 | index = 0 |
1259 | - dependents = sorted(dependents, self.compare) |
1260 | + dependents = sorted(dependents) |
1261 | while index < len(dependents): |
1262 | sub_dependents = self.get_dependents(dependents[index]) |
1263 | if sub_dependents: |
1264 | |
1265 | === modified file 'checkbox/lib/safe.py' |
1266 | --- checkbox/lib/safe.py 2012-02-23 11:56:50 +0000 |
1267 | +++ checkbox/lib/safe.py 2012-06-23 00:59:17 +0000 |
1268 | @@ -17,72 +17,70 @@ |
1269 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. |
1270 | # |
1271 | import os |
1272 | -import posixpath |
1273 | +import hashlib |
1274 | import shutil |
1275 | |
1276 | from stat import ST_MODE, S_IMODE, S_ISFIFO |
1277 | |
1278 | |
1279 | def safe_change_mode(path, mode): |
1280 | - if not posixpath.exists(path): |
1281 | - raise Exception, "Path does not exist: %s" % path |
1282 | + if not os.path.exists(path): |
1283 | + raise Exception("Path does not exist: %s" % path) |
1284 | |
1285 | old_mode = os.stat(path)[ST_MODE] |
1286 | if mode != S_IMODE(old_mode): |
1287 | os.chmod(path, mode) |
1288 | |
1289 | -def safe_make_directory(path, mode=0755): |
1290 | - if posixpath.exists(path): |
1291 | - if not posixpath.isdir(path): |
1292 | - raise Exception, "Path is not a directory: %s" % path |
1293 | +def safe_make_directory(path, mode=0o755): |
1294 | + if os.path.exists(path): |
1295 | + if not os.path.isdir(path): |
1296 | + raise Exception("Path is not a directory: %s" % path) |
1297 | else: |
1298 | os.makedirs(path, mode) |
1299 | |
1300 | -def safe_make_fifo(path, mode=0666): |
1301 | - if posixpath.exists(path): |
1302 | +def safe_make_fifo(path, mode=0o666): |
1303 | + if os.path.exists(path): |
1304 | mode = os.stat(path)[ST_MODE] |
1305 | if not S_ISFIFO(mode): |
1306 | - raise Exception, "Path is not a FIFO: %s" % path |
1307 | + raise Exception("Path is not a FIFO: %s" % path) |
1308 | else: |
1309 | os.mkfifo(path, mode) |
1310 | |
1311 | def safe_remove_directory(path): |
1312 | - if posixpath.exists(path): |
1313 | - if not posixpath.isdir(path): |
1314 | - raise Exception, "Path is not a directory: %s" % path |
1315 | + if os.path.exists(path): |
1316 | + if not os.path.isdir(path): |
1317 | + raise Exception("Path is not a directory: %s" % path) |
1318 | |
1319 | shutil.rmtree(path) |
1320 | |
1321 | def safe_remove_file(path): |
1322 | - if posixpath.exists(path): |
1323 | - if not posixpath.isfile(path): |
1324 | - raise Exception, "Path is not a file: %s" % path |
1325 | + if os.path.exists(path): |
1326 | + if not os.path.isfile(path): |
1327 | + raise Exception("Path is not a file: %s" % path) |
1328 | |
1329 | os.remove(path) |
1330 | |
1331 | def safe_rename(old, new): |
1332 | if old != new: |
1333 | - if not posixpath.exists(old): |
1334 | - raise Exception, "Old path does not exist: %s" % old |
1335 | - if posixpath.exists(new): |
1336 | - raise Exception, "New path exists already: %s" % new |
1337 | + if not os.path.exists(old): |
1338 | + raise Exception("Old path does not exist: %s" % old) |
1339 | + if os.path.exists(new): |
1340 | + raise Exception("New path exists already: %s" % new) |
1341 | |
1342 | os.rename(old, new) |
1343 | |
1344 | -def safe_md5sum(): |
1345 | - try: |
1346 | - import hashlib |
1347 | - digest = hashlib.md5() |
1348 | - except ImportError: |
1349 | - # for Python << 2.5 |
1350 | - import md5 |
1351 | - digest = md5.new() |
1352 | - |
1353 | - return digest |
1354 | +class safe_md5sum: |
1355 | + |
1356 | + def __init__(self): |
1357 | + self.digest = hashlib.md5() |
1358 | + self.hexdigest = self.digest.hexdigest |
1359 | + |
1360 | + def update(self, string): |
1361 | + self.digest.update(string.encode("utf-8")) |
1362 | |
1363 | def safe_md5sum_file(name): |
1364 | md5sum = None |
1365 | - if posixpath.exists(name): |
1366 | + if os.path.exists(name): |
1367 | file = open(name) |
1368 | digest = safe_md5sum() |
1369 | while 1: |
1370 | |
1371 | === modified file 'checkbox/lib/script.py' |
1372 | --- checkbox/lib/script.py 2009-01-20 18:55:20 +0000 |
1373 | +++ checkbox/lib/script.py 2012-06-23 00:59:17 +0000 |
1374 | @@ -26,8 +26,8 @@ |
1375 | if not posixpath.exists(path): |
1376 | path = get_path(script) |
1377 | if not path: |
1378 | - raise Exception, "Script not found in PATH: %s" % script |
1379 | + raise Exception("Script not found in PATH: %s" % script) |
1380 | |
1381 | globals = {} |
1382 | - execfile(path, globals) |
1383 | + exec(compile(open(path).read(), path, 'exec'), globals) |
1384 | return globals |
1385 | |
1386 | === modified file 'checkbox/lib/selector.py' |
1387 | --- checkbox/lib/selector.py 2011-06-13 14:22:39 +0000 |
1388 | +++ checkbox/lib/selector.py 2012-06-23 00:59:17 +0000 |
1389 | @@ -39,7 +39,7 @@ |
1390 | "FAILED") |
1391 | |
1392 | |
1393 | -class Selector(object): |
1394 | +class Selector: |
1395 | __slots__ = ("_read_fds", "_write_fds", "_except_fds", |
1396 | "_save_read_fds", "_save_write_fds", "_save_except_fds", |
1397 | "_fd_set_size", "_timeout", "_state", "_errno") |
1398 | @@ -166,7 +166,7 @@ |
1399 | self._read_fds, self._write_fds, self._except_fds = select.select( |
1400 | self._save_read_fds, self._save_write_fds, |
1401 | self._save_except_fds, self._timeout) |
1402 | - except select.error, e: |
1403 | + except select.error as e: |
1404 | self._errno = e.errno |
1405 | if e.errno == errno.EINTR: |
1406 | self._state = SelectorState.SIGNALED |
1407 | |
1408 | === modified file 'checkbox/lib/signal.py' |
1409 | --- checkbox/lib/signal.py 2009-03-31 13:54:12 +0000 |
1410 | +++ checkbox/lib/signal.py 2012-06-23 00:59:17 +0000 |
1411 | @@ -72,7 +72,7 @@ |
1412 | signal -- number of the signal as returned by wait |
1413 | """ |
1414 | |
1415 | - if signal_name_table.has_key(signal): |
1416 | + if signal in signal_name_table: |
1417 | return signal_name_table[signal] |
1418 | return _("UNKNOWN") |
1419 | |
1420 | @@ -84,6 +84,6 @@ |
1421 | """ |
1422 | |
1423 | name = signal_to_name(signal) |
1424 | - if signal_description_table.has_key(name): |
1425 | + if name in signal_description_table: |
1426 | return signal_description_table[name] |
1427 | return _("Unknown signal") |
1428 | |
1429 | === modified file 'checkbox/lib/template.py' |
1430 | --- checkbox/lib/template.py 2011-11-18 12:46:21 +0000 |
1431 | +++ checkbox/lib/template.py 2012-06-23 00:59:17 +0000 |
1432 | @@ -23,7 +23,7 @@ |
1433 | EXTENDED_STRING = "_extended" |
1434 | |
1435 | |
1436 | -class Template(object): |
1437 | +class Template: |
1438 | |
1439 | def _reader(self, file, size=4096, delimiter=r"\n{2,}"): |
1440 | buffer_old = "" |
1441 | @@ -42,7 +42,7 @@ |
1442 | |
1443 | def dump_file(self, elements, file, filename="<stream>"): |
1444 | for element in elements: |
1445 | - for long_key in element.keys(): |
1446 | + for long_key in list(element.keys()): |
1447 | if long_key.endswith(EXTENDED_STRING): |
1448 | short_key = long_key.replace(EXTENDED_STRING, "") |
1449 | del element[short_key] |
1450 | @@ -79,11 +79,10 @@ |
1451 | def _save(field, value, extended): |
1452 | extended = extended.rstrip("\n") |
1453 | if field: |
1454 | - if element.has_key(field): |
1455 | - raise Exception, \ |
1456 | - "Template %s has a duplicate field '%s'" \ |
1457 | + if field in element: |
1458 | + raise Exception("Template %s has a duplicate field '%s'" \ |
1459 | " with a new value '%s'." \ |
1460 | - % (filename, field, value) |
1461 | + % (filename, field, value)) |
1462 | element[field] = value |
1463 | if extended: |
1464 | element["%s%s" % (field, EXTENDED_STRING)] = extended |
1465 | @@ -128,8 +127,8 @@ |
1466 | extended += bit |
1467 | continue |
1468 | |
1469 | - raise Exception, "Template %s parse error at: %s" \ |
1470 | - % (filename, line) |
1471 | + raise Exception("Template %s parse error at: %s" \ |
1472 | + % (filename, line)) |
1473 | |
1474 | _save(field, value, extended) |
1475 | |
1476 | @@ -140,5 +139,5 @@ |
1477 | def load_filename(self, filename): |
1478 | logging.info("Loading elements from filename: %s", filename) |
1479 | |
1480 | - file = open(filename, "r") |
1481 | + file = open(filename, "r", encoding="utf-8") |
1482 | return self.load_file(file, filename) |
1483 | |
1484 | === modified file 'checkbox/lib/template_i18n.py' |
1485 | --- checkbox/lib/template_i18n.py 2012-02-10 11:19:05 +0000 |
1486 | +++ checkbox/lib/template_i18n.py 2012-06-23 00:59:17 +0000 |
1487 | @@ -53,7 +53,7 @@ |
1488 | |
1489 | language_match = re.match(r"([^_@.]+)(_[^_@.]+)?(\..+)?", language) |
1490 | if not language_match: |
1491 | - raise Exception, "Unknown language format: %s" % language |
1492 | + raise Exception("Unknown language format: %s" % language) |
1493 | |
1494 | ret = [language_match.group(1)] |
1495 | if modifier_match: |
1496 | @@ -75,7 +75,7 @@ |
1497 | |
1498 | def _get_languages(self): |
1499 | languages = [] |
1500 | - if environ.has_key("LANGUAGE") and environ["LANGUAGE"]: |
1501 | + if "LANGUAGE" in environ and environ["LANGUAGE"]: |
1502 | for language in environ["LANGUAGE"].split(":"): |
1503 | if language: |
1504 | languages.extend(self._get_language_list(language)) |
1505 | @@ -96,11 +96,11 @@ |
1506 | def _filter_languages(self, element): |
1507 | filter = {} |
1508 | basekeys = {} |
1509 | - for key in element.iterkeys(): |
1510 | + for key in element.keys(): |
1511 | basekey = re.sub(r"^_?([^-]+).*$", "\\1", key) |
1512 | basekeys[basekey] = None |
1513 | |
1514 | - for key in basekeys.iterkeys(): |
1515 | + for key in basekeys.keys(): |
1516 | if self._languages: |
1517 | for language in self._languages: |
1518 | field = "%s-%s" % (key, language) |
1519 | @@ -124,7 +124,7 @@ |
1520 | filter[key] = self._filter_field(element[field]) |
1521 | continue |
1522 | |
1523 | - raise Exception, "No language found for key: %s" % key |
1524 | + raise Exception("No language found for key: %s" % key) |
1525 | |
1526 | return filter |
1527 | |
1528 | |
1529 | === modified file 'checkbox/lib/tests/resolver.py' |
1530 | --- checkbox/lib/tests/resolver.py 2009-08-19 15:36:05 +0000 |
1531 | +++ checkbox/lib/tests/resolver.py 2012-06-23 00:59:17 +0000 |
1532 | @@ -26,7 +26,7 @@ |
1533 | resolver = Resolver() |
1534 | try: |
1535 | resolver.get_dependencies('a') |
1536 | - except Exception, error: |
1537 | + except Exception as error: |
1538 | self.assertTrue(error.args[0].startswith('no dependencies')) |
1539 | else: |
1540 | self.fail('non existing element accepted by resolver') |
1541 | @@ -67,7 +67,7 @@ |
1542 | resolver.add('b', 'a') |
1543 | try: |
1544 | resolver.get_dependencies('a') |
1545 | - except Exception, error: |
1546 | + except Exception as error: |
1547 | self.assertTrue(error.args[0].startswith('circular dependency')) |
1548 | else: |
1549 | self.fail('circular dependency not detected') |
1550 | |
1551 | === modified file 'checkbox/lib/transport.py' |
1552 | --- checkbox/lib/transport.py 2011-09-29 13:12:01 +0000 |
1553 | +++ checkbox/lib/transport.py 2012-06-23 00:59:17 +0000 |
1554 | @@ -22,101 +22,67 @@ |
1555 | import re |
1556 | import stat |
1557 | import sys |
1558 | -import posixpath |
1559 | |
1560 | -import mimetools |
1561 | +import email.generator |
1562 | +import http.client |
1563 | import mimetypes |
1564 | import socket |
1565 | -import httplib |
1566 | -import urllib |
1567 | - |
1568 | - |
1569 | -# Build the appropriate socket wrapper for ssl |
1570 | -try: |
1571 | - # Python 2.6 introduced a better ssl package |
1572 | - import ssl |
1573 | - _ssl_wrap_socket = ssl.wrap_socket |
1574 | -except ImportError: |
1575 | - # Python versions prior to 2.6 don't have ssl and ssl.wrap_socket instead |
1576 | - # they use httplib.FakeSocket |
1577 | - def _ssl_wrap_socket(sock, key_file, cert_file): |
1578 | - ssl_sock = socket.ssl(sock, key_file, cert_file) |
1579 | - return httplib.FakeSocket(sock, ssl_sock) |
1580 | - |
1581 | -try: |
1582 | - # Python 2.6 introduced create_connection convenience function |
1583 | - create_connection = socket.create_connection |
1584 | -except AttributeError: |
1585 | - def create_connection(address, timeout=None): |
1586 | - msg = "getaddrinfo returns an empty list" |
1587 | - host, port = address |
1588 | - for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM): |
1589 | - af, socktype, proto, canonname, sa = res |
1590 | - sock = None |
1591 | - try: |
1592 | - sock = socket.socket(af, socktype, proto) |
1593 | - if timeout is not None: |
1594 | - sock.settimeout(timeout) |
1595 | - sock.connect(sa) |
1596 | - return sock |
1597 | - |
1598 | - except socket.error, msg: |
1599 | - if sock is not None: |
1600 | - sock.close() |
1601 | - |
1602 | - raise socket.error, msg |
1603 | - |
1604 | - |
1605 | -class ProxyHTTPConnection(httplib.HTTPConnection): |
1606 | - |
1607 | - _ports = {"http" : httplib.HTTP_PORT, "https" : httplib.HTTPS_PORT} |
1608 | +import ssl |
1609 | +import urllib.request, urllib.parse, urllib.error |
1610 | + |
1611 | + |
1612 | +class ProxyHTTPConnection(http.client.HTTPConnection): |
1613 | + |
1614 | + _ports = {"http": http.client.HTTP_PORT, "https": http.client.HTTPS_PORT} |
1615 | |
1616 | def request(self, method, url, body=None, headers={}): |
1617 | #request is called before connect, so can interpret url and get |
1618 | #real host/port to be used to make CONNECT request to proxy |
1619 | - scheme, rest = urllib.splittype(url) |
1620 | + scheme, rest = urllib.parse.splittype(url) |
1621 | if scheme is None: |
1622 | - raise ValueError, "unknown URL type: %s" % url |
1623 | + raise ValueError("unknown URL type: %s" % url) |
1624 | #get host |
1625 | - host, rest = urllib.splithost(rest) |
1626 | + host, rest = urllib.parse.splithost(rest) |
1627 | #try to get port |
1628 | - host, port = urllib.splitport(host) |
1629 | + host, port = urllib.parse.splitport(host) |
1630 | #if port is not defined try to get from scheme |
1631 | if port is None: |
1632 | try: |
1633 | port = self._ports[scheme] |
1634 | except KeyError: |
1635 | - raise ValueError, "unknown protocol for: %s" % url |
1636 | + raise ValueError("unknown protocol for: %s" % url) |
1637 | else: |
1638 | port = int(port) |
1639 | |
1640 | self._real_host = host |
1641 | self._real_port = port |
1642 | - httplib.HTTPConnection.request(self, method, url, body, headers) |
1643 | + http.client.HTTPConnection.request(self, method, url, body, headers) |
1644 | |
1645 | def connect(self): |
1646 | - httplib.HTTPConnection.connect(self) |
1647 | + http.client.HTTPConnection.connect(self) |
1648 | #send proxy CONNECT request |
1649 | - self.send("CONNECT %s:%d HTTP/1.0\r\n\r\n" % (self._real_host, self._real_port)) |
1650 | + self.send(( |
1651 | + "CONNECT %s:%d HTTP/1.0\r\n\r\n" % (self._real_host, self._real_port) |
1652 | + ).encode("ascii")) |
1653 | #expect a HTTP/1.0 200 Connection established |
1654 | - response = self.response_class(self.sock, strict=self.strict, method=self._method) |
1655 | + response = self.response_class(self.sock, method=self._method) |
1656 | (version, code, message) = response._read_status() |
1657 | #probably here we can handle auth requests... |
1658 | if code != 200: |
1659 | #proxy returned and error, abort connection, and raise exception |
1660 | self.close() |
1661 | - raise socket.error, "Proxy connection failed: %d %s" % (code, message.strip()) |
1662 | + raise socket.error("Proxy connection failed: %d %s" % (code, message.strip())) |
1663 | #eat up header block from proxy.... |
1664 | while True: |
1665 | - #should not use directly fp probablu |
1666 | + #should not use directly fp probably |
1667 | line = response.fp.readline() |
1668 | - if line == "\r\n": |
1669 | + if line == b"\r\n": |
1670 | break |
1671 | |
1672 | |
1673 | class ProxyHTTPSConnection(ProxyHTTPConnection): |
1674 | |
1675 | - default_port = httplib.HTTPS_PORT |
1676 | + default_port = http.client.HTTPS_PORT |
1677 | |
1678 | def __init__(self, host, port=None, key_file=None, cert_file=None, strict=None): |
1679 | ProxyHTTPConnection.__init__(self, host, port) |
1680 | @@ -125,10 +91,10 @@ |
1681 | |
1682 | def connect(self): |
1683 | ProxyHTTPConnection.connect(self) |
1684 | - self.sock = _ssl_wrap_socket(self.sock, self.key_file, self.cert_file) |
1685 | - |
1686 | - |
1687 | -class VerifiedHTTPSConnection(httplib.HTTPSConnection): |
1688 | + self.sock = ssl.wrap_socket(self.sock, self.key_file, self.cert_file) |
1689 | + |
1690 | + |
1691 | +class VerifiedHTTPSConnection(http.client.HTTPSConnection): |
1692 | |
1693 | # Compatibility layer with Python 2.5 |
1694 | timeout = None |
1695 | @@ -163,14 +129,14 @@ |
1696 | def connect(self): |
1697 | # overrides the version in httplib so that we do |
1698 | # certificate verification |
1699 | - sock = create_connection((self.host, self.port), self.timeout) |
1700 | + sock = socket.create_connection((self.host, self.port), self.timeout) |
1701 | if self._tunnel_host: |
1702 | self.sock = sock |
1703 | self._tunnel() |
1704 | |
1705 | # wrap the socket using verification with the root |
1706 | # certs in trusted_root_certs |
1707 | - self.sock = _ssl_wrap_socket(sock, |
1708 | + self.sock = ssl.wrap_socket(sock, |
1709 | self.key_file, |
1710 | self.cert_file, |
1711 | cert_reqs=ssl.CERT_REQUIRED, |
1712 | @@ -181,20 +147,20 @@ |
1713 | "Failed to verify cert for hostname: %s" % self.host) |
1714 | |
1715 | |
1716 | -class HTTPTransport(object): |
1717 | +class HTTPTransport: |
1718 | """Transport makes a request to exchange message data over HTTP.""" |
1719 | |
1720 | def __init__(self, url): |
1721 | self.url = url |
1722 | |
1723 | - proxies = urllib.getproxies() |
1724 | + proxies = urllib.request.getproxies() |
1725 | self.http_proxy = proxies.get("http") |
1726 | self.https_proxy = proxies.get("https") |
1727 | |
1728 | def _unpack_host_and_port(self, string): |
1729 | - scheme, rest = urllib.splittype(string) |
1730 | - host, rest = urllib.splithost(rest) |
1731 | - host, port = urllib.splitport(host) |
1732 | + scheme, rest = urllib.parse.splittype(string) |
1733 | + host, rest = urllib.parse.splithost(rest) |
1734 | + host, port = urllib.parse.splitport(host) |
1735 | if port is not None: |
1736 | port = int(port) |
1737 | |
1738 | @@ -204,14 +170,14 @@ |
1739 | if timeout: |
1740 | socket.setdefaulttimeout(timeout) |
1741 | |
1742 | - scheme, rest = urllib.splittype(self.url) |
1743 | + scheme, rest = urllib.parse.splittype(self.url) |
1744 | if scheme == "http": |
1745 | if self.http_proxy: |
1746 | host, port = self._unpack_host_and_port(self.http_proxy) |
1747 | else: |
1748 | host, port = self._unpack_host_and_port(self.url) |
1749 | |
1750 | - connection = httplib.HTTPConnection(host, port) |
1751 | + connection = http.client.HTTPConnection(host, port) |
1752 | elif scheme == "https": |
1753 | if self.https_proxy: |
1754 | host, port = self._unpack_host_and_port(self.https_proxy) |
1755 | @@ -220,18 +186,18 @@ |
1756 | host, port = self._unpack_host_and_port(self.url) |
1757 | connection = VerifiedHTTPSConnection(host, port) |
1758 | else: |
1759 | - raise Exception, "Unknown URL scheme: %s" % scheme |
1760 | + raise Exception("Unknown URL scheme: %s" % scheme) |
1761 | |
1762 | return connection |
1763 | |
1764 | def _encode_multipart_formdata(self, fields=[], files=[]): |
1765 | - boundary = mimetools.choose_boundary() |
1766 | + boundary = email.generator._make_boundary().encode("ascii") |
1767 | |
1768 | lines = [] |
1769 | for (key, value) in fields: |
1770 | - lines.append("--" + boundary) |
1771 | - lines.append("Content-Disposition: form-data; name=\"%s\"" % key) |
1772 | - lines.append("") |
1773 | + lines.append(b"--" + boundary) |
1774 | + lines.append(b"Content-Disposition: form-data; name=\"" + key + b"\"") |
1775 | + lines.append(b"") |
1776 | lines.append(value) |
1777 | |
1778 | for (key, file) in files: |
1779 | @@ -240,27 +206,30 @@ |
1780 | else: |
1781 | length = os.fstat(file.fileno())[stat.ST_SIZE] |
1782 | |
1783 | - filename = posixpath.basename(file.name) |
1784 | - if isinstance(filename, unicode): |
1785 | - filename = filename.encode("UTF-8") |
1786 | - |
1787 | - lines.append("--" + boundary) |
1788 | - lines.append("Content-Disposition: form-data; name=\"%s\"; filename=\"%s\"" |
1789 | - % (key, filename)) |
1790 | - lines.append("Content-Type: %s" |
1791 | - % mimetypes.guess_type(filename)[0] or "application/octet-stream") |
1792 | - lines.append("Content-Length: %s" % length) |
1793 | - lines.append("") |
1794 | + content_type = mimetypes.guess_type(file.name)[0] |
1795 | + if content_type: |
1796 | + content_type = content_type.encode("ascii") |
1797 | + else: |
1798 | + content_type = b"application/octet-stream" |
1799 | + |
1800 | + filename = os.path.basename(file.name) |
1801 | + filename = filename.encode("utf-8") |
1802 | + |
1803 | + lines.append(b"--" + boundary) |
1804 | + lines.append(b"Content-Disposition: form-data; name=\"" + key + b"\"; filename=\"" + filename + b"\"") |
1805 | + lines.append(b"Content-Type: " + content_type) |
1806 | + lines.append(b"Content-Length: " + str(length).encode("ascii")) |
1807 | + lines.append(b"") |
1808 | |
1809 | if hasattr(file, "seek"): |
1810 | file.seek(0) |
1811 | lines.append(file.read()) |
1812 | |
1813 | - lines.append("--" + boundary + "--") |
1814 | - lines.append("") |
1815 | + lines.append(b"--" + boundary + b"--") |
1816 | + lines.append(b"") |
1817 | |
1818 | - content_type = "multipart/form-data; boundary=%s" % boundary |
1819 | - body = "\r\n".join(lines) |
1820 | + content_type = b"multipart/form-data; boundary=" + boundary |
1821 | + body = b"\r\n".join(lines) |
1822 | |
1823 | return content_type, body |
1824 | |
1825 | @@ -268,33 +237,34 @@ |
1826 | fields = [] |
1827 | files = [] |
1828 | |
1829 | - content_type = "application/octet-stream" |
1830 | - if body is not None and type(body) != str: |
1831 | + content_type = b"application/octet-stream" |
1832 | + if body is not None and type(body) != bytes: |
1833 | if hasattr(body, "items"): |
1834 | - body = body.items() |
1835 | + body = list(body.items()) |
1836 | else: |
1837 | try: |
1838 | if len(body) and not isinstance(body[0], tuple): |
1839 | raise TypeError |
1840 | except TypeError: |
1841 | ty, va, tb = sys.exc_info() |
1842 | - raise TypeError, \ |
1843 | - "Invalid non-string sequence or mapping", tb |
1844 | + raise TypeError("Invalid non-string sequence or mapping").with_traceback(tb) |
1845 | |
1846 | for key, value in body: |
1847 | + key = key.encode("ascii") |
1848 | if hasattr(value, "read"): |
1849 | files.append((key, value)) |
1850 | else: |
1851 | + value = value.encode("utf-8") |
1852 | fields.append((key, value)) |
1853 | |
1854 | if files: |
1855 | - content_type, body = self._encode_multipart_formdata(fields, |
1856 | - files) |
1857 | + content_type, body = self._encode_multipart_formdata( |
1858 | + fields, files) |
1859 | elif fields: |
1860 | - content_type = "application/x-www-form-urlencoded" |
1861 | - body = urllib.urlencode(fields) |
1862 | + content_type = b"application/x-www-form-urlencoded" |
1863 | + body = urllib.parse.urlencode(fields).encode("utf-8") |
1864 | else: |
1865 | - body = "" |
1866 | + body = b"" |
1867 | |
1868 | return content_type, body |
1869 | |
1870 | @@ -325,10 +295,10 @@ |
1871 | else: |
1872 | try: |
1873 | response = connection.getresponse() |
1874 | - except httplib.BadStatusLine: |
1875 | + except http.client.BadStatusLine: |
1876 | logging.warning("Service unavailable on %s", self.url) |
1877 | else: |
1878 | - if response.status == httplib.FOUND: |
1879 | + if response.status == http.client.FOUND: |
1880 | # TODO prevent infinite redirect loop |
1881 | self.url = response.getheader('location') |
1882 | response = self.exchange(body, headers, timeout) |
1883 | |
1884 | === added file 'checkbox/lib/tz.py' |
1885 | --- checkbox/lib/tz.py 1970-01-01 00:00:00 +0000 |
1886 | +++ checkbox/lib/tz.py 2012-06-23 00:59:17 +0000 |
1887 | @@ -0,0 +1,55 @@ |
1888 | +# |
1889 | +# This file is part of Checkbox. |
1890 | +# |
1891 | +# Copyright 2012 Canonical Ltd. |
1892 | +# |
1893 | +# Checkbox is free software: you can redistribute it and/or modify |
1894 | +# it under the terms of the GNU General Public License as published by |
1895 | +# the Free Software Foundation, either version 3 of the License, or |
1896 | +# (at your option) any later version. |
1897 | +# |
1898 | +# Checkbox is distributed in the hope that it will be useful, |
1899 | +# but WITHOUT ANY WARRANTY; without even the implied warranty of |
1900 | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
1901 | +# GNU General Public License for more details. |
1902 | +# |
1903 | +# You should have received a copy of the GNU General Public License |
1904 | +# along with Checkbox. If not, see <http://www.gnu.org/licenses/>. |
1905 | +# |
1906 | +__all__ = [ |
1907 | + "tzutc", |
1908 | + ] |
1909 | + |
1910 | +from datetime import ( |
1911 | + timedelta, |
1912 | + tzinfo, |
1913 | + ) |
1914 | + |
1915 | + |
1916 | +ZERO = timedelta(0) |
1917 | + |
1918 | + |
1919 | +class _tzutc(tzinfo): |
1920 | + |
1921 | + def utcoffset(self, dt): |
1922 | + return ZERO |
1923 | + |
1924 | + def dst(self, dt): |
1925 | + return ZERO |
1926 | + |
1927 | + def tzname(self, dt): |
1928 | + return "UTC" |
1929 | + |
1930 | + def __eq__(self, other): |
1931 | + return isinstance(other, tzutc) |
1932 | + |
1933 | + def __ne__(self, other): |
1934 | + return not self.__eq__(other) |
1935 | + |
1936 | + def __repr__(self): |
1937 | + return "%s()" % self.__class__.__name__ |
1938 | + |
1939 | + __reduce__ = object.__reduce__ |
1940 | + |
1941 | + |
1942 | +tzutc = _tzutc() |
1943 | |
1944 | === modified file 'checkbox/lib/update.py' |
1945 | --- checkbox/lib/update.py 2009-01-20 18:55:20 +0000 |
1946 | +++ checkbox/lib/update.py 2012-06-23 00:59:17 +0000 |
1947 | @@ -17,7 +17,7 @@ |
1948 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. |
1949 | # |
1950 | def recursive_update(dst, src): |
1951 | - irecursive_update(dst, list(src.iteritems())) |
1952 | + irecursive_update(dst, list(src.items())) |
1953 | return dst |
1954 | |
1955 | def irecursive_update(a, blist): |
1956 | @@ -37,6 +37,6 @@ |
1957 | while not blist: |
1958 | blist, a = stack.pop() # current <- parent |
1959 | continue |
1960 | - blist, a = list(bv.iteritems()), a[bk] |
1961 | + blist, a = list(bv.items()), a[bk] |
1962 | except IndexError: |
1963 | pass |
1964 | |
1965 | === modified file 'checkbox/lib/url.py' |
1966 | --- checkbox/lib/url.py 2009-08-19 15:36:05 +0000 |
1967 | +++ checkbox/lib/url.py 2012-06-23 00:59:17 +0000 |
1968 | @@ -16,11 +16,11 @@ |
1969 | # You should have received a copy of the GNU General Public License |
1970 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. |
1971 | # |
1972 | -import urlparse |
1973 | +import urllib.parse |
1974 | |
1975 | |
1976 | def parse_url(url): |
1977 | - scheme, host, path, params, query, fragment = urlparse.urlparse(url) |
1978 | + scheme, host, path, params, query, fragment = urllib.parse.urlparse(url) |
1979 | |
1980 | if "@" in host: |
1981 | username, host = host.rsplit("@", 1) |
1982 | |
1983 | === modified file 'checkbox/message.py' |
1984 | --- checkbox/message.py 2012-02-23 11:56:50 +0000 |
1985 | +++ checkbox/message.py 2012-06-23 00:59:17 +0000 |
1986 | @@ -38,7 +38,7 @@ |
1987 | self.filename = filename |
1988 | |
1989 | |
1990 | -class MessageStore(object): |
1991 | +class MessageStore: |
1992 | """A message store which stores its messages in a file system hierarchy.""" |
1993 | |
1994 | #This caches everything but a message's data, making it manageable to keep in memory. |
1995 | @@ -108,7 +108,7 @@ |
1996 | break |
1997 | try: |
1998 | message = self._read_message(filename) |
1999 | - except ValueError, e: |
2000 | + except ValueError as e: |
2001 | logging.exception(e) |
2002 | self._add_flags(filename, BROKEN) |
2003 | else: |
2004 | @@ -219,7 +219,7 @@ |
2005 | return posixpath.join(self._directory, *args) |
2006 | |
2007 | def _get_content(self, filename): |
2008 | - file = open(filename) |
2009 | + file = open(filename, "rb") |
2010 | try: |
2011 | return file.read() |
2012 | finally: |
2013 | @@ -263,7 +263,7 @@ |
2014 | |
2015 | message_data = self._dump_message(message) |
2016 | |
2017 | - file = open(filename + ".tmp", "w") |
2018 | + file = open(filename + ".tmp", "wb") |
2019 | file.write(message_data) |
2020 | safe_close(file, safe=self.safe_file_closing) |
2021 | |
2022 | |
2023 | === modified file 'checkbox/parsers/cpuinfo.py' |
2024 | --- checkbox/parsers/cpuinfo.py 2011-11-18 12:46:21 +0000 |
2025 | +++ checkbox/parsers/cpuinfo.py 2012-06-23 00:59:17 +0000 |
2026 | @@ -130,9 +130,9 @@ |
2027 | processor["count"] = attributes.get("count", 1) |
2028 | bogompips_string = attributes.get("bogomips", "0.0") |
2029 | processor["bogomips"] = int(round(float(bogompips_string))) |
2030 | - for platform, conversion in platform_to_conversion.iteritems(): |
2031 | + for platform, conversion in platform_to_conversion.items(): |
2032 | if machine in platform: |
2033 | - for pkey, ckey in conversion.iteritems(): |
2034 | + for pkey, ckey in conversion.items(): |
2035 | if isinstance(ckey, (list, tuple)): |
2036 | processor[pkey] = "/".join([attributes[k] |
2037 | for k in ckey]) |
2038 | @@ -141,9 +141,9 @@ |
2039 | |
2040 | # Adjust platform |
2041 | if machine[0] == "i" and machine[-2:] == "86": |
2042 | - processor["platform"] = u"i386" |
2043 | + processor["platform"] = "i386" |
2044 | elif machine[:5] == "alpha": |
2045 | - processor["platform"] = u"alpha" |
2046 | + processor["platform"] = "alpha" |
2047 | |
2048 | # Adjust cache |
2049 | if processor["cache"]: |
2050 | |
2051 | === modified file 'checkbox/parsers/device.py' |
2052 | --- checkbox/parsers/device.py 2011-06-13 14:22:39 +0000 |
2053 | +++ checkbox/parsers/device.py 2012-06-23 00:59:17 +0000 |
2054 | @@ -18,7 +18,7 @@ |
2055 | # |
2056 | |
2057 | |
2058 | -class DeviceResult(object): |
2059 | +class DeviceResult: |
2060 | |
2061 | def addDevice(self, device): |
2062 | pass |
2063 | |
2064 | === modified file 'checkbox/parsers/dmidecode.py' |
2065 | --- checkbox/parsers/dmidecode.py 2011-11-18 12:46:21 +0000 |
2066 | +++ checkbox/parsers/dmidecode.py 2012-06-23 00:59:17 +0000 |
2067 | @@ -20,7 +20,7 @@ |
2068 | |
2069 | from string import ( |
2070 | hexdigits, |
2071 | - uppercase, |
2072 | + ascii_uppercase, |
2073 | ) |
2074 | |
2075 | from checkbox.lib.dmi import ( |
2076 | @@ -36,7 +36,7 @@ |
2077 | % hexdigits) |
2078 | KEY_VALUE_RE = re.compile( |
2079 | r"^\t(?P<key>[%s].+):( (?P<value>.+))?$" |
2080 | - % uppercase) |
2081 | + % ascii_uppercase) |
2082 | |
2083 | |
2084 | class DmidecodeParser: |
2085 | |
2086 | === modified file 'checkbox/parsers/submission.py' |
2087 | --- checkbox/parsers/submission.py 2012-02-10 11:19:05 +0000 |
2088 | +++ checkbox/parsers/submission.py 2012-06-23 00:59:17 +0000 |
2089 | @@ -21,7 +21,7 @@ |
2090 | except ImportError: |
2091 | import cElementTree as etree |
2092 | |
2093 | -from StringIO import StringIO |
2094 | +from io import StringIO |
2095 | from logging import getLogger |
2096 | from pkg_resources import resource_string |
2097 | |
2098 | @@ -103,7 +103,7 @@ |
2099 | } |
2100 | parser = parsers.get(command) |
2101 | if parser: |
2102 | - if not isinstance(text, unicode): |
2103 | + if not isinstance(text, str): |
2104 | text = text.decode("utf-8") |
2105 | stream = StringIO(text) |
2106 | p = parser(stream) |
2107 | @@ -291,7 +291,7 @@ |
2108 | "Unexpected boolean value '%s' in <%s>" % (value, node.tag) |
2109 | return value == "True" |
2110 | elif type_ in ("str",): |
2111 | - return unicode(node.text.strip()) |
2112 | + return str(node.text.strip()) |
2113 | elif type_ in ("int", "long",): |
2114 | return int(node.text.strip()) |
2115 | elif type_ in ("float",): |
2116 | @@ -320,7 +320,7 @@ |
2117 | |
2118 | def _getValueAsString(self, node): |
2119 | """Return the value of the attribute "value".""" |
2120 | - return unicode(node.attrib["value"]) |
2121 | + return str(node.attrib["value"]) |
2122 | |
2123 | def parseContext(self, result, node): |
2124 | """Parse the <context> part of a submission.""" |
2125 | @@ -354,7 +354,7 @@ |
2126 | parser(result, child) |
2127 | else: |
2128 | text = child.text |
2129 | - if not isinstance(text, unicode): |
2130 | + if not isinstance(text, str): |
2131 | text = text.decode("utf-8") |
2132 | stream = StringIO(text) |
2133 | p = parser(stream) |
2134 | @@ -389,11 +389,11 @@ |
2135 | |
2136 | # Convert lists to space separated strings. |
2137 | properties = self._getProperties(child) |
2138 | - for key, value in properties.iteritems(): |
2139 | + for key, value in properties.items(): |
2140 | if key in ("bogomips", "cache", "count", "speed",): |
2141 | - properties[key] = int(value) |
2142 | + properties[key] = int(float(value)) |
2143 | elif isinstance(value, list): |
2144 | - properties[key] = u" ".join(value) |
2145 | + properties[key] = " ".join(value) |
2146 | processors.append(properties) |
2147 | |
2148 | # Check if /proc/cpuinfo was parsed already. |
2149 | @@ -403,15 +403,15 @@ |
2150 | lines = [] |
2151 | for processor in processors: |
2152 | # Convert some keys with underscores to spaces instead. |
2153 | - for key, value in processor.iteritems(): |
2154 | + for key, value in processor.items(): |
2155 | if "_" in key and key != "vendor_id": |
2156 | key = key.replace("_", " ") |
2157 | |
2158 | - lines.append(u"%s: %s" % (key, value)) |
2159 | - |
2160 | - lines.append(u"") |
2161 | - |
2162 | - stream = StringIO(u"\n".join(lines)) |
2163 | + lines.append("%s: %s" % (key, value)) |
2164 | + |
2165 | + lines.append("") |
2166 | + |
2167 | + stream = StringIO("\n".join(lines)) |
2168 | parser = result.parseCpuinfo(stream) |
2169 | parser.run(result) |
2170 | |
2171 | |
2172 | === modified file 'checkbox/parsers/tests/cputable.py' |
2173 | --- checkbox/parsers/tests/cputable.py 2012-02-15 00:11:21 +0000 |
2174 | +++ checkbox/parsers/tests/cputable.py 2012-06-23 00:59:17 +0000 |
2175 | @@ -16,7 +16,7 @@ |
2176 | # You should have received a copy of the GNU General Public License |
2177 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. |
2178 | # |
2179 | -from StringIO import StringIO |
2180 | +from io import StringIO |
2181 | |
2182 | from unittest import TestCase |
2183 | |
2184 | |
2185 | === modified file 'checkbox/parsers/tests/description.py' |
2186 | --- checkbox/parsers/tests/description.py 2012-02-15 00:11:21 +0000 |
2187 | +++ checkbox/parsers/tests/description.py 2012-06-23 00:59:17 +0000 |
2188 | @@ -17,7 +17,7 @@ |
2189 | # You should have received a copy of the GNU General Public License |
2190 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. |
2191 | # |
2192 | -from StringIO import StringIO |
2193 | +from io import StringIO |
2194 | |
2195 | from unittest import TestCase |
2196 | |
2197 | @@ -115,7 +115,7 @@ |
2198 | self.assertResult(result) |
2199 | |
2200 | def test_es(self): |
2201 | - result = self.getResult(u""" |
2202 | + result = self.getResult(""" |
2203 | PROPÓSITO: |
2204 | Esta prueba verifica los diferentes modos de vídeo detectados |
2205 | PASOS: |
2206 | @@ -131,7 +131,7 @@ |
2207 | self.assertEquals(result.info, "$output\n") |
2208 | |
2209 | def test_ru(self): |
2210 | - result = self.getResult(u""" |
2211 | + result = self.getResult(""" |
2212 | ЦЕЛЬ: |
2213 | Эта проверка позволит убедиться в работоспособности штекера наушников |
2214 | ДЕЙСТВИЯ: |
2215 | |
2216 | === modified file 'checkbox/parsers/tests/dmidecode.py' |
2217 | --- checkbox/parsers/tests/dmidecode.py 2012-02-15 00:11:21 +0000 |
2218 | +++ checkbox/parsers/tests/dmidecode.py 2012-06-23 00:59:17 +0000 |
2219 | @@ -16,7 +16,7 @@ |
2220 | # You should have received a copy of the GNU General Public License |
2221 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. |
2222 | # |
2223 | -from cStringIO import StringIO |
2224 | +from io import StringIO |
2225 | |
2226 | from unittest import TestCase |
2227 | |
2228 | |
2229 | === modified file 'checkbox/parsers/tests/udevadm.py' |
2230 | --- checkbox/parsers/tests/udevadm.py 2012-02-15 00:11:21 +0000 |
2231 | +++ checkbox/parsers/tests/udevadm.py 2012-06-23 00:59:17 +0000 |
2232 | @@ -16,7 +16,7 @@ |
2233 | # You should have received a copy of the GNU General Public License |
2234 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. |
2235 | # |
2236 | -from cStringIO import StringIO |
2237 | +from io import StringIO |
2238 | |
2239 | from unittest import TestCase |
2240 | |
2241 | |
2242 | === modified file 'checkbox/parsers/udevadm.py' |
2243 | --- checkbox/parsers/udevadm.py 2012-03-07 19:46:29 +0000 |
2244 | +++ checkbox/parsers/udevadm.py 2012-06-23 00:59:17 +0000 |
2245 | @@ -42,7 +42,7 @@ |
2246 | r"^acpi:" |
2247 | r"(?P<vendor_name>[%(upper)s]{3})" |
2248 | r"(?P<product_id>[%(hex)s]{4}):" |
2249 | - % {"upper": string.uppercase, "hex": string.hexdigits}) |
2250 | + % {"upper": string.ascii_uppercase, "hex": string.hexdigits}) |
2251 | USB_RE = re.compile( |
2252 | r"^usb:" |
2253 | r"v(?P<vendor_id>[%(hex)s]{4})" |
2254 | @@ -349,7 +349,7 @@ |
2255 | |
2256 | # floppy |
2257 | if self.driver == "floppy": |
2258 | - return u"Platform Device" |
2259 | + return "Platform Device" |
2260 | |
2261 | return None |
2262 | |
2263 | @@ -467,6 +467,4 @@ |
2264 | |
2265 | |
2266 | def decode_id(id): |
2267 | - encoded_id = id.encode("utf-8") |
2268 | - decoded_id = encoded_id.decode("string-escape").decode("utf-8") |
2269 | - return decoded_id.strip() |
2270 | + return id.strip() |
2271 | |
2272 | === modified file 'checkbox/plugin.py' |
2273 | --- checkbox/plugin.py 2010-03-09 16:58:36 +0000 |
2274 | +++ checkbox/plugin.py 2012-06-23 00:59:17 +0000 |
2275 | @@ -40,7 +40,7 @@ |
2276 | module.register(self) |
2277 | |
2278 | |
2279 | -class Plugin(object): |
2280 | +class Plugin: |
2281 | """ |
2282 | Plugin base class which should be inherited by each plugin |
2283 | implementation. This class extends the component to automatically |
2284 | |
2285 | === modified file 'checkbox/properties.py' |
2286 | --- checkbox/properties.py 2011-03-17 11:15:12 +0000 |
2287 | +++ checkbox/properties.py 2012-06-23 00:59:17 +0000 |
2288 | @@ -17,13 +17,13 @@ |
2289 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. |
2290 | # |
2291 | from checkbox.attribute import Attribute |
2292 | -from checkbox.variables import (ConstantVariable, BoolVariable, StringVariable, |
2293 | - PathVariable, UnicodeVariable, IntVariable, FloatVariable, TimeVariable, |
2294 | +from checkbox.variables import (ConstantVariable, BoolVariable, BytesVariable, |
2295 | + StringVariable, PathVariable, IntVariable, FloatVariable, TimeVariable, |
2296 | ListVariable, TupleVariable, AnyVariable, DictVariable, MapVariable, |
2297 | FileVariable, VariableFactory, Variable, get_variable) |
2298 | |
2299 | |
2300 | -class Property(object): |
2301 | +class Property: |
2302 | |
2303 | def __init__(self, variable_class=Variable, variable_kwargs={}): |
2304 | self._variable_class = variable_class |
2305 | @@ -47,7 +47,7 @@ |
2306 | def _detect_name(self, used_cls): |
2307 | self_id = id(self) |
2308 | for cls in used_cls.__mro__: |
2309 | - for attr, prop in cls.__dict__.iteritems(): |
2310 | + for attr, prop in cls.__dict__.items(): |
2311 | if id(prop) == self_id: |
2312 | return attr |
2313 | raise RuntimeError("Property used in an unknown class") |
2314 | @@ -116,6 +116,11 @@ |
2315 | variable_class = BoolVariable |
2316 | |
2317 | |
2318 | +class Bytes(PropertyType): |
2319 | + |
2320 | + variable_class = BytesVariable |
2321 | + |
2322 | + |
2323 | class String(PropertyType): |
2324 | |
2325 | variable_class = StringVariable |
2326 | @@ -126,11 +131,6 @@ |
2327 | variable_class = PathVariable |
2328 | |
2329 | |
2330 | -class Unicode(PropertyType): |
2331 | - |
2332 | - variable_class = UnicodeVariable |
2333 | - |
2334 | - |
2335 | class Int(PropertyType): |
2336 | |
2337 | variable_class = IntVariable |
2338 | @@ -188,7 +188,7 @@ |
2339 | variable_class = MapVariable |
2340 | |
2341 | def __init__(self, schema={}, **kwargs): |
2342 | - for key, type in schema.iteritems(): |
2343 | + for key, type in schema.items(): |
2344 | schema[key] = VariableFactory(type._variable_class, |
2345 | **type._variable_kwargs) |
2346 | |
2347 | |
2348 | === modified file 'checkbox/reactor.py' |
2349 | --- checkbox/reactor.py 2011-02-14 18:19:27 +0000 |
2350 | +++ checkbox/reactor.py 2012-06-23 00:59:17 +0000 |
2351 | @@ -22,7 +22,7 @@ |
2352 | from checkbox.lib.log import format_object |
2353 | |
2354 | |
2355 | -class EventID(object): |
2356 | +class EventID: |
2357 | |
2358 | def __init__(self, event_type, pair): |
2359 | self._event_type = event_type |
2360 | @@ -39,7 +39,7 @@ |
2361 | pass |
2362 | |
2363 | |
2364 | -class Reactor(object): |
2365 | +class Reactor: |
2366 | |
2367 | def __init__(self): |
2368 | self._event_handlers = {} |
2369 | @@ -99,7 +99,7 @@ |
2370 | if type(id) is EventID: |
2371 | self._event_handlers[id._event_type].remove(id._pair) |
2372 | else: |
2373 | - raise Exception, "EventID instance expected, received %r" % id |
2374 | + raise Exception("EventID instance expected, received %r" % id) |
2375 | |
2376 | def cancel_all_calls(self, event_type): |
2377 | del self._event_handlers[event_type] |
2378 | |
2379 | === modified file 'checkbox/report.py' |
2380 | --- checkbox/report.py 2011-09-14 21:16:02 +0000 |
2381 | +++ checkbox/report.py 2012-06-23 00:59:17 +0000 |
2382 | @@ -16,13 +16,13 @@ |
2383 | # You should have received a copy of the GNU General Public License |
2384 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. |
2385 | # |
2386 | -import libxml2 |
2387 | import posixpath |
2388 | |
2389 | +from lxml import etree |
2390 | from xml.dom.minidom import Document, Element, parseString |
2391 | |
2392 | |
2393 | -class ReportManager(object): |
2394 | +class ReportManager: |
2395 | """The central point for dumping and loading information. |
2396 | |
2397 | This keeps references to all reports which have been added to the |
2398 | @@ -43,7 +43,7 @@ |
2399 | Call back method for reports to register dump handlers. |
2400 | """ |
2401 | if type in self.dumps_table: |
2402 | - raise Exception, "Dumps type already handled: %s" % type |
2403 | + raise Exception("Dumps type already handled: %s" % type) |
2404 | self.dumps_table[type] = handler |
2405 | |
2406 | def handle_loads(self, type, handler): |
2407 | @@ -51,7 +51,7 @@ |
2408 | Call back method for reports to register load handlers. |
2409 | """ |
2410 | if type in self.loads_table: |
2411 | - raise Exception, "Loads type already handled: %s" % type |
2412 | + raise Exception("Loads type already handled: %s" % type) |
2413 | self.loads_table[type] = handler |
2414 | |
2415 | def call_dumps(self, obj, node): |
2416 | @@ -66,7 +66,7 @@ |
2417 | Convenience method for reports to call the load handler |
2418 | corresponding to the content of the given node. |
2419 | """ |
2420 | - if self.loads_table.has_key(node.localName): |
2421 | + if node.localName in self.loads_table: |
2422 | ret = self.loads_table[node.localName](node) |
2423 | elif isinstance(node, Element) and node.hasAttribute("type"): |
2424 | type = node.getAttribute("type") |
2425 | @@ -103,30 +103,30 @@ |
2426 | |
2427 | try: |
2428 | self.call_dumps(obj, node) |
2429 | - except KeyError, e: |
2430 | - raise ValueError, "Unsupported type: %s" % e |
2431 | + except KeyError as e: |
2432 | + raise ValueError("Unsupported type: %s" % e) |
2433 | |
2434 | return document |
2435 | |
2436 | - def loads(self, str): |
2437 | + def loads(self, string): |
2438 | """ |
2439 | Load the given string which may be a container of any nodes |
2440 | supported by the reports added to the manager. |
2441 | """ |
2442 | - document = parseString(str) |
2443 | + document = parseString(string) |
2444 | node = document.childNodes[0] |
2445 | assert(node.localName == self.name) |
2446 | |
2447 | try: |
2448 | ret = self.call_loads(document) |
2449 | - except KeyError, e: |
2450 | - raise ValueError, "Unsupported type: %s" % e |
2451 | + except KeyError as e: |
2452 | + raise ValueError("Unsupported type: %s" % e) |
2453 | |
2454 | return ret |
2455 | |
2456 | - def validate(self, str): |
2457 | + def validate(self, string): |
2458 | """ |
2459 | - Validate the given string |
2460 | + Validate the given string |
2461 | """ |
2462 | if not self.schema: |
2463 | return False |
2464 | @@ -137,21 +137,14 @@ |
2465 | finally: |
2466 | file.close() |
2467 | |
2468 | - rngParser = libxml2.relaxNGNewMemParserCtxt(schema, len(schema)) |
2469 | - rngSchema = rngParser.relaxNGParse() |
2470 | - ctxt = rngSchema.relaxNGNewValidCtxt() |
2471 | - doc = libxml2.parseDoc(str) |
2472 | - is_valid = doc.relaxNGValidateDoc(ctxt) |
2473 | - |
2474 | - # Clean up |
2475 | - doc.freeDoc() |
2476 | - del rngParser, rngSchema, ctxt |
2477 | - libxml2.relaxNGCleanupTypes() |
2478 | - libxml2.cleanupParser() |
2479 | - return is_valid == 0 |
2480 | - |
2481 | - |
2482 | -class Report(object): |
2483 | + relaxng_doc = etree.fromstring(schema) |
2484 | + relaxng = etree.RelaxNG(relaxng_doc) |
2485 | + |
2486 | + doc = etree.fromstring(string) |
2487 | + return relaxng.validate(doc) |
2488 | + |
2489 | + |
2490 | +class Report: |
2491 | """A convenience for writing reports. |
2492 | |
2493 | This provides a register method which will set the manager attribute |
2494 | |
2495 | === modified file 'checkbox/reports/launchpad_report.py' |
2496 | --- checkbox/reports/launchpad_report.py 2010-03-09 16:58:36 +0000 |
2497 | +++ checkbox/reports/launchpad_report.py 2012-06-23 00:59:17 +0000 |
2498 | @@ -109,7 +109,7 @@ |
2499 | |
2500 | def dumps_lsbrelease(self, obj, parent): |
2501 | logging.debug("Dumping lsbrelease") |
2502 | - for key, value in obj.iteritems(): |
2503 | + for key, value in obj.items(): |
2504 | property = self._create_element("property", parent) |
2505 | property.setAttribute("name", key) |
2506 | self._manager.call_dumps(value, property) |
2507 | |
2508 | === modified file 'checkbox/reports/xml_report.py' |
2509 | --- checkbox/reports/xml_report.py 2010-03-09 16:58:36 +0000 |
2510 | +++ checkbox/reports/xml_report.py 2012-06-23 00:59:17 +0000 |
2511 | @@ -36,10 +36,9 @@ |
2512 | def register_dumps(self): |
2513 | for (dt, dh) in [(bool, self.dumps_bool), |
2514 | (int, self.dumps_int), |
2515 | - (long, self.dumps_int), |
2516 | (float, self.dumps_float), |
2517 | + (bytes, self.dumps_bytes), |
2518 | (str, self.dumps_str), |
2519 | - (unicode, self.dumps_unicode), |
2520 | (list, self.dumps_list), |
2521 | (tuple, self.dumps_list), |
2522 | (dict, self.dumps_dict), |
2523 | @@ -52,8 +51,8 @@ |
2524 | ("int", self.loads_int), |
2525 | ("long", self.loads_int), |
2526 | ("float", self.loads_float), |
2527 | + ("bytes", self.loads_bytes), |
2528 | ("str", self.loads_str), |
2529 | - ("unicode", self.loads_str), |
2530 | ("list", self.loads_list), |
2531 | ("value", self.loads_value), |
2532 | ("property", self.loads_property), |
2533 | @@ -78,12 +77,12 @@ |
2534 | def dumps_float(self, obj, parent): |
2535 | self._dumps_text(str(obj), parent, "float") |
2536 | |
2537 | + def dumps_bytes(self, obj, parent): |
2538 | + self._dumps_text(obj, parent, "bytes") |
2539 | + |
2540 | def dumps_str(self, obj, parent): |
2541 | self._dumps_text(obj, parent, "str") |
2542 | |
2543 | - def dumps_unicode(self, obj, parent): |
2544 | - self._dumps_text(obj, parent, "unicode") |
2545 | - |
2546 | def dumps_list(self, obj, parent): |
2547 | parent.setAttribute("type", "list") |
2548 | for value in obj: |
2549 | @@ -92,9 +91,9 @@ |
2550 | self._manager.call_dumps(value, element) |
2551 | |
2552 | def dumps_dict(self, obj, parent): |
2553 | - for key in sorted(obj.iterkeys()): |
2554 | + for key in sorted(obj.keys()): |
2555 | value = obj[key] |
2556 | - if self._manager.dumps_table.has_key(key): |
2557 | + if key in self._manager.dumps_table: |
2558 | # Custom dumps handler |
2559 | element = self._create_element(key, parent) |
2560 | self._manager.dumps_table[key](value, element) |
2561 | @@ -130,8 +129,11 @@ |
2562 | def loads_float(self, node): |
2563 | return float(node.data) |
2564 | |
2565 | + def loads_bytes(self, node): |
2566 | + return node.data.strip().encode("utf-8") |
2567 | + |
2568 | def loads_str(self, node): |
2569 | - return str(node.data.strip()) |
2570 | + return node.data.strip() |
2571 | |
2572 | def loads_list(self, node): |
2573 | nodes = [] |
2574 | @@ -188,4 +190,4 @@ |
2575 | elif re.match('^(no|false|0)$', string, re.IGNORECASE): |
2576 | return False |
2577 | else: |
2578 | - raise Exception, "Invalid boolean type: %s" % string |
2579 | + raise Exception("Invalid boolean type: %s" % string) |
2580 | |
2581 | === modified file 'checkbox/resource.py' |
2582 | --- checkbox/resource.py 2011-06-21 13:57:25 +0000 |
2583 | +++ checkbox/resource.py 2012-06-23 00:59:17 +0000 |
2584 | @@ -16,13 +16,13 @@ |
2585 | # You should have received a copy of the GNU General Public License |
2586 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. |
2587 | # |
2588 | -import __builtin__ |
2589 | +import builtins |
2590 | |
2591 | |
2592 | __all__ = ["ResourceMap"] |
2593 | |
2594 | |
2595 | -class ResourceObject(object): |
2596 | +class ResourceObject: |
2597 | __slots__ = ("_iterator", "_name", "_convert",) |
2598 | |
2599 | def __init__(self, iterator, name, convert=lambda x: x): |
2600 | @@ -67,7 +67,7 @@ |
2601 | return until if found else default |
2602 | |
2603 | |
2604 | -class ResourceIterator(object): |
2605 | +class ResourceIterator: |
2606 | __slots__ = ("_map", "_values",) |
2607 | |
2608 | def __init__(self, map, values): |
2609 | @@ -91,7 +91,7 @@ |
2610 | return ResourceObject(self, name) |
2611 | |
2612 | |
2613 | -class ResourceBuiltin(object): |
2614 | +class ResourceBuiltin: |
2615 | __slots__ = ("_function",) |
2616 | |
2617 | def __init__(self, function): |
2618 | @@ -105,10 +105,9 @@ |
2619 | |
2620 | def __init__(self, names, *args, **kwargs): |
2621 | super(ResourceGlobals, self).__init__(*args, **kwargs) |
2622 | - self["__builtins__"] = None |
2623 | |
2624 | for name in names: |
2625 | - function = getattr(__builtin__, name) |
2626 | + function = getattr(builtins, name) |
2627 | self[name] = ResourceBuiltin(function) |
2628 | |
2629 | |
2630 | @@ -128,7 +127,7 @@ |
2631 | |
2632 | def eval(self, source): |
2633 | self._results = [] |
2634 | - resource_globals = ResourceGlobals(["bool", "float", "int", "long", "str"]) |
2635 | + resource_globals = ResourceGlobals(["bool", "float", "int", "str"]) |
2636 | try: |
2637 | value = eval(source, resource_globals, self) |
2638 | if (isinstance(value, (bool, int)) and value) \ |
2639 | |
2640 | === modified file 'checkbox/tests/report.py' |
2641 | --- checkbox/tests/report.py 2011-09-14 21:16:02 +0000 |
2642 | +++ checkbox/tests/report.py 2012-06-23 00:59:17 +0000 |
2643 | @@ -105,5 +105,5 @@ |
2644 | self.assertTrue("test1" in str) |
2645 | |
2646 | data = rm.loads(str) |
2647 | - self.assertTrue(data.has_key("test")) |
2648 | + self.assertTrue("test" in data) |
2649 | self.assertTrue(data["test"] == "test1") |
2650 | |
2651 | === modified file 'checkbox/user_interface.py' |
2652 | --- checkbox/user_interface.py 2012-03-21 02:22:11 +0000 |
2653 | +++ checkbox/user_interface.py 2012-06-23 00:59:17 +0000 |
2654 | @@ -57,8 +57,12 @@ |
2655 | UNSUPPORTED: SKIP_ANSWER, |
2656 | UNTESTED: SKIP_ANSWER} |
2657 | |
2658 | - |
2659 | -class UserInterface(object): |
2660 | +CONTINUE_ANSWER = 'Continue' |
2661 | +RERUN_ANSWER = 'Rerun' |
2662 | +RESTART_ANSWER = 'Restart' |
2663 | + |
2664 | + |
2665 | +class UserInterface: |
2666 | """Abstract base class for encapsulating the workflow and common code for |
2667 | any user interface implementation (like GTK, Qt, or CLI). |
2668 | |
2669 | @@ -67,6 +71,7 @@ |
2670 | def __init__(self, title, data_path=None): |
2671 | self.title = title |
2672 | self.data_path = data_path |
2673 | + self.progress = None |
2674 | self.ui_flags = {} |
2675 | |
2676 | self.report_url = None |
2677 | @@ -78,9 +83,12 @@ |
2678 | logging.info(text) |
2679 | return default |
2680 | |
2681 | - def show_error(self, text): |
2682 | + def show_error(self, primary_text, |
2683 | + secondary_text=None, detailed_text=None): |
2684 | + text = filter(None, [primary_text, secondary_text, detailed_text]) |
2685 | + text = '\n'.join(text) |
2686 | logging.error(text) |
2687 | - raise StopAllException, "Error: %s" % text |
2688 | + raise StopAllException("Error: %s" % text) |
2689 | |
2690 | def show_progress(self, message, function, *args, **kwargs): |
2691 | self.show_progress_start(message) |
2692 | @@ -109,7 +117,7 @@ |
2693 | def show_text(self, text, previous=None, next=None): |
2694 | return |
2695 | |
2696 | - def show_entry(self, text, value, previous=None, next=None): |
2697 | + def show_entry(self, text, value, label=None, previous=None, next=None): |
2698 | return value |
2699 | |
2700 | def show_check(self, text, options=[], default=[]): |
2701 | @@ -118,7 +126,7 @@ |
2702 | def show_radio(self, text, options=[], default=None): |
2703 | return default |
2704 | |
2705 | - def show_tree(self, text, options={}, default={}): |
2706 | + def show_tree(self, text, options={}, default={}, deselect_warning=""): |
2707 | return default |
2708 | |
2709 | def show_test(self, test, runner): |
2710 | @@ -194,7 +202,7 @@ |
2711 | webbrowser.open(url, new=True, autoraise=True) |
2712 | return |
2713 | |
2714 | - except Exception, e: |
2715 | + except Exception as e: |
2716 | pass |
2717 | |
2718 | def show_report(self, text, results): |
2719 | @@ -203,3 +211,13 @@ |
2720 | and make it possible to modify them |
2721 | """ |
2722 | raise NotImplementedError |
2723 | + |
2724 | + def update_status(self, job): |
2725 | + """ |
2726 | + If implemented, it will be called after each job finishes. |
2727 | + The passed Job object can be used to update in-UI status |
2728 | + about each job. |
2729 | + """ |
2730 | + pass |
2731 | + |
2732 | + |
2733 | |
2734 | === modified file 'checkbox/variables.py' |
2735 | --- checkbox/variables.py 2011-09-14 21:16:02 +0000 |
2736 | +++ checkbox/variables.py 2012-06-23 00:59:17 +0000 |
2737 | @@ -19,7 +19,7 @@ |
2738 | import re |
2739 | import posixpath |
2740 | |
2741 | -from StringIO import StringIO |
2742 | +from io import StringIO |
2743 | |
2744 | from checkbox.lib.text import split |
2745 | |
2746 | @@ -47,7 +47,7 @@ |
2747 | pass |
2748 | |
2749 | |
2750 | -class Variable(object): |
2751 | +class Variable: |
2752 | |
2753 | _value = None |
2754 | _required = True |
2755 | @@ -101,7 +101,7 @@ |
2756 | __slots__ = () |
2757 | |
2758 | def coerce(self, value): |
2759 | - if isinstance(value, (str, unicode)): |
2760 | + if isinstance(value, str): |
2761 | if re.match(r"(yes|true)", value, re.IGNORECASE): |
2762 | value = True |
2763 | elif re.match(r"(no|false)", value, re.IGNORECASE): |
2764 | @@ -114,12 +114,24 @@ |
2765 | return value |
2766 | |
2767 | |
2768 | +class BytesVariable(Variable): |
2769 | + __slots__ = () |
2770 | + |
2771 | + def coerce(self, value): |
2772 | + if isinstance(value, str): |
2773 | + value = value.encode('utf-8') |
2774 | + elif not isinstance(value, bytes): |
2775 | + raise ValueError("%r is not bytes" % (value,)) |
2776 | + |
2777 | + return value |
2778 | + |
2779 | + |
2780 | class StringVariable(Variable): |
2781 | __slots__ = () |
2782 | |
2783 | def coerce(self, value): |
2784 | - if isinstance(value, unicode): |
2785 | - value = str(value) |
2786 | + if isinstance(value, bytes): |
2787 | + value = value.decode("utf-8") |
2788 | elif not isinstance(value, str): |
2789 | raise ValueError("%r is not a str" % (value,)) |
2790 | |
2791 | @@ -134,25 +146,13 @@ |
2792 | return posixpath.expanduser(path) |
2793 | |
2794 | |
2795 | -class UnicodeVariable(Variable): |
2796 | - __slots__ = () |
2797 | - |
2798 | - def coerce(self, value): |
2799 | - if isinstance(value, str): |
2800 | - value = unicode(value, encoding="utf-8") |
2801 | - elif not isinstance(value, unicode): |
2802 | - raise ValueError("%r is not a unicode" % (value,)) |
2803 | - |
2804 | - return value |
2805 | - |
2806 | - |
2807 | class IntVariable(Variable): |
2808 | __slots__ = () |
2809 | |
2810 | def coerce(self, value): |
2811 | - if isinstance(value, (str, unicode)): |
2812 | + if isinstance(value, str): |
2813 | value = int(value) |
2814 | - elif not isinstance(value, (int, long)): |
2815 | + elif not isinstance(value, int): |
2816 | raise ValueError("%r is not an int nor long" % (value,)) |
2817 | |
2818 | return value |
2819 | @@ -162,9 +162,9 @@ |
2820 | __slots__ = () |
2821 | |
2822 | def coerce(self, value): |
2823 | - if isinstance(value, (str, unicode)): |
2824 | + if isinstance(value, str): |
2825 | value = float(value) |
2826 | - elif not isinstance(value, (int, long, float)): |
2827 | + elif not isinstance(value, (int, float)): |
2828 | raise ValueError("%r is not a float" % (value,)) |
2829 | |
2830 | return value |
2831 | @@ -186,7 +186,7 @@ |
2832 | |
2833 | def coerce(self, values): |
2834 | item_factory = self._item_factory |
2835 | - if isinstance(values, (str, unicode)): |
2836 | + if isinstance(values, str): |
2837 | values = split(values, self._separator) if values else [] |
2838 | elif not isinstance(values, (list, tuple)): |
2839 | raise ValueError("%r is not a list or tuple" % (values,)) |
2840 | @@ -235,7 +235,7 @@ |
2841 | if not isinstance(value, dict): |
2842 | raise ValueError("%r is not a dict." % (value,)) |
2843 | |
2844 | - for k, v in value.iteritems(): |
2845 | + for k, v in value.items(): |
2846 | value[self._key_schema(value=k).get()] = \ |
2847 | self._value_schema(value=v).get() |
2848 | return value |
2849 | @@ -252,16 +252,16 @@ |
2850 | if not isinstance(value, dict): |
2851 | raise ValueError("%r is not a dict." % (value,)) |
2852 | |
2853 | - for k, v in value.iteritems(): |
2854 | + for k, v in value.items(): |
2855 | if k not in self._schema: |
2856 | raise ValueError("%r is not a valid key as per %r" |
2857 | % (k, self._schema)) |
2858 | |
2859 | - for attribute, variable in self._schema.iteritems(): |
2860 | + for attribute, variable in self._schema.items(): |
2861 | old_value = value.get(attribute) |
2862 | try: |
2863 | new_value = variable(value=old_value).get() |
2864 | - except ValueError, e: |
2865 | + except ValueError as e: |
2866 | raise ValueError( |
2867 | "Value of %r key of dict %r could not be converted: %s" |
2868 | % (attribute, value, e)) |
2869 | @@ -276,7 +276,7 @@ |
2870 | __slots__ = () |
2871 | |
2872 | def coerce(self, value): |
2873 | - if isinstance(value, basestring): |
2874 | + if isinstance(value, str): |
2875 | value = StringIO(value) |
2876 | elif not hasattr(value, "read"): |
2877 | raise ValueError("%r is not a file" % (value,)) |
2878 | @@ -295,7 +295,7 @@ |
2879 | else: |
2880 | variables = {} |
2881 | cls = type(obj) |
2882 | - for attribute in get_attributes(cls).itervalues(): |
2883 | + for attribute in get_attributes(cls).values(): |
2884 | variable = attribute.variable_factory(attribute=attribute) |
2885 | variables[attribute] = variable |
2886 | |
2887 | |
2888 | === modified file 'checkbox_cli/cli_interface.py' |
2889 | --- checkbox_cli/cli_interface.py 2012-02-23 11:56:50 +0000 |
2890 | +++ checkbox_cli/cli_interface.py 2012-06-23 00:59:17 +0000 |
2891 | @@ -35,7 +35,7 @@ |
2892 | OPTION_TO_ANSWER = dict((o, a) for a, o in ANSWER_TO_OPTION.items()) |
2893 | |
2894 | |
2895 | -class CLIDialog(object): |
2896 | +class CLIDialog: |
2897 | """Command line dialog wrapper.""" |
2898 | |
2899 | def __init__(self, text): |
2900 | @@ -44,6 +44,7 @@ |
2901 | |
2902 | def put(self, text): |
2903 | sys.stdout.write(text) |
2904 | + sys.stdout.flush() |
2905 | |
2906 | def put_line(self, line): |
2907 | self.put("%s\n" % line) |
2908 | @@ -59,7 +60,7 @@ |
2909 | fileno = sys.stdin.fileno() |
2910 | saved_attributes = termios.tcgetattr(fileno) |
2911 | attributes = termios.tcgetattr(fileno) |
2912 | - attributes[3] = attributes[3] & ~(termios.ICANON | termios.ECHO) |
2913 | + attributes[3] &= ~(termios.ICANON | termios.ECHO) |
2914 | attributes[6][termios.VMIN] = 1 |
2915 | attributes[6][termios.VTIME] = 0 |
2916 | termios.tcsetattr(fileno, termios.TCSANOW, attributes) |
2917 | @@ -68,12 +69,12 @@ |
2918 | escape = 0 |
2919 | try: |
2920 | while len(input) < limit: |
2921 | - ch = str(sys.stdin.read(1)) |
2922 | + ch = sys.stdin.read(1) |
2923 | if ord(ch) == separator: |
2924 | break |
2925 | - elif ord(ch) == 033: # ESC |
2926 | + elif ord(ch) == 0o33: # ESC |
2927 | escape = 1 |
2928 | - elif ord(ch) == termios.CERASE or ord(ch) == 010: |
2929 | + elif ord(ch) == termios.CERASE or ord(ch) == 0o10: |
2930 | if len(input): |
2931 | self.put("\010 \010") |
2932 | del input[-1] |
2933 | @@ -186,7 +187,7 @@ |
2934 | that is, a job containing other jobs |
2935 | """ |
2936 | return all(issubclass(type(value), dict) |
2937 | - for value in root.itervalues()) |
2938 | + for value in root.values()) |
2939 | |
2940 | def _display(self, title, root): |
2941 | """ |
2942 | @@ -208,11 +209,11 @@ |
2943 | if not provided |
2944 | """ |
2945 | if key is None: |
2946 | - key = string.lowercase[len(keys)] |
2947 | + key = string.ascii_lowercase[len(keys)] |
2948 | keys.append(key) |
2949 | options.append(option) |
2950 | |
2951 | - for job_name, job_data in sorted(root.iteritems()): |
2952 | + for job_name, job_data in sorted(root.items()): |
2953 | if self._is_suite(job_data): |
2954 | add_option(job_name) |
2955 | self.put_line('{key}: {option}' |
2956 | @@ -300,7 +301,7 @@ |
2957 | elif key in options: |
2958 | if isinstance(options[key], dict): |
2959 | results[key] = {} |
2960 | - elif isinstance(options[key], (list, tuple,)): |
2961 | + elif isinstance(options[key], (list, tuple)): |
2962 | results[key] = [] |
2963 | else: |
2964 | results[key] = None |
2965 | @@ -308,7 +309,7 @@ |
2966 | for k in options[key]: |
2967 | self._toggle_results(k, options[key], results[key]) |
2968 | |
2969 | - elif isinstance(results, (list, tuple,)): |
2970 | + elif isinstance(results, (list, tuple)): |
2971 | if key in results: |
2972 | results.remove(key) |
2973 | elif key in options: |
2974 | @@ -325,7 +326,7 @@ |
2975 | dialog = CLIChoiceDialog(text) |
2976 | dialog.run() |
2977 | |
2978 | - def show_entry(self, text, value, previous=None, next=None): |
2979 | + def show_entry(self, text, value, label=None, previous=None, next=None): |
2980 | dialog = CLILineDialog(text) |
2981 | |
2982 | return dialog.run() |
2983 | @@ -357,7 +358,7 @@ |
2984 | response = dialog.run() |
2985 | return options[response] |
2986 | |
2987 | - def show_tree(self, text, options={}, default={}): |
2988 | + def show_tree(self, text, options={}, default={}, deselect_warning=""): |
2989 | keys = sorted(options.keys()) |
2990 | |
2991 | dialog = CLIChoiceDialog(text) |
2992 | @@ -453,6 +454,9 @@ |
2993 | def show_info(self, text, options=[], default=None): |
2994 | return self.show_radio(text, options, default) |
2995 | |
2996 | - def show_error(self, text): |
2997 | + def show_error(self, primary_text, |
2998 | + secondary_text=None, detailed_text=None): |
2999 | + text = filter(None, [primary_text, secondary_text, detailed_text]) |
3000 | + text = '\n'.join(text) |
3001 | dialog = CLIChoiceDialog("Error: %s" % text) |
3002 | dialog.run() |
3003 | |
3004 | === modified file 'checkbox_gtk/gtk_interface.py' |
3005 | --- checkbox_gtk/gtk_interface.py 2012-02-23 11:56:50 +0000 |
3006 | +++ checkbox_gtk/gtk_interface.py 2012-06-23 00:59:17 +0000 |
3007 | @@ -47,7 +47,7 @@ |
3008 | |
3009 | # HACK: Setting and unsetting previous and next buttons to workaround |
3010 | # for gnome bug #56070. |
3011 | -class GTKHack(object): |
3012 | +class GTKHack: |
3013 | def __init__(self, function): |
3014 | self._function = function |
3015 | |
3016 | @@ -211,6 +211,19 @@ |
3017 | title += " - %s" % test_name |
3018 | self._get_widget("dialog_main").set_title(title) |
3019 | |
3020 | + def _set_progress(self,progress): |
3021 | + # Update progress bar |
3022 | + bar = self._get_widget("progressbar_test") |
3023 | + if not self.progress: |
3024 | + return |
3025 | + done, total = self.progress |
3026 | + bar.set_text("%(done)d/%(total)d" % {'done': done, 'total': total}) |
3027 | + if total: |
3028 | + progress_fraction = float(done) / total |
3029 | + else: |
3030 | + progress_fraction=0 |
3031 | + bar.set_fraction(progress_fraction) |
3032 | + |
3033 | def _run_dialog(self, dialog=None): |
3034 | def on_dialog_response(dialog, response, self): |
3035 | # Keep dialog alive when the button that has been clicked |
3036 | @@ -221,8 +234,16 @@ |
3037 | self.direction = response |
3038 | Gtk.main_quit() |
3039 | |
3040 | + def on_dialog_key_press(dialog, event, self): |
3041 | + # Ignore ESC key presses |
3042 | + key = Gdk.keyval_name(event.keyval) |
3043 | + if "Escape" in key: |
3044 | + return True |
3045 | + return False |
3046 | + |
3047 | dialog = dialog or self._dialog |
3048 | dialog.connect("response", on_dialog_response, self) |
3049 | + dialog.connect("key-press-event", on_dialog_key_press, self) |
3050 | dialog.set_default_response(NEXT) |
3051 | dialog.show() |
3052 | Gtk.main() |
3053 | @@ -230,6 +251,7 @@ |
3054 | raise KeyboardInterrupt |
3055 | |
3056 | def show_progress_start(self, message): |
3057 | + self._set_progress(self.progress) |
3058 | self._set_sensitive("button_previous", False) |
3059 | self._set_sensitive("button_next", False) |
3060 | |
3061 | @@ -266,7 +288,7 @@ |
3062 | self._set_button("button_next", next_state) |
3063 | |
3064 | @GTKHack |
3065 | - def show_entry(self, text, value, previous=None, next=None): |
3066 | + def show_entry(self, text, value, label=None, previous=None, next=None): |
3067 | #Reset window title |
3068 | self._set_main_title() |
3069 | # Set buttons |
3070 | @@ -315,7 +337,7 @@ |
3071 | |
3072 | # Set callbacks |
3073 | def click_button(widget, active): |
3074 | - for check_button in option_table.itervalues(): |
3075 | + for check_button in option_table.values(): |
3076 | check_button.set_active(active) |
3077 | |
3078 | for button_name in "button_select_all", "button_deselect_all": |
3079 | @@ -375,11 +397,11 @@ |
3080 | return result |
3081 | |
3082 | @GTKHack |
3083 | - def show_tree(self, text, options={}, default={}): |
3084 | + def show_tree(self, text, options={}, default={}, deselect_warning=""): |
3085 | #Reset window title |
3086 | self._set_main_title() |
3087 | |
3088 | - (COLUMN_TEXT, COLUMN_ACTIVE) = range(2) |
3089 | + (COLUMN_TEXT, COLUMN_ACTIVE) = list(range(2)) |
3090 | |
3091 | # Set buttons |
3092 | self._notebook.set_current_page(1) |
3093 | @@ -519,6 +541,7 @@ |
3094 | self._set_hyper_text_view("hyper_text_view_test", |
3095 | test["description"]) |
3096 | |
3097 | + self._set_progress(self.progress) |
3098 | # Set buttons |
3099 | if "command" in test: |
3100 | self._set_sensitive("button_test", True) |
3101 | @@ -566,15 +589,35 @@ |
3102 | self.direction = NEXT |
3103 | return options[response] |
3104 | |
3105 | - def show_error(self, text): |
3106 | + def show_error(self, primary_text, |
3107 | + secondary_text=None, detailed_text=None): |
3108 | message_dialog = Gtk.MessageDialog(parent=self._dialog, |
3109 | type=Gtk.MessageType.ERROR, |
3110 | buttons=Gtk.ButtonsType.NONE, |
3111 | - message_format=text) |
3112 | + message_format=primary_text) |
3113 | message_dialog.set_modal(True) |
3114 | message_dialog.set_title(_("Error")) |
3115 | message_dialog.set_default_response(NEXT) |
3116 | message_dialog.add_buttons(Gtk.STOCK_CLOSE, NEXT) |
3117 | + if secondary_text: |
3118 | + message_dialog.format_secondary_text(secondary_text) |
3119 | + if detailed_text: |
3120 | + content_area = message_dialog.get_content_area() |
3121 | + |
3122 | + expander = Gtk.Expander(label=_('Detailed information...')) |
3123 | + |
3124 | + def expanded_cb(expander, *args): |
3125 | + message_dialog.set_resizable(expander.get_expanded()) |
3126 | + expander.connect("notify::expanded", expanded_cb) |
3127 | + scrolled_window = Gtk.ScrolledWindow() |
3128 | + textview = Gtk.TextView() |
3129 | + textview.set_editable(False) |
3130 | + textview.get_buffer().set_text(detailed_text) |
3131 | + scrolled_window.add(textview) |
3132 | + expander.add(scrolled_window) |
3133 | + content_area.pack_start(expander, |
3134 | + expand=True, fill=True, padding=0) |
3135 | + message_dialog.show_all() |
3136 | self._run_dialog(message_dialog) |
3137 | message_dialog.hide() |
3138 | |
3139 | |
3140 | === modified file 'checkbox_gtk/hyper_text_view.py' |
3141 | --- checkbox_gtk/hyper_text_view.py 2011-09-14 21:16:02 +0000 |
3142 | +++ checkbox_gtk/hyper_text_view.py 2012-06-23 00:59:17 +0000 |
3143 | @@ -32,13 +32,13 @@ |
3144 | try: |
3145 | return getattr(self, prop.name) |
3146 | except AttributeError: |
3147 | - raise AttributeError, "unknown property %s" % prop.name |
3148 | + raise AttributeError("unknown property %s" % prop.name) |
3149 | |
3150 | def do_set_property(self, prop, val): |
3151 | - if prop.name in self.__gproperties__.keys(): |
3152 | + if prop.name in list(self.__gproperties__.keys()): |
3153 | setattr(self, prop.name, val) |
3154 | else: |
3155 | - raise AttributeError, "unknown property %s" % prop.name |
3156 | + raise AttributeError("unknown property %s" % prop.name) |
3157 | |
3158 | def __init__(self, buffer=None): |
3159 | super(HyperTextView, self).__init__(buffer=buffer) |
3160 | @@ -55,12 +55,10 @@ |
3161 | self.connect("focus-out-event", lambda w, e: self.get_buffer().get_tag_table().foreach(self.__tag_reset, e.window)) |
3162 | |
3163 | def insert(self, text, _iter=None): |
3164 | - if not isinstance(text, unicode): |
3165 | - text = unicode(text, "utf-8") |
3166 | b = self.get_buffer() |
3167 | if _iter is None: |
3168 | _iter = b.get_end_iter() |
3169 | - b.insert(_iter, text.encode("utf-8")) |
3170 | + b.insert(_iter, text) |
3171 | |
3172 | def insert_with_anchor(self, text, anchor=None, _iter=None): |
3173 | b = self.get_buffer() |
3174 | @@ -109,7 +107,7 @@ |
3175 | |
3176 | def __set_anchor(self, window, tag, cursor, prop): |
3177 | window.set_cursor(cursor) |
3178 | - for key, val in prop.iteritems(): |
3179 | + for key, val in prop.items(): |
3180 | if val is not None: |
3181 | tag.set_property(key, val) |
3182 | |
3183 | |
3184 | === modified file 'checkbox_qt/qt_interface.py' |
3185 | --- checkbox_qt/qt_interface.py 2012-04-11 17:20:37 +0000 |
3186 | +++ checkbox_qt/qt_interface.py 2012-06-23 00:59:17 +0000 |
3187 | @@ -16,20 +16,17 @@ |
3188 | # You should have received a copy of the GNU General Public License |
3189 | # along with Checkbox. If not, see <http://www.gnu.org/licenses/>. |
3190 | # |
3191 | -import sys |
3192 | +import re |
3193 | import time |
3194 | -import posixpath |
3195 | -import inspect |
3196 | from gi.repository import GObject |
3197 | -import os |
3198 | |
3199 | from gettext import gettext as _ |
3200 | from string import Template |
3201 | |
3202 | -from checkbox.job import PASS |
3203 | +from checkbox.job import PASS |
3204 | from checkbox.user_interface import (UserInterface, |
3205 | NEXT, PREV, YES_ANSWER, NO_ANSWER, SKIP_ANSWER, |
3206 | - ANSWER_TO_STATUS, STATUS_TO_ANSWER) |
3207 | + ANSWER_TO_STATUS) |
3208 | import dbus |
3209 | from dbus.mainloop.glib import DBusGMainLoop |
3210 | |
3211 | @@ -40,30 +37,41 @@ |
3212 | |
3213 | OPTION_TO_ANSWER = dict((o, a) |
3214 | for a, o in ANSWER_TO_OPTION.items()) |
3215 | +def dummy_handle_reply(r=None): |
3216 | + return |
3217 | + |
3218 | +def dummy_handle_error(e=None): |
3219 | + return |
3220 | |
3221 | class QTInterface(UserInterface): |
3222 | def __init__(self, title, data_path): |
3223 | super(QTInterface, self).__init__(title, data_path) |
3224 | self._app_title = title |
3225 | notReady = True |
3226 | + infoResult = None |
3227 | while notReady: |
3228 | try: |
3229 | self.bus = dbus.SessionBus(mainloop=DBusGMainLoop()) |
3230 | - self.qtfront = self.bus.get_object('com.canonical.QtCheckbox', '/QtCheckbox') |
3231 | - self.qtiface = dbus.Interface(self.qtfront, dbus_interface='com.canonical.QtCheckbox') |
3232 | + self.qtfront = self.bus.get_object( |
3233 | + 'com.canonical.QtCheckbox', '/QtCheckbox') |
3234 | + self.qtiface = dbus.Interface( |
3235 | + self.qtfront, dbus_interface='com.canonical.QtCheckbox') |
3236 | self.loop = GObject.MainLoop() |
3237 | notReady = False |
3238 | except: |
3239 | time.sleep(0.5) |
3240 | - self.bus.add_signal_receiver(self.onClosedFrontend, "closedFrontend") |
3241 | - self.bus.add_signal_receiver(self.onReviewTestsClicked, "reviewTestsClicked") |
3242 | - self.bus.add_signal_receiver(self.onWelcomeCheckboxToggled, "welcomeCheckboxToggled") |
3243 | + self.bus.add_signal_receiver( |
3244 | + self.onClosedFrontend, "closedFrontend") |
3245 | + self.bus.add_signal_receiver( |
3246 | + self.onReviewTestsClicked, "reviewTestsClicked") |
3247 | + self.bus.add_signal_receiver( |
3248 | + self.onWelcomeCheckboxToggled, "welcomeCheckboxToggled") |
3249 | + self.qtiface.setInitialState() |
3250 | |
3251 | - self.qtiface.setInitialState(); |
3252 | self._set_main_title() |
3253 | |
3254 | def onReviewTestsClicked(self): |
3255 | - self.show_url(self.report_url) |
3256 | + self.show_url(self.report_url) |
3257 | |
3258 | def onWelcomeCheckboxToggled(self, checked): |
3259 | self.ui_flags["show_welcome_message"] = bool(checked) |
3260 | @@ -95,8 +103,10 @@ |
3261 | def onFullTestsClicked(): |
3262 | self.direction = NEXT |
3263 | self.loop.quit() |
3264 | + |
3265 | def onCustomTestsClicked(): |
3266 | self.loop.quit() |
3267 | + |
3268 | #Reset window title |
3269 | self._set_main_title() |
3270 | |
3271 | @@ -106,13 +116,25 @@ |
3272 | self.qtiface.showText(text) |
3273 | self.wait_on_signals(fullTestsClicked=onFullTestsClicked) |
3274 | |
3275 | - def show_entry(self, text, value, previous=None, next=None): |
3276 | + def show_entry(self, text, value, label='', previous=None, next=None): |
3277 | def onSubmitTestsClicked(): |
3278 | self.loop.quit() |
3279 | |
3280 | - self.qtiface.showEntry(text) |
3281 | + # Replace links wiki style markup with html markup |
3282 | + text = '<html>{}</html>'.format(text) |
3283 | + text = text.replace('\n', '<br/>') |
3284 | + text = re.sub(r'\[\[([^|]*)\|([^\]]*)\]\]', |
3285 | + lambda m: '<a href="{}">{}</a>' |
3286 | + .format(m.group(1), m.group(2)), |
3287 | + text) |
3288 | + |
3289 | + # Make sure that value is a string |
3290 | + if value is None: |
3291 | + value = '' |
3292 | + |
3293 | + self.qtiface.showEntry(text, value, label) |
3294 | self.wait_on_signals(submitTestsClicked=onSubmitTestsClicked) |
3295 | - return self.qtiface.getEmailAddress() |
3296 | + return self.qtiface.getSubmissionData() |
3297 | |
3298 | def show_check(self, text, options=[], default=[]): |
3299 | return False |
3300 | @@ -120,43 +142,57 @@ |
3301 | def show_radio(self, text, options=[], default=None): |
3302 | return False |
3303 | |
3304 | - def show_tree(self, text, options={}, default={}): |
3305 | + def show_tree(self, text, options={}, default={}, deselect_warning=""): |
3306 | + indexedOptions = {} |
3307 | + indexedDefaults = {} |
3308 | + |
3309 | def onStartTestsClicked(): |
3310 | self.direction = NEXT |
3311 | self.loop.quit() |
3312 | |
3313 | - def onWelcomeClicked(): |
3314 | - self.direction = PREV |
3315 | - self.loop.quit() |
3316 | + def buildBranch(options, default, baseIndex="1"): |
3317 | + internalIndex = 1 |
3318 | + for test, state in options.items(): |
3319 | + active = test in default |
3320 | + if isinstance(state, dict): |
3321 | + indexedOptions[ |
3322 | + baseIndex + "." + str(internalIndex)] = {test: ''} |
3323 | + indexedDefaults[ |
3324 | + baseIndex + "." + str(internalIndex)] = {test: active} |
3325 | + buildBranch(state, default.get(test, {}), baseIndex + "." + str(internalIndex)) |
3326 | + else: |
3327 | + indexedOptions[ |
3328 | + baseIndex + "." + str(internalIndex)] = {test: state} |
3329 | + indexedDefaults[ |
3330 | + baseIndex + "." + str(internalIndex)] = {test: active} |
3331 | + internalIndex += 1 |
3332 | + |
3333 | + def buildDict(options, baseIndex="1"): |
3334 | + internalIndex = 1 |
3335 | + branch = {} |
3336 | + while True: |
3337 | + currentIndex = baseIndex + "." + str(internalIndex) |
3338 | + if currentIndex in options: |
3339 | + key = list(options[currentIndex].keys())[0] |
3340 | + value = list(options[currentIndex].values())[0] |
3341 | + if value == "menu": |
3342 | + branch[key] = buildDict(options, currentIndex) |
3343 | + else: |
3344 | + branch[key] = value |
3345 | + internalIndex += 1 |
3346 | + else: |
3347 | + break |
3348 | + return branch |
3349 | |
3350 | self._set_main_title() |
3351 | - newOptions = {} |
3352 | - for section in options: |
3353 | - newTests = {} |
3354 | - for test, state in options[section].iteritems(): |
3355 | - # TODO: add support for more than one level |
3356 | - if not isinstance(state, dict): |
3357 | - newTests[str(test)] = state |
3358 | - |
3359 | - if newTests == {}: |
3360 | - newTests = {'': ''} |
3361 | - |
3362 | - newOptions[section] = newTests |
3363 | - |
3364 | - self.qtiface.showTree(text, newOptions) |
3365 | + buildBranch(options, default) |
3366 | + |
3367 | + self.qtiface.showTree(text, indexedOptions, indexedDefaults, |
3368 | + deselect_warning) |
3369 | self.wait_on_signals( |
3370 | startTestsClicked=onStartTestsClicked) |
3371 | |
3372 | - newOptions = {} |
3373 | - testsFromInterface = self.qtiface.getTestsToRun() |
3374 | - for section in testsFromInterface: |
3375 | - newTests = {} |
3376 | - for test in testsFromInterface[section]: |
3377 | - if test != '': |
3378 | - newTests[str(test)] = {} |
3379 | - newOptions[str(section)] = newTests |
3380 | - |
3381 | - return newOptions |
3382 | + return buildDict(self.qtiface.getTestsToRun()) |
3383 | |
3384 | def _run_test(self, test, runner): |
3385 | self.qtiface.showTestControls(False) |
3386 | @@ -164,8 +200,12 @@ |
3387 | self.qtiface.setFocusTestYesNo(True if status == PASS else False) |
3388 | self.qtiface.showTestControls(True) |
3389 | |
3390 | - return Template(test["info"]).substitute({ |
3391 | - "output": data.strip()}) |
3392 | + if test["info"]: |
3393 | + info = Template(test["info"]).substitute({"output": data.strip()}) |
3394 | + else: |
3395 | + info = "" |
3396 | + |
3397 | + return info |
3398 | |
3399 | def show_test(self, test, runner): |
3400 | def onStartTestClicked(): |
3401 | @@ -200,7 +240,7 @@ |
3402 | if not "data" in test: |
3403 | test["data"] = "" |
3404 | if "command" in test: |
3405 | - enableTestButton = True |
3406 | + enableTestButton = True |
3407 | |
3408 | self.qtiface.showTest( |
3409 | test["purpose"], test["steps"], test["verification"], info, test["data"], |
3410 | @@ -217,33 +257,44 @@ |
3411 | |
3412 | def show_info(self, text, options=[], default=None): |
3413 | def onInfoBoxResult(result): |
3414 | + #result here will always be a dbus String |
3415 | + #it may not be convertable with str due to the fact that it |
3416 | + #may contain non-ascii characters, so we need to convert to |
3417 | + #internal Python unicode instead. |
3418 | self.infoResult = str(result) |
3419 | self.loop.quit() |
3420 | |
3421 | - self.qtiface.showInfo(text, options, default, |
3422 | + self.qtiface.showInfo( |
3423 | + text, options, default, |
3424 | reply_handler=dummy_handle_reply, |
3425 | error_handler=dummy_handle_error) |
3426 | self.wait_on_signals( |
3427 | infoBoxResult=onInfoBoxResult) |
3428 | return self.infoResult |
3429 | |
3430 | - def show_error(self, text): |
3431 | + def show_error(self, primary_text, |
3432 | + secondary_text=None, detailed_text=None): |
3433 | def onErrorBoxClosed(): |
3434 | self.loop.quit() |
3435 | |
3436 | - self.qtiface.showError(text, |
3437 | - reply_handler=dummy_handle_reply, |
3438 | - error_handler=dummy_handle_error) |
3439 | + self.qtiface.showError(primary_text, |
3440 | + secondary_text, detailed_text, |
3441 | + reply_handler=dummy_handle_reply, |
3442 | + error_handler=dummy_handle_error) |
3443 | self.wait_on_signals( |
3444 | errorBoxClosed=onErrorBoxClosed) |
3445 | |
3446 | + def update_status(self, job): |
3447 | + if 'type' in job and job["type"] == "test": |
3448 | + self.qtiface.updateAutoTestStatus(job["status"], job["name"]) |
3449 | + |
3450 | def wait_on_signals(self, **signals): |
3451 | - for name, function in signals.iteritems(): |
3452 | + for name, function in signals.items(): |
3453 | self.bus.add_signal_receiver(function, name) |
3454 | |
3455 | self.loop.run() |
3456 | if self.direction == KeyboardInterrupt: |
3457 | raise KeyboardInterrupt |
3458 | |
3459 | - for name, function in signals.iteritems(): |
3460 | + for name, function in signals.items(): |
3461 | self.bus.remove_signal_receiver(function, name) |
3462 | |
3463 | === modified file 'checkbox_urwid/urwid_interface.py' |
3464 | --- checkbox_urwid/urwid_interface.py 2012-02-23 11:56:50 +0000 |
3465 | +++ checkbox_urwid/urwid_interface.py 2012-06-23 00:59:17 +0000 |
3466 | @@ -27,7 +27,27 @@ |
3467 | ALL_ANSWERS, ANSWER_TO_STATUS) |
3468 | |
3469 | |
3470 | -class Dialog(object): |
3471 | +# HACK to workaround bug in urwid.container, line 1273 |
3472 | +class ComparableString(str): |
3473 | + |
3474 | + def __init__(self, string): |
3475 | + self.string = string |
3476 | + |
3477 | + def __getattr__(self, name): |
3478 | + return getattr(self.string, name) |
3479 | + |
3480 | + def __lt__(self, other): |
3481 | + if not isinstance(other, str): |
3482 | + return False |
3483 | + return self.string < other |
3484 | + |
3485 | + def __gt__(self, other): |
3486 | + if not isinstance(other, str): |
3487 | + return False |
3488 | + return self.string > other |
3489 | + |
3490 | + |
3491 | +class Dialog: |
3492 | """ |
3493 | Basic dialog class that displays some text |
3494 | """ |
3495 | @@ -77,8 +97,10 @@ |
3496 | if not body: |
3497 | text = urwid.Text(self.text) |
3498 | walker = urwid.SimpleListWalker([]) |
3499 | + list_box = urwid.ListBox(walker) |
3500 | + list_box.pref_col = ComparableString(list_box.pref_col) |
3501 | body = urwid.Pile((('flow', text), |
3502 | - ('weight', 1, urwid.ListBox(walker)))) |
3503 | + ('weight', 1, list_box))) |
3504 | self.walker = walker |
3505 | |
3506 | frame = urwid.AttrMap(urwid.Frame(body, header, footer), 'body') |
3507 | @@ -290,9 +312,9 @@ |
3508 | """ |
3509 | Return the label of the selected radio button |
3510 | """ |
3511 | - label = (radio_button.get_label() |
3512 | + label = next((radio_button.get_label() |
3513 | for radio_button in self.radio_button_group |
3514 | - if radio_button.get_state()).next() |
3515 | + if radio_button.get_state())) |
3516 | return label |
3517 | |
3518 | |
3519 | @@ -379,7 +401,7 @@ |
3520 | widget.changed_cb, self.walker) |
3521 | |
3522 | if isinstance(data, dict): |
3523 | - items = sorted(data.iteritems(), key=itemgetter(0)) |
3524 | + items = sorted(iter(data.items()), key=itemgetter(0)) |
3525 | for children_name, children_data in items: |
3526 | child_widget = self.create_tree(children_name, children_data, widget) |
3527 | widget.append(child_widget) |
3528 | @@ -392,7 +414,7 @@ |
3529 | Set selected nodes by default recursively |
3530 | """ |
3531 | if isinstance(default, dict): |
3532 | - for name, default_children in default.iteritems(): |
3533 | + for name, default_children in default.items(): |
3534 | for widget in widgets: |
3535 | if widget.name == name: |
3536 | widget.state = True |
3537 | @@ -408,7 +430,7 @@ |
3538 | |
3539 | # Show tree |
3540 | self.option_widgets = [] |
3541 | - items = sorted(self.options.iteritems(), |
3542 | + items = sorted(iter(self.options.items()), |
3543 | key=itemgetter(0)) |
3544 | for name, data in items: |
3545 | widget = self.create_tree(name, data) |
3546 | @@ -498,10 +520,10 @@ |
3547 | urwid.signals.connect_signal(widget, 'change', |
3548 | widget.changed_cb, self.walker) |
3549 | |
3550 | - items = sorted(data.iteritems(), key=itemgetter(0)) |
3551 | + items = sorted(iter(data.items()), key=itemgetter(0)) |
3552 | for child_name, child_data in items: |
3553 | is_suite = all(issubclass(type(value), dict) |
3554 | - for value in child_data.itervalues()) |
3555 | + for value in child_data.values()) |
3556 | |
3557 | if is_suite: |
3558 | child_widget = self.create_tree(child_name, |
3559 | @@ -533,7 +555,7 @@ |
3560 | Dialog.show(self) |
3561 | |
3562 | # Show tree |
3563 | - items = sorted(self.results.iteritems(), |
3564 | + items = sorted(iter(self.results.items()), |
3565 | key=itemgetter(0)) |
3566 | for name, data in items: |
3567 | widget = self.create_tree(name, data) |
3568 | @@ -899,7 +921,7 @@ |
3569 | """ |
3570 | Pulse progress bar |
3571 | """ |
3572 | - start, end = self.progress_coordinates.next() |
3573 | + start, end = next(self.progress_coordinates) |
3574 | bar_data = [[0]]*start + [[1]]*(end-start) + [[0]]*(self.MAX_VALUE-end) |
3575 | self.progress_bar.set_data(bar_data, 1) |
3576 | self.loop.draw_screen() |
3577 | @@ -955,7 +977,7 @@ |
3578 | return dialog.response |
3579 | |
3580 | |
3581 | - def show_entry(self, text, value, previous=None, next=None): |
3582 | + def show_entry(self, text, value, label=None, previous=None, next=None): |
3583 | dialog = InputDialog(text).run() |
3584 | self.direction = dialog.direction |
3585 | return dialog.response |
3586 | @@ -974,7 +996,7 @@ |
3587 | return dialog.response |
3588 | |
3589 | |
3590 | - def show_tree(self, text, options={}, default={}): |
3591 | + def show_tree(self, text, options={}, default={}, deselect_warning=""): |
3592 | """ |
3593 | Show some options in a tree hierarchy |
3594 | and let the user choose between them |
3595 | @@ -1004,8 +1026,7 @@ |
3596 | output = '' |
3597 | |
3598 | # Get options |
3599 | - options = list([self.ANSWER_TO_OPTION[a] |
3600 | - for a in ALL_ANSWERS]) |
3601 | + options = [self.ANSWER_TO_OPTION[a] for a in ALL_ANSWERS] |
3602 | |
3603 | # Get buttons |
3604 | buttons = [] |
3605 | @@ -1040,9 +1061,11 @@ |
3606 | """ |
3607 | return self.show_radio(text, options, default) |
3608 | |
3609 | - |
3610 | - def show_error(self, text): |
3611 | + def show_error(self, primary_text, |
3612 | + secondary_text=None, detailed_text=None): |
3613 | """ |
3614 | Show an error message |
3615 | """ |
3616 | + text = filter(None, [primary_text, secondary_text, detailed_text]) |
3617 | + text = '\n'.join(text) |
3618 | return self.show_radio(text) |
3619 | |
3620 | === removed file 'data/audio/Ogg_Vorbis_Audio.oga' |
3621 | Binary files data/audio/Ogg_Vorbis_Audio.oga 2010-08-13 16:23:16 +0000 and data/audio/Ogg_Vorbis_Audio.oga 1970-01-01 00:00:00 +0000 differ |
3622 | === removed file 'data/documents/Derivatives_of_Ubuntu.doc' |
3623 | Binary files data/documents/Derivatives_of_Ubuntu.doc 2010-08-13 16:23:16 +0000 and data/documents/Derivatives_of_Ubuntu.doc 1970-01-01 00:00:00 +0000 differ |
3624 | === removed file 'data/documents/OpenOffice_Presentation_Test.odp' |
3625 | Binary files data/documents/OpenOffice_Presentation_Test.odp 2010-08-13 16:23:16 +0000 and data/documents/OpenOffice_Presentation_Test.odp 1970-01-01 00:00:00 +0000 differ |
3626 | === removed file 'data/documents/OpenOffice_Spreadsheet_Payment.ods' |
3627 | Binary files data/documents/OpenOffice_Spreadsheet_Payment.ods 2010-08-13 16:23:16 +0000 and data/documents/OpenOffice_Spreadsheet_Payment.ods 1970-01-01 00:00:00 +0000 differ |
3628 | === removed file 'data/documents/OpenOffice_Text_Test.odt' |
3629 | Binary files data/documents/OpenOffice_Text_Test.odt 2010-08-13 16:23:16 +0000 and data/documents/OpenOffice_Text_Test.odt 1970-01-01 00:00:00 +0000 differ |
3630 | === removed file 'data/documents/PDF_Test.pdf' |
3631 | Binary files data/documents/PDF_Test.pdf 2010-08-13 16:23:16 +0000 and data/documents/PDF_Test.pdf 1970-01-01 00:00:00 +0000 differ |
3632 | === removed file 'data/documents/RTF_Russian.rtf' |
3633 | --- data/documents/RTF_Russian.rtf 2010-08-13 16:23:16 +0000 |
3634 | +++ data/documents/RTF_Russian.rtf 1970-01-01 00:00:00 +0000 |
3635 | @@ -1,51 +0,0 @@ |
3636 | -{\rtf1\ansi\deff1\adeflang1025 |
3637 | -{\fonttbl{\f0\froman\fprq2\fcharset0 Nimbus Roman No9 L{\*\falt Times New Roman};}{\f1\froman\fprq2\fcharset0 Nimbus Roman No9 L{\*\falt Times New Roman};}{\f2\fnil\fprq2\fcharset0 HG Mincho Light J{\*\falt msmincho};}{\f3\froman\fprq2\fcharset0 Nimbus Roman No9 L{\*\falt Times New Roman};}{\f4\fswiss\fprq2\fcharset0 Nimbus Sans L{\*\falt Arial};}{\f5\fnil\fprq0\fcharset2 StarSymbol{\*\falt Arial Unicode MS};}} |
3638 | -{\colortbl;\red0\green0\blue0;\red0\green0\blue128;\red128\green128\blue128;} |
3639 | -{\stylesheet{\s1\rtlch\af4\afs24\lang255\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\loch\fs24\lang2057\snext1 Normal;} |
3640 | -{\s2\sb240\sa120\keepn\rtlch\af1\afs28\lang255\ltrch\dbch\af2\langfe255\hich\f4\fs28\lang2057\loch\f4\fs28\lang2057\sbasedon1\snext3 Heading;} |
3641 | -{\s3\sa120\rtlch\af4\afs24\lang255\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\loch\fs24\lang2057\sbasedon1\snext3 Body Text;} |
3642 | -{\s4\sa120\rtlch\af4\afs24\lang255\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\loch\fs24\lang2057\sbasedon3\snext4 List;} |
3643 | -{\s5\sb120\sa120\rtlch\af4\afs24\lang255\ai\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\i\loch\fs24\lang2057\i\sbasedon1\snext5 caption;} |
3644 | -{\s6\rtlch\af4\afs24\lang255\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\loch\fs24\lang2057\sbasedon1\snext6 Index;} |
3645 | -{\s7\sb120\sa120\rtlch\af4\afs24\lang255\ai\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\i\loch\fs24\lang2057\i\sbasedon1\snext7 caption;} |
3646 | -{\s8\sb240\sa120\keepn\rtlch\afs36\lang255\ab\ltrch\dbch\af4\langfe255\hich\f1\fs36\lang2057\b\loch\f1\fs36\lang2057\b\sbasedon2\snext3{\*\soutlvl1} heading 2;} |
3647 | -{\s9\sb240\sa120\keepn\rtlch\afs28\lang255\ab\ltrch\dbch\af4\langfe255\hich\f1\fs28\lang2057\b\loch\f1\fs28\lang2057\b\sbasedon2\snext3{\*\soutlvl2} heading 3;} |
3648 | -{\*\cs11\cf0\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 RTF_Num 2 1;} |
3649 | -{\*\cs12\cf0\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 RTF_Num 2 2;} |
3650 | -{\*\cs13\cf0\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 RTF_Num 2 3;} |
3651 | -{\*\cs14\cf0\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 RTF_Num 2 4;} |
3652 | -{\*\cs15\cf0\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 RTF_Num 2 5;} |
3653 | -{\*\cs16\cf0\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 RTF_Num 2 6;} |
3654 | -{\*\cs17\cf0\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 RTF_Num 2 7;} |
3655 | -{\*\cs18\cf0\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 RTF_Num 2 8;} |
3656 | -{\*\cs19\cf0\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 RTF_Num 2 9;} |
3657 | -{\*\cs20\cf0\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 RTF_Num 2 10;} |
3658 | -{\*\cs21\rtlch\af4\afs24\lang255\ab\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\b\loch\fs24\lang2057\b Strong Emphasis;} |
3659 | -{\*\cs22\cf2\ul\ulc0\rtlch\af4\afs24\lang255\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\loch\fs24\lang2057 Internet link;} |
3660 | -{\*\cs23\rtlch\af5\afs18\lang255\ltrch\dbch\af5\langfe255\hich\f5\fs18\lang2057\loch\f5\fs18\lang2057 Bullet Symbols;} |
3661 | -{\*\cs24\cf2\ul\ulc0\rtlch\af1\afs24\lang255\ltrch\dbch\af1\langfe255\hich\f1\fs24\lang2057\loch\f1\fs24\lang2057 Internet link;} |
3662 | -} |
3663 | -{\info{\creatim\yr2006\mo3\dy8\hr21\min21}{\revtim\yr1601\mo1\dy1\hr0\min0}{\printim\yr1601\mo1\dy1\hr0\min0}{\comment StarWriter}{\vern6800}}\deftab709 |
3664 | -{\*\pgdsctbl |
3665 | -{\pgdsc0\pgdscuse195\pgwsxn11905\pghsxn16837\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\pgdscnxt0 Standard;}} |
3666 | -{\*\pgdscno0}\paperh16837\paperw11905\margl1134\margr1134\margt1134\margb1134\sectd\sbknone\pgwsxn11905\pghsxn16837\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc |
3667 | -\pard\plain \ltrpar\s8\sb240\sa120\keepn\ql\rtlch\afs36\lang255\ab\ltrch\dbch\af4\langfe255\hich\f1\fs36\lang2057\b\loch\f1\fs36\lang2057\b {\rtlch \ltrch\loch\f1\fs36\lang2057\i0\b {\*\bkmkstart head-3abc76a6b8f36bdd2210d781fb32b17aa137bd22}{\*\bkmkend head-3abc76a6b8f36bdd2210d781fb32b17aa137bd22}\u1054\'3f\u1073\'3f Ubuntu} |
3668 | -\par \pard\plain \ltrpar\s3\sa120\ql\rtlch\af4\afs24\lang255\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\loch\fs24\lang2057 {\rtlch \ltrch\loch\f1\fs24\lang2057\i0\b0 Ubuntu \u1101\'3f\u1090\'3f\u1086\'3f \u1076\'3f\u1080\'3f\u1089\'3f\u1090\'3f\u1088\'3f\u1080\'3f\u1073\'3f\u1091\'3f\u1090\'3f\u1080\'3f\u1074\'3f Linux \u1089\'3f\u1086\'3f\u1079\'3f\u1076\'3f\u1072\'3f\u1085\'3f\u1085\'3f\u1099\'3f\u1081\'3f \u1074\'3f \u1076\'3f\u1091\'3f\u1093\'3f\u1077\'3f Debian (\u1080\'3f \u1086\'3f\u1089\'3f\u1085\'3f\u1086\'3f\u1074\'3f\u1072\'3f\u1085\'3f\u1085\'3f\u1099\'3f\u1081\'3f \u1085\'3f\u1072\'3f \u1085\'3f\u1105\'3f\u1084\'3f), \u1082\'3f\u1086\'3f\u1090\'3f\u1086\'3f\u1088\'3f\u1099\'3f\u1081\'3f \u1080\'3f\u1084\'3f\u1077\'3f\u1077\'3f\u1090\'3f \u1095\'3f\u1105\'3f\u1090\'3f\u1082\'3f\u1080\'3f\u1081\'3f \u1075\'3f\u1088\'3f\u1072\'3f\u1092\'3f\u1080\'3f\u1082\'3f \u1088\'3f\u1077\'3f\u1083\'3f\u1080\'3f\u1079\'3f\u1086\'3f\u1074\'3f (\u1085\'3f\u1086\'3f\u1074\'3f\u1099\'3f\u1081\'3f \u1088\'3f\u1077\'3f\u1083\'3f\u1080\'3f\u1079\'3f \u1082\'3f\u1072\'3f\u1078\'3f\u1076\'3f\u1099\'3f\u1077\'3f \u1096\'3f\u1077\'3f\u1089\'3f\u1090\'3f\u1100\'3f \u1084\'3f\u1077\'3f\u1089\'3f\u1103\'3f\u1094\'3f\u1077\'3f\u1074\'3f) \u1080\'3f \u1086\'3f\u1088\'3f\u1080\'3f\u1077\'3f\u1085\'3f\u1090\'3f\u1080\'3f\u1088\'3f\u1086\'3f\u1074\'3f\u1072\'3f\u1085\'3f\u1085\'3f\u1099\'3f\u1081\'3f \u1085\'3f\u1072\'3f \u1087\'3f\u1088\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1086\'3f\u1090\'3f\u1091\'3f \u1080\'3f\u1089\'3f\u1087\'3f\u1086\'3f\u1083\'3f\u1100\'3f\u1079\'3f\u1086\'3f\u1074\'3f\u1072\'3f\u1085\'3f\u1080\'3f\u1103\'3f \u1080\'3f \u1091\'3f\u1076\'3f\u1086\'3f\u1073\'3f\u1089\'3f\u1090\'3f\u1074\'3f\u1086\'3f \u1088\'3f\u1072\'3f\u1073\'3f\u1086\'3f\u1090\'3f\u1099\'3f (\u1074\'3f\u1089\'3f\u1105\'3f \u1076\'3f\u1086\'3f\u1083\'3f\u1078\'3f\u1085\'3f\u1086\'3f "\u1087\'3f\u1088\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1086\'3f \u1088\'3f\u1072\'3f\u1073\'3f\u1086\'3f\u1090\'3f\u1072\'3f\u1090\'3f\u1100\'3f" TM). \u1050\'3f\u1072\'3f\u1078\'3f\u1076\'3f\u1099\'3f\u1081\'3f \u1088\'3f\u1077\'3f\u1083\'3f\u1080\'3f\u1079\'3f |
3669 | - Ubuntu \u1087\'3f\u1086\'3f\u1076\'3f\u1076\'3f\u1077\'3f\u1088\'3f\u1078\'3f\u1080\'3f\u1074\'3f\u1072\'3f\u1077\'3f\u1090\'3f\u1089\'3f\u1103\'3f \u1086\'3f\u1073\'3f\u1085\'3f\u1086\'3f\u1074\'3f\u1083\'3f\u1077\'3f\u1085\'3f\u1080\'3f\u1103\'3f\u1084\'3f\u1080\'3f \u1073\'3f\u1077\'3f\u1079\'3f\u1086\'3f\u1087\'3f\u1072\'3f\u1089\'3f\u1085\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1080\'3f (security updates) \u1074\'3f \u1090\'3f\u1077\'3f\u1095\'3f\u1077\'3f\u1085\'3f\u1080\'3f\u1077\'3f 18 \u1084\'3f\u1077\'3f\u1089\'3f\u1103\'3f\u1094\'3f\u1077\'3f\u1074\'3f. Ubuntu \u1087\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1072\'3f\u1074\'3f\u1083\'3f\u1103\'3f\u1077\'3f\u1090\'3f\u1089\'3f\u1103\'3f \u1089\'3f \u1089\'3f\u1072\'3f\u1084\'3f\u1086\'3f\u1081\'3f \u1089\'3f\u1074\'3f\u1077\'3f\u1078\'3f\u1077\'3f\u1081\'3f \u1074\'3f\u1077\'3f\u1088\'3f\u1089\'3f\u1080\'3f\u1077\'3f\u1081\'3f Gnome \u1080\'3f \u1089\'3f \u1090\'3f\u1072\'3f\u1082\'3f\u1086\'3f\u1081\'3f \u1087\'3f\u1086\'3f\u1076\'3f\u1073\'3f\u1086\'3f\u1088\'3f\u1082\'3f\u1086\'3f\u1081\'3f \u1089\'3f\u1077\'3f\u1088\'3f\u1074\'3f\u1077\'3f\u1088\'3f\u1085\'3f\u1086\'3f\u1075\'3f\u1086\'3f \u1080\'3f \u1076\'3f\u1077\'3f\u1089\'3f\u1082\'3f\u1090\'3f\u1086\'3f\u1087\'3f\u1085\'3f\u1086\'3f\u1075\'3f\u1086\'3f \u1087\'3f\u1088\'3f\u1086\'3f\u1075\'3f\u1088\'3f\u1072\'3f\u1084\'3f\u1084\'3f\u1085\'3f\u1086\'3f\u1075\'3f\u1086\'3f \u1086\'3f\u1073\'3f\u1077\'3f\u1089\'3f\u1087\'3f\u1077\'3f\u1095\'3f\u1077\'3f\u1085\'3f\u1080\'3f\u1103\'3f \u1082\'3f\u1086\'3f\u1090\'3f\u1086\'3f\u1088\'3f\u1072\'3f\u1103\'3f \u1087\'3f\u1086\'3f\u1079\'3f\u1074\'3f\u1086\'3f\u1083\'3f\u1103\'3f\u1077\'3f\u1090\'3f \u1089\'3f\u1086\'3f\u1079\'3f\u1076\'3f\u1072\'3f\u1090\'3f\u1100\'3f \u1091\'3f\u1076\'3f\u1086\'3f\u1073\'3f\u1085\'3f\u1086\'3f\u1077\'3f \u1088\'3f\u1072\'3f\u1073\'3f\u1086\'3f\u1095\'3f\u1077\'3f\u1077\'3f \u1086\'3f\u1082\'3f\u1088\'3f\u1091\'3f\u1078\'3f |
3670 | -\u1077\'3f\u1085\'3f\u1080\'3f\u1077\'3f c \u1087\'3f\u1086\'3f\u1084\'3f\u1086\'3f\u1097\'3f\u1100\'3f\u1102\'3f \u1074\'3f\u1089\'3f\u1077\'3f\u1075\'3f\u1086\'3f \u1083\'3f\u1080\'3f\u1096\'3f\u1100\'3f \u1086\'3f\u1076\'3f\u1085\'3f\u1086\'3f\u1075\'3f\u1086\'3f \u1091\'3f\u1089\'3f\u1090\'3f\u1072\'3f\u1085\'3f\u1086\'3f\u1074\'3f\u1086\'3f\u1095\'3f\u1085\'3f\u1086\'3f\u1075\'3f\u1086\'3f CD. } |
3671 | -\par \pard\plain \ltrpar\s3\sa120\ql\rtlch\af4\afs24\lang255\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\loch\fs24\lang2057 {\rtlch \ltrch\loch\f1\fs24\lang2057\i0\b0 \u1063\'3f\u1090\'3f\u1086\'3f \u1078\'3f\u1077\'3f \u1076\'3f\u1077\'3f\u1083\'3f\u1072\'3f\u1077\'3f\u1090\'3f Ubuntu \u1086\'3f\u1089\'3f\u1086\'3f\u1073\'3f\u1099\'3f\u1084\'3f? \u1055\'3f\u1086\'3f\u1095\'3f\u1077\'3f\u1084\'3f\u1091\'3f \u1083\'3f\u1102\'3f\u1076\'3f\u1080\'3f \u1074\'3f\u1099\'3f\u1073\'3f\u1080\'3f\u1088\'3f\u1072\'3f\u1102\'3f\u1090\'3f Ubuntu \u1074\'3f \u1082\'3f\u1072\'3f\u1095\'3f\u1077\'3f\u1089\'3f\u1090\'3f\u1074\'3f\u1077\'3f \u1083\'3f\u1102\'3f\u1073\'3f\u1080\'3f\u1084\'3f\u1086\'3f\u1075\'3f\u1086\'3f \u1076\'3f\u1080\'3f\u1089\'3f\u1090\'3f\u1088\'3f\u1080\'3f\u1073\'3f\u1091\'3f\u1090\'3f\u1080\'3f\u1074\'3f\u1072\'3f \u1076\'3f\u1083\'3f\u1103\'3f \u1088\'3f\u1072\'3f\u1073\'3f\u1086\'3f\u1090\'3f\u1099\'3f \u1080\'3f \u1088\'3f\u1072\'3f\u1079\'3f\u1074\'3f\u1083\'3f\u1077\'3f\u1095\'3f\u1077\'3f\u1085\'3f\u1080\'3f\u1081\'3f? } |
3672 | -\par \pard\plain \ltrpar\s9\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ab\ltrch\dbch\af4\langfe255\hich\f1\fs28\lang2057\b\loch\f1\fs28\lang2057\b {\rtlch \ltrch\loch\f1\fs28\lang2057\i0\b \u1056\'3f\u1077\'3f\u1075\'3f\u1091\'3f\u1083\'3f\u1103\'3f\u1088\'3f\u1085\'3f\u1099\'3f\u1077\'3f \u1080\'3f \u1087\'3f\u1088\'3f\u1077\'3f\u1076\'3f\u1089\'3f\u1082\'3f\u1072\'3f\u1079\'3f\u1091\'3f\u1077\'3f\u1084\'3f\u1099\'3f\u1077\'3f \u1088\'3f\u1077\'3f\u1083\'3f\u1080\'3f\u1079\'3f\u1099\'3f} |
3673 | -\par \pard\plain \ltrpar\s3\sa120\ql\rtlch\af4\afs24\lang255\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\loch\fs24\lang2057 {\rtlch \ltrch\loch\f1\fs24\lang2057\i0\b0 \u1050\'3f\u1086\'3f\u1084\'3f\u1072\'3f\u1085\'3f\u1076\'3f\u1072\'3f \u1088\'3f\u1072\'3f\u1079\'3f\u1088\'3f\u1072\'3f\u1073\'3f\u1086\'3f\u1090\'3f\u1095\'3f\u1080\'3f\u1082\'3f\u1086\'3f\u1074\'3f Ubuntu \u1074\'3f\u1099\'3f\u1087\'3f\u1091\'3f\u1089\'3f\u1082\'3f\u1072\'3f\u1077\'3f\u1090\'3f \u1085\'3f\u1086\'3f\u1074\'3f\u1091\'3f\u1102\'3f \u1074\'3f\u1077\'3f\u1088\'3f\u1089\'3f\u1080\'3f\u1102\'3f Ubuntu \u1082\'3f\u1072\'3f\u1078\'3f\u1076\'3f\u1099\'3f\u1077\'3f \u1096\'3f\u1077\'3f\u1089\'3f\u1090\'3f\u1100\'3f \u1084\'3f\u1077\'3f\u1089\'3f\u1103\'3f\u1094\'3f\u1077\'3f\u1074\'3f. \u1054\'3f\u1085\'3f\u1072\'3f \u1089\'3f\u1086\'3f\u1076\'3f\u1077\'3f\u1088\'3f\u1078\'3f\u1080\'3f\u1090\'3f \u1087\'3f\u1086\'3f\u1089\'3f\u1083\'3f\u1077\'3f\u1076\'3f\u1085\'3f\u1102\'3f\u1102\'3f \u1074\'3f\u1077\'3f\u1088\'3f\u1089\'3f\u1080\'3f\u1102\'3f \u1103\'3f\u1076\'3f\u1088\'3f\u1072\'3f, X, Gnome \u1080\'3f \u1076\'3f\u1088\'3f\u1091\'3f\u1075\'3f\u1080\'3f\u1093\'3f \u1086\'3f\u1089\'3f\u1085\'3f\u1086\'3f\u1074\'3f\u1085\'3f\u1099\'3f\u1093\'3f \u1087\'3f\u1088\'3f\u1080\'3f\u1083\'3f\u1086\'3f\u1078\'3f\u1077\'3f\u1085\'3f\u1080\'3f\u1081\'3f \u1080\'3f \u1087\'3f\u1086\'3f\u1076\'3f\u1076\'3f\u1077\'3f\u1088\'3f\u1078\'3f\u1080\'3f\u1074\'3f\u1072\'3f\u1077\'3f\u1090\'3f\u1089\'3f\u1103\'3f \u1086\'3f\u1073\'3f\u1085\'3f\u1086\'3f\u1074\'3f\u1083\'3f\u1077\'3f\u1085\'3f\u1080\'3f\u1103\'3f\u1084\'3f\u1080\'3f \u1073\'3f\u1077\'3f\u1079\'3f\u1086\'3f\u1087\'3f\u1072\'3f\u1089\'3f\u1085\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1080\'3f \u1074\'3f \u1090\'3f\u1077\'3f\u1095\'3f\u1077\'3f\u1085\'3f\u1080\'3f\u1077\'3f 18 \u1084\'3f\u1077\'3f\u1089\'3f\u1103\'3f\u1094\'3f\u1077\'3f\u1074\'3f. \u1055\'3f\u1077\'3f\u1088\'3f\u1074\'3f\u1099\'3f\u1084\'3f \u1087\'3f\u1091\'3f\u1073\'3f\u1083\'3f\u1080\'3f\u1095\'3f\u1085\'3f\u1099\'3f\u1084\'3f \u1088\'3f\u1077\'3f\u1083\'3f\u1080\'3f\u1079\'3f\u1086\'3f\u1084\'3f Ubuntu \u1073\'3f\u1099\'3f\u1083\'3f |
3674 | -**Ubuntu 4.10 Preview** (\u1082\'3f\u1086\'3f\u1076\'3f\u1086\'3f\u1074\'3f\u1086\'3f\u1077\'3f \u1085\'3f\u1072\'3f\u1079\'3f\u1074\'3f\u1072\'3f\u1085\'3f\u1080\'3f\u1077\'3f "the {\*\cs21\rtlch\ltrch\dbch\hich\fs24\lang2057\b\loch\fs24\lang2057\b Warty Warthog}" \u1080\'3f\u1083\'3f\u1080\'3f \u1087\'3f\u1088\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1086\'3f "{\*\cs21\rtlch\ltrch\dbch\hich\fs24\lang2057\b\loch\fs24\lang2057\b Warty}"). \u1042\'3f\u1099\'3f \u1084\'3f\u1086\'3f\u1078\'3f\u1077\'3f\u1090\'3f\u1077\'3f \u1079\'3f\u1072\'3f\u1075\'3f\u1088\'3f\u1091\'3f\u1079\'3f\u1080\'3f\u1090\'3f\u1100\'3f \u1086\'3f\u1073\'3f\u1088\'3f\u1072\'3f\u1079\'3f CD \u1080\'3f \u1079\'3f\u1072\'3f\u1087\'3f\u1080\'3f\u1089\'3f\u1072\'3f\u1090\'3f\u1100\'3f \u1077\'3f\u1075\'3f\u1086\'3f \u1089\'3f\u1072\'3f\u1084\'3f\u1080\'3f \u1080\'3f\u1083\'3f\u1080\'3f \u1079\'3f\u1072\'3f\u1082\'3f\u1072\'3f\u1079\'3f\u1072\'3f\u1090\'3f\u1100\'3f \u1077\'3f\u1075\'3f\u1086\'3f \u1091\'3f \u1085\'3f\u1072\'3f\u1089\'3f. } |
3675 | -\par \pard\plain \ltrpar\s9\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ab\ltrch\dbch\af4\langfe255\hich\f1\fs28\lang2057\b\loch\f1\fs28\lang2057\b {\rtlch \ltrch\loch\f1\fs28\lang2057\i0\b \u1041\'3f\u1077\'3f\u1089\'3f\u1087\'3f\u1083\'3f\u1072\'3f\u1090\'3f\u1085\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1100\'3f} |
3676 | -\par \pard\plain \ltrpar\s3\sa120\ql\rtlch\af4\afs24\lang255\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\loch\fs24\lang2057 {\rtlch \ltrch\loch\f1\fs24\lang2057\i0\b0 Ubuntu \u1103\'3f\u1074\'3f\u1083\'3f\u1103\'3f\u1077\'3f\u1090\'3f\u1089\'3f\u1103\'3f \u1089\'3f\u1074\'3f\u1086\'3f\u1073\'3f\u1086\'3f\u1076\'3f\u1085\'3f\u1099\'3f\u1084\'3f \u1087\'3f\u1088\'3f\u1086\'3f\u1075\'3f\u1088\'3f\u1072\'3f\u1084\'3f\u1084\'3f\u1085\'3f\u1099\'3f\u1084\'3f \u1086\'3f\u1073\'3f\u1077\'3f\u1089\'3f\u1087\'3f\u1077\'3f\u1095\'3f\u1077\'3f\u1085\'3f\u1080\'3f\u1077\'3f\u1084\'3f \u1080\'3f \u1076\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1091\'3f\u1087\'3f\u1077\'3f\u1085\'3f \u1073\'3f\u1077\'3f\u1089\'3f\u1087\'3f\u1083\'3f\u1072\'3f\u1090\'3f\u1085\'3f\u1086\'3f. \u1042\'3f \u1086\'3f\u1090\'3f\u1083\'3f\u1080\'3f\u1095\'3f\u1080\'3f\u1077\'3f \u1086\'3f\u1090\'3f \u1084\'3f\u1085\'3f\u1086\'3f\u1075\'3f\u1080\'3f\u1093\'3f \u1076\'3f\u1088\'3f\u1091\'3f\u1075\'3f\u1080\'3f\u1093\'3f \u1082\'3f\u1086\'3f\u1084\'3f\u1084\'3f\u1077\'3f\u1088\'3f\u1095\'3f\u1077\'3f\u1089\'3f\u1082\'3f\u1080\'3f\u1093\'3f \u1076\'3f\u1080\'3f\u1089\'3f\u1090\'3f\u1088\'3f\u1080\'3f\u1073\'3f\u1091\'3f\u1090\'3f\u1080\'3f\u1074\'3f\u1086\'3f\u1074\'3f \u1080\'3f\u1079\'3f \u1084\'3f\u1080\'3f\u1088\'3f\u1072\'3f Linux (Libranet, Lindows, Xandros, Red Hat) \u1082\'3f\u1086\'3f\u1084\'3f\u1072\'3f\u1085\'3f\u1076\'3f\u1072\'3f \u1088\'3f\u1072\'3f\u1079\'3f\u1088\'3f\u1072\'3f\u1073\'3f\u1086\'3f\u1090\'3f\u1095\'3f\u1080\'3f\u1082\'3f\u1086\'3f\u1074\'3f Ubuntu \u1076\'3f\u1077\'3f\u1081\'3f\u1089\'3f\u1090\'3f\u1074\'3f\u1080\'3f\u1090\'3f\u1077\'3f\u1083\'3f\u1100\'3f\u1085\'3f\u1086\'3f \u1074\'3f\u1077\'3f\u1088\'3f\u1080\'3f\u1090\'3f \u1074\'3f \u1090\'3f\u1086\'3f \u1095\'3f\u1090\'3f\u1086\'3f \u1057\'3f\u1074\'3f\u1086\'3f\u1073\'3f\u1086\'3f\u1076\'3f\u1085\'3f\u1086\'3f\u1077\'3f \u1055\'3f\u1054\'3f \u1076\'3f\u1086\'3f\u1083\'3f\u1078\'3f\u1085\'3f\u1086\'3f |
3677 | - \u1073\'3f\u1099\'3f\u1090\'3f\u1100\'3f \u1089\'3f\u1074\'3f\u1086\'3f\u1073\'3f\u1086\'3f\u1076\'3f\u1085\'3f\u1086\'3f \u1086\'3f\u1090\'3f \u1079\'3f\u1072\'3f\u1090\'3f\u1088\'3f\u1072\'3f\u1090\'3f \u1085\'3f\u1072\'3f \u1083\'3f\u1080\'3f\u1094\'3f\u1077\'3f\u1085\'3f\u1079\'3f\u1080\'3f\u1088\'3f\u1086\'3f\u1074\'3f\u1072\'3f\u1085\'3f\u1080\'3f\u1077\'3f. } |
3678 | -\par \pard\plain \ltrpar\s9\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ab\ltrch\dbch\af4\langfe255\hich\f1\fs28\lang2057\b\loch\f1\fs28\lang2057\b {\rtlch \ltrch\loch\f1\fs28\lang2057\i0\b \u1055\'3f\u1088\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1072\'3f\u1103\'3f \u1080\'3f \u1073\'3f\u1099\'3f\u1089\'3f\u1090\'3f\u1088\'3f\u1072\'3f\u1103\'3f \u1091\'3f\u1089\'3f\u1090\'3f\u1072\'3f\u1085\'3f\u1086\'3f\u1074\'3f\u1082\'3f\u1072\'3f} |
3679 | -\par \pard\plain \ltrpar\s3\sa120\ql\rtlch\af4\afs24\lang255\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\loch\fs24\lang2057 {\rtlch \ltrch\loch\f1\fs24\lang2057\i0\b0 \u1042\'3f Ubuntu \u1085\'3f\u1077\'3f\u1090\'3f \u1082\'3f\u1088\'3f\u1072\'3f\u1089\'3f\u1080\'3f\u1074\'3f\u1086\'3f\u1075\'3f\u1086\'3f \u1075\'3f\u1088\'3f\u1072\'3f\u1092\'3f\u1080\'3f\u1095\'3f\u1077\'3f\u1089\'3f\u1082\'3f\u1086\'3f\u1075\'3f\u1086\'3f \u1080\'3f\u1085\'3f\u1089\'3f\u1090\'3f\u1072\'3f\u1083\'3f\u1103\'3f\u1090\'3f\u1086\'3f\u1088\'3f\u1072\'3f, \u1074\'3f \u1085\'3f\u1105\'3f\u1084\'3f \u1077\'3f\u1089\'3f\u1090\'3f\u1100\'3f \u1055\'3f\u1056\'3f\u1054\'3f\u1057\'3f\u1058\'3f\u1054\'3f\u1049\'3f \u1080\'3f \u1041\'3f\u1067\'3f\u1057\'3f\u1058\'3f\u1056\'3f\u1067\'3f\u1049\'3f \u1080\'3f\u1085\'3f\u1089\'3f\u1090\'3f\u1072\'3f\u1083\'3f\u1103\'3f\u1090\'3f\u1086\'3f\u1088\'3f. \u1051\'3f\u1072\'3f\u1076\'3f\u1085\'3f\u1086\'3f, \u1074\'3f \u1085\'3f\u1105\'3f\u1084\'3f \u1076\'3f\u1086\'3f \u1089\'3f\u1080\'3f\u1093\'3f \u1087\'3f\u1086\'3f\u1088\'3f \u1077\'3f\u1089\'3f\u1090\'3f\u1100\'3f \u1085\'3f\u1077\'3f\u1089\'3f\u1082\'3f\u1086\'3f\u1083\'3f\u1100\'3f\u1082\'3f\u1086\'3f \u1084\'3f\u1077\'3f\u1089\'3f\u1090\'3f \u1075\'3f\u1076\'3f\u1077\'3f \u1074\'3f\u1099\'3f \u1076\'3f\u1086\'3f\u1083\'3f\u1078\'3f\u1085\'3f\u1099\'3f \u1079\'3f\u1085\'3f\u1072\'3f\u1090\'3f\u1100\'3f \u1095\'3f\u1090\'3f\u1086\'3f \u1074\'3f\u1099\'3f \u1076\'3f\u1077\'3f\u1083\'3f\u1072\'3f\u1077\'3f\u1090\'3f\u1077\'3f, \u1085\'3f\u1086\'3f \u1079\'3f\u1085\'3f\u1072\'3f\u1095\'3f\u1077\'3f\u1085\'3f\u1080\'3f\u1103\'3f \u1087\'3f\u1086\'3f \u1091\'3f\u1084\'3f\u1086\'3f\u1083\'3f\u1095\'3f\u1072\'3f\u1085\'3f\u1080\'3f\u1102\'3f \u1087\'3f\u1086\'3f\u1076\'3f\u1086\'3f\u1081\'3f\u1076\'3f\u1091\'3f\u1090\'3f \u1076\'3f\u1083\'3f\u1103\'3f \u1073\'3f\u1086\'3f\u1083\'3f\u1100\'3f\u1096\'3f\u1080\'3f\u1085\'3f\u1089\'3f\u1090\'3f\u1074\'3f\u1072\'3f \u1087\'3f\u1086\'3f\u1083\'3f\u1100\'3f\u1079\'3f\u1086\'3f\u1074\'3f\u1072\'3f\u1090\'3f\u1077\'3f\u1083\'3f\u1077\'3f\u1081\'3f. \u1052\'3f\u1099\'3f \u1089\'3f\u1076\'3f\u1077\'3f\u1083\'3f\u1072\'3f\u1083\'3f\u1080\'3f \u1082\'3f\u1086\'3f\u1084\'3f\u1087\'3f\u1083\'3f\u1077\'3f\u1082\'3f\u1090\'3f \u1091\'3f |
3680 | -\u1089\'3f\u1090\'3f\u1072\'3f\u1085\'3f\u1086\'3f\u1074\'3f\u1086\'3f\u1095\'3f\u1085\'3f\u1099\'3f\u1093\'3f \u1076\'3f\u1080\'3f\u1089\'3f\u1082\'3f\u1086\'3f\u1074\'3f \u1089\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1086\'3f\u1103\'3f\u1097\'3f\u1080\'3f\u1081\'3f \u1074\'3f\u1089\'3f\u1077\'3f\u1075\'3f\u1086\'3f \u1083\'3f\u1080\'3f\u1096\'3f\u1100\'3f \u1080\'3f\u1079\'3f \u1086\'3f\u1076\'3f\u1085\'3f\u1086\'3f\u1075\'3f\u1086\'3f CD, \u1074\'3f\u1089\'3f\u1105\'3f \u1086\'3f\u1089\'3f\u1090\'3f\u1072\'3f\u1083\'3f\u1100\'3f\u1085\'3f\u1086\'3f\u1077\'3f \u1076\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1091\'3f\u1087\'3f\u1085\'3f\u1086\'3f \u1087\'3f\u1086\'3f \u1089\'3f\u1077\'3f\u1090\'3f\u1080\'3f \u1074\'3f \u1089\'3f\u1083\'3f\u1091\'3f\u1095\'3f\u1072\'3f\u1077\'3f \u1085\'3f\u1077\'3f\u1086\'3f\u1073\'3f\u1093\'3f\u1086\'3f\u1076\'3f\u1080\'3f\u1084\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1080\'3f. \u1053\'3f\u1072\'3f \u1082\'3f\u1086\'3f\u1084\'3f\u1087\'3f\u1100\'3f\u1102\'3f\u1090\'3f\u1077\'3f\u1088\'3f\u1077\'3f \u1089\'3f\u1088\'3f\u1077\'3f\u1076\'3f\u1085\'3f\u1077\'3f\u1081\'3f \u1082\'3f\u1086\'3f\u1085\'3f\u1092\'3f\u1080\'3f\u1075\'3f\u1091\'3f\u1088\'3f\u1072\'3f\u1094\'3f\u1080\'3f\u1080\'3f \u1091\'3f\u1089\'3f\u1090\'3f\u1072\'3f\u1085\'3f\u1086\'3f\u1074\'3f\u1082\'3f\u1072\'3f Ubuntu \u1087\'3f\u1088\'3f\u1086\'3f\u1080\'3f\u1079\'3f\u1074\'3f\u1086\'3f\u1076\'3f\u1080\'3f\u1090\'3f\u1089\'3f\u1103\'3f \u1084\'3f\u1077\'3f\u1085\'3f\u1077\'3f\u1077\'3f \u1095\'3f\u1077\'3f\u1084\'3f \u1079\'3f\u1072\'3f 25 \u1084\'3f\u1080\'3f\u1085\'3f\u1091\'3f\u1090\'3f. } |
3681 | -\par \pard\plain \ltrpar\s3\sa120\ql\rtlch\af4\afs24\lang255\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\loch\fs24\lang2057 {\rtlch \ltrch\loch\f1\fs24\lang2057\i0\b0 \u1048\'3f\u1085\'3f\u1089\'3f\u1090\'3f\u1072\'3f\u1083\'3f\u1103\'3f\u1090\'3f\u1086\'3f\u1088\'3f \u1085\'3f\u1077\'3f \u1075\'3f\u1088\'3f\u1072\'3f\u1092\'3f\u1080\'3f\u1095\'3f\u1077\'3f\u1089\'3f\u1082\'3f\u1080\'3f\u1081\'3f, \u1085\'3f\u1086\'3f \u1074\'3f\u1072\'3f\u1084\'3f \u1085\'3f\u1091\'3f\u1078\'3f\u1085\'3f\u1086\'3f \u1073\'3f\u1091\'3f\u1076\'3f\u1077\'3f\u1090\'3f \u1080\'3f\u1089\'3f\u1087\'3f\u1086\'3f\u1083\'3f\u1100\'3f\u1079\'3f\u1086\'3f\u1074\'3f\u1072\'3f\u1090\'3f\u1100\'3f \u1077\'3f\u1075\'3f\u1086\'3f \u1074\'3f\u1089\'3f\u1077\'3f\u1075\'3f\u1086\'3f \u1083\'3f\u1080\'3f\u1096\'3f\u1100\'3f \u1086\'3f\u1076\'3f\u1080\'3f\u1085\'3f \u1088\'3f\u1072\'3f\u1079\'3f \u1087\'3f\u1086\'3f\u1090\'3f\u1086\'3f\u1084\'3f\u1091\'3f \u1095\'3f\u1090\'3f\u1086\'3f \u1084\'3f\u1099\'3f \u1087\'3f\u1086\'3f\u1076\'3f\u1076\'3f\u1077\'3f\u1088\'3f\u1078\'3f\u1080\'3f\u1074\'3f\u1072\'3f\u1077\'3f\u1084\'3f \u1086\'3f\u1073\'3f\u1085\'3f\u1086\'3f\u1074\'3f\u1083\'3f\u1077\'3f\u1085\'3f\u1080\'3f\u1077\'3f \u1089\'3f \u1086\'3f\u1076\'3f\u1085\'3f\u1086\'3f\u1081\'3f \u1074\'3f\u1077\'3f\u1088\'3f\u1089\'3f\u1080\'3f\u1080\'3f \u1085\'3f\u1072\'3f \u1076\'3f\u1088\'3f\u1091\'3f\u1075\'3f\u1091\'3f\u1102\'3f \u1087\'3f\u1086\'3f \u1089\'3f\u1077\'3f\u1090\'3f\u1080\'3f. \u1059\'3f \u1074\'3f\u1072\'3f\u1089\'3f \u1085\'3f\u1077\'3f\u1090\'3f \u1085\'3f\u1077\'3f\u1086\'3f\u1073\'3f\u1093\'3f\u1086\'3f\u1076\'3f\u1080\'3f\u1084\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1080\'3f \u1087\'3f\u1077\'3f\u1088\'3f\u1077\'3f\u1091\'3f\u1089\'3f\u1090\'3f\u1072\'3f\u1085\'3f\u1072\'3f\u1074\'3f\u1083\'3f\u1080\'3f\u1074\'3f\u1072\'3f\u1090\'3f\u1100\'3f \u1086\'3f\u1087\'3f\u1077\'3f\u1088\'3f\u1072\'3f\u1094\'3f\u1080\'3f\u1086\'3f\u1085\'3f\u1085\'3f\u1091\'3f\u1102\'3f \u1089\'3f\u1080\'3f\u1089\'3f\u1090\'3f\u1077\'3f\u1084\'3f\u1091\'3f, \u1087\'3f\u1088\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1086\'3f \u1086\'3f\u1073\'3f\u1085\'3f\u1086\'3f\u1074\'3f\u1080\'3f\u1090\'3f\u1077\'3f\u1089\'3f\u1100\'3f \u1089\'3f \u1090\'3f\u1077\'3f\u1082\'3f\u1091\'3f\u1097\'3f\u1077\'3f\u1081\'3f \u1074\'3f\u1077\'3f\u1088\'3f\u1089\'3f\u1080\'3f\u1080\'3f \u1085\'3f\u1072\'3f |
3682 | - \u1089\'3f\u1083\'3f\u1077\'3f\u1076\'3f\u1091\'3f\u1102\'3f\u1097\'3f\u1091\'3f\u1102\'3f \u1082\'3f\u1086\'3f\u1075\'3f\u1076\'3f\u1072\'3f \u1079\'3f\u1072\'3f\u1093\'3f\u1086\'3f\u1090\'3f\u1080\'3f\u1090\'3f\u1077\'3f. } |
3683 | -\par \pard\plain \ltrpar\s9\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ab\ltrch\dbch\af4\langfe255\hich\f1\fs28\lang2057\b\loch\f1\fs28\lang2057\b {\rtlch \ltrch\loch\f1\fs28\lang2057\i0\b \u1043\'3f\u1086\'3f\u1090\'3f\u1086\'3f\u1074\'3f\u1085\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1100\'3f \u1082\'3f \u1088\'3f\u1072\'3f\u1073\'3f\u1086\'3f\u1090\'3f\u1077\'3f} |
3684 | -\par \pard\plain \ltrpar\s3\sa120\ql\rtlch\af4\afs24\lang255\ltrch\dbch\af4\langfe255\hich\fs24\lang2057\loch\fs24\lang2057 {\rtlch \ltrch\loch\f1\fs24\lang2057\i0\b0 \u1050\'3f\u1072\'3f\u1082\'3f \u1090\'3f\u1086\'3f\u1083\'3f\u1100\'3f\u1082\'3f\u1086\'3f \u1074\'3f\u1099\'3f \u1079\'3f\u1072\'3f\u1074\'3f\u1077\'3f\u1088\'3f\u1096\'3f\u1080\'3f\u1090\'3f\u1077\'3f \u1091\'3f\u1089\'3f\u1090\'3f\u1072\'3f\u1085\'3f\u1086\'3f\u1074\'3f\u1082\'3f\u1091\'3f \u1074\'3f\u1072\'3f\u1096\'3f\u1072\'3f \u1089\'3f\u1080\'3f\u1089\'3f\u1090\'3f\u1077\'3f\u1084\'3f\u1072\'3f \u1089\'3f\u1088\'3f\u1072\'3f\u1079\'3f\u1091\'3f \u1078\'3f\u1077\'3f \u1075\'3f\u1086\'3f\u1090\'3f\u1086\'3f\u1074\'3f\u1072\'3f \u1082\'3f \u1088\'3f\u1072\'3f\u1073\'3f\u1086\'3f\u1090\'3f\u1077\'3f. \u1042\'3f\u1099\'3f \u1080\'3f\u1084\'3f\u1077\'3f\u1077\'3f\u1090\'3f\u1077\'3f \u1087\'3f\u1086\'3f\u1083\'3f\u1085\'3f\u1099\'3f\u1081\'3f \u1082\'3f\u1086\'3f\u1084\'3f\u1087\'3f\u1083\'3f\u1077\'3f\u1082\'3f\u1090\'3f \u1073\'3f\u1080\'3f\u1079\'3f\u1085\'3f\u1077\'3f\u1089\'3f \u1087\'3f\u1088\'3f\u1080\'3f\u1083\'3f\u1086\'3f\u1078\'3f\u1077\'3f\u1085\'3f\u1080\'3f\u1081\'3f, \u1080\'3f\u1085\'3f\u1090\'3f\u1077\'3f\u1088\'3f\u1085\'3f\u1077\'3f\u1090\'3f \u1087\'3f\u1088\'3f\u1080\'3f\u1083\'3f\u1086\'3f\u1078\'3f\u1077\'3f\u1085\'3f\u1080\'3f\u1081\'3f, \u1087\'3f\u1088\'3f\u1080\'3f\u1083\'3f\u1086\'3f\u1078\'3f\u1077\'3f\u1085\'3f\u1080\'3f\u1081\'3f \u1076\'3f\u1083\'3f\u1103\'3f \u1088\'3f\u1072\'3f\u1073\'3f\u1086\'3f\u1090\'3f\u1099\'3f \u1089\'3f \u1075\'3f\u1088\'3f\u1072\'3f\u1092\'3f\u1080\'3f\u1082\'3f\u1086\'3f\u1081\'3f \u1080\'3f \u1080\'3f\u1075\'3f\u1088\'3f\u1099\'3f. \u1054\'3f\u1076\'3f\u1080\'3f\u1085\'3f \u1076\'3f\u1080\'3f\u1089\'3f\u1082\'3f \u1087\'3f\u1088\'3f\u1077\'3f\u1076\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1072\'3f\u1074\'3f\u1080\'3f\u1090\'3f \u1074\'3f\u1072\'3f\u1084\'3f \u1093\'3f\u1086\'3f\u1088\'3f\u1086\'3f\u1096\'3f\u1077\'3f\u1077\'3f \u1088\'3f\u1072\'3f\u1073\'3f\u1086\'3f\u1095\'3f\u1077\'3f\u1077\'3f \u1086\'3f\u1082\'3f\u1088\'3f\u1091\'3f\u1078\'3f\u1077\'3f\u1085\'3f\u1080\'3f\u1077\'3f "\u1080\'3f\u1079\'3f \u1082\'3f\u1086\'3f\u1088\'3f\u1086\'3f\u1073\'3f\u1082\'3f\u1080\'3f" \u1089\'3f\u1086\'3f \u1084\'3f\u1085\'3f\u1086\'3f\u1078\'3f\u1077\'3f\u1089\'3f\u1090\'3f |
3685 | -\u1074\'3f\u1086\'3f\u1084\'3f \u1087\'3f\u1088\'3f\u1080\'3f\u1083\'3f\u1086\'3f\u1078\'3f\u1077\'3f\u1085\'3f\u1080\'3f\u1081\'3f \u1076\'3f\u1083\'3f\u1103\'3f \u1076\'3f\u1086\'3f\u1084\'3f\u1072\'3f\u1096\'3f\u1085\'3f\u1080\'3f\u1093\'3f \u1080\'3f \u1073\'3f\u1080\'3f\u1079\'3f\u1085\'3f\u1077\'3f\u1089\'3f \u1087\'3f\u1086\'3f\u1083\'3f\u1100\'3f\u1079\'3f\u1086\'3f\u1074\'3f\u1072\'3f\u1090\'3f\u1077\'3f\u1083\'3f\u1077\'3f\u1081\'3f \u1091\'3f\u1089\'3f\u1090\'3f\u1072\'3f\u1085\'3f\u1086\'3f\u1074\'3f\u1083\'3f\u1077\'3f\u1085\'3f\u1099\'3f\u1093\'3f \u1087\'3f\u1086\'3f \u1091\'3f\u1084\'3f\u1086\'3f\u1083\'3f\u1095\'3f\u1072\'3f\u1085\'3f\u1080\'3f\u1102\'3f. \u1045\'3f\u1089\'3f\u1090\'3f\u1100\'3f \u1090\'3f\u1099\'3f\u1089\'3f\u1103\'3f\u1095\'3f\u1080\'3f \u1076\'3f\u1088\'3f\u1091\'3f\u1075\'3f\u1080\'3f\u1093\'3f \u1087\'3f\u1088\'3f\u1086\'3f\u1075\'3f\u1088\'3f\u1072\'3f\u1084\'3f\u1084\'3f \u1076\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1091\'3f\u1087\'3f\u1085\'3f\u1099\'3f\u1093\'3f \u1074\'3f\u1089\'3f\u1077\'3f\u1075\'3f\u1086\'3f \u1089\'3f \u1087\'3f\u1086\'3f\u1084\'3f\u1086\'3f\u1097\'3f\u1100\'3f\u1102\'3f \u1085\'3f\u1077\'3f\u1089\'3f\u1082\'3f\u1086\'3f\u1083\'3f\u1100\'3f\u1082\'3f\u1080\'3f\u1093\'3f \u1082\'3f\u1083\'3f\u1080\'3f\u1082\'3f\u1086\'3f\u1074\'3f \u1086\'3f\u1076\'3f\u1085\'3f\u1072\'3f\u1082\'3f\u1086\'3f \u1084\'3f\u1099\'3f \u1090\'3f\u1103\'3f\u1078\'3f\u1077\'3f\u1083\'3f\u1086\'3f \u1087\'3f\u1086\'3f\u1088\'3f\u1072\'3f\u1073\'3f\u1086\'3f\u1090\'3f\u1072\'3f\u1083\'3f\u1080\'3f \u1095\'3f\u1090\'3f\u1086\'3f\u1073\'3f\u1099\'3f \u1087\'3f\u1088\'3f\u1077\'3f\u1076\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1072\'3f\u1074\'3f\u1080\'3f\u1090\'3f\u1100\'3f \u1086\'3f\u1089\'3f\u1085\'3f\u1086\'3f\u1074\'3f\u1085\'3f\u1099\'3f\u1077\'3f \u1087\'3f\u1088\'3f\u1080\'3f\u1083\'3f\u1086\'3f\u1078\'3f\u1077\'3f\u1085\'3f\u1080\'3f\u1103\'3f \u1087\'3f\u1088\'3f\u1086\'3f\u1089\'3f\u1090\'3f\u1086\'3f \u1080\'3f \u1101\'3f\u1092\'3f\u1092\'3f\u1077\'3f\u1082\'3f\u1090\'3f\u1080\'3f\u1074\'3f\u1085\'3f\u1086\'3f. } |
3686 | -\par } |
3687 | \ No newline at end of file |
3688 | |
3689 | === removed file 'data/documents/Trigonometric_functions.xls' |
3690 | Binary files data/documents/Trigonometric_functions.xls 2010-08-13 16:23:16 +0000 and data/documents/Trigonometric_functions.xls 1970-01-01 00:00:00 +0000 differ |
3691 | === removed file 'data/images/SVG_Color_Image_Xubuntu.svg' |
3692 | --- data/images/SVG_Color_Image_Xubuntu.svg 2010-08-13 16:23:16 +0000 |
3693 | +++ data/images/SVG_Color_Image_Xubuntu.svg 1970-01-01 00:00:00 +0000 |
3694 | @@ -1,109 +0,0 @@ |
3695 | -<?xml version="1.0" encoding="UTF-8" standalone="no"?> |
3696 | -<!-- Created with Inkscape (http://www.inkscape.org/) --> |
3697 | -<svg |
3698 | - xmlns:svg="http://www.w3.org/2000/svg" |
3699 | - xmlns="http://www.w3.org/2000/svg" |
3700 | - version="1.0" |
3701 | - width="350.09" |
3702 | - height="112.48" |
3703 | - id="svg2381"> |
3704 | - <defs |
3705 | - id="defs2383" /> |
3706 | - <g |
3707 | - transform="translate(12.587294,0.2745725)" |
3708 | - id="layer1"> |
3709 | - <g |
3710 | - transform="translate(-4,0)" |
3711 | - id="g3608" |
3712 | - style="fill:#033c71;fill-opacity:1"> |
3713 | - <path |
3714 | - d="M 132.72462,38.685525 C 133.7806,38.68556 134.7406,39.069557 135.6046,39.837519 C 136.37259,40.605547 136.75659,41.565541 136.7566,42.717503 L 136.7566,59.133413 C 136.75659,60.477418 136.99658,61.58141 137.47659,62.445394 C 138.14858,63.693397 138.96457,64.509391 139.92458,64.893381 C 140.78856,65.181387 141.74855,65.325386 142.80456,65.325378 C 145.20453,65.325386 146.83652,64.605391 147.70054,63.16539 L 148.13253,62.445394 C 148.61251,61.389412 148.85251,60.285419 148.85253,59.133413 L 148.85253,42.717503 C 148.85251,41.181543 149.5245,40.029551 150.86852,39.261522 C 152.21248,38.493561 153.46048,38.493561 154.6125,39.261522 C 155.95646,40.029551 156.62846,41.181543 156.62849,42.717503 L 156.62849,59.133413 C 156.05246,65.757383 153.07648,70.077355 147.70054,72.093341 C 146.16452,72.669338 144.53253,72.957336 142.80456,72.957336 C 138.19658,72.957336 134.5966,71.229348 132.00462,67.773365 C 131.52462,67.197374 131.09262,66.573378 130.70863,65.901375 C 129.55663,63.693397 128.98064,61.437411 128.98064,59.133413 L 128.98064,42.717503 C 128.98064,40.989545 129.70063,39.789552 131.14063,39.117523 C 131.62062,38.829559 132.14862,38.68556 132.72462,38.685525 M 177.11687,72.957336 L 177.69287,72.957336 L 177.69287,72.957336 C 179.99684,72.861337 182.20482,72.093342 184.31683,70.653349 C 187.77279,68.349366 189.88477,64.557391 190.6528,59.277412 C 190.84477,58.221432 190.94076,57.06944 190.9408,55.821431 C 190.94076,49.773487 189.11678,45.213517 185.46883,42.141506 C 182.97282,39.933551 180.18883,38.829559 177.11687,38.829524 C 174.81287,39.117557 172.79688,39.597554 171.06891,40.269517 L 171.06891,29.469576 C 171.06889,28.317627 170.6849,27.405633 169.91691,26.733591 C 169.14891,25.869643 168.23691,25.437646 167.18093,25.437598 C 165.54893,25.437646 164.44494,26.205641 163.86895,27.741586 C 163.58094,28.221628 163.43694,28.797624 163.43695,29.469576 L 163.43695,57.261423 C 163.43694,64.077394 165.78893,68.829363 170.49291,71.517344 C 172.70088,72.669338 174.90887,73.149335 177.11687,72.957336 M 171.06891,57.261423 L 171.06891,52.509449 C 171.06889,50.205485 171.74089,48.621495 173.08489,47.757475 C 173.27688,47.661501 173.56488,47.517502 173.94889,47.325478 C 175.00487,46.749507 176.06086,46.461509 177.11687,46.461482 C 178.26885,46.653508 179.22884,46.989505 179.99686,47.469477 C 182.20482,48.909493 183.30881,51.693475 183.30884,55.821431 C 183.30881,59.949421 182.20482,62.781403 179.99686,64.317384 C 179.03684,64.989388 178.07685,65.373386 177.11687,65.469378 L 176.68487,65.469378 C 173.51688,65.469385 171.69289,63.645397 171.2129,59.997408 C 171.11689,59.133426 171.06889,58.221432 171.06891,57.261423 M 201.06799,38.685525 C 202.12397,38.68556 203.08397,39.069557 203.94797,39.837519 C 204.71596,40.605547 205.09995,41.565541 205.09996,42.717503 L 205.09996,59.133413 C 205.09995,60.477418 205.33995,61.58141 205.81996,62.445394 C 206.49194,63.693397 207.30794,64.509391 208.26795,64.893381 C 209.13193,65.181387 210.09192,65.325386 211.14793,65.325378 C 213.5479,65.325386 215.17989,64.605391 216.0439,63.16539 L 216.4759,62.445394 C 216.95588,61.389412 217.19587,60.285419 217.1959,59.133413 L 217.1959,42.717503 C 217.19587,41.181543 217.86787,40.029551 219.21189,39.261522 C 220.55585,38.493561 221.80384,38.493561 222.95587,39.261522 C 224.29983,40.029551 224.97182,41.181543 224.97186,42.717503 L 224.97186,59.133413 C 224.39583,65.757383 221.41985,70.077355 216.0439,72.093341 C 214.50789,72.669338 212.8759,72.957336 211.14793,72.957336 C 206.53994,72.957336 202.93997,71.229348 200.34799,67.773365 C 199.86799,67.197374 199.43599,66.573378 199.052,65.901375 C 197.9,63.693397 197.324,61.437411 197.32401,59.133413 L 197.32401,42.717503 C 197.324,40.989545 198.044,39.789552 199.484,39.117523 C 199.96399,38.829559 200.49198,38.68556 201.06799,38.685525 M 231.63632,52.797448 C 231.63632,49.43749 232.64431,46.509509 234.66031,44.013496 C 237.06029,40.941545 240.56426,39.405555 245.17225,39.405521 C 252.08419,40.07755 256.35616,43.19753 257.98818,48.76547 C 258.27615,50.013486 258.46815,51.357477 258.56418,52.797448 L 258.56418,69.213357 C 258.56415,70.749351 257.84415,71.853344 256.40419,72.525339 C 255.82816,72.813337 255.30017,72.957336 254.8202,72.957336 C 253.18818,72.957336 252.08419,72.189341 251.50822,70.653349 C 251.31619,70.173355 251.22019,69.693358 251.22022,69.213357 L 251.22022,52.797448 C 251.02819,49.245491 249.01221,47.277504 245.17225,46.89348 C 241.90825,46.893506 239.94027,48.429496 239.26828,51.501455 C 239.17227,51.981473 239.12427,52.41347 239.12428,52.797448 L 239.12428,69.213357 C 239.12427,70.749351 238.35628,71.853344 236.8203,72.525339 C 236.43629,72.813337 235.95629,72.957336 235.3803,72.957336 C 233.74831,72.957336 232.59631,72.189341 231.92432,70.653349 C 231.73232,70.173355 231.63632,69.693358 231.63632,69.213357 L 231.63632,52.797448 M 272.44546,25.1496 C 273.59744,25.149648 274.55744,25.533645 275.32545,26.301594 C 276.09343,27.069635 276.42942,27.981629 276.33344,29.037578 L 276.33344,38.973524 L 281.08541,38.973524 C 282.62138,38.973558 283.77338,39.645553 284.54139,40.989513 C 285.30937,42.141537 285.30937,43.389529 284.54139,44.733492 C 283.77338,46.077511 282.62138,46.701507 281.08541,46.605482 L 276.33344,46.605482 L 276.33344,61.581399 C 276.33343,63.021401 276.57342,63.981395 277.05344,64.461383 C 277.34142,64.845389 277.82142,65.085388 278.49343,65.181379 C 279.26141,65.469385 280.2214,65.421385 281.37341,65.03738 C 282.90938,64.557391 284.25337,64.893389 285.40539,66.045375 C 286.36536,67.005375 286.65336,68.253367 286.26939,69.789354 C 285.88536,71.229348 284.97337,72.141342 283.5334,72.525339 L 280.79742,72.957336 C 276.57342,73.245335 273.40544,72.093342 271.29347,69.501355 C 269.56547,67.485372 268.70148,64.845389 268.70148,61.581399 L 268.70148,46.605482 L 266.39749,46.605482 C 264.8615,46.701507 263.75751,46.077511 263.08551,44.733492 C 262.31752,43.389529 262.31752,42.141537 263.08551,40.989513 C 263.75751,39.645553 264.8615,38.973558 266.39749,38.973524 L 268.70148,38.973524 L 268.70148,29.037578 C 268.70148,27.501632 269.37347,26.30164 270.71747,25.437598 C 271.29346,25.245647 271.86945,25.149648 272.44546,25.1496 M 293.87998,38.685525 C 294.93597,38.68556 295.89596,39.069557 296.75997,39.837519 C 297.52795,40.605547 297.91195,41.565541 297.91196,42.717503 L 297.91196,59.133413 C 297.91195,60.477418 298.15195,61.58141 298.63196,62.445394 C 299.30394,63.693397 300.11994,64.509391 301.07994,64.893381 C 301.94392,65.181387 302.90392,65.325386 303.95993,65.325378 C 306.3599,65.325386 307.99188,64.605391 308.8559,63.16539 L 309.2879,62.445394 C 309.76787,61.389412 310.00787,60.285419 310.00789,59.133413 L 310.00789,42.717503 C 310.00787,41.181543 310.67987,40.029551 312.02388,39.261522 C 313.36785,38.493561 314.61584,38.493561 315.76786,39.261522 C 317.11183,40.029551 317.78382,41.181543 317.78385,42.717503 L 317.78385,59.133413 C 317.20782,65.757383 314.23184,70.077355 308.8559,72.093341 C 307.31989,72.669338 305.6879,72.957336 303.95993,72.957336 C 299.35194,72.957336 295.75196,71.229348 293.15999,67.773365 C 292.67998,67.197374 292.24799,66.573378 291.86399,65.901375 C 290.712,63.693397 290.136,61.437411 290.136,59.133413 L 290.136,42.717503 C 290.136,40.989545 290.856,39.789552 292.29599,39.117523 C 292.77598,38.829559 293.30398,38.68556 293.87998,38.685525" |
3715 | - id="text2284" |
3716 | - style="font-size:39.99980164px;font-style:normal;font-weight:normal;fill:#033c71;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Ubuntu-Title" /> |
3717 | - <path |
3718 | - d="M 98.383398,38.829522 C 99.631385,38.829557 100.63938,39.309554 101.40738,40.269515 L 109.18334,49.917461 L 116.9593,40.269515 C 117.91927,39.117555 119.11926,38.637558 120.55928,38.829522 C 121.99924,39.117555 123.00723,39.93355 123.58326,41.277509 C 124.06323,42.621532 123.82323,43.869524 122.86326,45.021488 L 114.07931,55.965428 L 122.86326,66.765369 C 123.82323,67.917367 124.06323,69.213359 123.58326,70.653347 C 123.00723,71.997341 121.99924,72.765336 120.55928,72.957334 C 119.11926,73.245333 117.91927,72.813335 116.9593,71.661342 L 109.18334,62.013395 L 101.40738,71.661342 C 100.44738,72.813335 99.247387,73.245333 97.807401,72.957334 C 96.367406,72.765336 95.359413,71.997341 94.783418,70.653347 C 94.303419,69.213359 94.543418,67.917367 95.503414,66.765369 L 104.28737,55.965428 L 95.503414,45.021488 C 94.447418,43.773525 94.25542,42.429533 94.927417,40.989511 C 95.599411,39.549552 96.751403,38.829557 98.383398,38.829522" |
3719 | - id="text3378" |
3720 | - style="font-size:39.99980164px;font-style:normal;font-weight:normal;fill:#033c71;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Ubuntu-Title" /> |
3721 | - </g> |
3722 | - <path |
3723 | - d="M 48.170328,38.523239 C 56.951238,38.523239 64.234688,45.042968 65.440648,53.494696 L 77.521798,53.494696 C 76.972658,46.853448 74.219248,40.663667 69.616138,35.7806 C 66.667378,37.283437 63.041798,37.311894 59.962288,35.533716 C 56.880478,33.75477 55.092298,30.59835 54.920788,27.290416 C 52.732678,26.780498 50.472268,26.515156 48.170328,26.515156 C 43.762568,26.515156 39.502478,27.47731 35.629248,29.302403 L 41.676748,39.778423 C 43.684888,38.969322 45.876848,38.523239 48.170328,38.523239 z" |
3724 | - id="path2111" |
3725 | - style="fill:#639ad2;fill-opacity:1;stroke:none;stroke-opacity:1" /> |
3726 | - <path |
3727 | - d="M 65.442188,58.439291 C 64.238528,66.894864 56.952768,73.418438 48.170328,73.418438 C 45.874538,73.418438 43.683348,72.971587 41.673668,72.162485 L 35.626178,82.638503 C 39.500178,84.465135 43.761028,85.427289 48.170328,85.427289 C 50.474578,85.427289 52.737288,85.162716 54.926938,84.651259 C 55.096148,81.340251 56.883548,78.179217 59.969218,76.397963 C 63.048718,74.619016 66.675838,74.648242 69.625368,76.151848 C 74.225398,71.268781 76.975728,65.079769 77.523338,58.44006 L 65.442188,58.44006 L 65.442188,58.439291 z" |
3728 | - id="path2113" |
3729 | - style="fill:#23507b;fill-opacity:1" /> |
3730 | - <circle |
3731 | - cx="98.936996" |
3732 | - cy="9.1700001" |
3733 | - r="9.1680002" |
3734 | - transform="matrix(0.769108,0,0,0.769108,-11.074807,19.723139)" |
3735 | - id="circle2117" |
3736 | - style="fill:#10518b;fill-opacity:1" /> |
3737 | - <circle |
3738 | - cx="33.206001" |
3739 | - cy="47.130001" |
3740 | - r="9.1680002" |
3741 | - transform="matrix(0.769108,0,0,0.769108,-11.074807,19.723139)" |
3742 | - id="circle2107" |
3743 | - style="fill:#4b9aeb;fill-opacity:1" /> |
3744 | - <path |
3745 | - d="M 30.723108,55.971223 C 30.723108,50.412111 33.335768,45.452902 37.397428,42.25572 L 31.350698,31.782008 C 29.932468,32.772619 28.590378,33.894747 27.342111,35.14301 C 23.84267,38.64322 21.332301,42.868699 19.951753,47.479502 C 22.734385,49.281522 24.577168,52.410253 24.577168,55.971992 C 24.577168,59.533732 22.734385,62.662463 19.951753,64.463714 C 21.332301,69.076054 23.84267,73.300765 27.342111,76.799437 C 28.589608,78.048468 29.930928,79.169059 31.347628,80.15967 L 37.395898,69.684419 C 33.334228,66.486468 30.723108,61.528029 30.723108,55.971223 z" |
3746 | - id="path2115" |
3747 | - style="fill:#b4d1ea;fill-opacity:1" /> |
3748 | - <circle |
3749 | - cx="98.945" |
3750 | - cy="85.073997" |
3751 | - r="9.1689997" |
3752 | - transform="matrix(0.769108,0,0,0.769108,-11.074807,19.723139)" |
3753 | - id="circle3484" |
3754 | - style="fill:#83bef1;fill-opacity:1" /> |
3755 | - <path |
3756 | - d="M 48.170328,38.523239 C 56.951238,38.523239 64.234688,45.042968 65.440648,53.494696 L 77.521798,53.494696 C 76.972658,46.853448 74.219248,40.663667 69.616138,35.7806 C 66.667378,37.283437 63.041798,37.311894 59.962288,35.533716 C 56.880478,33.75477 55.092298,30.59835 54.920788,27.290416 C 52.732678,26.780498 50.472268,26.515156 48.170328,26.515156 C 43.762568,26.515156 39.502478,27.47731 35.629248,29.302403 L 41.676748,39.778423 C 43.684888,38.969322 45.876848,38.523239 48.170328,38.523239 z" |
3757 | - id="path3679" |
3758 | - style="fill:#639ad2;fill-opacity:0;stroke:none;stroke-opacity:1" /> |
3759 | - <path |
3760 | - d="M 30.723108,55.971223 C 30.723108,50.412111 33.335768,45.452902 37.397428,42.25572 L 31.350698,31.782008 C 29.932468,32.772619 28.590378,33.894747 27.342111,35.14301 C 23.84267,38.64322 21.332301,42.868699 19.951753,47.479502 C 22.734385,49.281522 24.577168,52.410253 24.577168,55.971992 C 24.577168,59.533732 22.734385,62.662463 19.951753,64.463714 C 21.332301,69.076054 23.84267,73.300765 27.342111,76.799437 C 28.589608,78.048468 29.930928,79.169059 31.347628,80.15967 L 37.395898,69.684419 C 33.334228,66.486468 30.723108,61.528029 30.723108,55.971223 z" |
3761 | - id="path3691" |
3762 | - style="fill:#b4d1ea;fill-opacity:0" /> |
3763 | - <path |
3764 | - d="M 65.442188,58.439291 C 64.238528,66.894864 56.952768,73.418438 48.170328,73.418438 C 45.874538,73.418438 43.683348,72.971587 41.673668,72.162485 L 35.626178,82.638503 C 39.500178,84.465135 43.761028,85.427289 48.170328,85.427289 C 50.474578,85.427289 52.737288,85.162716 54.926938,84.651259 C 55.096148,81.340251 56.883548,78.179217 59.969218,76.397963 C 63.048718,74.619016 66.675838,74.648242 69.625368,76.151848 C 74.225398,71.268781 76.975728,65.079769 77.523338,58.44006 L 65.442188,58.44006 L 65.442188,58.439291 z" |
3765 | - id="path3719" |
3766 | - style="fill:#23507b;fill-opacity:0" /> |
3767 | - <g |
3768 | - id="g3583"> |
3769 | - <path |
3770 | - d="M 24.061618,45.222977 C 24.182455,45.202763 27.195524,46.793186 29.220781,47.342794 C 32.832196,48.265693 36.128715,51.043377 37.72206,52.638967 C 37.840199,52.775526 39.090573,51.702815 40.399121,51.780079 C 42.18652,51.888338 47.717183,53.4435 48.456125,52.38449 C 48.904214,51.762784 48.872098,51.000028 49.431138,50.687603 C 49.732108,50.603377 48.312384,48.006724 49.821276,47.17479 C 50.897132,46.637087 51.808803,49.64746 52.085062,49.984816 C 52.208817,50.13575 52.865338,50.172585 52.787627,49.828716 C 52.703401,49.455199 51.641465,46.566561 52.943724,46.081865 C 55.058825,45.244315 54.683962,49.777955 54.738985,49.906878 C 54.85601,50.181345 62.105337,50.392922 62.54489,53.653729 C 62.799141,55.448318 56.737069,57.767808 56.144115,58.18108 C 55.551386,58.594353 55.600792,59.255363 55.831913,59.664368 C 56.097621,60.107962 57.863686,61.605175 57.627398,62.318293 C 57.465011,62.730218 54.168945,61.220427 53.958491,61.537793 C 53.478511,62.144001 56.357938,63.661428 55.363614,64.738182 C 54.969432,64.996028 50.434216,62.839376 50.445673,62.864756 C 50.323939,62.911025 44.03726,64.013158 39.205118,62.552332 C 39.034868,62.504266 36.103784,65.383695 35.770472,65.284644 C 35.314749,65.117539 36.442263,62.780305 36.316933,62.318293 C 36.112094,62.060897 34.239119,63.363378 34.131308,62.708657 C 34.002385,61.848197 35.774963,60.859038 35.692533,60.288768 C 35.235463,57.049074 35.896698,55.157231 37.019494,53.575791 C 37.393915,52.993616 32.619046,49.387817 29.16216,47.964724 C 25.705498,46.54163 23.856105,45.335504 24.061618,45.222977 z" |
3771 | - id="path14" |
3772 | - style="fill:#0a2a49;fill-opacity:1;fill-rule:evenodd;stroke:#0a2a49;stroke-width:0.22460442pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> |
3773 | - <path |
3774 | - d="M 55.12719,56.055065 C 55.089224,55.922549 57.486208,54.472727 57.833223,54.80604 C 58.457844,55.032441 55.149197,56.223293 55.12719,56.055065 z" |
3775 | - id="path7" |
3776 | - style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#0a2a49;stroke-width:0.13476264pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> |
3777 | - <path |
3778 | - d="M 56.271995,57.373493 C 56.060868,57.245917 57.706995,55.326448 58.110829,55.534657 C 58.700414,56.120425 56.244372,57.419087 56.271995,57.373493 z" |
3779 | - id="path8" |
3780 | - style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#0a2a49;stroke-width:0.13476264pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> |
3781 | - <path |
3782 | - d="M 62.759692,48.49196 C 62.559572,48.326427 60.990258,50.802466 61.337271,51.059413 C 61.545928,51.215514 62.849085,48.58023 62.759692,48.49196 z" |
3783 | - id="path13" |
3784 | - style="fill:#0a2a49;fill-opacity:1;fill-rule:evenodd;stroke:#0a2a49;stroke-width:0.13476264pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> |
3785 | - <ellipse |
3786 | - cx="288.86475" |
3787 | - cy="374.58655" |
3788 | - rx="3.012037" |
3789 | - ry="3.398196" |
3790 | - transform="matrix(0.2078264,0,0,0.2097329,-4.371806,-26.527264)" |
3791 | - id="ellipse17" |
3792 | - style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#0a2a49;stroke-width:0.6pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> |
3793 | - <path |
3794 | - d="M 60.955646,48.14503 C 60.856601,48.030032 60.331025,50.698332 60.574044,50.816474 C 60.7827,50.972575 61.146114,48.283835 60.955646,48.14503 z" |
3795 | - id="path18" |
3796 | - style="fill:#0a2a49;fill-opacity:1;fill-rule:evenodd;stroke:#0a2a49;stroke-width:0.13476264pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> |
3797 | - <path |
3798 | - d="M 54.25687,51.756136 C 53.634487,52.196137 54.598493,54.686101 56.183974,53.232237 C 54.938318,53.268847 54.522794,52.904089 54.25687,51.756136 z" |
3799 | - id="path21" |
3800 | - style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#0a2a49;stroke-width:0.13476264pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> |
3801 | - </g> |
3802 | - </g> |
3803 | -</svg> |
3804 | |
3805 | === modified file 'data/whitelists/default.whitelist' |
3806 | --- data/whitelists/default.whitelist 2012-02-15 00:11:21 +0000 |
3807 | +++ data/whitelists/default.whitelist 2012-06-23 00:59:17 +0000 |
3808 | @@ -12,11 +12,17 @@ |
3809 | sleep |
3810 | display |
3811 | optical_drive |
3812 | +block_device |
3813 | __audio__ |
3814 | audio/alsa_record_playback_external |
3815 | audio/alsa_record_playback_internal |
3816 | audio/alsa_record_playback_usb |
3817 | audio/playback_auto |
3818 | +__benchmarks__ |
3819 | +benchmarks/disk/hdparm-read |
3820 | +benchmarks/disk/hdparm-read_.* |
3821 | +benchmarks/disk/hdparm-cache-read |
3822 | +benchmarks/disk/hdparm-cache-read_.* |
3823 | __bluetooth__ |
3824 | bluetooth/detect-output |
3825 | __camera__ |
3826 | @@ -28,8 +34,6 @@ |
3827 | cpu/topology |
3828 | cpu/clocktest |
3829 | __disk__ |
3830 | -disk/benchmarks |
3831 | -disk/benchmark_sd\w |
3832 | disk/detect |
3833 | __firewire__ |
3834 | firewire/insert |
3835 | @@ -59,6 +63,7 @@ |
3836 | input/keyboard |
3837 | input/mouse |
3838 | __keys__ |
3839 | +keys/super |
3840 | keys/battery-info |
3841 | keys/brightness |
3842 | keys/media-control |
3843 | |
3844 | === added file 'data/whitelists/smoke.whitelist' |
3845 | --- data/whitelists/smoke.whitelist 1970-01-01 00:00:00 +0000 |
3846 | +++ data/whitelists/smoke.whitelist 2012-06-23 00:59:17 +0000 |
3847 | @@ -0,0 +1,25 @@ |
3848 | +## This is an example whitelist to start from. |
3849 | +## To use, copy this file and add the jobs you want to run to the copy. Delete |
3850 | +## these comments. DO NOT delete the first 9 jobs in tis file. They are resource |
3851 | +## gathering jobs and are necessary to do any testing at all. |
3852 | +# Resource Jobs (listed in jobs/resource.txt) |
3853 | +cpuinfo |
3854 | +cdimage |
3855 | +dmi |
3856 | +dpkg |
3857 | +gconf |
3858 | +lsb |
3859 | +meminfo |
3860 | +module |
3861 | +package |
3862 | +device |
3863 | +uname |
3864 | +# Smoke test cases |
3865 | +__smoke__ |
3866 | +smoke/true |
3867 | +smoke/false |
3868 | +smoke/dependency/good |
3869 | +smoke/dependency/bad |
3870 | +smoke/requirement/good |
3871 | +smoke/requirement/bad |
3872 | +smoke/manual |
3873 | |
3874 | === added file 'data/whitelists/sniff.whitelist' |
3875 | --- data/whitelists/sniff.whitelist 1970-01-01 00:00:00 +0000 |
3876 | +++ data/whitelists/sniff.whitelist 2012-06-23 00:59:17 +0000 |
3877 | @@ -0,0 +1,25 @@ |
3878 | +## This is an example whitelist to start from. |
3879 | +## To use, copy this file and add the jobs you want to run to the copy. Delete |
3880 | +## these comments. DO NOT delete the first 9 jobs in tis file. They are resource |
3881 | +## gathering jobs and are necessary to do any testing at all. |
3882 | +# Resource Jobs (listed in jobs/resource.txt) |
3883 | +cpuinfo |
3884 | +cdimage |
3885 | +dmi |
3886 | +dpkg |
3887 | +gconf |
3888 | +lsb |
3889 | +meminfo |
3890 | +module |
3891 | +package |
3892 | +device |
3893 | +uname |
3894 | +# Smoke sniffcases |
3895 | +__sniff__ |
3896 | +sniff/sniff7 |
3897 | +sniff/sniff6 |
3898 | +sniff/sniff5 |
3899 | +sniff/sniff4 |
3900 | +sniff/sniff3 |
3901 | +sniff/sniff2 |
3902 | +sniff/sniff1 |
3903 | |
3904 | === modified file 'debian/changelog' |
3905 | --- debian/changelog 2012-04-11 17:20:37 +0000 |
3906 | +++ debian/changelog 2012-06-23 00:59:17 +0000 |
3907 | @@ -1,3 +1,218 @@ |
3908 | +checkbox (0.14) quantal; urgency=low |
3909 | + |
3910 | + * New upstream release (LP: #1016746): |
3911 | + |
3912 | + [Aurelien Gateau] |
3913 | + * lib/template.py, lib/template_i18n.py, plugins/jobs_info.py, |
3914 | + plugins/suites_prompt.py: Add a "sortkey" attribute to jobs, the sortkey |
3915 | + order matches the order in which they appear in jobfiles. |
3916 | + * checkbox_gtk/gtk_interface.py: Shows jobs and suites in sortkey order |
3917 | + (that is, as they appear in job definition files, rather than |
3918 | + alphabetically). |
3919 | + * checkbox_gtk/gtk_interface.py, gtk/checkbox-gtk.ui, |
3920 | + plugins/jobs_prompt.py: Added a progress bar showing tests completed and |
3921 | + total. |
3922 | + |
3923 | + [Brendan Donegan] |
3924 | + * jobs/suspend.txt.in: Fixed dependencies on wireless and suspend_advanced |
3925 | + jobs. |
3926 | + * Changed screenshot jobs to use /dev/external_webcam which will be set by |
3927 | + a udev rule (LP: #956885) |
3928 | + * [FEATURE] Added touchpad tests from CE QA Checkbox to allow touchpad |
3929 | + testing to be performed |
3930 | + * [FEATURE] Python 2 to 3 conversion: |
3931 | + * scripts/create_connection - switched to using argparse and fixed |
3932 | + representation of octal literal |
3933 | + * scripts/internet_test - ran 2to3 tool and decoded result of |
3934 | + check_output. Also replaced optparse with argparse |
3935 | + * scripts/memory_info |
3936 | + * scripts/removable_storage_test - ran 2to3 tool and fixed some |
3937 | + encoding issues |
3938 | + * scripts/removable_storage_watcher - ran 2to3 tool and swapped |
3939 | + use of gobject with gi.repository.GObject |
3940 | + * scripts/xrandr_cycle - ran 2to3 tool and fixed encoding issue |
3941 | + * scripts/obex_send - ran 2to3 tool and swapped |
3942 | + use of gobject with gi.repository.GObject |
3943 | + * Update touchpad.py to use gsettings instead of deprecated gconf |
3944 | + (LP: #1004212) |
3945 | + * Instead of checking output of nmcli con up in create_connection, |
3946 | + check the return code is success instead (LP: #1013537) |
3947 | + * base64 encode the after suspend screenshot attachement so that it can |
3948 | + be uploaded properly (LP: #1016126) |
3949 | + * Fixed simple type in xorg_memory_test, introduced by Python3 |
3950 | + conversion (LP: #1016387) |
3951 | + * [FEATURE] Add suspend/bluetooth_obex_after_suspend_auto test to be |
3952 | + used during fully automated SRU testing |
3953 | + |
3954 | + [Daniel Manrique] |
3955 | + * Tweaks to internet_test: don't try to ping an IP that's unreachable from |
3956 | + the specified interface (or at all), try to find something pingable via |
3957 | + other means. |
3958 | + * Reverted feature to keep tests ordered, as the sortkey attribute causes |
3959 | + undesirable secondary effects. |
3960 | + * New version 0.14 for Quantal Quetzal development. |
3961 | + * Set the correct user (root) for fwts-wakealarm test (LP: #1004102) |
3962 | + * Set correct user (root) for usb/storage-preinserted, so it works correctly |
3963 | + on servers (LP: #1004131) |
3964 | + * Log (at level INFO) name of each message we execute, so the currently |
3965 | + running job can be determined by looking at the logfile, rather than |
3966 | + hunting through process lists. |
3967 | + * [FEATURE] Added script and jobs to collect and attach output from |
3968 | + alsa-info.sh. |
3969 | + * Assume utf-8 encoding always, when opening template files. |
3970 | + (LP: #1015174) |
3971 | + * [FEATURE] Replaced the context menu in the selection tree with explicit |
3972 | + "select/deselect all" buttons. |
3973 | + |
3974 | + [Javier Collado] |
3975 | + * Updated camera_test script to use better tool for capturing the image |
3976 | + and allow specifying a device to use, plus other improvements. Create a |
3977 | + job which takes a capture from the webcam of the desktop. |
3978 | + * Added jobs to take screenshots after suspend and attach the resulting jpg |
3979 | + * [FEATURE] Added smoke test jobs, whitelist and local job to use for |
3980 | + checkbox development purposes. |
3981 | + * Fixed "camera_test detect" problem with missing args attributes (LP: |
3982 | + #967419) |
3983 | + * Submission screen in Qt interface updated to support certification client: |
3984 | + - customize contents depending on the upload target (launchpad or certification) |
3985 | + - display links to the report properly in the show_entry method |
3986 | + * Fixed qt interface show_entry method preopulates widget that gets |
3987 | + user input (LP: #1000451) |
3988 | + * Added customizable deselect_warning message in qt show_tree method (LP: #1000443) |
3989 | + * show_error method shows long text properly in gtk/qt interfaces (LP: |
3990 | + #1012052) |
3991 | + |
3992 | + [Jeff Lane] |
3993 | + * Created automated version of optical/read for server testing |
3994 | + Fixed issues with optical_read_test script: |
3995 | + - test could pass if /dev/cdrom did not exist |
3996 | + - test could pass if /dev/cdrom was inaccessible |
3997 | + - test could pass if no optical device was passed in (LP: #945178) |
3998 | + * Removed hard coded paths from scripts (LP: #949435) |
3999 | + * Removed files in /data that are not used in any job descriptions |
4000 | + (LP: #957396) |
4001 | + * [FEATURE] Modified stress jobs so that they are all automated per decision |
4002 | + made during the cert sprint. |
4003 | + * [FEATURE] Changes to Power Management testing in Checkbox: |
4004 | + * scripts/pm_test: added a slightly modified version of OEM team's pm.py |
4005 | + script for reboot/poweroff testing |
4006 | + * jobs/hibernate.txt.in: modified hibernate test to use fwts and added new |
4007 | + jobs to attach log files from hibernate testing. |
4008 | + * jobs/power-management.txt.in: added new poweroff and reboot jobs using pm_test |
4009 | + script. Added jobs to attach logs from reboot and poweroff tests to |
4010 | + results. |
4011 | + * jobs/stress.txt.in: modified suspend_30_cycles and hibernate_30_cycles to |
4012 | + use fwts. Added jobs to attach logs from 30 cycle tests to results. |
4013 | + * jobs/suspend.txt.in: Modified suspend_advanced and suspend_advanced_auto to use |
4014 | + fwts. Added job to attach log from suspend_advanced and suspend_advanced_auto |
4015 | + to results. |
4016 | + * [FEATURE] jobs/miscellanea.txt.in: added a job to gather tester info for |
4017 | + certification purposes. Not to be used for UF. |
4018 | + * [FEATURE] Python 2 to 3 conversion: |
4019 | + * scripts/cpu_topology: ran 2to3, made modificates based on code review and |
4020 | + tested script to verify functionality. |
4021 | + * scripts/disk_smart: ported to Python 3. Inserted bits to decode byte |
4022 | + data returned by Popen. Fixed list_handler to decode bytes types to clean |
4023 | + up debug output. Added bits to improve debug output. Migrated from |
4024 | + optparse to argparse. |
4025 | + * scripts/network_check: ran 2to3 and that was all that was needed. Also |
4026 | + took the liberty of migrating from optparse to ArgParse sine we're |
4027 | + Python3 only now. |
4028 | + * scripts/network_device_info: ran 2to3 and changed shebang. |
4029 | + * scripts/network_info: ran 2to3 and changed shebang. Fixed encoding issue |
4030 | + with interface[:15] (needed to be a bytes object). |
4031 | + * scripts/fwts_test: ran 2to3 and changed shebang, fixed an encoding bug |
4032 | + with Popen output. Cleaned up the final output to be more useful for |
4033 | + debugging test failures. |
4034 | + * scripts/keyboard_test: nothing to do for conversion beyond changing shebang. |
4035 | + * scripts/network_ntp_test: 2to3 changed nothing, so modified shebang. |
4036 | + Fixed an encoding issue with Popen output in. Re-inserted a call to |
4037 | + SilentCall() that was removed from TimeSkew() by someone in a previous |
4038 | + revision, which made the TimeSkew() function do nothing. Fixed an |
4039 | + unbuffered I/O error in SilentCall() discovered while testing Python3 |
4040 | + changes. |
4041 | + * scripts/optical_detect, scripts/optical_read_test: ran 2to3 and changed |
4042 | + shebang. Changes were minimal. |
4043 | + * scripts/xorg_memory_test: 2to3 made minimal changes, modifed shebang. |
4044 | + Converted optparse code to argparse code and replaced sys.argv[] stuff |
4045 | + with more useful positional arguments. Removed a redundant import that |
4046 | + 2to3 injected. |
4047 | + * scripts/resolution_test: ran 2to3 with minimal changes. Changed shebang. |
4048 | + Converted optparse to argparse and removed unnecessary calls to |
4049 | + sys.argv[] |
4050 | + * scripts/pm_log_check: ran 2to3 and changed shebang. |
4051 | + * scripts/pm_test: ran 2to3 and changed shebang. After a lot of trial and |
4052 | + error, changed the way xinput is called to avoid confusing bytecode |
4053 | + embedded in the command output that was causing problems with |
4054 | + bytes.decode() on the "after reboot" hardware checks. |
4055 | + |
4056 | + [Jeff Marcom] |
4057 | + * [FEATURE] Python 2 to 3 conversion: |
4058 | + * scripts/memory_info |
4059 | + * scripts/memory_test |
4060 | + * scripts/touchpad_test |
4061 | + * Deprecated: wake_on_lan_test |
4062 | + * Update touchpad.py to use gsettings instead of deprecated gconf |
4063 | + (LP: #1004212) |
4064 | + |
4065 | + [Marc Tardif] |
4066 | + * [FEATURE] Reworked media_keys_test into key_test, making it more generic |
4067 | + and able to test for any key that sends an scancode. Used it to implement |
4068 | + a test for the Super key. |
4069 | + * [FEATURE] Added new interactive and auto-verifying touchpad scrolling |
4070 | + test. |
4071 | + * [FEATURE] Python 2 to 3 conversion: |
4072 | + * scripts/ansi_parser |
4073 | + * scripts/cking_suite |
4074 | + * scripts/floppy_test |
4075 | + * scripts/network_bandwidth_test |
4076 | + * scripts/cpu_scaling_test |
4077 | + * Removed sleep_test script no longer used by any test definition. |
4078 | + * [FEATURE] Deprecated scripts: |
4079 | + * scripts/autotest_filter and scripts/autotest_suite |
4080 | + * scripts/ltp_filter and scripts/ltp_suite |
4081 | + * scripts/mago_filter and scripts/mago_suite |
4082 | + * scripts/qa_regression_suite |
4083 | + * [FEATURE] Reworked media_keys_test into key_test, making it more generic |
4084 | + and able to test for any key that sends an scancode. Used it to implement |
4085 | + a test for the Super key. |
4086 | + * [FEATURE] Added new interactive and auto-verifying touchpad scrolling |
4087 | + test. |
4088 | + * Removed sleep_test script no longer used by any test definition. |
4089 | + * Migrated project minus scripts to Python 3. |
4090 | + |
4091 | + [Sylvain Pineau] |
4092 | + * Updated gst_pipeline_test to add a --fullscreen option for video playback. |
4093 | + * Add python-gtk2 dependency, Gst from gi.repository don't work well with |
4094 | + messages (See https://bugzilla.gnome.org/show_bug.cgi?id=631901). |
4095 | + * Add a new job to capture screen during fullscreen video playback. |
4096 | + * qt/frontend/qtfront.cpp, qt/frontend/qtfront.h, plugins/suites_prompt.py, |
4097 | + checkbox_qt/qt_interface.py, plugins/jobs_prompt.py: The selection tree is |
4098 | + now updated when recovering from a previous run (LP: #937696) |
4099 | + * [FEATURE] Python 2 to 3 conversion: |
4100 | + * scripts/gst_pipeline_test. Migrated to PyGI. |
4101 | + * scripts/removable_resource: Add a resource job to identify removable |
4102 | + block devices. __disks__ jobs updated to run only on internal drives. |
4103 | + * [FEATURE] jobs/benchmarks.txt.in, scripts/pts_run: Add a reworked launcher |
4104 | + for phoronix-test-suite tests. |
4105 | + * [FEATURE] Python 2 to 3 conversion: |
4106 | + * jobs/stress.txt.in: add OEM team's stress tests (including reboot and poweroff) |
4107 | + and log analysis jobs |
4108 | + |
4109 | + [Tiago Salem Herrmann] |
4110 | + * checkbox_qt/qt_interface.py, qt/frontend/qtfront.cpp, |
4111 | + qt/frontend/qtfront.h, qt/frontend/treemodel.cpp, qt/frontend/treemodel.h: |
4112 | + Makes it possible for the job selection tree to have more than 2 levels of |
4113 | + children nodes. |
4114 | + * checkbox/user_interface.py, checkbox_qt/qt_interface.py, |
4115 | + plugins/user_interface.py, qt/frontend/qtfront.cpp, qt/frontend/qtfront.h: |
4116 | + Correctly update automated test execution status in the Selection tab |
4117 | + (LP: #950105). |
4118 | + * qt/frontend/qtfront.cpp: Avoid QDBusArgument warnings when running |
4119 | + checkbox-qt from a terminal (LP: #957476) |
4120 | + |
4121 | + -- Marc Tardif <marc@ubuntu.com> Fri, 22 Jun 2012 17:04:14 -0400 |
4122 | + |
4123 | checkbox (0.13.7) precise; urgency=low |
4124 | |
4125 | * New upstream release (LP: #980063) |
4126 | |
4127 | === modified file 'debian/checkbox.dirs' |
4128 | --- debian/checkbox.dirs 2009-03-17 09:46:16 +0000 |
4129 | +++ debian/checkbox.dirs 2012-06-23 00:59:17 +0000 |
4130 | @@ -1,2 +1,3 @@ |
4131 | etc/checkbox.d |
4132 | +usr/share/icons |
4133 | usr/share/locale |
4134 | |
4135 | === modified file 'debian/control' |
4136 | --- debian/control 2012-03-07 19:46:29 +0000 |
4137 | +++ debian/control 2012-06-23 00:59:17 +0000 |
4138 | @@ -3,24 +3,58 @@ |
4139 | Priority: optional |
4140 | Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> |
4141 | Standards-Version: 3.9.2 |
4142 | -X-Python-Version: >= 2.6 |
4143 | -Build-Depends: debhelper (>= 7.0.50~), dh-translations, libqt4-dev, python (>= 2.6.6-3~), po-debconf, python-distutils-extra, qt4-qmake |
4144 | +X-Python3-Version: >= 3.2 |
4145 | +Build-Depends: debhelper (>= 9.2), |
4146 | + dh-translations, |
4147 | + libqt4-dev, |
4148 | + po-debconf, |
4149 | + python3 (>= 3.2), |
4150 | + python3-distutils-extra, |
4151 | + qt4-qmake |
4152 | Vcs-Bzr: https://code.launchpad.net/~hardware-certification/checkbox/trunk |
4153 | |
4154 | Package: checkbox |
4155 | Section: python |
4156 | Architecture: any |
4157 | -Depends: ${misc:Depends}, ${python:Depends}, debconf, python-libxml2, udev |
4158 | -Recommends: dpkg (>= 1.13), gstreamer0.10-gconf, lsb-release, perl, pm-utils, python-apport, python-apt, python-dateutil, python-gst0.10 |
4159 | -Suggests: checkbox-cli | checkbox-gtk, bonnie++, bootchart, bzr, cvs, ethtool, flex, fwts, git-core, hdparm, lshw, make, nmap, obexd-client, python-pexpect, smartmontools, sox, stress, wodim |
4160 | -Description: System testing application |
4161 | +Depends: debconf, python3-lxml, udev, ${misc:Depends}, ${python3:Depends} |
4162 | +Recommends: dpkg (>= 1.13), |
4163 | + gir1.2-gst-plugins-base-0.10 | gir1.2-gst-plugins-base-1.0, |
4164 | + gstreamer0.10-gconf | gstreamer1.0-plugins-good, |
4165 | + lsb-release, |
4166 | + perl, |
4167 | + pm-utils, |
4168 | + python-apport, |
4169 | + python-apt, |
4170 | + python3-dbus, |
4171 | + python3-gi |
4172 | +Suggests: bonnie++, |
4173 | + bootchart, |
4174 | + checkbox-cli | checkbox-gtk, |
4175 | + ethtool, |
4176 | + fwts, |
4177 | + git-core, |
4178 | + glmark2, |
4179 | + glmark2-es2, |
4180 | + hdparm, |
4181 | + lshw, |
4182 | + mesa-utils, |
4183 | + nmap, |
4184 | + obexd-client, |
4185 | + render-bench, |
4186 | + smartmontools, |
4187 | + sox, |
4188 | + stress, |
4189 | + sysstat, |
4190 | + wmctrl, |
4191 | + wodim |
4192 | +Description: System testing application |
4193 | This project provides an extensible interface for system testing. The |
4194 | results can then be sent to Launchpad. |
4195 | |
4196 | Package: checkbox-cli |
4197 | Architecture: all |
4198 | Depends: checkbox (>= ${source:Version}), ${misc:Depends} |
4199 | -Description: Command line interface for checkbox |
4200 | +Description: Command line interface for checkbox |
4201 | This project provides an extensible interface for system testing. The |
4202 | results can then be sent to Launchpad. |
4203 | . |
4204 | @@ -28,18 +62,23 @@ |
4205 | |
4206 | Package: checkbox-urwid |
4207 | Architecture: all |
4208 | -Depends: checkbox (>= ${source:Version}), python-urwid, ${misc:Depends} |
4209 | -Description: Urwid interface for checkbox |
4210 | +Depends: checkbox (>= ${source:Version}), python3-urwid, ${misc:Depends} |
4211 | +Description: Urwid interface for checkbox |
4212 | This project provides an extensible interface for system testing. The |
4213 | results can then be sent to Launchpad. |
4214 | . |
4215 | - This package provides a command line interface (urwid version) for |
4216 | + This package provides a command line interface (urwid version) for |
4217 | answering tests. |
4218 | |
4219 | Package: checkbox-gtk |
4220 | Section: gnome |
4221 | Architecture: all |
4222 | -Depends: checkbox (>= ${source:Version}), gksu, python-gobject (>= 2.28), gir1.2-gtk-3.0, python-cairo, ${misc:Depends} |
4223 | +Depends: checkbox (>= ${source:Version}), |
4224 | + gir1.2-gtk-3.0, |
4225 | + gksu, |
4226 | + python3-gi, |
4227 | + python3-gi-cairo, |
4228 | + ${misc:Depends} |
4229 | Description: GTK interface for checkbox |
4230 | This project provides an extensible interface for system testing. The |
4231 | results can then be sent to Launchpad. |
4232 | @@ -48,7 +87,11 @@ |
4233 | |
4234 | Package: checkbox-qt |
4235 | Architecture: any |
4236 | -Depends: checkbox (>= ${source:Version}), libqtgui4, libqt4-dbus, ${misc:Depends} |
4237 | +Depends: checkbox (>= ${source:Version}), |
4238 | + libqt4-dbus, |
4239 | + libqtgui4, |
4240 | + python3-dbus, |
4241 | + ${misc:Depends} |
4242 | Description: QT4 interface for checkbox |
4243 | This project provides an extensible interface for system testing. The |
4244 | results can then be sent to Launchpad. |
4245 | |
4246 | === modified file 'debian/po/ast.po' |
4247 | --- debian/po/ast.po 2012-04-02 15:22:05 +0000 |
4248 | +++ debian/po/ast.po 2012-06-23 00:59:17 +0000 |
4249 | @@ -15,8 +15,8 @@ |
4250 | "MIME-Version: 1.0\n" |
4251 | "Content-Type: text/plain; charset=UTF-8\n" |
4252 | "Content-Transfer-Encoding: 8bit\n" |
4253 | -"X-Launchpad-Export-Date: 2012-03-22 04:43+0000\n" |
4254 | -"X-Generator: Launchpad (build 14981)\n" |
4255 | +"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4256 | +"X-Generator: Launchpad (build 15316)\n" |
4257 | |
4258 | #. Type: boolean |
4259 | #. Description |
4260 | |
4261 | === modified file 'debian/po/cs.po' |
4262 | --- debian/po/cs.po 2012-03-21 02:22:11 +0000 |
4263 | +++ debian/po/cs.po 2012-06-23 00:59:17 +0000 |
4264 | @@ -15,8 +15,8 @@ |
4265 | "MIME-Version: 1.0\n" |
4266 | "Content-Type: text/plain; charset=UTF-8\n" |
4267 | "Content-Transfer-Encoding: 8bit\n" |
4268 | -"X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n" |
4269 | -"X-Generator: Launchpad (build 14933)\n" |
4270 | +"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4271 | +"X-Generator: Launchpad (build 15316)\n" |
4272 | |
4273 | #. Type: boolean |
4274 | #. Description |
4275 | |
4276 | === modified file 'debian/po/de.po' |
4277 | --- debian/po/de.po 2012-03-21 02:22:11 +0000 |
4278 | +++ debian/po/de.po 2012-06-23 00:59:17 +0000 |
4279 | @@ -15,8 +15,8 @@ |
4280 | "MIME-Version: 1.0\n" |
4281 | "Content-Type: text/plain; charset=UTF-8\n" |
4282 | "Content-Transfer-Encoding: 8bit\n" |
4283 | -"X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n" |
4284 | -"X-Generator: Launchpad (build 14933)\n" |
4285 | +"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4286 | +"X-Generator: Launchpad (build 15316)\n" |
4287 | |
4288 | #. Type: boolean |
4289 | #. Description |
4290 | |
4291 | === modified file 'debian/po/en_AU.po' |
4292 | --- debian/po/en_AU.po 2012-03-21 02:22:11 +0000 |
4293 | +++ debian/po/en_AU.po 2012-06-23 00:59:17 +0000 |
4294 | @@ -15,8 +15,8 @@ |
4295 | "MIME-Version: 1.0\n" |
4296 | "Content-Type: text/plain; charset=UTF-8\n" |
4297 | "Content-Transfer-Encoding: 8bit\n" |
4298 | -"X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n" |
4299 | -"X-Generator: Launchpad (build 14933)\n" |
4300 | +"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4301 | +"X-Generator: Launchpad (build 15316)\n" |
4302 | |
4303 | #. Type: boolean |
4304 | #. Description |
4305 | |
4306 | === modified file 'debian/po/en_GB.po' |
4307 | --- debian/po/en_GB.po 2012-03-21 02:22:11 +0000 |
4308 | +++ debian/po/en_GB.po 2012-06-23 00:59:17 +0000 |
4309 | @@ -15,8 +15,8 @@ |
4310 | "MIME-Version: 1.0\n" |
4311 | "Content-Type: text/plain; charset=UTF-8\n" |
4312 | "Content-Transfer-Encoding: 8bit\n" |
4313 | -"X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n" |
4314 | -"X-Generator: Launchpad (build 14933)\n" |
4315 | +"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4316 | +"X-Generator: Launchpad (build 15316)\n" |
4317 | |
4318 | #. Type: boolean |
4319 | #. Description |
4320 | |
4321 | === modified file 'debian/po/es.po' |
4322 | --- debian/po/es.po 2012-04-11 17:20:37 +0000 |
4323 | +++ debian/po/es.po 2012-06-23 00:59:17 +0000 |
4324 | @@ -15,8 +15,8 @@ |
4325 | "MIME-Version: 1.0\n" |
4326 | "Content-Type: text/plain; charset=UTF-8\n" |
4327 | "Content-Transfer-Encoding: 8bit\n" |
4328 | -"X-Launchpad-Export-Date: 2012-04-07 04:33+0000\n" |
4329 | -"X-Generator: Launchpad (build 15060)\n" |
4330 | +"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4331 | +"X-Generator: Launchpad (build 15316)\n" |
4332 | |
4333 | #. Type: boolean |
4334 | #. Description |
4335 | @@ -75,8 +75,7 @@ |
4336 | #. Description |
4337 | #: ../checkbox.templates:4001 |
4338 | msgid "List of jobs to run when testing with checkbox." |
4339 | -msgstr "" |
4340 | -"Lista de tareas a ejecutar mientras se realizan pruebas con checkbox." |
4341 | +msgstr "Lista de tareas a ejecutar mientras se realizan pruebas con checkbox." |
4342 | |
4343 | #. Type: string |
4344 | #. Description |
4345 | |
4346 | === modified file 'debian/po/fr.po' |
4347 | --- debian/po/fr.po 2012-03-21 02:22:11 +0000 |
4348 | +++ debian/po/fr.po 2012-06-23 00:59:17 +0000 |
4349 | @@ -15,8 +15,8 @@ |
4350 | "MIME-Version: 1.0\n" |
4351 | "Content-Type: text/plain; charset=UTF-8\n" |
4352 | "Content-Transfer-Encoding: 8bit\n" |
4353 | -"X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n" |
4354 | -"X-Generator: Launchpad (build 14933)\n" |
4355 | +"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4356 | +"X-Generator: Launchpad (build 15316)\n" |
4357 | |
4358 | #. Type: boolean |
4359 | #. Description |
4360 | |
4361 | === modified file 'debian/po/he.po' |
4362 | --- debian/po/he.po 2012-03-21 02:22:11 +0000 |
4363 | +++ debian/po/he.po 2012-06-23 00:59:17 +0000 |
4364 | @@ -15,8 +15,8 @@ |
4365 | "MIME-Version: 1.0\n" |
4366 | "Content-Type: text/plain; charset=UTF-8\n" |
4367 | "Content-Transfer-Encoding: 8bit\n" |
4368 | -"X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n" |
4369 | -"X-Generator: Launchpad (build 14933)\n" |
4370 | +"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4371 | +"X-Generator: Launchpad (build 15316)\n" |
4372 | |
4373 | #. Type: boolean |
4374 | #. Description |
4375 | |
4376 | === modified file 'debian/po/hu.po' |
4377 | --- debian/po/hu.po 2012-03-21 02:22:11 +0000 |
4378 | +++ debian/po/hu.po 2012-06-23 00:59:17 +0000 |
4379 | @@ -15,8 +15,8 @@ |
4380 | "MIME-Version: 1.0\n" |
4381 | "Content-Type: text/plain; charset=UTF-8\n" |
4382 | "Content-Transfer-Encoding: 8bit\n" |
4383 | -"X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n" |
4384 | -"X-Generator: Launchpad (build 14933)\n" |
4385 | +"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4386 | +"X-Generator: Launchpad (build 15316)\n" |
4387 | |
4388 | #. Type: boolean |
4389 | #. Description |
4390 | |
4391 | === modified file 'debian/po/it.po' |
4392 | --- debian/po/it.po 2012-03-21 02:22:11 +0000 |
4393 | +++ debian/po/it.po 2012-06-23 00:59:17 +0000 |
4394 | @@ -15,8 +15,8 @@ |
4395 | "MIME-Version: 1.0\n" |
4396 | "Content-Type: text/plain; charset=UTF-8\n" |
4397 | "Content-Transfer-Encoding: 8bit\n" |
4398 | -"X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n" |
4399 | -"X-Generator: Launchpad (build 14933)\n" |
4400 | +"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4401 | +"X-Generator: Launchpad (build 15316)\n" |
4402 | |
4403 | #. Type: boolean |
4404 | #. Description |
4405 | |
4406 | === modified file 'debian/po/ja.po' |
4407 | --- debian/po/ja.po 2012-03-21 02:22:11 +0000 |
4408 | +++ debian/po/ja.po 2012-06-23 00:59:17 +0000 |
4409 | @@ -15,8 +15,8 @@ |
4410 | "MIME-Version: 1.0\n" |
4411 | "Content-Type: text/plain; charset=UTF-8\n" |
4412 | "Content-Transfer-Encoding: 8bit\n" |
4413 | -"X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n" |
4414 | -"X-Generator: Launchpad (build 14933)\n" |
4415 | +"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4416 | +"X-Generator: Launchpad (build 15316)\n" |
4417 | |
4418 | #. Type: boolean |
4419 | #. Description |
4420 | @@ -31,8 +31,9 @@ |
4421 | "If this option is set to Yes, then checkbox will ask if the user wants to " |
4422 | "file a bug for failing tests, even if apport is not enabled." |
4423 | msgstr "" |
4424 | -"このオプションが有効になっていると、テストに失敗した際にバグ報告を行うかどうか、checkboxが確認するようになります。これはapportが有効になって" |
4425 | -"いなくても機能します。" |
4426 | +"このオプションが有効になっていると、テストに失敗した際にバグ報告を行うかどう" |
4427 | +"か、checkboxが確認するようになります。これはapportが有効になっていなくても機" |
4428 | +"能します。" |
4429 | |
4430 | #. Type: string |
4431 | #. Description |
4432 | @@ -46,7 +47,9 @@ |
4433 | msgid "" |
4434 | "When filing a new bug through checkbox, if it does not guess the package, " |
4435 | "the default package that the bug will be file against." |
4436 | -msgstr "checkbox経由でバグ報告を行う場合、パッケージ名を推定できなかったときは、デフォルトのパッケージ名を用いて報告します。" |
4437 | +msgstr "" |
4438 | +"checkbox経由でバグ報告を行う場合、パッケージ名を推定できなかったときは、デ" |
4439 | +"フォルトのパッケージ名を用いて報告します。" |
4440 | |
4441 | #. Type: string |
4442 | #. Description |
4443 | |
4444 | === modified file 'debian/po/nl.po' |
4445 | --- debian/po/nl.po 2012-03-21 02:22:11 +0000 |
4446 | +++ debian/po/nl.po 2012-06-23 00:59:17 +0000 |
4447 | @@ -15,8 +15,8 @@ |
4448 | "MIME-Version: 1.0\n" |
4449 | "Content-Type: text/plain; charset=UTF-8\n" |
4450 | "Content-Transfer-Encoding: 8bit\n" |
4451 | -"X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n" |
4452 | -"X-Generator: Launchpad (build 14933)\n" |
4453 | +"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4454 | +"X-Generator: Launchpad (build 15316)\n" |
4455 | |
4456 | #. Type: boolean |
4457 | #. Description |
4458 | |
4459 | === modified file 'debian/po/oc.po' |
4460 | --- debian/po/oc.po 2012-03-21 02:22:11 +0000 |
4461 | +++ debian/po/oc.po 2012-06-23 00:59:17 +0000 |
4462 | @@ -11,12 +11,12 @@ |
4463 | "PO-Revision-Date: 2012-02-24 07:45+0000\n" |
4464 | "Last-Translator: Cédric VALMARY (Tot en òc) <cvalmary@yahoo.fr>\n" |
4465 | "Language-Team: Occitan (post 1500) <oc@li.org>\n" |
4466 | -"Language: oc\n" |
4467 | +"Language: \n" |
4468 | "MIME-Version: 1.0\n" |
4469 | "Content-Type: text/plain; charset=UTF-8\n" |
4470 | "Content-Transfer-Encoding: 8bit\n" |
4471 | -"X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n" |
4472 | -"X-Generator: Launchpad (build 14933)\n" |
4473 | +"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4474 | +"X-Generator: Launchpad (build 15316)\n" |
4475 | |
4476 | #. Type: boolean |
4477 | #. Description |
4478 | |
4479 | === modified file 'debian/po/pl.po' |
4480 | --- debian/po/pl.po 2012-03-21 02:22:11 +0000 |
4481 | +++ debian/po/pl.po 2012-06-23 00:59:17 +0000 |
4482 | @@ -15,8 +15,8 @@ |
4483 | "MIME-Version: 1.0\n" |
4484 | "Content-Type: text/plain; charset=UTF-8\n" |
4485 | "Content-Transfer-Encoding: 8bit\n" |
4486 | -"X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n" |
4487 | -"X-Generator: Launchpad (build 14933)\n" |
4488 | +"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4489 | +"X-Generator: Launchpad (build 15316)\n" |
4490 | |
4491 | #. Type: boolean |
4492 | #. Description |
4493 | |
4494 | === modified file 'debian/po/pt_BR.po' |
4495 | --- debian/po/pt_BR.po 2012-03-21 02:22:11 +0000 |
4496 | +++ debian/po/pt_BR.po 2012-06-23 00:59:17 +0000 |
4497 | @@ -8,15 +8,15 @@ |
4498 | "Project-Id-Version: checkbox\n" |
4499 | "Report-Msgid-Bugs-To: checkbox@packages.debian.org\n" |
4500 | "POT-Creation-Date: 2011-03-29 15:19+0200\n" |
4501 | -"PO-Revision-Date: 2011-09-16 19:04+0000\n" |
4502 | -"Last-Translator: André Gondim <Unknown>\n" |
4503 | +"PO-Revision-Date: 2012-05-12 03:33+0000\n" |
4504 | +"Last-Translator: eniomarconcini <Unknown>\n" |
4505 | "Language-Team: Brazilian Portuguese <pt_BR@li.org>\n" |
4506 | "Language: pt_BR\n" |
4507 | "MIME-Version: 1.0\n" |
4508 | "Content-Type: text/plain; charset=UTF-8\n" |
4509 | "Content-Transfer-Encoding: 8bit\n" |
4510 | -"X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n" |
4511 | -"X-Generator: Launchpad (build 14933)\n" |
4512 | +"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4513 | +"X-Generator: Launchpad (build 15316)\n" |
4514 | |
4515 | #. Type: boolean |
4516 | #. Description |
4517 | @@ -31,15 +31,15 @@ |
4518 | "If this option is set to Yes, then checkbox will ask if the user wants to " |
4519 | "file a bug for failing tests, even if apport is not enabled." |
4520 | msgstr "" |
4521 | -"Se esta opção está definido como Sim, então a caixa de verificação irá " |
4522 | -"perguntar se o usuário quer relatar o erro no teste falho, mesmo se o apport " |
4523 | -"não estiver habilitado." |
4524 | +"Se esta opção for definida como Sim, então o Checkbox irá perguntar se o " |
4525 | +"usuário quer relatar o erro dos testes que falharam, mesmo que o Apport não " |
4526 | +"esteja habilitado." |
4527 | |
4528 | #. Type: string |
4529 | #. Description |
4530 | #: ../checkbox.templates:2001 |
4531 | msgid "Default package to report bugs against:" |
4532 | -msgstr "" |
4533 | +msgstr "Pacote padrão para relatar erros:" |
4534 | |
4535 | #. Type: string |
4536 | #. Description |
4537 | @@ -48,42 +48,48 @@ |
4538 | "When filing a new bug through checkbox, if it does not guess the package, " |
4539 | "the default package that the bug will be file against." |
4540 | msgstr "" |
4541 | +"Quando estiver registrando um novo erro através do Checkbox, se ele não " |
4542 | +"adivinhar o pacote, o pacote padrão do qual o erro será relatado." |
4543 | |
4544 | #. Type: string |
4545 | #. Description |
4546 | #: ../checkbox.templates:3001 |
4547 | msgid "Test suite blacklist:" |
4548 | -msgstr "" |
4549 | +msgstr "Lista negra da suíte de testes:" |
4550 | |
4551 | #. Type: string |
4552 | #. Description |
4553 | #: ../checkbox.templates:3001 |
4554 | msgid "List of job files to never run when testing with checkbox." |
4555 | msgstr "" |
4556 | +"Lista de arquivos de trabalho para nunca serem executados quando estiver " |
4557 | +"testando com checkbox." |
4558 | |
4559 | #. Type: string |
4560 | #. Description |
4561 | #: ../checkbox.templates:4001 |
4562 | msgid "Test suite whitelist:" |
4563 | -msgstr "" |
4564 | +msgstr "Lista branca da suíte de testes:" |
4565 | |
4566 | #. Type: string |
4567 | #. Description |
4568 | #: ../checkbox.templates:4001 |
4569 | msgid "List of jobs to run when testing with checkbox." |
4570 | msgstr "" |
4571 | +"Lista de arquivos de trabalho para executar enquanto estiver testando com " |
4572 | +"checkbox." |
4573 | |
4574 | #. Type: string |
4575 | #. Description |
4576 | #: ../checkbox.templates:5001 |
4577 | msgid "Transport URL:" |
4578 | -msgstr "" |
4579 | +msgstr "Transportar URL:" |
4580 | |
4581 | #. Type: string |
4582 | #. Description |
4583 | #: ../checkbox.templates:5001 |
4584 | msgid "URL where to send submissions." |
4585 | -msgstr "URL para enviar submissões" |
4586 | +msgstr "URL para enviar relatórios." |
4587 | |
4588 | #. Type: string |
4589 | #. Description |
4590 | @@ -95,7 +101,7 @@ |
4591 | #. Description |
4592 | #: ../checkbox.templates:6001 |
4593 | msgid "E-mail address used to sign in to Launchpad." |
4594 | -msgstr "" |
4595 | +msgstr "Endereço de e-mail usado para entrar no Launchpad." |
4596 | |
4597 | #. Type: string |
4598 | #. Description |
4599 | @@ -107,16 +113,16 @@ |
4600 | #. Description |
4601 | #: ../checkbox.templates:7001 |
4602 | msgid "HTTP proxy to use instead of the one specified in environment." |
4603 | -msgstr "" |
4604 | +msgstr "Proxy HTTP para usar em vez do especificado pelo ambiente." |
4605 | |
4606 | #. Type: string |
4607 | #. Description |
4608 | #: ../checkbox.templates:8001 |
4609 | msgid "HTTPS Proxy:" |
4610 | -msgstr "HTTPS Proxy:" |
4611 | +msgstr "Proxy HTTPS:" |
4612 | |
4613 | #. Type: string |
4614 | #. Description |
4615 | #: ../checkbox.templates:8001 |
4616 | msgid "HTTPS proxy to use instead of the one specified in environment." |
4617 | -msgstr "" |
4618 | +msgstr "Proxy HTTPS para usar em vez do especificado pelo ambiente." |
4619 | |
4620 | === modified file 'debian/po/ro.po' |
4621 | --- debian/po/ro.po 2012-03-21 02:22:11 +0000 |
4622 | +++ debian/po/ro.po 2012-06-23 00:59:17 +0000 |
4623 | @@ -15,8 +15,8 @@ |
4624 | "MIME-Version: 1.0\n" |
4625 | "Content-Type: text/plain; charset=UTF-8\n" |
4626 | "Content-Transfer-Encoding: 8bit\n" |
4627 | -"X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n" |
4628 | -"X-Generator: Launchpad (build 14933)\n" |
4629 | +"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4630 | +"X-Generator: Launchpad (build 15316)\n" |
4631 | |
4632 | #. Type: boolean |
4633 | #. Description |
4634 | |
4635 | === modified file 'debian/po/ru.po' |
4636 | --- debian/po/ru.po 2012-03-21 02:22:11 +0000 |
4637 | +++ debian/po/ru.po 2012-06-23 00:59:17 +0000 |
4638 | @@ -15,8 +15,8 @@ |
4639 | "MIME-Version: 1.0\n" |
4640 | "Content-Type: text/plain; charset=UTF-8\n" |
4641 | "Content-Transfer-Encoding: 8bit\n" |
4642 | -"X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n" |
4643 | -"X-Generator: Launchpad (build 14933)\n" |
4644 | +"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4645 | +"X-Generator: Launchpad (build 15316)\n" |
4646 | |
4647 | #. Type: boolean |
4648 | #. Description |
4649 | |
4650 | === added file 'debian/po/tr.po' |
4651 | --- debian/po/tr.po 1970-01-01 00:00:00 +0000 |
4652 | +++ debian/po/tr.po 2012-06-23 00:59:17 +0000 |
4653 | @@ -0,0 +1,119 @@ |
4654 | +# Turkish translation for checkbox |
4655 | +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 |
4656 | +# This file is distributed under the same license as the checkbox package. |
4657 | +# FIRST AUTHOR <EMAIL@ADDRESS>, 2012. |
4658 | +# |
4659 | +msgid "" |
4660 | +msgstr "" |
4661 | +"Project-Id-Version: checkbox\n" |
4662 | +"Report-Msgid-Bugs-To: checkbox@packages.debian.org\n" |
4663 | +"POT-Creation-Date: 2011-03-29 15:19+0200\n" |
4664 | +"PO-Revision-Date: 2012-05-18 12:51+0000\n" |
4665 | +"Last-Translator: Hasan Yılmaz <iletisim@hasanyilmaz.net>\n" |
4666 | +"Language-Team: Turkish <tr@li.org>\n" |
4667 | +"Language: tr\n" |
4668 | +"MIME-Version: 1.0\n" |
4669 | +"Content-Type: text/plain; charset=UTF-8\n" |
4670 | +"Content-Transfer-Encoding: 8bit\n" |
4671 | +"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4672 | +"X-Generator: Launchpad (build 15316)\n" |
4673 | + |
4674 | +#. Type: boolean |
4675 | +#. Description |
4676 | +#: ../checkbox.templates:1001 |
4677 | +msgid "Enable bug reporting by default? " |
4678 | +msgstr "" |
4679 | + |
4680 | +#. Type: boolean |
4681 | +#. Description |
4682 | +#: ../checkbox.templates:1001 |
4683 | +msgid "" |
4684 | +"If this option is set to Yes, then checkbox will ask if the user wants to " |
4685 | +"file a bug for failing tests, even if apport is not enabled." |
4686 | +msgstr "" |
4687 | + |
4688 | +#. Type: string |
4689 | +#. Description |
4690 | +#: ../checkbox.templates:2001 |
4691 | +msgid "Default package to report bugs against:" |
4692 | +msgstr "" |
4693 | + |
4694 | +#. Type: string |
4695 | +#. Description |
4696 | +#: ../checkbox.templates:2001 |
4697 | +msgid "" |
4698 | +"When filing a new bug through checkbox, if it does not guess the package, " |
4699 | +"the default package that the bug will be file against." |
4700 | +msgstr "" |
4701 | + |
4702 | +#. Type: string |
4703 | +#. Description |
4704 | +#: ../checkbox.templates:3001 |
4705 | +msgid "Test suite blacklist:" |
4706 | +msgstr "" |
4707 | + |
4708 | +#. Type: string |
4709 | +#. Description |
4710 | +#: ../checkbox.templates:3001 |
4711 | +msgid "List of job files to never run when testing with checkbox." |
4712 | +msgstr "" |
4713 | + |
4714 | +#. Type: string |
4715 | +#. Description |
4716 | +#: ../checkbox.templates:4001 |
4717 | +msgid "Test suite whitelist:" |
4718 | +msgstr "" |
4719 | + |
4720 | +#. Type: string |
4721 | +#. Description |
4722 | +#: ../checkbox.templates:4001 |
4723 | +msgid "List of jobs to run when testing with checkbox." |
4724 | +msgstr "" |
4725 | + |
4726 | +#. Type: string |
4727 | +#. Description |
4728 | +#: ../checkbox.templates:5001 |
4729 | +msgid "Transport URL:" |
4730 | +msgstr "" |
4731 | + |
4732 | +#. Type: string |
4733 | +#. Description |
4734 | +#: ../checkbox.templates:5001 |
4735 | +msgid "URL where to send submissions." |
4736 | +msgstr "" |
4737 | + |
4738 | +#. Type: string |
4739 | +#. Description |
4740 | +#: ../checkbox.templates:6001 |
4741 | +msgid "Launchpad E-mail:" |
4742 | +msgstr "Launchpad E-posta:" |
4743 | + |
4744 | +#. Type: string |
4745 | +#. Description |
4746 | +#: ../checkbox.templates:6001 |
4747 | +msgid "E-mail address used to sign in to Launchpad." |
4748 | +msgstr "" |
4749 | + |
4750 | +#. Type: string |
4751 | +#. Description |
4752 | +#: ../checkbox.templates:7001 |
4753 | +msgid "HTTP Proxy:" |
4754 | +msgstr "" |
4755 | + |
4756 | +#. Type: string |
4757 | +#. Description |
4758 | +#: ../checkbox.templates:7001 |
4759 | +msgid "HTTP proxy to use instead of the one specified in environment." |
4760 | +msgstr "" |
4761 | + |
4762 | +#. Type: string |
4763 | +#. Description |
4764 | +#: ../checkbox.templates:8001 |
4765 | +msgid "HTTPS Proxy:" |
4766 | +msgstr "" |
4767 | + |
4768 | +#. Type: string |
4769 | +#. Description |
4770 | +#: ../checkbox.templates:8001 |
4771 | +msgid "HTTPS proxy to use instead of the one specified in environment." |
4772 | +msgstr "" |
4773 | |
4774 | === modified file 'debian/po/uk.po' |
4775 | --- debian/po/uk.po 2012-03-21 02:22:11 +0000 |
4776 | +++ debian/po/uk.po 2012-06-23 00:59:17 +0000 |
4777 | @@ -15,8 +15,8 @@ |
4778 | "MIME-Version: 1.0\n" |
4779 | "Content-Type: text/plain; charset=UTF-8\n" |
4780 | "Content-Transfer-Encoding: 8bit\n" |
4781 | -"X-Launchpad-Export-Date: 2012-03-15 04:34+0000\n" |
4782 | -"X-Generator: Launchpad (build 14933)\n" |
4783 | +"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4784 | +"X-Generator: Launchpad (build 15316)\n" |
4785 | |
4786 | #. Type: boolean |
4787 | #. Description |
4788 | |
4789 | === added file 'debian/po/zh_CN.po' |
4790 | --- debian/po/zh_CN.po 1970-01-01 00:00:00 +0000 |
4791 | +++ debian/po/zh_CN.po 2012-06-23 00:59:17 +0000 |
4792 | @@ -0,0 +1,119 @@ |
4793 | +# Chinese (Simplified) translation for checkbox |
4794 | +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 |
4795 | +# This file is distributed under the same license as the checkbox package. |
4796 | +# FIRST AUTHOR <EMAIL@ADDRESS>, 2012. |
4797 | +# |
4798 | +msgid "" |
4799 | +msgstr "" |
4800 | +"Project-Id-Version: checkbox\n" |
4801 | +"Report-Msgid-Bugs-To: checkbox@packages.debian.org\n" |
4802 | +"POT-Creation-Date: 2011-03-29 15:19+0200\n" |
4803 | +"PO-Revision-Date: 2012-05-09 02:09+0000\n" |
4804 | +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" |
4805 | +"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n" |
4806 | +"Language: \n" |
4807 | +"MIME-Version: 1.0\n" |
4808 | +"Content-Type: text/plain; charset=UTF-8\n" |
4809 | +"Content-Transfer-Encoding: 8bit\n" |
4810 | +"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4811 | +"X-Generator: Launchpad (build 15316)\n" |
4812 | + |
4813 | +#. Type: boolean |
4814 | +#. Description |
4815 | +#: ../checkbox.templates:1001 |
4816 | +msgid "Enable bug reporting by default? " |
4817 | +msgstr "" |
4818 | + |
4819 | +#. Type: boolean |
4820 | +#. Description |
4821 | +#: ../checkbox.templates:1001 |
4822 | +msgid "" |
4823 | +"If this option is set to Yes, then checkbox will ask if the user wants to " |
4824 | +"file a bug for failing tests, even if apport is not enabled." |
4825 | +msgstr "" |
4826 | + |
4827 | +#. Type: string |
4828 | +#. Description |
4829 | +#: ../checkbox.templates:2001 |
4830 | +msgid "Default package to report bugs against:" |
4831 | +msgstr "" |
4832 | + |
4833 | +#. Type: string |
4834 | +#. Description |
4835 | +#: ../checkbox.templates:2001 |
4836 | +msgid "" |
4837 | +"When filing a new bug through checkbox, if it does not guess the package, " |
4838 | +"the default package that the bug will be file against." |
4839 | +msgstr "" |
4840 | + |
4841 | +#. Type: string |
4842 | +#. Description |
4843 | +#: ../checkbox.templates:3001 |
4844 | +msgid "Test suite blacklist:" |
4845 | +msgstr "" |
4846 | + |
4847 | +#. Type: string |
4848 | +#. Description |
4849 | +#: ../checkbox.templates:3001 |
4850 | +msgid "List of job files to never run when testing with checkbox." |
4851 | +msgstr "" |
4852 | + |
4853 | +#. Type: string |
4854 | +#. Description |
4855 | +#: ../checkbox.templates:4001 |
4856 | +msgid "Test suite whitelist:" |
4857 | +msgstr "" |
4858 | + |
4859 | +#. Type: string |
4860 | +#. Description |
4861 | +#: ../checkbox.templates:4001 |
4862 | +msgid "List of jobs to run when testing with checkbox." |
4863 | +msgstr "" |
4864 | + |
4865 | +#. Type: string |
4866 | +#. Description |
4867 | +#: ../checkbox.templates:5001 |
4868 | +msgid "Transport URL:" |
4869 | +msgstr "" |
4870 | + |
4871 | +#. Type: string |
4872 | +#. Description |
4873 | +#: ../checkbox.templates:5001 |
4874 | +msgid "URL where to send submissions." |
4875 | +msgstr "" |
4876 | + |
4877 | +#. Type: string |
4878 | +#. Description |
4879 | +#: ../checkbox.templates:6001 |
4880 | +msgid "Launchpad E-mail:" |
4881 | +msgstr "" |
4882 | + |
4883 | +#. Type: string |
4884 | +#. Description |
4885 | +#: ../checkbox.templates:6001 |
4886 | +msgid "E-mail address used to sign in to Launchpad." |
4887 | +msgstr "" |
4888 | + |
4889 | +#. Type: string |
4890 | +#. Description |
4891 | +#: ../checkbox.templates:7001 |
4892 | +msgid "HTTP Proxy:" |
4893 | +msgstr "" |
4894 | + |
4895 | +#. Type: string |
4896 | +#. Description |
4897 | +#: ../checkbox.templates:7001 |
4898 | +msgid "HTTP proxy to use instead of the one specified in environment." |
4899 | +msgstr "" |
4900 | + |
4901 | +#. Type: string |
4902 | +#. Description |
4903 | +#: ../checkbox.templates:8001 |
4904 | +msgid "HTTPS Proxy:" |
4905 | +msgstr "" |
4906 | + |
4907 | +#. Type: string |
4908 | +#. Description |
4909 | +#: ../checkbox.templates:8001 |
4910 | +msgid "HTTPS proxy to use instead of the one specified in environment." |
4911 | +msgstr "" |
4912 | |
4913 | === modified file 'debian/po/zh_TW.po' |
4914 | --- debian/po/zh_TW.po 2012-03-21 02:22:11 +0000 |
4915 | +++ debian/po/zh_TW.po 2012-06-23 00:59:17 +0000 |
4916 | @@ -15,8 +15,8 @@ |
4917 | "MIME-Version: 1.0\n" |
4918 | "Content-Type: text/plain; charset=UTF-8\n" |
4919 | "Content-Transfer-Encoding: 8bit\n" |
4920 | -"X-Launchpad-Export-Date: 2012-03-15 04:35+0000\n" |
4921 | -"X-Generator: Launchpad (build 14933)\n" |
4922 | +"X-Launchpad-Export-Date: 2012-05-30 05:17+0000\n" |
4923 | +"X-Generator: Launchpad (build 15316)\n" |
4924 | |
4925 | #. Type: boolean |
4926 | #. Description |
4927 | @@ -30,7 +30,9 @@ |
4928 | msgid "" |
4929 | "If this option is set to Yes, then checkbox will ask if the user wants to " |
4930 | "file a bug for failing tests, even if apport is not enabled." |
4931 | -msgstr "若這個選項設為「是」,checkbox 會詢問使用者是否要不管 apport 有沒有啟用,都提交失敗測試的臭蟲回報。" |
4932 | +msgstr "" |
4933 | +"若這個選項設為「是」,checkbox 會詢問使用者是否要不管 apport 有沒有啟用,都提" |
4934 | +"交失敗測試的臭蟲回報。" |
4935 | |
4936 | #. Type: string |
4937 | #. Description |
4938 | |
4939 | === modified file 'debian/rules' |
4940 | --- debian/rules 2012-02-15 00:11:21 +0000 |
4941 | +++ debian/rules 2012-06-23 00:59:17 +0000 |
4942 | @@ -1,11 +1,18 @@ |
4943 | #!/usr/bin/make -f |
4944 | |
4945 | %: |
4946 | - dh "$@" --with translations,python2 |
4947 | + dh "$@" --with translations,python3 |
4948 | |
4949 | override_dh_auto_build: |
4950 | (cd qt/frontend; qmake-qt4; make) |
4951 | - dh_auto_build |
4952 | + set -ex; for python in $(shell py3versions -r); do \ |
4953 | + $$python setup.py build; \ |
4954 | + done; |
4955 | + |
4956 | +override_dh_auto_install: |
4957 | + set -ex; for python in $(shell py3versions -r); do \ |
4958 | + $$python setup.py install --root=$(CURDIR)/debian/tmp --install-layout=deb; \ |
4959 | + done; |
4960 | |
4961 | override_dh_installdeb: |
4962 | cp debian/checkbox.postrm debian/checkbox-cli.postrm |
4963 | |
4964 | === modified file 'examples/checkbox-qt.ini' |
4965 | --- examples/checkbox-qt.ini 2012-02-15 00:11:21 +0000 |
4966 | +++ examples/checkbox-qt.ini 2012-06-23 00:59:17 +0000 |
4967 | @@ -12,5 +12,5 @@ |
4968 | # Class implementing the UserInterface interface. |
4969 | interface_class = QTInterface |
4970 | |
4971 | -# Path where GTK files are stored. |
4972 | +# Path where qt files are stored. |
4973 | data_path = %(checkbox_share)s/qt |
4974 | |
4975 | === modified file 'examples/checkbox.ini' |
4976 | --- examples/checkbox.ini 2011-11-18 12:46:21 +0000 |
4977 | +++ examples/checkbox.ini 2012-06-23 00:59:17 +0000 |
4978 | @@ -21,6 +21,4 @@ |
4979 | |
4980 | [checkbox/plugins/jobs_info] |
4981 | |
4982 | -# Blacklist of jobs that are potentially dangerous |
4983 | -blacklist = autotest/full_suite ltp phoronix qa-regression-testing |
4984 | - clone06.1 ioctl03.1 lchown02.* swapon03.1 |
4985 | +# Required section so that checkbox.application can match .*/jobs_info/.* |
4986 | |
4987 | === modified file 'gtk/checkbox-gtk.ui' |
4988 | --- gtk/checkbox-gtk.ui 2011-11-18 12:46:21 +0000 |
4989 | +++ gtk/checkbox-gtk.ui 2012-06-23 00:59:17 +0000 |
4990 | @@ -165,10 +165,22 @@ |
4991 | </packing> |
4992 | </child> |
4993 | <child> |
4994 | - <object class="GtkHButtonBox" id="hbuttonbox_test"> |
4995 | + <object class="GtkBox" id="hbuttonbox_test"> |
4996 | <property name="visible">True</property> |
4997 | <property name="layout_style">end</property> |
4998 | <child> |
4999 | + <object class="GtkProgressBar" id="progressbar_test"> |
5000 | + <property name="visible">True</property> |
The diff has been truncated for viewing.