==> Building on vanillish ==> Checking for remote environment... ==> Syncing package to remote host... sending incremental file list ./ .SRCINFO 842 100% 0.00kB/s 0:00:00 842 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=10/12) .nvchecker.toml 108 100% 105.47kB/s 0:00:00 108 100% 105.47kB/s 0:00:00 (xfr#2, to-chk=9/12) LICENSE 646 100% 630.86kB/s 0:00:00 646 100% 630.86kB/s 0:00:00 (xfr#3, to-chk=8/12) PKGBUILD 1,628 100% 1.55MB/s 0:00:00 1,628 100% 1.55MB/s 0:00:00 (xfr#4, to-chk=7/12) REUSE.toml 375 100% 366.21kB/s 0:00:00 375 100% 366.21kB/s 0:00:00 (xfr#5, to-chk=6/12) b4-0.14.3-2.log 813 100% 793.95kB/s 0:00:00 813 100% 793.95kB/s 0:00:00 (xfr#6, to-chk=5/12) LICENSES/ keys/ keys/pgp/ keys/pgp/DE0E66E32F1FDD0902666B96E63EDCA9329DD07E.asc 700 2% 227.86kB/s 0:00:00 23,995 100% 7.63MB/s 0:00:00 (xfr#7, to-chk=0/12) sent 2,193 bytes received 433 bytes 1,750.67 bytes/sec total size is 27,770 speedup is 10.58 ==> Ensuring required PGP keys are present...  -> Checking for DE0E66E32F1FDD0902666B96E63EDCA9329DD07E... ==> Running pkgctl build --arch riscv64 --repo extra on remote host... ==> WARNING: unsupported architecture: riscv64 ==> Building b4  -> repo: extra  -> arch: riscv64  -> worker: felix-0 ==> Building b4 for [extra] (riscv64) ]2;🔵 Container arch-nspawn-82768 on vanillish.felixc.at\[?25l:: Synchronizing package databases... core downloading... extra downloading... error: restricting filesystem access failed because landlock is not supported by the kernel! :: Starting full system upgrade... resolving dependencies... looking for conflicting packages... Package (4) Old Version New Version Net Change Download Size core/e2fsprogs 1.47.3-1 1.47.3-2 0.00 MiB 1.29 MiB core/systemd 258.1-1 259-1 0.68 MiB 9.51 MiB core/systemd-libs 258.1-1 259-1 0.01 MiB 1.31 MiB core/xz 5.8.1-1 5.8.2-1 0.04 MiB 0.83 MiB Total Download Size: 12.94 MiB Total Installed Size: 45.75 MiB Net Upgrade Size: 0.73 MiB :: Proceed with installation? [Y/n] :: Retrieving packages... systemd-259-1-riscv64 downloading... systemd-libs-259-1-riscv64 downloading... e2fsprogs-1.47.3-2-riscv64 downloading... xz-5.8.2-1-riscv64 downloading... error: restricting filesystem access failed because landlock is not supported by the kernel! checking keyring... checking package integrity... loading package files... checking for file conflicts... :: Processing package changes... upgrading e2fsprogs... upgrading xz... upgrading systemd-libs... upgrading systemd... Creating group 'empower' with GID 970. :: This is a systemd feature update. You may want to have a look at NEWS for what changed, or if you observe unexpected behavior: /usr/share/doc/systemd/NEWS :: Running post-transaction hooks... ( 1/12) Creating system user accounts... ( 2/12) Updating journal message catalog... ( 3/12) Reloading system manager configuration... Skipped: Current root is not booted. ( 4/12) Reloading user manager configuration... Skipped: Current root is not booted. ( 5/12) Updating udev hardware database... ( 6/12) Restarting marked services... Skipped: Current root is not booted. ( 7/12) Applying kernel sysctl settings... Skipped: Current root is not booted. ( 8/12) Creating temporary files... ( 9/12) Reloading device manager configuration... Skipped: Current root is not booted. (10/12) Arming ConditionNeedsUpdate... (11/12) Reloading system bus configuration... Skipped: Current root is not booted. (12/12) Updating the info directory file... [?25h==> Building in chroot for [extra] (riscv64)... ==> Synchronizing chroot copy [/var/lib/archbuild/extra-riscv64/root] -> [felix-0]...done ==> Making package: b4 0.14.3-2 (Sat Dec 20 20:50:59 2025) ==> Retrieving sources...  -> Updating b4 git repo... remote: Enumerating objects: 151, done. remote: Counting objects: 1% (1/89) remote: Counting objects: 2% (2/89) remote: Counting objects: 3% (3/89) remote: Counting objects: 4% (4/89) remote: Counting objects: 5% (5/89) remote: Counting objects: 6% (6/89) remote: Counting objects: 7% (7/89) remote: Counting objects: 8% (8/89) remote: Counting objects: 10% (9/89) remote: Counting objects: 11% (10/89) remote: Counting objects: 12% (11/89) remote: Counting objects: 13% (12/89) remote: Counting objects: 14% (13/89) remote: Counting objects: 15% (14/89) remote: Counting objects: 16% (15/89) remote: Counting objects: 17% (16/89) remote: Counting objects: 19% (17/89) remote: Counting objects: 20% (18/89) remote: Counting objects: 21% (19/89) remote: Counting objects: 22% (20/89) remote: Counting objects: 23% (21/89) remote: Counting objects: 24% (22/89) remote: Counting objects: 25% (23/89) remote: Counting objects: 26% (24/89) remote: Counting objects: 28% (25/89) remote: Counting objects: 29% (26/89) remote: Counting objects: 30% (27/89) remote: Counting objects: 31% (28/89) remote: Counting objects: 32% (29/89) remote: Counting objects: 33% (30/89) remote: Counting objects: 34% (31/89) remote: Counting objects: 35% (32/89) remote: Counting objects: 37% (33/89) remote: Counting objects: 38% (34/89) remote: Counting objects: 39% (35/89) remote: Counting objects: 40% (36/89) remote: Counting objects: 41% (37/89) remote: Counting objects: 42% (38/89) remote: Counting objects: 43% (39/89) remote: Counting objects: 44% (40/89) remote: Counting objects: 46% (41/89) remote: Counting objects: 47% (42/89) remote: Counting objects: 48% (43/89) remote: Counting objects: 49% (44/89) remote: Counting objects: 50% (45/89) remote: Counting objects: 51% (46/89) remote: Counting objects: 52% (47/89) remote: Counting objects: 53% (48/89) remote: Counting objects: 55% (49/89) remote: Counting objects: 56% (50/89) remote: Counting objects: 57% (51/89) remote: Counting objects: 58% (52/89) remote: Counting objects: 59% (53/89) remote: Counting objects: 60% (54/89) remote: Counting objects: 61% (55/89) remote: Counting objects: 62% (56/89) remote: Counting objects: 64% (57/89) remote: Counting objects: 65% (58/89) remote: Counting objects: 66% (59/89) remote: Counting objects: 67% (60/89) remote: Counting objects: 68% (61/89) remote: Counting objects: 69% (62/89) remote: Counting objects: 70% (63/89) remote: Counting objects: 71% (64/89) remote: Counting objects: 73% (65/89) remote: Counting objects: 74% (66/89) remote: Counting objects: 75% (67/89) remote: Counting objects: 76% (68/89) remote: Counting objects: 77% (69/89) remote: Counting objects: 78% (70/89) remote: Counting objects: 79% (71/89) remote: Counting objects: 80% (72/89) remote: Counting objects: 82% (73/89) remote: Counting objects: 83% (74/89) remote: Counting objects: 84% (75/89) remote: Counting objects: 85% (76/89) remote: Counting objects: 86% (77/89) remote: Counting objects: 87% (78/89) remote: Counting objects: 88% (79/89) remote: Counting objects: 89% (80/89) remote: Counting objects: 91% (81/89) remote: Counting objects: 92% (82/89) remote: Counting objects: 93% (83/89) remote: Counting objects: 94% (84/89) remote: Counting objects: 95% (85/89) remote: Counting objects: 96% (86/89) remote: Counting objects: 97% (87/89) remote: Counting objects: 98% (88/89) remote: Counting objects: 100% (89/89) remote: Counting objects: 100% (89/89), done. remote: Compressing objects: 3% (1/28) remote: Compressing objects: 7% (2/28) remote: Compressing objects: 10% (3/28) remote: Compressing objects: 14% (4/28) remote: Compressing objects: 17% (5/28) remote: Compressing objects: 21% (6/28) remote: Compressing objects: 25% (7/28) remote: Compressing objects: 28% (8/28) remote: Compressing objects: 32% (9/28) remote: Compressing objects: 35% (10/28) remote: Compressing objects: 39% (11/28) remote: Compressing objects: 42% (12/28) remote: Compressing objects: 46% (13/28) remote: Compressing objects: 50% (14/28) remote: Compressing objects: 53% (15/28) remote: Compressing objects: 57% (16/28) remote: Compressing objects: 60% (17/28) remote: Compressing objects: 64% (18/28) remote: Compressing objects: 67% (19/28) remote: Compressing objects: 71% (20/28) remote: Compressing objects: 75% (21/28) remote: Compressing objects: 78% (22/28) remote: Compressing objects: 82% (23/28) remote: Compressing objects: 85% (24/28) remote: Compressing objects: 89% (25/28) remote: Compressing objects: 92% (26/28) remote: Compressing objects: 96% (27/28) remote: Compressing objects: 100% (28/28) remote: Compressing objects: 100% (28/28), done. Receiving objects: 0% (1/151) Receiving objects: 1% (2/151) Receiving objects: 2% (4/151) Receiving objects: 3% (5/151) Receiving objects: 4% (7/151) Receiving objects: 5% (8/151) Receiving objects: 6% (10/151) Receiving objects: 7% (11/151) Receiving objects: 8% (13/151) Receiving objects: 9% (14/151) Receiving objects: 10% (16/151) Receiving objects: 11% (17/151) Receiving objects: 12% (19/151) Receiving objects: 13% (20/151) Receiving objects: 14% (22/151) Receiving objects: 15% (23/151) Receiving objects: 16% (25/151) Receiving objects: 17% (26/151) Receiving objects: 18% (28/151) Receiving objects: 19% (29/151) Receiving objects: 20% (31/151) Receiving objects: 21% (32/151) Receiving objects: 22% (34/151) Receiving objects: 23% (35/151) Receiving objects: 24% (37/151) Receiving objects: 25% (38/151) Receiving objects: 26% (40/151) Receiving objects: 27% (41/151) Receiving objects: 28% (43/151) Receiving objects: 29% (44/151) Receiving objects: 30% (46/151) Receiving objects: 31% (47/151) Receiving objects: 32% (49/151) Receiving objects: 33% (50/151) Receiving objects: 34% (52/151) Receiving objects: 35% (53/151) Receiving objects: 36% (55/151) Receiving objects: 37% (56/151) Receiving objects: 38% (58/151) Receiving objects: 39% (59/151) Receiving objects: 40% (61/151) Receiving objects: 41% (62/151) Receiving objects: 42% (64/151) Receiving objects: 43% (65/151) Receiving objects: 44% (67/151) Receiving objects: 45% (68/151) Receiving objects: 46% (70/151) Receiving objects: 47% (71/151) Receiving objects: 48% (73/151) Receiving objects: 49% (74/151) Receiving objects: 50% (76/151) Receiving objects: 51% (78/151) Receiving objects: 52% (79/151) Receiving objects: 53% (81/151) Receiving objects: 54% (82/151) Receiving objects: 55% (84/151) Receiving objects: 56% (85/151) Receiving objects: 57% (87/151) Receiving objects: 58% (88/151) Receiving objects: 59% (90/151) Receiving objects: 60% (91/151) Receiving objects: 61% (93/151) Receiving objects: 62% (94/151) Receiving objects: 63% (96/151) Receiving objects: 64% (97/151) Receiving objects: 65% (99/151) Receiving objects: 66% (100/151) Receiving objects: 67% (102/151) Receiving objects: 68% (103/151) Receiving objects: 69% (105/151) Receiving objects: 70% (106/151) Receiving objects: 71% (108/151) Receiving objects: 72% (109/151) Receiving objects: 73% (111/151) Receiving objects: 74% (112/151) Receiving objects: 75% (114/151) Receiving objects: 76% (115/151) Receiving objects: 77% (117/151) Receiving objects: 78% (118/151) Receiving objects: 79% (120/151) Receiving objects: 80% (121/151) Receiving objects: 81% (123/151) Receiving objects: 82% (124/151) Receiving objects: 83% (126/151) Receiving objects: 84% (127/151) Receiving objects: 85% (129/151) Receiving objects: 86% (130/151) Receiving objects: 87% (132/151) Receiving objects: 88% (133/151) Receiving objects: 89% (135/151) Receiving objects: 90% (136/151) Receiving objects: 91% (138/151) Receiving objects: 92% (139/151) Receiving objects: 93% (141/151) Receiving objects: 94% (142/151) Receiving objects: 95% (144/151) Receiving objects: 96% (145/151) Receiving objects: 97% (147/151) Receiving objects: 98% (148/151) Receiving objects: 99% (150/151) remote: Total 151 (delta 73), reused 64 (delta 61), pack-reused 62 (from 1) Receiving objects: 100% (151/151) Receiving objects: 100% (151/151), 193.51 KiB | 904.00 KiB/s, done. Resolving deltas: 0% (0/84) Resolving deltas: 1% (1/84) Resolving deltas: 2% (2/84) Resolving deltas: 3% (3/84) Resolving deltas: 4% (4/84) Resolving deltas: 5% (5/84) Resolving deltas: 7% (6/84) Resolving deltas: 8% (7/84) Resolving deltas: 9% (8/84) Resolving deltas: 10% (9/84) Resolving deltas: 11% (10/84) Resolving deltas: 13% (11/84) Resolving deltas: 14% (12/84) Resolving deltas: 15% (13/84) Resolving deltas: 16% (14/84) Resolving deltas: 17% (15/84) Resolving deltas: 19% (16/84) Resolving deltas: 20% (17/84) Resolving deltas: 21% (18/84) Resolving deltas: 22% (19/84) Resolving deltas: 23% (20/84) Resolving deltas: 25% (21/84) Resolving deltas: 26% (22/84) Resolving deltas: 27% (23/84) Resolving deltas: 28% (24/84) Resolving deltas: 29% (25/84) Resolving deltas: 30% (26/84) Resolving deltas: 32% (27/84) Resolving deltas: 33% (28/84) Resolving deltas: 34% (29/84) Resolving deltas: 35% (30/84) Resolving deltas: 36% (31/84) Resolving deltas: 38% (32/84) Resolving deltas: 39% (33/84) Resolving deltas: 40% (34/84) Resolving deltas: 41% (35/84) Resolving deltas: 42% (36/84) Resolving deltas: 44% (37/84) Resolving deltas: 45% (38/84) Resolving deltas: 46% (39/84) Resolving deltas: 47% (40/84) Resolving deltas: 48% (41/84) Resolving deltas: 50% (42/84) Resolving deltas: 51% (43/84) Resolving deltas: 52% (44/84) Resolving deltas: 53% (45/84) Resolving deltas: 54% (46/84) Resolving deltas: 55% (47/84) Resolving deltas: 57% (48/84) Resolving deltas: 58% (49/84) Resolving deltas: 59% (50/84) Resolving deltas: 60% (51/84) Resolving deltas: 61% (52/84) Resolving deltas: 63% (53/84) Resolving deltas: 64% (54/84) Resolving deltas: 65% (55/84) Resolving deltas: 66% (56/84) Resolving deltas: 67% (57/84) Resolving deltas: 69% (58/84) Resolving deltas: 70% (59/84) Resolving deltas: 71% (60/84) Resolving deltas: 72% (61/84) Resolving deltas: 73% (62/84) Resolving deltas: 75% (63/84) Resolving deltas: 76% (64/84) Resolving deltas: 77% (65/84) Resolving deltas: 78% (66/84) Resolving deltas: 79% (67/84) Resolving deltas: 80% (68/84) Resolving deltas: 82% (69/84) Resolving deltas: 83% (70/84) Resolving deltas: 84% (71/84) Resolving deltas: 85% (72/84) Resolving deltas: 86% (73/84) Resolving deltas: 88% (74/84) Resolving deltas: 89% (75/84) Resolving deltas: 90% (76/84) Resolving deltas: 91% (77/84) Resolving deltas: 92% (78/84) Resolving deltas: 94% (79/84) Resolving deltas: 95% (80/84) Resolving deltas: 96% (81/84) Resolving deltas: 97% (82/84) Resolving deltas: 98% (83/84) Resolving deltas: 100% (84/84) Resolving deltas: 100% (84/84), completed with 8 local objects. From https://github.com/mricon/b4 f760a04..4777340 master -> master + 747a246...5474948 refs/pull/12/merge -> refs/pull/12/merge (forced update) + 37de16a...e095a91 refs/pull/39/merge -> refs/pull/39/merge (forced update) + 9ef3afe...144caa5 refs/pull/57/merge -> refs/pull/57/merge (forced update) + 8e6da4e...6fed582 refs/pull/60/merge -> refs/pull/60/merge (forced update) + 9296e4b...abee94e refs/pull/68/merge -> refs/pull/68/merge (forced update) * [new ref] refs/pull/70/head -> refs/pull/70/head ==> Validating source files with sha256sums... b4 ... Passed ==> Verifying source file signatures with gpg... b4 git repo ... Passed ]2;🔵 Container arch-nspawn-83835 on vanillish.felixc.at\==> Making package: b4 0.14.3-2 (Sat Dec 20 20:51:21 2025) ==> Checking runtime dependencies... ==> Installing missing dependencies... [?25lresolving dependencies... looking for conflicting packages... Package (17) New Version Net Change Download Size extra/git 2.52.0-1 28.75 MiB extra/libsodium 1.0.20-1 0.44 MiB core/mpdecimal 4.0.1-1 0.31 MiB extra/perl-error 0.17030-3 0.04 MiB extra/perl-mailtools 2.22-3 0.10 MiB extra/perl-timedate 2.33-9 0.08 MiB extra/python-cffi 2.0.0-1 1.37 MiB extra/python-charset-normalizer 3.4.3-1 0.71 MiB extra/python-idna 3.11-1 0.89 MiB 0.10 MiB extra/python-pycparser 2.23-1 1.71 MiB extra/python-pynacl 1.6.1-1 0.92 MiB 0.12 MiB extra/python-urllib3 2.5.0-1 1.28 MiB extra/zlib-ng 2.2.5-1 0.21 MiB extra/git-filter-repo 2.47.0-2 0.77 MiB extra/patatt 0.6.3-6 0.21 MiB 0.05 MiB core/python 3.13.11-1 124.16 MiB extra/python-requests 2.32.4-1 0.60 MiB Total Download Size: 0.27 MiB Total Installed Size: 162.56 MiB :: Proceed with installation? [Y/n] :: Retrieving packages... python-pynacl-1.6.1-1-riscv64 downloading... python-idna-3.11-1-any downloading... patatt-0.6.3-6-any downloading... error: restricting filesystem access failed because landlock is not supported by the kernel! checking keyring... checking package integrity... loading package files... checking for file conflicts... :: Processing package changes... installing perl-error... installing perl-timedate... installing perl-mailtools... installing zlib-ng... installing git... Optional dependencies for git git-zsh-completion: upstream zsh completion tk: gitk and git gui openssh: ssh transport and crypto man: show help with `git command --help` perl-libwww: git svn perl-term-readkey: git svn and interactive.singlekey setting perl-io-socket-ssl: git send-email TLS support perl-authen-sasl: git send-email TLS support perl-cgi: gitweb (web interface) support python: git svn & git p4 [pending] subversion: git svn org.freedesktop.secrets: keyring credential helper libsecret: libsecret credential helper [installed] less: the default pager for git installing mpdecimal... installing python... Optional dependencies for python python-setuptools: for building Python packages using tooling that is usually bundled with Python python-pip: for installing Python packages using tooling that is usually bundled with Python python-pipx: for installing Python software not packaged on Arch Linux sqlite: for a default database integration [installed] xz: for lzma [installed] tk: for tkinter installing git-filter-repo... installing libsodium... installing python-pycparser... installing python-cffi... Optional dependencies for python-cffi python-setuptools: "limited api" version checking in cffi.setuptools_ext installing python-pynacl... installing patatt... installing python-charset-normalizer... installing python-idna... installing python-urllib3... Optional dependencies for python-urllib3 python-brotli: Brotli support python-brotlicffi: Brotli support python-h2: HTTP/2 support python-pysocks: SOCKS support python-zstandard: Zstandard support installing python-requests... Optional dependencies for python-requests python-chardet: alternative character encoding library python-pysocks: SOCKS proxy support :: Running post-transaction hooks... (1/4) Creating system user accounts... Creating group 'git' with GID 969. Creating user 'git' (git daemon user) with UID 969 and GID 969. (2/4) Reloading system manager configuration... Skipped: Current root is not booted. (3/4) Arming ConditionNeedsUpdate... (4/4) Checking for old perl modules... [?25h==> Checking buildtime dependencies... ==> Installing missing dependencies... [?25lresolving dependencies... looking for conflicting packages... Package (19) New Version Net Change Download Size extra/python-autocommand 2.2.2-7 0.08 MiB extra/python-iniconfig 2.1.0-1 0.04 MiB extra/python-jaraco.collections 5.1.0-1 0.10 MiB extra/python-jaraco.context 6.0.1-1 0.04 MiB extra/python-jaraco.functools 4.1.0-1 0.07 MiB extra/python-jaraco.text 4.0.0-2 0.08 MiB extra/python-more-itertools 10.8.0-1 0.71 MiB extra/python-packaging 25.0-1 0.67 MiB extra/python-platformdirs 4.5.1-1 0.24 MiB extra/python-pluggy 1.6.0-1 0.20 MiB extra/python-pygments 2.19.2-1 14.38 MiB extra/python-pyproject-hooks 1.2.0-3 0.10 MiB extra/python-build 1.3.0-1 0.20 MiB extra/python-docutils 1:0.22.3-1 6.03 MiB 0.96 MiB extra/python-installer 0.7.0-10 0.17 MiB extra/python-pytest 1:8.4.2-1 4.18 MiB extra/python-setuptools 1:80.9.0-2 7.54 MiB extra/python-shtab 1.8.0-1 0.14 MiB 0.03 MiB extra/python-wheel 0.45.1-1 0.28 MiB Total Download Size: 0.99 MiB Total Installed Size: 35.25 MiB :: Proceed with installation? [Y/n] :: Retrieving packages... python-docutils-1:0.22.3-1-any downloading... python-shtab-1.8.0-1-any downloading... error: restricting filesystem access failed because landlock is not supported by the kernel! checking keyring... checking package integrity... loading package files... checking for file conflicts... :: Processing package changes... installing python-packaging... installing python-pyproject-hooks... installing python-build... Optional dependencies for python-build python-pip: to use as the Python package installer (default) python-uv: to use as the Python package installer python-virtualenv: to use virtualenv for build isolation installing python-docutils... Optional dependencies for python-docutils python-myst-parser: to parse input in "Markdown" (CommonMark) format python-pillow: for some image manipulation operations python-pygments: for syntax highlighting of code directives and roles [pending] installing python-installer... installing python-more-itertools... installing python-jaraco.functools... installing python-jaraco.context... installing python-autocommand... installing python-jaraco.text... Optional dependencies for python-jaraco.text python-inflect: for show-newlines script installing python-jaraco.collections... installing python-platformdirs... installing python-wheel... Optional dependencies for python-wheel python-keyring: for wheel.signatures python-xdg: for wheel.signatures python-setuptools: for legacy bdist_wheel subcommand [pending] installing python-setuptools... installing python-shtab... installing python-iniconfig... installing python-pluggy... installing python-pygments... installing python-pytest... :: Running post-transaction hooks... (1/1) Arming ConditionNeedsUpdate... [?25h==> Retrieving sources... ==> WARNING: Skipping all source file integrity checks. ==> Extracting sources...  -> Creating working copy of b4 git repo... Cloning into 'b4'... done. Switched to a new branch 'makepkg' ==> Starting build()... * Getting build dependencies for wheel... /usr/lib/python3.13/site-packages/setuptools/config/_apply_pyprojecttoml.py:82: SetuptoolsDeprecationWarning: `project.license` as a TOML table is deprecated !! ******************************************************************************** Please use a simple string containing a SPDX expression for `project.license`. You can also use `project.license-files`. (Both options available on setuptools>=77.0.0). By 2026-Feb-18, you need to update your project and remove deprecated calls or your builds will no longer be supported. See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details. ******************************************************************************** !! corresp(dist, value, root_dir) /usr/lib/python3.13/site-packages/setuptools/config/_apply_pyprojecttoml.py:61: SetuptoolsDeprecationWarning: License classifiers are deprecated. !! ******************************************************************************** Please consider removing the following classifiers in favor of a SPDX license expression: License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+) See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details. ******************************************************************************** !! dist._finalize_license_expression() /usr/lib/python3.13/site-packages/setuptools/dist.py:759: SetuptoolsDeprecationWarning: License classifiers are deprecated. !! ******************************************************************************** Please consider removing the following classifiers in favor of a SPDX license expression: License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+) See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details. ******************************************************************************** !! self._finalize_license_expression() running egg_info creating src/b4.egg-info writing src/b4.egg-info/PKG-INFO writing dependency_links to src/b4.egg-info/dependency_links.txt writing entry points to src/b4.egg-info/entry_points.txt writing requirements to src/b4.egg-info/requires.txt writing top-level names to src/b4.egg-info/top_level.txt writing manifest file 'src/b4.egg-info/SOURCES.txt' reading manifest file 'src/b4.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' no previously-included directories found matching 'src/tests' adding license file 'COPYING' writing manifest file 'src/b4.egg-info/SOURCES.txt' * Building wheel... /usr/lib/python3.13/site-packages/setuptools/config/_apply_pyprojecttoml.py:82: SetuptoolsDeprecationWarning: `project.license` as a TOML table is deprecated !! ******************************************************************************** Please use a simple string containing a SPDX expression for `project.license`. You can also use `project.license-files`. (Both options available on setuptools>=77.0.0). By 2026-Feb-18, you need to update your project and remove deprecated calls or your builds will no longer be supported. See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details. ******************************************************************************** !! corresp(dist, value, root_dir) /usr/lib/python3.13/site-packages/setuptools/config/_apply_pyprojecttoml.py:61: SetuptoolsDeprecationWarning: License classifiers are deprecated. !! ******************************************************************************** Please consider removing the following classifiers in favor of a SPDX license expression: License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+) See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details. ******************************************************************************** !! dist._finalize_license_expression() /usr/lib/python3.13/site-packages/setuptools/dist.py:759: SetuptoolsDeprecationWarning: License classifiers are deprecated. !! ******************************************************************************** Please consider removing the following classifiers in favor of a SPDX license expression: License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+) See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details. ******************************************************************************** !! self._finalize_license_expression() running bdist_wheel running build running build_py creating build/lib/b4 copying src/b4/ez.py -> build/lib/b4 copying src/b4/command.py -> build/lib/b4 copying src/b4/diff.py -> build/lib/b4 copying src/b4/ty.py -> build/lib/b4 copying src/b4/mbox.py -> build/lib/b4 copying src/b4/pr.py -> build/lib/b4 copying src/b4/__init__.py -> build/lib/b4 copying src/b4/kr.py -> build/lib/b4 running egg_info writing src/b4.egg-info/PKG-INFO writing dependency_links to src/b4.egg-info/dependency_links.txt writing entry points to src/b4.egg-info/entry_points.txt writing requirements to src/b4.egg-info/requires.txt writing top-level names to src/b4.egg-info/top_level.txt reading manifest file 'src/b4.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' no previously-included directories found matching 'src/tests' adding license file 'COPYING' writing manifest file 'src/b4.egg-info/SOURCES.txt' creating build/lib/b4/templates copying src/b4/templates/shazam-merge-template.example -> build/lib/b4/templates copying src/b4/templates/thanks-am-template.example -> build/lib/b4/templates copying src/b4/templates/thanks-pr-template.example -> build/lib/b4/templates creating build/lib/b4/man copying src/b4/man/b4.5.rst -> build/lib/b4/man installing to build/bdist.linux-riscv64/wheel running install running install_lib creating build/bdist.linux-riscv64/wheel creating build/bdist.linux-riscv64/wheel/b4 copying build/lib/b4/ez.py -> build/bdist.linux-riscv64/wheel/./b4 creating build/bdist.linux-riscv64/wheel/b4/templates copying build/lib/b4/templates/shazam-merge-template.example -> build/bdist.linux-riscv64/wheel/./b4/templates copying build/lib/b4/templates/thanks-pr-template.example -> build/bdist.linux-riscv64/wheel/./b4/templates copying build/lib/b4/templates/thanks-am-template.example -> build/bdist.linux-riscv64/wheel/./b4/templates copying build/lib/b4/command.py -> build/bdist.linux-riscv64/wheel/./b4 copying build/lib/b4/diff.py -> build/bdist.linux-riscv64/wheel/./b4 copying build/lib/b4/ty.py -> build/bdist.linux-riscv64/wheel/./b4 creating build/bdist.linux-riscv64/wheel/b4/man copying build/lib/b4/man/b4.5.rst -> build/bdist.linux-riscv64/wheel/./b4/man copying build/lib/b4/mbox.py -> build/bdist.linux-riscv64/wheel/./b4 copying build/lib/b4/pr.py -> build/bdist.linux-riscv64/wheel/./b4 copying build/lib/b4/__init__.py -> build/bdist.linux-riscv64/wheel/./b4 copying build/lib/b4/kr.py -> build/bdist.linux-riscv64/wheel/./b4 running install_egg_info Copying src/b4.egg-info to build/bdist.linux-riscv64/wheel/./b4-0.14.3-py3.13.egg-info running install_scripts creating build/bdist.linux-riscv64/wheel/b4-0.14.3.dist-info/WHEEL creating '/build/b4/src/b4/dist/.tmp-qdbydvos/b4-0.14.3-py3-none-any.whl' and adding 'build/bdist.linux-riscv64/wheel' to it adding 'b4/__init__.py' adding 'b4/command.py' adding 'b4/diff.py' adding 'b4/ez.py' adding 'b4/kr.py' adding 'b4/mbox.py' adding 'b4/pr.py' adding 'b4/ty.py' adding 'b4/man/b4.5.rst' adding 'b4/templates/shazam-merge-template.example' adding 'b4/templates/thanks-am-template.example' adding 'b4/templates/thanks-pr-template.example' adding 'b4-0.14.3.dist-info/licenses/COPYING' adding 'b4-0.14.3.dist-info/METADATA' adding 'b4-0.14.3.dist-info/WHEEL' adding 'b4-0.14.3.dist-info/entry_points.txt' adding 'b4-0.14.3.dist-info/top_level.txt' adding 'b4-0.14.3.dist-info/RECORD' removing build/bdist.linux-riscv64/wheel Successfully built b4-0.14.3-py3-none-any.whl ==> Starting check()... ============================= test session starts ============================== platform linux -- Python 3.13.11, pytest-8.4.2, pluggy-1.6.0 rootdir: /build/b4/src/b4 configfile: pyproject.toml collected 83 items test___init__.py ....................................................... [ 66%] ..................... [ 91%] test_ez.py FFFF [ 96%] test_mbox.py ... [100%] =================================== FAILURES =================================== _ test_trailers[trailers-thread-with-followups-None-None-trargs0-compareargs0-trailers-thread-with-followups-b4cfg0] _ sampledir = '/build/b4/src/b4/src/tests/samples' prepdir = '/tmp/pytest-of-builduser/pytest-0/test_trailers_trailers_thread_0/repo' mboxf = 'trailers-thread-with-followups', bundlef = None, rep = None trargs = [], compareargs = ['log', '--format=%ae%n%s%n%b---', 'HEAD~4..'] compareout = 'trailers-thread-with-followups' b4cfg = {'shazam-am-flags': '--signoff'} @pytest.mark.parametrize('mboxf, bundlef, rep, trargs, compareargs, compareout, b4cfg', [ ('trailers-thread-with-followups', None, None, [], ['log', '--format=%ae%n%s%n%b---', 'HEAD~4..'], 'trailers-thread-with-followups', {'shazam-am-flags': '--signoff'}), ('trailers-thread-with-cover-followup', None, None, [], ['log', '--format=%ae%n%s%n%b---', 'HEAD~4..'], 'trailers-thread-with-cover-followup', {'shazam-am-flags': '--signoff'}), # Test matching trailer updates by subject when patch-id changes ('trailers-thread-with-followups', None, (b'vivendum', b'addendum'), [], ['log', '--format=%ae%n%s%n%b---', 'HEAD~4..'], 'trailers-thread-with-followups', {'shazam-am-flags': '--signoff'}), # Test that we properly perserve commits with --- in them ('trailers-thread-with-followups', 'trailers-with-tripledash', None, [], ['log', '--format=%ae%n%s%n%b---', 'HEAD~4..'], 'trailers-thread-with-followups-and-tripledash', None), ]) def test_trailers(sampledir, prepdir, mboxf, bundlef, rep, trargs, compareargs, compareout, b4cfg): if b4cfg: b4.MAIN_CONFIG.update(b4cfg) config = b4.get_main_config() mfile = os.path.join(sampledir, f'{mboxf}.mbox') assert os.path.exists(mfile) if bundlef: bfile = os.path.join(sampledir, f'{bundlef}.bundle') assert os.path.exists(bfile) gitargs = ['pull', '--rebase', bfile] out, logstr = b4.git_run_command(None, gitargs) assert out == 0 else: assert config.get('shazam-am-flags') == '--signoff' if rep: with open(mfile, 'rb') as fh: contents = fh.read() contents = contents.replace(rep[0], rep[1]) tfile = os.path.join(prepdir, '.git', 'modified.mbox') with open(tfile, 'wb') as fh: fh.write(contents) else: tfile = mfile b4args = ['--no-stdin', '--no-interactive', '--offline-mode', 'shazam', '--no-add-trailers', '-m', tfile] parser = b4.command.setup_parser() cmdargs = parser.parse_args(b4args) with pytest.raises(SystemExit) as e: b4.mbox.main(cmdargs) assert e.type == SystemExit assert e.value.code == 0 cfile = os.path.join(sampledir, f'{compareout}.verify') assert os.path.exists(cfile) parser = b4.command.setup_parser() b4args = ['--no-stdin', '--no-interactive', '--offline-mode', 'trailers', '--update', '-m', mfile] + trargs cmdargs = parser.parse_args(b4args) > b4.ez.cmd_trailers(cmdargs) /build/b4/src/b4/src/tests/test_ez.py:73: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /build/b4/src/b4/src/b4/ez.py:2931: in cmd_trailers update_trailers(cmdargs) /build/b4/src/b4/src/b4/ez.py:1288: in update_trailers run_frf(frf) /build/b4/src/b4/src/b4/ez.py:125: in run_frf frf.run() /usr/lib/python3.13/site-packages/git_filter_repo.py:4875: in run self._run_sanity_checks() /usr/lib/python3.13/site-packages/git_filter_repo.py:3276: in _run_sanity_checks self._config_settings = GitUtils.get_config_settings(target_working_dir) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ repo_working_dir = b'.' @staticmethod def get_config_settings(repo_working_dir): output = '' try: output = subproc.check_output('git config --list'.split(), cwd=repo_working_dir) except subprocess.CalledProcessError as e: # pragma: no cover raise SystemExit('fatal: {}'.format(e)) # FIXME: Ignores multi-valued keys, just let them overwrite for now > return dict(line.split(b'=', maxsplit=1) for line in output.strip().split(b"\n")) E ValueError: dictionary update sequence element #13 has length 1; 2 is required /usr/lib/python3.13/site-packages/git_filter_repo.py:1692: ValueError ------------------------------ Captured log call ------------------------------- CRITICAL b4:mbox.py:165 Total patches: 4 CRITICAL b4:mbox.py:200 --- CRITICAL b4:ez.py:1267 --- _ test_trailers[trailers-thread-with-cover-followup-None-None-trargs1-compareargs1-trailers-thread-with-cover-followup-b4cfg1] _ sampledir = '/build/b4/src/b4/src/tests/samples' prepdir = '/tmp/pytest-of-builduser/pytest-0/test_trailers_trailers_thread_1/repo' mboxf = 'trailers-thread-with-cover-followup', bundlef = None, rep = None trargs = [], compareargs = ['log', '--format=%ae%n%s%n%b---', 'HEAD~4..'] compareout = 'trailers-thread-with-cover-followup' b4cfg = {'shazam-am-flags': '--signoff'} @pytest.mark.parametrize('mboxf, bundlef, rep, trargs, compareargs, compareout, b4cfg', [ ('trailers-thread-with-followups', None, None, [], ['log', '--format=%ae%n%s%n%b---', 'HEAD~4..'], 'trailers-thread-with-followups', {'shazam-am-flags': '--signoff'}), ('trailers-thread-with-cover-followup', None, None, [], ['log', '--format=%ae%n%s%n%b---', 'HEAD~4..'], 'trailers-thread-with-cover-followup', {'shazam-am-flags': '--signoff'}), # Test matching trailer updates by subject when patch-id changes ('trailers-thread-with-followups', None, (b'vivendum', b'addendum'), [], ['log', '--format=%ae%n%s%n%b---', 'HEAD~4..'], 'trailers-thread-with-followups', {'shazam-am-flags': '--signoff'}), # Test that we properly perserve commits with --- in them ('trailers-thread-with-followups', 'trailers-with-tripledash', None, [], ['log', '--format=%ae%n%s%n%b---', 'HEAD~4..'], 'trailers-thread-with-followups-and-tripledash', None), ]) def test_trailers(sampledir, prepdir, mboxf, bundlef, rep, trargs, compareargs, compareout, b4cfg): if b4cfg: b4.MAIN_CONFIG.update(b4cfg) config = b4.get_main_config() mfile = os.path.join(sampledir, f'{mboxf}.mbox') assert os.path.exists(mfile) if bundlef: bfile = os.path.join(sampledir, f'{bundlef}.bundle') assert os.path.exists(bfile) gitargs = ['pull', '--rebase', bfile] out, logstr = b4.git_run_command(None, gitargs) assert out == 0 else: assert config.get('shazam-am-flags') == '--signoff' if rep: with open(mfile, 'rb') as fh: contents = fh.read() contents = contents.replace(rep[0], rep[1]) tfile = os.path.join(prepdir, '.git', 'modified.mbox') with open(tfile, 'wb') as fh: fh.write(contents) else: tfile = mfile b4args = ['--no-stdin', '--no-interactive', '--offline-mode', 'shazam', '--no-add-trailers', '-m', tfile] parser = b4.command.setup_parser() cmdargs = parser.parse_args(b4args) with pytest.raises(SystemExit) as e: b4.mbox.main(cmdargs) assert e.type == SystemExit assert e.value.code == 0 cfile = os.path.join(sampledir, f'{compareout}.verify') assert os.path.exists(cfile) parser = b4.command.setup_parser() b4args = ['--no-stdin', '--no-interactive', '--offline-mode', 'trailers', '--update', '-m', mfile] + trargs cmdargs = parser.parse_args(b4args) > b4.ez.cmd_trailers(cmdargs) /build/b4/src/b4/src/tests/test_ez.py:73: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /build/b4/src/b4/src/b4/ez.py:2931: in cmd_trailers update_trailers(cmdargs) /build/b4/src/b4/src/b4/ez.py:1288: in update_trailers run_frf(frf) /build/b4/src/b4/src/b4/ez.py:125: in run_frf frf.run() /usr/lib/python3.13/site-packages/git_filter_repo.py:4875: in run self._run_sanity_checks() /usr/lib/python3.13/site-packages/git_filter_repo.py:3276: in _run_sanity_checks self._config_settings = GitUtils.get_config_settings(target_working_dir) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ repo_working_dir = b'.' @staticmethod def get_config_settings(repo_working_dir): output = '' try: output = subproc.check_output('git config --list'.split(), cwd=repo_working_dir) except subprocess.CalledProcessError as e: # pragma: no cover raise SystemExit('fatal: {}'.format(e)) # FIXME: Ignores multi-valued keys, just let them overwrite for now > return dict(line.split(b'=', maxsplit=1) for line in output.strip().split(b"\n")) E ValueError: dictionary update sequence element #13 has length 1; 2 is required /usr/lib/python3.13/site-packages/git_filter_repo.py:1692: ValueError ------------------------------ Captured log call ------------------------------- CRITICAL b4:mbox.py:165 Total patches: 4 CRITICAL b4:mbox.py:200 --- CRITICAL b4:ez.py:1267 --- _ test_trailers[trailers-thread-with-followups-None-rep2-trargs2-compareargs2-trailers-thread-with-followups-b4cfg2] _ sampledir = '/build/b4/src/b4/src/tests/samples' prepdir = '/tmp/pytest-of-builduser/pytest-0/test_trailers_trailers_thread_2/repo' mboxf = 'trailers-thread-with-followups', bundlef = None rep = (b'vivendum', b'addendum'), trargs = [] compareargs = ['log', '--format=%ae%n%s%n%b---', 'HEAD~4..'] compareout = 'trailers-thread-with-followups' b4cfg = {'shazam-am-flags': '--signoff'} @pytest.mark.parametrize('mboxf, bundlef, rep, trargs, compareargs, compareout, b4cfg', [ ('trailers-thread-with-followups', None, None, [], ['log', '--format=%ae%n%s%n%b---', 'HEAD~4..'], 'trailers-thread-with-followups', {'shazam-am-flags': '--signoff'}), ('trailers-thread-with-cover-followup', None, None, [], ['log', '--format=%ae%n%s%n%b---', 'HEAD~4..'], 'trailers-thread-with-cover-followup', {'shazam-am-flags': '--signoff'}), # Test matching trailer updates by subject when patch-id changes ('trailers-thread-with-followups', None, (b'vivendum', b'addendum'), [], ['log', '--format=%ae%n%s%n%b---', 'HEAD~4..'], 'trailers-thread-with-followups', {'shazam-am-flags': '--signoff'}), # Test that we properly perserve commits with --- in them ('trailers-thread-with-followups', 'trailers-with-tripledash', None, [], ['log', '--format=%ae%n%s%n%b---', 'HEAD~4..'], 'trailers-thread-with-followups-and-tripledash', None), ]) def test_trailers(sampledir, prepdir, mboxf, bundlef, rep, trargs, compareargs, compareout, b4cfg): if b4cfg: b4.MAIN_CONFIG.update(b4cfg) config = b4.get_main_config() mfile = os.path.join(sampledir, f'{mboxf}.mbox') assert os.path.exists(mfile) if bundlef: bfile = os.path.join(sampledir, f'{bundlef}.bundle') assert os.path.exists(bfile) gitargs = ['pull', '--rebase', bfile] out, logstr = b4.git_run_command(None, gitargs) assert out == 0 else: assert config.get('shazam-am-flags') == '--signoff' if rep: with open(mfile, 'rb') as fh: contents = fh.read() contents = contents.replace(rep[0], rep[1]) tfile = os.path.join(prepdir, '.git', 'modified.mbox') with open(tfile, 'wb') as fh: fh.write(contents) else: tfile = mfile b4args = ['--no-stdin', '--no-interactive', '--offline-mode', 'shazam', '--no-add-trailers', '-m', tfile] parser = b4.command.setup_parser() cmdargs = parser.parse_args(b4args) with pytest.raises(SystemExit) as e: b4.mbox.main(cmdargs) assert e.type == SystemExit assert e.value.code == 0 cfile = os.path.join(sampledir, f'{compareout}.verify') assert os.path.exists(cfile) parser = b4.command.setup_parser() b4args = ['--no-stdin', '--no-interactive', '--offline-mode', 'trailers', '--update', '-m', mfile] + trargs cmdargs = parser.parse_args(b4args) > b4.ez.cmd_trailers(cmdargs) /build/b4/src/b4/src/tests/test_ez.py:73: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /build/b4/src/b4/src/b4/ez.py:2931: in cmd_trailers update_trailers(cmdargs) /build/b4/src/b4/src/b4/ez.py:1288: in update_trailers run_frf(frf) /build/b4/src/b4/src/b4/ez.py:125: in run_frf frf.run() /usr/lib/python3.13/site-packages/git_filter_repo.py:4875: in run self._run_sanity_checks() /usr/lib/python3.13/site-packages/git_filter_repo.py:3276: in _run_sanity_checks self._config_settings = GitUtils.get_config_settings(target_working_dir) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ repo_working_dir = b'.' @staticmethod def get_config_settings(repo_working_dir): output = '' try: output = subproc.check_output('git config --list'.split(), cwd=repo_working_dir) except subprocess.CalledProcessError as e: # pragma: no cover raise SystemExit('fatal: {}'.format(e)) # FIXME: Ignores multi-valued keys, just let them overwrite for now > return dict(line.split(b'=', maxsplit=1) for line in output.strip().split(b"\n")) E ValueError: dictionary update sequence element #13 has length 1; 2 is required /usr/lib/python3.13/site-packages/git_filter_repo.py:1692: ValueError ------------------------------ Captured log call ------------------------------- CRITICAL b4:mbox.py:165 Total patches: 4 CRITICAL b4:mbox.py:200 --- CRITICAL b4:ez.py:1267 --- _ test_trailers[trailers-thread-with-followups-trailers-with-tripledash-None-trargs3-compareargs3-trailers-thread-with-followups-and-tripledash-None] _ sampledir = '/build/b4/src/b4/src/tests/samples' prepdir = '/tmp/pytest-of-builduser/pytest-0/test_trailers_trailers_thread_3/repo' mboxf = 'trailers-thread-with-followups', bundlef = 'trailers-with-tripledash' rep = None, trargs = [] compareargs = ['log', '--format=%ae%n%s%n%b---', 'HEAD~4..'] compareout = 'trailers-thread-with-followups-and-tripledash', b4cfg = None @pytest.mark.parametrize('mboxf, bundlef, rep, trargs, compareargs, compareout, b4cfg', [ ('trailers-thread-with-followups', None, None, [], ['log', '--format=%ae%n%s%n%b---', 'HEAD~4..'], 'trailers-thread-with-followups', {'shazam-am-flags': '--signoff'}), ('trailers-thread-with-cover-followup', None, None, [], ['log', '--format=%ae%n%s%n%b---', 'HEAD~4..'], 'trailers-thread-with-cover-followup', {'shazam-am-flags': '--signoff'}), # Test matching trailer updates by subject when patch-id changes ('trailers-thread-with-followups', None, (b'vivendum', b'addendum'), [], ['log', '--format=%ae%n%s%n%b---', 'HEAD~4..'], 'trailers-thread-with-followups', {'shazam-am-flags': '--signoff'}), # Test that we properly perserve commits with --- in them ('trailers-thread-with-followups', 'trailers-with-tripledash', None, [], ['log', '--format=%ae%n%s%n%b---', 'HEAD~4..'], 'trailers-thread-with-followups-and-tripledash', None), ]) def test_trailers(sampledir, prepdir, mboxf, bundlef, rep, trargs, compareargs, compareout, b4cfg): if b4cfg: b4.MAIN_CONFIG.update(b4cfg) config = b4.get_main_config() mfile = os.path.join(sampledir, f'{mboxf}.mbox') assert os.path.exists(mfile) if bundlef: bfile = os.path.join(sampledir, f'{bundlef}.bundle') assert os.path.exists(bfile) gitargs = ['pull', '--rebase', bfile] out, logstr = b4.git_run_command(None, gitargs) assert out == 0 else: assert config.get('shazam-am-flags') == '--signoff' if rep: with open(mfile, 'rb') as fh: contents = fh.read() contents = contents.replace(rep[0], rep[1]) tfile = os.path.join(prepdir, '.git', 'modified.mbox') with open(tfile, 'wb') as fh: fh.write(contents) else: tfile = mfile b4args = ['--no-stdin', '--no-interactive', '--offline-mode', 'shazam', '--no-add-trailers', '-m', tfile] parser = b4.command.setup_parser() cmdargs = parser.parse_args(b4args) with pytest.raises(SystemExit) as e: b4.mbox.main(cmdargs) assert e.type == SystemExit assert e.value.code == 0 cfile = os.path.join(sampledir, f'{compareout}.verify') assert os.path.exists(cfile) parser = b4.command.setup_parser() b4args = ['--no-stdin', '--no-interactive', '--offline-mode', 'trailers', '--update', '-m', mfile] + trargs cmdargs = parser.parse_args(b4args) > b4.ez.cmd_trailers(cmdargs) /build/b4/src/b4/src/tests/test_ez.py:73: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /build/b4/src/b4/src/b4/ez.py:2931: in cmd_trailers update_trailers(cmdargs) /build/b4/src/b4/src/b4/ez.py:1288: in update_trailers run_frf(frf) /build/b4/src/b4/src/b4/ez.py:125: in run_frf frf.run() /usr/lib/python3.13/site-packages/git_filter_repo.py:4875: in run self._run_sanity_checks() /usr/lib/python3.13/site-packages/git_filter_repo.py:3276: in _run_sanity_checks self._config_settings = GitUtils.get_config_settings(target_working_dir) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ repo_working_dir = b'.' @staticmethod def get_config_settings(repo_working_dir): output = '' try: output = subproc.check_output('git config --list'.split(), cwd=repo_working_dir) except subprocess.CalledProcessError as e: # pragma: no cover raise SystemExit('fatal: {}'.format(e)) # FIXME: Ignores multi-valued keys, just let them overwrite for now > return dict(line.split(b'=', maxsplit=1) for line in output.strip().split(b"\n")) E ValueError: dictionary update sequence element #13 has length 1; 2 is required /usr/lib/python3.13/site-packages/git_filter_repo.py:1692: ValueError ------------------------------ Captured log call ------------------------------- CRITICAL b4:ez.py:1267 --- =========================== short test summary info ============================ FAILED test_ez.py::test_trailers[trailers-thread-with-followups-None-None-trargs0-compareargs0-trailers-thread-with-followups-b4cfg0] FAILED test_ez.py::test_trailers[trailers-thread-with-cover-followup-None-None-trargs1-compareargs1-trailers-thread-with-cover-followup-b4cfg1] FAILED test_ez.py::test_trailers[trailers-thread-with-followups-None-rep2-trargs2-compareargs2-trailers-thread-with-followups-b4cfg2] FAILED test_ez.py::test_trailers[trailers-thread-with-followups-trailers-with-tripledash-None-trargs3-compareargs3-trailers-thread-with-followups-and-tripledash-None] ======================== 4 failed, 79 passed in 14.69s ========================= ==> ERROR: A failure occurred in check().  Aborting... ==> ERROR: Build failed, check /var/lib/archbuild/extra-riscv64/felix-0/build [?25h[?25h[?25hreceiving incremental file list b4-0.14.3-2-riscv64-build.log b4-0.14.3-2-riscv64-check.log sent 62 bytes received 3,656 bytes 1,487.20 bytes/sec total size is 29,425 speedup is 7.91