|  | """ 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() |