124 lines
4.4 KiB
Python
Executable File
124 lines
4.4 KiB
Python
Executable File
#!/usr/bin/python
|
|
|
|
import argparse
|
|
import sys
|
|
from xml.etree import cElementTree as ET
|
|
|
|
import osc.conf
|
|
from osc.core import get_request_list
|
|
from osc.core import get_review_list
|
|
from osc.core import http_GET
|
|
from osc.core import makeurl
|
|
from osclib.conf import Config
|
|
from osclib.stagingapi import StagingAPI
|
|
|
|
|
|
def staging_api(args):
|
|
Config(args.project)
|
|
api = StagingAPI(osc.conf.config['apiurl'], args.project)
|
|
staging = '%s:Staging' % api.project
|
|
return (api, staging)
|
|
|
|
def devel_projects_get(apiurl, project):
|
|
"""
|
|
Returns a sorted list of devel projects for a given project.
|
|
|
|
Loads all packages for a given project, checks them for a devel link and
|
|
keeps a list of unique devel projects.
|
|
"""
|
|
devel_projects = {}
|
|
|
|
url = makeurl(apiurl, ['search', 'package'], "match=[@project='%s']" % project)
|
|
root = ET.parse(http_GET(url)).getroot()
|
|
for package in root.findall('package'):
|
|
devel = package.find('devel')
|
|
if devel is not None:
|
|
devel_projects[devel.attrib['project']] = True
|
|
|
|
return sorted(devel_projects)
|
|
|
|
def list(args):
|
|
devel_projects = devel_projects_get(osc.conf.config['apiurl'], args.project)
|
|
if len(devel_projects) == 0:
|
|
print('no devel projects found')
|
|
else:
|
|
out = '\n'.join(devel_projects)
|
|
print(out)
|
|
|
|
if args.write:
|
|
api, staging = staging_api(args)
|
|
if api.load_file_content(staging, 'dashboard', 'devel_projects') != out:
|
|
api.save_file_content(staging, 'dashboard', 'devel_projects', out)
|
|
|
|
def devel_projects_load(args):
|
|
api, staging = staging_api(args)
|
|
devel_projects = api.load_file_content(staging, 'dashboard', 'devel_projects')
|
|
|
|
if devel_projects:
|
|
return devel_projects.splitlines()
|
|
|
|
raise Exception('no devel projects found')
|
|
|
|
def requests(args):
|
|
apiurl = osc.conf.config['apiurl']
|
|
devel_projects = devel_projects_load(args)
|
|
|
|
for devel_project in devel_projects:
|
|
requests = get_request_list(apiurl, devel_project,
|
|
req_state=('new', 'review'),
|
|
req_type='submit',
|
|
# Seems to work backwards, as it includes only.
|
|
exclude_target_projects=[devel_project])
|
|
for request in requests:
|
|
action = request.actions[0]
|
|
print(' '.join((
|
|
request.reqid,
|
|
'/'.join((action.tgt_project, action.tgt_package)),
|
|
'/'.join((action.src_project, action.src_package)),
|
|
)))
|
|
|
|
def reviews(args):
|
|
apiurl = osc.conf.config['apiurl']
|
|
devel_projects = devel_projects_load(args)
|
|
|
|
for devel_project in devel_projects:
|
|
requests = get_review_list(apiurl, byproject=devel_project)
|
|
for request in requests:
|
|
action = request.actions[0]
|
|
if action.type != 'submit':
|
|
continue
|
|
|
|
for review in request.reviews:
|
|
if review.by_project == devel_project:
|
|
break
|
|
|
|
print(' '.join((
|
|
request.reqid,
|
|
'/'.join((review.by_project, review.by_package)) if review.by_package else review.by_project,
|
|
'/'.join((action.tgt_project, action.tgt_package)),
|
|
)))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
parser = argparse.ArgumentParser(description='Operate on devel projects for a given project.')
|
|
subparsers = parser.add_subparsers(title='subcommands')
|
|
|
|
parser.add_argument('-A', '--apiurl', metavar='URL', help='API URL')
|
|
parser.add_argument('-d', '--debug', action='store_true', help='print info useful for debuging')
|
|
parser.add_argument('-p', '--project', default='openSUSE:Factory', metavar='PROJECT', help='project from which to source devel projects')
|
|
|
|
parser_list = subparsers.add_parser('list', help='List devel projects.')
|
|
parser_list.set_defaults(func=list)
|
|
parser_list.add_argument('-w', '--write', action='store_true', help='write to dashboard container package')
|
|
|
|
parser_requests = subparsers.add_parser('requests', help='List open requests.')
|
|
parser_requests.set_defaults(func=requests)
|
|
|
|
parser_reviews = subparsers.add_parser('reviews', help='List open reviews.')
|
|
parser_reviews.set_defaults(func=reviews)
|
|
|
|
args = parser.parse_args()
|
|
osc.conf.get_config(override_apiurl=args.apiurl)
|
|
osc.conf.config['debug'] = args.debug
|
|
sys.exit(args.func(args))
|