openSUSE-release-tools/osclib/check_duplicate_binaries_command.py

48 lines
1.8 KiB
Python

from __future__ import print_function
from osc.core import get_binarylist
from osclib.core import package_list
from osclib.core import target_archs
import re
import yaml
class CheckDuplicateBinariesCommand(object):
def __init__(self, api):
self.api = api
def perform(self, save=False):
duplicates = {}
for arch in sorted(target_archs(self.api.apiurl, self.api.project), reverse=True):
print('arch {}'.format(arch))
binaries = {}
duplicates[arch] = {}
for package in package_list(self.api.apiurl, self.api.project):
for binary in get_binarylist(self.api.apiurl, self.api.project,
'standard', arch, package):
# StagingAPI.fileinfo_ext(), but requires lots of calls.
match = re.match(r'(.*)-([^-]+)-([^-]+)\.([^-\.]+)\.rpm', binary)
if not match or match.group(4) == 'src': continue
name = match.group(1)
if name in binaries:
print('DUPLICATE', package, binaries[name], name)
if name not in duplicates[arch]:
# Only add the first package found once.
duplicates[arch][name] = [binaries[name]]
duplicates[arch][name].append(package)
continue
binaries[name] = package
print(package, name)
if save:
args = ['{}:Staging'.format(self.api.project), 'dashboard', 'duplicate_binaries']
previous = self.api.load_file_content(*args)
current = yaml.dump(duplicates, default_flow_style=False)
if current != previous:
args.append(current)
self.api.save_file_content(*args)