From c876d3bbefe0dc00c27ca0c12d29da5874946962 Mon Sep 17 00:00:00 2001 From: Dominik Riebeling Date: Wed, 15 Dec 2021 21:04:28 +0100 Subject: rbutil: Merge rbutil with utils folder. rbutil uses several components from the utils folder, and can be considered part of utils too. Having it in a separate folder is an arbitrary split that doesn't help anymore these days, so merge them. This also allows other utils to easily use libtools.make without the need to navigate to a different folder. Change-Id: I3fc2f4de19e3e776553efb5dea5f779dfec0dc21 --- utils/rbutilqt/langstats.py | 195 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100755 utils/rbutilqt/langstats.py (limited to 'utils/rbutilqt/langstats.py') diff --git a/utils/rbutilqt/langstats.py b/utils/rbutilqt/langstats.py new file mode 100755 index 0000000000..cbf49dce08 --- /dev/null +++ b/utils/rbutilqt/langstats.py @@ -0,0 +1,195 @@ +#!/usr/bin/python3 +# __________ __ ___. +# Open \______ \ ____ ____ | | _\_ |__ _______ ___ +# Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / +# Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < +# Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ +# \/ \/ \/ \/ \/ +# +# Copyright (c) 2010 Dominik Riebeling +# +# All files in this archive are subject to the GNU General Public License. +# See the file COPYING in the source tree root for full license agreement. +# +# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +# KIND, either express or implied. +# +# +# lrelease all rbutil translations and create a nice table from the output +# suited to paste in the wiki. +# + +import subprocess +import re +import sys +import tempfile +import os +import shutil +import argparse + +# extend search path for gitscraper +sys.path.append(os.path.abspath(os.path.join( + os.path.dirname(os.path.realpath(__file__)), "../../utils/common"))) +import gitscraper + + +LANGS = { + 'cs': 'Czech', + 'de': 'German', + 'fi': 'Finnish', + 'fr': 'French', + 'gr': 'Greek', + 'he': 'Hebrew', + 'it': 'Italian', + 'ja': 'Japanese', + 'nl': 'Dutch', + 'pl': 'Polish', + 'pt': 'Portuguese', + 'pt_BR': 'Portuguese (Brasileiro)', + 'ru': 'Russian', + 'tr': 'Turkish', + 'zh_CN': 'Chinese', + 'zh_TW': 'Chinese (trad)' +} + + +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. +GITPATHS = [LANGBASE] + + +def main(): + parser = argparse.ArgumentParser( + description='Print translation statistics for pasting in the wiki.') + parser.add_argument('-p', '--pretty', action='store_true', + help='Display pretty output instead of wiki-style') + parser.add_argument('-c', '--commit', nargs='?', help='Git commit hash') + + args = parser.parse_args() + + langstat(args.pretty, args.commit) + + +def langstat(pretty=True, tree=None): + '''Get translation stats and print to stdout.''' + # get gitpaths to temporary folder + workfolder = tempfile.mkdtemp() + "/" + repo = os.path.abspath(os.path.join(os.path.dirname(__file__), "../..")) + if tree is None: + tree = gitscraper.get_refs(repo)['HEAD'] + filesprops = gitscraper.scrape_files( + repo, tree, GITPATHS, dest=workfolder, + timestamp_files=["rbutil/rbutilqt/lang"]) + + projectfolder = workfolder + LANGBASE + # lupdate translations and drop all obsolete translations + subprocess.Popen(["lupdate", "-no-obsolete", "rbutilqt.pro"], + stdout=subprocess.PIPE, stderr=subprocess.PIPE, + cwd=projectfolder).communicate() + # lrelease translations to get status + output = subprocess.Popen(["lrelease", "rbutilqt.pro"], + stdout=subprocess.PIPE, stderr=subprocess.PIPE, + cwd=projectfolder).communicate() + lines = re.split(r"\n", output[0].decode()) + + 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 lang in LANGS: + cur = len(LANGS[lang]) + if titlemax < cur: + titlemax = cur + + if pretty: + delim = "+--" + titlemax * "-" + for spc in [7, 5, 5, 5, 5, 27, 17]: + delim += "+" + "-" * spc + delim += "+" + head = ("| {:%s} | {:6}|{:5}|{:5}|{:5}|{:5}| {:26}| {:16}|" + % titlemax).format("Language", "Code", "Trans", "Fin", "Unfin", + "Untr", "Updated", "Done") + print(delim) + print(("| {:^%s} |" % (len(head) - 4)).format(tree)) + print(delim) + print(head) + print(delim) + else: + rev = "%s (%s)" % ( + tree, gitscraper.get_file_timestamp(repo, tree, ".")) + print("| *Translation status as of revision %s* ||||||||" % rev) + print("| *Language* | *Language Code* | *Translations* " + "| *Finished* | *Unfinished* | *Untranslated* | *Updated* " + "| *Done* |") + + # scan output + for i, line in enumerate(lines): + if re_updating.search(line): + lang = re_qmlang.findall(line) + tsfile = "rbutil/rbutilqt/lang/%s.ts" % re_qmbase.findall(line)[0] + tsdate = filesprops[1][tsfile] + + line = lines[i + 1] + if re_generated.search(line): + values = re_genout.findall(line) + translations = int(values[0][0]) + finished = int(values[0][1]) + unfinished = int(values[0][2]) + line = lines[i + 2] + if not line.strip(): + line = lines[i + 3] + if re_ignored.search(line): + ignored = int(re_ignout.findall(line)[0]) + else: + ignored = 0 + if lang[0] in LANGS: + name = LANGS[lang[0]].strip() + else: + name = '(unknown)' + + percent = (finished + unfinished) * 100. / (translations + ignored) + progress = "#" * int(percent / 10) + if (percent % 10) > 5: + progress += "+" + progress += " " * (10 - len(progress)) + if pretty: + fancylang = lang[0] + " " * (5 - len(lang[0])) + else: + fancylang = lang[0] + if pretty: + print(("| {:%i} | {:5} | {:3} | {:3} | {:3} | {:3} | {:25} | " + "{:3}%% {} |" + % titlemax).format( + name, fancylang, translations, finished, unfinished, + ignored, tsdate, int(percent), progress)) + else: + if percent > 90: + color = r'%GREEN%' + else: + if percent > 50: + color = r'%ORANGE%' + else: + color = r'%RED%' + + print("| %s | %s | %s | %s | %s | %s | %s | %s %i%% " + "%%ENDCOLOR%% %s |" % + (name, fancylang, translations, finished, unfinished, + ignored, tsdate, color, percent, progress)) + + if pretty: + print(delim) + + shutil.rmtree(workfolder) + + +if __name__ == "__main__": + main() -- cgit v1.2.3