blob: 214a9a82d3c38c316f0564343c9375400af42428 [file] [edit]
#!/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()