Blob Blame History Raw
#!/usr/bin/python3

from jinja2 import Environment, FileSystemLoader, select_autoescape
import locale
import os
import subprocess
import sys

def start(msg):
    print("{}: \033[90m{} ... \033[39m".format(os.path.basename(sys.argv[0]), msg), file=sys.stderr, end="")
    sys.stderr.flush()

def done():
    print("\033[90mdone\033[39m", file=sys.stderr)

class Package(object):
    def __init__(self, name):
        self.name = name
        self.freedesktop_platform = 0
        self.freedesktop_platform_files = None
        self.gnome_platform = 0
        self.gnome_platform_files = None
        self.freedesktop_sdk = 0
        self.freedesktop_sdk_files = None
        self.gnome_sdk = 0
        self.gnome_sdk_files = None
        self.live = 0
        self.rf26 = 0

    @property
    def runtimes(self):
        return self.freedesktop_platform or self.gnome_platform or self.freedesktop_sdk or self.gnome_sdk

    @property
    def klass(self):
        k = ""
        if self.live and not self.runtimes:
            k = "live-only"
        if self.gnome_platform and not self.live:
            k = "not-on-live"

        if self.modules in ("", "installer"):
            k += " build"

        return k

    @property
    def modules(self):
        return package_to_module.get(self.name, "")

    @property
    def note(self):
        if self.gnome_platform and not self.live:
            return "platform package not on Live image"
        else:
            return ""

    def files_str(self, which):
        files = getattr(self, which + '_files')
        if files is None:
            return ''
        elif len(files) <= 3:
            return ' '.join(files)
        else:
            return ' '.join(files[:3]) + ' ...'

    @property
    def freedesktop_platform_files_str(self):
        return self.files_str('freedesktop_platform')

    @property
    def freedesktop_sdk_files_str(self):
        return self.files_str('freedesktop_sdk')

    @property
    def gnome_platform_files_str(self):
        return self.files_str('gnome_platform')

    @property
    def gnome_sdk_files_str(self):
        return self.files_str('gnome_sdk')

class Letter(object):
    def __init__(self, letter):
        self.letter = letter
        self.packages = []

#
# Get information about packages
#

packages = dict()
def add_package(name, which, level):
    pkg = packages.get(name, None)
    if pkg is None:
        pkg = Package(name)
        packages[name] = pkg
    if getattr(pkg, which) < level:
        setattr(pkg, which, level)

def add_packages(filename, which, resolve_deps=False):
    start("Adding packages from {}".format(filename))
    with open(filename) as f:
        packages = list(line.strip() for line in f)

    for package in packages:
        add_package(package, which, level=2)

    if resolve_deps:
        output = subprocess.check_output(['fedmod', 'resolve-deps'] + packages, encoding='utf-8')
        dep_packages = list(line.strip() for line in output.split())

        for package in dep_packages:
            add_package(package, which, level=1)
    done()

def add_package_files(filename, which):
    with open(filename) as f:
        for line in f:
            f, p = line.strip().split()
            f = f[:-1] # strip trailing :
            pkg = packages[p]
            old = getattr(pkg, which + '_files')
            if old is not None:
                old.append(f)
            else:
                setattr(pkg, which + '_files', [f])

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)
add_packages('out/gnome-Sdk.packages', 'gnome_sdk', resolve_deps=True)
add_packages('f27-live.packages', 'live')
add_packages('f26-flatpak-runtime.packages', 'rf26')

add_package_files('out/freedesktop-Platform.matched', 'freedesktop_platform')
add_package_files('out/freedesktop-Sdk.matched', 'freedesktop_sdk')
add_package_files('out/gnome-Platform.matched', 'gnome_platform')
add_package_files('out/gnome-Sdk.matched', 'gnome_sdk')

letters_map = dict()
for k, v in packages.items():
    l = v.name[0].upper()
    letter = letters_map.get(l, None)
    if letter is None:
        letter = Letter(l)
        letters_map[l] = letter
    letter.packages.append(v)

letters = []
for k in sorted(letters_map.keys()):
    letter = letters_map[k]
    letter.packages.sort(key=lambda p: locale.strxfrm(p.name))
    letters.append(letter)

start("Loading package to module map")
package_to_module = dict()

output = subprocess.check_output(['fedmod', 'list-rpms', '--list-modules'], encoding='utf-8')
for l in output.split('\n'):
    fields = l.strip().split()
    if len(fields) != 2:
        continue
    package_to_module[fields[0]] = fields[1][1:-1]
done()

#
# Get summary information for unmatched files
#

def count_lines(fname):
    with open(fname) as f:
        return len(list(f))

unmatched_counts = {
    'freedesktop_platform': count_lines('out/freedesktop-Platform.unmatched'),
    'gnome_platform': count_lines('out/gnome-Platform.unmatched'),
    'freedesktop_sdk': count_lines('out/freedesktop-Sdk.unmatched'),
    'gnome_sdk': count_lines('out/gnome-Sdk.unmatched'),
}

#
# Generate the report
#

env = Environment(
    loader=FileSystemLoader('.'),
    autoescape=select_autoescape(['html', 'xml']),
    trim_blocks=True,
    lstrip_blocks=True
)

template = env.get_template('report-template.html')

with open('report.html', 'w') as f:
    f.write(template.render(letters=letters, unmatched=unmatched_counts, package_to_module=package_to_module))