Add script for generating rbutil translation status overview.
Small script to generate an overview of the current translation status of Rockbox Utility. The sources are retrieved from svn for this, so it doesn't mess up with a working copy. Current limitations: - expects lupdate-qt4 and lrelease-qt4 to be in the PATH. Doesn't try to find them using other names. - always works on SVN HEAD. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@24290 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
6915340f2d
commit
93bba47001
1 changed files with 213 additions and 0 deletions
213
rbutil/rbutilqt/langstats.py
Executable file
213
rbutil/rbutilqt/langstats.py
Executable file
|
@ -0,0 +1,213 @@
|
|||
#!/usr/bin/python
|
||||
|
||||
#
|
||||
# lrelease all rbutil translations and create a nice table from the output
|
||||
# suited to paste in the wiki.
|
||||
#
|
||||
# (c) 2010 Dominik Riebeling
|
||||
#
|
||||
|
||||
import subprocess
|
||||
import re
|
||||
import sys
|
||||
import string
|
||||
import pysvn
|
||||
import tempfile
|
||||
import os
|
||||
import shutil
|
||||
from datetime import date
|
||||
|
||||
|
||||
langs = {
|
||||
'cs' : 'Czech',
|
||||
'de' : 'German',
|
||||
'fi' : 'Finnish',
|
||||
'fr' : 'French',
|
||||
'gr' : 'Greek',
|
||||
'he' : 'Hebrew',
|
||||
'ja' : 'Japanese',
|
||||
'nl' : 'Dutch',
|
||||
'pl' : 'Polish',
|
||||
'pt' : 'Portuguese',
|
||||
'pt_BR' : 'Portuguese (Brasileiro)',
|
||||
'ru' : 'Russian',
|
||||
'tr' : 'Turkish',
|
||||
'zh_CN' : 'Chinese',
|
||||
'zh_TW' : 'Chinese (trad)'
|
||||
}
|
||||
|
||||
# modules that are not part of python itself.
|
||||
try:
|
||||
import pysvn
|
||||
except ImportError:
|
||||
print "Fatal: This script requires the pysvn package to run."
|
||||
print " See http://pysvn.tigris.org/."
|
||||
sys.exit(-5)
|
||||
|
||||
|
||||
svnserver = "svn://svn.rockbox.org/rockbox/trunk/"
|
||||
langbase = "rbutil/rbutilqt/"
|
||||
# Paths and files to retrieve from svn.
|
||||
# This is a mixed list, holding both paths and filenames.
|
||||
# Get cpp sources as well for lupdate to work.
|
||||
svnpaths = [ langbase ]
|
||||
|
||||
def printhelp():
|
||||
print "Usage:", sys.argv[0], "[options]"
|
||||
print "Print translation statistics suitable for pasting in the wiki."
|
||||
print "Options:"
|
||||
print " --pretty: display pretty output instead of wiki-style"
|
||||
print " --help: show this help"
|
||||
|
||||
|
||||
def gettrunkrev(svnsrv):
|
||||
'''Get the revision of trunk for svnsrv'''
|
||||
client = pysvn.Client()
|
||||
entries = client.info2(svnsrv, recurse=False)
|
||||
return entries[0][1].rev.number
|
||||
|
||||
|
||||
def getsources(svnsrv, filelist, dest):
|
||||
'''Get the files listed in filelist from svnsrv and put it at dest.'''
|
||||
client = pysvn.Client()
|
||||
print "Checking out sources from %s, please wait." % svnsrv
|
||||
|
||||
for elem in filelist:
|
||||
url = re.subn('/$', '', svnsrv + elem)[0]
|
||||
destpath = re.subn('/$', '', dest + elem)[0]
|
||||
# make sure the destination path does exist
|
||||
d = os.path.dirname(destpath)
|
||||
if not os.path.exists(d):
|
||||
os.makedirs(d)
|
||||
# get from svn
|
||||
try:
|
||||
client.export(url, destpath)
|
||||
except:
|
||||
print "SVN client error: %s" % sys.exc_value
|
||||
print "URL: %s, destination: %s" % (url, destpath)
|
||||
return -1
|
||||
print "Checkout finished."
|
||||
return 0
|
||||
|
||||
|
||||
def main():
|
||||
if len(sys.argv) > 1:
|
||||
if sys.argv[1] == '--help':
|
||||
printhelp()
|
||||
sys.exit(0)
|
||||
if len(sys.argv) > 1:
|
||||
if sys.argv[1] == '--pretty':
|
||||
pretty = 1
|
||||
else:
|
||||
pretty = 0
|
||||
|
||||
# get svnpaths to temporary folder
|
||||
workfolder = tempfile.mkdtemp() + "/"
|
||||
getsources(svnserver, svnpaths, workfolder)
|
||||
|
||||
projectfolder = workfolder + langbase
|
||||
# lupdate translations and drop all obsolete translations
|
||||
subprocess.Popen(["lupdate-qt4", "-no-obsolete", "rbutilqt.pro"], \
|
||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=projectfolder).communicate()
|
||||
# lrelease translations to get status
|
||||
output = subprocess.Popen(["lrelease-qt4", "rbutilqt.pro"], stdout=subprocess.PIPE, \
|
||||
stderr=subprocess.PIPE, cwd=projectfolder).communicate()
|
||||
lines = re.split(r"\n", output[0])
|
||||
|
||||
re_updating = re.compile(r"^Updating.*")
|
||||
re_generated = re.compile(r"Generated.*")
|
||||
re_ignored = re.compile(r"Ignored.*")
|
||||
re_qmlang = re.compile(r"'.*/rbutil_(.*)\.qm'")
|
||||
re_qmbase = re.compile(r"'.*/(rbutil_.*)\.qm'")
|
||||
re_genout = re.compile(r"[^0-9]([0-9]+) .*[^0-9]([0-9]+) .*[^0-9]([0-9]+) ")
|
||||
re_ignout = re.compile(r"([0-9]+) ")
|
||||
|
||||
# print header
|
||||
titlemax = 0
|
||||
for l in langs:
|
||||
cur = len(langs[l])
|
||||
if titlemax < cur:
|
||||
titlemax = cur
|
||||
|
||||
if pretty == 1:
|
||||
delim = "+-" + titlemax * "-" \
|
||||
+ "-+-------+-----+-----+-----+-----+--------------------+-----------------+"
|
||||
head = "| Language" + (titlemax - 8) * " " \
|
||||
+ " | Code |Trans| Fin |Unfin| Untr| Updated | Done |"
|
||||
print delim
|
||||
print "|" + " " * (len(head) / 2 - 3) + str(gettrunkrev(svnserver)) \
|
||||
+ " " * (len(head) / 2 - 4) + "|"
|
||||
print delim
|
||||
print head
|
||||
print delim
|
||||
else:
|
||||
print "| *Translation status as of revision " + str(gettrunkrev(svnserver)) + "* ||||||||"
|
||||
print "| *Language* | *Language Code* | *Translations* | *Finished* | " \
|
||||
"*Unfinished* | *Untranslated* | *Updated* | *Done* |"
|
||||
|
||||
client = pysvn.Client()
|
||||
# scan output
|
||||
i = 0
|
||||
while i < len(lines):
|
||||
line = lines[i]
|
||||
if re_updating.search(line):
|
||||
lang = re_qmlang.findall(line)
|
||||
tsfile = "lang/" + re_qmbase.findall(line)[0] + ".ts"
|
||||
fileinfo = client.info2(svnserver + langbase + tsfile)[0][1]
|
||||
tsrev = fileinfo.last_changed_rev.number
|
||||
tsdate = date.fromtimestamp(fileinfo.last_changed_date).isoformat()
|
||||
|
||||
line = lines[i + 1]
|
||||
if re_generated.search(line):
|
||||
values = re_genout.findall(line)
|
||||
translations = string.atoi(values[0][0])
|
||||
finished = string.atoi(values[0][1])
|
||||
unfinished = string.atoi(values[0][2])
|
||||
line = lines[i + 2]
|
||||
if not line.strip():
|
||||
line = lines[i + 3]
|
||||
if re_ignored.search(line):
|
||||
ignored = string.atoi(re_ignout.findall(line)[0])
|
||||
else:
|
||||
ignored = 0
|
||||
if langs.has_key(lang[0]):
|
||||
name = langs[lang[0]].strip()
|
||||
else:
|
||||
name = '(unknown)'
|
||||
|
||||
percent = (float(finished + unfinished) * 100 / float(translations + ignored))
|
||||
bar = "#" * int(percent / 10)
|
||||
if (percent % 10) > 5:
|
||||
bar += "+"
|
||||
bar += " " * (10 - len(bar))
|
||||
if pretty == 1:
|
||||
fancylang = lang[0] + " " * (5 - len(lang[0]))
|
||||
else:
|
||||
fancylang = lang[0]
|
||||
tsversion = str(tsrev) + " (" + tsdate + ")"
|
||||
status = [fancylang, translations, finished, unfinished, ignored, tsversion, percent, bar]
|
||||
if pretty == 1:
|
||||
thisname = name + (titlemax - len(name)) * " "
|
||||
print "| " + thisname + " | %5s | %3s | %3s | %3s | %3s | %6s | %3i%% %s |" % tuple(status)
|
||||
else:
|
||||
if percent > 90:
|
||||
color = '%%GREEN%%'
|
||||
else:
|
||||
if percent > 50:
|
||||
color = '%%ORANGE%%'
|
||||
else:
|
||||
color = '%%RED%%'
|
||||
|
||||
text = "| " + name + " | %s | %s | %s | %s | %s | %s | " + color + "%3i%%%%ENDCOLOR%% %s |"
|
||||
print text % tuple(status)
|
||||
i += 1
|
||||
|
||||
if pretty == 1:
|
||||
print delim
|
||||
|
||||
shutil.rmtree(workfolder)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
Loading…
Reference in a new issue