public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
From: Owen W. Taylor <otaylor@fishsoup.net>
To: git-commits@fedoraproject.org
Subject: [flatpaks/flatpak-runtime] f45: Move tools and data files into subdirectories
Date: Fri, 11 Sep 2026 14:40:12 GMT	[thread overview]
Message-ID: <178913761293.1.7372116763432216545.flatpaks-flatpak-runtime-db33c7e13940@fedoraproject.org> (raw)

            A new commit has been pushed.

            Repo   : flatpaks/flatpak-runtime
            Branch : f45
            Commit : db33c7e1394080af25480222a6ac1bd16fb8a827
            Author : Owen W. Taylor <otaylor@fishsoup.net>
            Date   : 2018-01-31T11:21:01+01:00
            Stats  : +2839/-2835 in 18 file(s)
            URL    : https://src.fedoraproject.org/flatpaks/flatpak-runtime/c/db33c7e1394080af25480222a6ac1bd16fb8a827?branch=f45

            Log:
            Move tools and data files into subdirectories

Declutter the toplevel directory in preparation for merging this code into the
flatpak-runtime dist-git.

---
diff --git a/.gitignore b/.gitignore
index dad4e7d..73d7763 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
 out/*
 cache/*
 report.html
+tools/__pycache__
\ No newline at end of file

diff --git a/Makefile b/Makefile
index 6f25ae1..65b8cc2 100644
--- a/Makefile
+++ b/Makefile
@@ -15,17 +15,20 @@ FILE_LISTS = \
 
 all: report.html flatpak-runtime.yaml
 
-report.html $(PROFILE_FILES): $(PACKAGE_LISTS) package-notes.txt generate-report.py report-template.html
-	./generate-report.py
+report.html $(PROFILE_FILES): $(PACKAGE_LISTS) package-notes.txt tools/generate-report.py report-template.html
+	./tools/generate-report.py
 
-flatpak-runtime.yaml: $(PROFILE_FILES) flatpak-runtime.in.yaml generate-modulemd.py
-	./generate-modulemd.py
+$(FILE_LISTS): tools/generate-files.sh tools/list-files.py
+	./tools/generate-files.sh $@
 
-$(FILE_LISTS): %.files: generate-files.sh list-files.py
-	./generate-files.sh $@
+$(PACKAGE_LISTS): tools/resolve-files.py $(FILE_LISTS)
 
-%.packages: %.files resolve-files.py
-	./resolve-files.py $<
+	for f in $(patsubst %.packages,%.files,$(PACKAGE_LISTS)) ; do	\
+		./tools/resolve-files.py $$f ;		\
+	done
+
+flatpak-runtime.yaml: $(PROFILE_FILES) flatpak-runtime.in.yaml tools/generate-modulemd.py
+	./tools/generate-modulemd.py
 
 clean:
 	rm -f out/*

diff --git a/data/f26-flatpak-runtime.packages b/data/f26-flatpak-runtime.packages
new file mode 100644
index 0000000..538ff24
--- /dev/null
+++ b/data/f26-flatpak-runtime.packages
@@ -0,0 +1,204 @@
+abattis-cantarell-fonts
+acl
+adwaita-cursor-theme
+adwaita-gtk2-theme
+adwaita-icon-theme
+at-spi2-atk
+at-spi2-core
+atk
+audit-libs
+avahi-libs
+basesystem
+bash
+bzip2-libs
+ca-certificates
+cairo
+cairo-gobject
+chkconfig
+colord-libs
+coreutils
+coreutils-common
+cracklib
+crypto-policies
+cryptsetup-libs
+cups-libs
+dbus
+dbus-libs
+device-mapper
+device-mapper-libs
+elfutils-default-yama-scope
+elfutils-libelf
+elfutils-libs
+emacs-filesystem
+enchant
+expat
+fedora-modular-release
+fedora-modular-repos
+filesystem
+flatpak-runtime-config
+fontconfig
+fontpackages-filesystem
+freetype
+gawk
+gdbm
+gdk-pixbuf2
+gdk-pixbuf2-modules
+glib-networking
+glib2
+glibc
+glibc-all-langpacks
+glibc-common
+gmp
+gnome-desktop3
+gnome-themes-standard
+gnutls
+gobject-introspection
+graphite2
+grep
+gsettings-desktop-schemas
+gtk-update-icon-cache
+gtk2
+gtk3
+gvfs-client
+gzip
+harfbuzz
+hicolor-icon-theme
+hunspell
+hunspell-en-GB
+hunspell-en-US
+hwdata
+info
+iptables-libs
+jasper-libs
+jbigkit-libs
+json-glib
+keyutils-libs
+kmod-libs
+krb5-libs
+lcms2
+libX11
+libX11-common
+libXau
+libXcomposite
+libXcursor
+libXdamage
+libXext
+libXfixes
+libXft
+libXi
+libXinerama
+libXrandr
+libXrender
+libXtst
+libXxf86vm
+libacl
+libappstream-glib
+libarchive
+libattr
+libblkid
+libcap
+libcap-ng
+libcom_err
+libcroco
+libcrypt
+libdatrie
+libdb
+libdrm
+libepoxy
+libfdisk
+libffi
+libgcab1
+libgcc
+libgcrypt
+libglvnd
+libglvnd-egl
+libglvnd-glx
+libgpg-error
+libgusb
+libidn
+libidn2
+libjpeg-turbo
+libmodman
+libmount
+libnotify
+libpcap
+libpciaccess
+libpng
+libproxy
+libpwquality
+librsvg2
+libseccomp
+libselinux
+libsemanage
+libsepol
+libsigsegv
+libsmartcols
+libsoup
+libstdc++
+libstemmer
+libtasn1
+libthai
+libtiff
+libunistring
+libusbx
+libutempter
+libuuid
+libverto
+libwayland-client
+libwayland-cursor
+libwayland-server
+libxcb
+libxkbcommon
+libxml2
+libxshmfence
+lz4-libs
+lzo
+mesa-libEGL
+mesa-libGL
+mesa-libgbm
+mesa-libglapi
+mesa-libwayland-egl
+mpfr
+ncurses
+ncurses-base
+ncurses-libs
+nettle
+openssl-libs
+p11-kit
+p11-kit-trust
+pam
+pango
+pcre
+pixman
+popt
+python3
+python3-appdirs
+python3-cairo
+python3-gobject
+python3-gobject-base
+python3-libs
+python3-packaging
+python3-pip
+python3-pyparsing
+python3-setuptools
+python3-six
+qrencode-libs
+readline
+rest
+sed
+setup
+shadow-utils
+shared-mime-info
+sqlite-libs
+system-python
+system-python-libs
+systemd
+systemd-libs
+systemd-pam
+tzdata
+ustr
+util-linux
+xkeyboard-config
+xz-libs
+zenity
+zlib

diff --git a/data/f27-live.packages b/data/f27-live.packages
new file mode 100644
index 0000000..0d2f5ef
--- /dev/null
+++ b/data/f27-live.packages
@@ -0,0 +1,1561 @@
+aajohan-comfortaa-fonts
+abattis-cantarell-fonts
+abrt
+abrt-addon-ccpp
+abrt-addon-coredump-helper
+abrt-addon-kerneloops
+abrt-addon-pstoreoops
+abrt-addon-vmcore
+abrt-addon-xorg
+abrt-cli
+abrt-dbus
+abrt-desktop
+abrt-gui
+abrt-gui-libs
+abrt-java-connector
+abrt-libs
+abrt-plugin-bodhi
+abrt-retrace-client
+abrt-tui
+accountsservice
+accountsservice-libs
+acl
+adcli
+adobe-source-han-sans-cn-fonts
+adobe-source-han-sans-tw-fonts
+adobe-source-han-serif-cn-fonts
+adobe-source-han-serif-tw-fonts
+adwaita-cursor-theme
+adwaita-gtk2-theme
+adwaita-icon-theme
+adwaita-qt4
+adwaita-qt5
+alsa-lib
+alsa-plugins-pulseaudio
+alsa-ucm
+alsa-utils
+anaconda
+anaconda-core
+anaconda-gui
+anaconda-tui
+anaconda-user-help
+anaconda-widgets
+appstream-data
+apr
+apr-util
+argyllcms
+atk
+atkmm
+atmel-firmware
+at-spi2-atk
+at-spi2-core
+attr
+audit
+audit-libs
+audit-libs-python3
+augeas-libs
+authconfig
+autocorr-en
+avahi
+avahi-glib
+avahi-libs
+b43-fwcutter
+b43-openfwwf
+baobab
+basesystem
+bash
+bash-completion
+bc
+bcache-tools
+bind99-libs
+bind99-license
+bind-libs
+bind-libs-lite
+bind-license
+bind-utils
+blivet-gui-runtime
+bluez
+bluez-cups
+bluez-libs
+bluez-obexd
+boost-date-time
+boost-filesystem
+boost-iostreams
+boost-system
+brasero-libs
+bridge-utils
+brlapi
+brltty
+btrfs-progs
+bubblewrap
+bzip2
+bzip2-libs
+ca-certificates
+cairo
+cairo-gobject
+cairomm
+c-ares
+caribou
+caribou-gtk2-module
+caribou-gtk3-module
+cdparanoia-libs
+celt051
+checkpolicy
+cheese
+cheese-libs
+chkconfig
+chrony
+cifs-utils
+cldr-emoji-annotation
+clucene-contribs-lib
+clucene-core
+clutter
+clutter-gst2
+clutter-gst3
+clutter-gtk
+cogl
+colord
+colord-gtk
+colord-libs
+color-filesystem
+compat-openssl10
+comps-extras
+control-center
+control-center-filesystem
+copy-jdk-configs
+coreutils
+coreutils-common
+corosync
+corosynclib
+cpio
+cracklib
+cracklib-dicts
+crda
+createrepo_c
+createrepo_c-libs
+cronie
+cronie-anacron
+crontabs
+crypto-policies
+cryptsetup
+cryptsetup-libs
+cups
+cups-client
+cups-filesystem
+cups-filters
+cups-filters-libs
+cups-libs
+cups-pk-helper
+curl
+cyrus-sasl
+cyrus-sasl-gssapi
+cyrus-sasl-lib
+cyrus-sasl-plain
+dbus
+dbus-glib
+dbus-libs
+dbusmenu-qt
+dbus-x11
+dbxtool
+dconf
+dejavu-fonts-common
+dejavu-sans-fonts
+dejavu-sans-mono-fonts
+dejavu-serif-fonts
+deltarpm
+desktop-backgrounds-gnome
+desktop-file-utils
+device-mapper
+device-mapper-event
+device-mapper-event-libs
+device-mapper-libs
+device-mapper-multipath
+device-mapper-multipath-libs
+device-mapper-persistent-data
+dhcp-client
+dhcp-common
+dhcp-libs
+diffutils
+djvulibre-libs
+dleyna-connector-dbus
+dleyna-core
+dleyna-server
+dmidecode
+dmraid
+dmraid-events
+dnf
+dnf-conf
+dnf-plugins-core
+dnf-yum
+dnsmasq
+dos2unix
+dosfstools
+dotconf
+dracut
+dracut-config-rescue
+dracut-live
+dracut-network
+drpm
+e2fsprogs
+e2fsprogs-libs
+ebtables
+edk2-ovmf
+efibootmgr
+efivar
+efivar-libs
+elfutils
+elfutils-default-yama-scope
+elfutils-libelf
+elfutils-libs
+emacs-filesystem
+enca
+enchant
+eog
+epiphany-runtime
+espeak
+ethtool
+evince
+evince-djvu
+evince-libs
+evince-nautilus
+evolution
+evolution-data-server
+evolution-data-server-langpacks
+evolution-ews
+evolution-ews-langpacks
+evolution-help
+evolution-langpacks
+exempi
+exiv2
+exiv2-libs
+expat
+f27-backgrounds-base
+f27-backgrounds-gnome
+fcoe-utils
+fedora-bookmarks
+fedora-logos
+fedora-logos-httpd
+fedora-productimg-workstation
+fedora-release
+fedora-release-workstation
+fedora-repos
+fedora-repos-rawhide
+fedora-user-agent-chrome
+fedora-workstation-backgrounds
+file
+file-libs
+file-roller
+file-roller-nautilus
+filesystem
+findutils
+fipscheck
+fipscheck-lib
+firefox
+firewalld
+firewalld-filesystem
+flac-libs
+flatpak
+flatpak-libs
+folks
+fontconfig
+fontpackages-filesystem
+foomatic
+foomatic-db
+foomatic-db-filesystem
+foomatic-db-ppds
+fpaste
+fprintd
+fprintd-pam
+freetype
+frei0r-plugins
+fros
+fros-gnome
+fuse
+fuse-common
+fuse-libs
+fwupd
+fwupdate-efi
+fwupdate-libs
+fwupd-labels
+gavl
+gawk
+gc
+GConf2
+gcr
+gd
+gdb-headless
+gdbm
+gdisk
+gdk-pixbuf2
+gdk-pixbuf2-modules
+gdm
+gdouros-symbola-fonts
+gedit
+genisoimage
+geoclue2
+geoclue2-libs
+geocode-glib
+GeoIP
+GeoIP-GeoLite-data
+gettext
+gettext-libs
+gfbgraph
+ghostscript
+ghostscript-core
+ghostscript-fonts
+ghostscript-x11
+giflib
+git
+git-core
+git-core-doc
+gjs
+glade-libs
+glib2
+glibc
+glibc-all-langpacks
+glibc-common
+glibc-langpack-en
+glibmm24
+glib-networking
+glusterfs
+glusterfs-api
+glusterfs-cli
+glusterfs-client-xlators
+glusterfs-fuse
+glusterfs-libs
+glx-utils
+gmime30
+gmp
+gnome-abrt
+gnome-autoar
+gnome-backgrounds
+gnome-bluetooth
+gnome-bluetooth-libs
+gnome-boxes
+gnome-calculator
+gnome-calendar
+gnome-characters
+gnome-classic-session
+gnome-clocks
+gnome-color-manager
+gnome-contacts
+gnome-desktop3
+gnome-disk-utility
+gnome-documents
+gnome-documents-libs
+gnome-font-viewer
+gnome-getting-started-docs
+gnome-initial-setup
+gnome-keyring
+gnome-keyring-pam
+gnome-logs
+gnome-maps
+gnome-menus
+gnome-online-accounts
+gnome-online-miners
+gnome-screenshot
+gnome-session
+gnome-session-wayland-session
+gnome-session-xsession
+gnome-settings-daemon
+gnome-shell
+gnome-shell-extension-alternate-tab
+gnome-shell-extension-apps-menu
+gnome-shell-extension-background-logo
+gnome-shell-extension-common
+gnome-shell-extension-launch-new-instance
+gnome-shell-extension-places-menu
+gnome-shell-extension-window-list
+gnome-software
+gnome-system-monitor
+gnome-terminal
+gnome-terminal-nautilus
+gnome-themes-standard
+gnome-todo
+gnome-user-docs
+gnome-user-share
+gnome-video-effects
+gnome-weather
+gnu-free-fonts-common
+gnu-free-mono-fonts
+gnu-free-sans-fonts
+gnu-free-serif-fonts
+gnupg
+gnupg2
+gnupg2-smime
+gnutls
+gobject-introspection
+gom
+google-android-emoji-fonts
+google-crosextra-caladea-fonts
+google-crosextra-carlito-fonts
+google-noto-emoji-fonts
+google-noto-fonts-common
+google-noto-sans-lisu-fonts
+google-noto-sans-mandaic-fonts
+google-noto-sans-meetei-mayek-fonts
+google-noto-sans-sinhala-fonts
+google-noto-sans-tagalog-fonts
+google-noto-sans-tai-tham-fonts
+google-noto-sans-tai-viet-fonts
+gperftools-libs
+gpgme
+gpgmepp
+gpg-pubkey
+graphite2
+grep
+grilo
+grilo-plugins
+groff-base
+grub2-common
+grub2-efi-ia32
+grub2-efi-ia32-cdboot
+grub2-efi-x64
+grub2-efi-x64-cdboot
+grub2-pc
+grub2-pc-modules
+grub2-tools
+grub2-tools-efi
+grub2-tools-extra
+grub2-tools-minimal
+grubby
+gsettings-desktop-schemas
+gsm
+gsound
+gspell
+gssdp
+gssproxy
+gstreamer1
+gstreamer1-plugins-bad-free
+gstreamer1-plugins-bad-free-gtk
+gstreamer1-plugins-base
+gstreamer1-plugins-good
+gstreamer1-plugins-ugly-free
+gtk2
+gtk3
+gtkmm24
+gtkmm30
+gtksourceview3
+gtkspell3
+gtk-update-icon-cache
+gtk-vnc2
+guile
+gupnp
+gupnp-av
+gupnp-dlna
+gutenprint
+gutenprint-cups
+gutenprint-libs
+gvfs
+gvfs-afc
+gvfs-afp
+gvfs-archive
+gvfs-client
+gvfs-fuse
+gvfs-goa
+gvfs-gphoto2
+gvfs-mtp
+gvfs-smb
+gvnc
+gzip
+hardlink
+harfbuzz
+harfbuzz-icu
+hfsplus-tools
+hicolor-icon-theme
+highlight
+hostname
+hplip
+hplip-common
+hplip-libs
+httpd
+httpd-filesystem
+httpd-tools
+http-parser
+hunspell
+hunspell-en
+hunspell-en-GB
+hunspell-en-US
+hwdata
+hyperv-daemons
+hyperv-daemons-license
+hypervfcopyd
+hypervkvpd
+hypervvssd
+hyphen
+hyphen-en
+ibus
+ibus-gtk2
+ibus-gtk3
+ibus-hangul
+ibus-kkc
+ibus-libpinyin
+ibus-libs
+ibus-libzhuyin
+ibus-m17n
+ibus-qt
+ibus-rawcode
+ibus-setup
+ibus-typing-booster
+ibus-wayland
+iio-sensor-proxy
+info
+initscripts
+ipcalc
+iproute
+iproute-tc
+ipset
+ipset-libs
+iptables
+iptables-libs
+iptstate
+iputils
+ipw2100-firmware
+ipw2200-firmware
+ipxe-roms-qemu
+iscsi-initiator-utils
+iscsi-initiator-utils-iscsiuio
+isns-utils-libs
+iso-codes
+isomd5sum
+iw
+iwl1000-firmware
+iwl100-firmware
+iwl105-firmware
+iwl135-firmware
+iwl2000-firmware
+iwl2030-firmware
+iwl3160-firmware
+iwl3945-firmware
+iwl4965-firmware
+iwl5000-firmware
+iwl5150-firmware
+iwl6000-firmware
+iwl6000g2a-firmware
+iwl6000g2b-firmware
+iwl6050-firmware
+iwl7260-firmware
+jansson
+jasper-libs
+java-1.8.0-openjdk-headless
+javapackages-tools
+jbigkit-libs
+jimtcl
+jomolhari-fonts
+js-jquery
+json-c
+json-glib
+julietaula-montserrat-fonts
+jwhois
+kbd
+kbd-legacy
+kbd-misc
+kernel
+kernel-core
+kernel-modules
+kernel-modules-extra
+kexec-tools
+kexec-tools-anaconda-addon
+keybinder3
+keyutils
+keyutils-libs
+khmeros-base-fonts
+khmeros-fonts-common
+kmod
+kmod-libs
+kpartx
+krb5-libs
+kyotocabinet-libs
+lame-libs
+langpacks-en
+langtable
+langtable-data
+langtable-python3
+lcms2
+less
+liba52
+libabw
+libacl
+libaio
+libao
+libappstream-glib
+libarchive
+libassuan
+libasyncns
+libatasmart
+libatomic_ops
+libattr
+libavc1394
+libbabeltrace
+libbasicobjects
+libblkid
+libblockdev
+libblockdev-btrfs
+libblockdev-crypto
+libblockdev-dm
+libblockdev-fs
+libblockdev-kbd
+libblockdev-loop
+libblockdev-lvm
+libblockdev-mdraid
+libblockdev-mpath
+libblockdev-part
+libblockdev-plugins-all
+libblockdev-swap
+libblockdev-utils
+libbluray
+libbytesize
+libcacard
+libcanberra
+libcanberra-gtk2
+libcanberra-gtk3
+libcap
+libcap-ng
+libcdio
+libcdio-paranoia
+libcdr
+libcgroup
+libchamplain
+libchamplain-gtk
+libcmis
+libcollection
+libcom_err
+libcomps
+libconfig
+libcroco
+libcrypt-nss
+libcryptui
+libcue
+libcurl
+libdaemon
+libdatrie
+libdb
+libdb-utils
+libdfu
+libdhash
+libdmapsharing
+libdmx
+libdnet
+libdnf
+libdrm
+libdv
+libdvdnav
+libdvdread
+libe-book
+libedit
+libeot
+libepoxy
+liberation-fonts-common
+liberation-mono-fonts
+liberation-sans-fonts
+liberation-serif-fonts
+libertas-usb8388-firmware
+libetonyek
+libev
+libevdev
+libevent
+libexif
+libexttextcat
+libfdisk
+libfdt
+libffi
+libfontenc
+libfprint
+libfreehand
+libgcab1
+libgcc
+libgcrypt
+libgdata
+libgdither
+libgee
+libgepub
+libgexiv2
+libgltf
+libglvnd
+libglvnd-egl
+libglvnd-gles
+libglvnd-glx
+libgnomekbd
+libgnome-keyring
+libgomp
+libgovirt
+libgpg-error
+libgphoto2
+libgpod
+libgrss
+libgsf
+libgtop2
+libgudev
+libgusb
+libgweather
+libgxps
+libhangul
+libibverbs
+libical
+libICE
+libicu
+libidn
+libidn2
+libiec61883
+libieee1284
+libimagequant
+libimobiledevice
+libini_config
+libinput
+libipa_hbac
+libipt
+libiptcdata
+libiscsi
+libjpeg-turbo
+libkadm5
+libkkc
+libkkc-common
+libkkc-data
+libksba
+liblangtag
+liblangtag-data
+libldb
+liblouis
+libmbim
+libmbim-utils
+libmcpp
+libmediaart
+libmetalink
+libmng
+libmnl
+libmodman
+libmount
+libmpc
+libmpcdec
+libmspack
+libmspub
+libmtp
+libmusicbrainz5
+libmwaw
+libmx
+libndp
+libnetfilter_conntrack
+libnfnetlink
+libnfs
+libnfsidmap
+libnghttp2
+libnl3
+libnl3-cli
+libnma
+libnm-gtk
+libnotify
+liboauth
+libodfgen
+libogg
+liborcus
+libosinfo
+libpagemaker
+libpath_utils
+libpcap
+libpciaccess
+libpeas
+libpeas-gtk
+libpeas-loader-python3
+libphodav
+libpinyin
+libpinyin-data
+libpipeline
+libpkgconf
+libplist
+libpng
+libproxy
+libproxy-mozjs
+libpskc
+libpsl
+libpwquality
+libqb
+libqmi
+libqmi-utils
+libquvi
+libquvi-scripts
+librados2
+LibRaw
+libraw1394
+librbd1
+librdmacm
+libref_array
+libreoffice-calc
+libreoffice-core
+libreoffice-data
+libreoffice-draw
+libreoffice-emailmerge
+libreoffice-filters
+libreoffice-graphicfilter
+libreoffice-gtk2
+libreoffice-gtk3
+libreoffice-help-en
+libreoffice-impress
+libreofficekit
+libreoffice-langpack-en
+libreoffice-math
+libreoffice-opensymbol-fonts
+libreoffice-pdfimport
+libreoffice-pyuno
+libreoffice-ure
+libreoffice-ure-common
+libreoffice-writer
+libreoffice-x11
+libreoffice-xsltfilter
+librepo
+libreport
+libreport-anaconda
+libreport-cli
+libreport-fedora
+libreport-filesystem
+libreport-gtk
+libreport-plugin-bugzilla
+libreport-plugin-kerneloops
+libreport-plugin-logger
+libreport-plugin-reportuploader
+libreport-plugin-systemd-journal
+libreport-plugin-ureport
+libreport-python3
+libreport-web
+librevenge
+librsvg2
+libsamplerate
+libsane-hpaio
+libseccomp
+libsecret
+libselinux
+libselinux-python3
+libselinux-utils
+libsemanage
+libsemanage-python3
+libsepol
+libshout
+libsigc++20
+libsigsegv
+libSM
+libsmartcols
+libsmbclient
+libsmbios
+libsndfile
+libsolv
+libsoup
+libspectre
+libsrtp
+libss
+libssh
+libssh2
+libsss_autofs
+libsss_certmap
+libsss_idmap
+libsss_nss_idmap
+libsss_sudo
+libstaroffice
+libstdc++
+libstemmer
+libsysfs
+libtalloc
+libtar
+libtasn1
+libtdb
+libteam
+libtevent
+libthai
+libtheora
+libtiff
+libtimezonemap
+libtirpc
+libtool-ltdl
+libudisks2
+libunistring
+libunwind
+libusal
+libusb
+libusbmuxd
+libusbx
+libuser
+libutempter
+libuuid
+libv4l
+libvdpau
+libverto
+libverto-libev
+libvirt-daemon
+libvirt-daemon-config-network
+libvirt-daemon-driver-interface
+libvirt-daemon-driver-network
+libvirt-daemon-driver-nodedev
+libvirt-daemon-driver-nwfilter
+libvirt-daemon-driver-qemu
+libvirt-daemon-driver-secret
+libvirt-daemon-driver-storage
+libvirt-daemon-driver-storage-core
+libvirt-daemon-driver-storage-disk
+libvirt-daemon-driver-storage-gluster
+libvirt-daemon-driver-storage-iscsi
+libvirt-daemon-driver-storage-logical
+libvirt-daemon-driver-storage-mpath
+libvirt-daemon-driver-storage-rbd
+libvirt-daemon-driver-storage-scsi
+libvirt-daemon-driver-storage-sheepdog
+libvirt-daemon-driver-storage-zfs
+libvirt-daemon-kvm
+libvirt-gconfig
+libvirt-glib
+libvirt-gobject
+libvirt-libs
+libvisio
+libvisual
+libvorbis
+libvpx
+libwacom
+libwacom-data
+libwayland-client
+libwayland-cursor
+libwayland-server
+libwbclient
+libwebp
+libwnck3
+libwpd
+libwpg
+libwps
+libwsman1
+libwvstreams
+libX11
+libX11-common
+libX11-xcb
+libXau
+libxcb
+libXcomposite
+libXcursor
+libXdamage
+libXdmcp
+libXext
+libXfixes
+libXfont
+libXfont2
+libXft
+libXi
+libXinerama
+libxkbcommon
+libxkbcommon-x11
+libxkbfile
+libxklavier
+libxml2
+libXmu
+libXpm
+libXrandr
+libXrender
+libXres
+libxshmfence
+libxslt
+libXt
+libXtst
+libXv
+libXvMC
+libXxf86dga
+libXxf86misc
+libXxf86vm
+libzapojit
+libzhuyin
+libzmf
+linux-atm-libs
+linux-firmware
+lksctp-tools
+lldpad
+llvm-libs
+Lmod
+lockdev
+logrotate
+lohit-assamese-fonts
+lohit-bengali-fonts
+lohit-devanagari-fonts
+lohit-gujarati-fonts
+lohit-gurmukhi-fonts
+lohit-kannada-fonts
+lohit-odia-fonts
+lohit-tamil-fonts
+lohit-telugu-fonts
+lpsolve
+lrzsz
+lsof
+lttng-ust
+lua
+lua-expat
+lua-filesystem
+lua-json
+lua-libs
+lua-lpeg
+lua-posix
+lua-socket
+lua-term
+lvm2
+lvm2-libs
+lxpolkit
+lz4
+lz4-libs
+lzo
+lzop
+m17n-db
+m17n-lib
+mactel-boot
+mailcap
+make
+man-db
+man-pages
+marisa
+mcelog
+mcpp
+mdadm
+media-player-info
+memtest86+
+mesa-dri-drivers
+mesa-filesystem
+mesa-libEGL
+mesa-libgbm
+mesa-libGL
+mesa-libglapi
+mesa-libwayland-egl
+mesa-libxatracker
+microcode_ctl
+mlocate
+mobile-broadband-provider-info
+mod_dnssd
+ModemManager
+ModemManager-glib
+mod_http2
+mokutil
+mousetweaks
+mozilla-filesystem
+mozjs17
+mozjs38
+mozjs52
+mpage
+mpfr
+mpg123-libs
+mtdev
+mtools
+mtr
+mutter
+mythes
+mythes-en
+nautilus
+nautilus-extensions
+nautilus-sendto
+naver-nanum-fonts-common
+naver-nanum-gothic-fonts
+ncurses
+ncurses-base
+ncurses-libs
+neon
+netcf-libs
+net-snmp-libs
+nettle
+net-tools
+NetworkManager
+NetworkManager-adsl
+NetworkManager-bluetooth
+NetworkManager-config-connectivity-fedora
+NetworkManager-glib
+NetworkManager-libnm
+NetworkManager-openconnect
+NetworkManager-openconnect-gnome
+NetworkManager-openvpn
+NetworkManager-openvpn-gnome
+NetworkManager-pptp
+NetworkManager-pptp-gnome
+NetworkManager-ssh
+NetworkManager-ssh-gnome
+NetworkManager-team
+NetworkManager-vpnc
+NetworkManager-vpnc-gnome
+NetworkManager-wifi
+NetworkManager-wwan
+newt
+nfs-utils
+nmap-ncat
+nm-connection-editor
+npth
+nspr
+nss
+nss-mdns
+nss-pem
+nss-softokn
+nss-softokn-freebl
+nss-sysinit
+nss-tools
+nss-util
+ntfs-3g
+ntfsprogs
+numactl-libs
+numad
+opencc
+openCOLLADA
+openconnect
+openjpeg2
+openldap
+openssh
+openssh-clients
+openssh-server
+openssl
+openssl-libs
+open-vm-tools
+open-vm-tools-desktop
+openvpn
+opus
+orc
+orca
+osinfo-db
+osinfo-db-tools
+os-prober
+ostree
+ostree-libs
+p11-kit
+p11-kit-trust
+PackageKit
+PackageKit-command-not-found
+PackageKit-glib
+PackageKit-gstreamer-plugin
+PackageKit-gtk3-module
+pakchois
+paktype-naskh-basic-fonts
+pam
+pam_krb5
+pango
+pangomm
+paps
+paps-libs
+paratype-pt-sans-fonts
+parted
+passwd
+passwdqc
+passwdqc-lib
+pciutils
+pciutils-libs
+pcre
+pcre2
+pcre2-utf16
+pcsc-lite-libs
+perl-Carp
+perl-constant
+perl-Data-Dumper
+perl-Encode
+perl-Errno
+perl-Error
+perl-Exporter
+perl-File-Path
+perl-File-Temp
+perl-Getopt-Long
+perl-Git
+perl-HTTP-Tiny
+perl-interpreter
+perl-IO
+perl-IO-Socket-IP
+perl-IO-Socket-SSL
+perl-libnet
+perl-libs
+perl-macros
+perl-MIME-Base64
+perl-Mozilla-CA
+perl-Net-SSLeay
+perl-parent
+perl-PathTools
+perl-Pod-Escapes
+perl-podlators
+perl-Pod-Perldoc
+perl-Pod-Simple
+perl-Pod-Usage
+perl-Scalar-List-Utils
+perl-Socket
+perl-Storable
+perl-Term-ANSIColor
+perl-Term-Cap
+perl-TermReadKey
+perl-Text-ParseWords
+perl-Text-Tabs+Wrap
+perl-threads
+perl-threads-shared
+perl-Time-Local
+perl-Unicode-Normalize
+perl-URI
+pigz
+pinentry
+pinentry-gnome3
+pinentry-gtk
+pinfo
+pipewire
+pipewire-libs
+pixman
+pkcs11-helper
+pkgconf
+pkgconf-m4
+pkgconf-pkg-config
+plymouth
+plymouth-core-libs
+plymouth-graphics-libs
+plymouth-plugin-label
+plymouth-plugin-two-step
+plymouth-scripts
+plymouth-system-theme
+plymouth-theme-charge
+policycoreutils
+policycoreutils-python3
+policycoreutils-python-utils
+polkit
+polkit-libs
+polkit-pkla-compat
+poppler
+poppler-data
+poppler-glib
+poppler-utils
+popt
+ppp
+pptp
+procps-ng
+psacct
+psmisc
+publicsuffix-list-dafsa
+pulseaudio
+pulseaudio-gdm-hooks
+pulseaudio-libs
+pulseaudio-libs-glib2
+pulseaudio-module-bluetooth
+pulseaudio-module-x11
+pulseaudio-utils
+python2
+python2-libs
+python2-pip
+python2-setuptools
+python2-talloc
+python3
+python3-abrt
+python3-abrt-addon
+python3-asn1crypto
+python3-augeas
+python3-beaker
+python3-bind
+python3-blivet
+python3-blockdev
+python3-brlapi
+python3-bytesize
+python3-cairo
+python3-caribou
+python3-cffi
+python3-chardet
+python3-coverage
+python3-cryptography
+python3-cups
+python3-dbus
+python3-decorator
+python3-dmidecode
+python3-dnf
+python3-dnf-plugins-core
+python3-enchant
+python3-firewall
+python3-gobject
+python3-gobject-base
+python3-gpg
+python3-hawkey
+python3-humanize
+python3-idna
+python3-iniparse
+python3-inotify
+python3-IPy
+python3-iscsi-initiator-utils
+python3-kickstart
+python3-libcomps
+python3-librepo
+python3-libs
+python3-libxml2
+python3-louis
+python3-mako
+python3-markupsafe
+python3-meh
+python3-meh-gui
+python3-ntplib
+python3-olefile
+python3-ordered-set
+python3-pid
+python3-pillow
+python3-pip
+python3-ply
+python3-pwquality
+python3-pyatspi
+python3-pycparser
+python3-pycurl
+python3-pydbus
+python3-pyOpenSSL
+python3-pyparted
+python3-pysocks
+python3-pytz
+python3-pyudev
+python3-pyxdg
+python3-requests
+python3-requests-file
+python3-requests-ftp
+python3-rpm
+python3-setuptools
+python3-simpleline
+python3-six
+python3-slip
+python3-slip-dbus
+python3-speechd
+python3-sssdconfig
+python3-systemd
+python3-urllib3
+python3-wrapt
+python-systemd-doc
+qemu-block-curl
+qemu-block-dmg
+qemu-block-gluster
+qemu-block-iscsi
+qemu-block-nfs
+qemu-block-rbd
+qemu-block-ssh
+qemu-common
+qemu-guest-agent
+qemu-img
+qemu-kvm
+qemu-system-x86
+qemu-system-x86-core
+qgnomeplatform
+qpdf-libs
+qrencode-libs
+qt
+qt5-qtbase
+qt5-qtbase-common
+qt5-qtbase-gui
+qt5-qtdeclarative
+qt5-qtxmlpatterns
+qt-common
+qt-settings
+qt-x11
+quota
+quota-nls
+radvd
+raptor2
+rasqal
+rdist
+rdma-core
+readline
+realmd
+redhat-menus
+redland
+rest
+rhythmbox
+rng-tools
+rootfiles
+rpcbind
+rpm
+rpm-build-libs
+rpm-libs
+rpm-plugin-selinux
+rpm-plugin-systemd-inhibit
+rp-pppoe
+rsync
+rtkit
+rygel
+samba-client
+samba-client-libs
+samba-common
+samba-common-libs
+samba-dc-libs
+samba-libs
+sane-backends
+sane-backends-drivers-cameras
+sane-backends-drivers-scanners
+sane-backends-libs
+satyr
+sbc
+scl-utils
+SDL2
+seabios-bin
+seavgabios-bin
+sed
+selinux-policy
+selinux-policy-targeted
+setools-python3
+setroubleshoot
+setroubleshoot-plugins
+setroubleshoot-server
+setup
+setuptool
+sg3_utils-libs
+sgabios-bin
+sgpio
+shadow-utils
+shared-mime-info
+sheepdog
+shim-ia32
+shim-x64
+shotwell
+sil-abyssinica-fonts
+sil-mingzat-fonts
+sil-nuosu-fonts
+sil-padauk-fonts
+simple-scan
+skkdic
+slang
+smc-fonts-common
+smc-meera-fonts
+snappy
+sni-qt
+sos
+sound-theme-freedesktop
+soundtouch
+soxr
+speech-dispatcher
+speech-dispatcher-espeak
+speex
+speexdsp
+spice-glib
+spice-gtk3
+spice-server
+spice-vdagent
+sqlite-libs
+sshpass
+sssd
+sssd-ad
+sssd-client
+sssd-common
+sssd-common-pac
+sssd-ipa
+sssd-kcm
+sssd-krb5
+sssd-krb5-common
+sssd-ldap
+sssd-nfs-idmap
+sssd-proxy
+startup-notification
+stix-fonts
+stoken-libs
+sudo
+sushi
+switcheroo-control
+symlinks
+syslinux
+syslinux-extlinux
+syslinux-extlinux-nonlinux
+syslinux-nonlinux
+system-config-printer-libs
+system-config-printer-udev
+systemd
+systemd-bootchart
+systemd-container
+systemd-libs
+systemd-pam
+systemd-udev
+tabish-eeyek-fonts
+taglib
+tar
+tcl
+tcpdump
+tcp_wrappers
+tcp_wrappers-libs
+teamd
+telepathy-filesystem
+telepathy-glib
+telepathy-logger
+telnet
+thai-scalable-fonts-common
+thai-scalable-waree-fonts
+tigervnc-license
+tigervnc-server-minimal
+time
+timedatex
+totem
+totem-nautilus
+totem-pl-parser
+traceroute
+tracker
+tracker-miners
+tree
+trousers
+trousers-lib
+tzdata
+tzdata-java
+udisks2
+unicode-ucd
+unique
+unoconv
+unzip
+upower
+urw-fonts
+usb_modeswitch
+usb_modeswitch-data
+usbmuxd
+usbredir
+usbutils
+usermode
+userspace-rcu
+util-linux
+vconfig
+vim-minimal
+vino
+virglrenderer
+vlgothic-fonts
+volume_key-libs
+vpnc
+vpnc-script
+vte291
+vte-profile
+wavpack
+web-assets-filesystem
+webkitgtk4
+webkitgtk4-jsc
+webkitgtk4-plugin-process-gtk2
+webrtc-audio-processing
+wget
+which
+wireless-tools
+words
+wpa_supplicant
+wvdial
+xcb-util
+xcb-util-image
+xcb-util-keysyms
+xcb-util-renderutil
+xcb-util-wm
+xdg-desktop-portal
+xdg-desktop-portal-gtk
+xdg-user-dirs
+xdg-user-dirs-gtk
+xdg-utils
+xen-libs
+xen-licenses
+xfsprogs
+xkeyboard-config
+xml-common
+xmlrpc-c
+xmlrpc-c-client
+xmlsec1
+xmlsec1-openssl
+xorg-x11-drv-ati
+xorg-x11-drv-evdev
+xorg-x11-drv-fbdev
+xorg-x11-drv-intel
+xorg-x11-drv-libinput
+xorg-x11-drv-nouveau
+xorg-x11-drv-openchrome
+xorg-x11-drv-qxl
+xorg-x11-drv-vesa
+xorg-x11-drv-vmware
+xorg-x11-drv-wacom
+xorg-x11-font-utils
+xorg-x11-server-common
+xorg-x11-server-utils
+xorg-x11-server-Xorg
+xorg-x11-server-Xwayland
+xorg-x11-utils
+xorg-x11-xauth
+xorg-x11-xinit
+xorg-x11-xkb-utils
+xz
+xz-libs
+yajl
+yelp
+yelp-libs
+yelp-xsl
+zd1211-firmware
+zenity
+zfs-fuse
+zip
+zlib

diff --git a/f26-flatpak-runtime.packages b/f26-flatpak-runtime.packages
deleted file mode 100644
index 538ff24..0000000
--- a/f26-flatpak-runtime.packages
+++ /dev/null
@@ -1,204 +0,0 @@
-abattis-cantarell-fonts
-acl
-adwaita-cursor-theme
-adwaita-gtk2-theme
-adwaita-icon-theme
-at-spi2-atk
-at-spi2-core
-atk
-audit-libs
-avahi-libs
-basesystem
-bash
-bzip2-libs
-ca-certificates
-cairo
-cairo-gobject
-chkconfig
-colord-libs
-coreutils
-coreutils-common
-cracklib
-crypto-policies
-cryptsetup-libs
-cups-libs
-dbus
-dbus-libs
-device-mapper
-device-mapper-libs
-elfutils-default-yama-scope
-elfutils-libelf
-elfutils-libs
-emacs-filesystem
-enchant
-expat
-fedora-modular-release
-fedora-modular-repos
-filesystem
-flatpak-runtime-config
-fontconfig
-fontpackages-filesystem
-freetype
-gawk
-gdbm
-gdk-pixbuf2
-gdk-pixbuf2-modules
-glib-networking
-glib2
-glibc
-glibc-all-langpacks
-glibc-common
-gmp
-gnome-desktop3
-gnome-themes-standard
-gnutls
-gobject-introspection
-graphite2
-grep
-gsettings-desktop-schemas
-gtk-update-icon-cache
-gtk2
-gtk3
-gvfs-client
-gzip
-harfbuzz
-hicolor-icon-theme
-hunspell
-hunspell-en-GB
-hunspell-en-US
-hwdata
-info
-iptables-libs
-jasper-libs
-jbigkit-libs
-json-glib
-keyutils-libs
-kmod-libs
-krb5-libs
-lcms2
-libX11
-libX11-common
-libXau
-libXcomposite
-libXcursor
-libXdamage
-libXext
-libXfixes
-libXft
-libXi
-libXinerama
-libXrandr
-libXrender
-libXtst
-libXxf86vm
-libacl
-libappstream-glib
-libarchive
-libattr
-libblkid
-libcap
-libcap-ng
-libcom_err
-libcroco
-libcrypt
-libdatrie
-libdb
-libdrm
-libepoxy
-libfdisk
-libffi
-libgcab1
-libgcc
-libgcrypt
-libglvnd
-libglvnd-egl
-libglvnd-glx
-libgpg-error
-libgusb
-libidn
-libidn2
-libjpeg-turbo
-libmodman
-libmount
-libnotify
-libpcap
-libpciaccess
-libpng
-libproxy
-libpwquality
-librsvg2
-libseccomp
-libselinux
-libsemanage
-libsepol
-libsigsegv
-libsmartcols
-libsoup
-libstdc++
-libstemmer
-libtasn1
-libthai
-libtiff
-libunistring
-libusbx
-libutempter
-libuuid
-libverto
-libwayland-client
-libwayland-cursor
-libwayland-server
-libxcb
-libxkbcommon
-libxml2
-libxshmfence
-lz4-libs
-lzo
-mesa-libEGL
-mesa-libGL
-mesa-libgbm
-mesa-libglapi
-mesa-libwayland-egl
-mpfr
-ncurses
-ncurses-base
-ncurses-libs
-nettle
-openssl-libs
-p11-kit
-p11-kit-trust
-pam
-pango
-pcre
-pixman
-popt
-python3
-python3-appdirs
-python3-cairo
-python3-gobject
-python3-gobject-base
-python3-libs
-python3-packaging
-python3-pip
-python3-pyparsing
-python3-setuptools
-python3-six
-qrencode-libs
-readline
-rest
-sed
-setup
-shadow-utils
-shared-mime-info
-sqlite-libs
-system-python
-system-python-libs
-systemd
-systemd-libs
-systemd-pam
-tzdata
-ustr
-util-linux
-xkeyboard-config
-xz-libs
-zenity
-zlib

diff --git a/f27-live.packages b/f27-live.packages
deleted file mode 100644
index 0d2f5ef..0000000
--- a/f27-live.packages
+++ /dev/null
@@ -1,1561 +0,0 @@
-aajohan-comfortaa-fonts
-abattis-cantarell-fonts
-abrt
-abrt-addon-ccpp
-abrt-addon-coredump-helper
-abrt-addon-kerneloops
-abrt-addon-pstoreoops
-abrt-addon-vmcore
-abrt-addon-xorg
-abrt-cli
-abrt-dbus
-abrt-desktop
-abrt-gui
-abrt-gui-libs
-abrt-java-connector
-abrt-libs
-abrt-plugin-bodhi
-abrt-retrace-client
-abrt-tui
-accountsservice
-accountsservice-libs
-acl
-adcli
-adobe-source-han-sans-cn-fonts
-adobe-source-han-sans-tw-fonts
-adobe-source-han-serif-cn-fonts
-adobe-source-han-serif-tw-fonts
-adwaita-cursor-theme
-adwaita-gtk2-theme
-adwaita-icon-theme
-adwaita-qt4
-adwaita-qt5
-alsa-lib
-alsa-plugins-pulseaudio
-alsa-ucm
-alsa-utils
-anaconda
-anaconda-core
-anaconda-gui
-anaconda-tui
-anaconda-user-help
-anaconda-widgets
-appstream-data
-apr
-apr-util
-argyllcms
-atk
-atkmm
-atmel-firmware
-at-spi2-atk
-at-spi2-core
-attr
-audit
-audit-libs
-audit-libs-python3
-augeas-libs
-authconfig
-autocorr-en
-avahi
-avahi-glib
-avahi-libs
-b43-fwcutter
-b43-openfwwf
-baobab
-basesystem
-bash
-bash-completion
-bc
-bcache-tools
-bind99-libs
-bind99-license
-bind-libs
-bind-libs-lite
-bind-license
-bind-utils
-blivet-gui-runtime
-bluez
-bluez-cups
-bluez-libs
-bluez-obexd
-boost-date-time
-boost-filesystem
-boost-iostreams
-boost-system
-brasero-libs
-bridge-utils
-brlapi
-brltty
-btrfs-progs
-bubblewrap
-bzip2
-bzip2-libs
-ca-certificates
-cairo
-cairo-gobject
-cairomm
-c-ares
-caribou
-caribou-gtk2-module
-caribou-gtk3-module
-cdparanoia-libs
-celt051
-checkpolicy
-cheese
-cheese-libs
-chkconfig
-chrony
-cifs-utils
-cldr-emoji-annotation
-clucene-contribs-lib
-clucene-core
-clutter
-clutter-gst2
-clutter-gst3
-clutter-gtk
-cogl
-colord
-colord-gtk
-colord-libs
-color-filesystem
-compat-openssl10
-comps-extras
-control-center
-control-center-filesystem
-copy-jdk-configs
-coreutils
-coreutils-common
-corosync
-corosynclib
-cpio
-cracklib
-cracklib-dicts
-crda
-createrepo_c
-createrepo_c-libs
-cronie
-cronie-anacron
-crontabs
-crypto-policies
-cryptsetup
-cryptsetup-libs
-cups
-cups-client
-cups-filesystem
-cups-filters
-cups-filters-libs
-cups-libs
-cups-pk-helper
-curl
-cyrus-sasl
-cyrus-sasl-gssapi
-cyrus-sasl-lib
-cyrus-sasl-plain
-dbus
-dbus-glib
-dbus-libs
-dbusmenu-qt
-dbus-x11
-dbxtool
-dconf
-dejavu-fonts-common
-dejavu-sans-fonts
-dejavu-sans-mono-fonts
-dejavu-serif-fonts
-deltarpm
-desktop-backgrounds-gnome
-desktop-file-utils
-device-mapper
-device-mapper-event
-device-mapper-event-libs
-device-mapper-libs
-device-mapper-multipath
-device-mapper-multipath-libs
-device-mapper-persistent-data
-dhcp-client
-dhcp-common
-dhcp-libs
-diffutils
-djvulibre-libs
-dleyna-connector-dbus
-dleyna-core
-dleyna-server
-dmidecode
-dmraid
-dmraid-events
-dnf
-dnf-conf
-dnf-plugins-core
-dnf-yum
-dnsmasq
-dos2unix
-dosfstools
-dotconf
-dracut
-dracut-config-rescue
-dracut-live
-dracut-network
-drpm
-e2fsprogs
-e2fsprogs-libs
-ebtables
-edk2-ovmf
-efibootmgr
-efivar
-efivar-libs
-elfutils
-elfutils-default-yama-scope
-elfutils-libelf
-elfutils-libs
-emacs-filesystem
-enca
-enchant
-eog
-epiphany-runtime
-espeak
-ethtool
-evince
-evince-djvu
-evince-libs
-evince-nautilus
-evolution
-evolution-data-server
-evolution-data-server-langpacks
-evolution-ews
-evolution-ews-langpacks
-evolution-help
-evolution-langpacks
-exempi
-exiv2
-exiv2-libs
-expat
-f27-backgrounds-base
-f27-backgrounds-gnome
-fcoe-utils
-fedora-bookmarks
-fedora-logos
-fedora-logos-httpd
-fedora-productimg-workstation
-fedora-release
-fedora-release-workstation
-fedora-repos
-fedora-repos-rawhide
-fedora-user-agent-chrome
-fedora-workstation-backgrounds
-file
-file-libs
-file-roller
-file-roller-nautilus
-filesystem
-findutils
-fipscheck
-fipscheck-lib
-firefox
-firewalld
-firewalld-filesystem
-flac-libs
-flatpak
-flatpak-libs
-folks
-fontconfig
-fontpackages-filesystem
-foomatic
-foomatic-db
-foomatic-db-filesystem
-foomatic-db-ppds
-fpaste
-fprintd
-fprintd-pam
-freetype
-frei0r-plugins
-fros
-fros-gnome
-fuse
-fuse-common
-fuse-libs
-fwupd
-fwupdate-efi
-fwupdate-libs
-fwupd-labels
-gavl
-gawk
-gc
-GConf2
-gcr
-gd
-gdb-headless
-gdbm
-gdisk
-gdk-pixbuf2
-gdk-pixbuf2-modules
-gdm
-gdouros-symbola-fonts
-gedit
-genisoimage
-geoclue2
-geoclue2-libs
-geocode-glib
-GeoIP
-GeoIP-GeoLite-data
-gettext
-gettext-libs
-gfbgraph
-ghostscript
-ghostscript-core
-ghostscript-fonts
-ghostscript-x11
-giflib
-git
-git-core
-git-core-doc
-gjs
-glade-libs
-glib2
-glibc
-glibc-all-langpacks
-glibc-common
-glibc-langpack-en
-glibmm24
-glib-networking
-glusterfs
-glusterfs-api
-glusterfs-cli
-glusterfs-client-xlators
-glusterfs-fuse
-glusterfs-libs
-glx-utils
-gmime30
-gmp
-gnome-abrt
-gnome-autoar
-gnome-backgrounds
-gnome-bluetooth
-gnome-bluetooth-libs
-gnome-boxes
-gnome-calculator
-gnome-calendar
-gnome-characters
-gnome-classic-session
-gnome-clocks
-gnome-color-manager
-gnome-contacts
-gnome-desktop3
-gnome-disk-utility
-gnome-documents
-gnome-documents-libs
-gnome-font-viewer
-gnome-getting-started-docs
-gnome-initial-setup
-gnome-keyring
-gnome-keyring-pam
-gnome-logs
-gnome-maps
-gnome-menus
-gnome-online-accounts
-gnome-online-miners
-gnome-screenshot
-gnome-session
-gnome-session-wayland-session
-gnome-session-xsession
-gnome-settings-daemon
-gnome-shell
-gnome-shell-extension-alternate-tab
-gnome-shell-extension-apps-menu
-gnome-shell-extension-background-logo
-gnome-shell-extension-common
-gnome-shell-extension-launch-new-instance
-gnome-shell-extension-places-menu
-gnome-shell-extension-window-list
-gnome-software
-gnome-system-monitor
-gnome-terminal
-gnome-terminal-nautilus
-gnome-themes-standard
-gnome-todo
-gnome-user-docs
-gnome-user-share
-gnome-video-effects
-gnome-weather
-gnu-free-fonts-common
-gnu-free-mono-fonts
-gnu-free-sans-fonts
-gnu-free-serif-fonts
-gnupg
-gnupg2
-gnupg2-smime
-gnutls
-gobject-introspection
-gom
-google-android-emoji-fonts
-google-crosextra-caladea-fonts
-google-crosextra-carlito-fonts
-google-noto-emoji-fonts
-google-noto-fonts-common
-google-noto-sans-lisu-fonts
-google-noto-sans-mandaic-fonts
-google-noto-sans-meetei-mayek-fonts
-google-noto-sans-sinhala-fonts
-google-noto-sans-tagalog-fonts
-google-noto-sans-tai-tham-fonts
-google-noto-sans-tai-viet-fonts
-gperftools-libs
-gpgme
-gpgmepp
-gpg-pubkey
-graphite2
-grep
-grilo
-grilo-plugins
-groff-base
-grub2-common
-grub2-efi-ia32
-grub2-efi-ia32-cdboot
-grub2-efi-x64
-grub2-efi-x64-cdboot
-grub2-pc
-grub2-pc-modules
-grub2-tools
-grub2-tools-efi
-grub2-tools-extra
-grub2-tools-minimal
-grubby
-gsettings-desktop-schemas
-gsm
-gsound
-gspell
-gssdp
-gssproxy
-gstreamer1
-gstreamer1-plugins-bad-free
-gstreamer1-plugins-bad-free-gtk
-gstreamer1-plugins-base
-gstreamer1-plugins-good
-gstreamer1-plugins-ugly-free
-gtk2
-gtk3
-gtkmm24
-gtkmm30
-gtksourceview3
-gtkspell3
-gtk-update-icon-cache
-gtk-vnc2
-guile
-gupnp
-gupnp-av
-gupnp-dlna
-gutenprint
-gutenprint-cups
-gutenprint-libs
-gvfs
-gvfs-afc
-gvfs-afp
-gvfs-archive
-gvfs-client
-gvfs-fuse
-gvfs-goa
-gvfs-gphoto2
-gvfs-mtp
-gvfs-smb
-gvnc
-gzip
-hardlink
-harfbuzz
-harfbuzz-icu
-hfsplus-tools
-hicolor-icon-theme
-highlight
-hostname
-hplip
-hplip-common
-hplip-libs
-httpd
-httpd-filesystem
-httpd-tools
-http-parser
-hunspell
-hunspell-en
-hunspell-en-GB
-hunspell-en-US
-hwdata
-hyperv-daemons
-hyperv-daemons-license
-hypervfcopyd
-hypervkvpd
-hypervvssd
-hyphen
-hyphen-en
-ibus
-ibus-gtk2
-ibus-gtk3
-ibus-hangul
-ibus-kkc
-ibus-libpinyin
-ibus-libs
-ibus-libzhuyin
-ibus-m17n
-ibus-qt
-ibus-rawcode
-ibus-setup
-ibus-typing-booster
-ibus-wayland
-iio-sensor-proxy
-info
-initscripts
-ipcalc
-iproute
-iproute-tc
-ipset
-ipset-libs
-iptables
-iptables-libs
-iptstate
-iputils
-ipw2100-firmware
-ipw2200-firmware
-ipxe-roms-qemu
-iscsi-initiator-utils
-iscsi-initiator-utils-iscsiuio
-isns-utils-libs
-iso-codes
-isomd5sum
-iw
-iwl1000-firmware
-iwl100-firmware
-iwl105-firmware
-iwl135-firmware
-iwl2000-firmware
-iwl2030-firmware
-iwl3160-firmware
-iwl3945-firmware
-iwl4965-firmware
-iwl5000-firmware
-iwl5150-firmware
-iwl6000-firmware
-iwl6000g2a-firmware
-iwl6000g2b-firmware
-iwl6050-firmware
-iwl7260-firmware
-jansson
-jasper-libs
-java-1.8.0-openjdk-headless
-javapackages-tools
-jbigkit-libs
-jimtcl
-jomolhari-fonts
-js-jquery
-json-c
-json-glib
-julietaula-montserrat-fonts
-jwhois
-kbd
-kbd-legacy
-kbd-misc
-kernel
-kernel-core
-kernel-modules
-kernel-modules-extra
-kexec-tools
-kexec-tools-anaconda-addon
-keybinder3
-keyutils
-keyutils-libs
-khmeros-base-fonts
-khmeros-fonts-common
-kmod
-kmod-libs
-kpartx
-krb5-libs
-kyotocabinet-libs
-lame-libs
-langpacks-en
-langtable
-langtable-data
-langtable-python3
-lcms2
-less
-liba52
-libabw
-libacl
-libaio
-libao
-libappstream-glib
-libarchive
-libassuan
-libasyncns
-libatasmart
-libatomic_ops
-libattr
-libavc1394
-libbabeltrace
-libbasicobjects
-libblkid
-libblockdev
-libblockdev-btrfs
-libblockdev-crypto
-libblockdev-dm
-libblockdev-fs
-libblockdev-kbd
-libblockdev-loop
-libblockdev-lvm
-libblockdev-mdraid
-libblockdev-mpath
-libblockdev-part
-libblockdev-plugins-all
-libblockdev-swap
-libblockdev-utils
-libbluray
-libbytesize
-libcacard
-libcanberra
-libcanberra-gtk2
-libcanberra-gtk3
-libcap
-libcap-ng
-libcdio
-libcdio-paranoia
-libcdr
-libcgroup
-libchamplain
-libchamplain-gtk
-libcmis
-libcollection
-libcom_err
-libcomps
-libconfig
-libcroco
-libcrypt-nss
-libcryptui
-libcue
-libcurl
-libdaemon
-libdatrie
-libdb
-libdb-utils
-libdfu
-libdhash
-libdmapsharing
-libdmx
-libdnet
-libdnf
-libdrm
-libdv
-libdvdnav
-libdvdread
-libe-book
-libedit
-libeot
-libepoxy
-liberation-fonts-common
-liberation-mono-fonts
-liberation-sans-fonts
-liberation-serif-fonts
-libertas-usb8388-firmware
-libetonyek
-libev
-libevdev
-libevent
-libexif
-libexttextcat
-libfdisk
-libfdt
-libffi
-libfontenc
-libfprint
-libfreehand
-libgcab1
-libgcc
-libgcrypt
-libgdata
-libgdither
-libgee
-libgepub
-libgexiv2
-libgltf
-libglvnd
-libglvnd-egl
-libglvnd-gles
-libglvnd-glx
-libgnomekbd
-libgnome-keyring
-libgomp
-libgovirt
-libgpg-error
-libgphoto2
-libgpod
-libgrss
-libgsf
-libgtop2
-libgudev
-libgusb
-libgweather
-libgxps
-libhangul
-libibverbs
-libical
-libICE
-libicu
-libidn
-libidn2
-libiec61883
-libieee1284
-libimagequant
-libimobiledevice
-libini_config
-libinput
-libipa_hbac
-libipt
-libiptcdata
-libiscsi
-libjpeg-turbo
-libkadm5
-libkkc
-libkkc-common
-libkkc-data
-libksba
-liblangtag
-liblangtag-data
-libldb
-liblouis
-libmbim
-libmbim-utils
-libmcpp
-libmediaart
-libmetalink
-libmng
-libmnl
-libmodman
-libmount
-libmpc
-libmpcdec
-libmspack
-libmspub
-libmtp
-libmusicbrainz5
-libmwaw
-libmx
-libndp
-libnetfilter_conntrack
-libnfnetlink
-libnfs
-libnfsidmap
-libnghttp2
-libnl3
-libnl3-cli
-libnma
-libnm-gtk
-libnotify
-liboauth
-libodfgen
-libogg
-liborcus
-libosinfo
-libpagemaker
-libpath_utils
-libpcap
-libpciaccess
-libpeas
-libpeas-gtk
-libpeas-loader-python3
-libphodav
-libpinyin
-libpinyin-data
-libpipeline
-libpkgconf
-libplist
-libpng
-libproxy
-libproxy-mozjs
-libpskc
-libpsl
-libpwquality
-libqb
-libqmi
-libqmi-utils
-libquvi
-libquvi-scripts
-librados2
-LibRaw
-libraw1394
-librbd1
-librdmacm
-libref_array
-libreoffice-calc
-libreoffice-core
-libreoffice-data
-libreoffice-draw
-libreoffice-emailmerge
-libreoffice-filters
-libreoffice-graphicfilter
-libreoffice-gtk2
-libreoffice-gtk3
-libreoffice-help-en
-libreoffice-impress
-libreofficekit
-libreoffice-langpack-en
-libreoffice-math
-libreoffice-opensymbol-fonts
-libreoffice-pdfimport
-libreoffice-pyuno
-libreoffice-ure
-libreoffice-ure-common
-libreoffice-writer
-libreoffice-x11
-libreoffice-xsltfilter
-librepo
-libreport
-libreport-anaconda
-libreport-cli
-libreport-fedora
-libreport-filesystem
-libreport-gtk
-libreport-plugin-bugzilla
-libreport-plugin-kerneloops
-libreport-plugin-logger
-libreport-plugin-reportuploader
-libreport-plugin-systemd-journal
-libreport-plugin-ureport
-libreport-python3
-libreport-web
-librevenge
-librsvg2
-libsamplerate
-libsane-hpaio
-libseccomp
-libsecret
-libselinux
-libselinux-python3
-libselinux-utils
-libsemanage
-libsemanage-python3
-libsepol
-libshout
-libsigc++20
-libsigsegv
-libSM
-libsmartcols
-libsmbclient
-libsmbios
-libsndfile
-libsolv
-libsoup
-libspectre
-libsrtp
-libss
-libssh
-libssh2
-libsss_autofs
-libsss_certmap
-libsss_idmap
-libsss_nss_idmap
-libsss_sudo
-libstaroffice
-libstdc++
-libstemmer
-libsysfs
-libtalloc
-libtar
-libtasn1
-libtdb
-libteam
-libtevent
-libthai
-libtheora
-libtiff
-libtimezonemap
-libtirpc
-libtool-ltdl
-libudisks2
-libunistring
-libunwind
-libusal
-libusb
-libusbmuxd
-libusbx
-libuser
-libutempter
-libuuid
-libv4l
-libvdpau
-libverto
-libverto-libev
-libvirt-daemon
-libvirt-daemon-config-network
-libvirt-daemon-driver-interface
-libvirt-daemon-driver-network
-libvirt-daemon-driver-nodedev
-libvirt-daemon-driver-nwfilter
-libvirt-daemon-driver-qemu
-libvirt-daemon-driver-secret
-libvirt-daemon-driver-storage
-libvirt-daemon-driver-storage-core
-libvirt-daemon-driver-storage-disk
-libvirt-daemon-driver-storage-gluster
-libvirt-daemon-driver-storage-iscsi
-libvirt-daemon-driver-storage-logical
-libvirt-daemon-driver-storage-mpath
-libvirt-daemon-driver-storage-rbd
-libvirt-daemon-driver-storage-scsi
-libvirt-daemon-driver-storage-sheepdog
-libvirt-daemon-driver-storage-zfs
-libvirt-daemon-kvm
-libvirt-gconfig
-libvirt-glib
-libvirt-gobject
-libvirt-libs
-libvisio
-libvisual
-libvorbis
-libvpx
-libwacom
-libwacom-data
-libwayland-client
-libwayland-cursor
-libwayland-server
-libwbclient
-libwebp
-libwnck3
-libwpd
-libwpg
-libwps
-libwsman1
-libwvstreams
-libX11
-libX11-common
-libX11-xcb
-libXau
-libxcb
-libXcomposite
-libXcursor
-libXdamage
-libXdmcp
-libXext
-libXfixes
-libXfont
-libXfont2
-libXft
-libXi
-libXinerama
-libxkbcommon
-libxkbcommon-x11
-libxkbfile
-libxklavier
-libxml2
-libXmu
-libXpm
-libXrandr
-libXrender
-libXres
-libxshmfence
-libxslt
-libXt
-libXtst
-libXv
-libXvMC
-libXxf86dga
-libXxf86misc
-libXxf86vm
-libzapojit
-libzhuyin
-libzmf
-linux-atm-libs
-linux-firmware
-lksctp-tools
-lldpad
-llvm-libs
-Lmod
-lockdev
-logrotate
-lohit-assamese-fonts
-lohit-bengali-fonts
-lohit-devanagari-fonts
-lohit-gujarati-fonts
-lohit-gurmukhi-fonts
-lohit-kannada-fonts
-lohit-odia-fonts
-lohit-tamil-fonts
-lohit-telugu-fonts
-lpsolve
-lrzsz
-lsof
-lttng-ust
-lua
-lua-expat
-lua-filesystem
-lua-json
-lua-libs
-lua-lpeg
-lua-posix
-lua-socket
-lua-term
-lvm2
-lvm2-libs
-lxpolkit
-lz4
-lz4-libs
-lzo
-lzop
-m17n-db
-m17n-lib
-mactel-boot
-mailcap
-make
-man-db
-man-pages
-marisa
-mcelog
-mcpp
-mdadm
-media-player-info
-memtest86+
-mesa-dri-drivers
-mesa-filesystem
-mesa-libEGL
-mesa-libgbm
-mesa-libGL
-mesa-libglapi
-mesa-libwayland-egl
-mesa-libxatracker
-microcode_ctl
-mlocate
-mobile-broadband-provider-info
-mod_dnssd
-ModemManager
-ModemManager-glib
-mod_http2
-mokutil
-mousetweaks
-mozilla-filesystem
-mozjs17
-mozjs38
-mozjs52
-mpage
-mpfr
-mpg123-libs
-mtdev
-mtools
-mtr
-mutter
-mythes
-mythes-en
-nautilus
-nautilus-extensions
-nautilus-sendto
-naver-nanum-fonts-common
-naver-nanum-gothic-fonts
-ncurses
-ncurses-base
-ncurses-libs
-neon
-netcf-libs
-net-snmp-libs
-nettle
-net-tools
-NetworkManager
-NetworkManager-adsl
-NetworkManager-bluetooth
-NetworkManager-config-connectivity-fedora
-NetworkManager-glib
-NetworkManager-libnm
-NetworkManager-openconnect
-NetworkManager-openconnect-gnome
-NetworkManager-openvpn
-NetworkManager-openvpn-gnome
-NetworkManager-pptp
-NetworkManager-pptp-gnome
-NetworkManager-ssh
-NetworkManager-ssh-gnome
-NetworkManager-team
-NetworkManager-vpnc
-NetworkManager-vpnc-gnome
-NetworkManager-wifi
-NetworkManager-wwan
-newt
-nfs-utils
-nmap-ncat
-nm-connection-editor
-npth
-nspr
-nss
-nss-mdns
-nss-pem
-nss-softokn
-nss-softokn-freebl
-nss-sysinit
-nss-tools
-nss-util
-ntfs-3g
-ntfsprogs
-numactl-libs
-numad
-opencc
-openCOLLADA
-openconnect
-openjpeg2
-openldap
-openssh
-openssh-clients
-openssh-server
-openssl
-openssl-libs
-open-vm-tools
-open-vm-tools-desktop
-openvpn
-opus
-orc
-orca
-osinfo-db
-osinfo-db-tools
-os-prober
-ostree
-ostree-libs
-p11-kit
-p11-kit-trust
-PackageKit
-PackageKit-command-not-found
-PackageKit-glib
-PackageKit-gstreamer-plugin
-PackageKit-gtk3-module
-pakchois
-paktype-naskh-basic-fonts
-pam
-pam_krb5
-pango
-pangomm
-paps
-paps-libs
-paratype-pt-sans-fonts
-parted
-passwd
-passwdqc
-passwdqc-lib
-pciutils
-pciutils-libs
-pcre
-pcre2
-pcre2-utf16
-pcsc-lite-libs
-perl-Carp
-perl-constant
-perl-Data-Dumper
-perl-Encode
-perl-Errno
-perl-Error
-perl-Exporter
-perl-File-Path
-perl-File-Temp
-perl-Getopt-Long
-perl-Git
-perl-HTTP-Tiny
-perl-interpreter
-perl-IO
-perl-IO-Socket-IP
-perl-IO-Socket-SSL
-perl-libnet
-perl-libs
-perl-macros
-perl-MIME-Base64
-perl-Mozilla-CA
-perl-Net-SSLeay
-perl-parent
-perl-PathTools
-perl-Pod-Escapes
-perl-podlators
-perl-Pod-Perldoc
-perl-Pod-Simple
-perl-Pod-Usage
-perl-Scalar-List-Utils
-perl-Socket
-perl-Storable
-perl-Term-ANSIColor
-perl-Term-Cap
-perl-TermReadKey
-perl-Text-ParseWords
-perl-Text-Tabs+Wrap
-perl-threads
-perl-threads-shared
-perl-Time-Local
-perl-Unicode-Normalize
-perl-URI
-pigz
-pinentry
-pinentry-gnome3
-pinentry-gtk
-pinfo
-pipewire
-pipewire-libs
-pixman
-pkcs11-helper
-pkgconf
-pkgconf-m4
-pkgconf-pkg-config
-plymouth
-plymouth-core-libs
-plymouth-graphics-libs
-plymouth-plugin-label
-plymouth-plugin-two-step
-plymouth-scripts
-plymouth-system-theme
-plymouth-theme-charge
-policycoreutils
-policycoreutils-python3
-policycoreutils-python-utils
-polkit
-polkit-libs
-polkit-pkla-compat
-poppler
-poppler-data
-poppler-glib
-poppler-utils
-popt
-ppp
-pptp
-procps-ng
-psacct
-psmisc
-publicsuffix-list-dafsa
-pulseaudio
-pulseaudio-gdm-hooks
-pulseaudio-libs
-pulseaudio-libs-glib2
-pulseaudio-module-bluetooth
-pulseaudio-module-x11
-pulseaudio-utils
-python2
-python2-libs
-python2-pip
-python2-setuptools
-python2-talloc
-python3
-python3-abrt
-python3-abrt-addon
-python3-asn1crypto
-python3-augeas
-python3-beaker
-python3-bind
-python3-blivet
-python3-blockdev
-python3-brlapi
-python3-bytesize
-python3-cairo
-python3-caribou
-python3-cffi
-python3-chardet
-python3-coverage
-python3-cryptography
-python3-cups
-python3-dbus
-python3-decorator
-python3-dmidecode
-python3-dnf
-python3-dnf-plugins-core
-python3-enchant
-python3-firewall
-python3-gobject
-python3-gobject-base
-python3-gpg
-python3-hawkey
-python3-humanize
-python3-idna
-python3-iniparse
-python3-inotify
-python3-IPy
-python3-iscsi-initiator-utils
-python3-kickstart
-python3-libcomps
-python3-librepo
-python3-libs
-python3-libxml2
-python3-louis
-python3-mako
-python3-markupsafe
-python3-meh
-python3-meh-gui
-python3-ntplib
-python3-olefile
-python3-ordered-set
-python3-pid
-python3-pillow
-python3-pip
-python3-ply
-python3-pwquality
-python3-pyatspi
-python3-pycparser
-python3-pycurl
-python3-pydbus
-python3-pyOpenSSL
-python3-pyparted
-python3-pysocks
-python3-pytz
-python3-pyudev
-python3-pyxdg
-python3-requests
-python3-requests-file
-python3-requests-ftp
-python3-rpm
-python3-setuptools
-python3-simpleline
-python3-six
-python3-slip
-python3-slip-dbus
-python3-speechd
-python3-sssdconfig
-python3-systemd
-python3-urllib3
-python3-wrapt
-python-systemd-doc
-qemu-block-curl
-qemu-block-dmg
-qemu-block-gluster
-qemu-block-iscsi
-qemu-block-nfs
-qemu-block-rbd
-qemu-block-ssh
-qemu-common
-qemu-guest-agent
-qemu-img
-qemu-kvm
-qemu-system-x86
-qemu-system-x86-core
-qgnomeplatform
-qpdf-libs
-qrencode-libs
-qt
-qt5-qtbase
-qt5-qtbase-common
-qt5-qtbase-gui
-qt5-qtdeclarative
-qt5-qtxmlpatterns
-qt-common
-qt-settings
-qt-x11
-quota
-quota-nls
-radvd
-raptor2
-rasqal
-rdist
-rdma-core
-readline
-realmd
-redhat-menus
-redland
-rest
-rhythmbox
-rng-tools
-rootfiles
-rpcbind
-rpm
-rpm-build-libs
-rpm-libs
-rpm-plugin-selinux
-rpm-plugin-systemd-inhibit
-rp-pppoe
-rsync
-rtkit
-rygel
-samba-client
-samba-client-libs
-samba-common
-samba-common-libs
-samba-dc-libs
-samba-libs
-sane-backends
-sane-backends-drivers-cameras
-sane-backends-drivers-scanners
-sane-backends-libs
-satyr
-sbc
-scl-utils
-SDL2
-seabios-bin
-seavgabios-bin
-sed
-selinux-policy
-selinux-policy-targeted
-setools-python3
-setroubleshoot
-setroubleshoot-plugins
-setroubleshoot-server
-setup
-setuptool
-sg3_utils-libs
-sgabios-bin
-sgpio
-shadow-utils
-shared-mime-info
-sheepdog
-shim-ia32
-shim-x64
-shotwell
-sil-abyssinica-fonts
-sil-mingzat-fonts
-sil-nuosu-fonts
-sil-padauk-fonts
-simple-scan
-skkdic
-slang
-smc-fonts-common
-smc-meera-fonts
-snappy
-sni-qt
-sos
-sound-theme-freedesktop
-soundtouch
-soxr
-speech-dispatcher
-speech-dispatcher-espeak
-speex
-speexdsp
-spice-glib
-spice-gtk3
-spice-server
-spice-vdagent
-sqlite-libs
-sshpass
-sssd
-sssd-ad
-sssd-client
-sssd-common
-sssd-common-pac
-sssd-ipa
-sssd-kcm
-sssd-krb5
-sssd-krb5-common
-sssd-ldap
-sssd-nfs-idmap
-sssd-proxy
-startup-notification
-stix-fonts
-stoken-libs
-sudo
-sushi
-switcheroo-control
-symlinks
-syslinux
-syslinux-extlinux
-syslinux-extlinux-nonlinux
-syslinux-nonlinux
-system-config-printer-libs
-system-config-printer-udev
-systemd
-systemd-bootchart
-systemd-container
-systemd-libs
-systemd-pam
-systemd-udev
-tabish-eeyek-fonts
-taglib
-tar
-tcl
-tcpdump
-tcp_wrappers
-tcp_wrappers-libs
-teamd
-telepathy-filesystem
-telepathy-glib
-telepathy-logger
-telnet
-thai-scalable-fonts-common
-thai-scalable-waree-fonts
-tigervnc-license
-tigervnc-server-minimal
-time
-timedatex
-totem
-totem-nautilus
-totem-pl-parser
-traceroute
-tracker
-tracker-miners
-tree
-trousers
-trousers-lib
-tzdata
-tzdata-java
-udisks2
-unicode-ucd
-unique
-unoconv
-unzip
-upower
-urw-fonts
-usb_modeswitch
-usb_modeswitch-data
-usbmuxd
-usbredir
-usbutils
-usermode
-userspace-rcu
-util-linux
-vconfig
-vim-minimal
-vino
-virglrenderer
-vlgothic-fonts
-volume_key-libs
-vpnc
-vpnc-script
-vte291
-vte-profile
-wavpack
-web-assets-filesystem
-webkitgtk4
-webkitgtk4-jsc
-webkitgtk4-plugin-process-gtk2
-webrtc-audio-processing
-wget
-which
-wireless-tools
-words
-wpa_supplicant
-wvdial
-xcb-util
-xcb-util-image
-xcb-util-keysyms
-xcb-util-renderutil
-xcb-util-wm
-xdg-desktop-portal
-xdg-desktop-portal-gtk
-xdg-user-dirs
-xdg-user-dirs-gtk
-xdg-utils
-xen-libs
-xen-licenses
-xfsprogs
-xkeyboard-config
-xml-common
-xmlrpc-c
-xmlrpc-c-client
-xmlsec1
-xmlsec1-openssl
-xorg-x11-drv-ati
-xorg-x11-drv-evdev
-xorg-x11-drv-fbdev
-xorg-x11-drv-intel
-xorg-x11-drv-libinput
-xorg-x11-drv-nouveau
-xorg-x11-drv-openchrome
-xorg-x11-drv-qxl
-xorg-x11-drv-vesa
-xorg-x11-drv-vmware
-xorg-x11-drv-wacom
-xorg-x11-font-utils
-xorg-x11-server-common
-xorg-x11-server-utils
-xorg-x11-server-Xorg
-xorg-x11-server-Xwayland
-xorg-x11-utils
-xorg-x11-xauth
-xorg-x11-xinit
-xorg-x11-xkb-utils
-xz
-xz-libs
-yajl
-yelp
-yelp-libs
-yelp-xsl
-zd1211-firmware
-zenity
-zfs-fuse
-zip
-zlib

diff --git a/generate-files.sh b/generate-files.sh
deleted file mode 100755
index 0219a61..0000000
--- a/generate-files.sh
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/bin/bash
-
-out=$1
-base=$(basename $out)
-
-case $base in
-    freedesktop-*)
-	ns=org.freedesktop
-	version=1.6
-	;;
-    gnome-*)
-	ns=org.gnome
-	version=3.26
-	;;
-    *)
-	echo 1>&2 "Can't identify runtime for $base"
-	exit 1
-	;;
-esac
-
-case $base in
-    *-Platform.files)
-	sdk=
-	type=Platform
-	;;
-    *-Sdk.files)
-	sdk=--sdk
-	type=Sdk
-	;;
-    *)
-	echo 1>&2 "Can't identify type for $base"
-	exit 1
-	;;
-esac
-
-runtime="$ns.$type/x86_64/$version"
-
-echo "$base: listing files in $runtime"
-
-flatpak run --file-forwarding --command=/usr/bin/python3 $runtime @@ list-files.py @@ $sdk > $out

diff --git a/generate-modulemd.py b/generate-modulemd.py
deleted file mode 100755
index b3bb4ef..0000000
--- a/generate-modulemd.py
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/python3
-import sys
-from yaml_utils import ordered_load, ordered_dump
-
-with open('flatpak-runtime.in.yaml') as f:
-    modulemd = ordered_load(f)
-
-def set_profile(profile_name, list_file):
-    with open(list_file) as f:
-        packages = [l.strip() for l in f]
-    print("{}: {} packages".format(profile_name, len(packages)), file=sys.stderr)
-    modulemd['data']['profiles'][profile_name] = packages
-
-set_profile('runtime', 'out/runtime.profile')
-set_profile('runtime-base', 'out/runtime-base.profile')
-set_profile('sdk', 'out/sdk.profile')
-set_profile('sdk-base', 'out/sdk-base.profile')
-
-with open('flatpak-runtime.yaml', 'w') as f:
-    ordered_dump(modulemd, stream=f, default_flow_style=False, encoding="utf-8")

diff --git a/generate-report.py b/generate-report.py
deleted file mode 100755
index c405d30..0000000
--- a/generate-report.py
+++ /dev/null
@@ -1,401 +0,0 @@
-#!/usr/bin/python3
-
-from jinja2 import Environment, FileSystemLoader, select_autoescape
-import json
-import locale
-import os
-import re
-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)
-
-def warn(msg):
-    print("{}: \033[31m{}\033[39m".format(os.path.basename(sys.argv[0]), msg), file=sys.stderr)
-
-def fedmod_output(args):
-    return subprocess.check_output(['pipenv', 'run', 'fedmod'] + args, encoding='utf-8', cwd='/home/otaylor/Source/fedmod')
-
-_nvr_to_name_re = re.compile('^(.*)-[^-]*-[^-]*')
-def nvr_to_name(nvr):
-    return _nvr_to_name_re.match(nvr).group(1)
-
-class Package(object):
-    def __init__(self, name):
-        self.name = name
-        self.freedesktop_platform = 0
-        self.freedesktop_platform_files = None
-        self.freedesktop_platform_required_by = None
-        self.gnome_platform = 0
-        self.gnome_platform_files = None
-        self.gnome_platform_required_by = None
-        self.freedesktop_sdk = 0
-        self.freedesktop_sdk_files = None
-        self.freedesktop_sdk_required_by = None
-        self.gnome_sdk = 0
-        self.gnome_sdk_files = None
-        self.gnome_sdk_required_by = None
-        self.live = 0
-        self.rf26 = 0
-        self.source_package = None
-        self.flag = None
-        self._note = None
-
-    @property
-    def runtimes(self):
-        return self.freedesktop_platform or self.gnome_platform or self.freedesktop_sdk or self.gnome_sdk
-
-    @property
-    def klass(self):
-        if self.flag == 'F':
-            return "flagged"
-        elif self.flag == 'F?':
-            return "questionable"
-        elif self.flag == 'FD':
-            return "flagged-dep"
-        elif self.flag == 'W':
-            return "waived"
-        elif self.gnome_platform and not self.live:
-            return "questionable"
-
-    @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"
-        elif self._note:
-            return self._note
-        else:
-            return ""
-
-    def why(self, which):
-        files = getattr(self, which + '_files')
-        if files is None:
-            files_str = ''
-        elif len(files) <= 3:
-            files_str=  'Files: ' + ' '.join(files)
-        else:
-            files_str = 'Files: ' + ' '.join(files[:3]) + ' ...'
-
-        required_by = getattr(self, which + '_required_by')
-        if required_by is None:
-            required_by_str = ''
-        else:
-            required_by_str = '\n'.join('{} ({})'.format(req, provider) for req, provider in required_by)
-
-        if files_str and required_by_str:
-            return files_str + '\n' + required_by_str
-        elif files_str:
-            return files_str
-        elif required_by_str:
-            return required_by_str
-        else:
-            return ''
-
-    @property
-    def freedesktop_platform_why(self):
-        return self.why('freedesktop_platform')
-
-    @property
-    def freedesktop_sdk_why(self):
-        return self.why('freedesktop_sdk')
-
-    @property
-    def gnome_platform_why(self):
-        return self.why('gnome_platform')
-
-    @property
-    def gnome_sdk_why(self):
-        return self.why('gnome_sdk')
-
-    def inclusion(self, which):
-        level = getattr(self, which)
-        if level == 0:
-            return 'absent'
-        elif level == 1:
-            return 'dep'
-        else:
-            required_by = getattr(self, which + '_required_by', False)
-            if required_by is False:
-                return 'present'
-            elif required_by is not None and len(required_by) > 0:
-                return 'files'
-            else:
-                return 'root'
-
-    @property
-    def freedesktop_platform_inclusion(self):
-        return self.inclusion('freedesktop_platform')
-
-    @property
-    def freedesktop_sdk_inclusion(self):
-        return self.inclusion('freedesktop_sdk')
-
-    @property
-    def gnome_platform_inclusion(self):
-        return self.inclusion('gnome_platform')
-
-    @property
-    def gnome_sdk_inclusion(self):
-        return self.inclusion('gnome_sdk')
-
-    @property
-    def live_inclusion(self):
-        return self.inclusion('live')
-
-    @property
-    def rf26_inclusion(self):
-        return self.inclusion('rf26')
-
-class SourcePackage(object):
-    def __init__(self, name):
-        self.name = name
-        self.packages = []
-
-    @property
-    def modules(self):
-        old_modules = self.packages[0].modules
-        klass = self.klass
-        if klass == "build-platform":
-            new_module = "desktop-runtime"
-        elif klass == "build-sdk":
-            new_module = "flatpak-runtime"
-        else:
-            new_module = None
-
-        if old_modules and new_module:
-            return old_modules + " ⇒ " + new_module
-        elif old_modules:
-            return old_modules
-        else:
-            return new_module
-
-    @property
-    def sdk_only(self):
-        return sdk_only
-
-    @property
-    def klass(self):
-        if self.packages[0].modules in ("", "installer"):
-            sdk_only = True
-            for package in self.packages:
-                if package.freedesktop_platform or package.gnome_platform:
-                    sdk_only = False
-            if sdk_only:
-                return "build-sdk"
-            else:
-                return "build-platform"
-        else:
-            return ""
-
-class Letter(object):
-    def __init__(self, letter):
-        self.letter = letter
-        self.packages = []
-
-#
-# Get information about packages
-#
-
-packages = dict()
-def add_package(name, which, level, only_if_exists=False, source_package=None):
-    pkg = packages.get(name, None)
-    if pkg is None:
-        if only_if_exists:
-            return
-        pkg = Package(name)
-        packages[name] = pkg
-    if getattr(pkg, which) < level:
-        setattr(pkg, which, level)
-    if source_package is not None:
-        pkg.source_package = source_package
-
-def add_packages(filename, which, resolve_deps=False, only_if_exists=False):
-    start("Adding packages from {}".format(filename))
-    with open(filename) as f:
-        pkgs = set(line.strip() for line in f)
-
-    if resolve_deps:
-        resolved_packages = json.loads(fedmod_output(['resolve-deps', '--json'] + list(pkgs)))
-        for package in resolved_packages:
-            name = nvr_to_name(package['rpm'])
-            srpm_name = nvr_to_name(package['srpm'])
-            add_package(name, which, level=(2 if name in pkgs else 1),
-                        source_package=srpm_name, only_if_exists=only_if_exists)
-
-        for package in resolved_packages:
-            for req, providers in package['requires'].items():
-                provider = nvr_to_name(providers[0])
-                provider_package = packages.get(provider, None)
-                if provider_package is None: # filtered out of the resolve-deps output - e.g., fedora-release
-                    continue
-                required_by = getattr(provider_package, which + '_required_by')
-                if required_by is None:
-                    required_by = []
-                    setattr(provider_package, which + '_required_by', required_by)
-                required_by.append((nvr_to_name(package['rpm']), req))
-    else:
-        for package in pkgs:
-            add_package(package, which, level=2, only_if_exists=only_if_exists)
-
-    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', only_if_exists=True)
-add_packages('f26-flatpak-runtime.packages', 'rf26', only_if_exists=True)
-
-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')
-
-source_packages = {}
-for package in packages.values():
-    source_package = source_packages.get(package.source_package, None)
-    if source_package is None:
-        source_package = SourcePackage(package.source_package)
-        source_packages[source_package.name] = source_package
-    source_package.packages.append(package)
-
-letters_map = dict()
-for k, v in source_packages.items():
-    v.packages.sort(key=lambda p: locale.strxfrm(p.name))
-    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 = fedmod_output(['list-rpms', '--list-modules'])
-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()
-
-start("Loading package notes")
-comment_re = re.compile(r'\s*#.*')
-flag_re = re.compile(r'[A-Z?]+$')
-package_re = re.compile(r'\S+')
-
-with open("package-notes.txt") as f:
-    for line in f:
-        line = comment_re.sub('', line)
-        line = line.strip()
-        if line == '':
-            continue
-        parts = line.split(":", 2)
-        name = parts[0].strip()
-        if not re.match(package_re, name):
-            warn("Can't parse package note: {}".format(line))
-            continue
-        if len(parts) == 1:
-            flag = note = None
-        elif len(parts) == 2:
-            x = parts[1].strip()
-            if flag_re.match(x):
-                flag = x
-                note = None
-            else:
-                note = x
-                flag = None
-        elif len(parts) == 3:
-            x = parts[1].strip()
-            if flag_re.match(x):
-                flag = x
-                note = parts[2].strip()
-            else:
-                flag = None
-                note = parts[1] + ':' + parts[2]
-
-        pkg = packages.get(name, None)
-        if pkg is None:
-            warn("Package note for missing package: {}".format(name))
-            continue
-
-        if flag is not None:
-            pkg.flag = flag
-        if note is not None:
-            pkg._note = note
-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 profiles
-#
-def generate_profile(outfile, which):
-    with open(outfile, 'w') as f:
-        for letter in letters:
-            for src in letter.packages:
-                for pkg in src.packages:
-                    if getattr(pkg, which) != 0:
-                        print(pkg.name, file=f)
-
-generate_profile('out/runtime-base.profile', 'freedesktop_platform')
-generate_profile('out/sdk-base.profile', 'freedesktop_sdk')
-generate_profile('out/runtime.profile', 'gnome_platform')
-generate_profile('out/sdk.profile', 'gnome_sdk')
-
-#
-# 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))

diff --git a/list-files.py b/list-files.py
deleted file mode 100755
index 3e95058..0000000
--- a/list-files.py
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/usr/bin/python3
-
-import os
-import re
-import sys
-
-sdk = len(sys.argv) > 1 and sys.argv[1] == '--sdk'
-
-def output_dir(d):
-    for f in sorted(os.listdir(d)):
-        full = os.path.join(d, f)
-        if not os.path.isdir(full):
-            print(os.path.join(d, f))
-
-def output_dir_recurse(d):
-    for dirName, subdirs, files in os.walk(d):
-            for f in sorted(files):
-              print(os.path.join(dirName, f))
-
-output_dir('/usr/bin')
-
-for f in os.listdir('/usr/lib'):
-    full = os.path.join('/usr/lib', f)
-    if (re.match(r'^.*\.so\.\d+$', f) is not None or
-        re.match(r'^.*\.so$', f) is not None and not os.path.islink(full)):
-        print(full)
-
-output_dir_recurse('/usr/share/fonts')
-
-if sdk:
-    output_dir_recurse('/usr/include')
-    output_dir('/usr/lib/pkgconfig')
-    output_dir('/usr/share/pkgconfig')
-
-# import pkgutil
-# for f in pkgutil.iter_modules():
-#     try:
-#         path = f[0].path
-#         if path.find('site-packages') < 0:
-#             continue
-#     except AttributeError:
-#         continue
-#     if not(f[1].startswith('_')):
-#         print(f, 'python3dist({})'.format(f[1]))
-

diff --git a/resolve-files.py b/resolve-files.py
deleted file mode 100755
index de5631f..0000000
--- a/resolve-files.py
+++ /dev/null
@@ -1,531 +0,0 @@
-#!/usr/bin/python3
-
-from functools import cmp_to_key
-import gzip
-import hashlib
-import os
-import pickle
-import re
-import rpm
-import sys
-import xml.etree.ElementTree as ET
-import xml.sax
-
-XDG_CACHE_HOME = os.environ.get("XDG_CACHE_HOME") or os.path.expanduser("~/.cache")
-
-# This needs to be in sync with fedmod
-REPOS = [
-    "f28-packages"
-]
-
-ignore = set()
-rename = dict()
-
-bin_ignore = [
-    # A bunch of binaries built as part of nss. A few of these are
-    # in /usr/lib64/nss/unsupported-tools/ as part of nss-tools, the rest are not considered
-    # worth installing at all (test utilities, etc.)
-    'addbuiltin', 'atob', 'baddbdir', 'bltest', 'btoa', 'certcgi', 'chktest', 'conflict',
-    'crmftest', 'dbtest', 'derdump', 'dertimetest', 'digest', 'ecperf', 'encodeinttest',
-    'fipstest', 'httpserv', 'listsuites', 'makepqg', 'mangle', 'multinit', 'nonspr10',
-    'ocspclnt', 'ocspresp', 'oidcalc', 'p7content', 'p7env', 'p7sign', 'p7verify',
-    'pk11gcmtest', 'pk11mode', 'pk1sign', 'pkix-errcodes', 'pp', 'pwdecrypt', 'remtest',
-    'rsaperf', 'sdrtest', 'secmodtest', 'selfserv', 'shlibsign', 'signtool', 'strsclnt',
-    'symkeyutil', 'tstclnt', 'vfychain', 'vfyserv',
-
-    # Script added into nss by openembedded
-    'signlibs.sh',
-
-    # /usr/share/doc/aspell/aspell-import in Fedora
-    'aspell-import',
-
-    # Removed in perl-5.27
-    'c2ph',
-
-    # Removed - https://lists.fedorahosted.org/archives/list/elfutils-devel@lists.fedorahosted.org/thread/22LIIMXI6EDGCOIO6QFSBUO2KHEXIGSJ/
-    'eu-ld',
-
-    # compatibility perl script in zenity for something quite old, not packaged in fedora
-    'gdialog',
-
-    # An openembedded thing
-    # "Tool that installs the GNU config.guess / config.sub into a directory tree"
-    'gnu-configize',
-
-    # GPG test program (https://git.gnupg.org/cgi-bin/gitweb.cgi?p=gnupg.git;a=tree;f=tests)
-    'gpgscm',
-
-    # An implementation of tar for cross-platform compatibility, disabled in gnupg2.spec
-    'gpgtar',
-
-    # Removed from gtk-doc
-    # https://git.gnome.org/browse/gtk-doc/commit/?id=46df4354abed5724697fd5e39630c5bbc6637cc4
-    'gtkdoc-mktmpl',
-
-    # Versioned python-3.5 binaries
-    'idle3.5', 'pydoc3.5', 'python3.5', 'python3.5-config', 'python3.5m',  'python3.5m-config', '2to3-3.5',
-
-    # installed in openembedded with a coreutils suffix along with the more normal version
-    'kill.coreutils', 'uptime.coreutils',
-
-    # nettle utilities not currently packaged in fedora
-    # (https://src.fedoraproject.org/rpms/nettle/c/2ec204e2de17006b566c9ff7d90ec65ca1680ed5?branch=master)
-    'nettle-hash', 'nettle-lfib-stream', 'nettle-pbkdf2', 'pkcs1-conv', 'sexp-conv',
-
-    # Not built by default as of util-linux-2.29
-    '/usr/bin/pg',
-
-    # These are installed as <name>-64 in Fedora, we just ignore them because they will be
-    # pulled in by the corresponding library
-    'gdk-pixbuf-query-loaders', 'gtk-query-immodules-2.0',
-    'gio-querymodules', 'gtk-query-immodules-3.0',
-
-    # Removed in krb5-1.13 (https://web.mit.edu/kerberos/krb5-1.13/README-1.13.5.txt)
-    'krb5-send-pr',
-
-    # Removed in util-linux-2.30'
-    'tailf',
-
-    # OpenEmbedded uses Debian's ca-certificates, Fedora is different
-    'update-ca-certificates',
-
-    #########################################################################
-    # In the freedesktop runtime for some reason, doesn't seem useful
-    'bsdcat',
-
-    # Same as 'openssl rehash', but as a perl script (openssl-perl)
-    'c_rehash',
-
-    # From pulseaudio, wrapper script to start a pulseaudio server as if it was ESD (pulseaudio-esound-compat)
-    'esdcompat',
-
-    # Just need the library (gcab)
-    'gcab',
-
-    # Probably not useful in the runtime or the SDK (gstreamer-plugins-base-tools)
-    'gst-device-monitor-1.0', 'gst-discoverer-1.0', 'gst-play-1.0',
-
-    # Python utilities (python2-tools)
-    'idle', 'smtpd.py',
-
-    # Python3 utilities (python3-tools)
-    'idle3', '2to3',
-
-    # A binary from cups, we just need the libraries (cups-libs)
-    'ipptool',
-
-    # Minimal profiler (glibc-utils)
-    'pcprofiledump',
-
-    # (pcre-tools)
-    'pcre2grep', 'pcre2test',
-
-    # Random test program from libproxy (libproxy-bin)
-    'proxy',
-
-    # Tools from libvpx (libvpx-utils)
-    'vpxdec', 'vpxenc',
-]
-ignore.update('/usr/bin/' + x for x in bin_ignore)
-
-bin_rename = {
-    # lcms2 compiled with --program-suffix=2 in Fedora, even though there are no actual
-    # conflicts between lcms and lcms2 - jpegicc was renamed to jpgicc, etc.
-    'jpgicc': 'jpgicc2',
-    'linkicc': 'linkicc2',
-    'psicc': 'psicc2',
-    'tificc': 'tificc2',
-    'transicc': 'transicc2',
-}
-rename.update({ '/usr/bin/' + k: '/usr/bin/' + v for k, v in bin_rename.items() })
-
-lib_ignore = [
-    # Symlink created in freedesktop.org flatpak runtime, not standard
-    'libEGL_indirect.so.0',
-
-    # Removed in gpgme-1.9.0
-    'libgpgme-pthread.so.11',
-
-    # Not enabled in fedora (consider fixing)
-    'libharfbuzz-gobject.so.0',
-
-    # Part of glibc
-    'libssp.so.0',
-]
-ignore.update('/usr/lib64/' + x for x in lib_ignore)
-
-fonts_ignore = {
-    # Added in 2.36
-    'dejavu/DejaVuMathTeXGyre.ttf',
-}
-ignore.update('/usr/share/fonts/' + x for x in fonts_ignore)
-
-lib_rename = {
-    # Newer in Fedora
-    'libhunspell-1.3.so.0': 'libhunspell-1.5.so.0',
-    'libwebp.so.6': 'libwebp.so.7',
-    'libwebpmux.so.2': 'libwebpmux.so.3',
-    'libpcre2-posix.so.1': 'libpcre2-posix.so.2',
-    'libvpx.so.3': 'libvpx.so.4',
-    'libkadm5clnt_mit.so.9': 'libkadm5clnt_mit.so.11',
-    'libkadm5srv_mit.so.9': 'libkadm5srv_mit.so.11',
-
-    # Newer in Flatpak runtime
-    'libprocps.so.6': 'libprocps.so.4', # procps-3.10 vs. procps-3.12
-    'libgif.so.7': 'libgif.so.4', # giflib 4 vs giflib-5 - https://bugzilla.redhat.com/show_bug.cgi?id=822844
-
-    # Fedora arch-handling
-    'ld-linux.so.2': 'ld-linux-x86-64.so.2',
-}
-rename.update({ '/usr/lib64/' + k: '/usr/lib64/' + v for k, v in lib_rename.items() })
-
-include_ignore = {
-    # https://git.gnome.org/browse/at-spi2-core/commit/?id=1eb223bb48464d707290ef540581e9763b0ceee8
-    'at-spi-2.0/atspi/atspi-gmain.c',
-
-    # Removed in 7.55 https://github.com/curl/curl/commit/73a2fcea0b4adea6ba342cd7ed1149782c214ae3
-    'curl/curlbuild-64.h', 'curl/curlbuild.h', 'curl/curlrules.h',
-
-    # Not enabled on Fedora
-    'harfbuzz/hb-gobject-enums.h',
-    'harfbuzz/hb-gobject-structs.h',
-    'harfbuzz/hb-gobject.h',
-
-    # https://github.com/hunspell/hunspell/commit/99675e791d123cbe1be914b1a49dd83062134301
-    'hunspell/affentry.hxx', 'hunspell/affixmgr.hxx', 'hunspell/baseaffix.hxx', 'hunspell/dictmgr.hxx',
-    'hunspell/filemgr.hxx','hunspell/hashmgr.hxx','hunspell/hunzip.hxx','hunspell/langnum.hxx',
-    'hunspell/phonet.hxx','hunspell/replist.hxx','hunspell/suggestmgr.hxx',
-
-    # Removed in openssl-1.1
-    'openssl/des_old.h', 'openssl/dso.h', 'openssl/krb5_asn.h', 'openssl/kssl.h', 'openssl/pqueue.h',
-    'openssl/ssl23.h', 'openssl/ui_compat.h',
-}
-ignore.update('/usr/include/' + x for x in include_ignore)
-
-include_rename = {
-    'assuan.h': 'libassuan2/assuan.h',
-    'nss3/nssck.api': 'nss3/templates/nssck.api',
-}
-rename.update({ '/usr/include/' + k: '/usr/include/' + v for k, v in include_rename.items() })
-
-nspr_include = [
-    'nspr.h', 'plarena.h', 'plarenas.h', 'plbase64.h', 'plerror.h', 'plgetopt.h', 'plhash.h',
-    'plstr.h', 'pratom.h', 'prbit.h', 'prclist.h', 'prcmon.h', 'prcountr.h', 'prcpucfg.h',
-    'prcvar.h', 'prdtoa.h', 'prenv.h', 'prerr.h', 'prerror.h', 'prinet.h', 'prinit.h',
-    'prinrval.h', 'prio.h', 'pripcsem.h', 'private/pprio.h', 'private/pprthred.h', 'private/prpriv.h',
-    'prlink.h', 'prlock.h', 'prlog.h', 'prlong.h', 'prmem.h', 'prmon.h', 'prmwait.h', 'prnetdb.h',
-    'prolock.h', 'prpdce.h', 'prprf.h', 'prproces.h', 'prrng.h', 'prrwlock.h', 'prshm.h', 'prshma.h',
-    'prsystem.h', 'prthread.h', 'prtime.h', 'prtpool.h', 'prtrace.h', 'prtypes.h', 'prvrsion.h',
-    'prwin16.h', 'stropts.h', 'obsolete/pralarm.h', 'obsolete/probslet.h', 'obsolete/protypes.h', 'obsolete/prsem.h'
-]
-rename.update({ '/usr/include/' + x: '/usr/include/nspr4/' + x for x in nspr_include })
-
-pc_ignore = {
-    # Not enabled on Fedora
-    'harfbuzz-gobject.pc',
-
-    # https://github.com/ostroproject/ostro-os/blob/master/meta/recipes-support/libassuan/libassuan/libassuan-add-pkgconfig-support.patch
-    'libassuan.pc',
-
-    # http://cgit.openembedded.org/openembedded-core/tree/meta/recipes-support/libgpg-error/libgpg-error/pkgconfig.patch
-    'gpg-error.pc',
-
-    # http://cgit.openembedded.org/openembedded-core/tree/meta/recipes-support/libgcrypt/files/0001-Add-and-use-pkg-config-for-libgcrypt-instead-of-conf.patch
-    'libgcrypt.pc',
-}
-ignore.update('/usr/lib64/pkgconfig/' + x for x in pc_ignore)
-
-pc_rename = {
-    'python-3.5.pc': 'python-3.6.pc',
-    'python-3.5m.pc': 'python-3.6m.pc',
-}
-rename.update({ '/usr/lib64/pkgconfig/' + k: '/usr/lib64/pkgconfig/' + v for k, v in pc_rename.items() })
-rename.update({ '/usr/share/pkgconfig/' + k: '/usr/share/pkgconfig/' + v for k, v in pc_rename.items() })
-
-ignore_patterns = [
-    # Flatpak runtime has a versioned gawk-4.1.3
-    r'/usr/bin/gawk-.*',
-
-    # Architecture specific aliases for gcc, binutils, etc
-    r'^/usr/bin/x86_64-unknown-linux-.*',
-
-    # From NSPR, intentionally not installed on Fedora
-    r'/usr/include/md/.*',
-
-    # .install files litter the include directories of openembedded
-    r'.*/\.install$'
-]
-ignore_compiled = [re.compile(x) for x in ignore_patterns]
-
-rename_patterns = [
-    (r'^/usr/include/c\+\+/6.2.0/(.*)', r'/usr/include/c++/7/\1'),
-    (r'^/usr/include/c\+\+/7/x86_64-unknown-linux/(.*)', r'/usr/include/c++/7/x86_64-redhat-linux/\1'),
-    (r'^/usr/include/python3.5m/(.*)', r'/usr/include/python3.6m/\1'),
-    (r'^/usr/lib64/pkgconfig/(.*proto.pc)', r'/usr/share/pkgconfig/\1'),
-    (r'^/usr/share/fonts/liberation-fonts/(.*)', r'/usr/share/fonts/liberation/\1'),
-]
-rename_compiled = [(re.compile(a), b) for a, b in rename_patterns]
-
-platform_package_ignore_patterns = [
-    "^.*-devel$",
-    "^libappstream-glib-builder$", # may not need in the sdk either
-    "^gtk-doc$",
-    "^icu$", # may not need in the sdk either
-    '^llvm$',
-    '^sqlite$',
-]
-platform_package_ignore_compiled = [re.compile(p) for p in platform_package_ignore_patterns]
-
-
-# We need to look up a lot of file dependencies. dnf/libsolv is not fast at doing
-# this (at least when we look up files one-by-one) so we create a hash table that
-# maps from *all* files in the distribution to the "best" package that provides
-# the file. To further speed this up, we pickle the result and store it, and only
-# recreate it when the DNF metadata changes. We gzip the pickle to save space
-# (70M instead of 700M), this slows things down by about 2 seconds.
-#
-
-def package_cmp(p1, p2):
-    n1, e1, v1, r1, a1 = p1
-    n2, e2, v2, r2, a2 = p2
-
-    if a1 == 'i686' and a2 != 'i686':
-        return 1
-    if a1 != 'i686' and a2 == 'i686':
-        return -1
-
-    if n1.startswith('compat-') and not n2.startswith('compat-'):
-        return 1
-    elif n2.startswith('compat-') and not n1.startswith('compat-'):
-        return -1
-
-    if n1 < n2:
-        return -1
-    elif n1 > n2:
-        return 1
-
-    if e1 is None:
-        e1 = '0'
-    if e2 is None:
-        e2 = '0'
-
-    return - rpm.labelCompare((e1, v1, r1), (e2, v2, r2))
-
-class FilesMapHandler(xml.sax.handler.ContentHandler):
-    def __init__(self, files_map):
-        self.files_map = files_map
-        self.name = None
-        self.arch = None
-        self.epoch = None
-        self.version = None
-        self.release = None
-        self.file = None
-
-    def startElement(self, name, attrs):
-        if name == 'package':
-            self.name = attrs['name']
-            self.arch = attrs['arch']
-        elif name == 'version':
-            if self.name is not None:
-                self.epoch = attrs['epoch']
-                self.version = attrs['ver']
-                self.release = attrs['rel']
-        elif name == 'file':
-            self.file = ''
-
-    def endElement(self, name):
-        if name == 'package':
-            self.name = None
-        elif name == 'file':
-            package = (self.name, self.epoch, self.version, self.release, self.arch)
-            old = self.files_map.get(self.file)
-            if old is None or package_cmp(package, old) < 0:
-                self.files_map[self.file] = package
-
-            self.file = None
-
-    def characters(self, content):
-        if self.file is not None:
-            self.file += content
-
-def scan_filelists(filelists_path, files_map):
-    handler = FilesMapHandler(files_map)
-    with gzip.open(filelists_path, 'rb') as f:
-        xml.sax.parse(f, handler)
-
-
-def make_files_map(repo_info):
-    files_map = {}
-
-    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='filelists']/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))
-
-        scan_filelists(filelists_path, files_map)
-        done()
-
-    start("Finalizing files map")
-    for k in files_map:
-        files_map[k] = files_map[k][0]
-    done()
-
-    return files_map
-
-
-def get_files_map():
-    hash_text = ''
-    repos_dir = os.path.join(XDG_CACHE_HOME, "fedmod/repos")
-    repo_info = {}
-    for repo in REPOS:
-        repo_dir = os.path.join(repos_dir, repo, 'x86_64')
-        repomd_path = os.path.join(repo_dir, 'repodata/repomd.xml')
-        try:
-            with open(repomd_path, 'rb') as f:
-                repomd_contents = f.read()
-        except (OSError, IOError):
-            print("Cannot read {}, try 'fedmod fetch-metadata'".format(repomd_path), file=sys.stderr)
-            sys.exit(1)
-
-        repo_info[repo] = (repo_dir, repomd_contents)
-        hash_text += '{}|{}\n'.format(repo, hashlib.sha256(repomd_contents).hexdigest())
-
-    repo_hash = hashlib.sha256(hash_text.encode("UTF-8")).hexdigest()
-
-    files_map_path = os.path.join(XDG_CACHE_HOME, "fedmod/flatpak-runtime-files-map.gz")
-
-    try:
-        with gzip.open(files_map_path, 'rb') as f:
-            old_repo_hash = f.read(64).decode('utf-8')
-            if old_repo_hash == repo_hash:
-                start("Reading cached file map")
-                files_map = pickle.load(f)
-                done()
-
-                return files_map
-    except FileNotFoundError:
-        pass
-
-    files_map = make_files_map(repo_info)
-
-    start("Writing file map to cache")
-    with gzip.open(files_map_path, 'wb') as f:
-        f.write(repo_hash.encode('utf-8'))
-        pickle.dump(files_map, f)
-    done()
-
-    return files_map
-
-if len(sys.argv) != 2:
-    print("Usage: resolve-files.py INFILE", file=sys.stderr)
-    sys.exit(1)
-
-inpath = sys.argv[1]
-if not inpath.endswith('.files'):
-    print("INFILE must have .files suffix", file=sys.stderr)
-    sys.exit(1)
-
-base_path = inpath[:-len('.files')]
-is_platform = "-Platform" in base_path
-is_sdk = "-Sdk" in base_path
-
-def warn(msg):
-    print("{}: \033[31m{}\033[39m".format(inpath, msg), file=sys.stderr)
-
-def error(msg):
-    print("{}: \033[31m{}\033[39m".format(inpath, msg), file=sys.stderr)
-    sys.exit(1)
-
-def start(msg):
-    print("{}: \033[90m{} ... \033[39m".format(inpath, msg), file=sys.stderr, end="")
-    sys.stderr.flush()
-
-def done():
-    print("\033[90mdone\033[39m", file=sys.stderr)
-
-start("Reading file list")
-
-to_resolve = []
-with open(inpath) as f:
-    for l in f:
-        r = l.rstrip()
-        if r.startswith('/usr/lib/'):
-            r = '/usr/lib64/' + r[len('/usr/lib/'):]
-        to_resolve.append(r)
-
-to_resolve.sort()
-
-done()
-
-files_map = get_files_map()
-found_packages = set()
-
-start("Resolving files to packages")
-
-matched_file = open(base_path + '.matched', 'w')
-unmatched_file = open(base_path + '.unmatched', 'w')
-unmatched_count = 0
-
-for r in to_resolve:
-    if r in ignore:
-        continue
-
-    skip = False
-    for p in ignore_compiled:
-        if p.match(r) is not None:
-            skip = True
-    if skip:
-        continue
-
-    if r in rename:
-        r = rename[r]
-
-    for p, replacement in rename_compiled:
-        if p.match(r) is not None:
-            r = p.sub(replacement, r)
-
-    if r.startswith('/usr/lib64/'):
-        search = [r, '/lib64/' + os.path.basename(r)]
-    elif r.startswith('/usr/bin/'):
-        search = [r, '/bin/' + os.path.basename(r), '/usr/sbin/' + os.path.basename(r), '/sbin/' + os.path.basename(r)]
-    else:
-        search = [r]
-
-    if r.startswith('/usr/lib64/libLLVM'):
-        # freedesktop SDK builds "split" LLVM libraries
-        found_packages.add('llvm-libs')
-        continue
-
-    for s in search:
-        providing = files_map.get(s, None)
-        if providing is not None:
-            break
-
-    if providing is None:
-        print(r, file=unmatched_file)
-        unmatched_count += 1
-    else:
-        if is_platform and any(p.match(providing) is not None for p in platform_package_ignore_compiled):
-            continue
-
-        found_packages.add(providing)
-        print("{}: {}".format(r, providing), file=matched_file)
-
-unmatched_file.close()
-matched_file.close()
-
-with open(base_path + '.packages', 'w') as f:
-    for p in sorted(found_packages):
-        print(p, file=f)
-
-done()
-
-if unmatched_count > 0:
-    warn("{} unmatched files, see {}".format(unmatched_count, base_path + ".unmatched"))

