Merge lp:~knitzsche/ubuntu-translations/ul10n-custom into lp:~ubuntu-translations-coordinators/ubuntu-translations/ul10n-stats

Proposed by Kyle Nitzsche
Status: Merged
Approved by: Kyle Nitzsche
Approved revision: 24
Merged at revision: 24
Proposed branch: lp:~knitzsche/ubuntu-translations/ul10n-custom
Merge into: lp:~ubuntu-translations-coordinators/ubuntu-translations/ul10n-stats
Diff against target: 2933 lines (+2009/-565)
16 files modified
common/css/light.css (+321/-0)
common/templates/custom_blacklisted_file.py (+119/-0)
common/templates/custom_blacklisted_priority.py (+119/-0)
common/templates/custom_report.py (+128/-0)
common/templates/custom_src_excluded.py (+123/-0)
common/templates/custom_src_included.py (+119/-0)
common/templates/html_report_template.py (+13/-13)
common/utils.py (+13/-2)
config/blacklist.conf (+0/-423)
config/blacklist.lucid.conf (+141/-0)
config/blacklist.maverick.conf (+423/-0)
config/settings.conf (+1/-1)
ubuntu-translations-stats.py (+182/-57)
ul10n_stats/ul10n_custom.py (+4/-2)
ul10n_stats/ul10n_iso_pots_get.py (+31/-35)
ul10n_stats/ul10n_stats_calc.py (+272/-32)
To merge this branch: bzr merge lp:~knitzsche/ubuntu-translations/ul10n-custom

Description of the change

a whole bunch of changes described in bzr log and in person. overview: custom stats optionally derive from build manifest, custom stats have src pkgs in and out links/html pages and blacklisted file and black listed priority links/html pages.

To post a comment you must log in.
Revision history for this message
Kyle Nitzsche (knitzsche) wrote :

with rev 33 and 34 I added release specific black lists. Now config/ has blacklist.lucid.conf and blacklist.maverick.conf. Default is derived from config/settings distro_codename field. -b argument still allows you to use specified file.

Revision history for this message
David Planella (dpm) wrote :

Thanks for the great work on this Kyle. My comments:

• I'd strongly suggest that the README file stays. I can assure I'll need it when in two weeks time I no longer remember what the script does :)
• Why add new files for each custom template type instead of simply adding new variables containing the templates in html_report_template.py?
• In ubuntu-translations-stats.py the --template-blacklist option is now missing a default
• In ubuntu-translations-stats.py, do we need the --no-file option at all? Can we just not specify a blacklist if we don't want to use one?
• In the get_src_pkgs_from_binary_pkgs() you could consider using the apt_pkg Python library instead of calling an external process. You could try something like:

>>> pkgs = map(lambda a: a.strip(), open("bla").readlines())
>>> import apt_pkg
>>> apt_pkg.init()
>>> sources = apt_pkg.GetPkgSrcRecords()
>>> sources.Restart()
>>> for pkg in pkgs:
... while sources.Lookup(pkg):
... print sources.Package

(Credit to dholbach for showing me this some time ago)

• I'd suggest using the format() method instead of things such as 'print "text (" + variable + ")"' - e.g. "text ({1})".format(variable)
• I'd also suggest using the logging methods to display info or debugging text on the terminal
• In ul10n_stats/ul10n_stats_calc.py variations of the block below are executed 4 times. I'd suggest writing a function containing that code, where the type of report can be passed as an argument. Rather than having separate python modules containing different reports, it might be wort exploring having them all in one module and provide a function in that file to select them.
  f_ = codecs.open(os.path.join('reports', 'custom-excluded.html'), 'w', 'utf-8')
  f_.write(excluded.ubuntu_template % variables)
  f_.close()
• When merging, please take into account the changes in trunk that should stay: mainly the html + css cleanup and adaptation of the table to the Light theme, the logging mechanism, the new classes for language operations, and the bugfix for the language ordering in the report.
• As the original script is growing to be a full-fledged project, I think we should look into adopting some minimal coding conventions. I would suggest https://dev.launchpad.net/PythonStyleGuide

Thanks!

Revision history for this message
Kyle Nitzsche (knitzsche) wrote :
Download full text (3.3 KiB)

On 10/06/2010 12:01 PM, David Planella wrote:
> Thanks for the great work on this Kyle. My comments:
>
> • I'd strongly suggest that the README file stays. I can assure I'll need it when in two weeks time I no longer remember what the script does :)
>
this was an error. add it back please.
> • Why add new files for each custom template type instead of simply adding new variables containing the templates in html_report_template.py?
>
to keep ubuntu stuff and custom stuff separated. and to keep these files
shortish and easier to edit.
> • In ubuntu-translations-stats.py the --template-blacklist option is now missing a default
>
that's intentional and relates by the new support for release-specific
blacklist. that is, the default is determined by the config/settings
distro_codename field. you only use this option if you want to use a
different file that you specify.
> • In ubuntu-translations-stats.py, do we need the --no-file option at all? Can we just not specify a blacklist if we don't want to use one?
>
as per the above comment, by default the blacklist for the release in
settings.conf is used. I am agnostic as to the best way to specify using
no 'file' blacklist.
> • In the get_src_pkgs_from_binary_pkgs() you could consider using the apt_pkg Python library instead of calling an external process. You could try something like:
>
I'll take a look at this point further - seems right.
>
>>>> pkgs = map(lambda a: a.strip(), open("bla").readlines())
>>>> import apt_pkg
>>>> apt_pkg.init()
>>>> sources = apt_pkg.GetPkgSrcRecords()
>>>> sources.Restart()
>>>> for pkg in pkgs:
>>>>
> ... while sources.Lookup(pkg):
> ... print sources.Package
>
> (Credit to dholbach for showing me this some time ago)
>
> • I'd suggest using the format() method instead of things such as 'print "text (" + variable + ")"' - e.g. "text ({1})".format(variable)
>
why? it is less intuitive to read (and code) with format.
> • I'd also suggest using the logging methods to display info or debugging text on the terminal
>
sounds good, example please
> • In ul10n_stats/ul10n_stats_calc.py variations of the block below are executed 4 times. I'd suggest writing a function containing that code, where the type of report can be passed as an argument. Rather than having separate python modules containing different reports, it might be wort exploring having them all in one module and provide a function in that file to select them.
> f_ = codecs.open(os.path.join('reports', 'custom-excluded.html'), 'w', 'utf-8')
> f_.write(excluded.ubuntu_template % variables)
> f_.close()
>
yes, i was going to do that, just didn't get to it.
> • When merging, please take into account the changes in trunk that should stay: mainly the html + css cleanup and adaptation of the table to the Light theme, the logging mechanism, the new classes for language operations, and the bugfix for the language ordering in the report.
>
I am not sure how to do that. you said push a branch and make it a merge
proposal, which is what I did. open to suggestions for how we can both
actively develop the same branch.
> • As the original script is gr...

Read more...

Revision history for this message
Kyle Nitzsche (knitzsche) wrote :

So I/we need to work out the conflicts.

Since we don't yet have a working style for that, I am continuing on with development. (I will do whatever is necessary to make this right!)

With the latest commits to my merge proposal branch, I fix a bug and add the following: now all files generated in reports/ start with <basename>, where <basename> is returned by utils.get_basename() function and where it is derived from defaults + config/settings.conf + arguments. see bzr log

Revision history for this message
Kyle Nitzsche (knitzsche) wrote :

I should perhaps add that the point of this is that I'd like to be able to run the whole shebang multiple times and have all generated files (and links in html to them) be named according to that execution's target, so that one targeted execution does not overwrite the files of a differently targeted execution.

Revision history for this message
Kyle Nitzsche (knitzsche) wrote :

ok, forget those two last comments (for the moment), divergence issue prevented push success. I've gotta get this branch proliferation under control. ;)

Revision history for this message
David Planella (dpm) wrote :
Download full text (5.0 KiB)

El dc 06 de 10 de 2010 a les 16:37 +0000, en/na Kyle Nitzsche va
escriure:
> On 10/06/2010 12:01 PM, David Planella wrote:
> > Thanks for the great work on this Kyle. My comments:
> >
> > • I'd strongly suggest that the README file stays. I can assure I'll need it when in two weeks time I no longer remember what the script does :)
> >
> this was an error. add it back please.
> > • Why add new files for each custom template type instead of simply adding new variables containing the templates in html_report_template.py?
> >
> to keep ubuntu stuff and custom stuff separated. and to keep these files
> shortish and easier to edit.
> > • In ubuntu-translations-stats.py the --template-blacklist option is now missing a default
> >
> that's intentional and relates by the new support for release-specific
> blacklist. that is, the default is determined by the config/settings
> distro_codename field. you only use this option if you want to use a
> different file that you specify.
> > • In ubuntu-translations-stats.py, do we need the --no-file option at all? Can we just not specify a blacklist if we don't want to use one?
> >
> as per the above comment, by default the blacklist for the release in
> settings.conf is used. I am agnostic as to the best way to specify using
> no 'file' blacklist.

I think it is probably redundant. We've already got -b to specify the
blacklist file. If we don't want one, we simply don't specify it neither
on the command line (-b) nor in the config file. So my suggestion would
be to remove it and go for fewer options and saner defaults.

> > • In the get_src_pkgs_from_binary_pkgs() you could consider using the apt_pkg Python library instead of calling an external process. You could try something like:
> >
> I'll take a look at this point further - seems right.
> >
> >>>> pkgs = map(lambda a: a.strip(), open("bla").readlines())
> >>>> import apt_pkg
> >>>> apt_pkg.init()
> >>>> sources = apt_pkg.GetPkgSrcRecords()
> >>>> sources.Restart()
> >>>> for pkg in pkgs:
> >>>>
> > ... while sources.Lookup(pkg):
> > ... print sources.Package
> >
> > (Credit to dholbach for showing me this some time ago)
> >
> > • I'd suggest using the format() method instead of things such as 'print "text (" + variable + ")"' - e.g. "text ({1})".format(variable)
> >
> why? it is less intuitive to read (and code) with format.

I guess it's a matter of style or personal preference. I personally find
it easier to read
'Coordinates: {0}, {1}'.format(latitude, longitude) than
'Coordinates: ' + latitude + ', ' + longitude

In the first form the text is one single unbroken string (where {0} and
{1} could also be replaced by variable names), and it has also the
benefit to provide a translator-friendly string (i.e. not split) in case
it ever needed to be made translatable. Not that it applies in this
script, I just find it good practice.

> > • I'd also suggest using the logging methods to display info or debugging text on the terminal
> >
> sounds good, example please

You can see it in the trunk branch, all files have got logging
statements. E.g.

  logger.info('Getting language list...')

Document...

Read more...

24. By Kyle Nitzsche <knitzsche@chroma>

the merge between trunk and my custom branch with conlicts resolved

Revision history for this message
Kyle Nitzsche (knitzsche) wrote :

some of the items David and I discussed as potential changes have not yet been done. These can wait until we get back to a common merged trunk.

I noticed there is a bug (unicode error) in trunk before this merge that causes crash when not obtaining languages from a local file with the -l <file> option.

