blob: ce742b1c97d9d14a095311ab1b6ca5ee8e307370 [file] [log] [blame]
Paul Sokolovsky0d918162024-08-12 18:05:20 +03001#!/usr/bin/env -S python3 -u
2#
3# Copyright (c) 2024 Arm Limited. All rights reserved.
4#
5# SPDX-License-Identifier: BSD-3-Clause
6#
7import argparse
8import datetime
9import re
10from subprocess import check_call, check_output
11
12
13REMOTE = "ssh://%s@review.trustedfirmware.org:29418/TF-A/trusted-firmware-a"
14
15
16def check_call_maybe_dry(args, cmd):
17 if args.dry_run:
18 print("Would run:", " ".join(cmd))
19 return
20 check_call(cmd)
21
22
23def main():
24 argp = argparse.ArgumentParser(description="Clean up old sandbox tags/branches in TF-A project")
25 argp.add_argument("--user", help="user to connect to Gerrit")
26 argp.add_argument("--limit", type=int, default=-1, help="limit deletions to this number")
27 argp.add_argument("--dry-run", action="store_true", help="don't perform any changes")
28 args = argp.parse_args()
29
30 if not args.user:
31 argp.error("--user parameter is required")
32 global REMOTE
33 REMOTE = REMOTE % args.user
34
35 cutoff = (datetime.datetime.now() - datetime.timedelta(days=90)).strftime("%Y%m%d")
36
37 print("Cutoff date:", cutoff)
38
39 del_cnt = 0
40
41 def process_ref_pattern(ref_pat):
42 nonlocal del_cnt
43
44 out = check_output(["git", "ls-remote", REMOTE, ref_pat], text=True)
45
46 for line in out.rstrip().split("\n"):
47 rev, tag = line.split(None, 1)
48 m = re.match(r".+-(\d{8}T\d{4})", tag)
49 delete = False
50 if not m:
51 print("Warning: Cannot parse timestamp from tag '%s', assuming stray ref and deleting" % tag)
52 delete = True
53 else:
54 tstamp = m.group(1)
55 delete = tstamp < cutoff
56
57 if delete:
58 check_call_maybe_dry(args, ["git", "push", REMOTE, ":" + tag])
59 del_cnt += 1
60 if del_cnt == args.limit:
61 break
62
63 process_ref_pattern("refs/tags/sandbox/*")
64 if del_cnt != args.limit:
65 process_ref_pattern("refs/heads/sandbox/*")
66
67
68if __name__ == "__main__":
69 main()