diff --git a/config.ini b/config.ini new file mode 100644 index 000000000..e55bf200a --- /dev/null +++ b/config.ini @@ -0,0 +1,9 @@ +[current] +url=https://copr.fedorainfracloud.org +owner=@fedora-llvm-team +project=clang-built-f36 + +[next] +url=https://copr.fedorainfracloud.org +owner=@fedora-llvm-team +project=clang-built-f37 diff --git a/copr-reporter/config.ini b/copr-reporter/config.ini new file mode 100644 index 000000000..4ced87939 --- /dev/null +++ b/copr-reporter/config.ini @@ -0,0 +1,7 @@ +[current] +owner=@fedora-llvm-team +project=clang-built-f35 + +[next] +owner=@fedora-llvm-team +project=clang-built-f36 diff --git a/copr-reporter/f36.ini b/copr-reporter/f36.ini new file mode 100644 index 000000000..9e084da28 --- /dev/null +++ b/copr-reporter/f36.ini @@ -0,0 +1,9 @@ +[current] +url=https://copr.fedorainfracloud.org +owner=@fedora-llvm-team +project=clang-built-f35 + +[next] +url=https://copr.fedorainfracloud.org +owner=@fedora-llvm-team +project=clang-built-f36 diff --git a/copr-reporter/f37.ini b/copr-reporter/f37.ini new file mode 100644 index 000000000..e55bf200a --- /dev/null +++ b/copr-reporter/f37.ini @@ -0,0 +1,9 @@ +[current] +url=https://copr.fedorainfracloud.org +owner=@fedora-llvm-team +project=clang-built-f36 + +[next] +url=https://copr.fedorainfracloud.org +owner=@fedora-llvm-team +project=clang-built-f37 diff --git a/copr-reporter/html_generator.py b/copr-reporter/html_generator.py new file mode 100644 index 000000000..1c2141990 --- /dev/null +++ b/copr-reporter/html_generator.py @@ -0,0 +1,64 @@ +import json +import datetime +import configparser +import io +import urllib.request + +import jinja2 + + +# TODO: Add a summary of the new broken packages +# TODO: Add in the summary the total amount of packages +def generate_report(title, results, description): + loader = jinja2.FileSystemLoader(searchpath="./") + environment = jinja2.Environment(loader=loader) + file = "template.html" + + template = environment.get_template(file) + text = template.render( + title=title, + date=datetime.datetime.now().isoformat(), + results=results, + description = description + ) + report = open("report.html", 'w') + report.write(text) + report.close() + +def get_combined_build_state(chroots): + state = 'succeeded' + for c in chroots: + chroot = chroots[c] + if chroot['state'] == 'failed': + state = 'failed' + break + return state + +if __name__ == '__main__': + title = "Clang Mass Rebuild TODO dashboard" + packages = {} + with open("packages.json", "r") as f: + packages = json.load(f) + + current_ver = None + next_ver = None + + for k, v in packages.items(): + packages[k]['changed'] = 'Same results' + state_a = get_combined_build_state(packages[k]['builds_a']['chroots']) + state_b = get_combined_build_state(packages[k]['builds_b']['chroots']) + if state_a == 'succeeded' and state_b == 'failed': + packages[k]['changed'] = "Regression" + elif state_a == 'failed' and state_b == 'succeeded': + packages[k]['changed'] = "Fixed" + elif state_a != state_b: + packages[k]['changed'] = "Something has changed. You should verify the builds" + + description = f""" + Explanation of the columns: + """ + generate_report(title, packages, description) diff --git a/copr-reporter/json_generator.py b/copr-reporter/json_generator.py new file mode 100644 index 000000000..14bc6b9e7 --- /dev/null +++ b/copr-reporter/json_generator.py @@ -0,0 +1,106 @@ +import json +import configparser +from copr.v3 import Client +from munch import Munch +import sys + + +def load_config(file): + c = configparser.ConfigParser() + c.read(file) + return c + +def create_missing_package(name): + return Munch(name = name, state = 'missing', builds = {'latest' : None }) + +def create_missing_build(arch): + return Munch(name = arch, state = 'missing', result_url = '') + +def retrieve_packages(client, project_owner, project_name): + response = client.monitor_proxy.monitor(project_owner, project_name, additional_fields = ['url_build_log']) + return response['packages'] + +def get_package(name, pkg_list): + for p in pkg_list: + if p['name'] == name: + return p + +def handle_missing_packages(packages_a, packages_b): + + for p_a in packages_a: + p_b = get_package(p_a['name'], packages_b) + if not p_b: + packages_b.append({'name' : p_a['name'], 'chroots' : {} }) + + for p_b in packages_b: + p_a = get_package(p_b['name'], packages_a) + if not p_a: + packages_a.append({'name' : p_b['name'], 'chroots' : {} }) + +def get_chroot_arch(chroot): + return chroot.split('-')[-1] + +def has_arch(builds, arch): + for build in builds: + if get_chroot_arch(build.name) == arch: + return True + return False + +def retrieve_builds(client, package): + + latest_build = package.builds['latest'] + if not latest_build: + return [] + + # When a build has state of succeeded, we don't need to query COPR for + # more information, because we know the builds have succeeded for all + # chroots. A 'failed' state means that there was at least 1 failure, + # so in that case we still need to query COPR to see which chroots + # suceeded and which chroots failed. + if latest_build['state'] == 'succeeded': + builds = [] + for c in sorted(latest_build['chroots']): + builds.append(Munch(name=c, result_url='{}/{}/0{}-{}/'.format(latest_build['repo_url'], c, latest_build['id'], package.name), + state = latest_build['state'])) + return builds + + + b = client.build_chroot_proxy.get_list(package.builds['latest']['id']) + return b + + +def create_copr_client(configfile = None, copr_url = None): + if copr_url: + config = {'copr_url' : copr_url } + return Client(config) + + return Client.create_from_config_file(configfile) + +if __name__ == '__main__': + config_file = './config.ini' + if len(sys.argv) == 2: + config_file = sys.argv[1] + config = load_config(file=config_file) + client_a = create_copr_client(copr_url = config.get('current', 'url', fallback = None), + configfile = config.get('current', 'config', fallback = None)) + client_b = create_copr_client(copr_url = config.get('next', 'url', fallback = None), + configfile = config.get('next', 'config', fallback = None)) + packages_a = retrieve_packages(client_a, config['current']['owner'], config['current']['project']) + packages_b = retrieve_packages(client_b, config['next']['owner'], config['next']['project']) + handle_missing_packages(packages_a, packages_b) + + project_b = client_b.project_proxy.get(config['next']['owner'], config['next']['project']) + chroot_b = list(project_b['chroot_repos'].keys())[0] + os_version_b = "-".join(chroot_b.split('-')[0:2]) + packages = {} + sort_key = lambda x : x['name'] + for pa, pb in zip(sorted(packages_a, key = sort_key), sorted(packages_b, key = sort_key)): + new_package = {'name' : pa['name'], + 'os_version' : os_version_b, + 'builds_a' : pa, + 'builds_b' : pb + } + packages[pa['name']] = new_package + + with open("packages.json", "w") as out: + json.dump(packages, out, indent=2) diff --git a/copr-reporter/template.html b/copr-reporter/template.html new file mode 100644 index 000000000..05f6be3ca --- /dev/null +++ b/copr-reporter/template.html @@ -0,0 +1,146 @@ + + + + + + + + + + {{ title }} + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + {% for name, data in results.items() -%} + + + + + + + {% endfor %} + +
NameBuilds with current clang releaseBuilds with next clang releaseChangesNotes
NameBuilds with current clang releaseBuilds with next clang releaseChangesNotes
{{ name }} + {% for k, b in data["builds_a"]["chroots"].items()|sort() %} +

