| # Copyright 2025 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. |
| |
| """Check the content of a bundle according to a manifest.""" |
| |
| import sys |
| import os |
| |
| |
| def write_if_needed(path, content): |
| """Write `content` to `path` if needed.""" |
| if os.path.isfile(path): |
| # If the file exists and has the same content, skip writing. |
| with open(path, encoding='utf-8') as file: |
| if content == file.read(): |
| return |
| with open(path, 'w', encoding='utf-8') as file: |
| file.write(content) |
| file.flush() |
| |
| |
| |
| def read_manifest(manifest_path): |
| """Read a manifest file.""" |
| manifest_content = set() |
| with open(manifest_path, encoding='utf-8') as manifest_file: |
| for line in manifest_file: |
| assert line.endswith('\n') |
| manifest_content.add(line[:-1]) |
| return manifest_content |
| |
| |
| def main(args): |
| if len(args) != 3: |
| print( |
| f'usage: check-manifest.py bundle-dir manifest-path output-path', |
| file=sys.stderr) |
| return 1 |
| |
| bundle_dir, manifest_path, output_path = args |
| if not os.path.isdir(bundle_dir): |
| print( |
| f'error: {bundle_dir}: not a directory', |
| file=sys.stderr) |
| return 1 |
| |
| has_unexpected_files = False |
| manifest_content = read_manifest(manifest_path) |
| for dirpath, dirnames, filenames in os.walk(bundle_dir): |
| dirnames_to_skip = [] |
| for dirname in dirnames: |
| subdirpath = os.path.relpath(os.path.join(dirpath, dirname), bundle_dir) |
| if subdirpath in manifest_content: |
| dirnames_to_skip.append(dirname) |
| if dirnames_to_skip: |
| dirnames[:] = list(set(dirnames) - set(dirnames_to_skip)) |
| for filename in filenames: |
| filepath = os.path.relpath(os.path.join(dirpath, filename), bundle_dir) |
| if filepath not in manifest_content: |
| fullpath = os.path.normpath(os.path.join(bundle_dir, filepath)) |
| print(f'error: {fullpath}: unexpected file', file=sys.stderr) |
| has_unexpected_files = True |
| |
| write_if_needed(output_path, 'ko\n' if has_unexpected_files else 'ok\n') |
| |
| if has_unexpected_files: |
| return 1 |
| |
| return 0 |
| |
| if __name__ == '__main__': |
| sys.exit(main(sys.argv[1:])) |