| # Copyright 2019 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| """Sanity checking for grd_helper.py. Run manually before uploading a CL.""" |
| |
| import io |
| import os |
| import subprocess |
| import sys |
| |
| # Add the parent dir so that we can import from "helper". |
| sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) |
| from helper import grd_helper |
| from helper import translation_helper |
| |
| if sys.platform.startswith('win'): |
| # Use the |git.bat| in the depot_tools/ on Windows. |
| GIT = 'git.bat' |
| else: |
| GIT = 'git' |
| |
| here = os.path.dirname(os.path.realpath(__file__)) |
| repo_root = os.path.normpath(os.path.join(here, '..', '..', '..')) |
| |
| |
| def list_files_in_repository(repo_path, pattern): |
| """Lists all files matching given pattern in the given git repository""" |
| # This works because git does its own glob expansion even though there is no |
| # shell to do it. |
| output = subprocess.check_output([GIT, 'ls-files', '--', pattern], |
| cwd=repo_path).decode('utf-8') |
| return output.strip().splitlines() |
| |
| |
| def read_file_as_text(path): |
| with io.open(path, mode='r', encoding='utf-8') as f: |
| return f.read() |
| |
| |
| # Sanity checks to ensure that we can parse all grd and grdp files in the repo. |
| # Must not fail. |
| def Run(): |
| grds = list_files_in_repository(repo_root, '*.grd') |
| grdps = list_files_in_repository(repo_root, '*.grdp') |
| |
| print('Found %d grds, %d grdps in the repo.' % (len(grds), len(grdps))) |
| # Make sure we can parse all .grd files in the source tree. Grd files are |
| # parsed via the file path. |
| for grd in grds: |
| # This file is intentionally missing an include, skip it. |
| if grd == os.path.join('tools', 'translation', 'testdata', 'internal.grd'): |
| continue |
| path = os.path.join(repo_root, grd) |
| grd_helper.GetGrdMessages(path, os.path.dirname(path)) |
| |
| # Make sure we can parse all .grdp files in the source tree. |
| # Grdp files are parsed using file contents instead of path. |
| for grdp in grdps: |
| path = os.path.join(repo_root, grdp) |
| # Parse grdp files using file contents. |
| contents = read_file_as_text(path) |
| grd_helper.GetGrdpMessagesFromString(contents) |
| |
| print('Successfully parsed all .grd and .grdp files in the repo.') |
| |
| # Additional check for translateable grds. Translateable grds are a subset |
| # of all grds so this checks some files twice, but it exercises the |
| # get_translatable_grds() path and also doesn't need to skip internal.grd. |
| TRANSLATION_EXPECTATIONS_PATH = os.path.join(repo_root, 'tools', |
| 'gritsettings', |
| 'translation_expectations.pyl') |
| translateable_grds = translation_helper.get_translatable_grds( |
| repo_root, grds, TRANSLATION_EXPECTATIONS_PATH) |
| print('Found %d translateable .grd files in translation expectations.' % |
| len(translateable_grds)) |
| for grd in translateable_grds: |
| path = os.path.join(repo_root, grd.path) |
| grd_helper.GetGrdMessages(path, os.path.dirname(path)) |
| print('Successfully parsed all translateable_grds .grd files in translation ' |
| 'expectations.') |
| print('DONE') |
| |
| |
| if __name__ == '__main__': |
| Run() |