| #!/usr/bin/env python3 |
| """Script for converting between cache formats. |
| |
| We support a filesystem tree based cache and a sqlite based cache. |
| See mypy/metastore.py for details. |
| """ |
| |
| from __future__ import annotations |
| |
| import os |
| import re |
| import sys |
| |
| sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) |
| |
| import argparse |
| |
| from mypy.metastore import FilesystemMetadataStore, MetadataStore, SqliteMetadataStore |
| |
| |
| def main() -> None: |
| parser = argparse.ArgumentParser() |
| parser.add_argument( |
| "--to-sqlite", |
| action="store_true", |
| default=False, |
| help="Convert to a sqlite cache (default: convert from)", |
| ) |
| parser.add_argument( |
| "--output_dir", |
| action="store", |
| default=None, |
| help="Output cache location (default: same as input)", |
| ) |
| parser.add_argument("input_dir", help="Input directory for the cache") |
| args = parser.parse_args() |
| |
| input_dir = args.input_dir |
| output_dir = args.output_dir or input_dir |
| assert os.path.isdir(output_dir), f"{output_dir} is not a directory" |
| if args.to_sqlite: |
| input: MetadataStore = FilesystemMetadataStore(input_dir) |
| output: MetadataStore = SqliteMetadataStore(output_dir) |
| else: |
| fnam = os.path.join(input_dir, "cache.db") |
| msg = f"{fnam} does not exist" |
| if not re.match(r"[0-9]+\.[0-9]+$", os.path.basename(input_dir)): |
| msg += f" (are you missing Python version at the end, e.g. {input_dir}/3.11)" |
| assert os.path.isfile(fnam), msg |
| input, output = SqliteMetadataStore(input_dir), FilesystemMetadataStore(output_dir) |
| |
| for s in input.list_all(): |
| if s.endswith(".json"): |
| assert output.write( |
| s, input.read(s), input.getmtime(s) |
| ), f"Failed to write cache file {s}!" |
| output.commit() |
| |
| |
| if __name__ == "__main__": |
| main() |