diff --git a/tools/generate-files.sh b/tools/generate-files.sh
new file mode 100755
index 0000000..24be4e3
--- /dev/null
+++ b/tools/generate-files.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+out=$1
+base=$(basename $out)
+
+case $base in
+    freedesktop-*)
+	ns=org.freedesktop
+	version=1.6
+	;;
+    gnome-*)
+	ns=org.gnome
+	version=3.26
+	;;
+    *)
+	echo 1>&2 "Can't identify runtime for $base"
+	exit 1
+	;;
+esac
+
+case $base in
+    *-Platform.files)
+	sdk=
+	type=Platform
+	;;
+    *-Sdk.files)
+	sdk=--sdk
+	type=Sdk
+	;;
+    *)
+	echo 1>&2 "Can't identify type for $base"
+	exit 1
+	;;
+esac
+
+runtime="$ns.$type/x86_64/$version"
+
+echo "$base: listing files in $runtime"
+
+flatpak run --file-forwarding --command=/usr/bin/python3 $runtime @@ tools/list-files.py @@ $sdk > $out

diff --git a/tools/generate-modulemd.py b/tools/generate-modulemd.py
new file mode 100755
index 0000000..b3bb4ef
--- /dev/null
+++ b/tools/generate-modulemd.py
@@ -0,0 +1,20 @@
+#!/usr/bin/python3
+import sys
+from yaml_utils import ordered_load, ordered_dump
+
+with open('flatpak-runtime.in.yaml') as f:
+    modulemd = ordered_load(f)
+
+def set_profile(profile_name, list_file):
+    with open(list_file) as f:
+        packages = [l.strip() for l in f]
+    print("{}: {} packages".format(profile_name, len(packages)), file=sys.stderr)
+    modulemd['data']['profiles'][profile_name] = packages
+
+set_profile('runtime', 'out/runtime.profile')
+set_profile('runtime-base', 'out/runtime-base.profile')
+set_profile('sdk', 'out/sdk.profile')
+set_profile('sdk-base', 'out/sdk-base.profile')
+
+with open('flatpak-runtime.yaml', 'w') as f:
+    ordered_dump(modulemd, stream=f, default_flow_style=False, encoding="utf-8")

