EOL branch delete script speed up

The script originally clones every repository and branch, which takes
long time. This patch queries GITEA instead whether the branch exists
there and only clones a repository if it is necessary.

Change-Id: I0e164e15a5157f6e6a42ef7ca154f207308641b7
This commit is contained in:
Előd Illés 2022-12-05 19:23:24 +01:00
parent 1502a9d517
commit c73a4dd0d7
2 changed files with 62 additions and 11 deletions

View File

@ -18,11 +18,14 @@
import argparse
import getpass
import json
import sys
import requests
GERRIT_URL = 'https://review.opendev.org/'
GITEA_URL = 'https://opendev.org/api/v1'
def delete_branch(username, project_name, branch_id):
@ -37,27 +40,74 @@ def delete_branch(username, project_name, branch_id):
if response.status_code == 204:
print(f'Branch stable/{branch_id} successfully deleted '
f'from {project_name}!')
return 0
elif response.status_code == 401:
print('401 Unauthorized.')
return 1
else:
# NOTE(elod.illes): other possible errors from gerrit:
# 404: In case of project or branch is not found
# 409: Branch has open changes
print(f'Delete failed ({response.status_code}): {response.text}')
return 2
def is_branch_open(project_name, branch_id, quiet):
url = (f'{GITEA_URL}/repos/{project_name.replace("/", "%2F")}/'
f'branches/stable%2F{branch_id}')
response = requests.get(url)
try:
response_details = response.json()
except json.decoder.JSONDecodeError as exc:
print(f'ERROR: JSON decode failed ({exc})')
print(f'ERROR: ({response.status_code}): {response.text}')
print('Is the project name correct, like "openstack/nova"?')
return 4
if response.status_code == 200:
if not quiet:
print(f'stable/{branch_id} exists in {project_name}.')
return 0
elif ((response.status_code == 404) and
(response_details['errors'] == [f'branch does not exist [name: stable/{branch_id}]']) and
(response_details['message'] == "The target couldn't be found.")):
if not quiet:
print(f'stable/{branch_id} does not exist in {project_name}.')
return 1
else:
print(f'ERROR: ({response.status_code}): {response.text}')
return 2
def main():
parser = argparse.ArgumentParser(
description='Deletes stable/<branch> from <project>.')
parser.add_argument('username', help='Gerrit Username')
parser.add_argument('project', help='Project to delete from')
parser.add_argument('branch', help='Branch to delete')
subparsers = parser.add_subparsers(required=True, dest='command',
metavar='{delete,check}')
delete_parser = subparsers.add_parser(
'delete', help='Delete stable/<branch> from <project>')
delete_parser.add_argument('username', help='Gerrit Username')
delete_parser.add_argument('project', help='Project to delete from')
delete_parser.add_argument('branch', help='Branch to delete')
check_parser = subparsers.add_parser(
'check', help='Check if stable/<branch> exists for <project>')
check_parser.add_argument('project', help='Project to check')
check_parser.add_argument('branch', help='Branch to check if exists')
check_parser.add_argument(
'-q', '--quiet', action='store_true',
help='Return code only (0 means branch exists)')
args = parser.parse_args()
delete_branch(
args.username,
if args.command == 'delete':
return delete_branch(args.username,
args.project,
args.branch.replace('stable/', ''))
elif args.command == 'check':
return is_branch_open(args.project,
args.branch.replace('stable/', ''),
args.quiet)
if __name__ == '__main__':
main()
sys.exit(main())

View File

@ -86,18 +86,19 @@ function eol_tag_matches_head {
}
function is_eol {
clone_repo ${repo} stable/${em_branch}
cd ${repo} && git checkout -f -q stable/${em_branch} 2>/dev/null
${TOOLSDIR}/delete_stable_branch.py check --quiet ${repo} ${em_branch}
if [[ $? -eq 0 ]]; then
echo
echo "${repo} contains eol stale branch (${em_branch})"
clone_repo ${repo} stable/${em_branch}
cd ${repo}
if no_open_patches && eol_tag_matches_head; then
read -p "> Do you want to delete the branch stable/${em_branch} from ${repo} repository? [y/N]: " YN
if [ "${YN,,}" == "y" ]; then
if [ -z "$gerrit_username" ]; then
read -p "Gerrit username: " gerrit_username
fi
${TOOLSDIR}/delete_stable_branch.py ${gerrit_username} ${repo} ${em_branch}
${TOOLSDIR}/delete_stable_branch.py delete ${gerrit_username} ${repo} ${em_branch}
fi
fi
cd ..