main 6a915d6

Test failure 11m 20s

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=423db7"
  23. ##[command]/usr/bin/docker network prune --force --filter "label=423db7"
  24. Create local container network
  25. ##[command]/usr/bin/docker network create --label 423db7 github_network_40ce9edffbdd4c32a84ae386508ecceb
  26. 9e2a100c8b932d41021bebca4a3478d056c6b3c2ad057a69712b3bd55ad40a64
  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: Download complete
  34. 7450fb54bb4f: Pull complete
  35. e4c7c6c5e741: Pull complete
  36. Digest: sha256:e43f1fd80e073992c5f173efbbbf65144170bf60aeb7369940087d63eacea8f4
  37. Status: Downloaded newer image for archlinux:latest
  38. docker.io/library/archlinux:latest
  39. ##[command]/usr/bin/docker create --name 41d7e15d96cb476cacaaf7eba549d051_archlinuxlatest_dabbed --label 423db7 --workdir /__w/ermite/ermite --network github_network_40ce9edffbdd4c32a84ae386508ecceb -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"
  40. ddeb508ec991c698a2592c005268363fe5fe06647e528108dd30975998168e67
  41. ##[command]/usr/bin/docker start ddeb508ec991c698a2592c005268363fe5fe06647e528108dd30975998168e67
  42. ddeb508ec991c698a2592c005268363fe5fe06647e528108dd30975998168e67
  43. ##[command]/usr/bin/docker ps --all --filter id=ddeb508ec991c698a2592c005268363fe5fe06647e528108dd30975998168e67 --filter status=running --no-trunc --format "{{.ID}} {{.Status}}"
  44. ddeb508ec991c698a2592c005268363fe5fe06647e528108dd30975998168e67 Up Less than a second
  45. ##[command]/usr/bin/docker inspect --format "{{range .Config.Env}}{{println .}}{{end}}" ddeb508ec991c698a2592c005268363fe5fe06647e528108dd30975998168e67
  46. HOME=/github/home
  47. GITHUB_ACTIONS=true
  48. CI=true
  49. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  50. LANG=C.UTF-8
  51. Waiting for all services to be ready
  52. Run pacman -Syu --noconfirm --needed git gcc openssh nodejs
  53. <U+001B>[36;1mpacman -Syu --noconfirm --needed git gcc openssh nodejs<U+001B>[0m
  54. shell: sh -e {0}
  55. env:
  56. GOWORK: off
  57. :: Synchronizing package databases...
  58. core downloading...
  59. extra downloading...
  60. :: Starting full system upgrade...
  61. resolving dependencies...
  62. looking for conflicting packages...
  63. Package (25) Old Version New Version Net Change Download Size
  64. extra/abseil-cpp 20260817.0-2 7.15 MiB 1.35 MiB
  65. extra/ada 4.0.0-1 0.95 MiB 0.31 MiB
  66. extra/c-ares 1.34.8-1 0.53 MiB 0.23 MiB
  67. core/ca-certificates-mozilla 3.131-1 3.131.1-1 -0.01 MiB 0.37 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: 125.26 MiB
  90. Total Installed Size: 485.67 MiB
  91. Net Upgrade Size: 432.35 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. ca-certificates-mozilla-3.131.1-1-x86_64 downloading...
  108. dbus-1.16.2-2-x86_64 downloading...
  109. ada-4.0.0-1-x86_64 downloading...
  110. libuv-1.52.1-2-x86_64 downloading...
  111. c-ares-1.34.8-1-x86_64 downloading...
  112. libedit-20260512_3.1-1-x86_64 downloading...
  113. zlib-ng-2.3.3-1-x86_64 downloading...
  114. libmpc-1.4.1-1-x86_64 downloading...
  115. perl-timedate-2.35-1-any downloading...
  116. perl-mailtools-2.22-3-any downloading...
  117. perl-error-0.17030-3-any downloading...
  118. systemd-sysvcompat-262.1-1-x86_64 downloading...
  119. checking keyring...
  120. checking package integrity...
  121. loading package files...
  122. checking for file conflicts...
  123. :: Processing package changes...
  124. upgrading linux-api-headers...
  125. installing db5.3...
  126. installing perl...
  127. installing perl-error...
  128. installing perl-timedate...
  129. installing perl-mailtools...
  130. installing zlib-ng...
  131. upgrading systemd-libs...
  132. upgrading ca-certificates-mozilla...
  133. installing git...
  134. Optional dependencies for git
  135. git-zsh-completion: upstream zsh completion
  136. tk: gitk and git gui
  137. openssh: ssh transport and crypto [pending]
  138. man: show help with `git command --help`
  139. perl-libwww: git svn
  140. perl-term-readkey: git svn and interactive.singlekey setting
  141. perl-io-socket-ssl: git send-email TLS support
  142. perl-authen-sasl: git send-email TLS support
  143. perl-cgi: gitweb (web interface) support
  144. python: git svn & git p4
  145. subversion: git svn
  146. org.freedesktop.secrets: keyring credential helper
  147. libsecret: libsecret credential helper [installed]
  148. less: the default pager for git
  149. installing libisl...
  150. installing libmpc...
  151. installing gcc...
  152. Optional dependencies for gcc
  153. lib32-gcc-libs: for generating code for 32-bit ABI
  154. installing libedit...
  155. installing openssh...
  156. Optional dependencies for openssh
  157. libfido2: FIDO/U2F support
  158. sh: for ssh-copy-id and findssl.sh [installed]
  159. x11-ssh-askpass: input passphrase in X
  160. xorg-xauth: X11 forwarding
  161. installing gtest...
  162. Optional dependencies for gtest
  163. python: gmock generator
  164. installing abseil-cpp...
  165. installing ada...
  166. installing c-ares...
  167. installing libuv...
  168. installing simdjson...
  169. installing nodejs...
  170. Optional dependencies for nodejs
  171. npm: nodejs package manager
  172. upgrading dbus...
  173. upgrading systemd...
  174. Creating group 'git' with GID 969.
  175. Creating user 'git' (git daemon user) with UID 969 and GID 969.
  176. upgrading systemd-sysvcompat...
  177. :: Running post-transaction hooks...
  178. ( 1/13) Creating system user accounts...
  179. ( 2/13) Creating temporary files...
  180. /usr/lib/tmpfiles.d/journal-nocow.conf:26: Failed to resolve specifier: uninitialized /etc/ detected, skipping.
  181. All rules containing unresolvable specifiers will be skipped.
  182. ( 3/13) Updating journal message catalog...
  183. ( 4/13) Updating udev hardware database...
  184. ( 5/13) Applying kernel sysctl settings...
  185. Skipped: Current root is not booted.
  186. ( 6/13) Reloading system manager configuration...
  187. Skipped: Current root is not booted.
  188. ( 7/13) Reloading user manager configuration...
  189. Skipped: Current root is not booted.
  190. ( 8/13) Enqueuing marked services...
  191. Skipped: Current root is not booted.
  192. ( 9/13) Reloading device manager configuration...
  193. Skipped: Current root is not booted.
  194. (10/13) Arming ConditionNeedsUpdate...
  195. (11/13) Rebuilding certificate stores...
  196. (12/13) Reloading system bus configuration...
  197. Skipped: Current root is not booted.
  198. (13/13) Checking for old perl modules...
  199. Run actions/checkout@v6
  200. with:
  201. repository: bnema/ermite
  202. token: ***
  203. ssh-strict: true
  204. ssh-user: git
  205. persist-credentials: true
  206. clean: true
  207. sparse-checkout-cone-mode: true
  208. fetch-depth: 1
  209. fetch-tags: false
  210. show-progress: true
  211. lfs: false
  212. submodules: false
  213. set-safe-directory: true
  214. allow-unsafe-pr-checkout: false
  215. env:
  216. GOWORK: off
  217. ##[command]/usr/bin/docker exec ddeb508ec991c698a2592c005268363fe5fe06647e528108dd30975998168e67 sh -c "cat /etc/*release | grep ^ID"
  218. Syncing repository: bnema/ermite
  219. Getting Git version info
  220. Working directory is '/__w/ermite/ermite'
  221. [command]/usr/sbin/git version
  222. git version 2.56.0
  223. Temporarily overriding HOME='/__w/_temp/e5dff91e-c635-4c1c-b4d8-17f89fa80cbd' before making global git config changes
  224. Adding repository directory to the temporary git global config as a safe directory
  225. [command]/usr/sbin/git config --global --add safe.directory /__w/ermite/ermite
  226. Deleting the contents of '/__w/ermite/ermite'
  227. Determining repository object format
  228. Initializing the repository
  229. [command]/usr/sbin/git init /__w/ermite/ermite
  230. hint: Using 'master' as the name for the initial branch. This default branch name
  231. hint: will change to "main" in Git 3.0. To configure the initial branch name
  232. hint: to use in all of your new repositories, which will suppress this warning,
  233. hint: call:
  234. hint:
  235. hint: git config --global init.defaultBranch <name>
  236. hint:
  237. hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
  238. hint: 'development'. The just-created branch can be renamed via this command:
  239. hint:
  240. hint: git branch -m <name>
  241. hint:
  242. hint: Disable this message with "git config set advice.defaultBranchName false"
  243. Initialized empty Git repository in /__w/ermite/ermite/.git/
  244. [command]/usr/sbin/git remote add origin http://ermite:7341/bnema/ermite
  245. Disabling automatic garbage collection
  246. [command]/usr/sbin/git config --local gc.auto 0
  247. Setting up auth
  248. Removing SSH command configuration
  249. [command]/usr/sbin/git config --local --name-only --get-regexp core\.sshCommand
  250. [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' || :"
  251. Removing HTTP extra header
  252. [command]/usr/sbin/git config --local --name-only --get-regexp http\.http\:\/\/ermite\:7341\/\.extraheader
  253. [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' || :"
  254. Removing includeIf entries pointing to credentials config files
  255. [command]/usr/sbin/git config --local --name-only --get-regexp ^includeIf\.gitdir:
  256. [command]/usr/sbin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url
  257. [command]/usr/sbin/git config --file /__w/_temp/git-credentials-7cf399f0-81f6-410c-a48a-32ca42282e5d.config http.http://ermite:7341/.extraheader AUTHORIZATION: basic ***
  258. [command]/usr/sbin/git config --local includeIf.gitdir:/__w/ermite/ermite/.git.path /__w/_temp/git-credentials-7cf399f0-81f6-410c-a48a-32ca42282e5d.config
  259. [command]/usr/sbin/git config --local includeIf.gitdir:/__w/ermite/ermite/.git/worktrees/*.path /__w/_temp/git-credentials-7cf399f0-81f6-410c-a48a-32ca42282e5d.config
  260. [command]/usr/sbin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-7cf399f0-81f6-410c-a48a-32ca42282e5d.config
  261. [command]/usr/sbin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-7cf399f0-81f6-410c-a48a-32ca42282e5d.config
  262. Fetching the repository
  263. [command]/usr/sbin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --depth=1 origin +4bec9a08f1d16de05320cc93a6cc759e32faa7a4:refs/remotes/origin/main
  264. From http://ermite:7341/bnema/ermite
  265. * [new ref] 4bec9a08f1d16de05320cc93a6cc759e32faa7a4 -> origin/main
  266. [command]/usr/sbin/git branch --list --remote origin/main
  267. origin/main
  268. [command]/usr/sbin/git rev-parse refs/remotes/origin/main
  269. 4bec9a08f1d16de05320cc93a6cc759e32faa7a4
  270. Determining the checkout info
  271. [command]/usr/sbin/git sparse-checkout disable
  272. [command]/usr/sbin/git config --local --unset-all extensions.worktreeConfig
  273. Checking out the ref
  274. [command]/usr/sbin/git checkout --progress --force -B main refs/remotes/origin/main
  275. Switched to a new branch 'main'
  276. branch 'main' set up to track 'origin/main'.
  277. [command]/usr/sbin/git log -1 --format=%H
  278. 4bec9a08f1d16de05320cc93a6cc759e32faa7a4
  279. Run git config --global --add safe.directory "$GITHUB_WORKSPACE"
  280. <U+001B>[36;1mgit config --global --add safe.directory "$GITHUB_WORKSPACE"<U+001B>[0m
  281. shell: sh -e {0}
  282. env:
  283. GOWORK: off
  284. Run actions/setup-go@v5
  285. with:
  286. go-version-file: go.mod
  287. cache: true
  288. check-latest: false
  289. env:
  290. GOWORK: off
  291. ##[command]/usr/bin/docker exec ddeb508ec991c698a2592c005268363fe5fe06647e528108dd30975998168e67 sh -c "cat /etc/*release | grep ^ID"
  292. Setup go version spec 1.27.1
  293. Attempting to download 1.27.1...
  294. (node:709) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
  295. (Use `node --trace-deprecation ...` to show where the warning was created)
  296. matching 1.27.1...
  297. 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
  298. Extracting Go...
  299. [command]/usr/sbin/tar xz --warning=no-unknown-keyword --overwrite -C /__w/_temp/acc4f977-dfc8-4688-9378-3613583d3a3d -f /__w/_temp/a7c8c01b-acd3-452a-9147-b319d85ca119
  300. Successfully extracted go to /__w/_temp/acc4f977-dfc8-4688-9378-3613583d3a3d
  301. Adding to the cache ...
  302. Successfully cached go to /__t/go/1.27.1/x64
  303. Added go to the path
  304. Successfully set up Go version 1.27.1
  305. [command]/__t/go/1.27.1/x64/bin/go env GOMODCACHE
  306. [command]/__t/go/1.27.1/x64/bin/go env GOCACHE
  307. /github/home/go/pkg/mod
  308. /github/home/.cache/go-build
  309. Cache is not found
  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-build1047086837=/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. go: downloading github.com/bnema/hexcheck v0.4.0
  378. go: downloading github.com/bufbuild/buf v1.73.0
  379. go: downloading google.golang.org/protobuf v1.36.12
  380. go: downloading github.com/vektra/mockery/v3 v3.8.0
  381. go: downloading github.com/a-h/templ v0.3.1020
  382. go: downloading github.com/air-verse/air v1.67.4
  383. go: downloading github.com/stretchr/testify v1.12.1
  384. go: downloading bnema.dev/ermite-api v0.13.0
  385. go: downloading bnema.dev/ermite-git v0.1.0
  386. go: downloading connectrpc.com/connect v1.21.0
  387. go: downloading github.com/bnema/zerowrap v1.4.1
  388. go: downloading golang.org/x/sys v0.49.0
  389. go: downloading bnema.dev/ermite-kv v0.1.0
  390. go: downloading golang.org/x/crypto v0.57.0
  391. go: downloading google.golang.org/genproto/googleapis/rpc v0.0.0-20260904194346-d0f1323225a4
  392. go: downloading github.com/go-webauthn/webauthn v0.18.2
  393. go: downloading github.com/ProtonMail/go-crypto v1.4.1
  394. go: downloading github.com/descope/virtualwebauthn v1.0.5
  395. go: downloading github.com/alecthomas/chroma/v2 v2.27.0
  396. go: downloading github.com/bnema/kvconf v0.1.2
  397. go: downloading github.com/spf13/cobra v1.10.2
  398. go: downloading github.com/yuin/goldmark v1.8.6
  399. go: downloading golang.org/x/term v0.46.0
  400. go: downloading golang.org/x/text v0.42.0
  401. go: downloading github.com/golang-jwt/jwt/v5 v5.3.1
  402. go: downloading bnema.dev/ermite-actions v0.2.0
  403. go: downloading golang.org/x/tools v0.51.0
  404. go: downloading buf.build/go/app v0.2.1-0.20260824172350-b0e76892c61a
  405. go: downloading go.yaml.in/yaml/v3 v3.0.5
  406. go: downloading github.com/fatih/color v1.18.0
  407. go: downloading buf.build/go/bufplugin v0.10.0
  408. go: downloading buf.build/go/standard v0.1.1-0.20260325175353-2b287e071df5
  409. go: downloading github.com/rs/zerolog v1.35.1
  410. go: downloading gopkg.in/natefinch/lumberjack.v2 v2.2.1
  411. go: downloading github.com/stretchr/objx v0.5.3
  412. go: downloading github.com/go-viper/mapstructure/v2 v2.5.0
  413. go: downloading github.com/go-webauthn/x v0.3.1
  414. go: downloading github.com/google/go-tpm v0.9.8
  415. go: downloading github.com/google/uuid v1.6.0
  416. go: downloading github.com/tinylib/msgp v1.6.4
  417. go: downloading github.com/fxamacker/cbor/v2 v2.9.4
  418. go: downloading github.com/inconshreveable/mousetrap v1.1.0
  419. go: downloading github.com/spf13/pflag v1.0.10
  420. go: downloading github.com/dlclark/regexp2/v2 v2.2.1
  421. go: downloading github.com/google/go-cmp v0.7.0
  422. go: downloading go.uber.org/mock v0.6.0
  423. go: downloading github.com/alecthomas/assert/v2 v2.11.0
  424. go: downloading github.com/alecthomas/repr v0.5.2
  425. go: downloading gopkg.in/yaml.v3 v3.0.1
  426. go: downloading buf.build/go/interrupt v1.1.0
  427. go: downloading github.com/jedib0t/go-pretty/v6 v6.7.8
  428. go: downloading github.com/knadh/koanf/parsers/yaml v1.1.0
  429. go: downloading github.com/knadh/koanf/providers/structs v1.0.0
  430. go: downloading github.com/knadh/koanf/v2 v2.3.2
  431. go: downloading golang.org/x/sync v0.23.0
  432. go: downloading github.com/natefinch/atomic v1.0.1
  433. go: downloading github.com/cenkalti/backoff/v4 v4.3.0
  434. go: downloading github.com/cli/browser v1.3.0
  435. go: downloading github.com/fsnotify/fsnotify v1.9.0
  436. go: downloading dario.cat/mergo v1.0.2
  437. go: downloading github.com/andybalholm/brotli v1.2.0
  438. go: downloading github.com/gohugoio/hugo v0.164.0
  439. go: downloading github.com/joho/godotenv v1.5.1
  440. go: downloading github.com/pelletier/go-toml v1.9.5
  441. go: downloading github.com/google/go-containerregistry v0.22.1
  442. go: downloading buf.build/gen/go/bufbuild/registry/protocolbuffers/go v1.36.12-20260831211851-b4432e12a6e7.2
  443. go: downloading github.com/quic-go/quic-go v0.62.0
  444. go: downloading connectrpc.com/grpcreflect v1.3.0
  445. go: downloading github.com/bufbuild/protocompile v0.14.2-0.20260910151042-7436f7c76201
  446. go: downloading go.lsp.dev/jsonrpc2 v0.10.0
  447. go: downloading buf.build/go/bufprivateusage v0.1.0
  448. go: downloading connectrpc.com/otelconnect v0.9.0
  449. go: downloading github.com/bufbuild/protoplugin v0.0.0-20260414125817-25d1d281b46b
  450. go: downloading buf.build/go/protovalidate v1.4.0
  451. go: downloading buf.build/go/protoyaml v0.7.0
  452. go: downloading github.com/mattn/go-colorable v0.1.15
  453. go: downloading github.com/mattn/go-isatty v0.0.24
  454. go: downloading buf.build/gen/go/bufbuild/bufplugin/protocolbuffers/go v1.36.12-20260722160903-4d94f3df3a7b.2
  455. go: downloading pluginrpc.com/pluginrpc v0.5.0
  456. go: downloading buf.build/gen/go/bufbuild/protodescriptor/protocolbuffers/go v1.36.12-20250109164928-1da0de137947.2
  457. go: downloading buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.12-20260825204119-511051f7f437.2
  458. go: downloading github.com/klauspost/compress v1.20.0
  459. go: downloading github.com/x448/float16 v0.8.4
  460. go: downloading github.com/philhofer/fwd v1.2.0
  461. go: downloading github.com/cloudflare/circl v1.6.2
  462. go: downloading github.com/hexops/gotextdiff v1.0.3
  463. go: downloading github.com/cpuguy83/go-md2man/v2 v2.0.7
  464. go: downloading gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c
  465. go: downloading github.com/fatih/structs v1.1.0
  466. go: downloading github.com/knadh/koanf/maps v0.1.2
  467. go: downloading github.com/mitchellh/copystructure v1.2.0
  468. go: downloading github.com/brunoga/deep v1.3.1
  469. go: downloading github.com/knadh/koanf/providers/env v1.1.0
  470. go: downloading github.com/knadh/koanf/providers/file v1.2.1
  471. go: downloading github.com/knadh/koanf/providers/posflag v1.0.1
  472. go: downloading github.com/xeipuuv/gojsonschema v1.2.0
  473. go: downloading golang.org/x/mod v0.41.0
  474. go: downloading github.com/jhump/protoreflect/v2 v2.0.0-beta.2
  475. go: downloading golang.org/x/net v0.59.0
  476. go: downloading github.com/a-h/parse v0.0.0-20250122154542-74294addb73e
  477. go: downloading github.com/mattn/go-runewidth v0.0.19
  478. go: downloading buf.build/go/spdx v0.2.0
  479. go: downloading github.com/moby/moby/api v1.56.0
  480. go: downloading github.com/moby/moby/client v0.6.0
  481. go: downloading github.com/jdx/go-netrc v1.0.0
  482. go: downloading github.com/xyproto/randomstring v1.0.5
  483. go: downloading github.com/opencontainers/go-digest v1.0.0
  484. go: downloading github.com/docker/cli v29.8.0+incompatible
  485. go: downloading github.com/rs/cors v1.11.1
  486. go: downloading buf.build/gen/go/bufbuild/registry/connectrpc/go v1.20.0-20260831211851-b4432e12a6e7.1
  487. go: downloading github.com/tetratelabs/wazero v1.12.0
  488. go: downloading cel.dev/cel-go v0.32.0
  489. go: downloading go.lsp.dev/protocol v0.12.0
  490. go: downloading go.lsp.dev/uri v0.3.0
  491. go: downloading go.uber.org/zap v1.28.0
  492. go: downloading mvdan.cc/xurls/v2 v2.6.0
  493. go: downloading github.com/quic-go/go-ossfuzz-seeds v0.1.0
  494. go: downloading github.com/quic-go/qpack v0.6.0
  495. go: downloading github.com/segmentio/encoding v0.5.4
  496. go: downloading github.com/gofrs/flock v0.13.1
  497. go: downloading go.opentelemetry.io/otel v1.46.0
  498. go: downloading go.opentelemetry.io/otel/metric v1.46.0
  499. go: downloading go.opentelemetry.io/otel/trace v1.46.0
  500. go: downloading go.opentelemetry.io/otel/sdk v1.46.0
  501. go: downloading go.opentelemetry.io/otel/sdk/metric v1.46.0
  502. go: downloading github.com/brianvoe/gofakeit/v6 v6.28.0
  503. go: downloading github.com/rodaine/protogofakeit v0.1.1
  504. go: downloading github.com/frankban/quicktest v1.14.6
  505. go: downloading buf.build/gen/go/pluginrpc/pluginrpc/protocolbuffers/go v1.36.12-20241007202033-cf42259fcbfc.2
  506. go: downloading github.com/google/go-tpm-tools v0.3.13-0.20230620182252-4639ecce2aba
  507. go: downloading github.com/russross/blackfriday/v2 v2.1.0
  508. go: downloading github.com/kr/pretty v0.3.1
  509. go: downloading github.com/mitchellh/reflectwalk v1.0.2
  510. go: downloading github.com/huandu/xstrings v1.5.0
  511. go: downloading golang.org/x/exp v0.0.0-20260824195058-e88cd73687aa
  512. go: downloading github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415
  513. go: downloading github.com/klauspost/pgzip v1.2.6
  514. go: downloading github.com/clipperhouse/uax29/v2 v2.6.0
  515. go: downloading github.com/Microsoft/go-winio v0.6.2
  516. go: downloading github.com/containerd/errdefs v1.0.0
  517. go: downloading github.com/containerd/errdefs/pkg v0.3.0
  518. go: downloading github.com/distribution/reference v0.6.0
  519. go: downloading github.com/docker/go-connections v0.8.1
  520. go: downloading github.com/opencontainers/image-spec v1.1.1
  521. go: downloading go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.71.0
  522. go: downloading gotest.tools/v3 v3.5.2
  523. go: downloading github.com/moby/docker-image-spec v1.3.1
  524. go: downloading github.com/sirupsen/logrus v1.10.2
  525. go: downloading github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2
  526. go: downloading cel.dev/expr v0.25.3
  527. go: downloading google.golang.org/genproto/googleapis/api v0.0.0-20260904194346-d0f1323225a4
  528. go: downloading go.lsp.dev/pkg v0.0.0-20210717090340-384b27a52fb2
  529. go: downloading go.uber.org/multierr v1.11.0
  530. go: downloading go.uber.org/goleak v1.3.0
  531. go: downloading github.com/segmentio/asm v1.2.1
  532. go: downloading github.com/go-logr/logr v1.4.4
  533. go: downloading github.com/go-logr/stdr v1.2.2
  534. go: downloading github.com/bep/godartsass/v2 v2.5.0
  535. go: downloading github.com/bep/golibsass v1.2.0
  536. go: downloading github.com/pelletier/go-toml/v2 v2.4.3
  537. go: downloading github.com/spf13/afero v1.15.0
  538. go: downloading github.com/tdewolff/parse/v2 v2.8.12
  539. go: downloading github.com/petermattis/goid v0.0.0-20260820044319-269ab09b5261
  540. go: downloading github.com/tidwall/btree v1.8.1
  541. go: downloading github.com/bmatcuk/doublestar/v4 v4.10.0
  542. go: downloading github.com/protocolbuffers/protoscope v0.0.0-20221109213918-8e7a6aafa2c9
  543. go: downloading github.com/rivo/uniseg v0.4.7
  544. go: downloading github.com/kr/text v0.2.0
  545. go: downloading github.com/rogpeppe/go-internal v1.15.0
  546. go: downloading github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb
  547. go: downloading github.com/docker/go-units v0.5.0
  548. go: downloading pgregory.net/rapid v1.2.0
  549. go: downloading github.com/felixge/httpsnoop v1.1.0
  550. go: downloading github.com/docker/docker-credential-helpers v0.9.9
  551. go: downloading github.com/antlr4-go/antlr/v4 v4.13.1
  552. go: downloading go.opentelemetry.io/auto/sdk v1.2.1
  553. go: downloading github.com/cespare/xxhash/v2 v2.3.0
  554. go: downloading github.com/tdewolff/test v1.0.12
  555. go: downloading github.com/bits-and-blooms/bitset v1.24.5
  556. go: downloading github.com/gobwas/glob v0.2.3
  557. go: downloading github.com/spf13/cast v1.10.0
  558. go: downloading github.com/gohugoio/hashstructure v0.6.0
  559. go: downloading github.com/bep/debounce v1.2.1
  560. go: downloading github.com/bep/gitmap v1.9.0
  561. go: downloading github.com/bep/helpers v0.12.0
  562. go: downloading github.com/bep/logg v0.4.0
  563. go: downloading github.com/gobuffalo/flect v1.0.3
  564. go: downloading github.com/gohugoio/go-radix v1.2.0
  565. go: downloading github.com/hairyhenderson/go-codeowners v0.7.0
  566. go: downloading github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c
  567. go: downloading github.com/bep/lazycache v0.8.1
  568. go: downloading github.com/BurntSushi/locker v0.0.0-20171006230638-a6e239ea1c69
  569. go: downloading github.com/gohugoio/httpcache v0.8.0
  570. go: downloading github.com/bep/clocks v0.5.0
  571. go: downloading github.com/bep/golocales v0.2.0
  572. go: downloading github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58
  573. go: downloading github.com/jdkato/prose v1.2.1
  574. go: downloading github.com/kyokomi/emoji/v2 v2.2.13
  575. go: downloading github.com/olekukonko/tablewriter v1.1.4
  576. go: downloading github.com/bep/overlayfs v0.11.0
  577. go: downloading github.com/evanw/esbuild v0.28.1
  578. go: downloading github.com/bep/textandbinarywriter v0.1.0
  579. go: downloading github.com/gohugoio/go-i18n/v2 v2.1.3-0.20251018145728-cfcc22d823c6
  580. go: downloading github.com/clbanning/mxj/v2 v2.7.0
  581. go: downloading github.com/goccy/go-yaml v1.19.2
  582. go: downloading github.com/niklasfasching/go-org v1.9.1
  583. go: downloading github.com/gohugoio/gift v0.2.0
  584. go: downloading github.com/marekm4/color-extractor v1.2.1
  585. go: downloading github.com/pkg/errors v0.9.1
  586. go: downloading github.com/hashicorp/golang-lru/v2 v2.0.7
  587. go: downloading github.com/tdewolff/minify/v2 v2.24.13
  588. go: downloading github.com/bep/imagemeta v0.17.2
  589. go: downloading github.com/makeworld-the-better-one/dither/v2 v2.4.0
  590. go: downloading github.com/muesli/smartcrop v0.3.0
  591. go: downloading golang.org/x/image v0.43.0
  592. go: downloading github.com/olekukonko/ll v0.1.6
  593. go: downloading github.com/olekukonko/errors v1.2.0
  594. go: downloading github.com/gohugoio/hugo-goldmark-extensions/extras v0.7.0
  595. go: downloading github.com/gohugoio/hugo-goldmark-extensions/passthrough v0.5.0
  596. go: downloading github.com/microcosm-cc/bluemonday v1.0.27
  597. go: downloading github.com/yuin/goldmark-emoji v1.0.6
  598. go: downloading github.com/bep/tmc v0.6.0
  599. go: downloading github.com/bep/goat v0.5.0
  600. go: downloading rsc.io/qr v0.2.0
  601. go: downloading github.com/getkin/kin-openapi v0.140.0
  602. go: downloading github.com/JohannesKaufmann/html-to-markdown/v2 v2.5.2
  603. go: downloading github.com/bep/goportabletext v0.2.0
  604. go: downloading github.com/clipperhouse/displaywidth v0.10.0
  605. go: downloading github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6
  606. go: downloading github.com/aymerick/douceur v0.2.0
  607. go: downloading github.com/JohannesKaufmann/dom v0.3.1
  608. go: downloading github.com/gorilla/css v1.0.1
  609. go: downloading github.com/santhosh-tekuri/jsonschema/v6 v6.0.2
  610. go: downloading github.com/oasdiff/yaml v0.1.0
  611. go: downloading github.com/go-openapi/jsonpointer v0.22.5
  612. go: downloading github.com/oasdiff/yaml3 v0.0.13
  613. go: downloading github.com/go-openapi/swag/jsonname v0.25.5
  614. Run scripts/templ-drift.sh
  615. <U+001B>[36;1mscripts/templ-drift.sh<U+001B>[0m
  616. shell: sh -e {0}
  617. env:
  618. GOWORK: off
  619. (✓) Post-generation event received, processing... [ updates=0 needsRestart=true needsBrowserReload=true ]
  620. (✓) Complete [ updates=0 duration=214.299041ms ]
  621. Run go vet ./...
  622. <U+001B>[36;1mgo vet ./...<U+001B>[0m
  623. shell: sh -e {0}
  624. env:
  625. GOWORK: off
  626. Run go test -race $(go list ./... | grep -vx 'bnema.dev/ermite/internal/app')
  627. <U+001B>[36;1mgo test -race $(go list ./... | grep -vx 'bnema.dev/ermite/internal/app')<U+001B>[0m
  628. shell: sh -e {0}
  629. env:
  630. GOWORK: off
  631. ? bnema.dev/ermite/cmd/ermite [no test files]
  632. ? bnema.dev/ermite/gen/ermite/storage [no test files]
  633. ok bnema.dev/ermite/internal/adapters/ciartifacts 1.041s
  634. ok bnema.dev/ermite/internal/adapters/cilogs 1.055s
  635. ok bnema.dev/ermite/internal/adapters/cisummaries 1.079s
  636. ok bnema.dev/ermite/internal/adapters/client 1.218s
  637. ok bnema.dev/ermite/internal/adapters/ermitegit 124.662s
  638. ok bnema.dev/ermite/internal/adapters/eventbus 1.033s
  639. ok bnema.dev/ermite/internal/adapters/gitcli 17.941s
  640. ok bnema.dev/ermite/internal/adapters/githttp 4.039s
  641. ok bnema.dev/ermite/internal/adapters/githubapi 1.326s
  642. ok bnema.dev/ermite/internal/adapters/githubraw 1.024s
  643. ok bnema.dev/ermite/internal/adapters/gitpush 1.589s
  644. ok bnema.dev/ermite/internal/adapters/gitremote 3.300s
  645. ok bnema.dev/ermite/internal/adapters/httpserver 1.317s
  646. ok bnema.dev/ermite/internal/adapters/kvstore 2.372s
  647. ? bnema.dev/ermite/internal/adapters/oidchttp [no test files]
  648. ok bnema.dev/ermite/internal/adapters/rpc 1.134s
  649. ok bnema.dev/ermite/internal/adapters/secretbox 1.032s
  650. ok bnema.dev/ermite/internal/adapters/sigverify 3.428s
  651. ok bnema.dev/ermite/internal/adapters/sshsig 1.043s
  652. ok bnema.dev/ermite/internal/adapters/web 51.374s
  653. ok bnema.dev/ermite/internal/adapters/webauthn 1.106s
  654. ok bnema.dev/ermite/internal/boundary 1.234s
  655. ok bnema.dev/ermite/internal/clientlimit 2.559s
  656. ok bnema.dev/ermite/internal/config 1.029s
  657. ok bnema.dev/ermite/internal/domain 3.806s
  658. ? bnema.dev/ermite/internal/ports [no test files]
  659. ? bnema.dev/ermite/internal/ports/mocks [no test files]
  660. ? bnema.dev/ermite/internal/readertest [no test files]
  661. ok bnema.dev/ermite/internal/usecase 27.993s
  662. ? bnema.dev/ermite/scripts/loadtest [no test files]
  663. Run go test -race ./internal/app/
  664. <U+001B>[36;1mgo test -race ./internal/app/<U+001B>[0m
  665. shell: sh -e {0}
  666. env:
  667. GOWORK: off
  668. --- FAIL: TestJobTokenWithContentsWritePushesButNotWorkflows (1.97s)
  669. ci_permissions_test.go:248:
  670. Error Trace: /__w/ermite/ermite/internal/app/ci_permissions_test.go:248
  671. Error: "[repo:\"proj\" id:9 number:7 attempt:1 workflow_path:\".github/workflows/p.yml\" workflow_name:\".github/workflows/p.yml\" title:\"add s.txt\" event:\"push\" ref:\"refs/heads/sentinel\" sha:\"38be28af312c7f61d9b2f9036b63b39dccc88f50\" actor:\"root\" status:CI_STATUS_QUEUED created_at:{seconds:1792557133 nanos:529292366} version:51 name:\".github/workflows/p.yml\" trusted:true repo:\"proj\" id:8 number:6 attempt:1 workflow_path:\".github/workflows/p.yml\" workflow_name:\".github/workflows/p.yml\" title:\"mv\" event:\"create\" ref:\"refs/heads/rworkflow\" sha:\"22cefb7a536b742ce6653274b002858eefa6f086\" actor:\"root\" status:CI_STATUS_QUEUED created_at:{seconds:1792557133 nanos:411314098} version:48 name:\".github/workflows/p.yml\" trusted:true repo:\"proj\" id:7 number:2 attempt:1 workflow_path:\".github/workflows/moved.yml\" workflow_name:\".github/workflows/moved.yml\" title:\"mv\" event:\"create\" ref:\"refs/heads/rworkflow\" sha:\"22cefb7a536b742ce6653274b002858eefa6f086\" actor:\"root\" status:CI_STATUS_QUEUED created_at:{seconds:1792557133 nanos:403571777} version:46 name:\".github/workflows/moved.yml\" trusted:true repo:\"proj\" id:6 number:5 attempt:1 workflow_path:\".github/workflows/p.yml\" workflow_name:\".github/workflows/p.yml\" title:\"mv\" event:\"push\" ref:\"refs/heads/rworkflow\" sha:\"22cefb7a536b742ce6653274b002858eefa6f086\" actor:\"root\" status:CI_STATUS_QUEUED created_at:{seconds:1792557133 nanos:395353203} version:44 name:\".github/workflows/p.yml\" trusted:true repo:\"proj\" id:5 number:1 attempt:1 workflow_path:\".github/workflows/moved.yml\" workflow_name:\".github/workflows/moved.yml\" title:\"mv\" event:\"push\" ref:\"refs/heads/rworkflow\" sha:\"22cefb7a536b742ce6653274b002858eefa6f086\" actor:\"root\" status:CI_STATUS_QUEUED created_at:{seconds:1792557133 nanos:386931084} version:42 name:\".github/workflows/moved.yml\" trusted:true repo:\"proj\" id:4 number:4 attempt:1 workflow_path:\".github/workflows/p.yml\" workflow_name:\".github/workflows/p.yml\" title:\"add feat.txt\" event:\"create\" ref:\"refs/heads/feat\" sha:\"e2934ac6ef1e16138a8d56d16c2016540fc622bd\" actor:\"root\" status:CI_STATUS_QUEUED created_at:{seconds:1792557132 nanos:141672357} version:20 name:\".github/workflows/p.yml\" trusted:true repo:\"proj\" id:3 number:3 attempt:1 workflow_path:\".github/workflows/p.yml\" workflow_name:\".github/workflows/p.yml\" title:\"add feat.txt\" event:\"push\" ref:\"refs/heads/feat\" sha:\"e2934ac6ef1e16138a8d56d16c2016540fc622bd\" actor:\"root\" status:CI_STATUS_QUEUED created_at:{seconds:1792557132 nanos:129882413} version:18 name:\".github/workflows/p.yml\" trusted:true repo:\"proj\" id:2 number:2 attempt:1 workflow_path:\".github/workflows/p.yml\" workflow_name:\".github/workflows/p.yml\" title:\"add .github/workflows/p.yml\" event:\"create\" ref:\"refs/heads/main\" sha:\"2c4838024ede7effbb94d85008b920829f76268b\" actor:\"root\" status:CI_STATUS_QUEUED created_at:{seconds:1792557132 nanos:43740428} version:13 name:\".github/workflows/p.yml\" trusted:true repo:\"proj\" id:1 number:1 attempt:1 workflow_path:\".github/workflows/p.yml\" workflow_name:\".github/workflows/p.yml\" title:\"add .github/workflows/p.yml\" event:\"push\" ref:\"refs/heads/main\" sha:\"2c4838024ede7effbb94d85008b920829f76268b\" actor:\"root\" status:CI_STATUS_QUEUED created_at:{seconds:1792557132 nanos:35605144} version:11 name:\".github/workflows/p.yml\" trusted:true]" should have 8 item(s), but has 9
  672. Test: TestJobTokenWithContentsWritePushesButNotWorkflows
  673. Messages: push and create of the owner's rworkflow and sentinel only
  674. --- FAIL: TestWebFilesGolden (1.66s)
  675. --- FAIL: TestWebFilesGolden/blob-markdown (0.07s)
  676. web_files_test.go:104:
  677. Error Trace: /__w/ermite/ermite/internal/app/web_test.go:104
  678. /__w/ermite/ermite/internal/app/web_files_test.go:104
  679. Error: Not equal:
  680. 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"
  681. 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"
  682. Diff:
  683. --- Expected
  684. +++ Actual
  685. @@ -118,3 +118,3 @@
  686. <p>Run it.</p>
  687. -<pre>
  688. +<pre class="chroma">
  689. <code class="language-sh">make all
  690. Test: TestWebFilesGolden/blob-markdown
  691. Messages: blob-markdown
  692. --- FAIL: TestWebGolden (0.96s)
  693. --- FAIL: TestWebGolden/summary (0.07s)
  694. web_test.go:130:
  695. Error Trace: /__w/ermite/ermite/internal/app/web_test.go:104
  696. /__w/ermite/ermite/internal/app/web_test.go:130
  697. Error: Not equal:
  698. 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"
  699. 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"
  700. Diff:
  701. --- Expected
  702. +++ Actual
  703. @@ -105,3 +105,3 @@
  704. <h2 id="md-install">Install</h2>
  705. -<pre>
  706. +<pre class="chroma">
  707. <code class="language-sh">go install example.org/demo@latest
  708. Test: TestWebGolden/summary
  709. Messages: summary
  710. FAIL
  711. FAIL bnema.dev/ermite/internal/app 397.953s
  712. FAIL
  713. Process completed with exit code 1.
  714. Post job cleanup.
  715. ##[command]/usr/bin/docker exec ddeb508ec991c698a2592c005268363fe5fe06647e528108dd30975998168e67 sh -c "cat /etc/*release | grep ^ID"
  716. [command]/usr/sbin/git version
  717. git version 2.56.0
  718. Copying '/github/home/.gitconfig' to '/__w/_temp/24abc5ab-caea-42d9-b493-25fc2a324edf/.gitconfig'
  719. Temporarily overriding HOME='/__w/_temp/24abc5ab-caea-42d9-b493-25fc2a324edf' before making global git config changes
  720. Adding repository directory to the temporary git global config as a safe directory
  721. [command]/usr/sbin/git config --global --add safe.directory /__w/ermite/ermite
  722. Removing SSH command configuration
  723. [command]/usr/sbin/git config --local --name-only --get-regexp core\.sshCommand
  724. [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' || :"
  725. Removing HTTP extra header
  726. [command]/usr/sbin/git config --local --name-only --get-regexp http\.http\:\/\/ermite\:7341\/\.extraheader
  727. [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' || :"
  728. Removing includeIf entries pointing to credentials config files
  729. [command]/usr/sbin/git config --local --name-only --get-regexp ^includeIf\.gitdir:
  730. includeif.gitdir:/__w/ermite/ermite/.git.path
  731. includeif.gitdir:/__w/ermite/ermite/.git/worktrees/*.path
  732. includeif.gitdir:/github/workspace/.git.path
  733. includeif.gitdir:/github/workspace/.git/worktrees/*.path
  734. [command]/usr/sbin/git config --local --get-all includeif.gitdir:/__w/ermite/ermite/.git.path
  735. /__w/_temp/git-credentials-7cf399f0-81f6-410c-a48a-32ca42282e5d.config
  736. [command]/usr/sbin/git config --local --unset includeif.gitdir:/__w/ermite/ermite/.git.path /__w/_temp/git-credentials-7cf399f0-81f6-410c-a48a-32ca42282e5d.config
  737. [command]/usr/sbin/git config --local --get-all includeif.gitdir:/__w/ermite/ermite/.git/worktrees/*.path
  738. /__w/_temp/git-credentials-7cf399f0-81f6-410c-a48a-32ca42282e5d.config
  739. [command]/usr/sbin/git config --local --unset includeif.gitdir:/__w/ermite/ermite/.git/worktrees/*.path /__w/_temp/git-credentials-7cf399f0-81f6-410c-a48a-32ca42282e5d.config
  740. [command]/usr/sbin/git config --local --get-all includeif.gitdir:/github/workspace/.git.path
  741. /github/runner_temp/git-credentials-7cf399f0-81f6-410c-a48a-32ca42282e5d.config
  742. [command]/usr/sbin/git config --local --unset includeif.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-7cf399f0-81f6-410c-a48a-32ca42282e5d.config
  743. [command]/usr/sbin/git config --local --get-all includeif.gitdir:/github/workspace/.git/worktrees/*.path
  744. /github/runner_temp/git-credentials-7cf399f0-81f6-410c-a48a-32ca42282e5d.config
  745. [command]/usr/sbin/git config --local --unset includeif.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-7cf399f0-81f6-410c-a48a-32ca42282e5d.config
  746. [command]/usr/sbin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url
  747. Removing credentials config '/__w/_temp/git-credentials-7cf399f0-81f6-410c-a48a-32ca42282e5d.config'
  748. Stop and remove container: 41d7e15d96cb476cacaaf7eba549d051_archlinuxlatest_dabbed
  749. ##[command]/usr/bin/docker rm --force ddeb508ec991c698a2592c005268363fe5fe06647e528108dd30975998168e67
  750. ddeb508ec991c698a2592c005268363fe5fe06647e528108dd30975998168e67
  751. Remove container network: github_network_40ce9edffbdd4c32a84ae386508ecceb
  752. ##[command]/usr/bin/docker network rm github_network_40ce9edffbdd4c32a84ae386508ecceb
  753. github_network_40ce9edffbdd4c32a84ae386508ecceb
  754. Cleaning up orphan processes
  755. ##[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