Merge lp:~cr3/ubuntu/quantal/checkbox/0.14 into lp:ubuntu/quantal/checkbox

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
Reviewer Review Type Date Requested Status
Ubuntu branches Pending
Review via email: mp+111701@code.launchpad.net
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'
3621Binary 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'
3623Binary 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'
3625Binary 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'
3627Binary 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'
3629Binary 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'
3631Binary 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'
3690Binary 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.

Subscribers

People subscribed via source and target branches

to all changes: