openSUSE-release-tools/osclib/list_command.py
Giacomo Leidi 3edc4f008c osclib/list_command.py: Show details also for requests targeted to packages not in rings.
This commit implements the ability to show for packages that do not
belong to any ring the same details that are shown for packages that do
live in rings.  Due to concerns about compatibility and volume of the
output the feature is hidden behind a new --adi-details command
line flag.
2024-11-06 16:06:18 +01:00

104 lines
3.6 KiB
Python

from __future__ import print_function
from colorama import Fore
from osclib.request_splitter import RequestSplitter
from osclib.supersede_command import SupersedeCommand
class ListCommand:
SOURCE_PROJECT_STRIP = [
'SUSE:SLE-12:',
'SUSE:SLE-12-',
'openSUSE:Leap:'
'openSUSE:',
'openSUSE.org:',
'home:',
]
def __init__(self, api):
self.api = api
def print_request(self, request):
hide_source = self.api.project == 'openSUSE:Factory'
request_id = int(request.get('id'))
action = request.find('action')
target_package = action.find('target').get('package')
ring = action.find('target').get('ring', None)
line = f"{request_id} {Fore.CYAN}{target_package:<30}{Fore.RESET}"
if ring:
ring_color = Fore.MAGENTA if ring.startswith('0') else ''
line += f" -> {ring_color}{ring:<12}{Fore.RESET}"
if not hide_source and action.find('source') is not None:
source_project = action.find('source').get('project')
source_project = self.project_strip(source_project)
line += f' ({Fore.YELLOW + source_project + Fore.RESET})'
if action.get('type') == 'delete':
line += ' (' + Fore.RED + 'delete request' + Fore.RESET + ')'
message = self.api.ignore_format(request_id)
if message:
line += '\n' + Fore.WHITE + message + Fore.RESET
print(' ', line)
def perform(self, supersede=False, adi_details=False):
"""
Perform the list command
"""
if supersede:
SupersedeCommand(self.api).perform()
requests = self.api.get_open_requests()
if not len(requests):
return
splitter = RequestSplitter(self.api, requests, in_ring=True)
splitter.group_by('./action/target/@devel_project')
splitter.split()
for group in sorted(splitter.grouped.keys()):
print(Fore.YELLOW + group)
for request in splitter.grouped[group]['requests']:
self.print_request(request)
if len(splitter.other):
non_ring_requests = splitter.other
if adi_details:
print('Not in a ring: ')
for request in non_ring_requests:
self.print_request(request)
else:
non_ring_packages = sorted(
request.find('./action/target').get('package')
for request in non_ring_requests)
print('Not in a ring: ' + ' '.join(non_ring_packages))
# Print requests not handled by staging process to highlight them.
splitter.stageable = False
for request_type in ('change_devel', 'set_bugowner'):
splitter.reset()
splitter.filter_add(f'./action[@type="{request_type}"]')
requests = splitter.filter_only()
if len(requests):
print(f'\n{request_type} request(s)')
for request in sorted(requests, key=lambda s: s.get('id')):
print(' {} {}'.format(
self.api.makeurl(['request', 'show', request.get('id')]),
request.find('./action/target').get('package')))
def project_strip(self, source_project):
home = source_project.startswith('home:')
for prefix in self.SOURCE_PROJECT_STRIP:
if source_project.startswith(prefix):
source_project = source_project[len(prefix):]
if home:
source_project = '~' + source_project
return source_project