diff --git a/tools/generate-report.py b/tools/generate-report.py
new file mode 100755
index 0000000..a64a008
--- /dev/null
+++ b/tools/generate-report.py
@@ -0,0 +1,401 @@
+#!/usr/bin/python3
+
+from jinja2 import Environment, FileSystemLoader, select_autoescape
+import json
+import locale
+import os
+import re
+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)
+
+def warn(msg):
+    print("{}: \033[31m{}\033[39m".format(os.path.basename(sys.argv[0]), msg), file=sys.stderr)
+
+def fedmod_output(args):
+    return subprocess.check_output(['pipenv', 'run', 'fedmod'] + args, encoding='utf-8', cwd='/home/otaylor/Source/fedmod')
+
+_nvr_to_name_re = re.compile('^(.*)-[^-]*-[^-]*')
+def nvr_to_name(nvr):
+    return _nvr_to_name_re.match(nvr).group(1)
+
+class Package(object):
+    def __init__(self, name):
+        self.name = name
+        self.freedesktop_platform = 0
+        self.freedesktop_platform_files = None
+        self.freedesktop_platform_required_by = None
+        self.gnome_platform = 0
+        self.gnome_platform_files = None
+        self.gnome_platform_required_by = None
+        self.freedesktop_sdk = 0
+        self.freedesktop_sdk_files = None
+        self.freedesktop_sdk_required_by = None
+        self.gnome_sdk = 0
+        self.gnome_sdk_files = None
+        self.gnome_sdk_required_by = None
+        self.live = 0
+        self.rf26 = 0
+        self.source_package = None
+        self.flag = None
+        self._note = None
+
+    @property
+    def runtimes(self):
+        return self.freedesktop_platform or self.gnome_platform or self.freedesktop_sdk or self.gnome_sdk
+
+    @property
+    def klass(self):
+        if self.flag == 'F':
+            return "flagged"
+        elif self.flag == 'F?':
+            return "questionable"
+        elif self.flag == 'FD':
+            return "flagged-dep"
+        elif self.flag == 'W':
+            return "waived"
+        elif self.gnome_platform and not self.live:
+            return "questionable"
+
+    @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"
+        elif self._note:
+            return self._note
+        else:
+            return ""
+
+    def why(self, which):
+        files = getattr(self, which + '_files')
+        if files is None:
+            files_str = ''
+        elif len(files) <= 3:
+            files_str=  'Files: ' + ' '.join(files)
+        else:
+            files_str = 'Files: ' + ' '.join(files[:3]) + ' ...'
+
+        required_by = getattr(self, which + '_required_by')
+        if required_by is None:
+            required_by_str = ''
+        else:
+            required_by_str = '\n'.join('{} ({})'.format(req, provider) for req, provider in required_by)
+
+        if files_str and required_by_str:
+            return files_str + '\n' + required_by_str
+        elif files_str:
+            return files_str
+        elif required_by_str:
+            return required_by_str
+        else:
+            return ''
+
+    @property
+    def freedesktop_platform_why(self):
+        return self.why('freedesktop_platform')
+
+    @property
+    def freedesktop_sdk_why(self):
+        return self.why('freedesktop_sdk')
+
+    @property
+    def gnome_platform_why(self):
+        return self.why('gnome_platform')
+
+    @property
+    def gnome_sdk_why(self):
+        return self.why('gnome_sdk')
+
+    def inclusion(self, which):
+        level = getattr(self, which)
+        if level == 0:
+            return 'absent'
+        elif level == 1:
+            return 'dep'
+        else:
+            required_by = getattr(self, which + '_required_by', False)
+            if required_by is False:
+                return 'present'
+            elif required_by is not None and len(required_by) > 0:
+                return 'files'
+            else:
+                return 'root'
+
+    @property
+    def freedesktop_platform_inclusion(self):
+        return self.inclusion('freedesktop_platform')
+
+    @property
+    def freedesktop_sdk_inclusion(self):
+        return self.inclusion('freedesktop_sdk')
+
+    @property
+    def gnome_platform_inclusion(self):
+        return self.inclusion('gnome_platform')
+
+    @property
+    def gnome_sdk_inclusion(self):
+        return self.inclusion('gnome_sdk')
+
+    @property
+    def live_inclusion(self):
+        return self.inclusion('live')
+
+    @property
+    def rf26_inclusion(self):
+        return self.inclusion('rf26')
+
+class SourcePackage(object):
+    def __init__(self, name):
+        self.name = name
+        self.packages = []
+
+    @property
+    def modules(self):
+        old_modules = self.packages[0].modules
+        klass = self.klass
+        if klass == "build-platform":
+            new_module = "desktop-runtime"
+        elif klass == "build-sdk":
+            new_module = "flatpak-runtime"
+        else:
+            new_module = None
+
+        if old_modules and new_module:
+            return old_modules + " ⇒ " + new_module
+        elif old_modules:
+            return old_modules
+        else:
+            return new_module
+
+    @property
+    def sdk_only(self):
+        return sdk_only
+
+    @property
+    def klass(self):
+        if self.packages[0].modules in ("", "installer"):
+            sdk_only = True
+            for package in self.packages:
+                if package.freedesktop_platform or package.gnome_platform:
+                    sdk_only = False
+            if sdk_only:
+                return "build-sdk"
+            else:
+                return "build-platform"
+        else:
+            return ""
+
+class Letter(object):
+    def __init__(self, letter):
+        self.letter = letter
+        self.packages = []
+
+#
+# Get information about packages
+#
+
+packages = dict()
+def add_package(name, which, level, only_if_exists=False, source_package=None):
+    pkg = packages.get(name, None)
+    if pkg is None:
+        if only_if_exists:
+            return
+        pkg = Package(name)
+        packages[name] = pkg
+    if getattr(pkg, which) < level:
+        setattr(pkg, which, level)
+    if source_package is not None:
+        pkg.source_package = source_package
+
+def add_packages(filename, which, resolve_deps=False, only_if_exists=False):
+    start("Adding packages from {}".format(filename))
+    with open(filename) as f:
+        pkgs = set(line.strip() for line in f)
+
+    if resolve_deps:
+        resolved_packages = json.loads(fedmod_output(['resolve-deps', '--json'] + list(pkgs)))
+        for package in resolved_packages:
+            name = nvr_to_name(package['rpm'])
+            srpm_name = nvr_to_name(package['srpm'])
+            add_package(name, which, level=(2 if name in pkgs else 1),
+                        source_package=srpm_name, only_if_exists=only_if_exists)
+
+        for package in resolved_packages:
+            for req, providers in package['requires'].items():
+                provider = nvr_to_name(providers[0])
+                provider_package = packages.get(provider, None)
+                if provider_package is None: # filtered out of the resolve-deps output - e.g., fedora-release
+                    continue
+                required_by = getattr(provider_package, which + '_required_by')
+                if required_by is None:
+                    required_by = []
+                    setattr(provider_package, which + '_required_by', required_by)
+                required_by.append((nvr_to_name(package['rpm']), req))
+    else:
+        for package in pkgs:
+            add_package(package, which, level=2, only_if_exists=only_if_exists)
+
+    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('data/f27-live.packages', 'live', only_if_exists=True)
+add_packages('data/f26-flatpak-runtime.packages', 'rf26', only_if_exists=True)
+
+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')
+
+source_packages = {}
+for package in packages.values():
+    source_package = source_packages.get(package.source_package, None)
+    if source_package is None:
+        source_package = SourcePackage(package.source_package)
+        source_packages[source_package.name] = source_package
+    source_package.packages.append(package)
+
+letters_map = dict()
+for k, v in source_packages.items():
+    v.packages.sort(key=lambda p: locale.strxfrm(p.name))
+    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 = fedmod_output(['list-rpms', '--list-modules'])
+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()
+
+start("Loading package notes")
+comment_re = re.compile(r'\s*#.*')
+flag_re = re.compile(r'[A-Z?]+$')
+package_re = re.compile(r'\S+')
+
+with open("package-notes.txt") as f:
+    for line in f:
+        line = comment_re.sub('', line)
+        line = line.strip()
+        if line == '':
+            continue
+        parts = line.split(":", 2)
+        name = parts[0].strip()
+        if not re.match(package_re, name):
+            warn("Can't parse package note: {}".format(line))
+            continue
+        if len(parts) == 1:
+            flag = note = None
+        elif len(parts) == 2:
+            x = parts[1].strip()
+            if flag_re.match(x):
+                flag = x
+                note = None
+            else:
+                note = x
+                flag = None
+        elif len(parts) == 3:
+            x = parts[1].strip()
+            if flag_re.match(x):
+                flag = x
+                note = parts[2].strip()
+            else:
+                flag = None
+                note = parts[1] + ':' + parts[2]
+
+        pkg = packages.get(name, None)
+        if pkg is None:
+            warn("Package note for missing package: {}".format(name))
+            continue
+
+        if flag is not None:
+            pkg.flag = flag
+        if note is not None:
+            pkg._note = note
+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 profiles
+#
+def generate_profile(outfile, which):
+    with open(outfile, 'w') as f:
+        for letter in letters:
+            for src in letter.packages:
+                for pkg in src.packages:
+                    if getattr(pkg, which) != 0:
+                        print(pkg.name, file=f)
+
+generate_profile('out/runtime-base.profile', 'freedesktop_platform')
+generate_profile('out/sdk-base.profile', 'freedesktop_sdk')
+generate_profile('out/runtime.profile', 'gnome_platform')
+generate_profile('out/sdk.profile', 'gnome_sdk')
+
+#
+# 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))

