#!/usr/bin/env python3
#
# SPDX-License-Identifier: GPL-2.0-or-later
#
"""Delete stale assets from the download cache of the functional tests"""

import os
import stat
import sys
import time
from pathlib import Path


cache_dir_env = os.getenv('QEMU_TEST_CACHE_DIR')
if cache_dir_env:
    cache_dir = Path(cache_dir_env, "download")
else:
    cache_dir = Path(Path("~").expanduser(), ".cache", "qemu", "download")

if not cache_dir.exists():
    print(f"Cache dir {cache_dir} does not exist!", file=sys.stderr)
    sys.exit(1)

os.chdir(cache_dir)

for file in cache_dir.iterdir():
    # Only consider the files that use a sha256 as filename:
    if len(file.name) != 64:
        continue

    stampfile = file.with_suffix(".stamp")
    try:
        timestamp = int(stampfile.read_text())
    except FileNotFoundError:
        # Assume it's an old file that was already in the cache before we
        # added the code for evicting stale assets. Use the release date
        # of QEMU v10.1 as a default timestamp.
        timestamp = time.mktime((2025, 8, 26, 0, 0, 0, 0, 0, 0))

    age = time.time() - timestamp

    # Delete files older than half of a year (183 days * 24h * 60m * 60s)
    if age > 15811200:
        print(f"Removing {cache_dir}/{file.name}.")
        file.chmod(stat.S_IWRITE)
        file.unlink()
        stampfile.unlink()