I handled the merge imperfectly and so my bzr log comments after 24 (there were about 10 more) in my branch are lost. Chock that up to experience. Among the key points are:
 * by default (with no args) file blacklisting is enabled AND there are release-specific blacklist files in config/, for example: config/blacklist.lucid.conf. To disable file blacklisting, use the -f argument.
 * -n <name> causes all generated files (html and data files) in reports/ to start with that as basename. in general,
  > no args: "<distro_id>-<release>" (for example: ubuntu-10.10")
  > -c (for custom) and -n <name>: "<name>" (for example: "thisproject">
  > -c (and no -n): "custom-<distro_id>-<release>" (for example: "custom-ubuntu-10.04")

 * -m <file> starts from manifest (and requires -c)
 * -d <file> starts from file of gettext domains, one per line
 * reports/ includes generated files for a) conversion to html as needed, b) debugging/data analysis, where all files start we basename, as described above

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'common/css/light.css'
2--- common/css/light.css 2010-10-01 17:14:00 +0000
3+++ common/css/light.css 2010-10-07 20:22:40 +0000
4@@ -2,3 +2,324 @@
5 @import url(layout.css);
6 @import url(color.css);
7 @import url(typography.css);
8+/*
9+* Original version created for the Ubuntu documentation team
10+ by Jeff Schering on Sept 2, 2005
11+* Hacked on by Matthew East for the Ubuntu documentation team.
12+* Subsequently hacked by David Planella for the translations team.
13+ Adapted it to the new Ubuntu 'light' theme, taking bits and pieces
14+ from other Ubuntu sister sites, mainly the new wiki theme and the
15+ Ubuntu and QA sites.
16+
17+This file is in the Public Domain.
18+
19+*/
20+
21+/* @import url(screen.css); */
22+
23+body {
24+ background:url('../img/bg_dotted.png') repeat scroll 0 0 transparent;
25+ color:#333333;
26+ margin:0;
27+ font-family:'UbuntuBeta','Bitstream Vera Sans','DejaVu Sans',Tahoma,sans-serif;
28+ font-size:12px;
29+ line-height:16px;
30+}
31+
32+#ubuntu-header {
33+ background-image:url("../img/header_logo.png");
34+ background-repeat:no-repeat;
35+ height:32px;
36+ left:724px;
37+ margin:0;
38+ overflow:hidden;
39+ padding:0;
40+ position:absolute;
41+ text-indent:-9999px;
42+ top:16px;
43+ width:236px;
44+}
45+
46+/*
47+#navbar {
48+ -moz-border-radius:0 0 5px 5px;
49+ -moz-box-shadow:0 0 5px #555555;
50+ background:url("images/light_stripes.png") no-repeat scroll 0 0 #DD4814;
51+ font-size:14px;
52+ height:64px;
53+ line-height:16px;
54+ list-style-type:none;
55+ margin:0;
56+ padding:0 0 0 16px;
57+ position:relative;
58+ z-index:2;
59+}
60+*/
61+
62+#intro-message {
63+ font-size:16px;
64+ line-height: 1.2em;
65+}
66+
67+#navbar {
68+ background:url("../img/topnav_divider.png") no-repeat scroll left top transparent !important;
69+ height:100%;
70+ list-style:none outside none;
71+ margin:0 0 0 16px;
72+ padding:0;
73+}
74+
75+#navbar a {
76+ color:#FFFFFF;
77+ display:block;
78+ float:left;
79+ margin:0;
80+ padding:24px 8px;
81+ text-decoration:none;
82+ text-shadow:0 1px #000000;
83+}
84+
85+#navbar a:hover, #main-menu a.active {
86+ background:url("../img/topnav_active_bg.png") no-repeat scroll right top transparent !important;
87+}
88+
89+#navbar li {
90+ background:url("../img/topnav_divider.png") no-repeat scroll right top transparent !important;
91+ float:left;
92+ font-size:14px;
93+ height:64px;
94+ line-height:16px;
95+ margin:0;
96+ padding:0;
97+}
98+
99+#container {
100+ background-color:#FFFFFF;
101+ width: 976px;
102+ margin: auto;
103+ margin-bottom: 50px;
104+ position: relative;
105+}
106+
107+#container .sb-inner {
108+ background-color: #fff;
109+}
110+
111+#page {
112+ clear: both;
113+ margin: 0;
114+ padding: 10px 30px;
115+}
116+
117+#content {
118+ padding: 12px;
119+}
120+
121+img.ubuntulogo {
122+ margin: 20px;
123+}
124+
125+img.rounded {
126+ padding: 0;
127+ margin: 0;
128+}
129+
130+#topcap {
131+ position: absolute;
132+ top: 0;
133+ left: 0;
134+}
135+
136+#bottomcap {
137+ position: absolute;
138+ bottom: 0;
139+ left: 0;
140+}
141+
142+#header, #container-inner {
143+ -moz-border-radius:0 0 5px 5px;
144+ /*-moz-box-shadow:0 0 5px #BBBBBB;*/
145+ -moz-box-shadow:0 0 5px #555555;
146+}
147+
148+#header {
149+ background: url("../img/header_bg.png") repeat-x scroll left top #DD4814;
150+ height: 64px;
151+ margin: 0;
152+ padding: 0;
153+ position: relative;
154+}
155+
156+
157+#header h1 {
158+ display: inline;
159+}
160+
161+#header h1 span {
162+ display: none;
163+}
164+
165+#logo-floater {
166+ width: 225px;
167+ float: left;
168+ padding: 10px;
169+}
170+
171+#logo-floater h1 {
172+ border: none;
173+}
174+
175+#sitename a {
176+ position: relative;
177+ top: 35px;
178+ float: right;
179+ font-size: 1.5em;
180+ padding-right: 20px;
181+ text-decoration: none;
182+ color: black;
183+}
184+
185+#sitename span {
186+ padding-left: 5px;
187+}
188+
189+#cse-search-box {
190+ position: absolute;
191+ right: 3px;
192+ top: 3px;
193+ /* float: right; */
194+ margin: 5px 10px;
195+ padding: 0;
196+ white-space: nowrap;
197+ font-size: 13px;
198+}
199+
200+#cse-search-box form div {
201+ display: inline;
202+}
203+
204+.breadcrumbs {
205+ padding-bottom: 15px;
206+}
207+
208+ul {
209+ margin-left: 5px;
210+}
211+
212+.orderedlist {
213+ margin-left: 10px;
214+}
215+
216+.titlepage {
217+ padding-right: 1em;
218+}
219+
220+div.toc dt {
221+ margin-top: 2px;
222+}
223+
224+div.toc {
225+ padding-left: 1em;
226+ padding-right: 1em;
227+}
228+
229+/* Links */
230+
231+a {
232+ color:#DD4814;
233+ text-decoration:none;
234+}
235+
236+a:hover {
237+ color:#DD4814;
238+ text-decoration:underline;
239+}
240+
241+/* Headings */
242+/*
243+h2 {
244+ -moz-border-radius-topleft:4px;
245+ -moz-border-radius-topright:4px;
246+ background:none repeat scroll 0 0 #DAD7D3;
247+ margin:0;
248+ padding:8px 534px 8px 8px;
249+ width:401px;
250+}
251+*/
252+
253+h1
254+{
255+ margin: 0;
256+ padding: 2px 0;
257+ font-weight: normal;
258+ color: #f37836;
259+ line-height: 1.2em;
260+}
261+
262+h2
263+{
264+ color: #f37836;
265+ font-size: 24px;
266+ line-height: 1.2em;
267+ font-weight: normal;
268+}
269+
270+h3 {
271+ color: #f37836;
272+ font-size: 1.3em;
273+}
274+h4 {font-size: 1.1em;}
275+h4, h5, h6 {font-size: 1em;}
276+
277+a img{
278+ border: none;
279+}
280+
281+dl {
282+ margin-top: 0em;
283+ margin-bottom: 0.5em;
284+}
285+
286+dt {
287+ margin-top: 1em;
288+}
289+
290+div.qandaset {
291+ margin-left: 1em;
292+}
293+
294+.guimenu, .guimenuitem, .guisubmenu {
295+ font-style: italic;
296+ color: #6d4c07; /* dark brown */
297+}
298+
299+.guilabel, .guibutton {
300+}
301+
302+.question {
303+ font-weight: bold;
304+}
305+
306+/* accelerator keys in menus */
307+.accel {
308+ text-decoration: underline;
309+}
310+
311+.screen, .programlisting {
312+ background-color: #f0eee6; /* light salmon */
313+ border: 1pt solid #C1B496; /* dark tan */
314+ padding: 5px;
315+}
316+
317+#footer {
318+ margin: 0;
319+ color: #444;
320+}
321+
322+.revhistory { font-size: 0.9em; }
323+
324+#ubuntulinks {
325+ text-align: center;
326+}
327+
328+>>>>>>> MERGE-SOURCE
329
330=== added file 'common/templates/custom_blacklisted_file.py'
331--- common/templates/custom_blacklisted_file.py 1970-01-01 00:00:00 +0000
332+++ common/templates/custom_blacklisted_file.py 2010-10-07 20:22:40 +0000
333@@ -0,0 +1,119 @@
334+#!/usr/bin/env python
335+
336+# html_report_template - Provides a template to render an HTML page after
337+# Python variable substitution
338+#
339+# Author: David Planella <david.planella@ubuntu.com>, with mods by
340+# Kyle Nitzsche <kyle.nitzsche@canonical.com>
341+#
342+# Copyright (c) 2009, 2010 Canonical Ltd.
343+#
344+# This program is free software: you can redistribute it and/or modify it
345+# under the terms of the GNU General Public License version 3, as published
346+# by the Free Software Foundation.
347+#
348+# This program is distributed in the hope that it will be useful, but
349+# WITHOUT ANY WARRANTY; without even the implied warranties of
350+# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
351+# PURPOSE. See the GNU General Public License for more details.
352+#
353+# You should have received a copy of the GNU General Public License along
354+# with this program. If not, see <http://www.gnu.org/licenses/>.
355+
356+ubuntu_template = """
357+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
358+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
359+
360+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
361+ <head>
362+ <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
363+ <title>Ubuntu %(distro_release)s Languages</title>
364+ <link rel="stylesheet" href="css/light.css" type="text/css" />
365+
366+ <script src="http://www.google.com/jsapi" type="text/javascript"></script>
367+ <script type="text/javascript">
368+
369+ google.load("visualization", "1", {packages:["table"]});
370+ google.setOnLoadCallback(drawTable);
371+
372+ function drawTable() {
373+ var table_data = new google.visualization.DataTable(%(blacklisted_file_json)s, 0.6);
374+
375+ var table = new google.visualization.Table(
376+ document.getElementById('table'));
377+
378+ var formatter = new google.visualization.BarFormat({
379+ min: 0,
380+ max: 100,
381+ width: 100,
382+ colorPositive: 'green'});
383+ formatter.format(table_data, 0); // Apply formatter to second column
384+
385+ table.draw(table_data, {
386+ allowHtml: true,
387+ showRowNumber: true,
388+ page: 'enable',
389+ pageSize: 100});
390+
391+ // google.visualization.events.addListener(table, 'select', function() {
392+ // var row = table.getSelection()[0].row;
393+ // alert('You selected ' + table_data.getValue(row, 0));
394+
395+ google.visualization.events.addListener(table, 'select', selectHandler);
396+ }
397+
398+ function selectHandler(e) {
399+ var row = table.getSelection()[0].row;
400+ //alert('A table row was selected');
401+ alert('A table row was selected' + table_data.getValue(row, 0));
402+ }
403+ </script>
404+
405+ <style type="text/css">
406+ #report-meta {
407+ text-align: right;
408+ font-size: small;
409+ color: #999;
410+ float: right;
411+ }
412+
413+ #report-meta p {
414+ margin: 0;
415+ }
416+
417+ table {margin-left:auto; margin-right:auto;}
418+ </style>
419+ </head>
420+
421+ <body>
422+ <div id="container">
423+ <div id="container-inner" class="container clear-block">
424+ <div id="header">
425+
426+ <h1 id="ubuntu-header">
427+ <a href="https://wiki.ubuntu.com/Translations" title="Canonical OEM Translation Statistics"></a>
428+ </h1>
429+ </div>
430+
431+ <div id="page">
432+ <div id="content">
433+ <div class="titlepage">
434+ <h2 class="title"><a id="id2820777"></a>Custom Project: %(project)s</h2>
435+ <h3>Blacklisted through File</h3>
436+ <p>The table lists src packages/gettext domains that are excluded from the translation statistics because they were listed in the blacklist file.</p>
437+ </div>
438+
439+ <div id="table"></div>
440+
441+ <div id="footer">
442+ <div id="ubuntulinks">
443+ Last update on %(gen_date)s
444+ </div>
445+ </div>
446+ </div>
447+ </div>
448+ </div>
449+ </body>
450+
451+</html>
452+"""
453
454=== added file 'common/templates/custom_blacklisted_file.pyc'
455Binary files common/templates/custom_blacklisted_file.pyc 1970-01-01 00:00:00 +0000 and common/templates/custom_blacklisted_file.pyc 2010-10-07 20:22:40 +0000 differ
456=== added file 'common/templates/custom_blacklisted_priority.py'
457--- common/templates/custom_blacklisted_priority.py 1970-01-01 00:00:00 +0000
458+++ common/templates/custom_blacklisted_priority.py 2010-10-07 20:22:40 +0000
459@@ -0,0 +1,119 @@
460+#!/usr/bin/env python
461+
462+# html_report_template - Provides a template to render an HTML page after
463+# Python variable substitution
464+#
465+# Author: David Planella <david.planella@ubuntu.com>, with mods by
466+# Kyle Nitzsche <kyle.nitzsche@canonical.com>
467+#
468+# Copyright (c) 2009, 2010 Canonical Ltd.
469+#
470+# This program is free software: you can redistribute it and/or modify it
471+# under the terms of the GNU General Public License version 3, as published
472+# by the Free Software Foundation.
473+#
474+# This program is distributed in the hope that it will be useful, but
475+# WITHOUT ANY WARRANTY; without even the implied warranties of
476+# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
477+# PURPOSE. See the GNU General Public License for more details.
478+#
479+# You should have received a copy of the GNU General Public License along
480+# with this program. If not, see <http://www.gnu.org/licenses/>.
481+
482+ubuntu_template = """
483+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
484+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
485+
486+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
487+ <head>
488+ <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
489+ <title>Ubuntu %(distro_release)s Languages</title>
490+ <link rel="stylesheet" href="css/light.css" type="text/css" />
491+
492+ <script src="http://www.google.com/jsapi" type="text/javascript"></script>
493+ <script type="text/javascript">
494+
495+ google.load("visualization", "1", {packages:["table"]});
496+ google.setOnLoadCallback(drawTable);
497+
498+ function drawTable() {
499+ var table_data = new google.visualization.DataTable(%(blacklisted_priority_json)s, 0.6);
500+
501+ var table = new google.visualization.Table(
502+ document.getElementById('table'));
503+
504+ var formatter = new google.visualization.BarFormat({
505+ min: 0,
506+ max: 100,
507+ width: 100,
508+ colorPositive: 'green'});
509+ formatter.format(table_data, 0); // Apply formatter to second column
510+
511+ table.draw(table_data, {
512+ allowHtml: true,
513+ showRowNumber: true,
514+ page: 'enable',
515+ pageSize: 100});
516+
517+ // google.visualization.events.addListener(table, 'select', function() {
518+ // var row = table.getSelection()[0].row;
519+ // alert('You selected ' + table_data.getValue(row, 0));
520+
521+ google.visualization.events.addListener(table, 'select', selectHandler);
522+ }
523+
524+ function selectHandler(e) {
525+ var row = table.getSelection()[0].row;
526+ //alert('A table row was selected');
527+ alert('A table row was selected' + table_data.getValue(row, 0));
528+ }
529+ </script>
530+
531+ <style type="text/css">
532+ #report-meta {
533+ text-align: right;
534+ font-size: small;
535+ color: #999;
536+ float: right;
537+ }
538+
539+ #report-meta p {
540+ margin: 0;
541+ }
542+
543+ table {margin-left:auto; margin-right:auto;}
544+ </style>
545+ </head>
546+
547+ <body>
548+ <div id="container">
549+ <div id="container-inner" class="container clear-block">
550+ <div id="header">
551+
552+ <h1 id="ubuntu-header">
553+ <a href="https://wiki.ubuntu.com/Translations" title="Canonical OEM Translation Statistics"></a>
554+ </h1>
555+ </div>
556+
557+ <div id="page">
558+ <div id="content">
559+ <div class="titlepage">
560+ <h2 class="title"><a id="id2820777"></a>Custom Project: %(project)s</h2>
561+ <h3>Blacklisted through Priority</h3>
562+ <p>The table lists src packages/gettext domains that are excluded from the translation statistics because their LP template has priority that is lower that the blacklist priority cut-off value.</p>
563+ </div>
564+
565+ <div id="table"></div>
566+
567+ <div id="footer">
568+ <div id="ubuntulinks">
569+ Last update on %(gen_date)s
570+ </div>
571+ </div>
572+ </div>
573+ </div>
574+ </div>
575+ </body>
576+
577+</html>
578+"""
579
580=== added file 'common/templates/custom_blacklisted_priority.pyc'
581Binary files common/templates/custom_blacklisted_priority.pyc 1970-01-01 00:00:00 +0000 and common/templates/custom_blacklisted_priority.pyc 2010-10-07 20:22:40 +0000 differ
582=== added file 'common/templates/custom_report.py'
583--- common/templates/custom_report.py 1970-01-01 00:00:00 +0000
584+++ common/templates/custom_report.py 2010-10-07 20:22:40 +0000
585@@ -0,0 +1,128 @@
586+#!/usr/bin/env python
587+
588+# html_report_template - Provides a template to render an HTML page after
589+# Python variable substitution
590+#
591+# Author: David Planella <david.planella@ubuntu.com>, with mods by
592+# Kyle Nitzsche <kyle.nitzsche@canonical.com>
593+#
594+# Copyright (c) 2009, 2010 Canonical Ltd.
595+#
596+# This program is free software: you can redistribute it and/or modify it
597+# under the terms of the GNU General Public License version 3, as published
598+# by the Free Software Foundation.
599+#
600+# This program is distributed in the hope that it will be useful, but
601+# WITHOUT ANY WARRANTY; without even the implied warranties of
602+# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
603+# PURPOSE. See the GNU General Public License for more details.
604+#
605+# You should have received a copy of the GNU General Public License along
606+# with this program. If not, see <http://www.gnu.org/licenses/>.
607+
608+ubuntu_template = """
609+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
610+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
611+
612+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
613+ <head>
614+ <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
615+ <title>Ubuntu %(distro_release)s Languages</title>
616+ <link rel="stylesheet" href="css/light.css" type="text/css" />
617+ <script src="http://www.google.com/jsapi" type="text/javascript"></script>
618+ <script type="text/javascript">
619+
620+ google.load("visualization", "1", {packages:["table"]});
621+ google.setOnLoadCallback(drawTable);
622+
623+ function drawTable() {
624+ var table_data = new google.visualization.DataTable(%(data_json)s, 0.6);
625+
626+ var table = new google.visualization.Table(
627+ document.getElementById('table_div_langpack'));
628+
629+ /* Format the data column containing the translation percentage
630+ value: show no decimal digits */
631+ var nr_formatter = new google.visualization.NumberFormat({
632+ fractionDigits: 0});
633+ nr_formatter.format(table_data, 1);
634+
635+ /* Format the data column containing the translation percentage
636+ value: show a green bar indicating the level of coverage */
637+ var bar_formatter = new google.visualization.BarFormat({
638+ min: 0,
639+ max: 100,
640+ width: 100,
641+ colorPositive: 'green'
642+ });
643+ bar_formatter.format(table_data, 1);
644+
645+ table.draw(table_data, {
646+ allowHtml: true,
647+ showRowNumber: true,
648+ page: 'enable',
649+ pageSize: 100
650+ });
651+ }
652+
653+ </script>
654+
655+ <style type="text/css">
656+ #report-meta {
657+ text-align: right;
658+ font-size: small;
659+ color: #999;
660+ float: right;
661+ }
662+
663+ #report-meta p {
664+ margin: 0;
665+ }
666+
667+ table {margin-left:auto; margin-right:auto;}
668+ </style>
669+ </head>
670+
671+ <body>
672+ <div id="container">
673+ <div id="container-inner" class="container clear-block">
674+ <div id="header">
675+
676+ <h1 id="ubuntu-header">
677+ <a href="https://wiki.ubuntu.com/Translations" title="Canonical OEM Translation Statistics"></a>
678+ </h1>
679+ </div>
680+
681+ <div id="page">
682+ <div id="content">
683+ <div class="titlepage">
684+ <h2 class="title"><a id="id2820777"></a>Custom Project: %(project)s</h2>
685+ <h3>Based on Ubuntu %(distro_release)s Translations</h3>
686+ <ul>
687+ <li><a href="%(basename)s-included.html">Included Src Pkgs</a> that are in the custom project AND in lang packs. This is what the data below is for.</li>
688+
689+ <li><a href="%(basename)s-excluded.html">Excluded Src
690+Pkgs</a> that are in the custom project but NOT in lang packs or are excluded
691+through blacklists: <a href="%(basename)s-blacklisted-file.html">file</a> and
692+<a href="%(basename)s-blacklisted-priority.html">LP priority</a> The data below does not include these src pkgs.</li>
693+ </ul>
694+ </div>
695+
696+ <div id="table_div_langpack"></div>
697+
698+ <div id="footer">
699+ <div id="ubuntulinks">
700+ <a href="https://wiki.ubuntu.com/Translations/Stats#UbuntuTranslationStatistics">More information on these statistics</a>
701+ &nbsp;&bull;&nbsp;
702+ Found a bug? <a href="https://bugs.launchpad.net/ubuntu-translations">Report it</a>
703+ &nbsp;&bull;&nbsp;
704+ Last update on %(gen_date)s
705+ </div>
706+ </div>
707+ </div>
708+ </div>
709+ </div>
710+ </body>
711+
712+</html>
713+"""
714
715=== added file 'common/templates/custom_report.pyc'
716Binary files common/templates/custom_report.pyc 1970-01-01 00:00:00 +0000 and common/templates/custom_report.pyc 2010-10-07 20:22:40 +0000 differ
717=== added file 'common/templates/custom_src_excluded.py'
718--- common/templates/custom_src_excluded.py 1970-01-01 00:00:00 +0000
719+++ common/templates/custom_src_excluded.py 2010-10-07 20:22:40 +0000
720@@ -0,0 +1,123 @@
721+#!/usr/bin/env python
722+
723+# html_report_template - Provides a template to render an HTML page after
724+# Python variable substitution
725+#
726+# Author: David Planella <david.planella@ubuntu.com>, with mods by
727+# Kyle Nitzsche <kyle.nitzsche@canonical.com>
728+#
729+# Copyright (c) 2009, 2010 Canonical Ltd.
730+#
731+# This program is free software: you can redistribute it and/or modify it
732+# under the terms of the GNU General Public License version 3, as published
733+# by the Free Software Foundation.
734+#
735+# This program is distributed in the hope that it will be useful, but
736+# WITHOUT ANY WARRANTY; without even the implied warranties of
737+# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
738+# PURPOSE. See the GNU General Public License for more details.
739+#
740+# You should have received a copy of the GNU General Public License along
741+# with this program. If not, see <http://www.gnu.org/licenses/>.
742+
743+ubuntu_template = """
744+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
745+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
746+
747+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
748+ <head>
749+ <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
750+ <title>Ubuntu %(distro_release)s Languages</title>
751+ <link rel="stylesheet" href="css/light.css" type="text/css" />
752+
753+ <script src="http://www.google.com/jsapi" type="text/javascript"></script>
754+ <script type="text/javascript">
755+
756+ google.load("visualization", "1", {packages:["table"]});
757+ google.setOnLoadCallback(drawTable);
758+
759+ function drawTable() {
760+ var table_data = new google.visualization.DataTable(%(excluded_json)s, 0.6);
761+
762+ var table = new google.visualization.Table(
763+ document.getElementById('table_excluded'));
764+
765+ var formatter = new google.visualization.BarFormat({
766+ min: 0,
767+ max: 100,
768+ width: 100,
769+ colorPositive: 'green'});
770+ formatter.format(table_data, 0); // Apply formatter to second column
771+
772+ table.draw(table_data, {
773+ allowHtml: true,
774+ showRowNumber: true,
775+ page: 'enable',
776+ pageSize: 100});
777+
778+ // google.visualization.events.addListener(table, 'select', function() {
779+ // var row = table.getSelection()[0].row;
780+ // alert('You selected ' + table_data.getValue(row, 0));
781+
782+ google.visualization.events.addListener(table, 'select', selectHandler);
783+ }
784+
785+ function selectHandler(e) {
786+ var row = table.getSelection()[0].row;
787+ //alert('A table row was selected');
788+ alert('A table row was selected' + table_data.getValue(row, 0));
789+ }
790+ </script>
791+
792+ <style type="text/css">
793+ #report-meta {
794+ text-align: right;
795+ font-size: small;
796+ color: #999;
797+ float: right;
798+ }
799+
800+ #report-meta p {
801+ margin: 0;
802+ }
803+
804+ table {margin-left:auto; margin-right:auto;}
805+ </style>
806+ </head>
807+
808+ <body>
809+ <div id="container">
810+ <div id="container-inner" class="container clear-block">
811+ <div id="header">
812+
813+ <h1 id="ubuntu-header">
814+ <a href="https://wiki.ubuntu.com/Translations" title="Canonical OEM Translation Statistics"></a>
815+ </h1>
816+ </div>
817+
818+ <div id="page">
819+ <div id="content">
820+ <div class="titlepage">
821+ <h2 class="title"><a id="id2820777"></a>Custom Project: %(project)s</h2>
822+ <h3>Src Pkgs in Project but not included in Translation Statistics</h3>
823+
824+ </div>
825+
826+ <div id="table_excluded"></div>
827+
828+ <div id="footer">
829+ <div id="ubuntulinks">
830+ <a href="https://wiki.ubuntu.com/Translations/Stats#UbuntuTranslationStatistics">More information on these statistics</a>
831+ &nbsp;&bull;&nbsp;
832+ Found a bug? <a href="https://bugs.launchpad.net/ubuntu-translations">Report it</a>
833+ &nbsp;&bull;&nbsp;
834+ Last update on %(gen_date)s
835+ </div>
836+ </div>
837+ </div>
838+ </div>
839+ </div>
840+ </body>
841+
842+</html>
843+"""
844
845=== added file 'common/templates/custom_src_excluded.pyc'
846Binary files common/templates/custom_src_excluded.pyc 1970-01-01 00:00:00 +0000 and common/templates/custom_src_excluded.pyc 2010-10-07 20:22:40 +0000 differ
847=== added file 'common/templates/custom_src_included.py'
848--- common/templates/custom_src_included.py 1970-01-01 00:00:00 +0000
849+++ common/templates/custom_src_included.py 2010-10-07 20:22:40 +0000
850@@ -0,0 +1,119 @@
851+#!/usr/bin/env python
852+
853+# html_report_template - Provides a template to render an HTML page after
854+# Python variable substitution
855+#
856+# Author: David Planella <david.planella@ubuntu.com>, with mods by
857+# Kyle Nitzsche <kyle.nitzsche@canonical.com>
858+#
859+# Copyright (c) 2009, 2010 Canonical Ltd.
860+#
861+# This program is free software: you can redistribute it and/or modify it
862+# under the terms of the GNU General Public License version 3, as published
863+# by the Free Software Foundation.
864+#
865+# This program is distributed in the hope that it will be useful, but
866+# WITHOUT ANY WARRANTY; without even the implied warranties of
867+# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
868+# PURPOSE. See the GNU General Public License for more details.
869+#
870+# You should have received a copy of the GNU General Public License along
871+# with this program. If not, see <http://www.gnu.org/licenses/>.
872+
873+ubuntu_template = """
874+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
875+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
876+
877+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
878+ <head>
879+ <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
880+ <title>Ubuntu %(distro_release)s Languages</title>
881+ <link rel="stylesheet" href="css/light.css" type="text/css" />
882+
883+ <script src="http://www.google.com/jsapi" type="text/javascript"></script>
884+ <script type="text/javascript">
885+
886+ google.load("visualization", "1", {packages:["table"]});
887+ google.setOnLoadCallback(drawTable);
888+
889+ function drawTable() {
890+ var table_data = new google.visualization.DataTable(%(included_json)s, 0.6);
891+
892+ var table = new google.visualization.Table(
893+ document.getElementById('table'));
894+
895+ var formatter = new google.visualization.BarFormat({
896+ min: 0,
897+ max: 100,
898+ width: 100,
899+ colorPositive: 'green'});
900+ formatter.format(table_data, 0); // Apply formatter to second column
901+
902+ table.draw(table_data, {
903+ allowHtml: true,
904+ showRowNumber: true,
905+ page: 'enable',
906+ pageSize: 100});
907+
908+ // google.visualization.events.addListener(table, 'select', function() {
909+ // var row = table.getSelection()[0].row;
910+ // alert('You selected ' + table_data.getValue(row, 0));
911+
912+ google.visualization.events.addListener(table, 'select', selectHandler);
913+ }
914+
915+ function selectHandler(e) {
916+ var row = table.getSelection()[0].row;
917+ //alert('A table row was selected');
918+ alert('A table row was selected' + table_data.getValue(row, 0));
919+ }
920+ </script>
921+
922+ <style type="text/css">
923+ #report-meta {
924+ text-align: right;
925+ font-size: small;
926+ color: #999;
927+ float: right;
928+ }
929+
930+ #report-meta p {
931+ margin: 0;
932+ }
933+
934+ table {margin-left:auto; margin-right:auto;}
935+ </style>
936+ </head>
937+
938+ <body>
939+ <div id="container">
940+ <div id="container-inner" class="container clear-block">
941+ <div id="header">
942+
943+ <h1 id="ubuntu-header">
944+ <a href="https://wiki.ubuntu.com/Translations" title="Canonical OEM Translation Statistics"></a>
945+ </h1>
946+ </div>
947+
948+ <div id="page">
949+ <div id="content">
950+ <div class="titlepage">
951+ <h2 class="title"><a id="id2820777"></a>Custom Project: %(project)s</h2>
952+ <p>The table lists src packages in the project AND in Ubunutu Language packs. The translation statistics
953+ are for these src packages only.</p>
954+ </div>
955+
956+ <div id="table"></div>
957+
958+ <div id="footer">
959+ <div id="ubuntulinks">
960+ Last update on %(gen_date)s
961+ </div>
962+ </div>
963+ </div>
964+ </div>
965+ </div>
966+ </body>
967+
968+</html>
969+"""
970
971=== added file 'common/templates/custom_src_included.pyc'
972Binary files common/templates/custom_src_included.pyc 1970-01-01 00:00:00 +0000 and common/templates/custom_src_included.pyc 2010-10-07 20:22:40 +0000 differ
973=== modified file 'common/templates/html_report_template.py'
974--- common/templates/html_report_template.py 2010-10-01 17:14:00 +0000
975+++ common/templates/html_report_template.py 2010-10-07 20:22:40 +0000
976@@ -35,18 +35,16 @@
977 google.setOnLoadCallback(drawTable);
978
979 function drawTable() {
980- var language_table_data = new google.visualization.DataTable(
981- %(languages_json)s, 0.6);
982+ var table_data = new google.visualization.DataTable(%(data_json)s, 0.6);
983
984- var language_table = new google.visualization.Table(
985- document.getElementById('stats_table'));
986+ var table = new google.visualization.Table(
987+ document.getElementById('stats_table'));
988
989 /* Format the data column containing the translation percentage
990 value: show no decimal digits */
991 var nr_formatter = new google.visualization.NumberFormat({
992 fractionDigits: 0});
993-
994- nr_formatter.format(language_table_data, 1);
995+ nr_formatter.format(table_data, 1);
996
997 /* Format the data column containing the translation percentage
998 value: show a green bar indicating the level of coverage */
999@@ -54,16 +52,18 @@
1000 min: 0,
1001 max: 100,
1002 width: 100,
1003- colorPositive: 'green'});
1004-
1005- bar_formatter.format(language_table_data, 1);
1006+ colorPositive: 'green'
1007+ });
1008+ bar_formatter.format(table_data, 1);
1009
1010 /* Draw the statistics table */
1011- language_table.draw(language_table_data, {
1012+
1013+ table.draw(table_data, {
1014 allowHtml: true,
1015 showRowNumber: true,
1016 page: 'enable',
1017 pageSize: %(languages_supported)s});
1018+
1019 }
1020
1021 </script>
1022@@ -78,7 +78,7 @@
1023 <h1 id="ubuntu-header">
1024 <a href="https://wiki.ubuntu.com/Translations" title="Ubuntu Translations"></a>
1025 </h1>
1026-
1027+
1028 <ul id="navbar">
1029 <li><a href="https://wiki.ubuntu.com/Translations/">Home</a></li>
1030 <li><a href="https://wiki.ubuntu.com/Translations/QuickStartGuide">Quickstart</a></li>
1031@@ -88,9 +88,9 @@
1032 <li><a href="https://answers.launchpad.net/ubuntu-translations">Support</a></li>
1033 </ul>
1034 </div>
1035-
1036+
1037 <!-- 2. Main content -->
1038- <div id="content">
1039+ <div id="content">
1040 <h2>Ubuntu %(distro_release)s Translations</h2>
1041 <p id="intro-message">
1042 <!--
1043
1044=== modified file 'common/utils.py'
1045--- common/utils.py 2010-09-28 09:17:47 +0000
1046+++ common/utils.py 2010-10-07 20:22:40 +0000
1047@@ -55,6 +55,17 @@
1048
1049 return settings
1050
1051+def get_basename(options, settings):
1052+ if options.custom:
1053+ if options.custom_name is None:
1054+ basename = 'custom-{0}-{1}'.format(settings['distro_id'],settings['distro_release'])
1055+ else:
1056+ basename = '{0}'.format(options.custom_name)
1057+ else:
1058+ basename = '{0}-{1}'.format(settings['distro_id'],settings['distro_release'])
1059+
1060+ return basename
1061+
1062 def get_working_pot_templates(settings):
1063 templates = os.path.join(os.getcwd(), 'data', settings['distro_codename'] + "-templates.txt")
1064 if not os.path.exists(templates):
1065@@ -147,7 +158,7 @@
1066 statusRegexp = r'[0-9]+ {0}'.format(statusStr)
1067 if (re.findall(statusRegexp, item)):
1068 statusDict[statusStr] = re.findall(r'[0-9]+', item)[0]
1069-
1070+
1071 # msgfmt gives us only status if the count is non-zero. Fill the missing statuses.
1072 for statusStr in statusStrings:
1073 if not statusStr in statusDict:
1074@@ -177,4 +188,4 @@
1075 # https://launchpadlibrarian.net/56015550/openoffice.org_3.2.1-6ubuntu2_i386_translations.tar.gz
1076 ooo_pot_mapping = get_ooo_pot_mapping('../data/oo-o-pots-mapping.txt')
1077 get_ooo_raw_data('../data/source/debian/l10n/po', ooo_pot_mapping)
1078- sys.exit(0)
1079\ No newline at end of file
1080+ sys.exit(0)
1081
1082=== removed file 'config/blacklist.conf'
1083--- config/blacklist.conf 2010-09-27 16:41:27 +0000
1084+++ config/blacklist.conf 1970-01-01 00:00:00 +0000
1085@@ -1,423 +0,0 @@
1086-acl | acl
1087-adduser | adduser
1088-alsa-utils | alsa-utils
1089-apparmor | subdomain-parser
1090-aptitude | aptitude
1091-aspell | aspell
1092-aspell | filter
1093-attr | attr
1094-base-passwd | base-passwd
1095-bash | bash
1096-binutils | bfd
1097-binutils | binutils
1098-binutils | gas
1099-binutils | gold
1100-binutils | gprof
1101-binutils | ld
1102-binutils | opcodes
1103-byobu | byobu
1104-clutter-1.0 | clutter-1.0
1105-command-not-found | command-not-found
1106-coreutils | coreutils
1107-cpio | cpio
1108-cryptsetup | cryptsetup
1109-cryptsetup | cryptsetup-luks
1110-cups | cups
1111-debconf | debconf
1112-debianutils | debianutils
1113-devmapper | device-mapper
1114-diffutils | diffutils
1115-dnsmasq | dnsmasq
1116-dpkg | dpkg
1117-dpkg | dpkg-dev
1118-dpkg | dselect
1119-e2fsprogs | e2fsprogs
1120-eglibc | libc
1121-eject | eject
1122-elfutils | elfutils
1123-findutils | findutils
1124-gawk | gawk
1125-gcc-4.4 | cpplib
1126-gcc-4.4 | gcc
1127-gcc-4.4 | libstdc++
1128-gcc-4.4 | libstdcpp
1129-gconf | gconf2
1130-gconf-editor | gconf-editor
1131-gdb | gdb
1132-gdb | bfd
1133-gettext | gettext-runtime
1134-gettext | gettext-tools
1135-gksu | gksu
1136-gnupg | gnupg
1137-gnutls26 | gnutls
1138-gnutls26 | libgnutls
1139-grep | grep
1140-gst-plugins-base0.10 | gst-plugins-base-0.10
1141-gst-plugins-good0.10 | gst-plugins-good-0.10
1142-gstreamer0.10 | gstreamer-0.10
1143-gvfs | gvfs
1144-hal | hal
1145-hunspell | hunspell
1146-iso-codes | iso-15924
1147-iso-codes | iso-3166
1148-iso-codes | iso-3166-2
1149-iso-codes | iso-4217
1150-iso-codes | iso-639
1151-iso-codes | iso-639-3
1152-kbd | kbd
1153-kerneloops | kerneloops
1154-lftp | lftp
1155-libgpg-error | libgpg-error
1156-libidn | libidn
1157-libparse-debianchangelog-perl | parse-debianchangelog
1158-libparse-debianchangelog-perl | parse-debianchangelog-pod
1159-libvisual | libvisual-0.4
1160-libvisual-plugins | libvisual-plugins
1161-m17n-db | m17n-db
1162-make-dfsg | make
1163-man-db | man-db
1164-man-db | man-db-gnulib
1165-mlocate | mlocate
1166-mono | mcs
1167-neon27 | neon
1168-net-tools | net-tools
1169-pam | linux-pam
1170-parted | parted
1171-popt | popt
1172-postgresql-8.4 | ecpg-8.4
1173-postgresql-8.4 | ecpglib-8.4
1174-postgresql-8.4 | initdb-8.4
1175-postgresql-8.4 | libpq5-8.4
1176-postgresql-8.4 | pg-config-8.4
1177-postgresql-8.4 | pg-controldata-8.4
1178-postgresql-8.4 | pg-ctl-8.4
1179-postgresql-8.4 | pg-dump-8.4
1180-postgresql-8.4 | pg-resetxlog-8.4
1181-postgresql-8.4 | pgscripts-8.4
1182-postgresql-8.4 | plperl-8.4
1183-postgresql-8.4 | plpgsql-8.4
1184-postgresql-8.4 | plpython-8.4
1185-postgresql-8.4 | pltcl-8.4
1186-postgresql-8.4 | postgres-8.4
1187-postgresql-8.4 | psql-8.4
1188-pppconfig | pppconfig
1189-pppoeconf | pppoeconf
1190-psmisc | psmisc
1191-sane-backends | sane-backends
1192-sed | sed
1193-shadow | shadow
1194-tar | tar
1195-tasksel | debian-tasks
1196-tasksel | tasksel
1197-texinfo | texinfo
1198-texlive-bin | freetype
1199-texlive-bin | texinfo
1200-ubiquity-slideshow-ubuntu | slideshow-xubuntu
1201-ubuntu-docs | ubuntu-docs-serverguide
1202-udisks | udisks
1203-ufw | ufw
1204-unattended-upgrades | unattended-upgrades
1205-upower | UPower
1206-ureadahead | ureadahead
1207-util-linux | util-linux-ng
1208-vim | vim
1209-vte | vte
1210-w3m | w3m
1211-wget | wget
1212-whois | whois
1213-xfsprogs | xfsprogs
1214-xkeyboard-config | xkeyboard-config
1215-xz-utils | xz
1216-zope3 | zope
1217-compiz | compiz
1218-compiz-fusion-plugins-main | compiz-fusion-plugins-main
1219-exiv2 | exiv2
1220-gnome-user-docs | gnome-user-docs-accessibility-guide
1221-gnome-user-docs | gnome-user-docs-user-guide
1222-gutenprint | gutenprint
1223-libgphoto2 | libgphoto2-2
1224-libgphoto2 | libgphoto2-port-0
1225-software-center | software-center-doc
1226-xscreensaver | xscreensaver
1227-openoffice.org | accessibility-helper
1228-openoffice.org | avmedia-framework
1229-openoffice.org | avmedia-viewer
1230-openoffice.org | basctl-basicide
1231-openoffice.org | basctl-dlged
1232-openoffice.org | basic-app
1233-openoffice.org | basic-classes
1234-openoffice.org | basic-sbx
1235-openoffice.org | binfilter-src
1236-openoffice.org | chart2-dialogs
1237-openoffice.org | connectivity-adabas
1238-openoffice.org | connectivity-flat
1239-openoffice.org | connectivity-odbc
1240-openoffice.org | connectivity-postgresql
1241-openoffice.org | connectivity-resource
1242-openoffice.org | crashrep-all
1243-openoffice.org | dbaccess-adabas
1244-openoffice.org | dbaccess-app
1245-openoffice.org | dbaccess-browser
1246-openoffice.org | dbaccess-control
1247-openoffice.org | dbaccess-core
1248-openoffice.org | dbaccess-dlg
1249-openoffice.org | dbaccess-inc
1250-openoffice.org | dbaccess-macromigration
1251-openoffice.org | dbaccess-misc
1252-openoffice.org | dbaccess-querydesign
1253-openoffice.org | dbaccess-relationdesign
1254-openoffice.org | dbaccess-sdbtools
1255-openoffice.org | dbaccess-tabledesign
1256-openoffice.org | dbaccess-uno
1257-openoffice.org | desktop-app
1258-openoffice.org | desktop-component
1259-openoffice.org | desktop-configuration
1260-openoffice.org | desktop-deployment-help
1261-openoffice.org | desktop-gui
1262-openoffice.org | desktop-manager
1263-openoffice.org | desktop-migration
1264-openoffice.org | desktop-misc
1265-openoffice.org | desktop-package
1266-openoffice.org | desktop-registry
1267-openoffice.org | desktop-script
1268-openoffice.org | desktop-setup
1269-openoffice.org | desktop-sfwk
1270-openoffice.org | desktop-unopkg
1271-openoffice.org | extensions-abpilot
1272-openoffice.org | extensions-bibliography
1273-openoffice.org | extensions-check
1274-openoffice.org | extensions-dbpilots
1275-openoffice.org | extensions-preload
1276-openoffice.org | extensions-propctrlr
1277-openoffice.org | extensions-scanner
1278-openoffice.org | filter-filters
1279-openoffice.org | filter-flash
1280-openoffice.org | filter-internalgraphicfilters
1281-openoffice.org | filter-pdf
1282-openoffice.org | filter-t602
1283-openoffice.org | filter-types
1284-openoffice.org | filter-xsltdialog
1285-openoffice.org | forms-resource
1286-openoffice.org | formula-dlg
1287-openoffice.org | formula-resource
1288-openoffice.org | fpicker-office
1289-openoffice.org | framework-classes
1290-openoffice.org | framework-services
1291-openoffice.org | goodies-egif
1292-openoffice.org | goodies-eos2met
1293-openoffice.org | goodies-epbm
1294-openoffice.org | goodies-epgm
1295-openoffice.org | goodies-epict
1296-openoffice.org | goodies-eppm
1297-openoffice.org | goodies-eps
1298-openoffice.org | helpcontent2-autokorr-shared
1299-openoffice.org | helpcontent2-autopi-shared
1300-openoffice.org | helpcontent2-database
1301-openoffice.org | helpcontent2-guide-sbasic
1302-openoffice.org | helpcontent2-guide-scalc
1303-openoffice.org | helpcontent2-guide-sdraw
1304-openoffice.org | helpcontent2-guide-shared
1305-openoffice.org | helpcontent2-guide-simpress
1306-openoffice.org | helpcontent2-guide-smath
1307-openoffice.org | helpcontent2-guide-swriter
1308-openoffice.org | helpcontent2-optionen-shared
1309-openoffice.org | helpcontent2-sbasic-01
1310-openoffice.org | helpcontent2-sbasic-02
1311-openoffice.org | helpcontent2-sbasic-shared
1312-openoffice.org | helpcontent2-scalc
1313-openoffice.org | helpcontent2-scalc-00
1314-openoffice.org | helpcontent2-scalc-01
1315-openoffice.org | helpcontent2-scalc-02
1316-openoffice.org | helpcontent2-scalc-04
1317-openoffice.org | helpcontent2-scalc-05
1318-openoffice.org | helpcontent2-schart
1319-openoffice.org | helpcontent2-schart-00
1320-openoffice.org | helpcontent2-schart-01
1321-openoffice.org | helpcontent2-schart-02
1322-openoffice.org | helpcontent2-schart-04
1323-openoffice.org | helpcontent2-sdraw
1324-openoffice.org | helpcontent2-sdraw-00
1325-openoffice.org | helpcontent2-sdraw-01
1326-openoffice.org | helpcontent2-sdraw-04
1327-openoffice.org | helpcontent2-shared
1328-openoffice.org | helpcontent2-shared-00
1329-openoffice.org | helpcontent2-shared-01
1330-openoffice.org | helpcontent2-shared-02
1331-openoffice.org | helpcontent2-shared-04
1332-openoffice.org | helpcontent2-shared-05
1333-openoffice.org | helpcontent2-shared-07
1334-openoffice.org | helpcontent2-simpress
1335-openoffice.org | helpcontent2-simpress-00
1336-openoffice.org | helpcontent2-simpress-01
1337-openoffice.org | helpcontent2-simpress-02
1338-openoffice.org | helpcontent2-simpress-04
1339-openoffice.org | helpcontent2-smath
1340-openoffice.org | helpcontent2-smath-00
1341-openoffice.org | helpcontent2-smath-01
1342-openoffice.org | helpcontent2-smath-02
1343-openoffice.org | helpcontent2-smath-04
1344-openoffice.org | helpcontent2-swriter
1345-openoffice.org | helpcontent2-swriter-00
1346-openoffice.org | helpcontent2-swriter-01
1347-openoffice.org | helpcontent2-swriter-02
1348-openoffice.org | helpcontent2-swriter-04
1349-openoffice.org | instsetoonative-msilanguages
1350-openoffice.org | instsetoonative-office
1351-openoffice.org | javainstaller2-localization
1352-openoffice.org | mysqlc-dataaccess
1353-openoffice.org | odk-complextoolbarcontrols
1354-openoffice.org | odk-examples-asciifilter
1355-openoffice.org | odk-examples-developersguide-dialogwithhelp
1356-openoffice.org | odk-examples-embeddedobject
1357-openoffice.org | odk-examples-flatxmlfilterdetection
1358-openoffice.org | odk-examples-protocolhandleraddon-cpp
1359-openoffice.org | odk-examples-protocolhandleraddon-java
1360-openoffice.org | odk-inspector
1361-openoffice.org | officecfg-office
1362-openoffice.org | officecfg-openoffice
1363-openoffice.org | officecfg-ui
1364-openoffice.org | ooo-build
1365-openoffice.org | padmin-source
1366-openoffice.org | readlicense-oo-readme
1367-openoffice.org | reportbuilder-office
1368-openoffice.org | reportbuilder-openoffice
1369-openoffice.org | reportbuilder-typedetection
1370-openoffice.org | reportbuilder-ui
1371-openoffice.org | reportdesign-dlg
1372-openoffice.org | reportdesign-inspection
1373-openoffice.org | reportdesign-registry-office
1374-openoffice.org | reportdesign-report
1375-openoffice.org | reportdesign-resource
1376-openoffice.org | sc-core
1377-openoffice.org | sc-dbgui
1378-openoffice.org | sc-docshell
1379-openoffice.org | sc-drawfunc
1380-openoffice.org | sc-formdlg
1381-openoffice.org | sc-miscdlgs
1382-openoffice.org | sc-navipi
1383-openoffice.org | sc-pagedlg
1384-openoffice.org | sc-styleui
1385-openoffice.org | sc-ui
1386-openoffice.org | sc-ui-cctrl
1387-openoffice.org | scaddins-analysis
1388-openoffice.org | scaddins-datefunc
1389-openoffice.org | sccomp-solver
1390-openoffice.org | scp2-activex
1391-openoffice.org | scp2-base
1392-openoffice.org | scp2-binfilter
1393-openoffice.org | scp2-calc
1394-openoffice.org | scp2-draw
1395-openoffice.org | scp2-gnome
1396-openoffice.org | scp2-graphicfilter
1397-openoffice.org | scp2-impress
1398-openoffice.org | scp2-javafilter
1399-openoffice.org | scp2-kde
1400-openoffice.org | scp2-lingu
1401-openoffice.org | scp2-math
1402-openoffice.org | scp2-onlineupdate
1403-openoffice.org | scp2-ooo
1404-openoffice.org | scp2-python
1405-openoffice.org | scp2-quickstart
1406-openoffice.org | scp2-sdkoo
1407-openoffice.org | scp2-testtool
1408-openoffice.org | scp2-winexplorerext
1409-openoffice.org | scp2-writer
1410-openoffice.org | scp2-xsltfilter
1411-openoffice.org | scsolver-ext
1412-openoffice.org | scsolver-ui
1413-openoffice.org | sd-accessibility
1414-openoffice.org | sd-animations
1415-openoffice.org | sd-app
1416-openoffice.org | sd-core
1417-openoffice.org | sd-dlg
1418-openoffice.org | sd-html
1419-openoffice.org | sd-notes
1420-openoffice.org | sd-slideshow
1421-openoffice.org | sd-table
1422-openoffice.org | sdext-extension
1423-openoffice.org | sdext-minimizer-extension
1424-openoffice.org | sdext-minimizer-office
1425-openoffice.org | sdext-minimizer-ui
1426-openoffice.org | sfx2-appl
1427-openoffice.org | sfx2-bastyp
1428-openoffice.org | sfx2-config
1429-openoffice.org | sfx2-dialog
1430-openoffice.org | sfx2-doc
1431-openoffice.org | sfx2-menu
1432-openoffice.org | sfx2-view
1433-openoffice.org | shell-res
1434-openoffice.org | starmath-source
1435-openoffice.org | svtools-contnr
1436-openoffice.org | svtools-control
1437-openoffice.org | svtools-dialogs
1438-openoffice.org | svtools-filter
1439-openoffice.org | svtools-items1
1440-openoffice.org | svtools-java
1441-openoffice.org | svtools-misc
1442-openoffice.org | svtools-misc1
1443-openoffice.org | svtools-plugapp
1444-openoffice.org | svtools-productregistration
1445-openoffice.org | svtools-uno
1446-openoffice.org | svtools-unodialog
1447-openoffice.org | svx-accessibility
1448-openoffice.org | svx-dialog
1449-openoffice.org | svx-editeng
1450-openoffice.org | svx-engine3d
1451-openoffice.org | svx-fmcomp
1452-openoffice.org | svx-form
1453-openoffice.org | svx-gallery2
1454-openoffice.org | svx-inc
1455-openoffice.org | svx-intro
1456-openoffice.org | svx-items
1457-openoffice.org | svx-options
1458-openoffice.org | svx-outliner
1459-openoffice.org | svx-src
1460-openoffice.org | svx-stbctrls
1461-openoffice.org | svx-svdraw
1462-openoffice.org | svx-svxlink
1463-openoffice.org | svx-table
1464-openoffice.org | svx-tbxctrls
1465-openoffice.org | svx-textconversiondlgs
1466-openoffice.org | svx-toolbars
1467-openoffice.org | sw-app
1468-openoffice.org | sw-chrdlg
1469-openoffice.org | sw-config
1470-openoffice.org | sw-dbui
1471-openoffice.org | sw-dialog
1472-openoffice.org | sw-dochdl
1473-openoffice.org | sw-docvw
1474-openoffice.org | sw-envelp
1475-openoffice.org | sw-fldui
1476-openoffice.org | sw-fmtui
1477-openoffice.org | sw-frmdlg
1478-openoffice.org | sw-globdoc
1479-openoffice.org | sw-inc
1480-openoffice.org | sw-index
1481-openoffice.org | sw-lingu
1482-openoffice.org | sw-misc
1483-openoffice.org | sw-ribbar
1484-openoffice.org | sw-sdi
1485-openoffice.org | sw-shells
1486-openoffice.org | sw-smartmenu
1487-openoffice.org | sw-table
1488-openoffice.org | sw-uiview
1489-openoffice.org | sw-undo
1490-openoffice.org | sw-unocore
1491-openoffice.org | sw-utlui
1492-openoffice.org | sw-web
1493-openoffice.org | sw-wrtsh
1494-openoffice.org | swext-custom
1495-openoffice.org | swext-help
1496-openoffice.org | swext-office
1497-openoffice.org | sysui-share
1498-openoffice.org | toolkit-workben-layout
1499-openoffice.org | ucbhelper-ucb-explorer
1500-openoffice.org | uui-source
1501-openoffice.org | vcl-src
1502-openoffice.org | wizards-euro
1503-openoffice.org | wizards-formwizard
1504-openoffice.org | wizards-importwizard
1505-openoffice.org | wizards-schedule
1506-openoffice.org | wizards-template
1507-openoffice.org | xmlsecurity-component
1508-openoffice.org | xmlsecurity-dialogs
1509
1510=== added file 'config/blacklist.lucid.conf'
1511--- config/blacklist.lucid.conf 1970-01-01 00:00:00 +0000
1512+++ config/blacklist.lucid.conf 2010-10-07 20:22:40 +0000
1513@@ -0,0 +1,141 @@
1514+acl | acl
1515+adduser | adduser
1516+alsa-utils | alsa-utils
1517+apparmor | subdomain-parser
1518+aptitude | aptitude
1519+aspell | aspell
1520+aspell | filter
1521+attr | attr
1522+base-passwd | base-passwd
1523+bash | bash
1524+binutils | bfd
1525+binutils | binutils
1526+binutils | gas
1527+binutils | gold
1528+binutils | gprof
1529+binutils | ld
1530+binutils | opcodes
1531+byobu | byobu
1532+clutter-1.0 | clutter-1.0
1533+command-not-found | command-not-found
1534+coreutils | coreutils
1535+cpio | cpio
1536+cryptsetup | cryptsetup
1537+cryptsetup | cryptsetup-luks
1538+cups | cups
1539+debconf | debconf
1540+debianutils | debianutils
1541+devmapper | device-mapper
1542+diffutils | diffutils
1543+dnsmasq | dnsmasq
1544+dpkg | dpkg
1545+dpkg | dpkg-dev
1546+dpkg | dselect
1547+e2fsprogs | e2fsprogs
1548+eglibc | libc
1549+eject | eject
1550+elfutils | elfutils
1551+findutils | findutils
1552+gawk | gawk
1553+gcc-4.4 | cpplib
1554+gcc-4.4 | gcc
1555+gcc-4.4 | libstdc++
1556+gcc-4.4 | libstdcpp
1557+gconf | gconf2
1558+gconf-editor | gconf-editor
1559+gdb | gdb
1560+gdb | bfd
1561+gettext | gettext-runtime
1562+gettext | gettext-tools
1563+gksu | gksu
1564+gnupg | gnupg
1565+gnutls26 | gnutls
1566+gnutls26 | libgnutls
1567+grep | grep
1568+gst-plugins-base0.10 | gst-plugins-base-0.10
1569+gst-plugins-good0.10 | gst-plugins-good-0.10
1570+gstreamer0.10 | gstreamer-0.10
1571+gvfs | gvfs
1572+hal | hal
1573+hunspell | hunspell
1574+iso-codes | iso-15924
1575+iso-codes | iso-3166
1576+iso-codes | iso-3166-2
1577+iso-codes | iso-4217
1578+iso-codes | iso-639
1579+iso-codes | iso-639-3
1580+kbd | kbd
1581+kerneloops | kerneloops
1582+lftp | lftp
1583+libgpg-error | libgpg-error
1584+libidn | libidn
1585+libparse-debianchangelog-perl | parse-debianchangelog
1586+libparse-debianchangelog-perl | parse-debianchangelog-pod
1587+libvisual | libvisual-0.4
1588+libvisual-plugins | libvisual-plugins
1589+m17n-db | m17n-db
1590+make-dfsg | make
1591+man-db | man-db
1592+man-db | man-db-gnulib
1593+mlocate | mlocate
1594+mono | mcs
1595+neon27 | neon
1596+net-tools | net-tools
1597+pam | linux-pam
1598+parted | parted
1599+popt | popt
1600+postgresql-8.4 | ecpg-8.4
1601+postgresql-8.4 | ecpglib-8.4
1602+postgresql-8.4 | initdb-8.4
1603+postgresql-8.4 | libpq5-8.4
1604+postgresql-8.4 | pg-config-8.4
1605+postgresql-8.4 | pg-controldata-8.4
1606+postgresql-8.4 | pg-ctl-8.4
1607+postgresql-8.4 | pg-dump-8.4
1608+postgresql-8.4 | pg-resetxlog-8.4
1609+postgresql-8.4 | pgscripts-8.4
1610+postgresql-8.4 | plperl-8.4
1611+postgresql-8.4 | plpgsql-8.4
1612+postgresql-8.4 | plpython-8.4
1613+postgresql-8.4 | pltcl-8.4
1614+postgresql-8.4 | postgres-8.4
1615+postgresql-8.4 | psql-8.4
1616+pppconfig | pppconfig
1617+pppoeconf | pppoeconf
1618+psmisc | psmisc
1619+sane-backends | sane-backends
1620+sed | sed
1621+shadow | shadow
1622+tar | tar
1623+tasksel | debian-tasks
1624+tasksel | tasksel
1625+texinfo | texinfo
1626+texlive-bin | freetype
1627+texlive-bin | texinfo
1628+ubiquity-slideshow-ubuntu | slideshow-xubuntu
1629+ubuntu-docs | ubuntu-docs-serverguide
1630+udisks | udisks
1631+ufw | ufw
1632+unattended-upgrades | unattended-upgrades
1633+upower | UPower
1634+ureadahead | ureadahead
1635+util-linux | util-linux-ng
1636+vim | vim
1637+vte | vte
1638+w3m | w3m
1639+wget | wget
1640+whois | whois
1641+xfsprogs | xfsprogs
1642+xkeyboard-config | xkeyboard-config
1643+xz-utils | xz
1644+zope3 | zope
1645+compiz | compiz
1646+compiz-fusion-plugins-main | compiz-fusion-plugins-main
1647+exiv2 | exiv2
1648+gnome-user-docs | gnome-user-docs-accessibility-guide
1649+gnome-user-docs | gnome-user-docs-user-guide
1650+gutenprint | gutenprint
1651+libgphoto2 | libgphoto2-2
1652+libgphoto2 | libgphoto2-port-0
1653+software-center | software-center-doc
1654+xscreensaver | xscreensaver
1655
1656=== added file 'config/blacklist.maverick.conf'
1657--- config/blacklist.maverick.conf 1970-01-01 00:00:00 +0000
1658+++ config/blacklist.maverick.conf 2010-10-07 20:22:40 +0000
1659@@ -0,0 +1,423 @@
1660+acl | acl
1661+adduser | adduser
1662+alsa-utils | alsa-utils
1663+apparmor | subdomain-parser
1664+aptitude | aptitude
1665+aspell | aspell
1666+aspell | filter
1667+attr | attr
1668+base-passwd | base-passwd
1669+bash | bash
1670+binutils | bfd
1671+binutils | binutils
1672+binutils | gas
1673+binutils | gold
1674+binutils | gprof
1675+binutils | ld
1676+binutils | opcodes
1677+byobu | byobu
1678+clutter-1.0 | clutter-1.0
1679+command-not-found | command-not-found
1680+coreutils | coreutils
1681+cpio | cpio
1682+cryptsetup | cryptsetup
1683+cryptsetup | cryptsetup-luks
1684+cups | cups
1685+debconf | debconf
1686+debianutils | debianutils
1687+devmapper | device-mapper
1688+diffutils | diffutils
1689+dnsmasq | dnsmasq
1690+dpkg | dpkg
1691+dpkg | dpkg-dev
1692+dpkg | dselect
1693+e2fsprogs | e2fsprogs
1694+eglibc | libc
1695+eject | eject
1696+elfutils | elfutils
1697+findutils | findutils
1698+gawk | gawk
1699+gcc-4.4 | cpplib
1700+gcc-4.4 | gcc
1701+gcc-4.4 | libstdc++
1702+gcc-4.4 | libstdcpp
1703+gconf | gconf2
1704+gconf-editor | gconf-editor
1705+gdb | gdb
1706+gdb | bfd
1707+gettext | gettext-runtime
1708+gettext | gettext-tools
1709+gksu | gksu
1710+gnupg | gnupg
1711+gnutls26 | gnutls
1712+gnutls26 | libgnutls
1713+grep | grep
1714+gst-plugins-base0.10 | gst-plugins-base-0.10
1715+gst-plugins-good0.10 | gst-plugins-good-0.10
1716+gstreamer0.10 | gstreamer-0.10
1717+gvfs | gvfs
1718+hal | hal
1719+hunspell | hunspell
1720+iso-codes | iso-15924
1721+iso-codes | iso-3166
1722+iso-codes | iso-3166-2
1723+iso-codes | iso-4217
1724+iso-codes | iso-639
1725+iso-codes | iso-639-3
1726+kbd | kbd
1727+kerneloops | kerneloops
1728+lftp | lftp
1729+libgpg-error | libgpg-error
1730+libidn | libidn
1731+libparse-debianchangelog-perl | parse-debianchangelog
1732+libparse-debianchangelog-perl | parse-debianchangelog-pod
1733+libvisual | libvisual-0.4
1734+libvisual-plugins | libvisual-plugins
1735+m17n-db | m17n-db
1736+make-dfsg | make
1737+man-db | man-db
1738+man-db | man-db-gnulib
1739+mlocate | mlocate
1740+mono | mcs
1741+neon27 | neon
1742+net-tools | net-tools
1743+pam | linux-pam
1744+parted | parted
1745+popt | popt
1746+postgresql-8.4 | ecpg-8.4
1747+postgresql-8.4 | ecpglib-8.4
1748+postgresql-8.4 | initdb-8.4
1749+postgresql-8.4 | libpq5-8.4
1750+postgresql-8.4 | pg-config-8.4
1751+postgresql-8.4 | pg-controldata-8.4
1752+postgresql-8.4 | pg-ctl-8.4
1753+postgresql-8.4 | pg-dump-8.4
1754+postgresql-8.4 | pg-resetxlog-8.4
1755+postgresql-8.4 | pgscripts-8.4
1756+postgresql-8.4 | plperl-8.4
1757+postgresql-8.4 | plpgsql-8.4
1758+postgresql-8.4 | plpython-8.4
1759+postgresql-8.4 | pltcl-8.4
1760+postgresql-8.4 | postgres-8.4
1761+postgresql-8.4 | psql-8.4
1762+pppconfig | pppconfig
1763+pppoeconf | pppoeconf
1764+psmisc | psmisc
1765+sane-backends | sane-backends
1766+sed | sed
1767+shadow | shadow
1768+tar | tar
1769+tasksel | debian-tasks
1770+tasksel | tasksel
1771+texinfo | texinfo
1772+texlive-bin | freetype
1773+texlive-bin | texinfo
1774+ubiquity-slideshow-ubuntu | slideshow-xubuntu
1775+ubuntu-docs | ubuntu-docs-serverguide
1776+udisks | udisks
1777+ufw | ufw
1778+unattended-upgrades | unattended-upgrades
1779+upower | UPower
1780+ureadahead | ureadahead
1781+util-linux | util-linux-ng
1782+vim | vim
1783+vte | vte
1784+w3m | w3m
1785+wget | wget
1786+whois | whois
1787+xfsprogs | xfsprogs
1788+xkeyboard-config | xkeyboard-config
1789+xz-utils | xz
1790+zope3 | zope
1791+compiz | compiz
1792+compiz-fusion-plugins-main | compiz-fusion-plugins-main
1793+exiv2 | exiv2
1794+gnome-user-docs | gnome-user-docs-accessibility-guide
1795+gnome-user-docs | gnome-user-docs-user-guide
1796+gutenprint | gutenprint
1797+libgphoto2 | libgphoto2-2
1798+libgphoto2 | libgphoto2-port-0
1799+software-center | software-center-doc
1800+xscreensaver | xscreensaver
1801+openoffice.org | accessibility-helper
1802+openoffice.org | avmedia-framework
1803+openoffice.org | avmedia-viewer
1804+openoffice.org | basctl-basicide
1805+openoffice.org | basctl-dlged
1806+openoffice.org | basic-app
1807+openoffice.org | basic-classes
1808+openoffice.org | basic-sbx
1809+openoffice.org | binfilter-src
1810+openoffice.org | chart2-dialogs
1811+openoffice.org | connectivity-adabas
1812+openoffice.org | connectivity-flat
1813+openoffice.org | connectivity-odbc
1814+openoffice.org | connectivity-postgresql
1815+openoffice.org | connectivity-resource
1816+openoffice.org | crashrep-all
1817+openoffice.org | dbaccess-adabas
1818+openoffice.org | dbaccess-app
1819+openoffice.org | dbaccess-browser
1820+openoffice.org | dbaccess-control
1821+openoffice.org | dbaccess-core
1822+openoffice.org | dbaccess-dlg
1823+openoffice.org | dbaccess-inc
1824+openoffice.org | dbaccess-macromigration
1825+openoffice.org | dbaccess-misc
1826+openoffice.org | dbaccess-querydesign
1827+openoffice.org | dbaccess-relationdesign
1828+openoffice.org | dbaccess-sdbtools
1829+openoffice.org | dbaccess-tabledesign
1830+openoffice.org | dbaccess-uno
1831+openoffice.org | desktop-app
1832+openoffice.org | desktop-component
1833+openoffice.org | desktop-configuration
1834+openoffice.org | desktop-deployment-help
1835+openoffice.org | desktop-gui
1836+openoffice.org | desktop-manager
1837+openoffice.org | desktop-migration
1838+openoffice.org | desktop-misc
1839+openoffice.org | desktop-package
1840+openoffice.org | desktop-registry
1841+openoffice.org | desktop-script
1842+openoffice.org | desktop-setup
1843+openoffice.org | desktop-sfwk
1844+openoffice.org | desktop-unopkg
1845+openoffice.org | extensions-abpilot
1846+openoffice.org | extensions-bibliography
1847+openoffice.org | extensions-check
1848+openoffice.org | extensions-dbpilots
1849+openoffice.org | extensions-preload
1850+openoffice.org | extensions-propctrlr
1851+openoffice.org | extensions-scanner
1852+openoffice.org | filter-filters
1853+openoffice.org | filter-flash
1854+openoffice.org | filter-internalgraphicfilters
1855+openoffice.org | filter-pdf
1856+openoffice.org | filter-t602
1857+openoffice.org | filter-types
1858+openoffice.org | filter-xsltdialog
1859+openoffice.org | forms-resource
1860+openoffice.org | formula-dlg
1861+openoffice.org | formula-resource
1862+openoffice.org | fpicker-office
1863+openoffice.org | framework-classes
1864+openoffice.org | framework-services
1865+openoffice.org | goodies-egif
1866+openoffice.org | goodies-eos2met
1867+openoffice.org | goodies-epbm
1868+openoffice.org | goodies-epgm
1869+openoffice.org | goodies-epict
1870+openoffice.org | goodies-eppm
1871+openoffice.org | goodies-eps
1872+openoffice.org | helpcontent2-autokorr-shared
1873+openoffice.org | helpcontent2-autopi-shared
1874+openoffice.org | helpcontent2-database
1875+openoffice.org | helpcontent2-guide-sbasic
1876+openoffice.org | helpcontent2-guide-scalc
1877+openoffice.org | helpcontent2-guide-sdraw
1878+openoffice.org | helpcontent2-guide-shared
1879+openoffice.org | helpcontent2-guide-simpress
1880+openoffice.org | helpcontent2-guide-smath
1881+openoffice.org | helpcontent2-guide-swriter
1882+openoffice.org | helpcontent2-optionen-shared
1883+openoffice.org | helpcontent2-sbasic-01
1884+openoffice.org | helpcontent2-sbasic-02
1885+openoffice.org | helpcontent2-sbasic-shared
1886+openoffice.org | helpcontent2-scalc
1887+openoffice.org | helpcontent2-scalc-00
1888+openoffice.org | helpcontent2-scalc-01
1889+openoffice.org | helpcontent2-scalc-02
1890+openoffice.org | helpcontent2-scalc-04
1891+openoffice.org | helpcontent2-scalc-05
1892+openoffice.org | helpcontent2-schart
1893+openoffice.org | helpcontent2-schart-00
1894+openoffice.org | helpcontent2-schart-01
1895+openoffice.org | helpcontent2-schart-02
1896+openoffice.org | helpcontent2-schart-04
1897+openoffice.org | helpcontent2-sdraw
1898+openoffice.org | helpcontent2-sdraw-00
1899+openoffice.org | helpcontent2-sdraw-01
1900+openoffice.org | helpcontent2-sdraw-04
1901+openoffice.org | helpcontent2-shared
1902+openoffice.org | helpcontent2-shared-00
1903+openoffice.org | helpcontent2-shared-01
1904+openoffice.org | helpcontent2-shared-02
1905+openoffice.org | helpcontent2-shared-04
1906+openoffice.org | helpcontent2-shared-05
1907+openoffice.org | helpcontent2-shared-07
1908+openoffice.org | helpcontent2-simpress
1909+openoffice.org | helpcontent2-simpress-00
1910+openoffice.org | helpcontent2-simpress-01
1911+openoffice.org | helpcontent2-simpress-02
1912+openoffice.org | helpcontent2-simpress-04
1913+openoffice.org | helpcontent2-smath
1914+openoffice.org | helpcontent2-smath-00
1915+openoffice.org | helpcontent2-smath-01
1916+openoffice.org | helpcontent2-smath-02
1917+openoffice.org | helpcontent2-smath-04
1918+openoffice.org | helpcontent2-swriter
1919+openoffice.org | helpcontent2-swriter-00
1920+openoffice.org | helpcontent2-swriter-01
1921+openoffice.org | helpcontent2-swriter-02
1922+openoffice.org | helpcontent2-swriter-04
1923+openoffice.org | instsetoonative-msilanguages
1924+openoffice.org | instsetoonative-office
1925+openoffice.org | javainstaller2-localization
1926+openoffice.org | mysqlc-dataaccess
1927+openoffice.org | odk-complextoolbarcontrols
1928+openoffice.org | odk-examples-asciifilter
1929+openoffice.org | odk-examples-developersguide-dialogwithhelp
1930+openoffice.org | odk-examples-embeddedobject
1931+openoffice.org | odk-examples-flatxmlfilterdetection
1932+openoffice.org | odk-examples-protocolhandleraddon-cpp
1933+openoffice.org | odk-examples-protocolhandleraddon-java
1934+openoffice.org | odk-inspector
1935+openoffice.org | officecfg-office
1936+openoffice.org | officecfg-openoffice
1937+openoffice.org | officecfg-ui
1938+openoffice.org | ooo-build
1939+openoffice.org | padmin-source
1940+openoffice.org | readlicense-oo-readme
1941+openoffice.org | reportbuilder-office
1942+openoffice.org | reportbuilder-openoffice
1943+openoffice.org | reportbuilder-typedetection
1944+openoffice.org | reportbuilder-ui
1945+openoffice.org | reportdesign-dlg
1946+openoffice.org | reportdesign-inspection
1947+openoffice.org | reportdesign-registry-office
1948+openoffice.org | reportdesign-report
1949+openoffice.org | reportdesign-resource
1950+openoffice.org | sc-core
1951+openoffice.org | sc-dbgui
1952+openoffice.org | sc-docshell
1953+openoffice.org | sc-drawfunc
1954+openoffice.org | sc-formdlg
1955+openoffice.org | sc-miscdlgs
1956+openoffice.org | sc-navipi
1957+openoffice.org | sc-pagedlg
1958+openoffice.org | sc-styleui
1959+openoffice.org | sc-ui
1960+openoffice.org | sc-ui-cctrl
1961+openoffice.org | scaddins-analysis
1962+openoffice.org | scaddins-datefunc
1963+openoffice.org | sccomp-solver
1964+openoffice.org | scp2-activex
1965+openoffice.org | scp2-base
1966+openoffice.org | scp2-binfilter
1967+openoffice.org | scp2-calc
1968+openoffice.org | scp2-draw
1969+openoffice.org | scp2-gnome
1970+openoffice.org | scp2-graphicfilter
1971+openoffice.org | scp2-impress
1972+openoffice.org | scp2-javafilter
1973+openoffice.org | scp2-kde
1974+openoffice.org | scp2-lingu
1975+openoffice.org | scp2-math
1976+openoffice.org | scp2-onlineupdate
1977+openoffice.org | scp2-ooo
1978+openoffice.org | scp2-python
1979+openoffice.org | scp2-quickstart
1980+openoffice.org | scp2-sdkoo
1981+openoffice.org | scp2-testtool
1982+openoffice.org | scp2-winexplorerext
1983+openoffice.org | scp2-writer
1984+openoffice.org | scp2-xsltfilter
1985+openoffice.org | scsolver-ext
1986+openoffice.org | scsolver-ui
1987+openoffice.org | sd-accessibility
1988+openoffice.org | sd-animations
1989+openoffice.org | sd-app
1990+openoffice.org | sd-core
1991+openoffice.org | sd-dlg
1992+openoffice.org | sd-html
1993+openoffice.org | sd-notes
1994+openoffice.org | sd-slideshow
1995+openoffice.org | sd-table
1996+openoffice.org | sdext-extension
1997+openoffice.org | sdext-minimizer-extension
1998+openoffice.org | sdext-minimizer-office
1999+openoffice.org | sdext-minimizer-ui
2000+openoffice.org | sfx2-appl
2001+openoffice.org | sfx2-bastyp
2002+openoffice.org | sfx2-config
2003+openoffice.org | sfx2-dialog
2004+openoffice.org | sfx2-doc
2005+openoffice.org | sfx2-menu
2006+openoffice.org | sfx2-view
2007+openoffice.org | shell-res
2008+openoffice.org | starmath-source
2009+openoffice.org | svtools-contnr
2010+openoffice.org | svtools-control
2011+openoffice.org | svtools-dialogs
2012+openoffice.org | svtools-filter
2013+openoffice.org | svtools-items1
2014+openoffice.org | svtools-java
2015+openoffice.org | svtools-misc
2016+openoffice.org | svtools-misc1
2017+openoffice.org | svtools-plugapp
2018+openoffice.org | svtools-productregistration
2019+openoffice.org | svtools-uno
2020+openoffice.org | svtools-unodialog
2021+openoffice.org | svx-accessibility
2022+openoffice.org | svx-dialog
2023+openoffice.org | svx-editeng
2024+openoffice.org | svx-engine3d
2025+openoffice.org | svx-fmcomp
2026+openoffice.org | svx-form
2027+openoffice.org | svx-gallery2
2028+openoffice.org | svx-inc
2029+openoffice.org | svx-intro
2030+openoffice.org | svx-items
2031+openoffice.org | svx-options
2032+openoffice.org | svx-outliner
2033+openoffice.org | svx-src
2034+openoffice.org | svx-stbctrls
2035+openoffice.org | svx-svdraw
2036+openoffice.org | svx-svxlink
2037+openoffice.org | svx-table
2038+openoffice.org | svx-tbxctrls
2039+openoffice.org | svx-textconversiondlgs
2040+openoffice.org | svx-toolbars
2041+openoffice.org | sw-app
2042+openoffice.org | sw-chrdlg
2043+openoffice.org | sw-config
2044+openoffice.org | sw-dbui
2045+openoffice.org | sw-dialog
2046+openoffice.org | sw-dochdl
2047+openoffice.org | sw-docvw
2048+openoffice.org | sw-envelp
2049+openoffice.org | sw-fldui
2050+openoffice.org | sw-fmtui
2051+openoffice.org | sw-frmdlg
2052+openoffice.org | sw-globdoc
2053+openoffice.org | sw-inc
2054+openoffice.org | sw-index
2055+openoffice.org | sw-lingu
2056+openoffice.org | sw-misc
2057+openoffice.org | sw-ribbar
2058+openoffice.org | sw-sdi
2059+openoffice.org | sw-shells
2060+openoffice.org | sw-smartmenu
2061+openoffice.org | sw-table
2062+openoffice.org | sw-uiview
2063+openoffice.org | sw-undo
2064+openoffice.org | sw-unocore
2065+openoffice.org | sw-utlui
2066+openoffice.org | sw-web
2067+openoffice.org | sw-wrtsh
2068+openoffice.org | swext-custom
2069+openoffice.org | swext-help
2070+openoffice.org | swext-office
2071+openoffice.org | sysui-share
2072+openoffice.org | toolkit-workben-layout
2073+openoffice.org | ucbhelper-ucb-explorer
2074+openoffice.org | uui-source
2075+openoffice.org | vcl-src
2076+openoffice.org | wizards-euro
2077+openoffice.org | wizards-formwizard
2078+openoffice.org | wizards-importwizard
2079+openoffice.org | wizards-schedule
2080+openoffice.org | wizards-template
2081+openoffice.org | xmlsecurity-component
2082+openoffice.org | xmlsecurity-dialogs
2083
2084=== modified file 'config/settings.conf'
2085--- config/settings.conf 2010-09-28 14:23:29 +0000
2086+++ config/settings.conf 2010-10-07 20:22:40 +0000
2087@@ -9,7 +9,7 @@
2088
2089 [defaults]
2090 distro_id: ubuntu
2091-distro_codename: maverick
2092+distro_codename: lucid
2093 devel_milestone:
2094 product: desktop
2095 blacklist_priority: 3499
2096
2097=== modified file 'ubuntu-translations-stats.py'
2098--- ubuntu-translations-stats.py 2010-09-28 10:04:10 +0000
2099+++ ubuntu-translations-stats.py 2010-10-07 20:22:40 +0000
2100@@ -23,6 +23,8 @@
2101 import sys
2102 import urllib
2103 import os
2104+import apt_pkg
2105+import subprocess
2106 from optparse import OptionParser
2107 from common import utils
2108 from ul10n_stats import ul10n_iso_pots_get
2109@@ -47,33 +49,6 @@
2110 given distro version."""
2111
2112 parser = OptionParser(usage = USAGE, description = DESCRIPTION)
2113-
2114- parser.add_option("-l",
2115- "--languages-file",
2116- dest="languages_file",
2117- default=None,
2118- help="File with read languages for report.")
2119-
2120- parser.add_option("-d",
2121- "--domains-file",
2122- dest="domains_file",
2123- default=None,
2124- help="File to read domains from and on which stats are based. Requires -c argument.")
2125-
2126- parser.add_option("-c",
2127- "--custom",
2128- dest="custom",
2129- action="store_true",
2130- default=False,
2131- help="Turn on custom (non-Ubuntu) mode")
2132-
2133- parser.add_option("-f",
2134- "--no-file",
2135- dest="no_file",
2136- action="store_true",
2137- default=False,
2138- help="Disables using conf file blacklist.")
2139-
2140 parser.add_option("-p",
2141 "--no-priorities",
2142 dest="no_priorities",
2143@@ -90,14 +65,56 @@
2144 parser.add_option("-b",
2145 "--template-blacklist",
2146 dest="blacklist",
2147- default='config/blacklist.conf',
2148+ default='',
2149 help="Specify the file containing the templates to blacklist during the calculation of statistics")
2150+# from here down are args for custom options. they all required -c.
2151+ parser.add_option("-c",
2152+ "--custom",
2153+ dest="custom",
2154+ action="store_true",
2155+ default=False,
2156+ help="Turn on custom (non-Ubuntu) mode")
2157+
2158+ parser.add_option("-l",
2159+ "--languages-file",
2160+ dest="languages_file",
2161+ default=None,
2162+ help="File with languages for report.")
2163+
2164+ parser.add_option("-n",
2165+ "--custom-name",
2166+ dest="custom_name",
2167+ default=None,
2168+ help="Name of custom project. Requires -c argument.")
2169+
2170+ parser.add_option("-m",
2171+ "--manifest-file",
2172+ dest="manifest_file",
2173+ default=None,
2174+ help="Manifest file to read bin pkgs from and on which stats are based. Requires -c argument.")
2175+
2176+ parser.add_option("-d",
2177+ "--domains-file",
2178+ dest="domains_file",
2179+ default=None,
2180+ help="File to read domains from and on which stats are based. Requires -c argument.")
2181+
2182+ parser.add_option("-r",
2183+ "--root-dir",
2184+ dest="root_dir",
2185+ default=None,
2186+ help="Path to root dir of custom system from which to get domains. Requires -c argument.")
2187+ parser.add_option("-f",
2188+ "--disable-file-blacklist",
2189+ dest="disable_file_blacklist",
2190+ action="store_true",
2191+ default=False,
2192+ help="Disables using conf file blacklist.")
2193
2194 (options, args) = parser.parse_args()
2195
2196 return options, settings
2197
2198-
2199 def get_raw_data(distro_codename):
2200
2201 logger.info("Fetching stats data...")
2202@@ -107,7 +124,7 @@
2203 urllib.urlretrieve(url, path)
2204
2205
2206-def get_working_templates(options, settings):
2207+def get_superset_templates(options, settings):
2208
2209 distro_codename = settings['distro_codename']
2210 distro_id = settings['distro_id']
2211@@ -116,7 +133,9 @@
2212
2213 logger.info("Fetching working templates set...")
2214
2215- # if normal ubuntu mode, get src pkg list form seeds, else from custom
2216+ src_pkgs_not_found = list()
2217+
2218+ # if normal ubuntu mode, get src pkg list from seeds, else from custom
2219 if not options.custom:
2220 # Get the source packages from the given distro's seeds.
2221 # This will give us only the list of source packages we're interested
2222@@ -130,14 +149,22 @@
2223
2224 # create list ('valid') of lines from lp_stats_pots file that only includes
2225 # src pkgs that are: in the seed, enabled, or in extra (for live cd)
2226- valid = ul10n_iso_pots_get.apply_valid_pots_filter(TEMPLATES_FILE,
2227+ superset = ul10n_iso_pots_get.apply_valid_pots_filter(TEMPLATES_FILE,
2228 distro_seeds.sourcepackages)
2229-
2230- working_pots = ul10n_iso_pots_get.apply_blacklist_filter(options, settings, valid)
2231-
2232 else:
2233- domain_src, domain_linenum, domain_template, lines = ul10n_iso_pots_get.get_dictionaries(TEMPLATES_FILE)
2234- if options.domains_file:
2235+ domain_src, domain_linenum, domain_template, src_domains, lines = ul10n_iso_pots_get.get_dictionaries(TEMPLATES_FILE)
2236+ if options.manifest_file:
2237+ binary_pkgs = get_bin_pkgs_from_manifest(options.manifest_file)
2238+ src_pkgs, not_found = get_src_pkgs_from_binary_pkgs(binary_pkgs)
2239+ domains = list()
2240+ for src_pkg in src_pkgs:
2241+ if src_pkg in src_domains.keys():
2242+ for domain in src_domains[src_pkg]:
2243+ domains.append(domain)
2244+ else:
2245+ src_pkgs_not_found.append(src_pkg)
2246+ #TODO save src pkgs not found. this shows what the trans stats DON'T include
2247+ elif options.domains_file:
2248 if not os.path.exists(options.domains_file):
2249 logger.critical("Error: domains_file not found. Stopping.")
2250 sys.exit(1)
2251@@ -145,28 +172,117 @@
2252 domains = f.read().split('\n')
2253 f.close()
2254 else:
2255- domains = ul10n_custom.get_domains()
2256- #for domain in domains: logger.debug(domain)
2257- working_pots = list()
2258+ if options.root_dir:
2259+ r_dir = options.root_dir
2260+ else:
2261+ r_dir = '/'
2262+ domains = ul10n_custom.get_domains(r_dir)
2263+ #for domain in domains: print >> sys.stderr, domain
2264+ superset = list()
2265 invalid = list()
2266 for domain in domains:
2267 if domain in domain_src.keys():
2268- line = lines[domain_linenum[domain]].rstrip()
2269- working_pots.append(line)
2270- # write
2271- f_domains = open(os.path.join(os.getcwd(), "reports", "report_domains"), 'w')
2272- f_domains.write("- Src Pkg | Gettext Domain | LP Template -\n")
2273- f_domains.write("------------------------------------------\n")
2274- for line in working_pots:
2275- items = line.split('|')
2276- f_domains.write(items[0].strip() + ' | ' + items[1].strip() + ' | ' + items[2].strip() + '\n')
2277- f_domains.flush()
2278- f_domains.close()
2279-
2280- return working_pots
2281+ line = lines[domain_linenum[domain]].rstrip().lstrip()
2282+ superset.append(line)
2283+ superset.sort()
2284+
2285+ return superset, src_pkgs_not_found
2286+
2287+def get_src_pkgs_from_binary_pkgs(binaries):
2288+ not_found = list()
2289+ src_pkgs = list()
2290+
2291+
2292+ for items in binaries:
2293+ cmd = ['apt-cache', 'showsrc', items[0]]
2294+ try:
2295+ res = subprocess.Popen(cmd, cwd="./", stdout=subprocess.PIPE
2296+).communicate()
2297+ except:
2298+ print >>sys.stderr, "Error: subprocess exception. stopping."
2299+ sys.exit(1)
2300+ continue
2301+ src_pkg = res[0][res[0].find(" ") + 1:res[0].find("\n")]
2302+ if len(src_pkg) == 0:
2303+ not_found.append(items[0])
2304+ continue
2305+ if src_pkg not in src_pkgs:
2306+ src_pkgs.append(src_pkg)
2307+
2308+# apt_pkg.init()
2309+# srcs = apt_pkg.GetPkgSrcRecords()
2310+# srcs.Restart()
2311+# for tup in binaries:
2312+# if srcs.Lookup(tup[0]):
2313+# src_pkgs.append(srcs.Package)
2314+# else:
2315+# not_found.append(tup[0])
2316+
2317+ src_pkgs.sort()
2318+
2319+ return src_pkgs, not_found
2320+
2321+def get_bin_pkgs_from_manifest(path):
2322+ if not os.path.exists(path):
2323+ print >> sys.stderr, "Error: " + path + "does not exist. Stoppping."
2324+ sys.exit(1)
2325+ f = open(path, 'r')
2326+ lines = f.readlines()
2327+ f.close()
2328+
2329+ binaries = list(tuple())
2330+ for line in lines:
2331+ items = line.split()
2332+ binaries.append([items[0],items[1]])
2333+
2334+ return binaries
2335+
2336+def log_template(the_set, name, options, settings):
2337+ basename = utils.get_basename(options,settings)
2338+ f_name = basename + "-" + name
2339+ f = open(os.path.join(os.getcwd(), "reports", f_name), 'w')
2340+ the_list_ = list(the_set)
2341+ the_list_.sort()
2342+ for line in the_list_:
2343+ f.write(line + '\n')
2344+ f.flush()
2345+ f.close()
2346+
2347+ return
2348+
2349+def log_blacklist(the_list, name, options, settings):
2350+
2351+ basename = utils.get_basename(options,settings)
2352+ f_name = basename + "-blacklist-" + name
2353+
2354+ # write used blacklist to file in data dir
2355+ f = open(os.path.join("reports", f_name), 'w')
2356+ l = list(the_list)
2357+ l.sort()
2358+ for item in l:
2359+ f.write(item[0] + ' | ' + item[1] + '\n')
2360+ f.flush()
2361+ f.close()
2362+
2363+ return
2364+
2365+def log(blacklisted, blacklisted_priority, blacklisted_file, superset, working,
2366+ src_pkgs_not_found, options, settings):
2367+ # write blaclisted files
2368+ log_blacklist(blacklisted_file, "file", options, settings)
2369+ log_blacklist(blacklisted_priority, "priority", options, settings)
2370+ log_blacklist(blacklisted, "all", options, settings)
2371+
2372+ log_template(superset, "superset", options, settings)
2373+ log_template(working, "working", options, settings)
2374+ if options.manifest_file:
2375+ log_template(src_pkgs_not_found, "src-pkgs-not-found", options, settings)
2376+
2377+ return
2378
2379 def main():
2380-
2381+ import codecs
2382+ sys.stdout = codecs.open("/dev/stdout", "w", 'utf-8')
2383 # Get the command line options and settings from the config file
2384 options, settings = options_parse()
2385
2386@@ -175,12 +291,21 @@
2387 get_raw_data(settings['distro_codename'])
2388
2389 # Compile a list of working templates to be considered for the calculation.
2390- # Apply any blacklisting if necessary.
2391- working_pots = get_working_templates(options, settings)
2392+ # Also, if its a custom execution and the manifest file option is used, return
2393+ # the list of src packages that are derived from the manifest but that are
2394+ # not found in the LP export. These are removed from the superset of pkgs
2395+ # and thus the statistics do not include them.
2396+ superset, src_pkgs_not_found = get_superset_templates(options, settings)
2397+
2398+ # Apply blacklists
2399+ working, blacklisted, blacklisted_priority, blacklisted_file = ul10n_iso_pots_get.apply_blacklist_filter(options, settings, superset)
2400+
2401+ # write log files
2402+ log(blacklisted, blacklisted_priority, blacklisted_file, superset, working, src_pkgs_not_found, options, settings)
2403
2404 # Calculate the unified, per language translation statistics from the
2405 # working templates set and output them in a report
2406- ul10n_stats_calc.calculate_stats(options, settings, working_pots)
2407+ ul10n_stats_calc.calculate_stats(options, settings, working)
2408
2409 if __name__ == "__main__":
2410 main()
2411
2412=== modified file 'ul10n_stats/ul10n_custom.py' (properties changed: -x to +x)
2413--- ul10n_stats/ul10n_custom.py 2010-09-25 12:56:20 +0000
2414+++ ul10n_stats/ul10n_custom.py 2010-10-07 20:22:40 +0000
2415@@ -2,10 +2,11 @@
2416
2417 import os, sys, subprocess
2418
2419-def get_domains():
2420+def get_domains(root_path):
2421 domains = list()
2422 not_found = list()
2423- cmd = 'find /usr/share/locale-langpack -name "*.mo"'
2424+ path = os.path.join(root_path, 'usr/share/locale-langpack')
2425+ cmd = 'find ' + path + ' -name "*.mo"'
2426 res = None
2427 try:
2428 res = subprocess.Popen(cmd, shell=True, cwd="./", stdout=subprocess.PIPE ).communicate()
2429@@ -20,6 +21,7 @@
2430 if len(domain) > 0:
2431 if domain not in domains:
2432 domains.append(domain)
2433+ domains.sort()
2434 return domains
2435
2436 def get_src_pkgs(domains):
2437
2438=== modified file 'ul10n_stats/ul10n_iso_pots_get.py'
2439--- ul10n_stats/ul10n_iso_pots_get.py 2010-09-28 18:55:37 +0000
2440+++ ul10n_stats/ul10n_iso_pots_get.py 2010-10-07 20:22:40 +0000
2441@@ -110,50 +110,49 @@
2442 valid.append(line.strip())
2443 return valid
2444
2445-def apply_blacklist_filter(options, settings, pot_set):
2446-
2447- blacklist = options.blacklist
2448-
2449+def apply_blacklist_filter(options, settings, superset):
2450+
2451+ if len(options.blacklist) != 0:
2452+ blacklist = options.blacklist
2453+ else:
2454+ blacklist = 'config/blacklist.' + settings['distro_codename'] + '.conf'
2455+
2456+ blacklisted = set()
2457 # create or get blacklist
2458 priority_blacklist = list(tuple())
2459
2460 if not options.no_priorities:
2461 # Set up blacklist from priorities
2462- type_msg = "Generated from Priorities"
2463 cutoff_priority = settings['blacklist_priority']
2464
2465- for line in pot_set:
2466+ for line in superset:
2467 items = line.split('|')
2468 priority = items[6].strip()
2469- if priority < cutoff_priority:
2470+ if priority <= cutoff_priority:
2471 src = items[0].strip()
2472- template = items[1].strip()
2473- priority_blacklist.append((src, template))
2474+ domain = items[1].strip()
2475+ priority_blacklist.append((src, domain))
2476 print >>sys.stderr, "BLACKLISTED through Priority: " + str(len(priority_blacklist))
2477
2478- write_blacklist(priority_blacklist, "priority", settings)
2479-
2480 file_blacklist = list(tuple())
2481
2482- if not options.no_file:
2483+ if not options.disable_file_blacklist:
2484 # Set up blacklist from config/blacklist.conf
2485- type_msg = "Read from Conf File"
2486-
2487 for line in open(blacklist):
2488- blk_pkg, blk_pot = line.split('|')
2489- blk_pkg = blk_pkg.strip()
2490- blk_pot = blk_pot.strip()
2491- file_blacklist.append((blk_pkg, blk_pot))
2492+ src, domain= line.split('|')
2493+ src = src.strip()
2494+ domain = domain.strip()
2495+ file_blacklist.append((src, domain))
2496 print >>sys.stderr, "BLACKLISTED through File: " + str(len(file_blacklist))
2497
2498- write_blacklist(file_blacklist, "file", settings)
2499+ for item in file_blacklist: blacklisted.add(item)
2500+ for item in priority_blacklist: blacklisted.add(item)
2501+
2502+ print >>sys.stderr, "BLACKLISTED: " + str(len(blacklisted))
2503
2504 valid = list()
2505 started = 1
2506- for line in pot_set:
2507- if started > 0:
2508- started -= 1
2509- continue
2510+ for line in superset:
2511
2512 if '|' in line:
2513 (pkg, domain, pot, total, enabled, langpack, priority, date) = line.split('|')
2514@@ -161,7 +160,8 @@
2515 pot = pot.strip()
2516 if ((pkg, pot) not in file_blacklist) and ((pkg, pot) not in priority_blacklist):
2517 valid.append(line.strip())
2518- return valid
2519+
2520+ return valid, blacklisted, priority_blacklist, file_blacklist
2521
2522 def get_dictionaries(f):
2523
2524@@ -170,6 +170,7 @@
2525 domain_src = dict()
2526 domain_template = dict()
2527 domain_linenum = dict()
2528+ src_domains = dict()
2529
2530 line_num = -1
2531 started = 1
2532@@ -191,15 +192,10 @@
2533 domain_template[domain] = template
2534 if (domain,line_num) not in domain_linenum.keys():
2535 domain_linenum[domain] = line_num
2536- return domain_src, domain_linenum, domain_template, lines
2537+ if src_pkg not in src_domains.keys():
2538+ src_domains[src_pkg] = [domain]
2539+ else:
2540+ if domain not in src_domains[src_pkg]:
2541+ src_domains[src_pkg].append(domain)
2542+ return domain_src, domain_linenum, domain_template, src_domains, lines
2543
2544-def write_blacklist(bl, msg, settings):
2545- # write used blacklist to file in data dir
2546- black_list_f = open(os.path.join("data", settings['distro_codename'] + "-black_listed-" + msg), 'w')
2547- black_list_f.write("- " + msg + " -\n- Source Package | Template -\n-----------------------------\n")
2548- bl_l = list(bl)
2549- bl_l.sort()
2550- for item in bl_l:
2551- black_list_f.write(item[0] + ' | ' + item[1] + '\n')
2552- black_list_f.flush()
2553- black_list_f.close()
2554
2555=== modified file 'ul10n_stats/ul10n_stats_calc.py'
2556--- ul10n_stats/ul10n_stats_calc.py 2010-09-28 14:23:29 +0000
2557+++ ul10n_stats/ul10n_stats_calc.py 2010-10-07 20:22:40 +0000
2558@@ -27,7 +27,7 @@
2559 import urllib2
2560 import datetime
2561 import gzip
2562-from common.utils import init_logging, do_lp_login
2563+from common.utils import init_logging, do_lp_login, get_basename
2564 from common.templates import html_report_template
2565 sys.path.append(os.path.join(os.getcwd(), 'lib/python2.6/site-packages'))
2566 from gviz_api import gviz_api
2567@@ -102,7 +102,7 @@
2568
2569 length = property(_get_languages_len)
2570
2571- def get_all_languages(self, config=None):
2572+ def get_all_languages(self, options, config=None):
2573 """Fetch all available languages either known to Launchpad or listed
2574 in a configuration file.
2575 """
2576@@ -145,17 +145,11 @@
2577 if started > 0:
2578 started -= 1
2579 elif '|' in line:
2580- try:
2581- code, english_name, visible = line.split('|')
2582- except ValueError, e:
2583+ if options.custom and options.languages_file:
2584 code, english_name = line.split('|')
2585 visible = "t"
2586- logger.warning(
2587- "Language {0} [{1}]:".format(
2588- english_name.strip(), code.strip()) \
2589- + " missing 'visible' column " \
2590- + "in the languages file. Assuming " \
2591- + "it is visible.")
2592+ else:
2593+ code, english_name, visible = line.split('|')
2594 language = Language(code.strip(),
2595 english_name.strip(),
2596 visible.strip() == "t")
2597@@ -212,6 +206,7 @@
2598
2599
2600 def addToLanguage(stats, language, translated, total):
2601+
2602 if language in stats:
2603 stats[language]['translated'] += translated
2604 stats[language]['total'] += total
2605@@ -221,10 +216,100 @@
2606 'total': total,
2607 }
2608
2609-
2610-def print_report(variables, settings, custom):
2611- basename = '{0}-{1}-translation-stats.html'.format(settings['distro_id'], settings['distro_release'])
2612- report_filename = os.path.join('reports', basename)
2613+def do_lp_login():
2614+
2615+ from launchpadlib.launchpad import Launchpad
2616+ import tempfile
2617+ import atexit
2618+ import shutil
2619+ cachedir = tempfile.mkdtemp()
2620+ atexit.register(shutil.rmtree, cachedir)
2621+
2622+ print >> sys.stderr, "Logging in to Launchpad... "
2623+
2624+ # TODO: error checking, especially if we're working offline
2625+ launchpad = Launchpad.login_anonymously('Ubuntu Translation stats',
2626+ 'production', cachedir)
2627+
2628+ return launchpad
2629+
2630+
2631+def get_lang_names(options):
2632+
2633+ # Set only to False to speed up debugging
2634+ lp_api = False
2635+
2636+ lang_names = {}
2637+
2638+ print >>sys.stderr, 'Getting language list...'
2639+
2640+ if lp_api:
2641+ max_tries = 2
2642+ tries = 0
2643+
2644+ launchpad = do_lp_login()
2645+
2646+ try:
2647+ langs = launchpad.languages
2648+ except urllib2.URLError, e:
2649+ tries += 1
2650+ if tries >= max_tries or (e.code != 502 and e.code != 504):
2651+ print >>sys.stderr, "Failed (%d): %s" % (e.code, url)
2652+ raise
2653+
2654+ print >>sys.stderr, "Retrying (%d): %s" % (e.code, url)
2655+ time.sleep(3)
2656+
2657+ for lang in langs:
2658+ if lang.visible:
2659+ lang_names[lang.code] = lang.english_name
2660+
2661+ langs_len = len(langs)
2662+
2663+ else:
2664+ if options.languages_file:
2665+ languages_file = options.languages_file
2666+ else:
2667+ languages_file = os.path.join('data', 'langs.log')
2668+
2669+ if not os.path.exists(languages_file):
2670+ print >> sys.stderr, 'Error: Langauges file does not exist. Stopping'
2671+ sys.exit(1)
2672+ f = open(languages_file, 'r')
2673+ lines = f.readlines()
2674+ f.close()
2675+
2676+ print >> sys.stderr, 'file:' + languages_file
2677+ started = 2
2678+ for line in lines:
2679+ if started > 0 and not options.languages_file:
2680+ started -= 1
2681+ continue
2682+
2683+ if '|' in line:
2684+ items = line.split('|')
2685+ code = items[0].strip()
2686+ englishname = items[1].strip()
2687+ visible = True
2688+ if len(items) > 2:
2689+ vis = items[2].strip()
2690+ if vis.strip() != "t":
2691+ visible = False
2692+ if visible:
2693+ lang_names[code] = englishname
2694+
2695+
2696+ langs_len = len(lang_names)
2697+
2698+ print >>sys.stderr, '{0} languages obtained'.format(str(langs_len))
2699+
2700+ return lang_names
2701+
2702+
2703+def print_reports(variables, settings, options):
2704+ basename = get_basename(options,settings)
2705+ #basename += ".html"
2706+ report_filename = os.path.join('reports', basename + '.html')
2707
2708 # Log the date of creation for the report
2709 gen_date = str(datetime.datetime.utcnow())
2710@@ -232,14 +317,31 @@
2711 # Add necessary variables for the report
2712 variables['gen_date'] = gen_date
2713 variables['distro_release'] = settings['distro_release']
2714-
2715- # This is clearly not optimal, but as long as the file is hosted
2716- # on people.ubuntu.com there is no other way to make the statistics
2717- # link work.
2718- variables['basename'] = '/~dpm/' + basename
2719-
2720+ variables['project'] = options.custom_name
2721+ variables['basename'] = basename
2722 f = codecs.open(report_filename, 'w', 'utf-8')
2723- f.write(html_report_template.ubuntu_template % variables)
2724+ if options.custom:
2725+ from common.templates import custom_report as template
2726+ from common.templates import custom_src_excluded as excluded
2727+ f_ = codecs.open(os.path.join('reports', basename + '-excluded.html'), 'w', 'utf-8')
2728+ f_.write(excluded.ubuntu_template % variables)
2729+ f_.close()
2730+ from common.templates import custom_src_included as included
2731+ f_ = codecs.open(os.path.join('reports', basename + '-included.html'), 'w', 'utf-8')
2732+ f_.write(included.ubuntu_template % variables)
2733+ f_.close()
2734+ from common.templates import custom_blacklisted_file as blacklisted_file
2735+ f_ = codecs.open(os.path.join('reports', basename + '-blacklisted-file.html'), 'w', 'utf-8')
2736+ f_.write(blacklisted_file.ubuntu_template % variables)
2737+ f_.close()
2738+ from common.templates import custom_blacklisted_priority as blacklisted_priority
2739+ f_ = codecs.open(os.path.join('reports', basename + '-blacklisted-priority.html'), 'w', 'utf-8')
2740+ f_.write(blacklisted_priority.ubuntu_template % variables)
2741+ f_.close()
2742+ #print "variables: " + str(variables)
2743+ else:
2744+ from common.templates import html_report_template as template
2745+ f.write(template.ubuntu_template % variables)
2746 f.close()
2747
2748 logger.info('Report generated at {0}'.format(report_filename))
2749@@ -271,7 +373,7 @@
2750 print >> sys.stderr, "TOTAL MESSAGES: " + str(TOTAL)
2751
2752 languages = LanguageSet()
2753- languages.get_all_languages(options.languages_file)
2754+ languages.get_all_languages(options, options.languages_file)
2755
2756 # Skip 2 lines from the package stats file
2757 started = 2
2758@@ -304,11 +406,13 @@
2759 languages_available.sort(cmp=lambda a, b:
2760 cmp(stats[b]['translated'], stats[a]['translated']))
2761
2762+ #for l in languages_available:
2763+ # print >> sys.stderr, l
2764+
2765 # This list will contain the language statistics data in the format
2766 # the gviz_api.DataTable expects
2767 language_stats = []
2768 languages_supported = 0
2769-
2770 for lang in languages_available:
2771 if lang in languages:
2772 translated_percent = 100.00 * stats[lang]['translated'] / TOTAL
2773@@ -324,16 +428,152 @@
2774
2775 languages_total = len(languages_available)
2776
2777- keys = ("language", "translated")
2778- description = {"language": ("string", "Language"),
2779- "translated": ("number", "Translated")}
2780+ description = {
2781+ "language": ("string", "Language"),
2782+ "translated": ("number", "Translated")
2783+ }
2784
2785 # Load the data into a gviz_api.DataTable
2786 data_table = gviz_api.DataTable(description)
2787 data_table.LoadData(language_stats)
2788
2789- languages_json = data_table.ToJSon(
2790- columns_order=("language", "translated"),
2791- order_by=[("translated", "desc")])
2792-
2793- print_report(locals(), settings, options.custom)
2794+ # FIXME: If we do rounding of the percentages before here, languages with
2795+ # the same percentage after rounding will be simply ordered alphabetically.
2796+ # When losing the figures after the decimal point, we lose the order of
2797+ # languages in a given percentage range
2798+ data_json = data_table.ToJSon(
2799+ columns_order=("language", "translated"),
2800+ order_by=[("translated", "desc"), ("language", "asc")]
2801+ )
2802+
2803+ if options.custom:
2804+ included_data_table, included_json, \
2805+ excluded_data_table, excluded_json, \
2806+ blacklisted_file_data, blacklisted_file_json, \
2807+ blacklisted_priority_data, blacklisted_priority_json = make_custom_html(options, settings)
2808+
2809+ print_reports(locals(), settings, options)
2810+
2811+def make_custom_html(options, settings):
2812+ basename = get_basename(options,settings)
2813+
2814+ #create data for blacklisted-priority
2815+ l = list()
2816+ f = open(os.path.join('reports', basename + '-blacklist-priority'), 'r')
2817+ lines = f.readlines()
2818+ f.close()
2819+ for line in lines:
2820+ items = line.split('|')
2821+ src = items[0].strip()
2822+ domain = items[1].strip()
2823+ found = False
2824+ for d in l:
2825+ if domain == d['domain']:
2826+ found = True
2827+ if not found:
2828+ l.append({'src_pkg':src, 'domain':domain})
2829+ description = {
2830+ "src_pkg": ("string", "Source Package"),
2831+ 'domain': ('string', 'Gettext Domain')
2832+ }
2833+ blacklisted_priority_data = gviz_api.DataTable(description)
2834+ blacklisted_priority_data.LoadData(l)
2835+ blacklisted_priority_json = blacklisted_priority_data.ToJSon(
2836+ columns_order=("src_pkg", "domain"),
2837+ order_by=[('src_pkg', 'asc'), ('domain', 'asc')]
2838+ )
2839+
2840+ #create data for blacklisted-file
2841+ blacklist_file = list()
2842+ f = open(os.path.join('reports', basename + '-blacklist-file'), 'r')
2843+ lines = f.readlines()
2844+ f.close()
2845+ for line in lines:
2846+ items = line.split('|')
2847+ src = items[0].strip()
2848+ domain = items[1].strip()
2849+ found = False
2850+ for d in blacklist_file:
2851+ if domain == d['domain']:
2852+ found = True
2853+ if not found:
2854+ blacklist_file.append({'src_pkg':src, 'domain':domain})
2855+ description = {
2856+ "src_pkg": ("string", "Source Package"),
2857+ 'domain': ('string', 'Gettext Domain')
2858+ }
2859+ blacklisted_file_data = gviz_api.DataTable(description)
2860+ blacklisted_file_data.LoadData(blacklist_file)
2861+ blacklisted_file_json = blacklisted_file_data.ToJSon(
2862+ columns_order=("src_pkg", "domain"),
2863+ order_by=[('src_pkg', 'asc'), ('domain', 'asc')]
2864+ )
2865+
2866+ #create data for included src pckgs
2867+ included = list()
2868+ f = open(os.path.join('reports', basename + '-working'), 'r')
2869+ lines = f.readlines()
2870+ f.close()
2871+ for line in lines:
2872+ items = line.split('|')
2873+ src = items[0].strip()
2874+ domain = items[1].strip()
2875+ template = items[2].strip()
2876+ found = False
2877+ for d in included:
2878+ if domain in d.values():
2879+ found = True
2880+ if not found:
2881+ included.append({'src_pkg':src, 'domain':domain, 'template':template})
2882+ description = {
2883+ "src_pkg": ("string", "Source Package"),
2884+ 'domain': ('string', 'Gettext Domain'),
2885+ 'template': ('string', 'LP Template')
2886+ }
2887+ included_data_table = gviz_api.DataTable(description)
2888+ included_data_table.LoadData(included)
2889+ included_json = included_data_table.ToJSon(
2890+ columns_order=("src_pkg", "domain", 'template'),
2891+
2892+ order_by=[('src_pkg', 'asc'), ('domain', 'asc'), ('template', 'asc')]
2893+ )
2894+
2895+ #create data for excluded src pckgs
2896+ src_not_included = list()
2897+ f = open(os.path.join('reports', basename + '-blacklist-all'), 'r')
2898+ lines = f.readlines()
2899+ f.close()
2900+ for line in lines:
2901+ items = line.split()
2902+ src = items[0].strip()
2903+ found = False
2904+ for d in src_not_included:
2905+ if src in d.values():
2906+ found = True
2907+ if not found:
2908+ src_not_included.append({'src_pkg':src})
2909+ # if using build manifest, also include pkgs in manifest and not found
2910+ # in LP exports
2911+ if options.manifest_file:
2912+ f = open(os.path.join('reports', basename + '-src-pkgs-not-found'), 'r')
2913+ lines = f.readlines()
2914+ f.close()
2915+ found = False
2916+ for d in src_not_included:
2917+ if src in d.values():
2918+ found = True
2919+ if not found:
2920+ src_not_included.append({'src_pkg':src})
2921+
2922+ description = {
2923+ "src_pkg": ("string", "Source Package")
2924+ }
2925+ excluded_data_table = gviz_api.DataTable(description)
2926+ excluded_data_table.LoadData(src_not_included)
2927+ excluded_json = excluded_data_table.ToJSon(
2928+ order_by=[('src_pkg', 'asc')]
2929+ )
2930+ return included_data_table, included_json,\
2931+ excluded_data_table, excluded_json,\
2932+ blacklisted_file_data, blacklisted_file_json, \
2933+ blacklisted_priority_data, blacklisted_priority_json

Subscribers

People subscribed via source and target branches