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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
#!/usr/bin/env python
# Copyright 2023 Orange, Deutsche Telekom AG
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import os
import shutil
import logging
import requests
from pygerrit2 import GerritRestAPI
logging.basicConfig(format="%(asctime)s %(levelname)s %(message)s",
level=logging.INFO)
logger = logging.getLogger("clean_repository")
rest = GerritRestAPI(url='https://gerrit.onap.org/r/')
PROJECT = "so"
GITLAB_PROJECT_ID = os.getenv('CI_PROJECT_ID', "24365265")
GITLAB_BASE_URL = os.getenv('CI_API_V4_URL', "https://gitlab.com/api/v4")
CI_HEADERS = { 'PRIVATE-TOKEN': os.getenv('CI_private_token',
"won't work") }
open_reviews = []
stale_reviews = []
results_to_delete = []
reviews_max_patchset = {}
reviews_several_patchsets = []
repositories_url = "{}/projects/{}/registry/repositories/".format(
GITLAB_BASE_URL, GITLAB_PROJECT_ID)
repositories = requests.get(repositories_url, headers=CI_HEADERS).json()
def tag_url(repository, tag):
return "{}/projects/{}/registry/repositories/{}/tags/{}".format(
GITLAB_BASE_URL, GITLAB_PROJECT_ID, repository['id'], tag['name'])
def delete_tag(repository, tag):
deletion = requests.delete(tag_url(repository, tag), headers=CI_HEADERS)
logger.info(deletion.text)
changes = rest.get("/changes/?q=project:{}%20status:open".format(PROJECT))
for change in changes:
open_reviews.append(change['_number'])
changes = rest.get("/changes/?q=age:1mon%20project:{}%20status:open".format(
PROJECT))
for change in changes:
stale_reviews.append(change['_number'])
logger.debug("%s reviews opened", len(open_reviews))
for repository in repositories:
logger.info("working on repository %s", repository['name'])
tags = requests.get(
"{}/projects/{}/registry/repositories/{}/tags?per_page=100".format(
GITLAB_BASE_URL, GITLAB_PROJECT_ID, repository['id'])).json()
for tag in tags:
review = int(tag['name'].split('-')[0])
patchset = int(tag['name'].split('-')[1])
if review in stale_reviews:
logger.info("review %6s is in stale_reviews, deleting %s",
review, tag['name'])
delete_tag(repository, tag)
else:
if review not in open_reviews:
logger.info(
"review %6s is in NOT open_reviews, deleting %s",
review, tag['name'])
delete_tag(repository, tag)
else:
logger.debug(
"review %6s is in open_reviews, looking for most recent patchset",
review)
if review in reviews_max_patchset:
logger.debug("review %6s has several patchsets, finding max",
review)
if review not in reviews_several_patchsets:
logger.debug(
"review %6s has several patchsets, adding to list",
review)
reviews_several_patchsets.append(review)
if reviews_max_patchset[review] < patchset:
logger.debug(
"current max patchset (%2s) for review %6s is smaller than this one: %2s",
reviews_max_patchset[review], review, patchset)
reviews_max_patchset[review] = patchset
else:
logger.debug("patchset %2s for review %6s is the first one",
patchset, review)
reviews_max_patchset[review] = patchset
for tag in tags:
logger.debug("tag: %s", tag['name'])
review = int(tag['name'].split('-')[0])
patchset = int(tag['name'].split('-')[1])
logger.debug("review: %6s", review)
logger.debug("patchset: %2s", patchset)
if review in reviews_several_patchsets:
logger.debug(
"review %6s has several patchset, keeping only the most recent",
review)
if patchset < reviews_max_patchset[review]:
logger.info(
"current patchset (%2s) of review %6s is smaller than most recent (%2s), deleting %s",
patchset, review, reviews_max_patchset[review],
tag['name'])
delete_tag(repository, tag)
|