2015-07-19 09:32:32 +02:00
|
|
|
import json
|
2015-07-16 15:09:26 +02:00
|
|
|
|
2015-07-19 09:32:32 +02:00
|
|
|
from osc import oscerr
|
|
|
|
from osc.core import delete_project
|
2015-08-27 18:42:39 +08:00
|
|
|
from osc.core import show_package_meta
|
2016-12-29 16:27:11 -06:00
|
|
|
|
2015-07-16 15:09:26 +02:00
|
|
|
from osclib.select_command import SelectCommand
|
2015-07-19 09:32:32 +02:00
|
|
|
from osclib.request_finder import RequestFinder
|
2017-01-13 01:16:05 -06:00
|
|
|
from osclib.request_splitter import RequestSplitter
|
2015-08-27 18:42:39 +08:00
|
|
|
from xml.etree import cElementTree as ET
|
2015-07-16 15:09:26 +02:00
|
|
|
|
|
|
|
class AdiCommand:
|
|
|
|
def __init__(self, api):
|
|
|
|
self.api = api
|
|
|
|
|
2015-07-19 09:32:32 +02:00
|
|
|
def check_adi_project(self, project):
|
|
|
|
query_project = 'adi:' + project.split(':adi:')[1]
|
|
|
|
query = {'format': 'json'}
|
|
|
|
url = self.api.makeurl(('project', 'staging_projects', self.api.project,
|
|
|
|
query_project), query=query)
|
|
|
|
info = json.load(self.api.retried_GET(url))
|
|
|
|
if len(info['building_repositories']):
|
2016-10-25 11:53:59 +02:00
|
|
|
print query_project, "still building"
|
|
|
|
return
|
|
|
|
if len(info['untracked_requests']):
|
2016-12-29 16:27:11 -06:00
|
|
|
print query_project, "untracked:", ', '.join(['%s[%s]'%(req['package'], req['number']) for req in info['untracked_requests']])
|
|
|
|
return
|
2016-10-25 11:53:59 +02:00
|
|
|
if len(info['obsolete_requests']):
|
2016-12-29 16:27:11 -06:00
|
|
|
print query_project, "obsolete:", ', '.join(['%s[%s]'%(req['package'], req['number']) for req in info['obsolete_requests']])
|
2015-07-19 09:32:32 +02:00
|
|
|
return
|
|
|
|
if len(info['broken_packages']):
|
2016-12-29 16:27:11 -06:00
|
|
|
print query_project, "broken:", ', '.join([p['package'] for p in info['broken_packages']])
|
2015-07-19 09:32:32 +02:00
|
|
|
return
|
|
|
|
for review in info['missing_reviews']:
|
2016-10-25 11:53:59 +02:00
|
|
|
print query_project, "missing review by {} for {}[{}]".format(review['by'], review['package'], review['request'])
|
2015-07-19 09:32:32 +02:00
|
|
|
return
|
2016-12-29 16:27:11 -06:00
|
|
|
if self.api.is_user_member_of(self.api.user, 'factory-staging'):
|
|
|
|
print query_project, "is ready"
|
|
|
|
for req in info['selected_requests']:
|
|
|
|
print " - %s [%s]"%(req['package'], req['number'])
|
|
|
|
self.api.rm_from_prj(project, request_id=req['number'], msg='ready to accept')
|
|
|
|
delete_project(self.api.apiurl, project)
|
|
|
|
else:
|
|
|
|
print query_project, "ready:", ', '.join(['%s[%s]'%(req['package'], req['number']) for req in info['selected_requests']])
|
|
|
|
|
2015-07-19 09:32:32 +02:00
|
|
|
def check_adi_projects(self):
|
|
|
|
for p in self.api.get_adi_projects():
|
|
|
|
self.check_adi_project(p)
|
2015-07-16 15:09:26 +02:00
|
|
|
|
2016-05-30 19:21:14 +08:00
|
|
|
def create_new_adi(self, wanted_requests, by_dp=False, split=False):
|
2017-01-13 01:16:05 -06:00
|
|
|
requests = self.api.get_open_requests()
|
|
|
|
splitter = RequestSplitter(self.api, requests, in_ring=False)
|
|
|
|
splitter.filter_add('./action[@type="submit"]')
|
|
|
|
if len(wanted_requests):
|
2017-02-10 10:05:38 -06:00
|
|
|
splitter.filter_add_requests([str(p) for p in wanted_requests])
|
2017-01-13 01:16:05 -06:00
|
|
|
# wanted_requests forces all requests into a single group.
|
|
|
|
else:
|
|
|
|
if split:
|
|
|
|
splitter.group_by('./@id')
|
|
|
|
elif by_dp:
|
2017-01-31 18:36:54 -06:00
|
|
|
splitter.group_by('./action/target/@devel_project')
|
2015-07-28 13:01:30 +02:00
|
|
|
else:
|
2017-01-13 01:16:05 -06:00
|
|
|
splitter.group_by('./action/source/@project')
|
|
|
|
splitter.split()
|
2015-07-28 13:01:30 +02:00
|
|
|
|
2017-01-13 01:16:05 -06:00
|
|
|
for group in sorted(splitter.grouped.keys()):
|
|
|
|
print(group if group != '' else 'wanted')
|
2015-09-09 15:26:05 +08:00
|
|
|
|
2017-01-13 01:16:05 -06:00
|
|
|
name = None
|
|
|
|
for request in splitter.grouped[group]['requests']:
|
|
|
|
request_id = int(request.get('id'))
|
|
|
|
target_package = request.find('./action/target').get('package')
|
|
|
|
line = '- sr#{}: {:<30}'.format(request_id, target_package)
|
2015-07-16 15:09:26 +02:00
|
|
|
|
2017-01-13 01:16:05 -06:00
|
|
|
if request_id in self.requests_ignored:
|
|
|
|
print(line + '\n ignored: ' + self.requests_ignored[request_id])
|
2015-11-19 20:23:10 +08:00
|
|
|
continue
|
|
|
|
|
2017-01-13 01:16:05 -06:00
|
|
|
# Auto-superseding request in adi command
|
|
|
|
if self.api.update_superseded_request(request):
|
|
|
|
print(line + ' (superseded)')
|
2017-01-10 01:27:40 -06:00
|
|
|
continue
|
|
|
|
|
2017-01-13 01:16:05 -06:00
|
|
|
# Only create staging projec the first time a non superseded
|
|
|
|
# request is processed from a particular group.
|
|
|
|
if name is None:
|
|
|
|
name = self.api.create_adi_project(None)
|
2015-07-16 15:09:26 +02:00
|
|
|
|
2017-01-13 01:16:05 -06:00
|
|
|
if not self.api.rq_to_prj(request_id, name):
|
2015-07-28 11:16:52 +02:00
|
|
|
return False
|
2015-07-19 09:32:32 +02:00
|
|
|
|
2017-01-13 01:16:05 -06:00
|
|
|
# Notify everybody about the changes.
|
|
|
|
self.api.update_status_comments(name, 'select')
|
|
|
|
print(line + ' (staged in {})'.format(name))
|
2015-08-25 07:12:08 +02:00
|
|
|
|
2016-05-30 19:21:14 +08:00
|
|
|
def perform(self, packages, move=False, by_dp=False, split=False):
|
2015-07-19 09:32:32 +02:00
|
|
|
"""
|
|
|
|
Perform the list command
|
|
|
|
"""
|
2017-01-10 01:27:40 -06:00
|
|
|
self.requests_ignored = self.api.get_ignored_requests()
|
2015-07-19 09:32:32 +02:00
|
|
|
if len(packages):
|
|
|
|
requests = set()
|
2015-08-25 07:12:08 +02:00
|
|
|
if move:
|
|
|
|
items = RequestFinder.find_staged_sr(packages, self.api).items()
|
|
|
|
print items
|
|
|
|
for request, request_project in items:
|
|
|
|
staging_project = request_project['staging']
|
|
|
|
self.api.rm_from_prj(staging_project, request_id=request)
|
|
|
|
self.api.add_review(request, by_group=self.api.cstaging_group, msg='Please recheck')
|
|
|
|
else:
|
|
|
|
items = RequestFinder.find_sr(packages, self.api).items()
|
|
|
|
|
|
|
|
for request, request_project in items:
|
2015-07-19 09:32:32 +02:00
|
|
|
requests.add(request)
|
2016-05-30 19:21:14 +08:00
|
|
|
self.create_new_adi(requests, split=split)
|
2015-07-19 09:32:32 +02:00
|
|
|
else:
|
2015-07-19 10:10:30 +02:00
|
|
|
self.check_adi_projects()
|
2015-08-06 13:49:04 +02:00
|
|
|
if self.api.is_user_member_of(self.api.user, 'factory-staging'):
|
2016-05-30 19:40:56 +08:00
|
|
|
self.create_new_adi((), by_dp=by_dp, split=split)
|