2014-07-15 17:08:48 +02:00
|
|
|
import re
|
|
|
|
from xml.etree import cElementTree as ET
|
|
|
|
|
2014-02-28 11:45:06 +01:00
|
|
|
from osc.core import change_request_state
|
2014-07-15 10:43:11 +02:00
|
|
|
from osc.core import http_GET, http_PUT
|
|
|
|
from datetime import date
|
2014-05-20 12:26:29 +02:00
|
|
|
from osclib.comments import CommentAPI
|
2014-02-28 11:45:06 +01:00
|
|
|
|
2014-02-19 11:48:16 +01:00
|
|
|
|
2014-03-06 18:22:19 +01:00
|
|
|
class AcceptCommand(object):
|
2014-02-19 11:48:16 +01:00
|
|
|
def __init__(self, api):
|
|
|
|
self.api = api
|
2014-05-20 12:26:29 +02:00
|
|
|
self.comment = CommentAPI(self.api.apiurl)
|
2014-02-19 11:48:16 +01:00
|
|
|
|
2014-06-01 19:51:18 +02:00
|
|
|
def find_new_requests(self, project):
|
|
|
|
query = "match=state/@name='new'+and+(action/target/@project='{}'+and+action/@type='submit')".format(project)
|
|
|
|
url = self.api.makeurl(['search', 'request'], query)
|
|
|
|
|
|
|
|
f = http_GET(url)
|
|
|
|
root = ET.parse(f).getroot()
|
2014-07-15 17:08:48 +02:00
|
|
|
|
2014-08-15 15:38:27 +02:00
|
|
|
rqs = []
|
2014-06-01 19:51:18 +02:00
|
|
|
for rq in root.findall('request'):
|
2014-08-15 15:38:27 +02:00
|
|
|
pkgs = []
|
|
|
|
actions = rq.findall('action')
|
|
|
|
for action in actions:
|
|
|
|
targets = action.findall('target')
|
|
|
|
for t in targets:
|
|
|
|
pkgs.append(str(t.get('package')))
|
|
|
|
|
|
|
|
rqs.append({ 'id': int(rq.get('id')), 'packages': pkgs })
|
|
|
|
return rqs
|
2014-07-15 17:08:48 +02:00
|
|
|
|
2014-03-05 15:49:48 +01:00
|
|
|
def perform(self, project):
|
2014-02-26 14:51:01 +01:00
|
|
|
"""
|
|
|
|
Accept the staging LETTER for review and submit to factory
|
|
|
|
Then disable the build to disabled
|
|
|
|
:param project: staging project we are working with
|
|
|
|
"""
|
2014-07-15 10:43:11 +02:00
|
|
|
|
2014-02-19 11:48:16 +01:00
|
|
|
status = self.api.check_project_status(project)
|
|
|
|
|
|
|
|
if not status:
|
2014-02-26 14:51:01 +01:00
|
|
|
print('The project "{0}" is not yet acceptable.'.format(project))
|
2014-07-15 10:43:11 +02:00
|
|
|
return False
|
2014-02-19 11:48:16 +01:00
|
|
|
|
|
|
|
meta = self.api.get_prj_pseudometa(project)
|
|
|
|
requests = []
|
2014-06-16 17:15:24 +02:00
|
|
|
packages = []
|
2014-02-19 11:48:16 +01:00
|
|
|
for req in meta['requests']:
|
|
|
|
self.api.rm_from_prj(project, request_id=req['id'], msg='ready to accept')
|
2014-06-16 17:15:24 +02:00
|
|
|
requests.append(req['id'])
|
|
|
|
packages.append(req['package'])
|
2014-05-20 12:26:29 +02:00
|
|
|
msg = 'Accepting staging review for {0}'.format(req['package'])
|
|
|
|
print(msg)
|
|
|
|
|
2014-02-19 11:48:16 +01:00
|
|
|
for req in requests:
|
2014-03-05 15:49:48 +01:00
|
|
|
change_request_state(self.api.apiurl, str(req), 'accepted', message='Accept to factory')
|
2014-02-19 11:48:16 +01:00
|
|
|
|
2014-06-16 17:15:24 +02:00
|
|
|
# A single comment should be enough to notify everybody, since they are
|
|
|
|
# already mentioned in the comments created by select/unselect
|
|
|
|
pkg_list = ", ".join(packages)
|
|
|
|
cmmt = 'Project "{0}" accepted. The following packages have been submitted to factory: {1}.'.format(project, pkg_list)
|
|
|
|
self.comment.add_comment(project_name=project, comment=cmmt)
|
|
|
|
|
2014-05-20 12:26:29 +02:00
|
|
|
# XXX CAUTION - AFAIK the 'accept' command is expected to clean the messages here.
|
|
|
|
self.comment.delete_from(project_name=project)
|
|
|
|
|
2014-02-19 11:48:16 +01:00
|
|
|
self.api.build_switch_prj(project, 'disable')
|
2014-05-27 18:32:51 +02:00
|
|
|
if self.api.project_exists(project + ":DVD"):
|
|
|
|
self.api.build_switch_prj(project + ":DVD", 'disable')
|
|
|
|
|
2014-06-01 19:51:18 +02:00
|
|
|
return True
|
|
|
|
|
|
|
|
def accept_other_new(self):
|
2014-07-15 10:43:11 +02:00
|
|
|
changed = False
|
2014-08-07 12:39:41 +02:00
|
|
|
for req in self.find_new_requests('openSUSE:{}'.format(self.api.opensuse)):
|
2014-08-15 15:38:27 +02:00
|
|
|
print "accepting request %d: %s"%(req['id'], ','.join(req['packages']))
|
|
|
|
change_request_state(self.api.apiurl, str(req['id']), 'accepted', message='Accept to factory')
|
2014-07-15 10:43:11 +02:00
|
|
|
changed = True
|
2014-06-01 19:51:18 +02:00
|
|
|
|
2014-07-15 10:43:11 +02:00
|
|
|
return changed
|
|
|
|
|
|
|
|
def update_factory_version(self):
|
2014-08-07 12:39:41 +02:00
|
|
|
"""Update openSUSE (Factory, 13.2, ...) version if is necessary."""
|
|
|
|
project = 'openSUSE:{}'.format(self.api.opensuse)
|
|
|
|
url = self.api.makeurl(['source', project, '_product', 'openSUSE.product'])
|
2014-07-15 10:43:11 +02:00
|
|
|
|
2014-07-15 17:08:48 +02:00
|
|
|
product = http_GET(url).read()
|
|
|
|
curr_version = date.today().strftime('%Y%m%d')
|
|
|
|
new_product = re.sub(r'<version>\d{8}</version>', '<version>%s</version>' % curr_version, product)
|
|
|
|
|
|
|
|
if product != new_product:
|
|
|
|
http_PUT(url + "?comment=Update+version", data=new_product)
|