| #!/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.defaults import SQLITE_NUM_SHARDS | |
| 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( | |
| "--num-shards", | |
| type=int, | |
| default=SQLITE_NUM_SHARDS, | |
| dest="num_shards", | |
| help=argparse.SUPPRESS, | |
| ) | |
| 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 | |
| num_shards = args.num_shards | |
| 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, num_shards=num_shards) | |
| else: | |
| if num_shards <= 1: | |
| db_files = [os.path.join(input_dir, "cache.db")] | |
| else: | |
| db_files = [os.path.join(input_dir, f"cache.{i}.db") for i in range(num_shards)] | |
| for fnam in db_files: | |
| 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 = SqliteMetadataStore(input_dir, num_shards=num_shards) | |
| output = FilesystemMetadataStore(output_dir) | |
| for s in input.list_all(): | |
| if s.endswith((".json", ".ff")): | |
| assert output.write( | |
| s, input.read(s), input.getmtime(s) | |
| ), f"Failed to write cache file {s}!" | |
| output.commit() | |
| if __name__ == "__main__": | |
| main() |