50 lines
1.9 KiB
Plaintext
50 lines
1.9 KiB
Plaintext
|
#!/bin/python3
|
||
|
|
||
|
# This script looks for the 'latest' comps-fXX.xml.in file, assumes it's
|
||
|
# for Rawhide, and looks through its `pkgreq` lines for ones that specify
|
||
|
# packages that do not currently exist in Rawhide. It is arch-aware. It
|
||
|
# expects to be run on a Fedora system with network access, as it will
|
||
|
# try to query the 'rawhide' dnf repo to get lists of currently-existing
|
||
|
# packages.
|
||
|
|
||
|
import glob
|
||
|
import subprocess
|
||
|
import xml.etree.ElementTree as ET
|
||
|
|
||
|
ARCHES = ('aarch64', 'armv7hl', 'i686', 'ppc64le', 's390x', 'x86_64')
|
||
|
|
||
|
# gather package lists. this eats lots of RAM. I don't care.
|
||
|
pkgs = {}
|
||
|
for arch in ARCHES:
|
||
|
pkgtext = subprocess.run(('dnf', '--forcearch={}'.format(arch), '--disablerepo=*', '--enablerepo=rawhide', 'repoquery', '--qf=%{NAME}'), capture_output=True, text=True).stdout
|
||
|
pkgs[arch] = pkgtext.splitlines()
|
||
|
|
||
|
# find the *latest* comps file (assume it's rawhide)
|
||
|
compsfiles = glob.glob('comps-f*.xml.in')
|
||
|
latest = sorted(compsfiles, key=lambda x: int(''.join(c for c in x if c.isdigit())))[-1]
|
||
|
# find package reqs in comps
|
||
|
root = ET.parse(latest).getroot()
|
||
|
pkgreqs = root.findall('.//packagereq')
|
||
|
|
||
|
# check!
|
||
|
for pkgreq in pkgreqs:
|
||
|
# list of arches the package is missing on
|
||
|
missing = []
|
||
|
# arches the package is listed for (if no 'arch' key, it's listed for all)
|
||
|
reqarches = pkgreq.get('arch', '').replace('armhfp', 'armv7hl').replace('i386', 'i686').replace('ppc64,','')
|
||
|
if reqarches:
|
||
|
reqarches = reqarches.split(',')
|
||
|
else:
|
||
|
reqarches = ARCHES
|
||
|
|
||
|
# do the actual check, append arch to 'missing' if it's not there
|
||
|
for arch in reqarches:
|
||
|
if arch in pkgs and pkgreq.text not in pkgs[arch]:
|
||
|
missing.append(arch)
|
||
|
|
||
|
# print the result
|
||
|
if missing == list(ARCHES):
|
||
|
print('Package {} not found for any arch'.format(pkgreq.text))
|
||
|
elif missing:
|
||
|
print('Package {} not found for arches {}'.format(pkgreq.text, ', '.join(missing)))
|