forked from msvsphere/leapp-repository
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
4.2 KiB
94 lines
4.2 KiB
#!/usr/bin/python3
|
|
|
|
import json
|
|
import os
|
|
import re
|
|
import sys
|
|
|
|
import copr.v3
|
|
|
|
ENV_VARS = {
|
|
'_COPR_CONFIG': '~/.config/copr', # Copr config file. Get it through https://<copr instance>/api/.
|
|
'COPR_OWNER': '', # Owner of the Copr project
|
|
'COPR_PROJECT': '', # The Copr project to search
|
|
'COPR_PACKAGE': '', # Name of the package to look for. This is optional - if empty, any package in the
|
|
# project is considered.
|
|
'PKG_RELEASE': '', # The release part of the pkg NEVRA string, e.g.
|
|
# 0.201906041623Z.f82f863.add_missing_deps.PR231
|
|
'COPR_REPO': '', # An alternative to COPR_OWNER & COPR_PROJECT. This env var should hold "owner/project".
|
|
'REGEX': '' # A more general way to search for release_id matches via regex. Generalization of PKG_RELEASE
|
|
}
|
|
# override defaults with environment variables
|
|
for env, default in ENV_VARS.items():
|
|
ENV_VARS[env] = os.getenv(env, default)
|
|
|
|
|
|
def _fail(error):
|
|
if not error.endswith('\n'):
|
|
error += '\n'
|
|
sys.stderr.write(error)
|
|
# dump ENV dictionary
|
|
sys.stderr.write('Passed (or default) environment variables:\n')
|
|
for var, value in ENV_VARS.items():
|
|
sys.stderr.write(' {}: {}\n'.format(var, value))
|
|
sys.exit(1)
|
|
|
|
|
|
def get_builds(ownername, projectname, configpath, client=None, debug=False):
|
|
client = client or copr.v3.Client(copr.v3.config_from_file(path=configpath))
|
|
builds = client.build_proxy.get_list(status='succeeded',
|
|
pagination={'order': 'id', 'order_type': 'DESC'},
|
|
ownername=ownername,
|
|
projectname=projectname,
|
|
packagename=ENV_VARS['COPR_PACKAGE'])
|
|
if debug:
|
|
json.dump(builds, sys.stderr, sort_keys=True, indent=2)
|
|
sys.stderr.write('\n')
|
|
return builds
|
|
|
|
|
|
def get_latest_build(ownername, projectname, configpath, match_criteria, client=None, debug=False):
|
|
client = client or copr.v3.Client(copr.v3.config_from_file(path=configpath))
|
|
builds = get_builds(ownername, projectname, configpath, client, debug)
|
|
for build in builds:
|
|
# Version in COPR contains VERSION-RELEASE string. We need just the release.
|
|
full_name = '{}-{}'.format(build['source_package']['name'], build['source_package']['version'])
|
|
release = build['source_package']['version'].split('-')[-1]
|
|
if re.match(match_criteria, full_name) or release.startswith(match_criteria):
|
|
return build['id']
|
|
return None
|
|
|
|
|
|
if __name__ == "__main__":
|
|
# Vet arguments in ENV first
|
|
ownername = ENV_VARS['COPR_OWNER']
|
|
projectname = ENV_VARS['COPR_PROJECT']
|
|
if ENV_VARS['COPR_REPO']:
|
|
if '/' in ENV_VARS['COPR_REPO']:
|
|
ownername, projectname = ENV_VARS['COPR_REPO'].split('/', 1)
|
|
else:
|
|
projectname = ENV_VARS['COPR_REPO']
|
|
# If after all those actions either owner or project is not defined - give up and fail
|
|
if not ownername or not projectname:
|
|
error = ('Error: Use either COPR_REPO env var in a format "owner/project" or '
|
|
'COPR_OWNER & COPR_PROJECT env vars to specify the Copr repository to search in.')
|
|
_fail(error)
|
|
# Check that match criteria is defined
|
|
match_criteria = ENV_VARS['REGEX'] or ENV_VARS['PKG_RELEASE']
|
|
# If both REGEX and PKG_RELEASE have been set - inform that regex takes over
|
|
if ENV_VARS['REGEX'] and ENV_VARS['PKG_RELEASE']:
|
|
sys.stderr.write('Warning: Both REGEX and PKG_RELEASE were set - REGEX has higher priority\n')
|
|
if not match_criteria:
|
|
error = 'Error: Use either PKG_RELEASE or REGEX env var to specify the match condition for NEVRA string.'
|
|
_fail(error)
|
|
build_id = get_latest_build(ownername=ownername,
|
|
projectname=projectname,
|
|
configpath=os.path.expandvars(ENV_VARS['_COPR_CONFIG']),
|
|
match_criteria=match_criteria,
|
|
debug='--debug' in sys.argv[1:])
|
|
if not build_id:
|
|
error = 'Error: The build with the required release has not been found: {}'.format(match_criteria)
|
|
_fail(error)
|
|
# Output the id of the latest matching build
|
|
print(build_id)
|