+ {% if b.state == "importing" or b.state == "pending" %} + + {% endif %} + {% if b.state == "starting" or b.state == "running" %} + + {% endif %} + {% if b.state == "succeeded" or b.state == "forked" or b.state == "skipped" %} + + {% endif %} + {% if b.state == "failed" %} + + {% endif %} + {% if b.state == "canceled" %} + + {% endif %} + {{ k.split('-')[-1] }} +

+ {% endfor %} +
+ {% for k, b in data["builds_b"]["chroots"].items()|sort() %} +

+ {% if b.state == "importing" or b.state == "pending" %} + + {% endif %} + {% if b.state == "starting" or b.state == "running" %} + + {% endif %} + {% if b.state == "succeeded" or b.state == "forked" or b.state == "skipped" %} + + {% endif %} + {% if b.state == "failed" %} + + {% endif %} + {% if b.state == "canceled" %} + + {% endif %} + {% if b.url is not none %} + {{ k.split('-')[-1] }} + {% else %} + {{ b.arch }} + {% endif %} + +

+ {% endfor %} +
+ {{ data['changed'] }} + {{ data['note'] }}
+
+
+ + + + + + + diff --git a/f36.ini b/f36.ini new file mode 100644 index 000000000..9e084da28 --- /dev/null +++ b/f36.ini @@ -0,0 +1,9 @@ +[current] +url=https://copr.fedorainfracloud.org +owner=@fedora-llvm-team +project=clang-built-f35 + +[next] +url=https://copr.fedorainfracloud.org +owner=@fedora-llvm-team +project=clang-built-f36 diff --git a/f37.ini b/f37.ini new file mode 100644 index 000000000..e55bf200a --- /dev/null +++ b/f37.ini @@ -0,0 +1,9 @@ +[current] +url=https://copr.fedorainfracloud.org +owner=@fedora-llvm-team +project=clang-built-f36 + +[next] +url=https://copr.fedorainfracloud.org +owner=@fedora-llvm-team +project=clang-built-f37 diff --git a/status/fedora-37.cfg b/status/fedora-37.cfg new file mode 100644 index 000000000..4b12c8ac6 --- /dev/null +++ b/status/fedora-37.cfg @@ -0,0 +1,82 @@ +[wontfix] +arpack: Fortran +glibmm24: This package was renamed to glibmm2.4: https://src.fedoraproject.org/rpms/glibmm24/c/ba9985b79c07dcf06ca055efbc32fa8715c32660?branch=rawhide +gtkmm30: This package was renamed to gtkmm3.0: https://src.fedoraproject.org/rpms/gtkmm30/c/1478076589a10e983c8de6a2a9f20095095c31ab?branch=rawhide +enchant2: mingw +flexiblas: Fortran +geos: mingw +sord: FTBFS: https://bugzilla.redhat.com/show_bug.cgi?id=2113731 +SuperLU: Fortran +hdf: Fortran +libspatialite: mingw + +[willfix] +acpica-tools: https://src.fedoraproject.org/rpms/acpica-tools/pull-request/4 https://github.com/acpica/acpica/pull/648 +atlas: libtatlas.so.3.10 was built with gcc +bacula: Need gcc symlink +bind: Test failure +bolt: Test failure +boost: RPM file not found +bpftrace: Package not built with clang +btrfs-fuse: error: use of undeclared identifier 'XFS_IOC_ALLOCSP64' +ceph: Requires gcc specific command -flto-partition=none when building with LTO. +check: ppc64le test failure +cjose: [-Werror,-Wstrict-prototypes] Need Upstream Bug +clucene: [-Wc++11-narrowing] Needs Upstream Bug +cmake: Test failure +cmocka: Test failure +criu: Build system does some kind of merging of command line arguments error: unknown argument: '-fcf-protection-O2'. Need Upstream Bug +cyrus-imapd: Seems like a problem with FORTIFY_SOURCE +dav1d: ppc64le error: initializer element is not a compile-time constant +debugedit: Test failure +device-mapper-multipath: See https://bugs.kde.org/show_bug.cgi?id=430429 valgrind.h file needs to be updated. Need Upstream Bug +device-mapper-persistent-data: Package not built with clang +dovecot: -fstack-reuse=none +dpdk: Uses GCC_VERSION macro on ppc64le +dtc: [-Werror,-Wcast-qual] [-Werror,-Wself-assign] +dyninst: error: invalid argument '-std=c11' not allowed with 'C++' +edk2: -Werror,-Wunknown-warning-option Needs Upstream Bug +elfutils: error: redefinition of typedef 'debuginfod_client' is a C11 feature [-Werror,-Wtypedef-redefinition] +emacs: Package not built with clang +freeradius: Fails with "Can not find suitable object file" even with LTO disabled. +frr: Testsuite failure +gcc: asprintf +gdb: [-Werror,-Wdeprecated-copy] +glib2: See https://bugs.kde.org/show_bug.cgi?id=430429 valgrind.h file needs to be updated. Need Upstream Bug +glm: [-Werror,-Wimplicit-int-conversion] Need Upstream Bug +gmp: aarch64 test failure +gnu-efi: -maccumulate-outgoing-args +gnutls: --generate-missing-build-notes +grubby: Needs gcc symlink +highway: ppc64le test failure +hunspell: Uses profile flags +java-1.8.0-openjdk: Wants GCC explicitly +java-11-openjdk: Wants GCC explicitly +java-17-openjdk: Wants GCC explicitly +jss: Build system reverses the compiler arguments, so we end up with --config -Wp,-D_GLIBCXX_ASSERTIONS +krb5: [-Werror,-Wimplicit-function-declaration] Fails due to https://bugzilla.redhat.com/show_bug.cgi?id=2083876 +ksh: [-Wint-conversion] Need Upstream Bug +lensfun: [-Wreserved-user-defined-literal] Need Upstream Bug +libb2: rpath problem with OpenMP due to: https://github.com/llvm/llvm-project/commit/a80d5c34e4b99f21fa371160ac7eb7e9db093997 +libffi: Error parsing s390x assembly +libjpeg-turbo: Test failure on s390x +liblognorm: asprintfA +libmpc: ppc64le Test failure +libmpcdec: Needs LTO disabled, LDFLAGS not respected. +libnftnl: error: no member named '__builtin___snprintf_chk' in 'struct obj_ops' +libpsm2: [-Werror,-Wunused-but-set-variable] +libraqm: Fixed upstream: https://github.com/HOST-Oman/libraqm/commit/3f50e35d239059823162cbfba3c7adfe8e5f1907 and in rawhide: https://src.fedoraproject.org/rpms/libraqm/c/251210182c9524ed4fa2c1fa89430fa83aa51d8c?branch=rawhide +librdkafka: Spec file has %define _lto_cflags -flto=auto -ffat-lto-objects +libreswan: Fixed in upstream spec file: https://github.com/libreswan/libreswan/commit/f979aae6dfc9a6da08b6521e1458157b4bea1fca +libstoragemgmt: error: passing an object that undergoes default argument promotion to 'va_start' has undefined behavior [-Werror,-Wvarargs] +libuser: Fixed in rawhide +libvma: error: 'gettid' is missing exception specification 'throw()' +memcached: [-Werror,-Wstrict-prototypes] Need Upstream Bug +mptcpd: [-Werror,-Wstrict-prototypes] Need Upstream Bug +ogdi: [-Wint-conversion] Needs Upstream Bug +openbios: Package not built with clang +opensc: [-Werror,-Wdeprecated-non-prototype] Need Upstream Bug +pbzip2: [-Wreserved-user-defined-literal] Need Upstream Bug. Fedora Fix: https://src.fedoraproject.org/rpms/pbzip2/pull-request/2 +raptor2: [-Wint-conversion] Need Upstream Bug +uuid: "libtool: compile: unable to infer tagged configuration" I think this is failing because libtool was built with gcc. +zziplib: [-Wint-conversion] Need Upstream Bug diff --git a/template.html b/template.html new file mode 100644 index 000000000..e17445b17 --- /dev/null +++ b/template.html @@ -0,0 +1,148 @@ + + + + + + + + + + {{ title }} + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + {% for name, data in results.items() -%} + + + + + + + {% endfor %} + +
NameBuilds with current clang releaseBuilds with next clang releaseChangesNotes
NameBuilds with current clang releaseBuilds with next clang releaseChangesNotes
{{ name }} + {% for k, b in data["builds_a"]["chroots"].items()|sort() %} +

