import re, sys, os, collections buildroot = sys.argv[1] known_files = sys.stdin.read().splitlines() known_files = {line.split()[-1]:line for line in known_files} def files(root): os.chdir(root) todo = collections.deque(['.']) while todo: n = todo.pop() files = os.scandir(n) for file in files: yield file if file.is_dir() and not file.is_symlink(): todo.append(file) o_libs = open('.file-list-libs', 'w') o_udev = open('.file-list-udev', 'w') o_pam = open('.file-list-pam', 'w') o_rpm_macros = open('.file-list-rpm-macros', 'w') o_devel = open('.file-list-devel', 'w') o_container = open('.file-list-container', 'w') o_networkd = open('.file-list-networkd', 'w') o_oomd_defaults = open('.file-list-oomd-defaults', 'w') o_remote = open('.file-list-remote', 'w') o_resolve = open('.file-list-resolve', 'w') o_tests = open('.file-list-tests', 'w') o_standalone_tmpfiles = open('.file-list-standalone-tmpfiles', 'w') o_standalone_sysusers = open('.file-list-standalone-sysusers', 'w') o_main = open('.file-list-main', 'w') for file in files(buildroot): n = file.path[1:] if re.match(r'''/usr/(share|include)$| /usr/share/man(/man.|)$| /usr/share/zsh(/site-functions|)$| /usr/share/dbus-1$| /usr/share/dbus-1/system.d$| /usr/share/dbus-1/(system-|)services$| /usr/share/polkit-1(/actions|/rules.d|)$| /usr/share/pkgconfig$| /usr/share/bash-completion(/completions|)$| /usr(/lib|/lib64|/bin|/sbin|)$| /usr/lib.*/(security|pkgconfig)$| /usr/lib/rpm(/macros.d|)$| /usr/lib/firewalld(/services|)$| /usr/share/(locale|licenses|doc)| # no $ /etc(/pam\.d|/xdg|/X11|/X11/xinit|/X11.*\.d|)$| /etc/(dnf|dnf/protected.d)$| /usr/(src|lib/debug)| # no $ /run$| /var(/cache|/log|/lib|/run|)$ ''', n, re.X): continue if '/security/pam_' in n or '/man8/pam_' in n: o = o_pam elif '/rpm/' in n: o = o_rpm_macros elif '/usr/lib/systemd/tests' in n: o = o_tests elif re.match(r'/libsystemd-shared-*.so$', n): o = o_main elif re.match(r'/libcryptsetup-token-systemd-.*\.so$', n): o = o_udev elif re.search(r'/lib.*\.pc|/man3/|/usr/include|\.so$', n): o = o_devel elif re.search(r'''journal-(remote|gateway|upload)| systemd-remote\.conf| /usr/share/systemd/gatewayd| /var/log/journal/remote ''', n, re.X): o = o_remote elif re.search(r'''mymachines| machinectl| systemd-nspawn| import-pubring.gpg| systemd-(machined|import|pull)| /machine.slice| /machines.target| var-lib-machines.mount| org.freedesktop.(import|machine)1 ''', n, re.X): o = o_container elif re.search(r'''/usr/lib/systemd/network/80-| networkd| networkctl| org.freedesktop.network1 ''', n, re.X): o = o_networkd elif '.so.' in n: o = o_libs elif re.search(r'''udev(?!\.pc)| hwdb| bootctl| boot-update| sd-boot|systemd-boot\.|loader.conf| bless-boot| boot-system-token| kernel-install| vconsole| backlight| rfkill| random-seed| modules-load| timesync| crypttab| cryptenroll| cryptsetup| kmod| quota| pstore| sleep|suspend|hibernate| systemd-tmpfiles-setup-dev| network/99-default.link| growfs|makefs|makeswap|mkswap| fsck| repart| gpt-auto| volatile-root| veritysetup| integritysetup| integritytab| remount-fs| /boot$| /boot/efi| /kernel/| /kernel$| /modprobe.d| binfmt| sysctl| coredump| homed|home1| portabled|portable1 ''', n, re.X): # coredumpctl, homectl, portablectl are included in the main package because # they can be used to interact with remote daemons. Also, the user could be # confused if those user-facing binaries are not available. o = o_udev elif re.search(r'''resolved|resolve1| systemd-resolve| resolvconf| systemd\.(positive|negative) ''', n, re.X): # resolvectl and nss-resolve are in the main package. o = o_resolve elif re.search(r'10-oomd-.*defaults.conf|lib/systemd/oomd.conf.d', n, re.X): o = o_oomd_defaults elif n.endswith('.standalone'): if 'tmpfiles' in n: o = o_standalone_tmpfiles elif 'sysusers' in n: o = o_standalone_sysusers else: assert False, 'Found .standalone not belonging to known packages' else: o = o_main if n in known_files: prefix = ' '.join(known_files[n].split()[:-1]) if prefix: prefix += ' ' elif file.is_dir() and not file.is_symlink(): prefix = '%dir ' elif 'README' in n: prefix = '%doc ' elif n.startswith('/etc'): prefix = '%config(noreplace) ' else: prefix = '' suffix = '*' if '/man/' in n else '' print(f'{prefix}{n}{suffix}', file=o)