## Oxidizing the Arch Linux Packaging Infrastructure
All Systems Go! 2023
David Runge
### Overview * Background * Motivation * Oxidation * Further
## Background
### About * Freelance software developer * Arch Linux Package Maintainer (2017)/ Developer (2019)/ Main Signing Key (2021) * Pro-audio, Python, Rust, installation process, packaging, infrastructure
### Obligations *"I use Arch btw"* π€ͺ
### Pacman * pacman - the **pac**kage **man**ager (C) * makepkg - the package build tool (Bash)
### Distribution packaging * [PKGBUILD](https://man.archlinux.org/man/PKGBUILD.5) - build script for a package, hosted at https://gitlab.archlinux.org/archlinux/packaging/packages/ * [devtools](https://gitlab.archlinux.org/archlinux/devtools) - collection of scripts to build packages in a *"clean chroot"* from build scripts (Bash) * [dbscripts](https://gitlab.archlinux.org/archlinux/dbscripts) - set of scripts to maintain the *binary* package repositories (Bash)
### User repositories * [Arch User Repository (AUR)](https://aur.archlinux.org/) - platform to provide and discuss user provided PKGBUILDs * [Unofficial user repositories](https://wiki.archlinux.org/title/Unofficial_user_repositories) - set of user-maintained *binary* package repositories (often based on PKGBUILDs from the AUR) * [AUR helpers](https://wiki.archlinux.org/title/AUR_helpers) exist to help build from source
### What is a package anyway? π€· * A (compressed) [tar](https://man.archlinux.org/man/tar.1) file * Files to be installed on a target system * **Files describing metadata** * Scripts running actions
### Package metadata * [.BUILDINFO](https://man.archlinux.org/man/core/pacman/BUILDINFO.5.en) - build environment information * [.MTREE](https://man.archlinux.org/man/mtree.5) - package contents (compressed libarchive [mtree](https://man.archlinux.org/man/mtree.5) file) * [.PKGINFO](https://gitlab.archlinux.org/pacman/pacman/-/merge_requests/27) - package metadata * .SRCINFO - package source information (derived from PKGBUILD data)
### .BUILDINFO example zstd 1.5.5-1: ``` format = 2 pkgname = zstd pkgbase = zstd pkgver = 1.5.5-1 pkgarch = x86_64 pkgbuild_sha256sum = 627240d3dedcaf748737c05011597a61030779ef000d5316e036247c1584213e packager = Jelle van der Waa
builddate = 1681646714 builddir = /build startdir = /startdir buildtool = devtools buildtoolver = 20230307-1-any buildenv = !distcc buildenv = color buildenv = !ccache buildenv = check buildenv = !sign options = strip options = docs options = !libtool options = !staticlibs options = emptydirs options = zipman options = purge options = debug options = lto installed = acl-2.3.1-3-x86_64 installed = archlinux-keyring-20230320-1-any installed = attr-2.5.1-3-x86_64 installed = audit-3.1-1-x86_64 installed = autoconf-2.71-4-any installed = automake-1.16.5-2-any installed = bash-5.1.016-3-x86_64 installed = binutils-2.40-4-x86_64 installed = bison-3.8.2-5-x86_64 installed = brotli-1.0.9-10-x86_64 installed = bzip2-1.0.8-5-x86_64 installed = ca-certificates-20220905-1-any installed = ca-certificates-mozilla-3.89-1-x86_64 installed = ca-certificates-utils-20220905-1-any installed = cmake-3.26.3-1-x86_64 installed = coreutils-9.2-3-x86_64 installed = curl-8.0.1-1-x86_64 installed = db-6.2.32-1-x86_64 installed = db5.3-5.3.28-2-x86_64 installed = debugedit-5.0-5-x86_64 installed = diffutils-3.9-1-x86_64 installed = e2fsprogs-1.47.0-1-x86_64 installed = expat-2.5.0-1-x86_64 installed = fakeroot-1.31-2-x86_64 installed = file-5.44-3-x86_64 installed = filesystem-2023.01.31-1-x86_64 installed = findutils-4.9.0-3-x86_64 installed = flex-2.6.4-5-x86_64 installed = gawk-5.2.1-2-x86_64 installed = gc-8.2.2-1-x86_64 installed = gcc-12.2.1-2-x86_64 installed = gcc-libs-12.2.1-2-x86_64 installed = gdbm-1.23-2-x86_64 installed = gettext-0.21.1-5-x86_64 installed = glib2-2.76.1-1-x86_64 installed = glibc-2.37-2-x86_64 installed = gmp-6.2.1-2-x86_64 installed = gnupg-2.2.41-1-x86_64 installed = gnutls-3.8.0-1-x86_64 installed = gpgme-1.19.0-3-x86_64 installed = grep-3.10-1-x86_64 installed = groff-1.22.4-10-x86_64 installed = gtest-1.13.0-1-x86_64 installed = guile-3.0.9-1-x86_64 installed = gzip-1.12-2-x86_64 installed = hicolor-icon-theme-0.17-3-any installed = iana-etc-20230405-1-any installed = icu-72.1-2-x86_64 installed = jansson-2.14-2-x86_64 installed = json-c-0.16-1-x86_64 installed = jsoncpp-1.9.5-2-x86_64 installed = keyutils-1.6.3-1-x86_64 installed = krb5-1.20.1-1-x86_64 installed = less-1:608-2-x86_64 installed = libarchive-3.6.2-2-x86_64 installed = libassuan-2.5.5-2-x86_64 installed = libcap-2.68-1-x86_64 installed = libcap-ng-0.8.3-1-x86_64 installed = libelf-0.189-1-x86_64 installed = libevent-2.1.12-4-x86_64 installed = libffi-3.4.4-1-x86_64 installed = libgcrypt-1.10.2-1-x86_64 installed = libgpg-error-1.47-1-x86_64 installed = libidn2-2.3.4-3-x86_64 installed = libisl-0.26-1-x86_64 installed = libksba-1.6.3-1-x86_64 installed = libldap-2.6.4-2-x86_64 installed = libmpc-1.3.1-1-x86_64 installed = libnghttp2-1.52.0-2-x86_64 installed = libnsl-2.0.0-3-x86_64 installed = libp11-kit-0.24.1-1-x86_64 installed = libpsl-0.21.2-1-x86_64 installed = libsasl-2.1.28-4-x86_64 installed = libseccomp-2.5.4-1-x86_64 installed = libsecret-0.20.5-2-x86_64 installed = libssh2-1.10.0-3-x86_64 installed = libsysprof-capture-3.48.0-1-x86_64 installed = libtasn1-4.19.0-1-x86_64 installed = libtirpc-1.3.3-2-x86_64 installed = libtool-2.4.7+4+g1ec8fa28-2-x86_64 installed = libunistring-1.1-2-x86_64 installed = libuv-1.44.2-1-x86_64 installed = libverto-0.3.2-4-x86_64 installed = libxcrypt-4.4.33-1-x86_64 installed = libxml2-2.10.3-2-x86_64 installed = linux-api-headers-6.1.9-1-any installed = lz4-1:1.9.4-1-x86_64 installed = m4-1.4.19-3-x86_64 installed = make-4.4.1-2-x86_64 installed = mpfr-4.2.0-3-x86_64 installed = ncurses-6.4-1-x86_64 installed = nettle-3.8.1-1-x86_64 installed = ninja-1.11.1-2-x86_64 installed = npth-1.6-4-x86_64 installed = openssl-3.0.8-1-x86_64 installed = p11-kit-0.24.1-1-x86_64 installed = pacman-6.0.2-6-x86_64 installed = pacman-mirrorlist-20230410-1-any installed = pam-1.5.2-1-x86_64 installed = pambase-20221020-1-any installed = patch-2.7.6-9-x86_64 installed = pcre2-10.42-2-x86_64 installed = perl-5.36.0-3-x86_64 installed = pinentry-1.2.1-1-x86_64 installed = pkgconf-1.8.1-1-x86_64 installed = readline-8.2.001-2-x86_64 installed = rhash-1.4.3-1-x86_64 installed = sed-4.9-3-x86_64 installed = shadow-4.13-2-x86_64 installed = sqlite-3.41.2-1-x86_64 installed = sudo-1.9.13.p3-1-x86_64 installed = systemd-libs-253.3-3-x86_64 installed = tar-1.34-2-x86_64 installed = texinfo-7.0.3-1-x86_64 installed = tpm2-tss-3.2.0-3-x86_64 installed = tzdata-2023c-1-x86_64 installed = util-linux-2.38.1-3-x86_64 installed = util-linux-libs-2.38.1-3-x86_64 installed = which-2.21-6-x86_64 installed = xz-5.4.2-1-x86_64 installed = zlib-1:1.2.13-2-x86_64 installed = zstd-1.5.4-1-x86_64 ```
### .MTREE example zstd 1.5.5-1: ``` #mtree /set type=file uid=0 gid=0 mode=644 ./.BUILDINFO time=1681646714.0 size=4864 md5digest=01e809164d69df4ad01d8560e709f9ab sha256digest=4282c04b6dfca7d734601146ea1f94b996b7f74b47c8c9daae28550b62958718 ./.PKGINFO time=1681646714.0 size=492 md5digest=9045a9f008d0c2a2947da95d6447b5e0 sha256digest=66a453b582a9321d20268bd1f58027d98857456a4f61de239da6725671753547 /set mode=755 ./usr time=1681646714.0 type=dir ./usr/bin time=1681646714.0 type=dir ./usr/bin/pzstd time=1681646714.0 size=92272 md5digest=5758c88519bc06ce8cb6d7d85efacaa3 sha256digest=b3eb2b143042f0326b1decc843e4f518431bad62fcc7c452449e5b1e9d0523f4 ./usr/bin/unzstd time=1681646714.0 mode=777 type=link link=zstd ./usr/bin/zstd time=1681646714.0 size=190832 md5digest=cbfa1134f9beacbf554960bffb7cef97 sha256digest=25715eae1fea1ee4aae9ae17aff73c3d9ae46af5926087184a9a514d9e0a480d ./usr/bin/zstdcat time=1681646714.0 mode=777 type=link link=zstd ./usr/bin/zstdgrep time=1681646714.0 size=3869 md5digest=4e16657238c1d51e2067380425cea68c sha256digest=9bc769b26542ef2efa14ae29b3178b7f10639cd95544207691cb258fe06bbe17 ./usr/bin/zstdless time=1681646714.0 size=197 md5digest=f96f2accbe640e420a7cfd312d411732 sha256digest=60e767b7d41a7eee6204fe34285b47e2b706797cd6ca35ca25989639f1c13159 ./usr/bin/zstdmt time=1681646714.0 mode=777 type=link link=zstd /set mode=644 ./usr/include time=1681646714.0 mode=755 type=dir ./usr/include/zdict.h time=1681646714.0 size=26433 md5digest=45aedf4ff314c85dd1952fdecb75a1d9 sha256digest=02a34169467501fcc665cccb33f5bd455fdb665e9806851777dc8a6c4d5a75e3 ./usr/include/zstd.h time=1681646714.0 size=171378 md5digest=09f76f3f4052fb4c0db4787d20804588 sha256digest=41d0f43747d0dee56f60bd10aed262f193d725b7e11eb9e94aa4ad80183c7da8 ./usr/include/zstd_errors.h time=1681646714.0 size=4532 md5digest=f39ee478d54102b6cc18298188c223d7 sha256digest=36dbd0a595852e10ff5b52992294f610055b8781101f4634036e05cf7d4bb506 /set mode=755 ./usr/lib time=1681646714.0 type=dir ./usr/lib/libzstd.so time=1681646714.0 mode=777 type=link link=libzstd.so.1 ./usr/lib/libzstd.so.1 time=1681646714.0 mode=777 type=link link=libzstd.so.1.5.5 ./usr/lib/libzstd.so.1.5.5 time=1681646714.0 size=862080 md5digest=4c03703605529ad41b747f60e162d69c sha256digest=7da67a97a96b73684d65b959f9e1dfd978c085e7b59ebcdad40df1205f05dceb ./usr/lib/cmake time=1681646714.0 type=dir /set mode=644 ./usr/lib/cmake/zstd time=1681646714.0 mode=755 type=dir ./usr/lib/cmake/zstd/zstdConfig.cmake time=1681646714.0 size=55 md5digest=67a95d9531ac9dd5f378c9a37672e3b1 sha256digest=bfbf6e24afbf8299ee0180a84638e92e7770a6366f20a1e89db6716c115f60de ./usr/lib/cmake/zstd/zstdConfigVersion.cmake time=1681646714.0 size=2762 md5digest=ba7f0a004d9c72f97376595bdba7e493 sha256digest=42501fe6fde30ee0c82c47919715f9fb4408c1b391f3ddfb0c71de086e91bb10 ./usr/lib/cmake/zstd/zstdTargets-none.cmake time=1681646714.0 size=859 md5digest=00efdb6528d1430944347b858ce3d639 sha256digest=704a607071ce4a29bbe70c78683c38fc7d301cecb647c44cdac5f285d8e99a29 ./usr/lib/cmake/zstd/zstdTargets.cmake time=1681646714.0 size=4274 md5digest=7c7c26cdb869539fce748e500151b76d sha256digest=af3d4fd875f7e957b0e54f0aedf1f5cb4487be873887e4ae033ffcbec2c96628 ./usr/lib/pkgconfig time=1681646714.0 mode=755 type=dir ./usr/lib/pkgconfig/libzstd.pc time=1681646714.0 size=448 md5digest=912d18c83d9595d1a7b4e85b373f584a sha256digest=d9f9995d5fc48ed13e76b2d417327249dfed9d7b0b6c7a75ded1d9fe6fd0fd30 /set mode=755 ./usr/share time=1681646714.0 type=dir ./usr/share/doc time=1681646714.0 type=dir ./usr/share/doc/zstd time=1681646714.0 type=dir ./usr/share/doc/zstd/zstd_manual.html time=1681646714.0 mode=644 size=127374 md5digest=f62dd3dfc7717871cd1482adb1d4519a sha256digest=d4cb0c27c4d7cc9d705e153979db8a051c0a1beb0dc53dedd322949d3ae6ee38 ./usr/share/licenses time=1681646714.0 type=dir ./usr/share/licenses/zstd time=1681646714.0 type=dir ./usr/share/licenses/zstd/LICENSE time=1681646714.0 mode=644 size=1549 md5digest=0822a32f7acdbe013606746641746ee8 sha256digest=7055266497633c9025b777c78eb7235af13922117480ed5c674677adc381c9d8 ./usr/share/man time=1681646714.0 type=dir /set mode=644 ./usr/share/man/man1 time=1681646714.0 mode=755 type=dir ./usr/share/man/man1/unzstd.1.gz time=1681646714.0 mode=777 type=link link=zstd.1.gz ./usr/share/man/man1/zstd.1.gz time=1681646714.0 size=10689 md5digest=ff0f00c8084e33ee1ecc38e2053ef1e7 sha256digest=96e7a34bcf7b8cf2e2a5b47bdbfe49553d715e6d8a1634970eb4dc9450b12662 ./usr/share/man/man1/zstdcat.1.gz time=1681646714.0 mode=777 type=link link=zstd.1.gz ./usr/share/man/man1/zstdgrep.1.gz time=1681646714.0 size=592 md5digest=6496ceb10493d916829d628e5bfa62ae sha256digest=cc191423b74940fe576f2a588f7c8b74447531cc1015565b4307ce2cc2f63ddd ./usr/share/man/man1/zstdless.1.gz time=1681646714.0 size=258 md5digest=4fef805e419dfa14f09c9bf01954a541 sha256digest=428c6ba214b849edbe675e37441dcdafb2646e76fb20d6d30a728c02ce34871d ```
### .PKGINFO example zstd 1.5.5-1: ``` # Generated by makepkg 6.0.2 # using fakeroot version 1.31 pkgname = zstd pkgbase = zstd pkgver = 1.5.5-1 pkgdesc = Zstandard - Fast real-time compression algorithm url = https://facebook.github.io/zstd/ builddate = 1681646714 packager = Jelle van der Waa
size = 1500453 arch = x86_64 license = BSD license = GPL2 provides = libzstd.so=1-64 depend = glibc depend = gcc-libs depend = zlib depend = xz depend = lz4 makedepend = cmake makedepend = gtest makedepend = ninja ```
### .SRCINFO example zstd 1.5.5-1: ``` pkgbase = zstd pkgdesc = Zstandard - Fast real-time compression algorithm pkgver = 1.5.5 pkgrel = 1 url = https://facebook.github.io/zstd/ arch = x86_64 license = BSD license = GPL2 makedepends = cmake makedepends = gtest makedepends = ninja depends = glibc depends = gcc-libs depends = zlib depends = xz depends = lz4 provides = libzstd.so source = https://github.com/facebook/zstd/releases/download/v1.5.5/zstd-1.5.5.tar.zst source = https://github.com/facebook/zstd/releases/download/v1.5.5/zstd-1.5.5.tar.zst.sig validpgpkeys = 4EF4AC63455FC9F4545D9B7DEF8FE99528B52FFD sha256sums = ce264bca60eb2f0e99e4508cffd0d4d19dd362e84244d7fc941e79fa69ccf673 sha256sums = SKIP b2sums = 2c2dc95f227e661ada23d8f6141bcd293505ce14e605f946ae00d4d4ac37d10b4eb08279ef7560618c67caf266431f76686fda5ae1921d698a6a93bbaf9a0052 b2sums = SKIP pkgname = zstd ```
### Package repositories * Architecture-specific directory structure * Packages, signatures and repository sync databases * Exposed to user systems by a web server * Pacman downloads files and synchronizes against local state
### What does a repository contain? π A dummy repository called `repo`: ```sh . |-- /srv/ftp/repo | `-- x86_64 | |-- package-1.0.0-1-x86_64.pkg.tar.zst -> ../../pool/package-1.0.0-1-x86_64.pkg.tar.zst | |-- package-1.0.0-1-x86_64.pkg.tar.zst.sig -> ../../pool/package-1.0.0-1-x86_64.pkg.tar.zst.sig | |-- repo.db | `-- repo.files `-- /srv/ftp/pool |-- package-1.0.0-1-x86_64.pkg.tar.zst `-- package-1.0.0-1-x86_64.pkg.tar.zst.sig ```
### Repository sync databases π½ * Live alongside packages in a repository * Contain information about packages in a repository * Two per repository (metadata, metadata + file info) * Detached signatures may be provided * Used by pacman to install and update packages from a repository
### What do sync databases contain? π Default sync database: ```sh . |-- package-1.0.0-1 | `-- desc [..] ``` Files sync database: ```sh . |-- package-1.0.0-1 | |-- desc | `-- files [..] ```
### Repository sync database metadata * `desc` - information on packages in the version found in a repository * `files` - list of files provided by a package found in a repository
### Desc file example zstd 1.5.5-1: ```text %FILENAME% zstd-1.5.5-1-x86_64.pkg.tar.zst %NAME% zstd %BASE% zstd %VERSION% 1.5.5-1 %DESC% Zstandard - Fast real-time compression algorithm %CSIZE% 493009 %ISIZE% 1500453 %MD5SUM% 2ba620ed7816b97bcad1a721a2a9f6c4 %SHA256SUM% 1891970afabc725e72c6a9bb2c127d906c1d3cc70309336fbe87adbd460c05b8 %PGPSIG% iQEzBAABCgAdFiEE5JnHn1PJalTlcv7hwGCGM3xQdz4FAmQ79ZMACgkQwGCGM3xQdz4V+Qf/Yz7Y+3WwSDKtspwcaEr3j95n1nN5+SAThl/OHe94WwmInDWV09GwM+Lrw6Y1RFDK1PI1ZLON3hOo/81udW0uCHJ4n0bnU/2x3B4UW82dcBqFBjiEqNEF1x6KcQGf9PE9seZndsiAxVzrbEH9u48RIHx0SuwWnzlryCoHPYTgYsPrpkH0IzLUerP2Lc8rjUR2eAKn6zoomb3mR74dPNMn2yx9gS0l+79EshQR8kWtOVvTv7xgRriWeJMBNoTTvDfiDq5B8395vPaBmSfrU0O3tvVF3eDAGtpxIb8hqfhtRqy3XqTcRrYaoj44KtJraGCbq5DrsImEdx5byS7qBhoheQ== %URL% https://facebook.github.io/zstd/ %LICENSE% BSD GPL2 %ARCH% x86_64 %BUILDDATE% 1681646714 %PACKAGER% Jelle van der Waa
%PROVIDES% libzstd.so=1-64 %DEPENDS% glibc gcc-libs zlib xz lz4 %MAKEDEPENDS% cmake gtest ninja ```
### Files file example zstd 1.5.5-1: ```text %FILES% usr/ usr/bin/ usr/bin/pzstd usr/bin/unzstd usr/bin/zstd usr/bin/zstdcat usr/bin/zstdgrep usr/bin/zstdless usr/bin/zstdmt usr/include/ usr/include/zdict.h usr/include/zstd.h usr/include/zstd_errors.h usr/lib/ usr/lib/cmake/ usr/lib/cmake/zstd/ usr/lib/cmake/zstd/zstdConfig.cmake usr/lib/cmake/zstd/zstdConfigVersion.cmake usr/lib/cmake/zstd/zstdTargets-none.cmake usr/lib/cmake/zstd/zstdTargets.cmake usr/lib/libzstd.so usr/lib/libzstd.so.1 usr/lib/libzstd.so.1.5.5 usr/lib/pkgconfig/ usr/lib/pkgconfig/libzstd.pc usr/share/ usr/share/doc/ usr/share/doc/zstd/ usr/share/doc/zstd/zstd_manual.html usr/share/licenses/ usr/share/licenses/zstd/ usr/share/licenses/zstd/LICENSE usr/share/man/ usr/share/man/man1/ usr/share/man/man1/unzstd.1.gz usr/share/man/man1/zstd.1.gz usr/share/man/man1/zstdcat.1.gz usr/share/man/man1/zstdgrep.1.gz usr/share/man/man1/zstdless.1.gz ```
### Relationships π€ * Package building (devtools/ makepkg) β¬οΈ * Repository management (dbscripts) β¬οΈ * Package management (pacman)
### Package building π¦
### Repository server ποΈ
### User machine π₯οΈ
### Relationships π€ * Package file contains files and metadata files * Repository management consumes (some) package metadata to generate sync database entries * Package manager * consumes sync databases for queries and state comparison * consumes (some) package metadata for state upon installation * Rebuild tooling consumes (some) package metadata to build against the same build environment
## Motivation π¦Ύ
## Age πΈοΈ * Arch Linux, Pacman and dbscripts are old enough to drink! * Accumulation of complexity and legacy are a thing
## Closed loops βΎοΈ * The Pacman project encompasses pacman *and* makepkg * Changes to internal files (in part used by pacman) are introduced in makepkg (in Bash) π * Changes to internal file types are defined by Pacman releases * Updates to Pacman may or may not be (silently) breaking for consumers
## *"Sir, this is a Wendy's"* * Specifications without versioning and deprecation (*.BUILDINFO* has a format version) * Specifications and validation in Bash is **hard** (and not pretty) * There are no unit or integration tests for metadata files * Repository management with dbscripts is limiting and dangerous (no transactions, no concurrency, no rollback)
## Input validation, please ```sh vercmp "π±" "πΆ" 0 ```
## Repod
* [repod](https://gitlab.archlinux.org/archlinux/repod), transaction based and very configurable, to eventually replace dbscripts * fully validating using pydantic models π * generates sync databases via intermediate JSON based state, that contains **all** metadata * provides [repod-file](https://man.archlinux.org/man/repod-file.1) as CLI tool for interacting with packages and local repositories
## -ETOOMANYπ * repod required custom parsers/ specs for `.BUILDINFO`, `.MTREE`, `.PKGINFO`, `.SRCINFO`, `desc`, `files` * most file types have a floating spec, that only has a reference implementation (in `makepkg`/ `repo-add`/ `pacman`)
## -ECOMPATIBILITY * previously existing parsers with various degrees of compatibility in several languages (e.g. [python-srcinfo](https://github.com/kyrias/python-srcinfo) and [srcinfo.rs](https://github.com/Morganamilo/srcinfo.rs)) * issues with package metadata found only after publishing them (automated repod job validates all repository sync databases and core packages)
## Oxidation π¦
## A need for specs π * we need versioned file specifications * we need file parsers and writers, that can be integrated across languages * we want memory safety and speed π¦
## Common types * [alpm-types](https://gitlab.archlinux.org/archlinux/alpm/alpm-types/) library crate for common types used in Arch Linux Package Management (ALPM) software * low-level types for validating specific fields for metadata files are implemented on a need-to-have basis * extra goodies: a strict `vercmp` is now easy to write! π
## .BUILDINFO * [alpm-buildinfo](https://gitlab.archlinux.org/archlinux/alpm/alpm-buildinfo/) library/ binary crate for `.BUILDINFO` specification * man page per file version * `alpm-buildinfo` as CLI tool for verifying and writing `.BUILDINFO` files * describes version `1` of `.BUILDINFO` in version `0.1.0`
## Further π
## More specifications and implementations π * versioned specifications for `.PKGINFO`, `.MTREE`, `.SRCINFO` after adding required types to `alpm-types` * versioned specifications for `desc` and `files` files found in repository sync databases
## Upstreaming π * replace reference implementations in `makepkg` and `repo-add` * export for other languages (e.g. Python) to replace duplicate efforts in `repod` * profit! π₯³
## The deep end π * versioned specifications for `desc` and `files` files found in libalpm database directories * implement `libalpm` in Rust * `racman`, when?
## Funding π° * Arch Linux is community driven * Developers are unpaid * Help fund this effort if you can! π
## Contact π±
gitlab.archlinux.org/archlinux/alpm
dvzrv@archlinux.org
#archlinux-projects
on
Libera Chat
or
arch-projects
mailing list for ALPM projects
## Kthxbye π