+ {% if b.state == "importing" or b.state == "pending" %} + + {% endif %} + {% if b.state == "starting" or b.state == "running" %} + + {% endif %} + {% if b.state == "succeeded" or b.state == "forked" or b.state == "skipped" %} + + {% endif %} + {% if b.state == "failed" %} + + {% endif %} + {% if b.state == "canceled" %} + + {% endif %} + {{ k.split('-')[-1] }} +

+ {% endfor %} +
+ {% for k, b in data["builds_b"]["chroots"].items()|sort() %} +

+ {% if b.state == "importing" or b.state == "pending" %} + + {% endif %} + {% if b.state == "starting" or b.state == "running" %} + + {% endif %} + {% if b.state == "succeeded" or b.state == "forked" or b.state == "skipped" %} + + {% endif %} + {% if b.state == "failed" %} + + {% endif %} + {% if b.state == "canceled" %} + + {% endif %} + {% if b.url is not none %} + {{ k.split('-')[-1] }} + {% else %} + {{ b.arch }} + {% endif %} + +

+ {% endfor %} +
+ {% if data['changed'] == 'Regression' %} + {{ data['changed'] }} + {% endif %} + {{ data['note'] }}
+
+
+ + + + + + + diff --git a/todo_generator.py b/todo_generator.py new file mode 100644 index 000000000..3b66b204a --- /dev/null +++ b/todo_generator.py @@ -0,0 +1,123 @@ +import configparser +import json +from copr.v3 import Client +import sys +import io +import urllib + +def load_config(file): + c = configparser.ConfigParser() + c.read(file) + return c + +def create_copr_client(configfile = None, copr_url = None): + if copr_url: + config = {'copr_url' : copr_url } + return Client(config) + + return Client.create_from_config_file(configfile) + +def get_package(name, pkg_list): + for p in pkg_list: + if p['name'] == name: + return p + + return None + +def get_combined_build_state(chroots): + state = 'succeeded' + for c in chroots: + chroot = chroots[c] + if chroot['state'] == 'failed': + state = 'failed' + break + return state + +def handle_missing_builds(builds_a, builds_b): + arches = set([]) + for builds in [builds_a, builds_b]: + for build in builds: + arch = build.name.split('-')[-1] + if arch not in arches: + arches.add(arch) + + for arch in arches: + for builds in [builds_a, builds_b]: + if not has_arch(builds, arch): + builds.append(create_missing_build(arch)) + + + +config_file = './config.ini' +if len(sys.argv) == 2: + config_file = sys.argv[1] +config = load_config(file=config_file) +client_next = create_copr_client(copr_url = config.get('next', 'url', fallback = None), + configfile = config.get('next', 'config', fallback = None)) +client_current = create_copr_client(copr_url = config.get('current', 'url', fallback = None), + configfile = config.get('current', 'config', fallback = None)) +packages_next = client_next.package_proxy.get_list(config['next']['owner'], + config['next']['project'], + pagination={"order": "name"}, + with_latest_build=True) + +missing = [] +failed = [] + +project_current = client_current.project_proxy.get(config['current']['owner'], config['current']['project']) +project_next = client_current.project_proxy.get(config['next']['owner'], config['next']['project']) +#print(project_current) +#print(project_next) + +response = client_next.monitor_proxy.monitor(config['next']['owner'], config['next']['project'], additional_fields = ['url_build_log']) +packages_next = response['packages'] +response = client_current.monitor_proxy.monitor(config['current']['owner'], config['current']['project'], additional_fields = ['url_build_log']) +packages_current = response['packages'] + +#print(json.dumps(packages_next)) + +results = {} + +next_chroot = list(project_next['chroot_repos'].keys())[0] +next_os_version = "-".join(next_chroot.split('-')[0:2]) +try: + filename = f'status/{next_os_version}.cfg' + notes_file = open(filename) + notes_cfg = configparser.ConfigParser() + notes_cfg.optionxform = str + notes_cfg.read_file(notes_file) +except Exception as e: + print(e, f"Failed to load notes file: {filename}") + notes_cfg = {'willfix' : {}, 'wontfix' : {}} + +for p in packages_next: + state = get_combined_build_state(p['chroots']) + if state == 'succeeded': + continue + + if p['name'] in notes_cfg['wontfix']: + continue + + failed.append(p) + +for p_next in failed: + p_current = get_package(p_next['name'], packages_current) + if not p_current: + p_current = {'name' : p_next['name'], 'chroots' : {} } + for c in project_current['chroot_repos']: + if c in p_current['chroots']: + continue + p_current['chroots'][c] = { 'state' : 'missing', 'url_build_log' : '' } + result = {} + result['name'] = p_next['name'] + result['os_version'] = next_os_version + result['builds_a'] = p_current + result['builds_b'] = p_next + result['note'] = '' + if p_next['name'] in notes_cfg['willfix']: + result['note'] = notes_cfg['willfix'][p_next['name']] + + results[p_next['name']] = result + +with open("packages.json", "w") as out: + json.dump(results, out, indent=2) diff --git a/update.py b/update.py index fbee1dce0..9da8fa6cd 100644 --- a/update.py +++ b/update.py @@ -43,7 +43,7 @@ def get_package_base_link(self): def get_package_link(self, pkg): return '{}{}'.format(self.get_package_base_link(), pkg.name) - def get_packages(self, clang_gcc_br_pkgs_fedoran): + def get_packages(self, clang_gcc_br_pkgs_fedora): pkgs = {} for p in self.client.package_proxy.get_list(self.owner, self.project, with_latest_succeeded_build=True, with_latest_build=True): build_passes = True @@ -254,7 +254,7 @@ def get_other_pkg_status(self): return self.STATUS_PASS - def html_row(self, index, pkg_notes = None): + def html_row(self, index, pkg_notes): row_style='' clang_nvr='' build_success = False @@ -467,11 +467,18 @@ def get_gcc_clang_users_fedora(): q = q.filter(requires=['gcc', 'gcc-c++', 'clang']) return set([p.name for p in list(q)]) -def update_status(mutex): - while not mutex.locked(): - time.sleep(10) - print("Processing...") - sys.stdout.flush() +def get_package_notes(fedora_version): + try: + notes_cfg = open(f'status/fedora-{fedora_version}.cfg') + except: + return {} + config = configparser.ConfigParser() + config.optionxform = str + config.read_file(notes_cfg) + notes = {} + for s in config.sections(): + notes.update(config[s]) + return notes cgitb.enable() @@ -483,12 +490,6 @@ def update_status(mutex): executor = concurrent.futures.ThreadPoolExecutor(max_workers=3) -# Run a thread to periodically write to stdout to avoid the web server -# timing out. There's probably a way to increase the web server timeout -# but I could not figure it out. -status_mutex = threading.Lock() -executor.submit(update_status, status_mutex) - clang_gcc_br_pkgs_fedora = executor.submit(get_gcc_clang_users_fedora) # Exclude clang and llvm packages. @@ -510,19 +511,23 @@ def update_status(mutex): use_copr = True +f35 = CoprResults(u'https://copr.fedorainfracloud.org', '@fedora-llvm-team', 'clang-built-f35') +f36 = CoprResults(u'https://copr.fedorainfracloud.org', '@fedora-llvm-team', 'clang-built-f36') +f37 = CoprResults(u'https://copr.fedorainfracloud.org', '@fedora-llvm-team', 'clang-built-f37') + comparisons = [ -(KojiResults('f35'), CoprResults(u'https://copr.fedorainfracloud.org', '@fedora-llvm-team', 'clang-built-f35')), -(KojiResults('f36'), CoprResults(u'https://copr.fedorainfracloud.org', '@fedora-llvm-team', 'clang-built-f36')), -(KojiResults('f37'), CoprResults(u'https://copr.fedorainfracloud.org', '@fedora-llvm-team', 'clang-built-f37')), -(CoprResults(u'https://copr.fedorainfracloud.org', '@fedora-llvm-team', 'clang-built-f35'), CoprResults(u'https://copr.fedorainfracloud.org', '@fedora-llvm-team', 'clang-built-f36')), -(CoprResults(u'https://copr.fedorainfracloud.org', '@fedora-llvm-team', 'clang-built-f36'), CoprResults(u'https://copr.fedorainfracloud.org', '@fedora-llvm-team', 'clang-built-f37')), +(KojiResults('f35'), f35), +(KojiResults('f36'), f36), +(KojiResults('f37'), f37), +(f35, f36), +(f36, f37), ] # Assume copr-reporter is in the current directory if len(tags) !=1 and os.path.isdir('./copr-reporter'): - pages = ['f36'] + pages = ['f36', 'f37'] print("COPR REPORTER", pages) old_cwd = os.getcwd() @@ -535,8 +540,19 @@ def update_status(mutex): subprocess.call('cp report.html {}/copr-reporter-{}.html'.format(old_cwd, p), shell = True) os.chdir(old_cwd) + for p in pages: + print('TODO', p) + subprocess.call(f'python3 ./todo_generator.py ./copr-reporter/{p}.ini', shell = True) + subprocess.call('python3 ./copr-reporter/html_generator.py', shell = True) + subprocess.call(f'cp report.html {p}-todo.html', shell = True) for results in comparisons: + + # Get list of package notes + fedora_version = results[1].project[-2:] + print("Compare: ", fedora_version) + package_notes = executor.submit(get_package_notes, fedora_version) + stats = Stats() file_prefix = results[0].get_file_prefix(True) @@ -580,6 +596,11 @@ def update_status(mutex): c.package_base_link = results[1].get_package_base_link() + if c.pkg.name in package_notes.result(): + c.add_note(package_notes.result()[c.pkg.name]) + elif '__error' in package_notes.result(): + c.add_note('Failed to load notes: {}'.format(package_notes.result()['__error'])) + test_pkg = test_pkgs.get(c.pkg.name, None) if not test_pkg: stats.num_missing += 1 @@ -608,9 +629,9 @@ def update_status(mutex): Fedora 35 Fedora 36 Fedora 37 - Clang f35 vs f36 - Clang f36 vs f37 - """) + Clang f35 vs f36(Detailed) + Clang f36 vs f37(Detailed) + TODO

""") f.write(stats.html_table()) f.write(""" @@ -628,12 +649,11 @@ def update_status(mutex): FedoraFedora Clang Latest BuildLatest BuildLatest SuccessNotes""") for index, c in enumerate(pkg_compare_list): - f.write(c.html_row(index)) + f.write(c.html_row(index, package_notes.result())) f.write("") f.close() -status_mutex.acquire() executor.shutdown(True) page_redirect='index.html'