summaryrefslogtreecommitdiffstats
path: root/scripts/clear_cache.py
blob: 39cebe362172e7fdff26bb1974c54aa61f25b983 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#!/bin/python3

# A simple script to clean caches matching a PR ID.
#
# Expects a GitHub token in the environment variables as GITHUB_TOKEN.

import json
import os
import sys
import time
from urllib.error import HTTPError, URLError

from urllib.request import Request, urlopen

URL = "https://api.github.com/repos/ClementTsang/bottom/actions/caches"


def cache_list_request(key):
    request = Request(URL, method="GET")
    request.add_header("Accept", "application/vnd.github+json")
    request.add_header("Authorization", "Bearer {}".format(key))
    return request


def delete_cache_request(key, id):
    request = Request("{}/{}".format(URL, id), method="DELETE")
    request.add_header("Accept", "application/vnd.github+json")
    request.add_header("Authorization", "Bearer {}".format(key))
    return request


def main():
    args = sys.argv
    env = os.environ

    key = env["GITHUB_TOKEN"]
    if args[1].isnumeric():
        pr_id = int(args[1])
        ref = "refs/pull/{}/merge".format(pr_id)

        print("Clearing any caches generated by PR {}".format(pr_id))
        with urlopen(cache_list_request(key)) as response:
            response = json.load(response)
            caches = response["actions_caches"]
            for cache in caches:
                if cache["ref"] == ref:
                    id = cache["id"]
                    try:
                        print("Deleting ID {}...".format(id))
                        urlopen(delete_cache_request(key, id))
                    except HTTPError as e:
                        print("HTTPError with delete, error code {}.".format(e.code))
                    except URLError as _:
                        print("URLError with delete.")
                    else:
                        print("Successfully deleted cache ID {}!".format(id))
                    time.sleep(0.1)
    elif args[1] == "keep-main" or args[1] == "keep-master":
        print("Clearing all but default branch cache.")
        with urlopen(cache_list_request(key)) as response:
            response = json.load(response)
            caches = response["actions_caches"]
            for cache in caches:
                if not ("master" in cache["ref"] or "main" in cache["ref"]):
                    id = cache["id"]
                    try:
                        print("Deleting ID {}...".format(id))
                        urlopen(delete_cache_request(key, id))
                    except HTTPError as e:
                        print("HTTPError with delete, error code {}.".format(e.code))
                    except URLError as _:
                        print("URLError with delete.")
                    else:
                        print("Successfully deleted cache ID {}!".format(id))
                    time.sleep(0.1)
    elif args[1] == "main" or args[1] == "master" or args[1] == "all":
        print("Clearing all caches.")
        with urlopen(cache_list_request(key)) as response:
            response = json.load(response)
            caches = response["actions_caches"]
            for cache in caches:
                id = cache["id"]
                try:
                    print("Deleting ID {}...".format(id))
                    urlopen(delete_cache_request(key, id))
                except HTTPError as e:
                    print("HTTPError with delete, error code {}.".format(e.code))
                except URLError as _:
                    print("URLError with delete.")
                else:
                    print("Successfully deleted cache ID {}!".format(id))
                time.sleep(0.1)
    else:
        print(f"Skipping, given argument {args[1]}.")


if __name__ == "__main__":
    main()