Spaces:
Sleeping
Sleeping
| #!@PYTHON@ | |
| # | |
| # This file is part of LilyPond, the GNU music typesetter. | |
| # | |
| # Copyright (C) 2008--2020 John Mandereau <john.mandereau@gmail.com> | |
| # | |
| # 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 subprocess | |
| import re | |
| import sys | |
| verbose = False | |
| def read_pipe(command): | |
| child = subprocess.Popen(command, | |
| stdout=subprocess.PIPE, | |
| stderr=subprocess.PIPE, | |
| shell=True) | |
| (output, error) = child.communicate() | |
| code = str(child.wait()) | |
| if not child.stdout or child.stdout.close(): | |
| print("pipe failed: %(command)s" % locals()) | |
| (output, error) = (output.decode('utf-8'), error.decode('utf-8')) | |
| if code != '0': | |
| error = code + ' ' + error | |
| return (output, error) | |
| # Renamed files map to ensure continuity of file history | |
| # Map of new_name: old_name | |
| # This is for handling 69f0ec47 ("Docs: reorganize documentation | |
| # directory structure"), which removed the user/ dir and the topdocs/NEWS.tely file | |
| renames_map = { | |
| 'usage.tely': 'user/lilypond-program.tely', | |
| 'notation.tely': 'user/lilypond.tely', | |
| 'learning.tely': 'user/lilypond-learning.tely', | |
| 'changes.tely': 'topdocs/NEWS.tely', | |
| } | |
| # FIXME: Hardcoded file names!? | |
| manuals_subdirectories_re = \ | |
| re.compile( | |
| '(usage|automated-engraving|changes|essay|extending|web|learning|notation)/') | |
| def get_old_name(file_path): | |
| for new_path in renames_map: | |
| if file_path.endswith(new_path): | |
| old_file_path = file_path.replace(new_path, | |
| renames_map[new_path]) | |
| break | |
| else: | |
| if file_path.endswith('macros.itexi'): | |
| old_file_path = file_path.replace('macros.itexi', | |
| 'user/macros.itexi') | |
| elif file_path.endswith('.itely'): | |
| old_file_path = manuals_subdirectories_re.sub('user/', | |
| file_path) | |
| elif 'snippets/' in file_path: | |
| old_file_path = file_path.replace('snippets/', | |
| '../input/lsr/') | |
| else: | |
| return file_path | |
| return old_file_path | |
| def file_exists_at(revision, name): | |
| cmd = "git show %s:Documentation/%s" % (revision, name) | |
| if verbose: | |
| sys.stderr.write('running: %s\n' % cmd) | |
| child = subprocess.run(cmd, | |
| stdout=subprocess.DEVNULL, | |
| stderr=subprocess.DEVNULL, | |
| shell=True) | |
| return not child.returncode | |
| revision_re = re.compile(r'GIT [Cc]ommittish:\s+([a-f0-9]+)') | |
| no_committish_fatal_error = """error: %s: no 'GIT committish: <hash>' found. | |
| Please check the whole file against the original in English, then | |
| fill in HEAD committish in the header. | |
| """ | |
| def check_translated_doc(original, translated_file, translated_contents, | |
| color=False, upper_revision='HEAD'): | |
| """Returns the diff of the original relative to the last translation""" | |
| m = revision_re.search(translated_contents) | |
| if not m: | |
| sys.stderr.write(no_committish_fatal_error % translated_file) | |
| sys.exit(1) | |
| revision = m.group(1) | |
| if revision == '0': | |
| return '', 0 | |
| if color: | |
| color_flag = '--color --color-words' | |
| else: | |
| color_flag = '--no-color' | |
| current_name = original | |
| if original.startswith("en/") and not file_exists_at(revision, original): | |
| # this is to handle the rename in 82d72b7 ("Merge branch doc-build") | |
| original = original[3:] | |
| if not file_exists_at(revision, original): | |
| original = get_old_name(original) | |
| c = 'git diff -M %(color_flag)s %(revision)s:Documentation/%(original)s \ | |
| %(upper_revision)s:Documentation/%(current_name)s' % vars() | |
| if verbose: | |
| sys.stderr.write('running: %s\n' % c) | |
| return read_pipe(c) | |