main e86dbd6

Test failure 7m 54s

Annotations 2

  • End-to-end tests

    error

    Process completed with exit code 1.

  • Complete job

    warning

    Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/setup-go@v5. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/

  1. Current runner version: 'v0.5.0'
  2. GITHUB_TOKEN Permissions
  3. Contents: read
  4. Metadata: read
  5. Packages: read
  6. Secret source: Actions
  7. Cache mode: write
  8. Prepare workflow directory
  9. Prepare all required actions
  10. Getting action download info
  11. Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803)
  12. Download action repository 'actions/setup-go@v5' (SHA:40f1582b2485089dde7abd97c1529aa768e1baff)
  13. Complete job name: Test
  14. Checking docker version
  15. ##[command]/usr/bin/docker version --format '{{.Server.APIVersion}}'
  16. '1.56'
  17. Docker daemon API version: '1.56'
  18. ##[command]/usr/bin/docker version --format '{{.Client.APIVersion}}'
  19. '1.56'
  20. Docker client API version: '1.56'
  21. Clean up resources from previous jobs
  22. ##[command]/usr/bin/docker ps --all --quiet --no-trunc --filter "label=417814"
  23. ##[command]/usr/bin/docker network prune --force --filter "label=417814"
  24. Create local container network
  25. ##[command]/usr/bin/docker network create --label 417814 github_network_3d29a8d93e954b0da008e0219b4fc0d3
  26. af9a34c356735571c06d3c838510cf2242501afdcd0bf8c8b379594e5491880b
  27. Starting job container
  28. ##[command]/usr/bin/docker pull archlinux:latest
  29. latest: Pulling from library/archlinux
  30. 7450fb54bb4f: Pulling fs layer
  31. e4c7c6c5e741: Pulling fs layer
  32. e4c7c6c5e741: Verifying Checksum
  33. e4c7c6c5e741: Download complete
  34. 7450fb54bb4f: Verifying Checksum
  35. 7450fb54bb4f: Download complete
  36. 7450fb54bb4f: Pull complete
  37. e4c7c6c5e741: Pull complete
  38. Digest: sha256:e43f1fd80e073992c5f173efbbbf65144170bf60aeb7369940087d63eacea8f4
  39. Status: Downloaded newer image for archlinux:latest
  40. docker.io/library/archlinux:latest
  41. ##[command]/usr/bin/docker create --name 26cafe9022154260a92f91db63d76285_archlinuxlatest_fcdece --label 417814 --workdir /__w/ermite/ermite --network github_network_3d29a8d93e954b0da008e0219b4fc0d3 -e "HOME=/github/home" -e GITHUB_ACTIONS=true -e CI=true -v "/var/run/docker.sock":"/var/run/docker.sock" -v "/home/runner/work":"/__w" -v "/home/runner/externals":"/__e":ro -v "/home/runner/work/_temp":"/__w/_temp" -v "/home/runner/work/_actions":"/__w/_actions" -v "/opt/hostedtoolcache":"/__t" -v "/home/runner/work/_temp/_github_home":"/github/home" -v "/home/runner/work/_temp/_github_workflow":"/github/workflow" --entrypoint "tail" archlinux:latest "-f" "/dev/null"
  42. 1b888c945181acda79e38ae57f1848d56176f1bc3ea6b799c5e09dc73722b1ce
  43. ##[command]/usr/bin/docker start 1b888c945181acda79e38ae57f1848d56176f1bc3ea6b799c5e09dc73722b1ce
  44. 1b888c945181acda79e38ae57f1848d56176f1bc3ea6b799c5e09dc73722b1ce
  45. ##[command]/usr/bin/docker ps --all --filter id=1b888c945181acda79e38ae57f1848d56176f1bc3ea6b799c5e09dc73722b1ce --filter status=running --no-trunc --format "{{.ID}} {{.Status}}"
  46. 1b888c945181acda79e38ae57f1848d56176f1bc3ea6b799c5e09dc73722b1ce Up Less than a second
  47. ##[command]/usr/bin/docker inspect --format "{{range .Config.Env}}{{println .}}{{end}}" 1b888c945181acda79e38ae57f1848d56176f1bc3ea6b799c5e09dc73722b1ce
  48. HOME=/github/home
  49. GITHUB_ACTIONS=true
  50. CI=true
  51. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  52. LANG=C.UTF-8
  53. Waiting for all services to be ready
  54. Run pacman -Syu --noconfirm --needed git gcc openssh nodejs
  55. <U+001B>[36;1mpacman -Syu --noconfirm --needed git gcc openssh nodejs<U+001B>[0m
  56. shell: sh -e {0}
  57. env:
  58. GOWORK: off
  59. :: Synchronizing package databases...
  60. core downloading...
  61. extra downloading...
  62. :: Starting full system upgrade...
  63. resolving dependencies...
  64. looking for conflicting packages...
  65. Package (24) Old Version New Version Net Change Download Size
  66. extra/abseil-cpp 20260817.0-2 7.15 MiB 1.35 MiB
  67. extra/ada 4.0.0-1 0.95 MiB 0.31 MiB
  68. extra/c-ares 1.34.8-1 0.53 MiB 0.23 MiB
  69. core/db5.3 5.3.28-7 6.48 MiB 1.26 MiB
  70. core/dbus 1.16.2-1 1.16.2-2 0.03 MiB 0.35 MiB
  71. extra/gtest 1.18.0-1 1.67 MiB 0.39 MiB
  72. core/libedit 20260512_3.1-1 0.27 MiB 0.11 MiB
  73. core/libisl 0.28-1 5.90 MiB 0.94 MiB
  74. core/libmpc 1.4.1-1 0.19 MiB 0.09 MiB
  75. extra/libuv 1.52.1-2 0.64 MiB 0.26 MiB
  76. core/linux-api-headers 7.2-1 7.3-1 0.07 MiB 1.53 MiB
  77. core/perl 5.44.0-1 72.30 MiB 20.98 MiB
  78. extra/perl-error 0.17030-3 0.04 MiB 0.02 MiB
  79. extra/perl-mailtools 2.22-3 0.10 MiB 0.06 MiB
  80. extra/perl-timedate 2.35-1 0.15 MiB 0.06 MiB
  81. extra/simdjson 1:5.0.5-1 10.27 MiB 0.44 MiB
  82. core/systemd 262-1 262.1-1 0.03 MiB 10.68 MiB
  83. core/systemd-libs 262-1 262.1-1 0.01 MiB 1.44 MiB
  84. core/systemd-sysvcompat 262-1 262.1-1 0.00 MiB 0.01 MiB
  85. extra/zlib-ng 2.3.3-1 0.28 MiB 0.11 MiB
  86. core/gcc 16.2.1+r23+gd564253eb6c8-1 220.89 MiB 57.93 MiB
  87. extra/git 2.56.0-1 33.54 MiB 7.43 MiB
  88. extra/nodejs 26.12.0-1 64.12 MiB 17.48 MiB
  89. core/openssh 10.6p1-2 6.77 MiB 1.43 MiB
  90. Total Download Size: 124.89 MiB
  91. Total Installed Size: 484.66 MiB
  92. Net Upgrade Size: 432.37 MiB
  93. :: Proceed with installation? [Y/n]
  94. :: Retrieving packages...
  95. gcc-16.2.1+r23+gd564253eb6c8-1-x86_64 downloading...
  96. perl-5.44.0-1-x86_64 downloading...
  97. nodejs-26.12.0-1-x86_64 downloading...
  98. systemd-262.1-1-x86_64 downloading...
  99. git-2.56.0-1-x86_64 downloading...
  100. linux-api-headers-7.3-1-x86_64 downloading...
  101. systemd-libs-262.1-1-x86_64 downloading...
  102. openssh-10.6p1-2-x86_64 downloading...
  103. abseil-cpp-20260817.0-2-x86_64 downloading...
  104. db5.3-5.3.28-7-x86_64 downloading...
  105. libisl-0.28-1-x86_64 downloading...
  106. simdjson-1:5.0.5-1-x86_64 downloading...
  107. gtest-1.18.0-1-x86_64 downloading...
  108. dbus-1.16.2-2-x86_64 downloading...
  109. ada-4.0.0-1-x86_64 downloading...
  110. libuv-1.52.1-2-x86_64 downloading...
  111. c-ares-1.34.8-1-x86_64 downloading...
  112. libedit-20260512_3.1-1-x86_64 downloading...
  113. zlib-ng-2.3.3-1-x86_64 downloading...
  114. libmpc-1.4.1-1-x86_64 downloading...
  115. perl-timedate-2.35-1-any downloading...
  116. perl-mailtools-2.22-3-any downloading...
  117. perl-error-0.17030-3-any downloading...
  118. systemd-sysvcompat-262.1-1-x86_64 downloading...
  119. checking keyring...
  120. checking package integrity...
  121. loading package files...
  122. checking for file conflicts...
  123. :: Processing package changes...
  124. upgrading linux-api-headers...
  125. installing db5.3...
  126. installing perl...
  127. installing perl-error...
  128. installing perl-timedate...
  129. installing perl-mailtools...
  130. installing zlib-ng...
  131. upgrading systemd-libs...
  132. installing git...
  133. Optional dependencies for git
  134. git-zsh-completion: upstream zsh completion
  135. tk: gitk and git gui
  136. openssh: ssh transport and crypto [pending]
  137. man: show help with `git command --help`
  138. perl-libwww: git svn
  139. perl-term-readkey: git svn and interactive.singlekey setting
  140. perl-io-socket-ssl: git send-email TLS support
  141. perl-authen-sasl: git send-email TLS support
  142. perl-cgi: gitweb (web interface) support
  143. python: git svn & git p4
  144. subversion: git svn
  145. org.freedesktop.secrets: keyring credential helper
  146. libsecret: libsecret credential helper [installed]
  147. less: the default pager for git
  148. installing libisl...
  149. installing libmpc...
  150. installing gcc...
  151. Optional dependencies for gcc
  152. lib32-gcc-libs: for generating code for 32-bit ABI
  153. installing libedit...
  154. installing openssh...
  155. Optional dependencies for openssh
  156. libfido2: FIDO/U2F support
  157. sh: for ssh-copy-id and findssl.sh [installed]
  158. x11-ssh-askpass: input passphrase in X
  159. xorg-xauth: X11 forwarding
  160. installing gtest...
  161. Optional dependencies for gtest
  162. python: gmock generator
  163. installing abseil-cpp...
  164. installing ada...
  165. installing c-ares...
  166. installing libuv...
  167. installing simdjson...
  168. installing nodejs...
  169. Optional dependencies for nodejs
  170. npm: nodejs package manager
  171. upgrading dbus...
  172. upgrading systemd...
  173. Creating group 'git' with GID 969.
  174. Creating user 'git' (git daemon user) with UID 969 and GID 969.
  175. upgrading systemd-sysvcompat...
  176. :: Running post-transaction hooks...
  177. ( 1/12) Creating system user accounts...
  178. ( 2/12) Creating temporary files...
  179. /usr/lib/tmpfiles.d/journal-nocow.conf:26: Failed to resolve specifier: uninitialized /etc/ detected, skipping.
  180. All rules containing unresolvable specifiers will be skipped.
  181. ( 3/12) Updating journal message catalog...
  182. ( 4/12) Updating udev hardware database...
  183. ( 5/12) Applying kernel sysctl settings...
  184. Skipped: Current root is not booted.
  185. ( 6/12) Reloading system manager configuration...
  186. Skipped: Current root is not booted.
  187. ( 7/12) Reloading user manager configuration...
  188. Skipped: Current root is not booted.
  189. ( 8/12) Enqueuing marked services...
  190. Skipped: Current root is not booted.
  191. ( 9/12) Reloading device manager configuration...
  192. Skipped: Current root is not booted.
  193. (10/12) Arming ConditionNeedsUpdate...
  194. (11/12) Reloading system bus configuration...
  195. Skipped: Current root is not booted.
  196. (12/12) Checking for old perl modules...
  197. Run actions/checkout@v6
  198. with:
  199. repository: bnema/ermite
  200. token: ***
  201. ssh-strict: true
  202. ssh-user: git
  203. persist-credentials: true
  204. clean: true
  205. sparse-checkout-cone-mode: true
  206. fetch-depth: 1
  207. fetch-tags: false
  208. show-progress: true
  209. lfs: false
  210. submodules: false
  211. set-safe-directory: true
  212. allow-unsafe-pr-checkout: false
  213. env:
  214. GOWORK: off
  215. ##[command]/usr/bin/docker exec 1b888c945181acda79e38ae57f1848d56176f1bc3ea6b799c5e09dc73722b1ce sh -c "cat /etc/*release | grep ^ID"
  216. Syncing repository: bnema/ermite
  217. Getting Git version info
  218. Working directory is '/__w/ermite/ermite'
  219. [command]/usr/sbin/git version
  220. git version 2.56.0
  221. Temporarily overriding HOME='/__w/_temp/dffe4827-5fec-4efd-aa3a-a660270cc87f' before making global git config changes
  222. Adding repository directory to the temporary git global config as a safe directory
  223. [command]/usr/sbin/git config --global --add safe.directory /__w/ermite/ermite
  224. Deleting the contents of '/__w/ermite/ermite'
  225. Determining repository object format
  226. Initializing the repository
  227. [command]/usr/sbin/git init /__w/ermite/ermite
  228. hint: Using 'master' as the name for the initial branch. This default branch name
  229. hint: will change to "main" in Git 3.0. To configure the initial branch name
  230. hint: to use in all of your new repositories, which will suppress this warning,
  231. hint: call:
  232. hint:
  233. hint: git config --global init.defaultBranch <name>
  234. hint:
  235. hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
  236. hint: 'development'. The just-created branch can be renamed via this command:
  237. hint:
  238. hint: git branch -m <name>
  239. hint:
  240. hint: Disable this message with "git config set advice.defaultBranchName false"
  241. Initialized empty Git repository in /__w/ermite/ermite/.git/
  242. [command]/usr/sbin/git remote add origin http://ermite:7341/bnema/ermite
  243. Disabling automatic garbage collection
  244. [command]/usr/sbin/git config --local gc.auto 0
  245. Setting up auth
  246. Removing SSH command configuration
  247. [command]/usr/sbin/git config --local --name-only --get-regexp core\.sshCommand
  248. [command]/usr/sbin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :"
  249. Removing HTTP extra header
  250. [command]/usr/sbin/git config --local --name-only --get-regexp http\.http\:\/\/ermite\:7341\/\.extraheader
  251. [command]/usr/sbin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.http\:\/\/ermite\:7341\/\.extraheader' && git config --local --unset-all 'http.http://ermite:7341/.extraheader' || :"
  252. Removing includeIf entries pointing to credentials config files
  253. [command]/usr/sbin/git config --local --name-only --get-regexp ^includeIf\.gitdir:
  254. [command]/usr/sbin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url
  255. [command]/usr/sbin/git config --file /__w/_temp/git-credentials-12a31e66-b742-4d37-b5fa-168d1827e1a3.config http.http://ermite:7341/.extraheader AUTHORIZATION: basic ***
  256. [command]/usr/sbin/git config --local includeIf.gitdir:/__w/ermite/ermite/.git.path /__w/_temp/git-credentials-12a31e66-b742-4d37-b5fa-168d1827e1a3.config
  257. [command]/usr/sbin/git config --local includeIf.gitdir:/__w/ermite/ermite/.git/worktrees/*.path /__w/_temp/git-credentials-12a31e66-b742-4d37-b5fa-168d1827e1a3.config
  258. [command]/usr/sbin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-12a31e66-b742-4d37-b5fa-168d1827e1a3.config
  259. [command]/usr/sbin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-12a31e66-b742-4d37-b5fa-168d1827e1a3.config
  260. Fetching the repository
  261. [command]/usr/sbin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --depth=1 origin +453499267f41ae8b3e4bd97a7445ec1c9de27425:refs/remotes/origin/main
  262. From http://ermite:7341/bnema/ermite
  263. * [new ref] 453499267f41ae8b3e4bd97a7445ec1c9de27425 -> origin/main
  264. [command]/usr/sbin/git branch --list --remote origin/main
  265. origin/main
  266. [command]/usr/sbin/git rev-parse refs/remotes/origin/main
  267. 453499267f41ae8b3e4bd97a7445ec1c9de27425
  268. Determining the checkout info
  269. [command]/usr/sbin/git sparse-checkout disable
  270. [command]/usr/sbin/git config --local --unset-all extensions.worktreeConfig
  271. Checking out the ref
  272. [command]/usr/sbin/git checkout --progress --force -B main refs/remotes/origin/main
  273. Switched to a new branch 'main'
  274. branch 'main' set up to track 'origin/main'.
  275. [command]/usr/sbin/git log -1 --format=%H
  276. 453499267f41ae8b3e4bd97a7445ec1c9de27425
  277. Run git config --global --add safe.directory "$GITHUB_WORKSPACE"
  278. <U+001B>[36;1mgit config --global --add safe.directory "$GITHUB_WORKSPACE"<U+001B>[0m
  279. shell: sh -e {0}
  280. env:
  281. GOWORK: off
  282. Run actions/setup-go@v5
  283. with:
  284. go-version-file: go.mod
  285. cache: true
  286. check-latest: false
  287. env:
  288. GOWORK: off
  289. ##[command]/usr/bin/docker exec 1b888c945181acda79e38ae57f1848d56176f1bc3ea6b799c5e09dc73722b1ce sh -c "cat /etc/*release | grep ^ID"
  290. Setup go version spec 1.27.1
  291. Attempting to download 1.27.1...
  292. (node:340) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
  293. (Use `node --trace-deprecation ...` to show where the warning was created)
  294. matching 1.27.1...
  295. Acquiring 1.27.1 from https://github.com/actions/go-versions/releases/download/1.27.1-33583469715/go-1.27.1-linux-x64.tar.gz
  296. Extracting Go...
  297. [command]/usr/sbin/tar xz --warning=no-unknown-keyword --overwrite -C /__w/_temp/6130c450-7d0a-437e-95a5-7cb4f7b9042a -f /__w/_temp/b0c085cd-7195-4168-802a-038b1dabb82d
  298. Successfully extracted go to /__w/_temp/6130c450-7d0a-437e-95a5-7cb4f7b9042a
  299. Adding to the cache ...
  300. Successfully cached go to /__t/go/1.27.1/x64
  301. Added go to the path
  302. Successfully set up Go version 1.27.1
  303. [command]/__t/go/1.27.1/x64/bin/go env GOMODCACHE
  304. [command]/__t/go/1.27.1/x64/bin/go env GOCACHE
  305. /github/home/go/pkg/mod
  306. /github/home/.cache/go-build
  307. Cache Size: ~654 MB (685568766 B)
  308. [command]/usr/sbin/tar -xf /__w/_temp/1c950ca9-2fdf-4c44-8793-9b2f9642aa26/cache.tzst -P -C /__w/ermite/ermite --use-compress-program unzstd
  309. Cache restored successfully
  310. Cache restored from key: setup-go-Linux-x64-undefined-go-1.27.1-dcdc8e7faa10edda11b015ed33e82b95f80ca31b35aabdb55b2bc12ddb2a3368
  311. go version go1.27.1 linux/amd64
  312. go env
  313. AR='ar'
  314. CC='gcc'
  315. CGO_CFLAGS='-O2 -g'
  316. CGO_CPPFLAGS=''
  317. CGO_CXXFLAGS='-O2 -g'
  318. CGO_ENABLED='1'
  319. CGO_FFLAGS='-O2 -g'
  320. CGO_LDFLAGS='-O2 -g'
  321. CXX='g++'
  322. GCCGO='gccgo'
  323. GO111MODULE=''
  324. GOAMD64='v1'
  325. GOARCH='amd64'
  326. GOAUTH='netrc'
  327. GOBIN='/github/home/go/bin'
  328. GOCACHE='/github/home/.cache/go-build'
  329. GOCACHEPROG=''
  330. GODEBUG=''
  331. GOENV='/github/home/.config/go/env'
  332. GOEXE=''
  333. GOEXPERIMENT=''
  334. GOFIPS140='off'
  335. GOFLAGS=''
  336. GOGCCFLAGS='-fPIC -m64 -pthread -Wl,--no-gc-sections -fmessage-length=0 -ffile-prefix-map=/tmp/go-build4084226160=/tmp/go-build -gno-record-gcc-switches'
  337. GOHOSTARCH='amd64'
  338. GOHOSTOS='linux'
  339. GOINSECURE=''
  340. GOMOD='/__w/ermite/ermite/go.mod'
  341. GOMODCACHE='/github/home/go/pkg/mod'
  342. GONOPROXY=''
  343. GONOSUMDB=''
  344. GOOS='linux'
  345. GOPACKAGESDRIVER=''
  346. GOPATH='/github/home/go'
  347. GOPRIVATE=''
  348. GOPROXY='https://proxy.golang.org,direct'
  349. GOROOT='/__t/go/1.27.1/x64'
  350. GOSUMDB='sum.golang.org'
  351. GOTELEMETRY='local'
  352. GOTELEMETRYDIR='/github/home/.config/go/telemetry'
  353. GOTMPDIR=''
  354. GOTOOLCHAIN='auto'
  355. GOTOOLDIR='/__t/go/1.27.1/x64/pkg/tool/linux_amd64'
  356. GOVCS=''
  357. GOVERSION='go1.27.1'
  358. GOWORK='off'
  359. PKG_CONFIG='pkg-config'
  360. Run git --version
  361. <U+001B>[36;1mgit --version<U+001B>[0m
  362. <U+001B>[36;1mv=$(git --version | sed -E 's/^git version ([0-9]+)\.([0-9]+).*/\1 \2/')<U+001B>[0m
  363. <U+001B>[36;1mset -- $v<U+001B>[0m
  364. <U+001B>[36;1mif [ "$1" -lt 2 ] || { [ "$1" -eq 2 ] && [ "$2" -lt 45 ]; }; then<U+001B>[0m
  365. <U+001B>[36;1m echo "git 2.45 or newer is required" >&2<U+001B>[0m
  366. <U+001B>[36;1m exit 1<U+001B>[0m
  367. <U+001B>[36;1mfi<U+001B>[0m
  368. shell: sh -e {0}
  369. env:
  370. GOWORK: off
  371. git version 2.56.0
  372. Run go mod tidy
  373. <U+001B>[36;1mgo mod tidy<U+001B>[0m
  374. <U+001B>[36;1mgit diff --exit-code -- go.mod go.sum<U+001B>[0m
  375. shell: sh -e {0}
  376. env:
  377. GOWORK: off
  378. Run scripts/templ-drift.sh
  379. <U+001B>[36;1mscripts/templ-drift.sh<U+001B>[0m
  380. shell: sh -e {0}
  381. env:
  382. GOWORK: off
  383. (✓) Post-generation event received, processing... [ updates=0 needsRestart=true needsBrowserReload=true ]
  384. (✓) Complete [ updates=0 duration=208.212375ms ]
  385. Run go vet ./...
  386. <U+001B>[36;1mgo vet ./...<U+001B>[0m
  387. shell: sh -e {0}
  388. env:
  389. GOWORK: off
  390. Run go test -race $(go list ./... | grep -vx 'bnema.dev/ermite/internal/app')
  391. <U+001B>[36;1mgo test -race $(go list ./... | grep -vx 'bnema.dev/ermite/internal/app')<U+001B>[0m
  392. shell: sh -e {0}
  393. env:
  394. GOWORK: off
  395. ? bnema.dev/ermite/cmd/ermite [no test files]
  396. ? bnema.dev/ermite/gen/ermite/storage [no test files]
  397. ok bnema.dev/ermite/internal/adapters/ciartifacts (cached)
  398. ok bnema.dev/ermite/internal/adapters/cilogs (cached)
  399. ok bnema.dev/ermite/internal/adapters/cisummaries (cached)
  400. ok bnema.dev/ermite/internal/adapters/client (cached)
  401. ok bnema.dev/ermite/internal/adapters/ermitegit (cached)
  402. ok bnema.dev/ermite/internal/adapters/eventbus (cached)
  403. ok bnema.dev/ermite/internal/adapters/gitcli (cached)
  404. ok bnema.dev/ermite/internal/adapters/githttp (cached)
  405. ok bnema.dev/ermite/internal/adapters/githubapi (cached)
  406. ok bnema.dev/ermite/internal/adapters/githubraw (cached)
  407. ok bnema.dev/ermite/internal/adapters/gitremote (cached)
  408. ok bnema.dev/ermite/internal/adapters/httpserver (cached)
  409. ok bnema.dev/ermite/internal/adapters/kvstore (cached)
  410. ? bnema.dev/ermite/internal/adapters/oidchttp [no test files]
  411. ok bnema.dev/ermite/internal/adapters/rpc 1.095s
  412. ok bnema.dev/ermite/internal/adapters/secretbox (cached)
  413. ok bnema.dev/ermite/internal/adapters/sigverify (cached)
  414. ok bnema.dev/ermite/internal/adapters/sshsig (cached)
  415. ok bnema.dev/ermite/internal/adapters/web 37.398s
  416. ok bnema.dev/ermite/internal/adapters/webauthn (cached)
  417. ok bnema.dev/ermite/internal/boundary 1.120s
  418. ok bnema.dev/ermite/internal/clientlimit (cached)
  419. ok bnema.dev/ermite/internal/config (cached)
  420. ok bnema.dev/ermite/internal/domain (cached)
  421. ? bnema.dev/ermite/internal/ports [no test files]
  422. ? bnema.dev/ermite/internal/ports/mocks [no test files]
  423. ? bnema.dev/ermite/internal/readertest [no test files]
  424. ok bnema.dev/ermite/internal/usecase 19.950s
  425. ? bnema.dev/ermite/scripts/loadtest [no test files]
  426. Run go test -race ./internal/app/
  427. <U+001B>[36;1mgo test -race ./internal/app/<U+001B>[0m
  428. shell: sh -e {0}
  429. env:
  430. GOWORK: off
  431. --- FAIL: TestWebMergeRequestSinceAfterForcePush (0.57s)
  432. web_mr_test.go:661:
  433. Error Trace: /__w/ermite/ermite/internal/app/web_mr_test.go:661
  434. Error: "<!doctype html><html lang=\"en\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><meta name=\"color-scheme\" content=\"light dark\"><title>#1 t · proj · example.test</title><meta name=\"theme-color\" media=\"(prefers-color-scheme: light)\" content=\"#ffffff\"><meta name=\"theme-color\" media=\"(prefers-color-scheme: dark)\" content=\"#0c0c0c\"><meta name=\"apple-mobile-web-app-title\" content=\"ermite\"><link rel=\"icon\" type=\"image/svg+xml\" href=\"/-/static/img/icon.afac4ac794c3.svg\"><link rel=\"apple-touch-icon\" href=\"/-/static/app/apple-touch-icon.dddb06b362c9.png\"><link rel=\"manifest\" href=\"/-/static/app/manifest.e216ef5fd926.webmanifest\"><link rel=\"preload\" href=\"/-/static/fonts/atkinson-next.18b2a1a39a2f.woff2\" as=\"font\" type=\"font/woff2\" crossorigin><link rel=\"stylesheet\" href=\"/-/static/css/ermite.f0c242b2c37a.css\"><meta name=\"htmx-config\" content='{\"history\":false,\"includeIndicatorCSS\":false,\"extensions\":\"sse, hx-live\"}'><script src=\"/-/static/js/htmx.min.e484d9171a9d.js\" defer></script><script src=\"/-/static/js/hx-live.min.adf9b90949d5.js\" defer></script><script src=\"/-/static/js/hx-sse.min.8a834680c400.js\" defer></script><script src=\"/-/static/js/store.0dc4cd15b66d.js\"></script><script src=\"/-/static/js/ermite.b1d919d5d11c.js\" defer></script><script src=\"/-/static/js/files.c19197868b87.js\" defer></script><script src=\"/-/static/js/passkey.6f3063d3e7b6.js\" defer></script><script src=\"/-/static/js/log.b8fcef6f19b7.js\" defer></script><script src=\"/-/static/js/mr.29bf51c673fd.js\" defer></script></head><body data-ref=\"feat/search\" data-sha=\"6186a66276260c5edbdfb563c9aafd71415fe173\" data-sel=\"\" data-nav=\"\" data-paths=\"/proj/paths/6186a66276260c5edbdfb563c9aafd71415fe173\" data-blob=\"/proj/blob/feat/search\"><a class=\"skip\" href=\"#main\">skip to content</a><header class=\"hdr\"><div class=\"hdr-top\"><a class=\"brand\" href=\"/\" data-g=\"h\" aria-label=\"home\" title=\"home (g h)\"><span class=\"brand-mark\" aria-hidden=\"true\"></span></a> <nav class=\"crumbs\" aria-label=\"Path\"><ol><li><a href=\"/proj\">proj</a></li><li><a href=\"/proj/merge-requests\">merge requests</a></li><li><a href=\"/proj/merge-requests/1\">#1</a></li><li><span aria-current=\"page\">since</span></li></ol></nav><div class=\"hdr-acts\"><a class=\"btn ref\" href=\"/proj/refs\" data-fire=\"refs\" aria-keyshortcuts=\"b\" title=\"switch branch or tag (b)\"><span class=\"ico i-branch\" aria-hidden=\"true\"></span> <span class=\"ref-name\">feat/search</span> <span class=\"sha\">6186a66</span></a> <button type=\"button\" class=\"btn search\" data-js aria-haspopup=\"dialog\" aria-controls=\"panel-cmd\" aria-keyshortcuts=\"Control+K :\" title=\"go to a section, ref, file or repo (ctrl k or :)\" data-fire=\"cmd\"><span class=\"ico i-search\" aria-hidden=\"true\"></span> <span class=\"search-label\">Go to…</span> <kbd aria-hidden=\"true\">ctrl k</kbd></button> <form class=\"owner\" method=\"post\" action=\"/-/logout\"><span class=\"owner-badge\" title=\"signed in as the owner\"><span class=\"ico i-user\" aria-hidden=\"true\"></span>owner</span> <button type=\"submit\" class=\"btn icon\" aria-label=\"Sign out\" title=\"sign out of this browser\"><span class=\"ico i-log-out\" aria-hidden=\"true\"></span></button></form></div></div><nav class=\"tabs\" aria-label=\"Sections\"><ul><li><a href=\"/proj\" data-key=\"s\" aria-keyshortcuts=\"s\">Summary <kbd aria-hidden=\"true\">s</kbd></a></li><li><a href=\"/proj/tree/main\" data-key=\"t\" aria-keyshortcuts=\"t\">Files <kbd aria-hidden=\"true\">t</kbd></a></li><li><a href=\"/proj/commits/main\" data-key=\"c\" aria-keyshortcuts=\"c\">Commits <kbd aria-hidden=\"true\">c</kbd></a></li><li><a href=\"/proj/refs\" data-key=\"r\" aria-keyshortcuts=\"r\">Branches &amp; tags <kbd aria-hidden=\"true\">r</kbd></a></li><li><a href=\"/proj/merge-requests\" data-key=\"m\" aria-keyshortcuts=\"m\" aria-current=\"page\">Merge requests <span class=\"count\">1<span class=\"sr\"> open</span></span> <kbd aria-hidden=\"true\">m</kbd></a></li><li><a href=\"/proj/actions\" data-key=\"a\" aria-keyshortcuts=\"a\">Actions <kbd aria-hidden=\"true\">a</kbd></a></li></ul></nav></header><div class=\"work has-rail\"><main id=\"main\" tabindex=\"-1\"><section class=\"mr-card\"><header class=\"show mr-h\"><h1><span class=\"mute\">#1</span> t</h1><dl class=\"kv show-kv\"><dt>state</dt><dd class=\"mr-state\" data-state=\"open\">open </dd><dt>branch</dt><dd><a href=\"/proj/tree/feat/search\">feat/search</a> → <a href=\"/proj/tree/main\">main</a></dd><dt>opened</dt><dd>owner · <time datetime=\"2026-10-19T19:47:09Z\" title=\"2026-10-19 19:47 UTC\">now</time></dd><dt>updated</dt><dd><time datetime=\"2026-10-19T19:47:09Z\">now</time></dd></dl></header></section> <div id=\"mr-notice\" class=\"live-slot\" role=\"status\" data-slot></div> <nav class=\"since\" aria-label=\"Diff range\"><a href=\"/proj/merge-requests/1\">all changes <span class=\"mute\">vs main</span></a> <a href=\"/proj/merge-requests/1/since\" aria-current=\"page\">since your last read <span class=\"mute\">2e5eae3 → 6186a66</span></a></nav> <p class=\"notice\">changes since 2e5eae3, the head you last read.</p> <div class=\"diff-tools mr-bar\" role=\"group\" aria-label=\"Diff view and merge\"><span class=\"dim\">2 files · <span class=\"plus\">+1</span> <span class=\"minus\">-3</span></span><details class=\"menu vmenu\"><summary class=\"btn\" aria-label=\"Diff view\"><span hx-live=\"this.textContent = q('#diffs').attr['data-diff'] === 'split' ? 'Split' : 'Unified'\">Unified</span></summary><div class=\"menu-pop\" role=\"group\" aria-label=\"Diff view\"><a href=\"/proj/merge-requests/1/since?view=unified\" class=\"btn vbtn\" data-view=\"unified\" aria-keyshortcuts=\"u\" aria-current=\"true\" data-fire=\"unified\" :aria-current=\"q('#diffs').attr['data-diff'] === this.dataset.view ? 'true' : false\">Unified<kbd aria-hidden=\"true\">u</kbd></a><a href=\"/proj/merge-requests/1/since?view=split\" class=\"btn vbtn\" data-view=\"split\" aria-keyshortcuts=\"d\" data-fire=\"split\" :aria-current=\"q('#diffs').attr['data-diff'] === this.dataset.view ? 'true' : false\">Split<kbd aria-hidden=\"true\">d</kbd></a><button type=\"button\" aria-keyshortcuts=\"x\" data-js data-fire=\"collapse\" class=\"btn\"><span hx-live=\"this.textContent = q('[data-file][open]').count || !q('[data-file]').count ? 'Collapse all' : 'Expand all'\">Collapse all</span><kbd aria-hidden=\"true\">x</kbd></button></div></details><span class=\"grow\"></span><a class=\"ck-sum mr-ck\" id=\"mr-ck\" href=\"#mr-checks\" title=\"\"><span class=\"mute\">no checks</span></a><details class=\"menu mmenu\" id=\"merge-menu\" data-state=\"open\"><summary class=\"btn primary\" aria-keyshortcuts=\"Shift+M\">Merge <kbd aria-hidden=\"true\">M</kbd></summary><div class=\"menu-pop\" role=\"group\" aria-label=\"Merge\"><dl class=\"kv\"><dt>head</dt><dd>6186a66</dd><dt>into</dt><dd>main</dd></dl><div id=\"mr-mergeability\" class=\"live-slot\" role=\"status\" data-slot><span data-mergeability data-state=\"up_to_date\" data-ff-ok=\"true\" data-merge-ok=\"true\" data-ff-reason=\"\" data-merge-reason=\"\"><span class=\"badge\" data-state=\"up_to_date\">Ready to merge</span> </span> </div> <form class=\"d-acts\" method=\"post\" action=\"/proj/merge-requests/1/merge\"><input type=\"hidden\" name=\"head_id\" value=\"6186a66276260c5edbdfb563c9aafd71415fe173\"><fieldset class=\"d-modes\"><legend class=\"sr\">merge mode</legend> <label><input type=\"radio\" name=\"mode\" value=\"fast-forward\" checked title=\"\" :disabled=\"this.value === 'fast-forward' ? q('[data-mergeability]').data.ffOk !== true : q('[data-mergeability]').data.mergeOk !== true\" :title=\"this.value === 'fast-forward' ? q('[data-mergeability]').data.ffReason : q('[data-mergeability]').data.mergeReason\"> fast-forward <kbd aria-hidden=\"true\">1</kbd></label><label><input type=\"radio\" name=\"mode\" value=\"squash\" title=\"\" :disabled=\"this.value === 'fast-forward' ? q('[data-mergeability]').data.ffOk !== true : q('[data-mergeability]').data.mergeOk !== true\" :title=\"this.value === 'fast-forward' ? q('[data-mergeability]').data.ffReason : q('[data-mergeability]').data.mergeReason\"> squash (one signed commit) <kbd aria-hidden=\"true\">2</kbd></label><label><input type=\"radio\" name=\"mode\" value=\"merge\" title=\"\" :disabled=\"this.value === 'fast-forward' ? q('[data-mergeability]').data.ffOk !== true : q('[data-mergeability]').data.mergeOk !== true\" :title=\"this.value === 'fast-forward' ? q('[data-mergeability]').data.ffReason : q('[data-mergeability]').data.mergeReason\"> merge commit (signed) <kbd aria-hidden=\"true\">3</kbd></label></fieldset><p class=\"d-note\" id=\"mr-signing\">squash and merge commits are signed with ermite's own key (generated on first start). fingerprint <code>SHA256:oHOl6Rp7DDKu3RTcoHhtXF+TrsG0KhJWRePxi0x+0SI</code> <code>ermite signing-key show</code> prints it.</p><label class=\"d-check\"><input type=\"checkbox\" name=\"delete_branch\" value=\"1\"> delete feat/search after the merge <kbd aria-hidden=\"true\">D</kbd></label><div class=\"d-btns\"><button type=\"submit\" class=\"btn primary\" data-default title=\"\" :disabled=\"!this.form.querySelector('input[name=mode]:checked:not(:disabled)')\" :title=\"(this.form.querySelector('input[name=mode]:checked') || {}).title || ''\">Merge into main</button></div></form></div></details> <details class=\"menu omenu\"><summary class=\"btn icon\" aria-label=\"More actions\" title=\"more actions\">⋯</summary><div class=\"menu-pop\" role=\"group\" aria-label=\"More actions\"><form method=\"post\" action=\"/proj/merge-requests/1/read\"><input type=\"hidden\" name=\"head_id\" value=\"6186a66276260c5edbdfb563c9aafd71415fe173\"> <button type=\"submit\" title=\"the next visit can show only what changed after this head\" class=\"btn\" aria-keyshortcuts=\"Shift+R\" data-read>Mark read <kbd aria-hidden=\"true\">R</kbd></button></form><form method=\"post\" action=\"/proj/merge-requests/1/close\"><button type=\"submit\" title=\"close without merging; the branch is kept\" class=\"btn danger\">Close</button></form><details class=\"d-or\"><summary class=\"mute\">or from a terminal</summary><div class=\"clone\" id=\"cli-merge\"><div class=\"clone-line\"><span class=\"mute\" aria-hidden=\"true\">$ </span><code>ermite mr merge proj 1 --head 6186a66276260c5edbdfb563c9aafd71415fe173</code> <button type=\"button\" class=\"btn copy\" data-js data-label=\"Copy\" aria-label=\"copy: ermite mr merge proj 1 --head 6186a66276260c5edbdfb563c9aafd71415fe173\" hx-on:click=\"ermite.copy(this)\">Copy</button></div><div class=\"clone-line\"><span class=\"mute\" aria-hidden=\"true\">$ </span><code>ermite mr merge proj 1 --head 6186a66276260c5edbdfb563c9aafd71415fe173 --mode squash</code> <button type=\"button\" class=\"btn copy\" data-js data-label=\"Copy\" aria-label=\"copy: ermite mr merge proj 1 --head 6186a66276260c5edbdfb563c9aafd71415fe173 --mode squash\" hx-on:click=\"ermite.copy(this)\">Copy</button></div><div class=\"clone-line\"><span class=\"mute\" aria-hidden=\"true\">$ </span><code>ermite mr merge proj 1 --head 6186a66276260c5edbdfb563c9aafd71415fe173 --mode merge</code> <button type=\"button\" class=\"btn copy\" data-js data-label=\"Copy\" aria-label=\"copy: ermite mr merge proj 1 --head 6186a66276260c5edbdfb563c9aafd71415fe173 --mode merge\" hx-on:click=\"ermite.copy(this)\">Copy</button></div></div></details></div></details></div> <div id=\"diffs\" data-mr data-diff=\"unified\" hx-live=\"this.dataset.diff = sessionStorage.getItem('diff') || this.dataset.diff\"><details class=\"dfile lnw-2\" id=\"f1\" data-file=\"other.txt\" open><summary><span class=\"st\">A</span> <span class=\"p\">other.txt</span> <span class=\"plus\">+1</span> <span class=\"minus\">-0</span> </summary> <div class=\"dscroll\"><table class=\"dt uni\" aria-label=\"other.txt, unified\"><tbody><tr class=\"hunk\"><td colspan=\"4\">@@ -0,0 +1,1 @@</td></tr><tr class=\"add\"><td class=\"ln\"></td><td class=\"ln\">1</td><td class=\"m\">+</td><td class=\"tx chroma\">o</td></tr></tbody> </table><table class=\"dt spl\" aria-label=\"other.txt, split\"><colgroup><col class=\"c-ln\"><col class=\"c-m\"><col><col class=\"c-ln\"><col class=\"c-m\"><col></colgroup> <tbody><tr class=\"hunk\"><td colspan=\"6\">@@ -0,0 +1,1 @@</td></tr><tr><td class=\"ln none\"></td><td class=\"m none\"></td><td class=\"tx none\"></td><td class=\"ln add\">1</td><td class=\"m add\">+</td><td class=\"tx chroma add\">o</td></tr></tbody> </table></div></details><details class=\"dfile lnw-2\" id=\"f2\" data-file=\"search.go\" open><summary><span class=\"st\">D</span> <span class=\"p\">search.go</span> <span class=\"plus\">+0</span> <span class=\"minus\">-3</span> </summary> <div class=\"dscroll\"><table class=\"dt uni\" aria-label=\"search.go, unified\"><tbody><tr class=\"hunk\"><td colspan=\"4\">@@ -1,3 +0,0 @@</td></tr><tr class=\"del\"><td class=\"ln\">1</td><td class=\"ln\"></td><td class=\"m\">-</td><td class=\"tx chroma\"><span class=\"kn\">package</span> search</td></tr><tr class=\"del\"><td class=\"ln\">2</td><td class=\"ln\"></td><td class=\"m\">-</td><td class=\"tx chroma\"></td></tr><tr class=\"del\"><td class=\"ln\">3</td><td class=\"ln\"></td><td class=\"m\">-</td><td class=\"tx chroma\"><span class=\"kd\">func</span> Find() {}</td></tr></tbody> </table><table class=\"dt spl\" aria-label=\"search.go, split\"><colgroup><col class=\"c-ln\"><col class=\"c-m\"><col><col class=\"c-ln\"><col class=\"c-m\"><col></colgroup> <tbody><tr class=\"hunk\"><td colspan=\"6\">@@ -1,3 +0,0 @@</td></tr><tr><td class=\"ln del\">1</td><td class=\"m del\">-</td><td class=\"tx chroma del\"><span class=\"kn\">package</span> search</td><td class=\"ln none\"></td><td class=\"m none\"></td><td class=\"tx none\"></td></tr><tr><td class=\"ln del\">2</td><td class=\"m del\">-</td><td class=\"tx chroma del\"></td><td class=\"ln none\"></td><td class=\"m none\"></td><td class=\"tx none\"></td></tr><tr><td class=\"ln del\">3</td><td class=\"m del\">-</td><td class=\"tx chroma del\"><span class=\"kd\">func</span> Find() {}</td><td class=\"ln none\"></td><td class=\"m none\"></td><td class=\"tx none\"></td></tr></tbody> </table></div></details></div><h2 class=\"rule-h\" id=\"comments\"><span>Comments</span><span class=\"count\">0 open / 0</span></h2> <p class=\"dim\">no comments yet.</p> </main><aside class=\"rail\" aria-label=\"Context\"><section aria-labelledby=\"r-files\" class=\"r-files\"><h2 id=\"r-files\">Files <span class=\"count\">2</span><kbd aria-hidden=\"true\">g f</kbd> <button type=\"button\" class=\"btn icon fold\" data-js aria-expanded=\"true\" title=\"fold the list of files\" hx-on:click=\"ermiteMR.foldFiles()\"><span class=\"ico i-chevron\" aria-hidden=\"true\"></span><span class=\"sr\">fold the list of files</span></button></h2><ol class=\"files\" aria-label=\"Changed files\"><li><a href=\"#f1\" title=\"other.txt\" hx-on:click=\"(window.ermiteMR?.openFile || ermite.openFile)(this.hash.slice(1))\"><span class=\"st\" data-st=\"A\" title=\"added\">A</span> <span class=\"nm\"><span class=\"p\">other.txt</span> <span class=\"d\"><bdi></bdi></span></span> <span class=\"n\"><span class=\"plus\">+1</span> <span class=\"minus\">-0</span></span></a></li><li><a href=\"#f2\" title=\"search.go\" hx-on:click=\"(window.ermiteMR?.openFile || ermite.openFile)(this.hash.slice(1))\"><span class=\"st\" data-st=\"D\" title=\"deleted\">D</span> <span class=\"nm\"><span class=\"p\">search.go</span> <span class=\"d\"><bdi></bdi></span></span> <span class=\"n\"><span class=\"plus\">+0</span> <span class=\"minus\">-3</span></span></a></li></ol></section><section aria-labelledby=\"r-checks\" id=\"mr-checks\"><h2 id=\"r-checks\">Checks <span class=\"count\">0</span></h2><p class=\"dim\">no checks</p><p class=\"rule-note\"><span class=\"sr\">note: </span>no check on this commit: nothing blocks the merge.</p></section><section aria-labelledby=\"r-commits\"><h2 id=\"r-commits\">Commits <span class=\"count\">1</span></h2><ul class=\"pcommits\"><li><a href=\"/proj/commit/6186a66276260c5edbdfb563c9aafd71415fe173\">6186a66</a> <span class=\"s\">add other.txt</span> <span class=\"mute\">T · <time datetime=\"2026-10-19T19:47:09Z\">now</time> </span></li></ul></section><section aria-labelledby=\"r-settings\"><h2 id=\"r-settings\">Settings</h2><dl class=\"kv\"><dt>modes</dt><dd>fast-forward, squash, merge commit</dd><dt>checks</dt><dd>failing ones block the merge</dd></dl></section></aside></div><footer class=\"foot\"><span>ermite devel</span> <a href=\"http://example.test/ermite\" rel=\"noopener\" title=\"source of this version (AGPL-3.0-or-later)\">source</a> <button type=\"button\" class=\"foot-keys\" data-js data-fire=\"help\" aria-haspopup=\"dialog\" aria-controls=\"panel-help\" aria-keyshortcuts=\"?\"><kbd aria-hidden=\"true\">?</kbd> keyboard shortcuts</button></footer><div class=\"hint\" role=\"status\" aria-live=\"polite\"><span class=\"hint-nav\" :text=\"document.body.dataset.nav || ''\"></span> <span class=\"hint-sel\" :text=\"document.body.dataset.sel ? document.body.dataset.sel + ' · y permalink' : ''\"></span> <span class=\"hint-flash\" :text=\"document.body.dataset.flash || ''\"></span><span class=\"hint-live\" data-state=\"connecting\" hx-sse:connect=\"/-/events?topic=repo%3Aproj&amp;view=mr&amp;n=1&amp;ref=feat%2Fsearch&amp;head=6186a66276260c5edbdfb563c9aafd71415fe173&amp;target=main\" hx-swap=\"none\" :text=\"data.state === 'offline' ? 'live updates paused' : ''\" hx-on=\"htmx:sse:after:connection -> ermiteLive.back();\n htmx:sse:close, htmx:sse:error -> ermiteLive.lost();\n htmx:sse:error -> ermiteLive.error(event.detail.status);\n htmx:sse:before:connection -> ermiteLive.gate(event);\n home-list, repo-last-push, refs-list, commits-head, mr-notice, mr-mergeability, ci-run, ci-job, inbox -> ermiteLive.swap(event.detail.data);\n gap -> ermiteLive.reload()\"></span></div><dialog id=\"panel-help\" class=\"panel modal\" aria-label=\"Keyboard shortcuts\" hx-on:keydown=\"event.key === 'Escape' && (event.preventDefault(), this.close())\" hx-on:click=\"event.target === this && this.close()\"><div class=\"panel-head\"><h2>Keyboard shortcuts</h2><button type=\"button\" class=\"panel-x\" aria-label=\"Close\" hx-on:click=\"closest('dialog').close()\"><kbd>esc</kbd> close</button></div><div class=\"keys-pref\"><label><input type=\"checkbox\" id=\"keys-off\" aria-describedby=\"keys-note\" hx-on:change=\"ermite.setKeysOff(this.checked)\"> Turn off single-key shortcuts</label><p id=\"keys-note\" class=\"dim\">Single-key shortcuts are on. ctrl k and esc work whatever this says.</p></div><dl class=\"keys\"><div><dt><kbd>ctrl k</kbd> <kbd>:</kbd></dt><dd>go to a section, branch, tag, file or repository</dd></div><div><dt><kbd>?</kbd></dt><dd>this list</dd></div><div><dt><kbd>j</kbd> <kbd>k</kbd></dt><dd>move the row cursor down / up</dd></div><div><dt><kbd>enter</kbd></dt><dd>open the row under the cursor; on Files, a directory opens or closes in place</dd></div><div><dt><kbd>↑</kbd> <kbd>↓</kbd> <kbd>←</kbd> <kbd>→</kbd> <kbd>home</kbd> <kbd>end</kbd></dt><dd>in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file</dd></div><div><dt><kbd>l</kbd> <kbd>h</kbd></dt><dd>on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls</dd></div><div><dt><kbd>g g</kbd> <kbd>G</kbd></dt><dd>first / last row</dd></div><div><dt><kbd>/</kbd></dt><dd>filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)</dd></div><div><dt><kbd>b</kbd></dt><dd>switch branch or tag</dd></div><div><dt><kbd>s</kbd> <kbd>t</kbd> <kbd>c</kbd> <kbd>r</kbd> <kbd>m</kbd> <kbd>i</kbd></dt><dd>tabs: summary, files, commits, branches &amp; tags, merge requests, issues</dd></div><div><dt><kbd>g h</kbd></dt><dd>home</dd></div><div><dt><kbd>w</kbd></dt><dd>wide mode: use the whole width of the screen, or not (remembered)</dd></div><div><dt><kbd>y</kbd></dt><dd>copy a permalink pinned to the commit</dd></div><div><dt><kbd>d</kbd> <kbd>u</kbd> <kbd>x</kbd></dt><dd>diff: split / unified / collapse or expand all</dd></div><div><dt><kbd>e</kbd> <kbd>E</kbd></dt><dd>diff: the whole file in view / every file, with the lines the hunks hide</dd></div><div><dt><kbd>n</kbd></dt><dd>merge request: next note in the diff</dd></div><div><dt><kbd>g f</kbd></dt><dd>merge request: the list of files (j k move, enter opens, esc back)</dd></div><div><dt><kbd>M</kbd></dt><dd>merge request: the merge menu; there 1–3 pick the mode, D deletes the branch, enter merges</dd></div><div><dt><kbd>R</kbd></dt><dd>merge request: mark the head read</dd></div><div><dt><kbd>esc</kbd></dt><dd>close a dialog, leave a field</dd></div></dl></dialog><dialog id=\"panel-refs\" class=\"panel modal\" aria-label=\"Switch ref\" hx-on:keydown=\"event.key === 'Escape' && (event.preventDefault(), this.close())\" hx-on:click=\"event.target === this && this.close()\"><div class=\"panel-head\"><label for=\"refs-filter\" class=\"sr\">filter branches and tags</label> <input id=\"refs-filter\" type=\"search\" placeholder=\"Switch branch or tag…\" autocomplete=\"off\" data-pick=\"#panel-refs li\" hx-on:input=\"ermite.filter(this)\"> <button type=\"button\" class=\"panel-x\" aria-label=\"Close\" hx-on:click=\"closest('dialog').close()\"><kbd>esc</kbd></button></div><div class=\"panel-cols\" data-picklist><section aria-label=\"Branches\"><h2>Branches <span class=\"count\">2</span></h2><ul><li><a href=\"/proj/tree/feat/search\" aria-current=\"true\"><span class=\"mark\" aria-hidden=\"true\">●</span>feat/search</a></li><li><a href=\"/proj/tree/main\"><span class=\"mark\" aria-hidden=\"true\">&nbsp;</span>main</a></li></ul></section><section aria-label=\"Tags\"><h2>Tags <span class=\"count\">0</span></h2><ul></ul></section></div></dialog><dialog id=\"panel-cmd\" class=\"panel modal\" aria-label=\"Go to\" hx-on:close=\"ermiteFinder.paletteClose()\" hx-on:keydown=\"event.key === 'Escape' && (event.preventDefault(), this.close())\" hx-on:click=\"event.target === this && this.close()\"><div class=\"panel-head\"><label for=\"cmd-q\" class=\"sr\">go to</label> <input id=\"cmd-q\" type=\"search\" placeholder=\"Go to a section, branch, tag, file or repository…\" autocomplete=\"off\" spellcheck=\"false\" role=\"combobox\" aria-autocomplete=\"list\" aria-expanded=\"true\" aria-controls=\"cmd-list\" aria-activedescendant=\"cmd-o0\" hx-on:input=\"ermite.cmdFilter(this); ermiteFinder.palette(this)\" hx-on:keydown=\"ermite.cmdKey(event)\"> <button type=\"button\" class=\"panel-x\" aria-label=\"Close\" hx-on:click=\"closest('dialog').close()\"><kbd>esc</kbd></button></div><ul id=\"cmd-list\" class=\"cmd-list\" role=\"listbox\" aria-label=\"Targets\"><li id=\"cmd-o0\" role=\"option\" aria-selected=\"true\" data-k=\"go home\" data-cursor><a href=\"/\" tabindex=\"-1\"><span class=\"lbl\">home</span><span class=\"k\">go</span></a></li><li id=\"cmd-o1\" role=\"option\" aria-selected=\"false\" data-k=\"section summary\"><a href=\"/proj\" tabindex=\"-1\"><span class=\"lbl\">summary</span><span class=\"k\">section</span></a></li><li id=\"cmd-o2\" role=\"option\" aria-selected=\"false\" data-k=\"section files\"><a href=\"/proj/tree/main\" tabindex=\"-1\"><span class=\"lbl\">files</span><span class=\"k\">section</span></a></li><li id=\"cmd-o3\" role=\"option\" aria-selected=\"false\" data-k=\"section commits\"><a href=\"/proj/commits/main\" tabindex=\"-1\"><span class=\"lbl\">commits</span><span class=\"k\">section</span></a></li><li id=\"cmd-o4\" role=\"option\" aria-selected=\"false\" data-k=\"section branches &amp; tags\"><a href=\"/proj/refs\" tabindex=\"-1\"><span class=\"lbl\">branches &amp; tags</span><span class=\"k\">section</span></a></li><li id=\"cmd-o5\" role=\"option\" aria-selected=\"false\" data-k=\"section merge requests\"><a href=\"/proj/merge-requests\" tabindex=\"-1\"><span class=\"lbl\">merge requests</span><span class=\"k\">section</span></a></li><li id=\"cmd-o6\" role=\"option\" aria-selected=\"false\" data-k=\"section actions\"><a href=\"/proj/actions\" tabindex=\"-1\"><span class=\"lbl\">actions</span><span class=\"k\">section</span></a></li><li id=\"cmd-o7\" role=\"option\" aria-selected=\"false\" data-k=\"branch feat/search\"><a href=\"/proj/tree/feat/search\" tabindex=\"-1\"><span class=\"lbl\">feat/search</span><span class=\"k\">branch</span></a></li><li id=\"cmd-o8\" role=\"option\" aria-selected=\"false\" data-k=\"branch main\"><a href=\"/proj/tree/main\" tabindex=\"-1\"><span class=\"lbl\">main</span><span class=\"k\">branch</span></a></li><li id=\"cmd-o9\" role=\"option\" aria-selected=\"false\" data-k=\"action turn single-key shortcuts on off keyboard\"><a href=\"#\" data-fire=\"keys\" tabindex=\"-1\"><span class=\"lbl\">turn single-key shortcuts off</span><span class=\"k\">action</span></a></li></ul><p class=\"panel-foot\"><span><kbd>↑</kbd><kbd>↓</kbd> move</span><span><kbd>enter</kbd> open</span><span><kbd>esc</kbd> close</span></p></dialog><div id=\"keys\" hidden hx-on=\"k-j from:body -> ermite.move(1);\n k-k from:body -> ermite.move(-1);\n k-top from:body -> ermite.edge(false);\n k-bottom from:body -> ermite.edge(true);\n k-open from:body -> ermite.open();\n k-right from:body -> ermite.rail(true);\n k-left from:body -> ermite.rail(false);\n k-esc from:body -> ermite.closeDialogs();\n k-help from:body -> ermite.dialog('panel-help');\n k-refs from:body -> ermite.dialog('panel-refs', 'refs-filter');\n k-cmd from:body -> ermite.dialog('panel-cmd', 'cmd-q'); ermiteFinder.load();\n k-filter from:body -> ermite.focusFilter();\n k-gh from:body -> ermite.go('.brand');\n k-s from:body -> ermite.tab('s');\n k-t from:body -> ermite.tab('t');\n k-c from:body -> ermite.tab('c');\n k-r from:body -> ermite.tab('r');\n k-m from:body -> ermite.tab('m');\n k-i from:body -> ermite.tab('i');\n k-next from:body -> ermite.nextNote();\n k-split from:body -> ermite.layout('split');\n k-unified from:body -> ermite.layout('unified');\n k-collapse from:body -> ermite.collapse();\n k-wide from:body -> window.ermiteWide.toggle();\n k-expand from:body -> ermite.expandFile();\n k-expandAll from:body -> ermite.expandAll();\n k-permalink from:body -> ermite.permalink();\n k-merge from:body -> window.ermiteMR?.openMerge();\n k-read from:body -> window.ermiteMR?.markRead();\n k-gf from:body -> window.ermiteMR?.focusFiles();\n k-keys from:body -> ermite.toggleKeys()\"></div></body></html>" does not contain "is gone, the branch was rewritten"
  435. Test: TestWebMergeRequestSinceAfterForcePush
  436. FAIL
  437. FAIL bnema.dev/ermite/internal/app 330.179s
  438. FAIL
  439. Process completed with exit code 1.
  440. Post job cleanup.
  441. ##[command]/usr/bin/docker exec 1b888c945181acda79e38ae57f1848d56176f1bc3ea6b799c5e09dc73722b1ce sh -c "cat /etc/*release | grep ^ID"
  442. [command]/usr/sbin/git version
  443. git version 2.56.0
  444. Copying '/github/home/.gitconfig' to '/__w/_temp/6eb3d91c-9142-4572-b6e1-97dc71ccc1c0/.gitconfig'
  445. Temporarily overriding HOME='/__w/_temp/6eb3d91c-9142-4572-b6e1-97dc71ccc1c0' before making global git config changes
  446. Adding repository directory to the temporary git global config as a safe directory
  447. [command]/usr/sbin/git config --global --add safe.directory /__w/ermite/ermite
  448. Removing SSH command configuration
  449. [command]/usr/sbin/git config --local --name-only --get-regexp core\.sshCommand
  450. [command]/usr/sbin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :"
  451. Removing HTTP extra header
  452. [command]/usr/sbin/git config --local --name-only --get-regexp http\.http\:\/\/ermite\:7341\/\.extraheader
  453. [command]/usr/sbin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.http\:\/\/ermite\:7341\/\.extraheader' && git config --local --unset-all 'http.http://ermite:7341/.extraheader' || :"
  454. Removing includeIf entries pointing to credentials config files
  455. [command]/usr/sbin/git config --local --name-only --get-regexp ^includeIf\.gitdir:
  456. includeif.gitdir:/__w/ermite/ermite/.git.path
  457. includeif.gitdir:/__w/ermite/ermite/.git/worktrees/*.path
  458. includeif.gitdir:/github/workspace/.git.path
  459. includeif.gitdir:/github/workspace/.git/worktrees/*.path
  460. [command]/usr/sbin/git config --local --get-all includeif.gitdir:/__w/ermite/ermite/.git.path
  461. /__w/_temp/git-credentials-12a31e66-b742-4d37-b5fa-168d1827e1a3.config
  462. [command]/usr/sbin/git config --local --unset includeif.gitdir:/__w/ermite/ermite/.git.path /__w/_temp/git-credentials-12a31e66-b742-4d37-b5fa-168d1827e1a3.config
  463. [command]/usr/sbin/git config --local --get-all includeif.gitdir:/__w/ermite/ermite/.git/worktrees/*.path
  464. /__w/_temp/git-credentials-12a31e66-b742-4d37-b5fa-168d1827e1a3.config
  465. [command]/usr/sbin/git config --local --unset includeif.gitdir:/__w/ermite/ermite/.git/worktrees/*.path /__w/_temp/git-credentials-12a31e66-b742-4d37-b5fa-168d1827e1a3.config
  466. [command]/usr/sbin/git config --local --get-all includeif.gitdir:/github/workspace/.git.path
  467. /github/runner_temp/git-credentials-12a31e66-b742-4d37-b5fa-168d1827e1a3.config
  468. [command]/usr/sbin/git config --local --unset includeif.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-12a31e66-b742-4d37-b5fa-168d1827e1a3.config
  469. [command]/usr/sbin/git config --local --get-all includeif.gitdir:/github/workspace/.git/worktrees/*.path
  470. /github/runner_temp/git-credentials-12a31e66-b742-4d37-b5fa-168d1827e1a3.config
  471. [command]/usr/sbin/git config --local --unset includeif.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-12a31e66-b742-4d37-b5fa-168d1827e1a3.config
  472. [command]/usr/sbin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url
  473. Removing credentials config '/__w/_temp/git-credentials-12a31e66-b742-4d37-b5fa-168d1827e1a3.config'
  474. Stop and remove container: 26cafe9022154260a92f91db63d76285_archlinuxlatest_fcdece
  475. ##[command]/usr/bin/docker rm --force 1b888c945181acda79e38ae57f1848d56176f1bc3ea6b799c5e09dc73722b1ce
  476. 1b888c945181acda79e38ae57f1848d56176f1bc3ea6b799c5e09dc73722b1ce
  477. Remove container network: github_network_3d29a8d93e954b0da008e0219b4fc0d3
  478. ##[command]/usr/bin/docker network rm github_network_3d29a8d93e954b0da008e0219b4fc0d3
  479. github_network_3d29a8d93e954b0da008e0219b4fc0d3
  480. Cleaning up orphan processes
  481. ##[warning]Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/setup-go@v5. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 2

Tags 42

↑↓ moveenter openesc close