From 27ef6bdc76d554eadb3bce68e2b2a296561d248b Mon Sep 17 00:00:00 2001 From: Owen W. Taylor Date: Mar 20 2020 20:51:58 +0000 Subject: Mark package in the runtime with missing devel packages in the SDK --- diff --git a/reports/report.css b/reports/report.css index 5f6f99a..80fe6a7 100644 --- a/reports/report.css +++ b/reports/report.css @@ -108,7 +108,12 @@ td.root { padding: 0px; } td.extra { - background: #8888bb; + background: repeating-linear-gradient(-45deg, #999, #999 3px, #ccc 3px, #ccc 6px); + border: 1px solid #666666; + padding: 0px; +} +td.devel-missing { + background: repeating-linear-gradient(90deg, #999, #999 3px, #ccc 3px, #ccc 6px); border: 1px solid #666666; padding: 0px; } @@ -142,7 +147,7 @@ tr.waived { color: #006600; } tr.extra { - color: #000066; + color: #660066; } .hidden { display: none; diff --git a/runtime-template.html b/runtime-template.html index 0447eed..e7c990d 100644 --- a/runtime-template.html +++ b/runtime-template.html @@ -38,6 +38,7 @@ - Included because of files in runtime, also depended upon - Included because of dependencies - Listed as an extra package in package-notes.txt + - Pulled in as a dependency, no devel package in SDK
Mouse over shaded squares for details.
diff --git a/tools/generate-runtime-report.py b/tools/generate-runtime-report.py index 53df72c..428067e 100755 --- a/tools/generate-runtime-report.py +++ b/tools/generate-runtime-report.py @@ -7,6 +7,7 @@ import os import re import subprocess import sys +import util def start(msg): print("{}: \033[90m{} ... \033[39m".format(os.path.basename(sys.argv[0]), msg), file=sys.stderr, end="") @@ -25,6 +26,20 @@ _nvr_to_name_re = re.compile('^(.*)-[^-]*-[^-]*') def nvr_to_name(nvr): return _nvr_to_name_re.match(nvr).group(1) +def make_devel_packages(repo_info): + devel_packages = {} + + start("Making devel package map") + def cb(name, srpm): + if name.endswith('-devel'): + srpm_name = srpm.rsplit('-', 2)[0] + devel_packages[srpm_name] = name + done() + + util.foreach_package(repo_info, cb) + + return devel_packages + class Package(object): def __init__(self, name): self.name = name @@ -53,17 +68,22 @@ class Package(object): @property def klass(self): if self.flag == 'F': - return "flagged" - elif self.flag == 'F?': - return "questionable" - elif self.flag == 'FD': - return "flagged-dep" + klass = "flagged" + elif self. flag == 'F?': + klass = "questionable" + elif self. flag == 'FD': + klass = "flagged-dep" elif self.flag == 'W': - return "waived" + klass = "waived" elif self.flag is not None and self.flag.startswith('E'): - return "extra" - elif self.gnome_platform and not self.live: - return "questionable" + klass = "extra" + else: + klass = "" + + if self.source_package.devel_missing: + klass += ' devel-missing' + + return klass @property def modules(self): @@ -201,6 +221,14 @@ class SourcePackage(object): else: return "" + @property + def devel_missing(self): + devel = devel_packages.get(self.name) + if devel is not None: + return devel not in packages + else: + return False + class Letter(object): def __init__(self, letter): self.letter = letter @@ -306,6 +334,10 @@ def read_package_notes(): yield name, note, flag +devel_packages = util.get_repo_cacheable('devel-packages', make_devel_packages) +# Not gdk-pixbuf2-xlib-devel +devel_packages['gdk-pixbuf2'] = 'gdk-pixbuf2-devel' + add_packages('out/freedesktop-Platform.packages', 'freedesktop_platform', resolve_deps=True) add_packages('out/freedesktop-Sdk.packages', 'freedesktop_sdk', resolve_deps=True) add_packages('out/gnome-Platform.packages', 'gnome_platform', resolve_deps=True) diff --git a/tools/util.py b/tools/util.py index 324055e..91df779 100644 --- a/tools/util.py +++ b/tools/util.py @@ -116,6 +116,54 @@ def foreach_file(repo_info, cb): done() +class PackageMapHandler(xml.sax.handler.ContentHandler): + def __init__(self, cb): + self.cb = cb + self.name = None + self.sourcerpm = None + self.chars = None + + def startElement(self, name, attrs): + if name == 'package': + pass + elif name in ('name', 'rpm:sourcerpm'): + self.chars = '' + + def endElement(self, name): + if name == 'package': + self.cb(self.name, self.sourcerpm) + self.name = None + self.sourcerpm = None + elif name == 'name': + self.name = self.chars + self.chars = None + elif name == 'rpm:sourcerpm': + self.sourcerpm = self.chars + self.chars = None + + def characters(self, content): + if self.chars is not None: + self.chars += content + +def foreach_package(repo_info, cb): + for repo in REPOS: + start("Scanning files for {}".format(repo)) + repo_dir, repomd_contents = repo_info[repo] + root = ET.fromstring(repomd_contents) + + ns = {'repo': 'http://linux.duke.edu/metadata/repo'} + filelists_location = root.find("./repo:data[@type='primary']/repo:location", ns).attrib['href'] + filelists_path = os.path.join(repo_dir, filelists_location) + if os.path.commonprefix([filelists_path, repo_dir]) != repo_dir: + done() + error("{}: filelists directory is outside of repository".format(repo_dir)) + + handler = PackageMapHandler(cb) + with gzip.open(filelists_path, 'rb') as f: + xml.sax.parse(f, handler) + + done() + def get_repo_cacheable(name, generate): hash_text = '' repos_dir = os.path.join(XDG_CACHE_HOME, "fedmod/repos")