diff --git a/tools/list-files.py b/tools/list-files.py
new file mode 100755
index 0000000..3e95058
--- /dev/null
+++ b/tools/list-files.py
@@ -0,0 +1,45 @@
+#!/usr/bin/python3
+
+import os
+import re
+import sys
+
+sdk = len(sys.argv) > 1 and sys.argv[1] == '--sdk'
+
+def output_dir(d):
+    for f in sorted(os.listdir(d)):
+        full = os.path.join(d, f)
+        if not os.path.isdir(full):
+            print(os.path.join(d, f))
+
+def output_dir_recurse(d):
+    for dirName, subdirs, files in os.walk(d):
+            for f in sorted(files):
+              print(os.path.join(dirName, f))
+
+output_dir('/usr/bin')
+
+for f in os.listdir('/usr/lib'):
+    full = os.path.join('/usr/lib', f)
+    if (re.match(r'^.*\.so\.\d+$', f) is not None or
+        re.match(r'^.*\.so$', f) is not None and not os.path.islink(full)):
+        print(full)
+
+output_dir_recurse('/usr/share/fonts')
+
+if sdk:
+    output_dir_recurse('/usr/include')
+    output_dir('/usr/lib/pkgconfig')
+    output_dir('/usr/share/pkgconfig')
+
+# import pkgutil
+# for f in pkgutil.iter_modules():
+#     try:
+#         path = f[0].path
+#         if path.find('site-packages') < 0:
+#             continue
+#     except AttributeError:
+#         continue
+#     if not(f[1].startswith('_')):
+#         print(f, 'python3dist({})'.format(f[1]))
+

