3 # Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 # Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 # Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 # Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 # Copyright (c) 2010 Dominik Riebeling
12 # All files in this archive are subject to the GNU General Public License.
13 # See the file COPYING in the source tree root for full license agreement.
15 # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 # KIND, either express or implied.
19 # lrelease all rbutil translations and create a nice table from the output
20 # suited to paste in the wiki.
31 from datetime
import date
45 'pt_BR' : 'Portuguese (Brasileiro)',
49 'zh_TW' : 'Chinese (trad)'
52 # modules that are not part of python itself.
56 print "Fatal: This script requires the pysvn package to run."
57 print " See http://pysvn.tigris.org/."
61 svnserver
= "svn://svn.rockbox.org/rockbox/trunk/"
62 langbase
= "rbutil/rbutilqt/"
63 # Paths and files to retrieve from svn.
64 # This is a mixed list, holding both paths and filenames.
65 # Get cpp sources as well for lupdate to work.
66 svnpaths
= [ langbase
]
69 print "Usage:", sys
.argv
[0], "[options]"
70 print "Print translation statistics suitable for pasting in the wiki."
72 print " --pretty: display pretty output instead of wiki-style"
73 print " --help: show this help"
76 def gettrunkrev(svnsrv
):
77 '''Get the revision of trunk for svnsrv'''
78 client
= pysvn
.Client()
79 entries
= client
.info2(svnsrv
, recurse
=False)
80 return entries
[0][1].rev
.number
83 def getsources(svnsrv
, filelist
, dest
):
84 '''Get the files listed in filelist from svnsrv and put it at dest.'''
85 client
= pysvn
.Client()
86 print "Checking out sources from %s, please wait." % svnsrv
89 url
= re
.subn('/$', '', svnsrv
+ elem
)[0]
90 destpath
= re
.subn('/$', '', dest
+ elem
)[0]
91 # make sure the destination path does exist
92 d
= os
.path
.dirname(destpath
)
93 if not os
.path
.exists(d
):
97 client
.export(url
, destpath
)
99 print "SVN client error: %s" % sys
.exc_value
100 print "URL: %s, destination: %s" % (url
, destpath
)
102 print "Checkout finished."
107 if len(sys
.argv
) > 1:
108 if sys
.argv
[1] == '--help':
111 if len(sys
.argv
) > 1:
112 if sys
.argv
[1] == '--pretty':
117 # get svnpaths to temporary folder
118 workfolder
= tempfile
.mkdtemp() + "/"
119 getsources(svnserver
, svnpaths
, workfolder
)
121 projectfolder
= workfolder
+ langbase
122 # lupdate translations and drop all obsolete translations
123 subprocess
.Popen(["lupdate-qt4", "-no-obsolete", "rbutilqt.pro"], \
124 stdout
=subprocess
.PIPE
, stderr
=subprocess
.PIPE
, cwd
=projectfolder
).communicate()
125 # lrelease translations to get status
126 output
= subprocess
.Popen(["lrelease-qt4", "rbutilqt.pro"], stdout
=subprocess
.PIPE
, \
127 stderr
=subprocess
.PIPE
, cwd
=projectfolder
).communicate()
128 lines
= re
.split(r
"\n", output
[0])
130 re_updating
= re
.compile(r
"^Updating.*")
131 re_generated
= re
.compile(r
"Generated.*")
132 re_ignored
= re
.compile(r
"Ignored.*")
133 re_qmlang
= re
.compile(r
"'.*/rbutil_(.*)\.qm'")
134 re_qmbase
= re
.compile(r
"'.*/(rbutil_.*)\.qm'")
135 re_genout
= re
.compile(r
"[^0-9]([0-9]+) .*[^0-9]([0-9]+) .*[^0-9]([0-9]+) ")
136 re_ignout
= re
.compile(r
"([0-9]+) ")
146 delim
= "+-" + titlemax
* "-" \
147 + "-+-------+-----+-----+-----+-----+--------------------+-----------------+"
148 head
= "| Language" + (titlemax
- 8) * " " \
149 + " | Code |Trans| Fin |Unfin| Untr| Updated | Done |"
151 print "|" + " " * (len(head
) / 2 - 3) + str(gettrunkrev(svnserver
)) \
152 + " " * (len(head
) / 2 - 4) + "|"
157 print "| *Translation status as of revision " + str(gettrunkrev(svnserver
)) + "* ||||||||"
158 print "| *Language* | *Language Code* | *Translations* | *Finished* | " \
159 "*Unfinished* | *Untranslated* | *Updated* | *Done* |"
161 client
= pysvn
.Client()
164 while i
< len(lines
):
166 if re_updating
.search(line
):
167 lang
= re_qmlang
.findall(line
)
168 tsfile
= "lang/" + re_qmbase
.findall(line
)[0] + ".ts"
169 fileinfo
= client
.info2(svnserver
+ langbase
+ tsfile
)[0][1]
170 tsrev
= fileinfo
.last_changed_rev
.number
171 tsdate
= date
.fromtimestamp(fileinfo
.last_changed_date
).isoformat()
174 if re_generated
.search(line
):
175 values
= re_genout
.findall(line
)
176 translations
= string
.atoi(values
[0][0])
177 finished
= string
.atoi(values
[0][1])
178 unfinished
= string
.atoi(values
[0][2])
182 if re_ignored
.search(line
):
183 ignored
= string
.atoi(re_ignout
.findall(line
)[0])
186 if langs
.has_key(lang
[0]):
187 name
= langs
[lang
[0]].strip()
191 percent
= (float(finished
+ unfinished
) * 100 / float(translations
+ ignored
))
192 bar
= "#" * int(percent
/ 10)
193 if (percent
% 10) > 5:
195 bar
+= " " * (10 - len(bar
))
197 fancylang
= lang
[0] + " " * (5 - len(lang
[0]))
200 tsversion
= str(tsrev
) + " (" + tsdate
+ ")"
201 status
= [fancylang
, translations
, finished
, unfinished
, ignored
, tsversion
, percent
, bar
]
203 thisname
= name
+ (titlemax
- len(name
)) * " "
204 print "| " + thisname
+ " | %5s | %3s | %3s | %3s | %3s | %6s | %3i%% %s |" % tuple(status
)
214 text
= "| " + name
+ " | %s | %s | %s | %s | %s | %s | " + color
+ "%3i%%%%ENDCOLOR%% %s |"
215 print text
% tuple(status
)
221 shutil
.rmtree(workfolder
)
224 if __name__
== "__main__":