blob: 76b1dde3a2e84b6a08156ff5b74ce8ffe5d4c28d [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"
Paul Sokolovsky3769d282024-08-22 13:06:56 +030014# Remove references having timestamps older than so many days.
15CUTOFF_DAYS = 30
Paul Sokolovsky0d918162024-08-12 18:05:20 +030016
17
18def check_call_maybe_dry(args, cmd):
19 if args.dry_run:
20 print("Would run:", " ".join(cmd))
21 return
22 check_call(cmd)
23
24
25def main():
26 argp = argparse.ArgumentParser(description="Clean up old sandbox tags/branches in TF-A project")
27 argp.add_argument("--user", help="user to connect to Gerrit")
28 argp.add_argument("--limit", type=int, default=-1, help="limit deletions to this number")
29 argp.add_argument("--dry-run", action="store_true", help="don't perform any changes")
30 args = argp.parse_args()
31
32 if not args.user:
33 argp.error("--user parameter is required")
34 global REMOTE
35 REMOTE = REMOTE % args.user
36
Paul Sokolovsky3769d282024-08-22 13:06:56 +030037 cutoff = (datetime.datetime.now() - datetime.timedelta(days=CUTOFF_DAYS)).strftime("%Y%m%d")
Paul Sokolovsky0d918162024-08-12 18:05:20 +030038
39 print("Cutoff date:", cutoff)
40
41 del_cnt = 0
42
43 def process_ref_pattern(ref_pat):
44 nonlocal del_cnt
45
46 out = check_output(["git", "ls-remote", REMOTE, ref_pat], text=True)
47
48 for line in out.rstrip().split("\n"):
49 rev, tag = line.split(None, 1)
50 m = re.match(r".+-(\d{8}T\d{4})", tag)
51 delete = False
52 if not m:
53 print("Warning: Cannot parse timestamp from tag '%s', assuming stray ref and deleting" % tag)
54 delete = True
55 else:
56 tstamp = m.group(1)
57 delete = tstamp < cutoff
58
59 if delete:
60 check_call_maybe_dry(args, ["git", "push", REMOTE, ":" + tag])
61 del_cnt += 1
62 if del_cnt == args.limit:
63 break
64
65 process_ref_pattern("refs/tags/sandbox/*")
66 if del_cnt != args.limit:
67 process_ref_pattern("refs/heads/sandbox/*")
68
69
70if __name__ == "__main__":
71 main()