diff --git a/tools/resolve-files.py b/tools/resolve-files.py
new file mode 100755
index 0000000..de5631f
--- /dev/null
+++ b/tools/resolve-files.py
@@ -0,0 +1,531 @@
+#!/usr/bin/python3
+
+from functools import cmp_to_key
+import gzip
+import hashlib
+import os
+import pickle
+import re
+import rpm
+import sys
+import xml.etree.ElementTree as ET
+import xml.sax
+
+XDG_CACHE_HOME = os.environ.get("XDG_CACHE_HOME") or os.path.expanduser("~/.cache")
+
+# This needs to be in sync with fedmod
+REPOS = [
+    "f28-packages"
+]
+
+ignore = set()
+rename = dict()
+
+bin_ignore = [
+    # A bunch of binaries built as part of nss. A few of these are
+    # in /usr/lib64/nss/unsupported-tools/ as part of nss-tools, the rest are not considered
+    # worth installing at all (test utilities, etc.)
+    'addbuiltin', 'atob', 'baddbdir', 'bltest', 'btoa', 'certcgi', 'chktest', 'conflict',
+    'crmftest', 'dbtest', 'derdump', 'dertimetest', 'digest', 'ecperf', 'encodeinttest',
+    'fipstest', 'httpserv', 'listsuites', 'makepqg', 'mangle', 'multinit', 'nonspr10',
+    'ocspclnt', 'ocspresp', 'oidcalc', 'p7content', 'p7env', 'p7sign', 'p7verify',
+    'pk11gcmtest', 'pk11mode', 'pk1sign', 'pkix-errcodes', 'pp', 'pwdecrypt', 'remtest',
+    'rsaperf', 'sdrtest', 'secmodtest', 'selfserv', 'shlibsign', 'signtool', 'strsclnt',
+    'symkeyutil', 'tstclnt', 'vfychain', 'vfyserv',
+
+    # Script added into nss by openembedded
+    'signlibs.sh',
+
+    # /usr/share/doc/aspell/aspell-import in Fedora
+    'aspell-import',
+
+    # Removed in perl-5.27
+    'c2ph',
+
+    # Removed - https://lists.fedorahosted.org/archives/list/elfutils-devel@lists.fedorahosted.org/thread/22LIIMXI6EDGCOIO6QFSBUO2KHEXIGSJ/
+    'eu-ld',
+
+    # compatibility perl script in zenity for something quite old, not packaged in fedora
+    'gdialog',
+
+    # An openembedded thing
+    # "Tool that installs the GNU config.guess / config.sub into a directory tree"
+    'gnu-configize',
+
+    # GPG test program (https://git.gnupg.org/cgi-bin/gitweb.cgi?p=gnupg.git;a=tree;f=tests)
+    'gpgscm',
+
+    # An implementation of tar for cross-platform compatibility, disabled in gnupg2.spec
+    'gpgtar',
+
+    # Removed from gtk-doc
+    # https://git.gnome.org/browse/gtk-doc/commit/?id=46df4354abed5724697fd5e39630c5bbc6637cc4
+    'gtkdoc-mktmpl',
+
+    # Versioned python-3.5 binaries
+    'idle3.5', 'pydoc3.5', 'python3.5', 'python3.5-config', 'python3.5m',  'python3.5m-config', '2to3-3.5',
+
+    # installed in openembedded with a coreutils suffix along with the more normal version
+    'kill.coreutils', 'uptime.coreutils',
+
+    # nettle utilities not currently packaged in fedora
+    # (https://src.fedoraproject.org/rpms/nettle/c/2ec204e2de17006b566c9ff7d90ec65ca1680ed5?branch=master)
+    'nettle-hash', 'nettle-lfib-stream', 'nettle-pbkdf2', 'pkcs1-conv', 'sexp-conv',
+
+    # Not built by default as of util-linux-2.29
+    '/usr/bin/pg',
+
+    # These are installed as <name>-64 in Fedora, we just ignore them because they will be
+    # pulled in by the corresponding library
+    'gdk-pixbuf-query-loaders', 'gtk-query-immodules-2.0',
+    'gio-querymodules', 'gtk-query-immodules-3.0',
+
+    # Removed in krb5-1.13 (https://web.mit.edu/kerberos/krb5-1.13/README-1.13.5.txt)
+    'krb5-send-pr',
+
+    # Removed in util-linux-2.30'
+    'tailf',
+
+    # OpenEmbedded uses Debian's ca-certificates, Fedora is different
+    'update-ca-certificates',
+
+    #########################################################################
+    # In the freedesktop runtime for some reason, doesn't seem useful
+    'bsdcat',
+
+    # Same as 'openssl rehash', but as a perl script (openssl-perl)
+    'c_rehash',
+
+    # From pulseaudio, wrapper script to start a pulseaudio server as if it was ESD (pulseaudio-esound-compat)
+    'esdcompat',
+
+    # Just need the library (gcab)
+    'gcab',
+
+    # Probably not useful in the runtime or the SDK (gstreamer-plugins-base-tools)
+    'gst-device-monitor-1.0', 'gst-discoverer-1.0', 'gst-play-1.0',
+
+    # Python utilities (python2-tools)
+    'idle', 'smtpd.py',
+
+    # Python3 utilities (python3-tools)
+    'idle3', '2to3',
+
+    # A binary from cups, we just need the libraries (cups-libs)
+    'ipptool',
+
+    # Minimal profiler (glibc-utils)
+    'pcprofiledump',
+
+    # (pcre-tools)
+    'pcre2grep', 'pcre2test',
+
+    # Random test program from libproxy (libproxy-bin)
+    'proxy',
+
+    # Tools from libvpx (libvpx-utils)
+    'vpxdec', 'vpxenc',
+]
+ignore.update('/usr/bin/' + x for x in bin_ignore)
+
+bin_rename = {
+    # lcms2 compiled with --program-suffix=2 in Fedora, even though there are no actual
+    # conflicts between lcms and lcms2 - jpegicc was renamed to jpgicc, etc.
+    'jpgicc': 'jpgicc2',
+    'linkicc': 'linkicc2',
+    'psicc': 'psicc2',
+    'tificc': 'tificc2',
+    'transicc': 'transicc2',
+}
+rename.update({ '/usr/bin/' + k: '/usr/bin/' + v for k, v in bin_rename.items() })
+
+lib_ignore = [
+    # Symlink created in freedesktop.org flatpak runtime, not standard
+    'libEGL_indirect.so.0',
+
+    # Removed in gpgme-1.9.0
+    'libgpgme-pthread.so.11',
+
+    # Not enabled in fedora (consider fixing)
+    'libharfbuzz-gobject.so.0',
+
+    # Part of glibc
+    'libssp.so.0',
+]
+ignore.update('/usr/lib64/' + x for x in lib_ignore)
+
+fonts_ignore = {
+    # Added in 2.36
+    'dejavu/DejaVuMathTeXGyre.ttf',
+}
+ignore.update('/usr/share/fonts/' + x for x in fonts_ignore)
+
+lib_rename = {
+    # Newer in Fedora
+    'libhunspell-1.3.so.0': 'libhunspell-1.5.so.0',
+    'libwebp.so.6': 'libwebp.so.7',
+    'libwebpmux.so.2': 'libwebpmux.so.3',
+    'libpcre2-posix.so.1': 'libpcre2-posix.so.2',
+    'libvpx.so.3': 'libvpx.so.4',
+    'libkadm5clnt_mit.so.9': 'libkadm5clnt_mit.so.11',
+    'libkadm5srv_mit.so.9': 'libkadm5srv_mit.so.11',
+
+    # Newer in Flatpak runtime
+    'libprocps.so.6': 'libprocps.so.4', # procps-3.10 vs. procps-3.12
+    'libgif.so.7': 'libgif.so.4', # giflib 4 vs giflib-5 - https://bugzilla.redhat.com/show_bug.cgi?id=822844
+
+    # Fedora arch-handling
+    'ld-linux.so.2': 'ld-linux-x86-64.so.2',
+}
+rename.update({ '/usr/lib64/' + k: '/usr/lib64/' + v for k, v in lib_rename.items() })
+
+include_ignore = {
+    # https://git.gnome.org/browse/at-spi2-core/commit/?id=1eb223bb48464d707290ef540581e9763b0ceee8
+    'at-spi-2.0/atspi/atspi-gmain.c',
+
+    # Removed in 7.55 https://github.com/curl/curl/commit/73a2fcea0b4adea6ba342cd7ed1149782c214ae3
+    'curl/curlbuild-64.h', 'curl/curlbuild.h', 'curl/curlrules.h',
+
+    # Not enabled on Fedora
+    'harfbuzz/hb-gobject-enums.h',
+    'harfbuzz/hb-gobject-structs.h',
+    'harfbuzz/hb-gobject.h',
+
+    # https://github.com/hunspell/hunspell/commit/99675e791d123cbe1be914b1a49dd83062134301
+    'hunspell/affentry.hxx', 'hunspell/affixmgr.hxx', 'hunspell/baseaffix.hxx', 'hunspell/dictmgr.hxx',
+    'hunspell/filemgr.hxx','hunspell/hashmgr.hxx','hunspell/hunzip.hxx','hunspell/langnum.hxx',
+    'hunspell/phonet.hxx','hunspell/replist.hxx','hunspell/suggestmgr.hxx',
+
+    # Removed in openssl-1.1
+    'openssl/des_old.h', 'openssl/dso.h', 'openssl/krb5_asn.h', 'openssl/kssl.h', 'openssl/pqueue.h',
+    'openssl/ssl23.h', 'openssl/ui_compat.h',
+}
+ignore.update('/usr/include/' + x for x in include_ignore)
+
+include_rename = {
+    'assuan.h': 'libassuan2/assuan.h',
+    'nss3/nssck.api': 'nss3/templates/nssck.api',
+}
+rename.update({ '/usr/include/' + k: '/usr/include/' + v for k, v in include_rename.items() })
+
+nspr_include = [
+    'nspr.h', 'plarena.h', 'plarenas.h', 'plbase64.h', 'plerror.h', 'plgetopt.h', 'plhash.h',
+    'plstr.h', 'pratom.h', 'prbit.h', 'prclist.h', 'prcmon.h', 'prcountr.h', 'prcpucfg.h',
+    'prcvar.h', 'prdtoa.h', 'prenv.h', 'prerr.h', 'prerror.h', 'prinet.h', 'prinit.h',
+    'prinrval.h', 'prio.h', 'pripcsem.h', 'private/pprio.h', 'private/pprthred.h', 'private/prpriv.h',
+    'prlink.h', 'prlock.h', 'prlog.h', 'prlong.h', 'prmem.h', 'prmon.h', 'prmwait.h', 'prnetdb.h',
+    'prolock.h', 'prpdce.h', 'prprf.h', 'prproces.h', 'prrng.h', 'prrwlock.h', 'prshm.h', 'prshma.h',
+    'prsystem.h', 'prthread.h', 'prtime.h', 'prtpool.h', 'prtrace.h', 'prtypes.h', 'prvrsion.h',
+    'prwin16.h', 'stropts.h', 'obsolete/pralarm.h', 'obsolete/probslet.h', 'obsolete/protypes.h', 'obsolete/prsem.h'
+]
+rename.update({ '/usr/include/' + x: '/usr/include/nspr4/' + x for x in nspr_include })
+
+pc_ignore = {
+    # Not enabled on Fedora
+    'harfbuzz-gobject.pc',
+
+    # https://github.com/ostroproject/ostro-os/blob/master/meta/recipes-support/libassuan/libassuan/libassuan-add-pkgconfig-support.patch
+    'libassuan.pc',
+
+    # http://cgit.openembedded.org/openembedded-core/tree/meta/recipes-support/libgpg-error/libgpg-error/pkgconfig.patch
+    'gpg-error.pc',
+
+    # http://cgit.openembedded.org/openembedded-core/tree/meta/recipes-support/libgcrypt/files/0001-Add-and-use-pkg-config-for-libgcrypt-instead-of-conf.patch
+    'libgcrypt.pc',
+}
+ignore.update('/usr/lib64/pkgconfig/' + x for x in pc_ignore)
+
+pc_rename = {
+    'python-3.5.pc': 'python-3.6.pc',
+    'python-3.5m.pc': 'python-3.6m.pc',
+}
+rename.update({ '/usr/lib64/pkgconfig/' + k: '/usr/lib64/pkgconfig/' + v for k, v in pc_rename.items() })
+rename.update({ '/usr/share/pkgconfig/' + k: '/usr/share/pkgconfig/' + v for k, v in pc_rename.items() })
+
+ignore_patterns = [
+    # Flatpak runtime has a versioned gawk-4.1.3
+    r'/usr/bin/gawk-.*',
+
+    # Architecture specific aliases for gcc, binutils, etc
+    r'^/usr/bin/x86_64-unknown-linux-.*',
+
+    # From NSPR, intentionally not installed on Fedora
+    r'/usr/include/md/.*',
+
+    # .install files litter the include directories of openembedded
+    r'.*/\.install$'
+]
+ignore_compiled = [re.compile(x) for x in ignore_patterns]
+
+rename_patterns = [
+    (r'^/usr/include/c\+\+/6.2.0/(.*)', r'/usr/include/c++/7/\1'),
+    (r'^/usr/include/c\+\+/7/x86_64-unknown-linux/(.*)', r'/usr/include/c++/7/x86_64-redhat-linux/\1'),
+    (r'^/usr/include/python3.5m/(.*)', r'/usr/include/python3.6m/\1'),
+    (r'^/usr/lib64/pkgconfig/(.*proto.pc)', r'/usr/share/pkgconfig/\1'),
+    (r'^/usr/share/fonts/liberation-fonts/(.*)', r'/usr/share/fonts/liberation/\1'),
+]
+rename_compiled = [(re.compile(a), b) for a, b in rename_patterns]
+
+platform_package_ignore_patterns = [
+    "^.*-devel$",
+    "^libappstream-glib-builder$", # may not need in the sdk either
+    "^gtk-doc$",
+    "^icu$", # may not need in the sdk either
+    '^llvm$',
+    '^sqlite$',
+]
+platform_package_ignore_compiled = [re.compile(p) for p in platform_package_ignore_patterns]
+
+
+# We need to look up a lot of file dependencies. dnf/libsolv is not fast at doing
+# this (at least when we look up files one-by-one) so we create a hash table that
+# maps from *all* files in the distribution to the "best" package that provides
+# the file. To further speed this up, we pickle the result and store it, and only
+# recreate it when the DNF metadata changes. We gzip the pickle to save space
+# (70M instead of 700M), this slows things down by about 2 seconds.
+#
+
+def package_cmp(p1, p2):
+    n1, e1, v1, r1, a1 = p1
+    n2, e2, v2, r2, a2 = p2
+
+    if a1 == 'i686' and a2 != 'i686':
+        return 1
+    if a1 != 'i686' and a2 == 'i686':
+        return -1
+
+    if n1.startswith('compat-') and not n2.startswith('compat-'):
+        return 1
+    elif n2.startswith('compat-') and not n1.startswith('compat-'):
+        return -1
+
+    if n1 < n2:
+        return -1
+    elif n1 > n2:
+        return 1
+
+    if e1 is None:
+        e1 = '0'
+    if e2 is None:
+        e2 = '0'
+
+    return - rpm.labelCompare((e1, v1, r1), (e2, v2, r2))
+
+class FilesMapHandler(xml.sax.handler.ContentHandler):
+    def __init__(self, files_map):
+        self.files_map = files_map
+        self.name = None
+        self.arch = None
+        self.epoch = None
+        self.version = None
+        self.release = None
+        self.file = None
+
+    def startElement(self, name, attrs):
+        if name == 'package':
+            self.name = attrs['name']
+            self.arch = attrs['arch']
+        elif name == 'version':
+            if self.name is not None:
+                self.epoch = attrs['epoch']
+                self.version = attrs['ver']
+                self.release = attrs['rel']
+        elif name == 'file':
+            self.file = ''
+
+    def endElement(self, name):
+        if name == 'package':
+            self.name = None
+        elif name == 'file':
+            package = (self.name, self.epoch, self.version, self.release, self.arch)
+            old = self.files_map.get(self.file)
+            if old is None or package_cmp(package, old) < 0:
+                self.files_map[self.file] = package
+
+            self.file = None
+
+    def characters(self, content):
+        if self.file is not None:
+            self.file += content
+
+def scan_filelists(filelists_path, files_map):
+    handler = FilesMapHandler(files_map)
+    with gzip.open(filelists_path, 'rb') as f:
+        xml.sax.parse(f, handler)
+
+
+def make_files_map(repo_info):
+    files_map = {}
+
+    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='filelists']/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))
+
+        scan_filelists(filelists_path, files_map)
+        done()
+
+    start("Finalizing files map")
+    for k in files_map:
+        files_map[k] = files_map[k][0]
+    done()
+
+    return files_map
+
+
+def get_files_map():
+    hash_text = ''
+    repos_dir = os.path.join(XDG_CACHE_HOME, "fedmod/repos")
+    repo_info = {}
+    for repo in REPOS:
+        repo_dir = os.path.join(repos_dir, repo, 'x86_64')
+        repomd_path = os.path.join(repo_dir, 'repodata/repomd.xml')
+        try:
+            with open(repomd_path, 'rb') as f:
+                repomd_contents = f.read()
+        except (OSError, IOError):
+            print("Cannot read {}, try 'fedmod fetch-metadata'".format(repomd_path), file=sys.stderr)
+            sys.exit(1)
+
+        repo_info[repo] = (repo_dir, repomd_contents)
+        hash_text += '{}|{}\n'.format(repo, hashlib.sha256(repomd_contents).hexdigest())
+
+    repo_hash = hashlib.sha256(hash_text.encode("UTF-8")).hexdigest()
+
+    files_map_path = os.path.join(XDG_CACHE_HOME, "fedmod/flatpak-runtime-files-map.gz")
+
+    try:
+        with gzip.open(files_map_path, 'rb') as f:
+            old_repo_hash = f.read(64).decode('utf-8')
+            if old_repo_hash == repo_hash:
+                start("Reading cached file map")
+                files_map = pickle.load(f)
+                done()
+
+                return files_map
+    except FileNotFoundError:
+        pass
+
+    files_map = make_files_map(repo_info)
+
+    start("Writing file map to cache")
+    with gzip.open(files_map_path, 'wb') as f:
+        f.write(repo_hash.encode('utf-8'))
+        pickle.dump(files_map, f)
+    done()
+
+    return files_map
+
+if len(sys.argv) != 2:
+    print("Usage: resolve-files.py INFILE", file=sys.stderr)
+    sys.exit(1)
+
+inpath = sys.argv[1]
+if not inpath.endswith('.files'):
+    print("INFILE must have .files suffix", file=sys.stderr)
+    sys.exit(1)
+
+base_path = inpath[:-len('.files')]
+is_platform = "-Platform" in base_path
+is_sdk = "-Sdk" in base_path
+
+def warn(msg):
+    print("{}: \033[31m{}\033[39m".format(inpath, msg), file=sys.stderr)
+
+def error(msg):
+    print("{}: \033[31m{}\033[39m".format(inpath, msg), file=sys.stderr)
+    sys.exit(1)
+
+def start(msg):
+    print("{}: \033[90m{} ... \033[39m".format(inpath, msg), file=sys.stderr, end="")
+    sys.stderr.flush()
+
+def done():
+    print("\033[90mdone\033[39m", file=sys.stderr)
+
+start("Reading file list")
+
+to_resolve = []
+with open(inpath) as f:
+    for l in f:
+        r = l.rstrip()
+        if r.startswith('/usr/lib/'):
+            r = '/usr/lib64/' + r[len('/usr/lib/'):]
+        to_resolve.append(r)
+
+to_resolve.sort()
+
+done()
+
+files_map = get_files_map()
+found_packages = set()
+
+start("Resolving files to packages")
+
+matched_file = open(base_path + '.matched', 'w')
+unmatched_file = open(base_path + '.unmatched', 'w')
+unmatched_count = 0
+
+for r in to_resolve:
+    if r in ignore:
+        continue
+
+    skip = False
+    for p in ignore_compiled:
+        if p.match(r) is not None:
+            skip = True
+    if skip:
+        continue
+
+    if r in rename:
+        r = rename[r]
+
+    for p, replacement in rename_compiled:
+        if p.match(r) is not None:
+            r = p.sub(replacement, r)
+
+    if r.startswith('/usr/lib64/'):
+        search = [r, '/lib64/' + os.path.basename(r)]
+    elif r.startswith('/usr/bin/'):
+        search = [r, '/bin/' + os.path.basename(r), '/usr/sbin/' + os.path.basename(r), '/sbin/' + os.path.basename(r)]
+    else:
+        search = [r]
+
+    if r.startswith('/usr/lib64/libLLVM'):
+        # freedesktop SDK builds "split" LLVM libraries
+        found_packages.add('llvm-libs')
+        continue
+
+    for s in search:
+        providing = files_map.get(s, None)
+        if providing is not None:
+            break
+
+    if providing is None:
+        print(r, file=unmatched_file)
+        unmatched_count += 1
+    else:
+        if is_platform and any(p.match(providing) is not None for p in platform_package_ignore_compiled):
+            continue
+
+        found_packages.add(providing)
+        print("{}: {}".format(r, providing), file=matched_file)
+
+unmatched_file.close()
+matched_file.close()
+
+with open(base_path + '.packages', 'w') as f:
+    for p in sorted(found_packages):
+        print(p, file=f)
+
+done()
+
+if unmatched_count > 0:
+    warn("{} unmatched files, see {}".format(unmatched_count, base_path + ".unmatched"))

