| #!/usr/bin/env -S python3 -u |
| # |
| # Copyright (c) 2024 Arm Limited. All rights reserved. |
| # |
| # SPDX-License-Identifier: BSD-3-Clause |
| # |
| import argparse |
| import datetime |
| import re |
| from subprocess import check_call, check_output |
| |
| |
| REMOTE = "ssh://%s@review.trustedfirmware.org:29418/TF-A/trusted-firmware-a" |
| # Remove references having timestamps older than so many days. |
| CUTOFF_DAYS = 30 |
| |
| |
| def check_call_maybe_dry(args, cmd): |
| if args.dry_run: |
| print("Would run:", " ".join(cmd)) |
| return |
| check_call(cmd) |
| |
| |
| def main(): |
| argp = argparse.ArgumentParser(description="Clean up old sandbox tags/branches in TF-A project") |
| argp.add_argument("--user", help="user to connect to Gerrit") |
| argp.add_argument("--limit", type=int, default=-1, help="limit deletions to this number") |
| argp.add_argument("--dry-run", action="store_true", help="don't perform any changes") |
| args = argp.parse_args() |
| |
| if not args.user: |
| argp.error("--user parameter is required") |
| global REMOTE |
| REMOTE = REMOTE % args.user |
| |
| cutoff = (datetime.datetime.now() - datetime.timedelta(days=CUTOFF_DAYS)).strftime("%Y%m%d") |
| |
| print("Cutoff date:", cutoff) |
| |
| del_cnt = 0 |
| |
| def process_ref_pattern(ref_pat): |
| nonlocal del_cnt |
| |
| out = check_output(["git", "ls-remote", REMOTE, ref_pat], text=True) |
| |
| for line in out.rstrip().split("\n"): |
| if not line: |
| break |
| rev, tag = line.split(None, 1) |
| m = re.match(r".+-(\d{8}T\d{4})", tag) |
| delete = False |
| if not m: |
| print("Warning: Cannot parse timestamp from tag '%s', assuming stray ref and deleting" % tag) |
| delete = True |
| else: |
| tstamp = m.group(1) |
| delete = tstamp < cutoff |
| |
| if delete: |
| check_call_maybe_dry(args, ["git", "push", REMOTE, ":" + tag]) |
| del_cnt += 1 |
| if del_cnt == args.limit: |
| break |
| |
| process_ref_pattern("refs/tags/sandbox/*") |
| if del_cnt != args.limit: |
| process_ref_pattern("refs/heads/sandbox/*") |
| |
| |
| if __name__ == "__main__": |
| main() |