Spaces:
Sleeping
Sleeping
#!/usr/bin/env python | |
# This file is part of LilyPond, the GNU music typesetter. | |
# | |
# Copyright (C) 2007--2020 John Mandereau <[email protected]> | |
# | |
# LilyPond is free software: you can redistribute it and/or modify | |
# it under the terms of the GNU General Public License as published by | |
# the Free Software Foundation, either version 3 of the License, or | |
# (at your option) any later version. | |
# | |
# LilyPond is distributed in the hope that it will be useful, | |
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
# GNU General Public License for more details. | |
# | |
# You should have received a copy of the GNU General Public License | |
# along with LilyPond. If not, see <http://www.gnu.org/licenses/>. | |
import __main__ | |
import optparse | |
import os | |
import sys | |
import re | |
import langdefs | |
import buildlib | |
verbose = 0 | |
use_colors = False | |
lang = 'C' | |
C = lang | |
def dir_lang(file, lang, lang_dir_index): | |
path_components = file.split('/') | |
path_components[lang_dir_index] = lang | |
return os.path.join(*path_components) | |
# ugh, this is complicated; where has the good old 'git rev-parse' gone? | |
vc_revision_parse = 'git log -1 --pretty=format:%%H %s' | |
def do_file(file_name, lang_codes): | |
if verbose: | |
sys.stderr.write('%s...\n' % file_name) | |
split_file_name = file_name.split('/') | |
d1, d2 = split_file_name[0:2] | |
if d1 in lang_codes: | |
check_lang = d1 | |
lang_dir_index = 0 | |
elif d2 in lang_codes: | |
check_lang = d2 | |
lang_dir_index = 1 | |
else: | |
check_lang = lang | |
if check_lang == C: | |
raise Exception('cannot determine language for ' + file_name) | |
else: | |
if os.path.splitext(file_name)[1] == '.texidoc': | |
original = file_name.replace(os.path.join( | |
check_lang, 'texidocs'), 'snippets', 1) | |
original = original.replace('.texidoc', '.ly', 1) | |
else: | |
original = dir_lang(file_name, 'en', lang_dir_index) | |
translated_contents = open(file_name, encoding='utf8').read() | |
# experimental feature | |
if not touch_committishes in (current_revision, 'HEAD'): | |
(changes_in_original, error) = \ | |
buildlib.check_translated_doc(original, | |
file_name, | |
translated_contents, | |
upper_revision=touch_committishes) | |
if not error and not changes_in_original in ('', '\n'): | |
translated_contents = \ | |
buildlib.revision_re.sub('GIT committish: ' + current_revision, | |
translated_contents, 1) | |
f = open(file_name, 'w', encoding='utf8').write(translated_contents) | |
return | |
(diff_string, error) \ | |
= buildlib.check_translated_doc(original, | |
file_name, | |
translated_contents, | |
color=use_colors and not update_mode) | |
if error: | |
sys.stderr.write('warning: %s: %s' % (file_name, error)) | |
if update_mode: | |
if error or len(diff_string) >= os.path.getsize(original): | |
buildlib.read_pipe(text_editor + ' ' + file_name + ' ' + original) | |
elif diff_string: | |
diff_file = original + '.diff' | |
f = open(diff_file, 'w', encoding='utf8') | |
f.write(diff_string) | |
f.close() | |
buildlib.read_pipe(text_editor + ' ' + file_name + ' ' + diff_file) | |
os.remove(diff_file) | |
else: | |
sys.stdout.write(diff_string) | |
def usage(): | |
sys.stdout.write(r''' | |
Usage: | |
check-translation [--language=LANG] [--verbose] [--update] [-t COMMIT] FILE... | |
''') | |
def do_options(): | |
global lang, verbose, update_mode, touch_committishes, use_colors | |
p = optparse.OptionParser(usage="check-translation [--language=LANG] [--verbose] [--update] [-t COMMIT] FILE...", | |
description="") | |
p.add_option("--language", | |
action='store', | |
default=C, | |
dest="language", | |
metavar='LL', | |
help="assume document language ISO 639 code LL by default") | |
p.add_option("--no-color", | |
action='store_false', | |
default=True, | |
dest="color", | |
help="do not print ANSI-colored output") | |
p.add_option("--verbose", | |
action='store_true', | |
default=False, | |
dest="verbose", | |
help="print details, including executed shell commands") | |
p.add_option('-t', | |
action='store', | |
default='HEAD', | |
dest="touch_committishes", | |
metavar='COMMIT', | |
help='[EXPERIMENTAL] update committishes of all files that were up to \ | |
date at commit COMMIT') | |
p.add_option('-u', "--update", | |
action='store_true', | |
default=False, | |
dest='update_mode', | |
help='call $EDITOR to update the translation') | |
(options, files) = p.parse_args() | |
verbose = options.verbose | |
lang = options.language | |
use_colors = options.color | |
update_mode = options.update_mode | |
touch_committishes = options.touch_committishes | |
return files | |
def main(): | |
global update_mode, text_editor, touch_committishes, current_revision | |
files = do_options() | |
if 'EDITOR' in os.environ: | |
text_editor = os.environ['EDITOR'] | |
else: | |
update_mode = False | |
buildlib.verbose = verbose | |
(parsed_revision, error) = buildlib.read_pipe( | |
vc_revision_parse % touch_committishes) | |
if error: | |
sys.stderr.write('warning: %s' % error) | |
else: | |
touch_committishes = parsed_revision.strip() | |
current_revision = buildlib.read_pipe(vc_revision_parse % 'HEAD')[0] | |
for i in files: | |
do_file(i, list(langdefs.LANGDICT.keys())) | |
if __name__ == '__main__': | |
main() | |