diff --git a/tools/yaml_utils.py b/tools/yaml_utils.py
new file mode 100644
index 0000000..1272836
--- /dev/null
+++ b/tools/yaml_utils.py
@@ -0,0 +1,25 @@
+import yaml
+# https://stackoverflow.com/questions/5121931/in-python-how-can-you-load-yaml-mappings-as-ordereddicts
+
+from collections import OrderedDict
+
+def ordered_load(stream, Loader=yaml.Loader, object_pairs_hook=OrderedDict):
+    class OrderedLoader(Loader):
+        pass
+    def construct_mapping(loader, node):
+        loader.flatten_mapping(node)
+        return object_pairs_hook(loader.construct_pairs(node))
+    OrderedLoader.add_constructor(
+        yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG,
+        construct_mapping)
+    return yaml.load(stream, OrderedLoader)
+
+def ordered_dump(data, stream=None, Dumper=yaml.SafeDumper, **kwds):
+    class OrderedDumper(Dumper):
+        pass
+    def _dict_representer(dumper, data):
+        return dumper.represent_mapping(
+            yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG,
+            data.items())
+    OrderedDumper.add_representer(OrderedDict, _dict_representer)
+    return yaml.dump(data, stream, OrderedDumper, **kwds)

diff --git a/yaml_utils.py b/yaml_utils.py
deleted file mode 100644
index 1272836..0000000
--- a/yaml_utils.py
+++ /dev/null
@@ -1,25 +0,0 @@
-import yaml
-# https://stackoverflow.com/questions/5121931/in-python-how-can-you-load-yaml-mappings-as-ordereddicts
-
-from collections import OrderedDict
-
-def ordered_load(stream, Loader=yaml.Loader, object_pairs_hook=OrderedDict):
-    class OrderedLoader(Loader):
-        pass
-    def construct_mapping(loader, node):
-        loader.flatten_mapping(node)
-        return object_pairs_hook(loader.construct_pairs(node))
-    OrderedLoader.add_constructor(
-        yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG,
-        construct_mapping)
-    return yaml.load(stream, OrderedLoader)
-
-def ordered_dump(data, stream=None, Dumper=yaml.SafeDumper, **kwds):
-    class OrderedDumper(Dumper):
-        pass
-    def _dict_representer(dumper, data):
-        return dumper.represent_mapping(
-            yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG,
-            data.items())
-    OrderedDumper.add_representer(OrderedDict, _dict_representer)
-    return yaml.dump(data, stream, OrderedDumper, **kwds)

                 reply	other threads:[~2026-09-11 14:40 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=178913761293.1.7372116763432216545.flatpaks-flatpak-runtime-db33c7e13940@fedoraproject.org \
    --to=otaylor@fishsoup.net \
    --cc=git-commits@fedoraproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox