main 6a915d6

Test failure 7m 58s

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=896af1"
  23. ##[command]/usr/bin/docker network prune --force --filter "label=896af1"
  24. Create local container network
  25. ##[command]/usr/bin/docker network create --label 896af1 github_network_ff90e690ec3449658fbfee3264fdc8b0
  26. b478b12bdbebcd98620314511eb3ccdb180ee6d45b9bf8bce3136a7f0128eb1c
  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: Download complete
  33. 7450fb54bb4f: Verifying Checksum
  34. 7450fb54bb4f: Download complete
  35. 7450fb54bb4f: Pull complete
  36. e4c7c6c5e741: Pull complete
  37. Digest: sha256:e43f1fd80e073992c5f173efbbbf65144170bf60aeb7369940087d63eacea8f4
  38. Status: Downloaded newer image for archlinux:latest
  39. docker.io/library/archlinux:latest
  40. ##[command]/usr/bin/docker create --name d7e1c0d28c9a4aaf90caf1bb3055cbc2_archlinuxlatest_c0a55a --label 896af1 --workdir /__w/ermite/ermite --network github_network_ff90e690ec3449658fbfee3264fdc8b0 -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"
  41. 2685a3b7d5bc898f1a993e0824e7022609ce5446c6135f7d94b4e628acea4784
  42. ##[command]/usr/bin/docker start 2685a3b7d5bc898f1a993e0824e7022609ce5446c6135f7d94b4e628acea4784
  43. 2685a3b7d5bc898f1a993e0824e7022609ce5446c6135f7d94b4e628acea4784
  44. ##[command]/usr/bin/docker ps --all --filter id=2685a3b7d5bc898f1a993e0824e7022609ce5446c6135f7d94b4e628acea4784 --filter status=running --no-trunc --format "{{.ID}} {{.Status}}"
  45. 2685a3b7d5bc898f1a993e0824e7022609ce5446c6135f7d94b4e628acea4784 Up Less than a second
  46. ##[command]/usr/bin/docker inspect --format "{{range .Config.Env}}{{println .}}{{end}}" 2685a3b7d5bc898f1a993e0824e7022609ce5446c6135f7d94b4e628acea4784
  47. HOME=/github/home
  48. GITHUB_ACTIONS=true
  49. CI=true
  50. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  51. LANG=C.UTF-8
  52. Waiting for all services to be ready
  53. Run pacman -Syu --noconfirm --needed git gcc openssh nodejs
  54. <U+001B>[36;1mpacman -Syu --noconfirm --needed git gcc openssh nodejs<U+001B>[0m
  55. shell: sh -e {0}
  56. env:
  57. GOWORK: off
  58. :: Synchronizing package databases...
  59. core downloading...
  60. extra downloading...
  61. :: Starting full system upgrade...
  62. resolving dependencies...
  63. looking for conflicting packages...
  64. Package (24) Old Version New Version Net Change Download Size
  65. extra/abseil-cpp 20260817.0-2 7.15 MiB 1.35 MiB
  66. extra/ada 4.0.0-1 0.95 MiB 0.31 MiB
  67. extra/c-ares 1.34.8-1 0.53 MiB 0.23 MiB
  68. core/db5.3 5.3.28-7 6.48 MiB 1.26 MiB
  69. core/dbus 1.16.2-1 1.16.2-2 0.03 MiB 0.35 MiB
  70. extra/gtest 1.18.0-1 1.67 MiB 0.39 MiB
  71. core/libedit 20260512_3.1-1 0.27 MiB 0.11 MiB
  72. core/libisl 0.28-1 5.90 MiB 0.94 MiB
  73. core/libmpc 1.4.1-1 0.19 MiB 0.09 MiB
  74. extra/libuv 1.52.1-2 0.64 MiB 0.26 MiB
  75. core/linux-api-headers 7.2-1 7.3-1 0.07 MiB 1.53 MiB
  76. core/perl 5.44.0-1 72.30 MiB 20.98 MiB
  77. extra/perl-error 0.17030-3 0.04 MiB 0.02 MiB
  78. extra/perl-mailtools 2.22-3 0.10 MiB 0.06 MiB
  79. extra/perl-timedate 2.35-1 0.15 MiB 0.06 MiB
  80. extra/simdjson 1:5.0.5-1 10.27 MiB 0.44 MiB
  81. core/systemd 262-1 262.1-1 0.03 MiB 10.68 MiB
  82. core/systemd-libs 262-1 262.1-1 0.01 MiB 1.44 MiB
  83. core/systemd-sysvcompat 262-1 262.1-1 0.00 MiB 0.01 MiB
  84. extra/zlib-ng 2.3.3-1 0.28 MiB 0.11 MiB
  85. core/gcc 16.2.1+r23+gd564253eb6c8-1 220.89 MiB 57.93 MiB
  86. extra/git 2.56.0-1 33.54 MiB 7.43 MiB
  87. extra/nodejs 26.12.0-1 64.12 MiB 17.48 MiB
  88. core/openssh 10.6p1-2 6.77 MiB 1.43 MiB
  89. Total Download Size: 124.89 MiB
  90. Total Installed Size: 484.66 MiB
  91. Net Upgrade Size: 432.37 MiB
  92. :: Proceed with installation? [Y/n]
  93. :: Retrieving packages...
  94. gcc-16.2.1+r23+gd564253eb6c8-1-x86_64 downloading...
  95. perl-5.44.0-1-x86_64 downloading...
  96. nodejs-26.12.0-1-x86_64 downloading...
  97. systemd-262.1-1-x86_64 downloading...
  98. git-2.56.0-1-x86_64 downloading...
  99. linux-api-headers-7.3-1-x86_64 downloading...
  100. systemd-libs-262.1-1-x86_64 downloading...
  101. openssh-10.6p1-2-x86_64 downloading...
  102. abseil-cpp-20260817.0-2-x86_64 downloading...
  103. db5.3-5.3.28-7-x86_64 downloading...
  104. libisl-0.28-1-x86_64 downloading...
  105. simdjson-1:5.0.5-1-x86_64 downloading...
  106. gtest-1.18.0-1-x86_64 downloading...
  107. dbus-1.16.2-2-x86_64 downloading...
  108. ada-4.0.0-1-x86_64 downloading...
  109. libuv-1.52.1-2-x86_64 downloading...
  110. c-ares-1.34.8-1-x86_64 downloading...
  111. libedit-20260512_3.1-1-x86_64 downloading...
  112. zlib-ng-2.3.3-1-x86_64 downloading...
  113. libmpc-1.4.1-1-x86_64 downloading...
  114. perl-timedate-2.35-1-any downloading...
  115. perl-mailtools-2.22-3-any downloading...
  116. perl-error-0.17030-3-any downloading...
  117. systemd-sysvcompat-262.1-1-x86_64 downloading...
  118. checking keyring...
  119. checking package integrity...
  120. loading package files...
  121. checking for file conflicts...
  122. :: Processing package changes...
  123. upgrading linux-api-headers...
  124. installing db5.3...
  125. installing perl...
  126. installing perl-error...
  127. installing perl-timedate...
  128. installing perl-mailtools...
  129. installing zlib-ng...
  130. upgrading systemd-libs...
  131. installing git...
  132. Optional dependencies for git
  133. git-zsh-completion: upstream zsh completion
  134. tk: gitk and git gui
  135. openssh: ssh transport and crypto [pending]
  136. man: show help with `git command --help`
  137. perl-libwww: git svn
  138. perl-term-readkey: git svn and interactive.singlekey setting
  139. perl-io-socket-ssl: git send-email TLS support
  140. perl-authen-sasl: git send-email TLS support
  141. perl-cgi: gitweb (web interface) support
  142. python: git svn & git p4
  143. subversion: git svn
  144. org.freedesktop.secrets: keyring credential helper
  145. libsecret: libsecret credential helper [installed]
  146. less: the default pager for git
  147. installing libisl...
  148. installing libmpc...
  149. installing gcc...
  150. Optional dependencies for gcc
  151. lib32-gcc-libs: for generating code for 32-bit ABI
  152. installing libedit...
  153. installing openssh...
  154. Optional dependencies for openssh
  155. libfido2: FIDO/U2F support
  156. sh: for ssh-copy-id and findssl.sh [installed]
  157. x11-ssh-askpass: input passphrase in X
  158. xorg-xauth: X11 forwarding
  159. installing gtest...
  160. Optional dependencies for gtest
  161. python: gmock generator
  162. installing abseil-cpp...
  163. installing ada...
  164. installing c-ares...
  165. installing libuv...
  166. installing simdjson...
  167. installing nodejs...
  168. Optional dependencies for nodejs
  169. npm: nodejs package manager
  170. upgrading dbus...
  171. upgrading systemd...
  172. Creating group 'git' with GID 969.
  173. Creating user 'git' (git daemon user) with UID 969 and GID 969.
  174. upgrading systemd-sysvcompat...
  175. :: Running post-transaction hooks...
  176. ( 1/12) Creating system user accounts...
  177. ( 2/12) Creating temporary files...
  178. /usr/lib/tmpfiles.d/journal-nocow.conf:26: Failed to resolve specifier: uninitialized /etc/ detected, skipping.
  179. All rules containing unresolvable specifiers will be skipped.
  180. ( 3/12) Updating journal message catalog...
  181. ( 4/12) Updating udev hardware database...
  182. ( 5/12) Applying kernel sysctl settings...
  183. Skipped: Current root is not booted.
  184. ( 6/12) Reloading system manager configuration...
  185. Skipped: Current root is not booted.
  186. ( 7/12) Reloading user manager configuration...
  187. Skipped: Current root is not booted.
  188. ( 8/12) Enqueuing marked services...
  189. Skipped: Current root is not booted.
  190. ( 9/12) Reloading device manager configuration...
  191. Skipped: Current root is not booted.
  192. (10/12) Arming ConditionNeedsUpdate...
  193. (11/12) Reloading system bus configuration...
  194. Skipped: Current root is not booted.
  195. (12/12) Checking for old perl modules...
  196. Run actions/checkout@v6
  197. with:
  198. repository: bnema/ermite
  199. token: ***
  200. ssh-strict: true
  201. ssh-user: git
  202. persist-credentials: true
  203. clean: true
  204. sparse-checkout-cone-mode: true
  205. fetch-depth: 1
  206. fetch-tags: false
  207. show-progress: true
  208. lfs: false
  209. submodules: false
  210. set-safe-directory: true
  211. allow-unsafe-pr-checkout: false
  212. env:
  213. GOWORK: off
  214. ##[command]/usr/bin/docker exec 2685a3b7d5bc898f1a993e0824e7022609ce5446c6135f7d94b4e628acea4784 sh -c "cat /etc/*release | grep ^ID"
  215. Syncing repository: bnema/ermite
  216. Getting Git version info
  217. Working directory is '/__w/ermite/ermite'
  218. [command]/usr/sbin/git version
  219. git version 2.56.0
  220. Temporarily overriding HOME='/__w/_temp/29d79cb5-859e-4ae3-ba31-f8f46390cc74' before making global git config changes
  221. Adding repository directory to the temporary git global config as a safe directory
  222. [command]/usr/sbin/git config --global --add safe.directory /__w/ermite/ermite
  223. Deleting the contents of '/__w/ermite/ermite'
  224. Determining repository object format
  225. Initializing the repository
  226. [command]/usr/sbin/git init /__w/ermite/ermite
  227. hint: Using 'master' as the name for the initial branch. This default branch name
  228. hint: will change to "main" in Git 3.0. To configure the initial branch name
  229. hint: to use in all of your new repositories, which will suppress this warning,
  230. hint: call:
  231. hint:
  232. hint: git config --global init.defaultBranch <name>
  233. hint:
  234. hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
  235. hint: 'development'. The just-created branch can be renamed via this command:
  236. hint:
  237. hint: git branch -m <name>
  238. hint:
  239. hint: Disable this message with "git config set advice.defaultBranchName false"
  240. Initialized empty Git repository in /__w/ermite/ermite/.git/
  241. [command]/usr/sbin/git remote add origin http://ermite:7341/bnema/ermite
  242. Disabling automatic garbage collection
  243. [command]/usr/sbin/git config --local gc.auto 0
  244. Setting up auth
  245. Removing SSH command configuration
  246. [command]/usr/sbin/git config --local --name-only --get-regexp core\.sshCommand
  247. [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' || :"
  248. Removing HTTP extra header
  249. [command]/usr/sbin/git config --local --name-only --get-regexp http\.http\:\/\/ermite\:7341\/\.extraheader
  250. [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' || :"
  251. Removing includeIf entries pointing to credentials config files
  252. [command]/usr/sbin/git config --local --name-only --get-regexp ^includeIf\.gitdir:
  253. [command]/usr/sbin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url
  254. [command]/usr/sbin/git config --file /__w/_temp/git-credentials-376b0ed0-54d0-4b8c-b080-c7690bb9b4d8.config http.http://ermite:7341/.extraheader AUTHORIZATION: basic ***
  255. [command]/usr/sbin/git config --local includeIf.gitdir:/__w/ermite/ermite/.git.path /__w/_temp/git-credentials-376b0ed0-54d0-4b8c-b080-c7690bb9b4d8.config
  256. [command]/usr/sbin/git config --local includeIf.gitdir:/__w/ermite/ermite/.git/worktrees/*.path /__w/_temp/git-credentials-376b0ed0-54d0-4b8c-b080-c7690bb9b4d8.config
  257. [command]/usr/sbin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-376b0ed0-54d0-4b8c-b080-c7690bb9b4d8.config
  258. [command]/usr/sbin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-376b0ed0-54d0-4b8c-b080-c7690bb9b4d8.config
  259. Fetching the repository
  260. [command]/usr/sbin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --depth=1 origin +3ed746903cd6a04584ae699b9d178cd5e6d53513:refs/remotes/origin/main
  261. From http://ermite:7341/bnema/ermite
  262. * [new ref] 3ed746903cd6a04584ae699b9d178cd5e6d53513 -> origin/main
  263. [command]/usr/sbin/git branch --list --remote origin/main
  264. origin/main
  265. [command]/usr/sbin/git rev-parse refs/remotes/origin/main
  266. 3ed746903cd6a04584ae699b9d178cd5e6d53513
  267. Determining the checkout info
  268. [command]/usr/sbin/git sparse-checkout disable
  269. [command]/usr/sbin/git config --local --unset-all extensions.worktreeConfig
  270. Checking out the ref
  271. [command]/usr/sbin/git checkout --progress --force -B main refs/remotes/origin/main
  272. Switched to a new branch 'main'
  273. branch 'main' set up to track 'origin/main'.
  274. [command]/usr/sbin/git log -1 --format=%H
  275. 3ed746903cd6a04584ae699b9d178cd5e6d53513
  276. Run git config --global --add safe.directory "$GITHUB_WORKSPACE"
  277. <U+001B>[36;1mgit config --global --add safe.directory "$GITHUB_WORKSPACE"<U+001B>[0m
  278. shell: sh -e {0}
  279. env:
  280. GOWORK: off
  281. Run actions/setup-go@v5
  282. with:
  283. go-version-file: go.mod
  284. cache: true
  285. check-latest: false
  286. env:
  287. GOWORK: off
  288. ##[command]/usr/bin/docker exec 2685a3b7d5bc898f1a993e0824e7022609ce5446c6135f7d94b4e628acea4784 sh -c "cat /etc/*release | grep ^ID"
  289. Setup go version spec 1.27.1
  290. Attempting to download 1.27.1...
  291. (node:342) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
  292. (Use `node --trace-deprecation ...` to show where the warning was created)
  293. matching 1.27.1...
  294. 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
  295. Extracting Go...
  296. [command]/usr/sbin/tar xz --warning=no-unknown-keyword --overwrite -C /__w/_temp/7420d451-11bf-49b5-8426-8244ebf486b5 -f /__w/_temp/5e54cc29-2508-4d50-b1d4-8e4f2984cc00
  297. Successfully extracted go to /__w/_temp/7420d451-11bf-49b5-8426-8244ebf486b5
  298. Adding to the cache ...
  299. Successfully cached go to /__t/go/1.27.1/x64
  300. Added go to the path
  301. Successfully set up Go version 1.27.1
  302. [command]/__t/go/1.27.1/x64/bin/go env GOMODCACHE
  303. [command]/__t/go/1.27.1/x64/bin/go env GOCACHE
  304. /github/home/go/pkg/mod
  305. /github/home/.cache/go-build
  306. Cache Size: ~660 MB (691836498 B)
  307. [command]/usr/sbin/tar -xf /__w/_temp/0ea54342-e03c-49c9-b73c-e29919bc077c/cache.tzst -P -C /__w/ermite/ermite --use-compress-program unzstd
  308. Cache restored successfully
  309. Cache restored from key: setup-go-Linux-x64-undefined-go-1.27.1-18ab1982d508125689763e8035b92830502af31aca903a7274fc3c1a9008ff79
  310. go version go1.27.1 linux/amd64
  311. go env
  312. AR='ar'
  313. CC='gcc'
  314. CGO_CFLAGS='-O2 -g'
  315. CGO_CPPFLAGS=''
  316. CGO_CXXFLAGS='-O2 -g'
  317. CGO_ENABLED='1'
  318. CGO_FFLAGS='-O2 -g'
  319. CGO_LDFLAGS='-O2 -g'
  320. CXX='g++'
  321. GCCGO='gccgo'
  322. GO111MODULE=''
  323. GOAMD64='v1'
  324. GOARCH='amd64'
  325. GOAUTH='netrc'
  326. GOBIN='/github/home/go/bin'
  327. GOCACHE='/github/home/.cache/go-build'
  328. GOCACHEPROG=''
  329. GODEBUG=''
  330. GOENV='/github/home/.config/go/env'
  331. GOEXE=''
  332. GOEXPERIMENT=''
  333. GOFIPS140='off'
  334. GOFLAGS=''
  335. GOGCCFLAGS='-fPIC -m64 -pthread -Wl,--no-gc-sections -fmessage-length=0 -ffile-prefix-map=/tmp/go-build4080668642=/tmp/go-build -gno-record-gcc-switches'
  336. GOHOSTARCH='amd64'
  337. GOHOSTOS='linux'
  338. GOINSECURE=''
  339. GOMOD='/__w/ermite/ermite/go.mod'
  340. GOMODCACHE='/github/home/go/pkg/mod'
  341. GONOPROXY=''
  342. GONOSUMDB=''
  343. GOOS='linux'
  344. GOPACKAGESDRIVER=''
  345. GOPATH='/github/home/go'
  346. GOPRIVATE=''
  347. GOPROXY='https://proxy.golang.org,direct'
  348. GOROOT='/__t/go/1.27.1/x64'
  349. GOSUMDB='sum.golang.org'
  350. GOTELEMETRY='local'
  351. GOTELEMETRYDIR='/github/home/.config/go/telemetry'
  352. GOTMPDIR=''
  353. GOTOOLCHAIN='auto'
  354. GOTOOLDIR='/__t/go/1.27.1/x64/pkg/tool/linux_amd64'
  355. GOVCS=''
  356. GOVERSION='go1.27.1'
  357. GOWORK='off'
  358. PKG_CONFIG='pkg-config'
  359. Run git --version
  360. <U+001B>[36;1mgit --version<U+001B>[0m
  361. <U+001B>[36;1mv=$(git --version | sed -E 's/^git version ([0-9]+)\.([0-9]+).*/\1 \2/')<U+001B>[0m
  362. <U+001B>[36;1mset -- $v<U+001B>[0m
  363. <U+001B>[36;1mif [ "$1" -lt 2 ] || { [ "$1" -eq 2 ] && [ "$2" -lt 45 ]; }; then<U+001B>[0m
  364. <U+001B>[36;1m echo "git 2.45 or newer is required" >&2<U+001B>[0m
  365. <U+001B>[36;1m exit 1<U+001B>[0m
  366. <U+001B>[36;1mfi<U+001B>[0m
  367. shell: sh -e {0}
  368. env:
  369. GOWORK: off
  370. git version 2.56.0
  371. Run go mod tidy
  372. <U+001B>[36;1mgo mod tidy<U+001B>[0m
  373. <U+001B>[36;1mgit diff --exit-code -- go.mod go.sum<U+001B>[0m
  374. shell: sh -e {0}
  375. env:
  376. GOWORK: off
  377. Run scripts/templ-drift.sh
  378. <U+001B>[36;1mscripts/templ-drift.sh<U+001B>[0m
  379. shell: sh -e {0}
  380. env:
  381. GOWORK: off
  382. (✓) Post-generation event received, processing... [ updates=0 needsRestart=true needsBrowserReload=true ]
  383. (✓) Complete [ updates=0 duration=184.183219ms ]
  384. Run go vet ./...
  385. <U+001B>[36;1mgo vet ./...<U+001B>[0m
  386. shell: sh -e {0}
  387. env:
  388. GOWORK: off
  389. Run go test -race $(go list ./... | grep -vx 'bnema.dev/ermite/internal/app')
  390. <U+001B>[36;1mgo test -race $(go list ./... | grep -vx 'bnema.dev/ermite/internal/app')<U+001B>[0m
  391. shell: sh -e {0}
  392. env:
  393. GOWORK: off
  394. ? bnema.dev/ermite/cmd/ermite [no test files]
  395. ? bnema.dev/ermite/gen/ermite/storage [no test files]
  396. ok bnema.dev/ermite/internal/adapters/ciartifacts (cached)
  397. ok bnema.dev/ermite/internal/adapters/cilogs (cached)
  398. ok bnema.dev/ermite/internal/adapters/cisummaries (cached)
  399. ok bnema.dev/ermite/internal/adapters/client (cached)
  400. ok bnema.dev/ermite/internal/adapters/ermitegit (cached)
  401. ok bnema.dev/ermite/internal/adapters/eventbus (cached)
  402. ok bnema.dev/ermite/internal/adapters/gitcli (cached)
  403. ok bnema.dev/ermite/internal/adapters/githttp (cached)
  404. ok bnema.dev/ermite/internal/adapters/githubapi (cached)
  405. ok bnema.dev/ermite/internal/adapters/githubraw (cached)
  406. ok bnema.dev/ermite/internal/adapters/gitpush (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 (cached)
  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 42.341s
  416. ok bnema.dev/ermite/internal/adapters/webauthn (cached)
  417. ok bnema.dev/ermite/internal/boundary 1.170s
  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 22.211s
  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: TestWebFilesGolden (1.42s)
  432. --- FAIL: TestWebFilesGolden/blob-markdown (0.07s)
  433. web_files_test.go:104:
  434. Error Trace: /__w/ermite/ermite/internal/app/web_test.go:104
  435. /__w/ermite/ermite/internal/app/web_files_test.go:104
  436. Error: Not equal:
  437. expected: "<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<meta name=\"color-scheme\" content=\"light dark\">\n<title>docs/guide.md · files · example.test</title>\n<meta name=\"theme-color\" media=\"(prefers-color-scheme: light)\" content=\"#ffffff\">\n<meta name=\"theme-color\" media=\"(prefers-color-scheme: dark)\" content=\"#0c0c0c\">\n<meta name=\"apple-mobile-web-app-title\" content=\"ermite\">\n<link rel=\"icon\" type=\"image/svg+xml\" href=\"/-/static/img/icon.HASH.svg\">\n<link rel=\"apple-touch-icon\" href=\"/-/static/app/apple-touch-icon.HASH.png\">\n<link rel=\"manifest\" href=\"/-/static/app/manifest.HASH.webmanifest\">\n<link rel=\"preload\" href=\"/-/static/fonts/atkinson-next.HASH.woff2\" as=\"font\" type=\"font/woff2\" crossorigin>\n<link rel=\"stylesheet\" href=\"/-/static/css/ermite.HASH.css\">\n<meta name=\"htmx-config\" content='{\"history\":false,\"includeIndicatorCSS\":false,\"extensions\":\"sse, hx-live\"}'>\n<script src=\"/-/static/js/htmx.min.HASH.js\" defer>\n</script>\n<script src=\"/-/static/js/hx-live.min.HASH.js\" defer>\n</script>\n<script src=\"/-/static/js/hx-sse.min.HASH.js\" defer>\n</script>\n<script src=\"/-/static/js/store.HASH.js\">\n</script>\n<script src=\"/-/static/js/ermite.HASH.js\" defer>\n</script>\n<script src=\"/-/static/js/files.HASH.js\" defer>\n</script>\n<script src=\"/-/static/js/passkey.HASH.js\" defer>\n</script>\n<script src=\"/-/static/js/log.HASH.js\" defer>\n</script>\n</head>\n<body data-ref=\"main\" data-sha=\"SHA40\" data-sel=\"\" data-nav=\"\" data-paths=\"/files/paths/SHA40\" data-blob=\"/files/blob/main\">\n<a class=\"skip\" href=\"#main\">skip to content</a>\n<header class=\"hdr\">\n<div class=\"hdr-top\">\n<a class=\"brand\" href=\"/\" data-g=\"h\" aria-label=\"home\" title=\"home (g h)\">\n<span class=\"brand-mark\" aria-hidden=\"true\">\n</span>\n</a>\n<nav class=\"crumbs\" aria-label=\"Path\">\n<ol>\n<li>\n<a href=\"/files\">files</a>\n</li>\n<li>\n<a href=\"/files/tree/main\">blob</a>\n</li>\n<li>\n<a href=\"/files/tree/main\">main</a>\n</li>\n<li>\n<a href=\"/files/tree/main/docs\">docs</a>\n</li>\n<li>\n<a href=\"/files/blob/main/docs/guide.md\" aria-current=\"page\">guide.md</a>\n</li>\n</ol>\n</nav>\n<div class=\"hdr-acts\">\n<a class=\"btn ref\" href=\"/files/refs\" data-fire=\"refs\" aria-keyshortcuts=\"b\" title=\"switch branch or tag (b)\">\n<span class=\"ico i-branch\" aria-hidden=\"true\">\n</span>\n<span class=\"ref-name\">main</span>\n<span class=\"sha\">SHA7</span>\n</a>\n<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\">\n<span class=\"ico i-search\" aria-hidden=\"true\">\n</span>\n<span class=\"search-label\">Go to…</span>\n<kbd aria-hidden=\"true\">ctrl k</kbd>\n</button>\n</div>\n</div>\n<nav class=\"tabs\" aria-label=\"Sections\">\n<ul>\n<li>\n<a href=\"/files\" data-key=\"s\" aria-keyshortcuts=\"s\">Summary <kbd aria-hidden=\"true\">s</kbd>\n</a>\n</li>\n<li>\n<a href=\"/files/tree/main\" data-key=\"t\" aria-keyshortcuts=\"t\" aria-current=\"page\">Files <kbd aria-hidden=\"true\">t</kbd>\n</a>\n</li>\n<li>\n<a href=\"/files/commits/main\" data-key=\"c\" aria-keyshortcuts=\"c\">Commits <kbd aria-hidden=\"true\">c</kbd>\n</a>\n</li>\n<li>\n<a href=\"/files/refs\" data-key=\"r\" aria-keyshortcuts=\"r\">Branches &amp; tags <kbd aria-hidden=\"true\">r</kbd>\n</a>\n</li>\n<li>\n<a href=\"/files/merge-requests\" data-key=\"m\" aria-keyshortcuts=\"m\">Merge requests <kbd aria-hidden=\"true\">m</kbd>\n</a>\n</li>\n<li>\n<a href=\"/files/actions\" data-key=\"a\" aria-keyshortcuts=\"a\">Actions <kbd aria-hidden=\"true\">a</kbd>\n</a>\n</li>\n</ul>\n</nav>\n</header>\n<div class=\"work has-rail\">\n<main id=\"main\" tabindex=\"-1\">\n<h1 class=\"file-h\">\n<span>guide.md</span>\n<span class=\"acts\">\n<a class=\"btn\" href=\"/files/raw/main/docs/guide.md\">Raw</a>\n<a class=\"btn\" href=\"/files/commits/main/docs/guide.md\">History</a>\n<a class=\"btn\" href=\"/files/tree/main/docs\">Folder</a>\n</span>\n</h1>\n<article class=\"prose\" aria-label=\"guide.md\" hx-ignore>\n<h1 id=\"md-guide\">Guide</h1>\n<h2 id=\"md-steps\">Steps</h2>\n<p>Run it.</p>\n<pre>\n<code class=\"language-sh\">make all\n</code>\n</pre>\n</article>\n<details class=\"source\">\n<summary>source</summary>\n<pre class=\"chroma code\" data-anchor=\"\" hx-on:click=\"let a = event.target.closest('a.ln'); if (!a) return; event.preventDefault();\n let n = +a.textContent; if (!event.shiftKey || !data.anchor) data.anchor = n;\n let lo = Math.min(+data.anchor, n), hi = Math.max(+data.anchor, n);\n history.replaceState(null, '', '#L' + lo + (hi > lo ? '-L' + hi : '')); trigger('sel')\" hx-on:sel=\"let m = location.hash.match(/^#L(\\d+)(?:-L(\\d+))?$/); let lo = m ? +m[1] : 0, hi = m ? +(m[2] || m[1]) : 0;\n q('.line in this').arr().forEach(l => { let k = +l.id.slice(1); l.classList.toggle('sel', k >= lo && k <= hi) });\n document.body.dataset.sel = lo ? 'L' + lo + (hi > lo ? '-L' + hi + ' · ' + (hi - lo + 1) + ' lines' : '') : '';\n if (lo && event.detail?.scroll) document.getElementById('L' + lo)?.scrollIntoView({ block: 'center' })\" hx-live=\"if (!data.ready) { data.ready = '1'; trigger('sel', { scroll: true }) }\" data-ready=\"\">\n<code hx-ignore>\n<span class=\"line\" id=\"L1\">\n<a class=\"ln\" href=\"#L1\">1</a>\n<span class=\"gh\"># Guide</span>\n</span>\n<span class=\"line\" id=\"L2\">\n<a class=\"ln\" href=\"#L2\">2</a>\n</span>\n<span class=\"line\" id=\"L3\">\n<a class=\"ln\" href=\"#L3\">3</a>\n<span class=\"gu\">## Steps</span>\n</span>\n<span class=\"line\" id=\"L4\">\n<a class=\"ln\" href=\"#L4\">4</a>\n</span>\n<span class=\"line\" id=\"L5\">\n<a class=\"ln\" href=\"#L5\">5</a>Run it.</span>\n<span class=\"line\" id=\"L6\">\n<a class=\"ln\" href=\"#L6\">6</a>\n</span>\n<span class=\"line\" id=\"L7\">\n<a class=\"ln\" href=\"#L7\">7</a>\n<span class=\"s\">```sh</span>\n</span>\n<span class=\"line\" id=\"L8\">\n<a class=\"ln\" href=\"#L8\">8</a>make all</span>\n<span class=\"line\" id=\"L9\">\n<a class=\"ln\" href=\"#L9\">9</a>\n<span class=\"s\">```</span>\n</span>\n</code>\n</pre>\n</details>\n</main>\n<aside class=\"rail\" aria-label=\"Context\">\n<section aria-labelledby=\"r-file\">\n<h2 id=\"r-file\">File</h2>\n<dl class=\"kv\">\n<dt>size</dt>\n<dd>47 B</dd>\n<dt>lines</dt>\n<dd>9</dd>\n<dt>type</dt>\n<dd>markdown</dd>\n</dl>\n</section>\n<section aria-labelledby=\"r-last\">\n<h2 id=\"r-last\">Last change <a href=\"/files/commits/main/docs/guide.md\">History</a>\n</h2>\n<p>\n<a href=\"/files/commit/SHA40\">SHA7</a> add docs/guide.md</p>\n<p class=\"dim\">T · <time datetime=\"STAMP\" title=\"STAMP\">AGO</time>\n</p>\n</section>\n<section aria-labelledby=\"r-outline\">\n<h2 id=\"r-outline\">On this page</h2>\n<nav class=\"outline\" aria-label=\"Outline\">\n<a class=\"l1\" href=\"#md-guide\">Guide</a>\n<a class=\"l2\" href=\"#md-steps\">Steps</a>\n</nav>\n</section>\n<section aria-labelledby=\"r-sel\">\n<h2 id=\"r-sel\">Selection</h2>\n<p :text=\"document.body.dataset.sel || 'none · click a line number, shift-click extends'\">none · click a line number, shift-click extends</p>\n<p class=\"dim\">y copies a permalink pinned to the commit sha</p>\n</section>\n</aside>\n</div>\n<footer class=\"foot\">\n<span>ermite devel</span>\n<a href=\"http://example.test/ermite\" rel=\"noopener\" title=\"source of this version (AGPL-3.0-or-later)\">source</a>\n<button type=\"button\" class=\"foot-keys\" data-js data-fire=\"help\" aria-haspopup=\"dialog\" aria-controls=\"panel-help\" aria-keyshortcuts=\"?\">\n<kbd aria-hidden=\"true\">?</kbd> keyboard shortcuts</button>\n</footer>\n<div class=\"hint\" role=\"status\" aria-live=\"polite\">\n<span class=\"hint-nav\" :text=\"document.body.dataset.nav || ''\">\n</span>\n<span class=\"hint-sel\" :text=\"document.body.dataset.sel ? document.body.dataset.sel + ' · y permalink' : ''\">\n</span>\n<span class=\"hint-flash\" :text=\"document.body.dataset.flash || ''\">\n</span>\n</div>\n<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()\">\n<div class=\"panel-head\">\n<h2>Keyboard shortcuts</h2>\n<button type=\"button\" class=\"panel-x\" aria-label=\"Close\" hx-on:click=\"closest('dialog').close()\">\n<kbd>esc</kbd> close</button>\n</div>\n<div class=\"keys-pref\">\n<label>\n<input type=\"checkbox\" id=\"keys-off\" aria-describedby=\"keys-note\" hx-on:change=\"ermite.setKeysOff(this.checked)\"> Turn off single-key shortcuts</label>\n<p id=\"keys-note\" class=\"dim\">Single-key shortcuts are on. ctrl k and esc work whatever this says.</p>\n</div>\n<dl class=\"keys\">\n<div>\n<dt>\n<kbd>ctrl k</kbd>\n<kbd>:</kbd>\n</dt>\n<dd>go to a section, branch, tag, file or repository</dd>\n</div>\n<div>\n<dt>\n<kbd>?</kbd>\n</dt>\n<dd>this list</dd>\n</div>\n<div>\n<dt>\n<kbd>j</kbd>\n<kbd>k</kbd>\n</dt>\n<dd>move the row cursor down / up</dd>\n</div>\n<div>\n<dt>\n<kbd>enter</kbd>\n</dt>\n<dd>open the row under the cursor; on Files, a directory opens or closes in place</dd>\n</div>\n<div>\n<dt>\n<kbd>↑</kbd>\n<kbd>↓</kbd>\n<kbd>←</kbd>\n<kbd>→</kbd>\n<kbd>home</kbd>\n<kbd>end</kbd>\n</dt>\n<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>\n</div>\n<div>\n<dt>\n<kbd>l</kbd>\n<kbd>h</kbd>\n</dt>\n<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>\n</div>\n<div>\n<dt>\n<kbd>g g</kbd>\n<kbd>G</kbd>\n</dt>\n<dd>first / last row</dd>\n</div>\n<div>\n<dt>\n<kbd>/</kbd>\n</dt>\n<dd>filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)</dd>\n</div>\n<div>\n<dt>\n<kbd>b</kbd>\n</dt>\n<dd>switch branch or tag</dd>\n</div>\n<div>\n<dt>\n<kbd>s</kbd>\n<kbd>t</kbd>\n<kbd>c</kbd>\n<kbd>r</kbd>\n<kbd>m</kbd>\n<kbd>i</kbd>\n</dt>\n<dd>tabs: summary, files, commits, branches &amp; tags, merge requests, issues</dd>\n</div>\n<div>\n<dt>\n<kbd>g h</kbd>\n</dt>\n<dd>home</dd>\n</div>\n<div>\n<dt>\n<kbd>w</kbd>\n</dt>\n<dd>wide mode: use the whole width of the screen, or not (remembered)</dd>\n</div>\n<div>\n<dt>\n<kbd>y</kbd>\n</dt>\n<dd>copy a permalink pinned to the commit</dd>\n</div>\n<div>\n<dt>\n<kbd>d</kbd>\n<kbd>u</kbd>\n<kbd>x</kbd>\n</dt>\n<dd>diff: split / unified / collapse or expand all</dd>\n</div>\n<div>\n<dt>\n<kbd>e</kbd>\n<kbd>E</kbd>\n</dt>\n<dd>diff: the whole file in view / every file, with the lines the hunks hide</dd>\n</div>\n<div>\n<dt>\n<kbd>n</kbd>\n</dt>\n<dd>merge request: next note in the diff</dd>\n</div>\n<div>\n<dt>\n<kbd>esc</kbd>\n</dt>\n<dd>close a dialog, leave a field</dd>\n</div>\n</dl>\n</dialog>\n<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()\">\n<div class=\"panel-head\">\n<label for=\"refs-filter\" class=\"sr\">filter branches and tags</label>\n<input id=\"refs-filter\" type=\"search\" placeholder=\"Switch branch or tag…\" autocomplete=\"off\" data-pick=\"#panel-refs li\" hx-on:input=\"ermite.filter(this)\">\n<button type=\"button\" class=\"panel-x\" aria-label=\"Close\" hx-on:click=\"closest('dialog').close()\">\n<kbd>esc</kbd>\n</button>\n</div>\n<div class=\"panel-cols\" data-picklist>\n<section aria-label=\"Branches\">\n<h2>Branches <span class=\"count\">2</span>\n</h2>\n<ul>\n<li>\n<a href=\"/files/tree/feature/x\">\n<span class=\"mark\" aria-hidden=\"true\">&nbsp;</span>feature/x</a>\n</li>\n<li>\n<a href=\"/files/tree/main\" aria-current=\"true\">\n<span class=\"mark\" aria-hidden=\"true\">●</span>main</a>\n</li>\n</ul>\n</section>\n<section aria-label=\"Tags\">\n<h2>Tags <span class=\"count\">1</span>\n</h2>\n<ul>\n<li>\n<a href=\"/files/tree/v1.0\">\n<span class=\"mark\" aria-hidden=\"true\">&nbsp;</span>v1.0</a>\n</li>\n</ul>\n</section>\n</div>\n</dialog>\n<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()\">\n<div class=\"panel-head\">\n<label for=\"cmd-q\" class=\"sr\">go to</label>\n<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)\">\n<button type=\"button\" class=\"panel-x\" aria-label=\"Close\" hx-on:click=\"closest('dialog').close()\">\n<kbd>esc</kbd>\n</button>\n</div>\n<ul id=\"cmd-list\" class=\"cmd-list\" role=\"listbox\" aria-label=\"Targets\">\n<li id=\"cmd-o0\" role=\"option\" aria-selected=\"true\" data-k=\"go home\" data-cursor>\n<a href=\"/\" tabindex=\"-1\">\n<span class=\"lbl\">home</span>\n<span class=\"k\">go</span>\n</a>\n</li>\n<li id=\"cmd-o1\" role=\"option\" aria-selected=\"false\" data-k=\"section summary\">\n<a href=\"/files\" tabindex=\"-1\">\n<span class=\"lbl\">summary</span>\n<span class=\"k\">section</span>\n</a>\n</li>\n<li id=\"cmd-o2\" role=\"option\" aria-selected=\"false\" data-k=\"section files\">\n<a href=\"/files/tree/main\" tabindex=\"-1\">\n<span class=\"lbl\">files</span>\n<span class=\"k\">section</span>\n</a>\n</li>\n<li id=\"cmd-o3\" role=\"option\" aria-selected=\"false\" data-k=\"section commits\">\n<a href=\"/files/commits/main\" tabindex=\"-1\">\n<span class=\"lbl\">commits</span>\n<span class=\"k\">section</span>\n</a>\n</li>\n<li id=\"cmd-o4\" role=\"option\" aria-selected=\"false\" data-k=\"section branches &amp; tags\">\n<a href=\"/files/refs\" tabindex=\"-1\">\n<span class=\"lbl\">branches &amp; tags</span>\n<span class=\"k\">section</span>\n</a>\n</li>\n<li id=\"cmd-o5\" role=\"option\" aria-selected=\"false\" data-k=\"section merge requests\">\n<a href=\"/files/merge-requests\" tabindex=\"-1\">\n<span class=\"lbl\">merge requests</span>\n<span class=\"k\">section</span>\n</a>\n</li>\n<li id=\"cmd-o6\" role=\"option\" aria-selected=\"false\" data-k=\"section actions\">\n<a href=\"/files/actions\" tabindex=\"-1\">\n<span class=\"lbl\">actions</span>\n<span class=\"k\">section</span>\n</a>\n</li>\n<li id=\"cmd-o7\" role=\"option\" aria-selected=\"false\" data-k=\"branch feature/x\">\n<a href=\"/files/tree/feature/x\" tabindex=\"-1\">\n<span class=\"lbl\">feature/x</span>\n<span class=\"k\">branch</span>\n</a>\n</li>\n<li id=\"cmd-o8\" role=\"option\" aria-selected=\"false\" data-k=\"branch main\">\n<a href=\"/files/tree/main\" tabindex=\"-1\">\n<span class=\"lbl\">main</span>\n<span class=\"k\">branch</span>\n</a>\n</li>\n<li id=\"cmd-o9\" role=\"option\" aria-selected=\"false\" data-k=\"tag v1.0\">\n<a href=\"/files/tree/v1.0\" tabindex=\"-1\">\n<span class=\"lbl\">v1.0</span>\n<span class=\"k\">tag</span>\n</a>\n</li>\n<li id=\"cmd-o10\" role=\"option\" aria-selected=\"false\" data-k=\"action turn single-key shortcuts on off keyboard\">\n<a href=\"#\" data-fire=\"keys\" tabindex=\"-1\">\n<span class=\"lbl\">turn single-key shortcuts off</span>\n<span class=\"k\">action</span>\n</a>\n</li>\n</ul>\n<p class=\"panel-foot\">\n<span>\n<kbd>↑</kbd>\n<kbd>↓</kbd> move</span>\n<span>\n<kbd>enter</kbd> open</span>\n<span>\n<kbd>esc</kbd> close</span>\n</p>\n</dialog>\n<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()\">\n</div>\n</body>\n</html>\n"
  438. actual : "<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<meta name=\"color-scheme\" content=\"light dark\">\n<title>docs/guide.md · files · example.test</title>\n<meta name=\"theme-color\" media=\"(prefers-color-scheme: light)\" content=\"#ffffff\">\n<meta name=\"theme-color\" media=\"(prefers-color-scheme: dark)\" content=\"#0c0c0c\">\n<meta name=\"apple-mobile-web-app-title\" content=\"ermite\">\n<link rel=\"icon\" type=\"image/svg+xml\" href=\"/-/static/img/icon.HASH.svg\">\n<link rel=\"apple-touch-icon\" href=\"/-/static/app/apple-touch-icon.HASH.png\">\n<link rel=\"manifest\" href=\"/-/static/app/manifest.HASH.webmanifest\">\n<link rel=\"preload\" href=\"/-/static/fonts/atkinson-next.HASH.woff2\" as=\"font\" type=\"font/woff2\" crossorigin>\n<link rel=\"stylesheet\" href=\"/-/static/css/ermite.HASH.css\">\n<meta name=\"htmx-config\" content='{\"history\":false,\"includeIndicatorCSS\":false,\"extensions\":\"sse, hx-live\"}'>\n<script src=\"/-/static/js/htmx.min.HASH.js\" defer>\n</script>\n<script src=\"/-/static/js/hx-live.min.HASH.js\" defer>\n</script>\n<script src=\"/-/static/js/hx-sse.min.HASH.js\" defer>\n</script>\n<script src=\"/-/static/js/store.HASH.js\">\n</script>\n<script src=\"/-/static/js/ermite.HASH.js\" defer>\n</script>\n<script src=\"/-/static/js/files.HASH.js\" defer>\n</script>\n<script src=\"/-/static/js/passkey.HASH.js\" defer>\n</script>\n<script src=\"/-/static/js/log.HASH.js\" defer>\n</script>\n</head>\n<body data-ref=\"main\" data-sha=\"SHA40\" data-sel=\"\" data-nav=\"\" data-paths=\"/files/paths/SHA40\" data-blob=\"/files/blob/main\">\n<a class=\"skip\" href=\"#main\">skip to content</a>\n<header class=\"hdr\">\n<div class=\"hdr-top\">\n<a class=\"brand\" href=\"/\" data-g=\"h\" aria-label=\"home\" title=\"home (g h)\">\n<span class=\"brand-mark\" aria-hidden=\"true\">\n</span>\n</a>\n<nav class=\"crumbs\" aria-label=\"Path\">\n<ol>\n<li>\n<a href=\"/files\">files</a>\n</li>\n<li>\n<a href=\"/files/tree/main\">blob</a>\n</li>\n<li>\n<a href=\"/files/tree/main\">main</a>\n</li>\n<li>\n<a href=\"/files/tree/main/docs\">docs</a>\n</li>\n<li>\n<a href=\"/files/blob/main/docs/guide.md\" aria-current=\"page\">guide.md</a>\n</li>\n</ol>\n</nav>\n<div class=\"hdr-acts\">\n<a class=\"btn ref\" href=\"/files/refs\" data-fire=\"refs\" aria-keyshortcuts=\"b\" title=\"switch branch or tag (b)\">\n<span class=\"ico i-branch\" aria-hidden=\"true\">\n</span>\n<span class=\"ref-name\">main</span>\n<span class=\"sha\">SHA7</span>\n</a>\n<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\">\n<span class=\"ico i-search\" aria-hidden=\"true\">\n</span>\n<span class=\"search-label\">Go to…</span>\n<kbd aria-hidden=\"true\">ctrl k</kbd>\n</button>\n</div>\n</div>\n<nav class=\"tabs\" aria-label=\"Sections\">\n<ul>\n<li>\n<a href=\"/files\" data-key=\"s\" aria-keyshortcuts=\"s\">Summary <kbd aria-hidden=\"true\">s</kbd>\n</a>\n</li>\n<li>\n<a href=\"/files/tree/main\" data-key=\"t\" aria-keyshortcuts=\"t\" aria-current=\"page\">Files <kbd aria-hidden=\"true\">t</kbd>\n</a>\n</li>\n<li>\n<a href=\"/files/commits/main\" data-key=\"c\" aria-keyshortcuts=\"c\">Commits <kbd aria-hidden=\"true\">c</kbd>\n</a>\n</li>\n<li>\n<a href=\"/files/refs\" data-key=\"r\" aria-keyshortcuts=\"r\">Branches &amp; tags <kbd aria-hidden=\"true\">r</kbd>\n</a>\n</li>\n<li>\n<a href=\"/files/merge-requests\" data-key=\"m\" aria-keyshortcuts=\"m\">Merge requests <kbd aria-hidden=\"true\">m</kbd>\n</a>\n</li>\n<li>\n<a href=\"/files/actions\" data-key=\"a\" aria-keyshortcuts=\"a\">Actions <kbd aria-hidden=\"true\">a</kbd>\n</a>\n</li>\n</ul>\n</nav>\n</header>\n<div class=\"work has-rail\">\n<main id=\"main\" tabindex=\"-1\">\n<h1 class=\"file-h\">\n<span>guide.md</span>\n<span class=\"acts\">\n<a class=\"btn\" href=\"/files/raw/main/docs/guide.md\">Raw</a>\n<a class=\"btn\" href=\"/files/commits/main/docs/guide.md\">History</a>\n<a class=\"btn\" href=\"/files/tree/main/docs\">Folder</a>\n</span>\n</h1>\n<article class=\"prose\" aria-label=\"guide.md\" hx-ignore>\n<h1 id=\"md-guide\">Guide</h1>\n<h2 id=\"md-steps\">Steps</h2>\n<p>Run it.</p>\n<pre class=\"chroma\">\n<code class=\"language-sh\">make all\n</code>\n</pre>\n</article>\n<details class=\"source\">\n<summary>source</summary>\n<pre class=\"chroma code\" data-anchor=\"\" hx-on:click=\"let a = event.target.closest('a.ln'); if (!a) return; event.preventDefault();\n let n = +a.textContent; if (!event.shiftKey || !data.anchor) data.anchor = n;\n let lo = Math.min(+data.anchor, n), hi = Math.max(+data.anchor, n);\n history.replaceState(null, '', '#L' + lo + (hi > lo ? '-L' + hi : '')); trigger('sel')\" hx-on:sel=\"let m = location.hash.match(/^#L(\\d+)(?:-L(\\d+))?$/); let lo = m ? +m[1] : 0, hi = m ? +(m[2] || m[1]) : 0;\n q('.line in this').arr().forEach(l => { let k = +l.id.slice(1); l.classList.toggle('sel', k >= lo && k <= hi) });\n document.body.dataset.sel = lo ? 'L' + lo + (hi > lo ? '-L' + hi + ' · ' + (hi - lo + 1) + ' lines' : '') : '';\n if (lo && event.detail?.scroll) document.getElementById('L' + lo)?.scrollIntoView({ block: 'center' })\" hx-live=\"if (!data.ready) { data.ready = '1'; trigger('sel', { scroll: true }) }\" data-ready=\"\">\n<code hx-ignore>\n<span class=\"line\" id=\"L1\">\n<a class=\"ln\" href=\"#L1\">1</a>\n<span class=\"gh\"># Guide</span>\n</span>\n<span class=\"line\" id=\"L2\">\n<a class=\"ln\" href=\"#L2\">2</a>\n</span>\n<span class=\"line\" id=\"L3\">\n<a class=\"ln\" href=\"#L3\">3</a>\n<span class=\"gu\">## Steps</span>\n</span>\n<span class=\"line\" id=\"L4\">\n<a class=\"ln\" href=\"#L4\">4</a>\n</span>\n<span class=\"line\" id=\"L5\">\n<a class=\"ln\" href=\"#L5\">5</a>Run it.</span>\n<span class=\"line\" id=\"L6\">\n<a class=\"ln\" href=\"#L6\">6</a>\n</span>\n<span class=\"line\" id=\"L7\">\n<a class=\"ln\" href=\"#L7\">7</a>\n<span class=\"s\">```sh</span>\n</span>\n<span class=\"line\" id=\"L8\">\n<a class=\"ln\" href=\"#L8\">8</a>make all</span>\n<span class=\"line\" id=\"L9\">\n<a class=\"ln\" href=\"#L9\">9</a>\n<span class=\"s\">```</span>\n</span>\n</code>\n</pre>\n</details>\n</main>\n<aside class=\"rail\" aria-label=\"Context\">\n<section aria-labelledby=\"r-file\">\n<h2 id=\"r-file\">File</h2>\n<dl class=\"kv\">\n<dt>size</dt>\n<dd>47 B</dd>\n<dt>lines</dt>\n<dd>9</dd>\n<dt>type</dt>\n<dd>markdown</dd>\n</dl>\n</section>\n<section aria-labelledby=\"r-last\">\n<h2 id=\"r-last\">Last change <a href=\"/files/commits/main/docs/guide.md\">History</a>\n</h2>\n<p>\n<a href=\"/files/commit/SHA40\">SHA7</a> add docs/guide.md</p>\n<p class=\"dim\">T · <time datetime=\"STAMP\" title=\"STAMP\">AGO</time>\n</p>\n</section>\n<section aria-labelledby=\"r-outline\">\n<h2 id=\"r-outline\">On this page</h2>\n<nav class=\"outline\" aria-label=\"Outline\">\n<a class=\"l1\" href=\"#md-guide\">Guide</a>\n<a class=\"l2\" href=\"#md-steps\">Steps</a>\n</nav>\n</section>\n<section aria-labelledby=\"r-sel\">\n<h2 id=\"r-sel\">Selection</h2>\n<p :text=\"document.body.dataset.sel || 'none · click a line number, shift-click extends'\">none · click a line number, shift-click extends</p>\n<p class=\"dim\">y copies a permalink pinned to the commit sha</p>\n</section>\n</aside>\n</div>\n<footer class=\"foot\">\n<span>ermite devel</span>\n<a href=\"http://example.test/ermite\" rel=\"noopener\" title=\"source of this version (AGPL-3.0-or-later)\">source</a>\n<button type=\"button\" class=\"foot-keys\" data-js data-fire=\"help\" aria-haspopup=\"dialog\" aria-controls=\"panel-help\" aria-keyshortcuts=\"?\">\n<kbd aria-hidden=\"true\">?</kbd> keyboard shortcuts</button>\n</footer>\n<div class=\"hint\" role=\"status\" aria-live=\"polite\">\n<span class=\"hint-nav\" :text=\"document.body.dataset.nav || ''\">\n</span>\n<span class=\"hint-sel\" :text=\"document.body.dataset.sel ? document.body.dataset.sel + ' · y permalink' : ''\">\n</span>\n<span class=\"hint-flash\" :text=\"document.body.dataset.flash || ''\">\n</span>\n</div>\n<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()\">\n<div class=\"panel-head\">\n<h2>Keyboard shortcuts</h2>\n<button type=\"button\" class=\"panel-x\" aria-label=\"Close\" hx-on:click=\"closest('dialog').close()\">\n<kbd>esc</kbd> close</button>\n</div>\n<div class=\"keys-pref\">\n<label>\n<input type=\"checkbox\" id=\"keys-off\" aria-describedby=\"keys-note\" hx-on:change=\"ermite.setKeysOff(this.checked)\"> Turn off single-key shortcuts</label>\n<p id=\"keys-note\" class=\"dim\">Single-key shortcuts are on. ctrl k and esc work whatever this says.</p>\n</div>\n<dl class=\"keys\">\n<div>\n<dt>\n<kbd>ctrl k</kbd>\n<kbd>:</kbd>\n</dt>\n<dd>go to a section, branch, tag, file or repository</dd>\n</div>\n<div>\n<dt>\n<kbd>?</kbd>\n</dt>\n<dd>this list</dd>\n</div>\n<div>\n<dt>\n<kbd>j</kbd>\n<kbd>k</kbd>\n</dt>\n<dd>move the row cursor down / up</dd>\n</div>\n<div>\n<dt>\n<kbd>enter</kbd>\n</dt>\n<dd>open the row under the cursor; on Files, a directory opens or closes in place</dd>\n</div>\n<div>\n<dt>\n<kbd>↑</kbd>\n<kbd>↓</kbd>\n<kbd>←</kbd>\n<kbd>→</kbd>\n<kbd>home</kbd>\n<kbd>end</kbd>\n</dt>\n<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>\n</div>\n<div>\n<dt>\n<kbd>l</kbd>\n<kbd>h</kbd>\n</dt>\n<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>\n</div>\n<div>\n<dt>\n<kbd>g g</kbd>\n<kbd>G</kbd>\n</dt>\n<dd>first / last row</dd>\n</div>\n<div>\n<dt>\n<kbd>/</kbd>\n</dt>\n<dd>filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)</dd>\n</div>\n<div>\n<dt>\n<kbd>b</kbd>\n</dt>\n<dd>switch branch or tag</dd>\n</div>\n<div>\n<dt>\n<kbd>s</kbd>\n<kbd>t</kbd>\n<kbd>c</kbd>\n<kbd>r</kbd>\n<kbd>m</kbd>\n<kbd>i</kbd>\n</dt>\n<dd>tabs: summary, files, commits, branches &amp; tags, merge requests, issues</dd>\n</div>\n<div>\n<dt>\n<kbd>g h</kbd>\n</dt>\n<dd>home</dd>\n</div>\n<div>\n<dt>\n<kbd>w</kbd>\n</dt>\n<dd>wide mode: use the whole width of the screen, or not (remembered)</dd>\n</div>\n<div>\n<dt>\n<kbd>y</kbd>\n</dt>\n<dd>copy a permalink pinned to the commit</dd>\n</div>\n<div>\n<dt>\n<kbd>d</kbd>\n<kbd>u</kbd>\n<kbd>x</kbd>\n</dt>\n<dd>diff: split / unified / collapse or expand all</dd>\n</div>\n<div>\n<dt>\n<kbd>e</kbd>\n<kbd>E</kbd>\n</dt>\n<dd>diff: the whole file in view / every file, with the lines the hunks hide</dd>\n</div>\n<div>\n<dt>\n<kbd>n</kbd>\n</dt>\n<dd>merge request: next note in the diff</dd>\n</div>\n<div>\n<dt>\n<kbd>esc</kbd>\n</dt>\n<dd>close a dialog, leave a field</dd>\n</div>\n</dl>\n</dialog>\n<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()\">\n<div class=\"panel-head\">\n<label for=\"refs-filter\" class=\"sr\">filter branches and tags</label>\n<input id=\"refs-filter\" type=\"search\" placeholder=\"Switch branch or tag…\" autocomplete=\"off\" data-pick=\"#panel-refs li\" hx-on:input=\"ermite.filter(this)\">\n<button type=\"button\" class=\"panel-x\" aria-label=\"Close\" hx-on:click=\"closest('dialog').close()\">\n<kbd>esc</kbd>\n</button>\n</div>\n<div class=\"panel-cols\" data-picklist>\n<section aria-label=\"Branches\">\n<h2>Branches <span class=\"count\">2</span>\n</h2>\n<ul>\n<li>\n<a href=\"/files/tree/feature/x\">\n<span class=\"mark\" aria-hidden=\"true\">&nbsp;</span>feature/x</a>\n</li>\n<li>\n<a href=\"/files/tree/main\" aria-current=\"true\">\n<span class=\"mark\" aria-hidden=\"true\">●</span>main</a>\n</li>\n</ul>\n</section>\n<section aria-label=\"Tags\">\n<h2>Tags <span class=\"count\">1</span>\n</h2>\n<ul>\n<li>\n<a href=\"/files/tree/v1.0\">\n<span class=\"mark\" aria-hidden=\"true\">&nbsp;</span>v1.0</a>\n</li>\n</ul>\n</section>\n</div>\n</dialog>\n<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()\">\n<div class=\"panel-head\">\n<label for=\"cmd-q\" class=\"sr\">go to</label>\n<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)\">\n<button type=\"button\" class=\"panel-x\" aria-label=\"Close\" hx-on:click=\"closest('dialog').close()\">\n<kbd>esc</kbd>\n</button>\n</div>\n<ul id=\"cmd-list\" class=\"cmd-list\" role=\"listbox\" aria-label=\"Targets\">\n<li id=\"cmd-o0\" role=\"option\" aria-selected=\"true\" data-k=\"go home\" data-cursor>\n<a href=\"/\" tabindex=\"-1\">\n<span class=\"lbl\">home</span>\n<span class=\"k\">go</span>\n</a>\n</li>\n<li id=\"cmd-o1\" role=\"option\" aria-selected=\"false\" data-k=\"section summary\">\n<a href=\"/files\" tabindex=\"-1\">\n<span class=\"lbl\">summary</span>\n<span class=\"k\">section</span>\n</a>\n</li>\n<li id=\"cmd-o2\" role=\"option\" aria-selected=\"false\" data-k=\"section files\">\n<a href=\"/files/tree/main\" tabindex=\"-1\">\n<span class=\"lbl\">files</span>\n<span class=\"k\">section</span>\n</a>\n</li>\n<li id=\"cmd-o3\" role=\"option\" aria-selected=\"false\" data-k=\"section commits\">\n<a href=\"/files/commits/main\" tabindex=\"-1\">\n<span class=\"lbl\">commits</span>\n<span class=\"k\">section</span>\n</a>\n</li>\n<li id=\"cmd-o4\" role=\"option\" aria-selected=\"false\" data-k=\"section branches &amp; tags\">\n<a href=\"/files/refs\" tabindex=\"-1\">\n<span class=\"lbl\">branches &amp; tags</span>\n<span class=\"k\">section</span>\n</a>\n</li>\n<li id=\"cmd-o5\" role=\"option\" aria-selected=\"false\" data-k=\"section merge requests\">\n<a href=\"/files/merge-requests\" tabindex=\"-1\">\n<span class=\"lbl\">merge requests</span>\n<span class=\"k\">section</span>\n</a>\n</li>\n<li id=\"cmd-o6\" role=\"option\" aria-selected=\"false\" data-k=\"section actions\">\n<a href=\"/files/actions\" tabindex=\"-1\">\n<span class=\"lbl\">actions</span>\n<span class=\"k\">section</span>\n</a>\n</li>\n<li id=\"cmd-o7\" role=\"option\" aria-selected=\"false\" data-k=\"branch feature/x\">\n<a href=\"/files/tree/feature/x\" tabindex=\"-1\">\n<span class=\"lbl\">feature/x</span>\n<span class=\"k\">branch</span>\n</a>\n</li>\n<li id=\"cmd-o8\" role=\"option\" aria-selected=\"false\" data-k=\"branch main\">\n<a href=\"/files/tree/main\" tabindex=\"-1\">\n<span class=\"lbl\">main</span>\n<span class=\"k\">branch</span>\n</a>\n</li>\n<li id=\"cmd-o9\" role=\"option\" aria-selected=\"false\" data-k=\"tag v1.0\">\n<a href=\"/files/tree/v1.0\" tabindex=\"-1\">\n<span class=\"lbl\">v1.0</span>\n<span class=\"k\">tag</span>\n</a>\n</li>\n<li id=\"cmd-o10\" role=\"option\" aria-selected=\"false\" data-k=\"action turn single-key shortcuts on off keyboard\">\n<a href=\"#\" data-fire=\"keys\" tabindex=\"-1\">\n<span class=\"lbl\">turn single-key shortcuts off</span>\n<span class=\"k\">action</span>\n</a>\n</li>\n</ul>\n<p class=\"panel-foot\">\n<span>\n<kbd>↑</kbd>\n<kbd>↓</kbd> move</span>\n<span>\n<kbd>enter</kbd> open</span>\n<span>\n<kbd>esc</kbd> close</span>\n</p>\n</dialog>\n<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()\">\n</div>\n</body>\n</html>\n"
  439. Diff:
  440. --- Expected
  441. +++ Actual
  442. @@ -118,3 +118,3 @@
  443. <p>Run it.</p>
  444. -<pre>
  445. +<pre class="chroma">
  446. <code class="language-sh">make all
  447. Test: TestWebFilesGolden/blob-markdown
  448. Messages: blob-markdown
  449. --- FAIL: TestWebGolden (0.67s)
  450. --- FAIL: TestWebGolden/summary (0.06s)
  451. web_test.go:130:
  452. Error Trace: /__w/ermite/ermite/internal/app/web_test.go:104
  453. /__w/ermite/ermite/internal/app/web_test.go:130
  454. Error: Not equal:
  455. expected: "<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<meta name=\"color-scheme\" content=\"light dark\">\n<title>demo · example.test</title>\n<meta name=\"theme-color\" media=\"(prefers-color-scheme: light)\" content=\"#ffffff\">\n<meta name=\"theme-color\" media=\"(prefers-color-scheme: dark)\" content=\"#0c0c0c\">\n<meta name=\"apple-mobile-web-app-title\" content=\"ermite\">\n<link rel=\"icon\" type=\"image/svg+xml\" href=\"/-/static/img/icon.HASH.svg\">\n<link rel=\"apple-touch-icon\" href=\"/-/static/app/apple-touch-icon.HASH.png\">\n<link rel=\"manifest\" href=\"/-/static/app/manifest.HASH.webmanifest\">\n<link rel=\"preload\" href=\"/-/static/fonts/atkinson-next.HASH.woff2\" as=\"font\" type=\"font/woff2\" crossorigin>\n<link rel=\"stylesheet\" href=\"/-/static/css/ermite.HASH.css\">\n<meta name=\"htmx-config\" content='{\"history\":false,\"includeIndicatorCSS\":false,\"extensions\":\"sse, hx-live\"}'>\n<script src=\"/-/static/js/htmx.min.HASH.js\" defer>\n</script>\n<script src=\"/-/static/js/hx-live.min.HASH.js\" defer>\n</script>\n<script src=\"/-/static/js/hx-sse.min.HASH.js\" defer>\n</script>\n<script src=\"/-/static/js/store.HASH.js\">\n</script>\n<script src=\"/-/static/js/ermite.HASH.js\" defer>\n</script>\n<script src=\"/-/static/js/files.HASH.js\" defer>\n</script>\n<script src=\"/-/static/js/passkey.HASH.js\" defer>\n</script>\n<script src=\"/-/static/js/log.HASH.js\" defer>\n</script>\n</head>\n<body data-ref=\"main\" data-sha=\"SHA40\" data-sel=\"\" data-nav=\"\" data-paths=\"/demo/paths/SHA40\" data-blob=\"/demo/blob/main\">\n<a class=\"skip\" href=\"#main\">skip to content</a>\n<header class=\"hdr\">\n<div class=\"hdr-top\">\n<a class=\"brand\" href=\"/\" data-g=\"h\" aria-label=\"home\" title=\"home (g h)\">\n<span class=\"brand-mark\" aria-hidden=\"true\">\n</span>\n</a>\n<nav class=\"crumbs\" aria-label=\"Path\">\n<ol>\n<li>\n<a href=\"/demo\" aria-current=\"page\">demo</a>\n</li>\n</ol>\n</nav>\n<div class=\"hdr-acts\">\n<a class=\"btn ref\" href=\"/demo/refs\" data-fire=\"refs\" aria-keyshortcuts=\"b\" title=\"switch branch or tag (b)\">\n<span class=\"ico i-branch\" aria-hidden=\"true\">\n</span>\n<span class=\"ref-name\">main</span>\n<span class=\"sha\">SHA7</span>\n</a>\n<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\">\n<span class=\"ico i-search\" aria-hidden=\"true\">\n</span>\n<span class=\"search-label\">Go to…</span>\n<kbd aria-hidden=\"true\">ctrl k</kbd>\n</button>\n</div>\n</div>\n<nav class=\"tabs\" aria-label=\"Sections\">\n<ul>\n<li>\n<a href=\"/demo\" data-key=\"s\" aria-keyshortcuts=\"s\" aria-current=\"page\">Summary <kbd aria-hidden=\"true\">s</kbd>\n</a>\n</li>\n<li>\n<a href=\"/demo/tree/main\" data-key=\"t\" aria-keyshortcuts=\"t\">Files <kbd aria-hidden=\"true\">t</kbd>\n</a>\n</li>\n<li>\n<a href=\"/demo/commits/main\" data-key=\"c\" aria-keyshortcuts=\"c\">Commits <kbd aria-hidden=\"true\">c</kbd>\n</a>\n</li>\n<li>\n<a href=\"/demo/refs\" data-key=\"r\" aria-keyshortcuts=\"r\">Branches &amp; tags <kbd aria-hidden=\"true\">r</kbd>\n</a>\n</li>\n<li>\n<a href=\"/demo/merge-requests\" data-key=\"m\" aria-keyshortcuts=\"m\">Merge requests <kbd aria-hidden=\"true\">m</kbd>\n</a>\n</li>\n<li>\n<a href=\"/demo/actions\" data-key=\"a\" aria-keyshortcuts=\"a\">Actions <kbd aria-hidden=\"true\">a</kbd>\n</a>\n</li>\n</ul>\n</nav>\n</header>\n<div class=\"work has-rail\">\n<section class=\"work-lede\" aria-label=\"Description\">\n<p class=\"lede\">A demo repository</p>\n</section>\n<main id=\"main\" tabindex=\"-1\">\n<section class=\"card readme\" aria-labelledby=\"readme-h\">\n<h2 class=\"card-h\" id=\"readme-h\">\n<span class=\"ico i-file\" aria-hidden=\"true\">\n</span> README.md</h2>\n<article class=\"prose\" aria-label=\"README.md\" hx-ignore>\n<h1 id=\"md-demo\">Demo</h1>\n<p>A small <em>demo</em> with a <a href=\"/demo/blob/main/docs/guide.md\">guide</a> and <a href=\"https://example.org/x\" rel=\"nofollow noopener noreferrer\">the site</a>.</p>\n<h2 id=\"md-install\">Install</h2>\n<pre>\n<code class=\"language-sh\">go install example.org/demo@latest\n</code>\n</pre>\n<h2 id=\"md-usage\">Usage</h2>\n<table>\n<thead>\n<tr>\n<th>a</th>\n<th align=\"right\">b</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td align=\"right\">2</td>\n</tr>\n</tbody>\n</table>\n</article>\n</section>\n</main>\n<aside class=\"rail\" aria-label=\"Context\">\n<section aria-labelledby=\"r-clone\">\n<h2 id=\"r-clone\">Clone</h2>\n<div class=\"clone\" id=\"clone-demo\">\n<div class=\"clone-line\">\n<span class=\"mute\" aria-hidden=\"true\">$ </span>\n<code>git clone http://example.test/demo.git</code>\n<button type=\"button\" class=\"btn copy\" data-js data-label=\"Copy\" aria-label=\"copy: git clone http://example.test/demo.git\" hx-on:click=\"ermite.copy(this)\">Copy</button>\n</div>\n</div>\n</section>\n<section aria-labelledby=\"r-facts\">\n<h2 id=\"r-facts\">About</h2>\n<dl class=\"kv\">\n<dt>last push</dt>\n<dd id=\"last-push-demo\">\n<time datetime=\"STAMP\">AGO · STAMP</time>\n</dd>\n<dt>branch</dt>\n<dd>main · 2 branches</dd>\n<dt>created</dt>\n<dd>\n<time datetime=\"STAMP\">STAMP</time>\n</dd>\n<dt>latest tag</dt>\n<dd class=\"latest-tag\">\n<a class=\"tag-name\" href=\"/demo/tree/v0.2.0\" title=\"add main.go\">v0.2.0</a> · <time datetime=\"STAMP\" title=\"STAMP\">AGO</time> · <a class=\"all-tags\" href=\"/demo/refs\">2 tags</a>\n</dd>\n</dl>\n</section>\n<section aria-labelledby=\"r-recent\">\n<h2 id=\"r-recent\">Recent commits <a href=\"/demo/commits/main\">View all</a>\n</h2>\n<table class=\"list commits\" aria-label=\"Commits\">\n<tbody data-rows>\n<tr data-cursor>\n<td class=\"c-sha mute\">SHA7</td>\n<td class=\"c-subject\">\n<a href=\"/demo/commit/SHA40\">add main.go</a>\n<span class=\"pill\">main</span>\n<span class=\"pill tag\">\n<span class=\"sr\">tag </span>v0.2.0</span>\n</td>\n<td class=\"c-ck\">\n</td>\n<td class=\"c-who dim\">T</td>\n<td class=\"c-when nowrap dim\">\n<time datetime=\"STAMP\" title=\"STAMP\">AGO</time>\n</td>\n</tr>\n<tr>\n<td class=\"c-sha mute\">SHA7</td>\n<td class=\"c-subject\">\n<a href=\"/demo/commit/SHA40\">first commit</a>\n<span class=\"pill tag\">\n<span class=\"sr\">tag </span>v0.1.0</span>\n</td>\n<td class=\"c-ck\">\n</td>\n<td class=\"c-who dim\">T</td>\n<td class=\"c-when nowrap dim\">\n<time datetime=\"STAMP\" title=\"STAMP\">AGO</time>\n</td>\n</tr>\n</tbody>\n</table>\n</section>\n<section id=\"recent-actions\" aria-labelledby=\"r-actions\" hidden>\n<h2 id=\"r-actions\">Recent actions <a href=\"/demo/actions\">View all</a>\n</h2>\n<ul class=\"rruns\">\n</ul>\n</section>\n<section aria-labelledby=\"r-outline\">\n<h2 id=\"r-outline\">On this page</h2>\n<nav class=\"outline\" aria-label=\"Outline\">\n<a class=\"l1\" href=\"#md-demo\">Demo</a>\n<a class=\"l2\" href=\"#md-install\">Install</a>\n<a class=\"l2\" href=\"#md-usage\">Usage</a>\n</nav>\n</section>\n</aside>\n</div>\n<footer class=\"foot\">\n<span>ermite devel</span>\n<a href=\"http://example.test/ermite\" rel=\"noopener\" title=\"source of this version (AGPL-3.0-or-later)\">source</a>\n<button type=\"button\" class=\"foot-keys\" data-js data-fire=\"help\" aria-haspopup=\"dialog\" aria-controls=\"panel-help\" aria-keyshortcuts=\"?\">\n<kbd aria-hidden=\"true\">?</kbd> keyboard shortcuts</button>\n</footer>\n<div class=\"hint\" role=\"status\" aria-live=\"polite\">\n<span class=\"hint-nav\" :text=\"document.body.dataset.nav || ''\">\n</span>\n<span class=\"hint-sel\" :text=\"document.body.dataset.sel ? document.body.dataset.sel + ' · y permalink' : ''\">\n</span>\n<span class=\"hint-flash\" :text=\"document.body.dataset.flash || ''\">\n</span>\n<span class=\"hint-live\" data-state=\"connecting\" hx-sse:connect=\"/-/events?topic=repo%3Ademo&amp;view=summary\" 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 mr-head -> ermiteMR.headChanged();\n gap -> ermiteLive.reload()\">\n</span>\n</div>\n<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()\">\n<div class=\"panel-head\">\n<h2>Keyboard shortcuts</h2>\n<button type=\"button\" class=\"panel-x\" aria-label=\"Close\" hx-on:click=\"closest('dialog').close()\">\n<kbd>esc</kbd> close</button>\n</div>\n<div class=\"keys-pref\">\n<label>\n<input type=\"checkbox\" id=\"keys-off\" aria-describedby=\"keys-note\" hx-on:change=\"ermite.setKeysOff(this.checked)\"> Turn off single-key shortcuts</label>\n<p id=\"keys-note\" class=\"dim\">Single-key shortcuts are on. ctrl k and esc work whatever this says.</p>\n</div>\n<dl class=\"keys\">\n<div>\n<dt>\n<kbd>ctrl k</kbd>\n<kbd>:</kbd>\n</dt>\n<dd>go to a section, branch, tag, file or repository</dd>\n</div>\n<div>\n<dt>\n<kbd>?</kbd>\n</dt>\n<dd>this list</dd>\n</div>\n<div>\n<dt>\n<kbd>j</kbd>\n<kbd>k</kbd>\n</dt>\n<dd>move the row cursor down / up</dd>\n</div>\n<div>\n<dt>\n<kbd>enter</kbd>\n</dt>\n<dd>open the row under the cursor; on Files, a directory opens or closes in place</dd>\n</div>\n<div>\n<dt>\n<kbd>↑</kbd>\n<kbd>↓</kbd>\n<kbd>←</kbd>\n<kbd>→</kbd>\n<kbd>home</kbd>\n<kbd>end</kbd>\n</dt>\n<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>\n</div>\n<div>\n<dt>\n<kbd>l</kbd>\n<kbd>h</kbd>\n</dt>\n<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>\n</div>\n<div>\n<dt>\n<kbd>g g</kbd>\n<kbd>G</kbd>\n</dt>\n<dd>first / last row</dd>\n</div>\n<div>\n<dt>\n<kbd>/</kbd>\n</dt>\n<dd>filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)</dd>\n</div>\n<div>\n<dt>\n<kbd>b</kbd>\n</dt>\n<dd>switch branch or tag</dd>\n</div>\n<div>\n<dt>\n<kbd>s</kbd>\n<kbd>t</kbd>\n<kbd>c</kbd>\n<kbd>r</kbd>\n<kbd>m</kbd>\n<kbd>i</kbd>\n</dt>\n<dd>tabs: summary, files, commits, branches &amp; tags, merge requests, issues</dd>\n</div>\n<div>\n<dt>\n<kbd>g h</kbd>\n</dt>\n<dd>home</dd>\n</div>\n<div>\n<dt>\n<kbd>w</kbd>\n</dt>\n<dd>wide mode: use the whole width of the screen, or not (remembered)</dd>\n</div>\n<div>\n<dt>\n<kbd>y</kbd>\n</dt>\n<dd>copy a permalink pinned to the commit</dd>\n</div>\n<div>\n<dt>\n<kbd>d</kbd>\n<kbd>u</kbd>\n<kbd>x</kbd>\n</dt>\n<dd>diff: split / unified / collapse or expand all</dd>\n</div>\n<div>\n<dt>\n<kbd>e</kbd>\n<kbd>E</kbd>\n</dt>\n<dd>diff: the whole file in view / every file, with the lines the hunks hide</dd>\n</div>\n<div>\n<dt>\n<kbd>n</kbd>\n</dt>\n<dd>merge request: next note in the diff</dd>\n</div>\n<div>\n<dt>\n<kbd>esc</kbd>\n</dt>\n<dd>close a dialog, leave a field</dd>\n</div>\n</dl>\n</dialog>\n<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()\">\n<div class=\"panel-head\">\n<label for=\"refs-filter\" class=\"sr\">filter branches and tags</label>\n<input id=\"refs-filter\" type=\"search\" placeholder=\"Switch branch or tag…\" autocomplete=\"off\" data-pick=\"#panel-refs li\" hx-on:input=\"ermite.filter(this)\">\n<button type=\"button\" class=\"panel-x\" aria-label=\"Close\" hx-on:click=\"closest('dialog').close()\">\n<kbd>esc</kbd>\n</button>\n</div>\n<div class=\"panel-cols\" data-picklist>\n<section aria-label=\"Branches\">\n<h2>Branches <span class=\"count\">2</span>\n</h2>\n<ul>\n<li>\n<a href=\"/demo/tree/feature/x\">\n<span class=\"mark\" aria-hidden=\"true\">&nbsp;</span>feature/x</a>\n</li>\n<li>\n<a href=\"/demo/tree/main\" aria-current=\"true\">\n<span class=\"mark\" aria-hidden=\"true\">●</span>main</a>\n</li>\n</ul>\n</section>\n<section aria-label=\"Tags\">\n<h2>Tags <span class=\"count\">2</span>\n</h2>\n<ul>\n<li>\n<a href=\"/demo/tree/v0.1.0\">\n<span class=\"mark\" aria-hidden=\"true\">&nbsp;</span>v0.1.0</a>\n</li>\n<li>\n<a href=\"/demo/tree/v0.2.0\">\n<span class=\"mark\" aria-hidden=\"true\">&nbsp;</span>v0.2.0</a>\n</li>\n</ul>\n</section>\n</div>\n</dialog>\n<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()\">\n<div class=\"panel-head\">\n<label for=\"cmd-q\" class=\"sr\">go to</label>\n<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)\">\n<button type=\"button\" class=\"panel-x\" aria-label=\"Close\" hx-on:click=\"closest('dialog').close()\">\n<kbd>esc</kbd>\n</button>\n</div>\n<ul id=\"cmd-list\" class=\"cmd-list\" role=\"listbox\" aria-label=\"Targets\">\n<li id=\"cmd-o0\" role=\"option\" aria-selected=\"true\" data-k=\"go home\" data-cursor>\n<a href=\"/\" tabindex=\"-1\">\n<span class=\"lbl\">home</span>\n<span class=\"k\">go</span>\n</a>\n</li>\n<li id=\"cmd-o1\" role=\"option\" aria-selected=\"false\" data-k=\"section summary\">\n<a href=\"/demo\" tabindex=\"-1\">\n<span class=\"lbl\">summary</span>\n<span class=\"k\">section</span>\n</a>\n</li>\n<li id=\"cmd-o2\" role=\"option\" aria-selected=\"false\" data-k=\"section files\">\n<a href=\"/demo/tree/main\" tabindex=\"-1\">\n<span class=\"lbl\">files</span>\n<span class=\"k\">section</span>\n</a>\n</li>\n<li id=\"cmd-o3\" role=\"option\" aria-selected=\"false\" data-k=\"section commits\">\n<a href=\"/demo/commits/main\" tabindex=\"-1\">\n<span class=\"lbl\">commits</span>\n<span class=\"k\">section</span>\n</a>\n</li>\n<li id=\"cmd-o4\" role=\"option\" aria-selected=\"false\" data-k=\"section branches &amp; tags\">\n<a href=\"/demo/refs\" tabindex=\"-1\">\n<span class=\"lbl\">branches &amp; tags</span>\n<span class=\"k\">section</span>\n</a>\n</li>\n<li id=\"cmd-o5\" role=\"option\" aria-selected=\"false\" data-k=\"section merge requests\">\n<a href=\"/demo/merge-requests\" tabindex=\"-1\">\n<span class=\"lbl\">merge requests</span>\n<span class=\"k\">section</span>\n</a>\n</li>\n<li id=\"cmd-o6\" role=\"option\" aria-selected=\"false\" data-k=\"section actions\">\n<a href=\"/demo/actions\" tabindex=\"-1\">\n<span class=\"lbl\">actions</span>\n<span class=\"k\">section</span>\n</a>\n</li>\n<li id=\"cmd-o7\" role=\"option\" aria-selected=\"false\" data-k=\"branch feature/x\">\n<a href=\"/demo/tree/feature/x\" tabindex=\"-1\">\n<span class=\"lbl\">feature/x</span>\n<span class=\"k\">branch</span>\n</a>\n</li>\n<li id=\"cmd-o8\" role=\"option\" aria-selected=\"false\" data-k=\"branch main\">\n<a href=\"/demo/tree/main\" tabindex=\"-1\">\n<span class=\"lbl\">main</span>\n<span class=\"k\">branch</span>\n</a>\n</li>\n<li id=\"cmd-o9\" role=\"option\" aria-selected=\"false\" data-k=\"tag v0.1.0\">\n<a href=\"/demo/tree/v0.1.0\" tabindex=\"-1\">\n<span class=\"lbl\">v0.1.0</span>\n<span class=\"k\">tag</span>\n</a>\n</li>\n<li id=\"cmd-o10\" role=\"option\" aria-selected=\"false\" data-k=\"tag v0.2.0\">\n<a href=\"/demo/tree/v0.2.0\" tabindex=\"-1\">\n<span class=\"lbl\">v0.2.0</span>\n<span class=\"k\">tag</span>\n</a>\n</li>\n<li id=\"cmd-o11\" role=\"option\" aria-selected=\"false\" data-k=\"repo quiet\">\n<a href=\"/quiet\" tabindex=\"-1\">\n<span class=\"lbl\">quiet</span>\n<span class=\"k\">repo</span>\n</a>\n</li>\n<li id=\"cmd-o12\" role=\"option\" aria-selected=\"false\" data-k=\"action turn single-key shortcuts on off keyboard\">\n<a href=\"#\" data-fire=\"keys\" tabindex=\"-1\">\n<span class=\"lbl\">turn single-key shortcuts off</span>\n<span class=\"k\">action</span>\n</a>\n</li>\n</ul>\n<p class=\"panel-foot\">\n<span>\n<kbd>↑</kbd>\n<kbd>↓</kbd> move</span>\n<span>\n<kbd>enter</kbd> open</span>\n<span>\n<kbd>esc</kbd> close</span>\n</p>\n</dialog>\n<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()\">\n</div>\n</body>\n</html>\n"
  456. actual : "<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<meta name=\"color-scheme\" content=\"light dark\">\n<title>demo · example.test</title>\n<meta name=\"theme-color\" media=\"(prefers-color-scheme: light)\" content=\"#ffffff\">\n<meta name=\"theme-color\" media=\"(prefers-color-scheme: dark)\" content=\"#0c0c0c\">\n<meta name=\"apple-mobile-web-app-title\" content=\"ermite\">\n<link rel=\"icon\" type=\"image/svg+xml\" href=\"/-/static/img/icon.HASH.svg\">\n<link rel=\"apple-touch-icon\" href=\"/-/static/app/apple-touch-icon.HASH.png\">\n<link rel=\"manifest\" href=\"/-/static/app/manifest.HASH.webmanifest\">\n<link rel=\"preload\" href=\"/-/static/fonts/atkinson-next.HASH.woff2\" as=\"font\" type=\"font/woff2\" crossorigin>\n<link rel=\"stylesheet\" href=\"/-/static/css/ermite.HASH.css\">\n<meta name=\"htmx-config\" content='{\"history\":false,\"includeIndicatorCSS\":false,\"extensions\":\"sse, hx-live\"}'>\n<script src=\"/-/static/js/htmx.min.HASH.js\" defer>\n</script>\n<script src=\"/-/static/js/hx-live.min.HASH.js\" defer>\n</script>\n<script src=\"/-/static/js/hx-sse.min.HASH.js\" defer>\n</script>\n<script src=\"/-/static/js/store.HASH.js\">\n</script>\n<script src=\"/-/static/js/ermite.HASH.js\" defer>\n</script>\n<script src=\"/-/static/js/files.HASH.js\" defer>\n</script>\n<script src=\"/-/static/js/passkey.HASH.js\" defer>\n</script>\n<script src=\"/-/static/js/log.HASH.js\" defer>\n</script>\n</head>\n<body data-ref=\"main\" data-sha=\"SHA40\" data-sel=\"\" data-nav=\"\" data-paths=\"/demo/paths/SHA40\" data-blob=\"/demo/blob/main\">\n<a class=\"skip\" href=\"#main\">skip to content</a>\n<header class=\"hdr\">\n<div class=\"hdr-top\">\n<a class=\"brand\" href=\"/\" data-g=\"h\" aria-label=\"home\" title=\"home (g h)\">\n<span class=\"brand-mark\" aria-hidden=\"true\">\n</span>\n</a>\n<nav class=\"crumbs\" aria-label=\"Path\">\n<ol>\n<li>\n<a href=\"/demo\" aria-current=\"page\">demo</a>\n</li>\n</ol>\n</nav>\n<div class=\"hdr-acts\">\n<a class=\"btn ref\" href=\"/demo/refs\" data-fire=\"refs\" aria-keyshortcuts=\"b\" title=\"switch branch or tag (b)\">\n<span class=\"ico i-branch\" aria-hidden=\"true\">\n</span>\n<span class=\"ref-name\">main</span>\n<span class=\"sha\">SHA7</span>\n</a>\n<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\">\n<span class=\"ico i-search\" aria-hidden=\"true\">\n</span>\n<span class=\"search-label\">Go to…</span>\n<kbd aria-hidden=\"true\">ctrl k</kbd>\n</button>\n</div>\n</div>\n<nav class=\"tabs\" aria-label=\"Sections\">\n<ul>\n<li>\n<a href=\"/demo\" data-key=\"s\" aria-keyshortcuts=\"s\" aria-current=\"page\">Summary <kbd aria-hidden=\"true\">s</kbd>\n</a>\n</li>\n<li>\n<a href=\"/demo/tree/main\" data-key=\"t\" aria-keyshortcuts=\"t\">Files <kbd aria-hidden=\"true\">t</kbd>\n</a>\n</li>\n<li>\n<a href=\"/demo/commits/main\" data-key=\"c\" aria-keyshortcuts=\"c\">Commits <kbd aria-hidden=\"true\">c</kbd>\n</a>\n</li>\n<li>\n<a href=\"/demo/refs\" data-key=\"r\" aria-keyshortcuts=\"r\">Branches &amp; tags <kbd aria-hidden=\"true\">r</kbd>\n</a>\n</li>\n<li>\n<a href=\"/demo/merge-requests\" data-key=\"m\" aria-keyshortcuts=\"m\">Merge requests <kbd aria-hidden=\"true\">m</kbd>\n</a>\n</li>\n<li>\n<a href=\"/demo/actions\" data-key=\"a\" aria-keyshortcuts=\"a\">Actions <kbd aria-hidden=\"true\">a</kbd>\n</a>\n</li>\n</ul>\n</nav>\n</header>\n<div class=\"work has-rail\">\n<section class=\"work-lede\" aria-label=\"Description\">\n<p class=\"lede\">A demo repository</p>\n</section>\n<main id=\"main\" tabindex=\"-1\">\n<section class=\"card readme\" aria-labelledby=\"readme-h\">\n<h2 class=\"card-h\" id=\"readme-h\">\n<span class=\"ico i-file\" aria-hidden=\"true\">\n</span> README.md</h2>\n<article class=\"prose\" aria-label=\"README.md\" hx-ignore>\n<h1 id=\"md-demo\">Demo</h1>\n<p>A small <em>demo</em> with a <a href=\"/demo/blob/main/docs/guide.md\">guide</a> and <a href=\"https://example.org/x\" rel=\"nofollow noopener noreferrer\">the site</a>.</p>\n<h2 id=\"md-install\">Install</h2>\n<pre class=\"chroma\">\n<code class=\"language-sh\">go install example.org/demo@latest\n</code>\n</pre>\n<h2 id=\"md-usage\">Usage</h2>\n<table>\n<thead>\n<tr>\n<th>a</th>\n<th align=\"right\">b</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td align=\"right\">2</td>\n</tr>\n</tbody>\n</table>\n</article>\n</section>\n</main>\n<aside class=\"rail\" aria-label=\"Context\">\n<section aria-labelledby=\"r-clone\">\n<h2 id=\"r-clone\">Clone</h2>\n<div class=\"clone\" id=\"clone-demo\">\n<div class=\"clone-line\">\n<span class=\"mute\" aria-hidden=\"true\">$ </span>\n<code>git clone http://example.test/demo.git</code>\n<button type=\"button\" class=\"btn copy\" data-js data-label=\"Copy\" aria-label=\"copy: git clone http://example.test/demo.git\" hx-on:click=\"ermite.copy(this)\">Copy</button>\n</div>\n</div>\n</section>\n<section aria-labelledby=\"r-facts\">\n<h2 id=\"r-facts\">About</h2>\n<dl class=\"kv\">\n<dt>last push</dt>\n<dd id=\"last-push-demo\">\n<time datetime=\"STAMP\">AGO · STAMP</time>\n</dd>\n<dt>branch</dt>\n<dd>main · 2 branches</dd>\n<dt>created</dt>\n<dd>\n<time datetime=\"STAMP\">STAMP</time>\n</dd>\n<dt>latest tag</dt>\n<dd class=\"latest-tag\">\n<a class=\"tag-name\" href=\"/demo/tree/v0.2.0\" title=\"add main.go\">v0.2.0</a> · <time datetime=\"STAMP\" title=\"STAMP\">AGO</time> · <a class=\"all-tags\" href=\"/demo/refs\">2 tags</a>\n</dd>\n</dl>\n</section>\n<section aria-labelledby=\"r-recent\">\n<h2 id=\"r-recent\">Recent commits <a href=\"/demo/commits/main\">View all</a>\n</h2>\n<table class=\"list commits\" aria-label=\"Commits\">\n<tbody data-rows>\n<tr data-cursor>\n<td class=\"c-sha mute\">SHA7</td>\n<td class=\"c-subject\">\n<a href=\"/demo/commit/SHA40\">add main.go</a>\n<span class=\"pill\">main</span>\n<span class=\"pill tag\">\n<span class=\"sr\">tag </span>v0.2.0</span>\n</td>\n<td class=\"c-ck\">\n</td>\n<td class=\"c-who dim\">T</td>\n<td class=\"c-when nowrap dim\">\n<time datetime=\"STAMP\" title=\"STAMP\">AGO</time>\n</td>\n</tr>\n<tr>\n<td class=\"c-sha mute\">SHA7</td>\n<td class=\"c-subject\">\n<a href=\"/demo/commit/SHA40\">first commit</a>\n<span class=\"pill tag\">\n<span class=\"sr\">tag </span>v0.1.0</span>\n</td>\n<td class=\"c-ck\">\n</td>\n<td class=\"c-who dim\">T</td>\n<td class=\"c-when nowrap dim\">\n<time datetime=\"STAMP\" title=\"STAMP\">AGO</time>\n</td>\n</tr>\n</tbody>\n</table>\n</section>\n<section id=\"recent-actions\" aria-labelledby=\"r-actions\" hidden>\n<h2 id=\"r-actions\">Recent actions <a href=\"/demo/actions\">View all</a>\n</h2>\n<ul class=\"rruns\">\n</ul>\n</section>\n<section aria-labelledby=\"r-outline\">\n<h2 id=\"r-outline\">On this page</h2>\n<nav class=\"outline\" aria-label=\"Outline\">\n<a class=\"l1\" href=\"#md-demo\">Demo</a>\n<a class=\"l2\" href=\"#md-install\">Install</a>\n<a class=\"l2\" href=\"#md-usage\">Usage</a>\n</nav>\n</section>\n</aside>\n</div>\n<footer class=\"foot\">\n<span>ermite devel</span>\n<a href=\"http://example.test/ermite\" rel=\"noopener\" title=\"source of this version (AGPL-3.0-or-later)\">source</a>\n<button type=\"button\" class=\"foot-keys\" data-js data-fire=\"help\" aria-haspopup=\"dialog\" aria-controls=\"panel-help\" aria-keyshortcuts=\"?\">\n<kbd aria-hidden=\"true\">?</kbd> keyboard shortcuts</button>\n</footer>\n<div class=\"hint\" role=\"status\" aria-live=\"polite\">\n<span class=\"hint-nav\" :text=\"document.body.dataset.nav || ''\">\n</span>\n<span class=\"hint-sel\" :text=\"document.body.dataset.sel ? document.body.dataset.sel + ' · y permalink' : ''\">\n</span>\n<span class=\"hint-flash\" :text=\"document.body.dataset.flash || ''\">\n</span>\n<span class=\"hint-live\" data-state=\"connecting\" hx-sse:connect=\"/-/events?topic=repo%3Ademo&amp;view=summary\" 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 mr-head -> ermiteMR.headChanged();\n gap -> ermiteLive.reload()\">\n</span>\n</div>\n<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()\">\n<div class=\"panel-head\">\n<h2>Keyboard shortcuts</h2>\n<button type=\"button\" class=\"panel-x\" aria-label=\"Close\" hx-on:click=\"closest('dialog').close()\">\n<kbd>esc</kbd> close</button>\n</div>\n<div class=\"keys-pref\">\n<label>\n<input type=\"checkbox\" id=\"keys-off\" aria-describedby=\"keys-note\" hx-on:change=\"ermite.setKeysOff(this.checked)\"> Turn off single-key shortcuts</label>\n<p id=\"keys-note\" class=\"dim\">Single-key shortcuts are on. ctrl k and esc work whatever this says.</p>\n</div>\n<dl class=\"keys\">\n<div>\n<dt>\n<kbd>ctrl k</kbd>\n<kbd>:</kbd>\n</dt>\n<dd>go to a section, branch, tag, file or repository</dd>\n</div>\n<div>\n<dt>\n<kbd>?</kbd>\n</dt>\n<dd>this list</dd>\n</div>\n<div>\n<dt>\n<kbd>j</kbd>\n<kbd>k</kbd>\n</dt>\n<dd>move the row cursor down / up</dd>\n</div>\n<div>\n<dt>\n<kbd>enter</kbd>\n</dt>\n<dd>open the row under the cursor; on Files, a directory opens or closes in place</dd>\n</div>\n<div>\n<dt>\n<kbd>↑</kbd>\n<kbd>↓</kbd>\n<kbd>←</kbd>\n<kbd>→</kbd>\n<kbd>home</kbd>\n<kbd>end</kbd>\n</dt>\n<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>\n</div>\n<div>\n<dt>\n<kbd>l</kbd>\n<kbd>h</kbd>\n</dt>\n<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>\n</div>\n<div>\n<dt>\n<kbd>g g</kbd>\n<kbd>G</kbd>\n</dt>\n<dd>first / last row</dd>\n</div>\n<div>\n<dt>\n<kbd>/</kbd>\n</dt>\n<dd>filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)</dd>\n</div>\n<div>\n<dt>\n<kbd>b</kbd>\n</dt>\n<dd>switch branch or tag</dd>\n</div>\n<div>\n<dt>\n<kbd>s</kbd>\n<kbd>t</kbd>\n<kbd>c</kbd>\n<kbd>r</kbd>\n<kbd>m</kbd>\n<kbd>i</kbd>\n</dt>\n<dd>tabs: summary, files, commits, branches &amp; tags, merge requests, issues</dd>\n</div>\n<div>\n<dt>\n<kbd>g h</kbd>\n</dt>\n<dd>home</dd>\n</div>\n<div>\n<dt>\n<kbd>w</kbd>\n</dt>\n<dd>wide mode: use the whole width of the screen, or not (remembered)</dd>\n</div>\n<div>\n<dt>\n<kbd>y</kbd>\n</dt>\n<dd>copy a permalink pinned to the commit</dd>\n</div>\n<div>\n<dt>\n<kbd>d</kbd>\n<kbd>u</kbd>\n<kbd>x</kbd>\n</dt>\n<dd>diff: split / unified / collapse or expand all</dd>\n</div>\n<div>\n<dt>\n<kbd>e</kbd>\n<kbd>E</kbd>\n</dt>\n<dd>diff: the whole file in view / every file, with the lines the hunks hide</dd>\n</div>\n<div>\n<dt>\n<kbd>n</kbd>\n</dt>\n<dd>merge request: next note in the diff</dd>\n</div>\n<div>\n<dt>\n<kbd>esc</kbd>\n</dt>\n<dd>close a dialog, leave a field</dd>\n</div>\n</dl>\n</dialog>\n<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()\">\n<div class=\"panel-head\">\n<label for=\"refs-filter\" class=\"sr\">filter branches and tags</label>\n<input id=\"refs-filter\" type=\"search\" placeholder=\"Switch branch or tag…\" autocomplete=\"off\" data-pick=\"#panel-refs li\" hx-on:input=\"ermite.filter(this)\">\n<button type=\"button\" class=\"panel-x\" aria-label=\"Close\" hx-on:click=\"closest('dialog').close()\">\n<kbd>esc</kbd>\n</button>\n</div>\n<div class=\"panel-cols\" data-picklist>\n<section aria-label=\"Branches\">\n<h2>Branches <span class=\"count\">2</span>\n</h2>\n<ul>\n<li>\n<a href=\"/demo/tree/feature/x\">\n<span class=\"mark\" aria-hidden=\"true\">&nbsp;</span>feature/x</a>\n</li>\n<li>\n<a href=\"/demo/tree/main\" aria-current=\"true\">\n<span class=\"mark\" aria-hidden=\"true\">●</span>main</a>\n</li>\n</ul>\n</section>\n<section aria-label=\"Tags\">\n<h2>Tags <span class=\"count\">2</span>\n</h2>\n<ul>\n<li>\n<a href=\"/demo/tree/v0.1.0\">\n<span class=\"mark\" aria-hidden=\"true\">&nbsp;</span>v0.1.0</a>\n</li>\n<li>\n<a href=\"/demo/tree/v0.2.0\">\n<span class=\"mark\" aria-hidden=\"true\">&nbsp;</span>v0.2.0</a>\n</li>\n</ul>\n</section>\n</div>\n</dialog>\n<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()\">\n<div class=\"panel-head\">\n<label for=\"cmd-q\" class=\"sr\">go to</label>\n<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)\">\n<button type=\"button\" class=\"panel-x\" aria-label=\"Close\" hx-on:click=\"closest('dialog').close()\">\n<kbd>esc</kbd>\n</button>\n</div>\n<ul id=\"cmd-list\" class=\"cmd-list\" role=\"listbox\" aria-label=\"Targets\">\n<li id=\"cmd-o0\" role=\"option\" aria-selected=\"true\" data-k=\"go home\" data-cursor>\n<a href=\"/\" tabindex=\"-1\">\n<span class=\"lbl\">home</span>\n<span class=\"k\">go</span>\n</a>\n</li>\n<li id=\"cmd-o1\" role=\"option\" aria-selected=\"false\" data-k=\"section summary\">\n<a href=\"/demo\" tabindex=\"-1\">\n<span class=\"lbl\">summary</span>\n<span class=\"k\">section</span>\n</a>\n</li>\n<li id=\"cmd-o2\" role=\"option\" aria-selected=\"false\" data-k=\"section files\">\n<a href=\"/demo/tree/main\" tabindex=\"-1\">\n<span class=\"lbl\">files</span>\n<span class=\"k\">section</span>\n</a>\n</li>\n<li id=\"cmd-o3\" role=\"option\" aria-selected=\"false\" data-k=\"section commits\">\n<a href=\"/demo/commits/main\" tabindex=\"-1\">\n<span class=\"lbl\">commits</span>\n<span class=\"k\">section</span>\n</a>\n</li>\n<li id=\"cmd-o4\" role=\"option\" aria-selected=\"false\" data-k=\"section branches &amp; tags\">\n<a href=\"/demo/refs\" tabindex=\"-1\">\n<span class=\"lbl\">branches &amp; tags</span>\n<span class=\"k\">section</span>\n</a>\n</li>\n<li id=\"cmd-o5\" role=\"option\" aria-selected=\"false\" data-k=\"section merge requests\">\n<a href=\"/demo/merge-requests\" tabindex=\"-1\">\n<span class=\"lbl\">merge requests</span>\n<span class=\"k\">section</span>\n</a>\n</li>\n<li id=\"cmd-o6\" role=\"option\" aria-selected=\"false\" data-k=\"section actions\">\n<a href=\"/demo/actions\" tabindex=\"-1\">\n<span class=\"lbl\">actions</span>\n<span class=\"k\">section</span>\n</a>\n</li>\n<li id=\"cmd-o7\" role=\"option\" aria-selected=\"false\" data-k=\"branch feature/x\">\n<a href=\"/demo/tree/feature/x\" tabindex=\"-1\">\n<span class=\"lbl\">feature/x</span>\n<span class=\"k\">branch</span>\n</a>\n</li>\n<li id=\"cmd-o8\" role=\"option\" aria-selected=\"false\" data-k=\"branch main\">\n<a href=\"/demo/tree/main\" tabindex=\"-1\">\n<span class=\"lbl\">main</span>\n<span class=\"k\">branch</span>\n</a>\n</li>\n<li id=\"cmd-o9\" role=\"option\" aria-selected=\"false\" data-k=\"tag v0.1.0\">\n<a href=\"/demo/tree/v0.1.0\" tabindex=\"-1\">\n<span class=\"lbl\">v0.1.0</span>\n<span class=\"k\">tag</span>\n</a>\n</li>\n<li id=\"cmd-o10\" role=\"option\" aria-selected=\"false\" data-k=\"tag v0.2.0\">\n<a href=\"/demo/tree/v0.2.0\" tabindex=\"-1\">\n<span class=\"lbl\">v0.2.0</span>\n<span class=\"k\">tag</span>\n</a>\n</li>\n<li id=\"cmd-o11\" role=\"option\" aria-selected=\"false\" data-k=\"repo quiet\">\n<a href=\"/quiet\" tabindex=\"-1\">\n<span class=\"lbl\">quiet</span>\n<span class=\"k\">repo</span>\n</a>\n</li>\n<li id=\"cmd-o12\" role=\"option\" aria-selected=\"false\" data-k=\"action turn single-key shortcuts on off keyboard\">\n<a href=\"#\" data-fire=\"keys\" tabindex=\"-1\">\n<span class=\"lbl\">turn single-key shortcuts off</span>\n<span class=\"k\">action</span>\n</a>\n</li>\n</ul>\n<p class=\"panel-foot\">\n<span>\n<kbd>↑</kbd>\n<kbd>↓</kbd> move</span>\n<span>\n<kbd>enter</kbd> open</span>\n<span>\n<kbd>esc</kbd> close</span>\n</p>\n</dialog>\n<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()\">\n</div>\n</body>\n</html>\n"
  457. Diff:
  458. --- Expected
  459. +++ Actual
  460. @@ -105,3 +105,3 @@
  461. <h2 id="md-install">Install</h2>
  462. -<pre>
  463. +<pre class="chroma">
  464. <code class="language-sh">go install example.org/demo@latest
  465. Test: TestWebGolden/summary
  466. Messages: summary
  467. FAIL
  468. FAIL bnema.dev/ermite/internal/app 348.025s
  469. FAIL
  470. Process completed with exit code 1.
  471. Post job cleanup.
  472. ##[command]/usr/bin/docker exec 2685a3b7d5bc898f1a993e0824e7022609ce5446c6135f7d94b4e628acea4784 sh -c "cat /etc/*release | grep ^ID"
  473. [command]/usr/sbin/git version
  474. git version 2.56.0
  475. Copying '/github/home/.gitconfig' to '/__w/_temp/fb0a62b8-4d19-433b-a7b0-43f9dce3ad6d/.gitconfig'
  476. Temporarily overriding HOME='/__w/_temp/fb0a62b8-4d19-433b-a7b0-43f9dce3ad6d' before making global git config changes
  477. Adding repository directory to the temporary git global config as a safe directory
  478. [command]/usr/sbin/git config --global --add safe.directory /__w/ermite/ermite
  479. Removing SSH command configuration
  480. [command]/usr/sbin/git config --local --name-only --get-regexp core\.sshCommand
  481. [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' || :"
  482. Removing HTTP extra header
  483. [command]/usr/sbin/git config --local --name-only --get-regexp http\.http\:\/\/ermite\:7341\/\.extraheader
  484. [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' || :"
  485. Removing includeIf entries pointing to credentials config files
  486. [command]/usr/sbin/git config --local --name-only --get-regexp ^includeIf\.gitdir:
  487. includeif.gitdir:/__w/ermite/ermite/.git.path
  488. includeif.gitdir:/__w/ermite/ermite/.git/worktrees/*.path
  489. includeif.gitdir:/github/workspace/.git.path
  490. includeif.gitdir:/github/workspace/.git/worktrees/*.path
  491. [command]/usr/sbin/git config --local --get-all includeif.gitdir:/__w/ermite/ermite/.git.path
  492. /__w/_temp/git-credentials-376b0ed0-54d0-4b8c-b080-c7690bb9b4d8.config
  493. [command]/usr/sbin/git config --local --unset includeif.gitdir:/__w/ermite/ermite/.git.path /__w/_temp/git-credentials-376b0ed0-54d0-4b8c-b080-c7690bb9b4d8.config
  494. [command]/usr/sbin/git config --local --get-all includeif.gitdir:/__w/ermite/ermite/.git/worktrees/*.path
  495. /__w/_temp/git-credentials-376b0ed0-54d0-4b8c-b080-c7690bb9b4d8.config
  496. [command]/usr/sbin/git config --local --unset includeif.gitdir:/__w/ermite/ermite/.git/worktrees/*.path /__w/_temp/git-credentials-376b0ed0-54d0-4b8c-b080-c7690bb9b4d8.config
  497. [command]/usr/sbin/git config --local --get-all includeif.gitdir:/github/workspace/.git.path
  498. /github/runner_temp/git-credentials-376b0ed0-54d0-4b8c-b080-c7690bb9b4d8.config
  499. [command]/usr/sbin/git config --local --unset includeif.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-376b0ed0-54d0-4b8c-b080-c7690bb9b4d8.config
  500. [command]/usr/sbin/git config --local --get-all includeif.gitdir:/github/workspace/.git/worktrees/*.path
  501. /github/runner_temp/git-credentials-376b0ed0-54d0-4b8c-b080-c7690bb9b4d8.config
  502. [command]/usr/sbin/git config --local --unset includeif.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-376b0ed0-54d0-4b8c-b080-c7690bb9b4d8.config
  503. [command]/usr/sbin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url
  504. Removing credentials config '/__w/_temp/git-credentials-376b0ed0-54d0-4b8c-b080-c7690bb9b4d8.config'
  505. Stop and remove container: d7e1c0d28c9a4aaf90caf1bb3055cbc2_archlinuxlatest_c0a55a
  506. ##[command]/usr/bin/docker rm --force 2685a3b7d5bc898f1a993e0824e7022609ce5446c6135f7d94b4e628acea4784
  507. 2685a3b7d5bc898f1a993e0824e7022609ce5446c6135f7d94b4e628acea4784
  508. Remove container network: github_network_ff90e690ec3449658fbfee3264fdc8b0
  509. ##[command]/usr/bin/docker network rm github_network_ff90e690ec3449658fbfee3264fdc8b0
  510. github_network_ff90e690ec3449658fbfee3264fdc8b0
  511. Cleaning up orphan processes
  512. ##[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 3

Tags 41

↑↓ moveenter openesc close