Instead of declining the by_project review, unselect the request and decline the group review. This way we avoid the OBS problem
68 lines
2.7 KiB
Python
68 lines
2.7 KiB
Python
from osc import conf
|
|
from osc.core import get_request
|
|
from osclib.comments import CommentAPI
|
|
from osclib.request_finder import RequestFinder
|
|
|
|
class UnselectCommand(object):
|
|
CLEANUP_WHITELIST = 'origin-manager'
|
|
|
|
def __init__(self, api):
|
|
self.api = api
|
|
self.config_init(api)
|
|
self.comment = CommentAPI(self.api.apiurl)
|
|
|
|
@classmethod
|
|
def config_init(cls, api):
|
|
config = conf.config[api.project]
|
|
|
|
cleanup_whitelist = config.get('unselect-cleanup-whitelist', cls.CLEANUP_WHITELIST)
|
|
cls.cleanup_whitelist = cleanup_whitelist.split()
|
|
|
|
cls.cleanup_days = int(config.get('unselect-cleanup-days', 7))
|
|
|
|
@staticmethod
|
|
def filter_obsolete(request, updated_delta):
|
|
if request.get('state') == 'superseded':
|
|
# Allow for cases where a request is superseded, but a newer request
|
|
# is never staged due all newer requests being superseded/declined.
|
|
return updated_delta.days >= UnselectCommand.cleanup_days
|
|
|
|
if (request.get('state') == 'revoked' or
|
|
(request.get('state') == 'declined' and (
|
|
request.get('creator') in UnselectCommand.cleanup_whitelist or
|
|
updated_delta.days >= UnselectCommand.cleanup_days))):
|
|
return True
|
|
|
|
return False
|
|
|
|
def perform(self, packages, cleanup, message):
|
|
"""
|
|
Remove request from staging project
|
|
:param packages: packages/requests to delete from staging projects
|
|
"""
|
|
|
|
if cleanup:
|
|
obsolete = self.api.project_status_requests('obsolete', self.filter_obsolete)
|
|
if len(obsolete) > 0:
|
|
print('Cleanup {} obsolete requests'.format(len(obsolete)))
|
|
packages += tuple(obsolete)
|
|
|
|
affected_projects = set()
|
|
for request, request_project in RequestFinder.find_staged_sr(packages,
|
|
self.api).items():
|
|
staging_project = request_project['staging']
|
|
affected_projects.add(staging_project)
|
|
print('Unselecting "{}" from "{}"'.format(request, staging_project))
|
|
self.api.rm_from_prj(staging_project, request_id=request)
|
|
|
|
req = get_request(self.api.apiurl, str(request))
|
|
if message:
|
|
self.api.add_ignored_request(request, message)
|
|
self.comment.add_comment(request_id=str(request), comment=message)
|
|
elif req.state.name in ('new', 'review'):
|
|
print(' Consider marking the request ignored to let others know not to restage.')
|
|
|
|
# Notify everybody about the changes
|
|
for prj in affected_projects:
|
|
self.api.update_status_or_deactivate(prj, 'unselect')
|