import subprocess import sys def repoquery(*args): lines = subprocess.check_output( ['dnf5', 'repoquery', '--repo=rawhide', *args], text=True) return [line.strip() for line in lines.splitlines() if not ('Updating and loading repositories' in line or 'Repositories loaded' in line)] rpms = set(sys.argv[1:]) if not rpms: rpms = {*repoquery(r'--qf=%{name}\n', '--whatprovides', '/sbin/*'), *repoquery(r'--qf=%{name}\n', '--whatprovides', '/usr/sbin/*')} for n, rpm in enumerate(sorted(rpms)): files = repoquery('-l', rpm) bin_files = {file[5:] for file in files if file.startswith('/bin')} sbin_files = {file[6:] for file in files if file.startswith('/sbin')} usr_bin_files = {file[9:] for file in files if file.startswith('/usr/bin')} usr_sbin_files = {file[10:] for file in files if file.startswith('/usr/sbin')} assert sbin_files or usr_sbin_files bin_overlap = bin_files & sbin_files usr_bin_overlap = usr_bin_files & usr_sbin_files prefix = rpm if bin_overlap or usr_bin_overlap: print(f'{prefix}:', ', '.join((("/bin overlap",) if bin_overlap else ()) + (("/usr/bin overlap",) if usr_bin_overlap else ()))) prefix = ' ' * len(rpm) for file in sorted(sbin_files): if users := repoquery('-C', r'--qf=%{name}\n', '--whatrequires', f'/sbin/{file}'): print(f"{prefix}: /sbin/{file} required by: {' '.join(users)}") prefix = ' ' * len(rpm) for file in sorted(usr_sbin_files): if users := repoquery('-C', r'--qf=%{name}\n', '--whatrequires', f'/usr/sbin/{file}'): print(f"{prefix}: /usr/sbin/{file} required by: {' '.join(users)}") prefix = ' ' * len(rpm) if prefix == rpm: print(f"{prefix}:")