| """ | |
| Utility to clean cache files that exceed a specific time in days according to their | |
| last access time recorded in the cache. | |
| Exit code: | |
| - 1 if no candidates are found | |
| - 0 if candidates are found | |
| Deletion can be enabled by passing `-d` parameter, otherwise it will only list the candidates. | |
| """ | |
| import sys | |
| from datetime import datetime as dt | |
| from huggingface_hub import scan_cache_dir | |
| def find_old_revisions(scan_results, max_age_days=30): | |
| """Find commit hashes of objects in the cache. These objects need a last access time that | |
| is above the passed `max_age_days` parameter. Returns an empty list if no objects are found. | |
| Time measurement is based of the current time and the recorded last access tiem in the cache. | |
| """ | |
| now = dt.now() | |
| revisions = [(i.revisions, i.last_accessed) for i in scan_results.repos] | |
| revisions_ages = [(rev, (now - dt.fromtimestamp(ts_access)).days) for rev, ts_access in revisions] | |
| delete_candidates = [rev for rev, age in revisions_ages if age > max_age_days] | |
| hashes = [n.commit_hash for rev in delete_candidates for n in rev] | |
| return hashes | |
| def delete_old_revisions(scan_results, delete_candidates, do_delete=False): | |
| delete_operation = scan_results.delete_revisions(*delete_candidates) | |
| print(f"Would free {delete_operation.expected_freed_size_str}") | |
| print(f"Candidates: {delete_candidates}") | |
| if do_delete: | |
| print("Deleting now.") | |
| delete_operation.execute() | |
| else: | |
| print("Not deleting, pass the -d flag.") | |
| if __name__ == "__main__": | |
| from argparse import ArgumentParser | |
| parser = ArgumentParser() | |
| parser.add_argument("-a", "--max-age", type=int, default=30, help="Max. age in days items in the cache may have.") | |
| parser.add_argument( | |
| "-d", | |
| "--delete", | |
| action="store_true", | |
| help=( | |
| "Delete mode; Really delete items if there are candidates. Exit code = 0 when we found something to delete, 1 " | |
| "otherwise." | |
| ), | |
| ) | |
| args = parser.parse_args() | |
| scan_results = scan_cache_dir() | |
| delete_candidates = find_old_revisions(scan_results, args.max_age) | |
| if not delete_candidates: | |
| print("No delete candidates found, not deleting anything.") | |
| sys.exit(1) | |
| delete_old_revisions(scan_results, delete_candidates, do_delete=args.delete) | |