| """ Tool for implementing a simple cache |
| |
| Tool returns 0 if cache is valid, returns non-zero is cache is invalid. |
| |
| check_cache.py <args> || (<build_cache> && update_cache.py <args>) |
| """ |
| import argparse |
| import hashlib |
| import pathlib |
| import os.path |
| import sys |
| |
| |
| def main(): |
| parser = argparse.ArgumentParser(description=__doc__) |
| parser.add_argument('cache_input') |
| parser.add_argument('cache_value') |
| parser.add_argument('cache_outputs', nargs='+') |
| |
| args = parser.parse_args() |
| |
| if not os.path.exists(args.cache_input): |
| sys.exit(-1) |
| |
| if not os.path.exists(args.cache_value): |
| sys.exit(-1) |
| |
| for out in args.cache_outputs: |
| if not os.path.exists(out): |
| sys.exit(-1) |
| |
| with open(args.cache_input, 'rb') as f: |
| m = hashlib.sha1() |
| m.update(f.read()) |
| h = m.hexdigest() |
| |
| with open(args.cache_value) as f: |
| if f.read().strip() != h: |
| sys.exit(-1) |
| |
| # Update file timestamps |
| pathlib.Path(args.cache_value).touch(exist_ok=True) |
| for out in args.cache_outputs: |
| pathlib.Path(out).touch(exist_ok=True) |
| |
| |
| if __name__ == "__main__": |
| main() |