detached 32074ce

Merge 8345e76c4726a85985a2d128c0ce04eb3157c313 into c9e9163d8e10ed27f6d17474eb94538be54e665b

commit
32074ce8f32652bcf1c033f20eda79fab059088e
author
ermite · · 2026-10-22 08:15 UTC
merge of
c9e9163 + 8345e76 · diff against the first parent
signature
unsigned
10 files · +57 -35
M .github/actions/setup-gordon/action.yml +2 -2
@@ -53,7 +53,7 @@ runs:
5353
5454 # Resolve 'latest' to an actual tag via redirect URL
5555 if [ "${version}" = "latest" ]; then
56- redirect_url="$(curl -fsSL -o /dev/null -w '%{redirect_url}' "https://github.com/bnema/gordon/releases/latest")"
56+ redirect_url="$(curl -fsSL -o /dev/null -w '%{url_effective}' "https://git.bnema.dev/gordon/releases/latest")"
5757 version="${redirect_url##*/}"
5858 if [ -z "${version}" ]; then
5959 echo "Failed to resolve latest Gordon version" >&2
@@ -66,7 +66,7 @@ runs:
6666 fi
6767
6868 archive="gordon_${os}_${arch}.tar.gz"
69- base_url="https://github.com/bnema/gordon/releases/download/${version}"
69+ base_url="https://git.bnema.dev/gordon/releases/download/${version}"
7070 url="${base_url}/${archive}"
7171 checksums_url="${base_url}/checksums.txt"
7272 work_dir="$(mktemp -d)"
@@ -53,7 +53,7 @@ runs:
53 53
54 # Resolve 'latest' to an actual tag via redirect URL54 # Resolve 'latest' to an actual tag via redirect URL
55 if [ "${version}" = "latest" ]; then55 if [ "${version}" = "latest" ]; then
56- redirect_url="$(curl -fsSL -o /dev/null -w '%{redirect_url}' "https://github.com/bnema/gordon/releases/latest")"56+ redirect_url="$(curl -fsSL -o /dev/null -w '%{url_effective}' "https://git.bnema.dev/gordon/releases/latest")"
57 version="${redirect_url##*/}"57 version="${redirect_url##*/}"
58 if [ -z "${version}" ]; then58 if [ -z "${version}" ]; then
59 echo "Failed to resolve latest Gordon version" >&259 echo "Failed to resolve latest Gordon version" >&2
@@ -66,7 +66,7 @@ runs:
66 fi66 fi
67 67
68 archive="gordon_${os}_${arch}.tar.gz"68 archive="gordon_${os}_${arch}.tar.gz"
69- base_url="https://github.com/bnema/gordon/releases/download/${version}"69+ base_url="https://git.bnema.dev/gordon/releases/download/${version}"
70 url="${base_url}/${archive}"70 url="${base_url}/${archive}"
71 checksums_url="${base_url}/checksums.txt"71 checksums_url="${base_url}/checksums.txt"
72 work_dir="$(mktemp -d)"72 work_dir="$(mktemp -d)"
M .github/workflows/release.yml +4 -1
@@ -11,6 +11,9 @@ permissions:
1111 jobs:
1212 release:
1313 name: Release
14+ # Releases are published by ermite (git.bnema.dev); the GitHub mirror
15+ # receives the tags but must not publish a second release.
16+ if: github.server_url != 'https://github.com'
1417 runs-on: ubuntu-latest
1518 steps:
1619 - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
@@ -20,7 +23,7 @@ jobs:
2023
2124 - uses: actions/setup-go@40f1582b2485089dde7abd97c1529aa768e1baff # v5
2225 with:
23- go-version: "1.27.x"
26+ go-version-file: go.mod
2427
2528 - name: Run GoReleaser
2629 uses: goreleaser/goreleaser-action@e435ccd777264be153ace6237001ef4d979d3a7a # v6
@@ -11,6 +11,9 @@ permissions:
11 jobs:11 jobs:
12 release:12 release:
13 name: Release13 name: Release
14+ # Releases are published by ermite (git.bnema.dev); the GitHub mirror
15+ # receives the tags but must not publish a second release.
16+ if: github.server_url != 'https://github.com'
14 runs-on: ubuntu-latest17 runs-on: ubuntu-latest
15 steps:18 steps:
16 - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v619 - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
@@ -20,7 +23,7 @@ jobs:
20 23
21 - uses: actions/setup-go@40f1582b2485089dde7abd97c1529aa768e1baff # v524 - uses: actions/setup-go@40f1582b2485089dde7abd97c1529aa768e1baff # v5
22 with:25 with:
23- go-version: "1.27.x"26+ go-version-file: go.mod
24 27
25 - name: Run GoReleaser28 - name: Run GoReleaser
26 uses: goreleaser/goreleaser-action@e435ccd777264be153ace6237001ef4d979d3a7a # v629 uses: goreleaser/goreleaser-action@e435ccd777264be153ace6237001ef4d979d3a7a # v6
M .goreleaser.yaml +12 -0
@@ -1,5 +1,13 @@
11 version: 2
22
3+# Releases are published on ermite. In CI the runner sets GITHUB_API_URL and
4+# GITHUB_SERVER_URL to an address the job can reach; the public URLs are the
5+# fallback for a local run.
6+github_urls:
7+ api: '{{ or (index .Env "GITHUB_API_URL") "https://git.bnema.dev/-/github/api" }}/'
8+ upload: '{{ or (index .Env "GITHUB_API_URL") "https://git.bnema.dev/-/github/api" }}/uploads/'
9+ download: '{{ or (index .Env "GITHUB_SERVER_URL") "https://git.bnema.dev" }}/'
10+
311 before:
412 hooks:
513
@@ -7,6 +15,10 @@ git:
715 prerelease_suffix: "-"
816
917 release:
18+ github:
19+ owner: bnema
20+ name: gordon
21+ # Publish after checking it: ermite release edit gordon <tag> --publish
1022 draft: true
1123 prerelease: auto
1224
@@ -1,5 +1,13 @@
1 version: 21 version: 2
2 2
3+# Releases are published on ermite. In CI the runner sets GITHUB_API_URL and
4+# GITHUB_SERVER_URL to an address the job can reach; the public URLs are the
5+# fallback for a local run.
6+github_urls:
7+ api: '{{ or (index .Env "GITHUB_API_URL") "https://git.bnema.dev/-/github/api" }}/'
8+ upload: '{{ or (index .Env "GITHUB_API_URL") "https://git.bnema.dev/-/github/api" }}/uploads/'
9+ download: '{{ or (index .Env "GITHUB_SERVER_URL") "https://git.bnema.dev" }}/'
10+
3 before:11 before:
4 hooks:12 hooks:
5 13
@@ -7,6 +15,10 @@ git:
7 prerelease_suffix: "-"15 prerelease_suffix: "-"
8 16
9 release:17 release:
18+ github:
19+ owner: bnema
20+ name: gordon
21+ # Publish after checking it: ermite release edit gordon <tag> --publish
10 draft: true22 draft: true
11 prerelease: auto23 prerelease: auto
12 24
M Makefile +3 -3
@@ -152,10 +152,10 @@ dev-release: build ## Create dev GitHub release
152152 @echo "Dev release created successfully!"
153153 @echo ""
154154 @echo "📦 Download URLs:"
155- @echo " AMD64: wget https://github.com/bnema/gordon/releases/download/$(DEV_TAG)/gordon-linux-amd64"
156- @echo " ARM64: wget https://github.com/bnema/gordon/releases/download/$(DEV_TAG)/gordon-linux-arm64"
155+ @echo " AMD64: wget https://git.bnema.dev/gordon/releases/download/$(DEV_TAG)/gordon-linux-amd64"
156+ @echo " ARM64: wget https://git.bnema.dev/gordon/releases/download/$(DEV_TAG)/gordon-linux-arm64"
157157 @echo ""
158- @echo "🔗 Release page: https://github.com/bnema/gordon/releases/tag/$(DEV_TAG)"
158+ @echo "🔗 Release page: https://git.bnema.dev/gordon/releases/tag/$(DEV_TAG)"
159159
160160 ##@ Cleanup
161161
@@ -152,10 +152,10 @@ dev-release: build ## Create dev GitHub release
152 @echo "Dev release created successfully!"152 @echo "Dev release created successfully!"
153 @echo ""153 @echo ""
154 @echo "📦 Download URLs:"154 @echo "📦 Download URLs:"
155- @echo " AMD64: wget https://github.com/bnema/gordon/releases/download/$(DEV_TAG)/gordon-linux-amd64"155+ @echo " AMD64: wget https://git.bnema.dev/gordon/releases/download/$(DEV_TAG)/gordon-linux-amd64"
156- @echo " ARM64: wget https://github.com/bnema/gordon/releases/download/$(DEV_TAG)/gordon-linux-arm64"156+ @echo " ARM64: wget https://git.bnema.dev/gordon/releases/download/$(DEV_TAG)/gordon-linux-arm64"
157 @echo ""157 @echo ""
158- @echo "🔗 Release page: https://github.com/bnema/gordon/releases/tag/$(DEV_TAG)"158+ @echo "🔗 Release page: https://git.bnema.dev/gordon/releases/tag/$(DEV_TAG)"
159 159
160 ##@ Cleanup160 ##@ Cleanup
161 161
M docs/deployment/generic-ci.md +4 -4
@@ -34,7 +34,7 @@ Add these secrets to your CI system:
3434
3535 ```bash
3636 # 1. Install Gordon binary
37-curl -fsSL https://github.com/bnema/gordon/releases/latest/download/gordon_linux_amd64 \
37+curl -fsSL https://git.bnema.dev/gordon/releases/latest/download/gordon_linux_amd64 \
3838 -o /usr/local/bin/gordon
3939 chmod +x /usr/local/bin/gordon
4040
@@ -86,7 +86,7 @@ pipeline {
8686 stage('Deploy') {
8787 steps {
8888 sh '''
89- curl -fsSL https://github.com/bnema/gordon/releases/latest/download/gordon_linux_amd64 \
89+ curl -fsSL https://git.bnema.dev/gordon/releases/latest/download/gordon_linux_amd64 \
9090 -o /usr/local/bin/gordon
9191 chmod +x /usr/local/bin/gordon
9292 gordon images push --build --remote "$GORDON_REMOTE"
@@ -113,7 +113,7 @@ jobs:
113113 name: Install Gordon
114114 command: |
115115 apk add --no-cache curl
116- curl -fsSL https://github.com/bnema/gordon/releases/latest/download/gordon_linux_amd64 \
116+ curl -fsSL https://git.bnema.dev/gordon/releases/latest/download/gordon_linux_amd64 \
117117 -o /usr/local/bin/gordon
118118 chmod +x /usr/local/bin/gordon
119119 - run:
@@ -150,7 +150,7 @@ steps:
150150 from_secret: gordon_remote
151151 commands:
152152 - apk add --no-cache curl
153- - curl -fsSL https://github.com/bnema/gordon/releases/latest/download/gordon_linux_amd64 -o /usr/local/bin/gordon
153+ - curl -fsSL https://git.bnema.dev/gordon/releases/latest/download/gordon_linux_amd64 -o /usr/local/bin/gordon
154154 - chmod +x /usr/local/bin/gordon
155155 - gordon images push --build --remote "$GORDON_REMOTE"
156156
@@ -34,7 +34,7 @@ Add these secrets to your CI system:
34 34
35 ```bash35 ```bash
36 # 1. Install Gordon binary36 # 1. Install Gordon binary
37-curl -fsSL https://github.com/bnema/gordon/releases/latest/download/gordon_linux_amd64 \37+curl -fsSL https://git.bnema.dev/gordon/releases/latest/download/gordon_linux_amd64 \
38 -o /usr/local/bin/gordon38 -o /usr/local/bin/gordon
39 chmod +x /usr/local/bin/gordon39 chmod +x /usr/local/bin/gordon
40 40
@@ -86,7 +86,7 @@ pipeline {
86 stage('Deploy') {86 stage('Deploy') {
87 steps {87 steps {
88 sh '''88 sh '''
89- curl -fsSL https://github.com/bnema/gordon/releases/latest/download/gordon_linux_amd64 \89+ curl -fsSL https://git.bnema.dev/gordon/releases/latest/download/gordon_linux_amd64 \
90 -o /usr/local/bin/gordon90 -o /usr/local/bin/gordon
91 chmod +x /usr/local/bin/gordon91 chmod +x /usr/local/bin/gordon
92 gordon images push --build --remote "$GORDON_REMOTE"92 gordon images push --build --remote "$GORDON_REMOTE"
@@ -113,7 +113,7 @@ jobs:
113 name: Install Gordon113 name: Install Gordon
114 command: |114 command: |
115 apk add --no-cache curl115 apk add --no-cache curl
116- curl -fsSL https://github.com/bnema/gordon/releases/latest/download/gordon_linux_amd64 \116+ curl -fsSL https://git.bnema.dev/gordon/releases/latest/download/gordon_linux_amd64 \
117 -o /usr/local/bin/gordon117 -o /usr/local/bin/gordon
118 chmod +x /usr/local/bin/gordon118 chmod +x /usr/local/bin/gordon
119 - run:119 - run:
@@ -150,7 +150,7 @@ steps:
150 from_secret: gordon_remote150 from_secret: gordon_remote
151 commands:151 commands:
152 - apk add --no-cache curl152 - apk add --no-cache curl
153- - curl -fsSL https://github.com/bnema/gordon/releases/latest/download/gordon_linux_amd64 -o /usr/local/bin/gordon153+ - curl -fsSL https://git.bnema.dev/gordon/releases/latest/download/gordon_linux_amd64 -o /usr/local/bin/gordon
154 - chmod +x /usr/local/bin/gordon154 - chmod +x /usr/local/bin/gordon
155 - gordon images push --build --remote "$GORDON_REMOTE"155 - gordon images push --build --remote "$GORDON_REMOTE"
156 156
M docs/deployment/gitlab-ci.md +5 -5
@@ -42,7 +42,7 @@ deploy:
4242 - docker:24-dind
4343 before_script:
4444 - apk add --no-cache curl
45- - curl -fsSL https://github.com/bnema/gordon/releases/latest/download/gordon_linux_amd64 -o /usr/local/bin/gordon
45+ - curl -fsSL https://git.bnema.dev/gordon/releases/latest/download/gordon_linux_amd64 -o /usr/local/bin/gordon
4646 - chmod +x /usr/local/bin/gordon
4747 script:
4848 - gordon images push --build
@@ -70,7 +70,7 @@ deploy:
7070 - docker:24-dind
7171 before_script:
7272 - apk add --no-cache curl
73- - curl -fsSL https://github.com/bnema/gordon/releases/latest/download/gordon_linux_amd64 -o /usr/local/bin/gordon
73+ - curl -fsSL https://git.bnema.dev/gordon/releases/latest/download/gordon_linux_amd64 -o /usr/local/bin/gordon
7474 - chmod +x /usr/local/bin/gordon
7575 script:
7676 - gordon images push --build
@@ -93,7 +93,7 @@ deploy:
9393 - docker:24-dind
9494 before_script:
9595 - apk add --no-cache curl
96- - curl -fsSL https://github.com/bnema/gordon/releases/latest/download/gordon_linux_amd64 -o /usr/local/bin/gordon
96+ - curl -fsSL https://git.bnema.dev/gordon/releases/latest/download/gordon_linux_amd64 -o /usr/local/bin/gordon
9797 - chmod +x /usr/local/bin/gordon
9898 script:
9999 - gordon images push --build
@@ -114,7 +114,7 @@ deploy:
114114 - docker:24-dind
115115 before_script:
116116 - apk add --no-cache curl
117- - curl -fsSL https://github.com/bnema/gordon/releases/latest/download/gordon_linux_amd64 -o /usr/local/bin/gordon
117+ - curl -fsSL https://git.bnema.dev/gordon/releases/latest/download/gordon_linux_amd64 -o /usr/local/bin/gordon
118118 - chmod +x /usr/local/bin/gordon
119119 script:
120120 - gordon images push --build
@@ -134,7 +134,7 @@ deploy:
134134 - docker:24-dind
135135 before_script:
136136 - apk add --no-cache curl
137- - curl -fsSL https://github.com/bnema/gordon/releases/latest/download/gordon_linux_amd64 -o /usr/local/bin/gordon
137+ - curl -fsSL https://git.bnema.dev/gordon/releases/latest/download/gordon_linux_amd64 -o /usr/local/bin/gordon
138138 - chmod +x /usr/local/bin/gordon
139139 script:
140140 - gordon images push --build
@@ -42,7 +42,7 @@ deploy:
42 - docker:24-dind42 - docker:24-dind
43 before_script:43 before_script:
44 - apk add --no-cache curl44 - apk add --no-cache curl
45- - curl -fsSL https://github.com/bnema/gordon/releases/latest/download/gordon_linux_amd64 -o /usr/local/bin/gordon45+ - curl -fsSL https://git.bnema.dev/gordon/releases/latest/download/gordon_linux_amd64 -o /usr/local/bin/gordon
46 - chmod +x /usr/local/bin/gordon46 - chmod +x /usr/local/bin/gordon
47 script:47 script:
48 - gordon images push --build48 - gordon images push --build
@@ -70,7 +70,7 @@ deploy:
70 - docker:24-dind70 - docker:24-dind
71 before_script:71 before_script:
72 - apk add --no-cache curl72 - apk add --no-cache curl
73- - curl -fsSL https://github.com/bnema/gordon/releases/latest/download/gordon_linux_amd64 -o /usr/local/bin/gordon73+ - curl -fsSL https://git.bnema.dev/gordon/releases/latest/download/gordon_linux_amd64 -o /usr/local/bin/gordon
74 - chmod +x /usr/local/bin/gordon74 - chmod +x /usr/local/bin/gordon
75 script:75 script:
76 - gordon images push --build76 - gordon images push --build
@@ -93,7 +93,7 @@ deploy:
93 - docker:24-dind93 - docker:24-dind
94 before_script:94 before_script:
95 - apk add --no-cache curl95 - apk add --no-cache curl
96- - curl -fsSL https://github.com/bnema/gordon/releases/latest/download/gordon_linux_amd64 -o /usr/local/bin/gordon96+ - curl -fsSL https://git.bnema.dev/gordon/releases/latest/download/gordon_linux_amd64 -o /usr/local/bin/gordon
97 - chmod +x /usr/local/bin/gordon97 - chmod +x /usr/local/bin/gordon
98 script:98 script:
99 - gordon images push --build99 - gordon images push --build
@@ -114,7 +114,7 @@ deploy:
114 - docker:24-dind114 - docker:24-dind
115 before_script:115 before_script:
116 - apk add --no-cache curl116 - apk add --no-cache curl
117- - curl -fsSL https://github.com/bnema/gordon/releases/latest/download/gordon_linux_amd64 -o /usr/local/bin/gordon117+ - curl -fsSL https://git.bnema.dev/gordon/releases/latest/download/gordon_linux_amd64 -o /usr/local/bin/gordon
118 - chmod +x /usr/local/bin/gordon118 - chmod +x /usr/local/bin/gordon
119 script:119 script:
120 - gordon images push --build120 - gordon images push --build
@@ -134,7 +134,7 @@ deploy:
134 - docker:24-dind134 - docker:24-dind
135 before_script:135 before_script:
136 - apk add --no-cache curl136 - apk add --no-cache curl
137- - curl -fsSL https://github.com/bnema/gordon/releases/latest/download/gordon_linux_amd64 -o /usr/local/bin/gordon137+ - curl -fsSL https://git.bnema.dev/gordon/releases/latest/download/gordon_linux_amd64 -o /usr/local/bin/gordon
138 - chmod +x /usr/local/bin/gordon138 - chmod +x /usr/local/bin/gordon
139 script:139 script:
140 - gordon images push --build140 - gordon images push --build
M docs/installation.md +5 -5
@@ -56,7 +56,7 @@ Manual archive installation requires downloading the matching `checksums.txt` re
5656 **Linux (x86_64)**
5757
5858 ```bash
59-wget https://github.com/bnema/gordon/releases/latest/download/{gordon_linux_amd64.tar.gz,checksums.txt}
59+wget https://git.bnema.dev/gordon/releases/latest/download/{gordon_linux_amd64.tar.gz,checksums.txt}
6060 grep -E '^[[:xdigit:]]{64} ([* ]?)gordon_linux_amd64\.tar\.gz$' checksums.txt | sha256sum --check --strict
6161 tar -xzf gordon_linux_amd64.tar.gz
6262 chmod +x gordon
@@ -66,7 +66,7 @@ sudo mv gordon /usr/local/bin/
6666 **Linux (ARM64)** - for Raspberry Pi 4, AWS Graviton, Oracle Ampere, etc.
6767
6868 ```bash
69-wget https://github.com/bnema/gordon/releases/latest/download/{gordon_linux_arm64.tar.gz,checksums.txt}
69+wget https://git.bnema.dev/gordon/releases/latest/download/{gordon_linux_arm64.tar.gz,checksums.txt}
7070 grep -E '^[[:xdigit:]]{64} ([* ]?)gordon_linux_arm64\.tar\.gz$' checksums.txt | sha256sum --check --strict
7171 tar -xzf gordon_linux_arm64.tar.gz
7272 chmod +x gordon
@@ -76,7 +76,7 @@ sudo mv gordon /usr/local/bin/
7676 **macOS (Apple Silicon)**
7777
7878 ```bash
79-curl -LO https://github.com/bnema/gordon/releases/latest/download/{gordon_darwin_arm64.tar.gz,checksums.txt}
79+curl -LO https://git.bnema.dev/gordon/releases/latest/download/{gordon_darwin_arm64.tar.gz,checksums.txt}
8080 grep -E '^[[:xdigit:]]{64} ([* ]?)gordon_darwin_arm64\.tar\.gz$' checksums.txt | shasum -a 256 --check
8181 tar -xzf gordon_darwin_arm64.tar.gz
8282 chmod +x gordon
@@ -86,7 +86,7 @@ sudo mv gordon /usr/local/bin/
8686 **macOS (Intel)**
8787
8888 ```bash
89-curl -LO https://github.com/bnema/gordon/releases/latest/download/{gordon_darwin_amd64.tar.gz,checksums.txt}
89+curl -LO https://git.bnema.dev/gordon/releases/latest/download/{gordon_darwin_amd64.tar.gz,checksums.txt}
9090 grep -E '^[[:xdigit:]]{64} ([* ]?)gordon_darwin_amd64\.tar\.gz$' checksums.txt | shasum -a 256 --check
9191 tar -xzf gordon_darwin_amd64.tar.gz
9292 chmod +x gordon
@@ -352,7 +352,7 @@ curl -fsSL https://bnema.dev/gordon/install | GORDON_PRERELEASE=1 sh
352352 curl -fsSL https://bnema.dev/gordon/install | GORDON_CHANNEL=next sh
353353 ```
354354
355-Stable, exact-version, and pre-release installs download release binaries and verify their published checksums. The default stable install resolves the latest tag from the `github.com/bnema/gordon/releases/latest` redirect, so it does not use the rate-limited GitHub API; exact-version installs make no lookup at all. Pre-release lookups still use the GitHub API. The `next` channel is an **unverified development source build**: it resolves the branch through the GitHub API, pins the resulting commit SHA, downloads that exact source snapshot, and builds it locally for the detected platform. It requires the Go version declared by that commit's `go.mod`, is not covered by release checksums, and may be unstable. Do not combine `GORDON_CHANNEL=next` with `GORDON_VERSION` or `GORDON_PRERELEASE`.
355+Stable, exact-version, and pre-release installs download release binaries and verify their published checksums. The default stable install resolves the latest tag from the `git.bnema.dev/gordon/releases/latest` redirect on the ermite forge (no API call); exact-version installs make no lookup at all. Pre-release lookups use the forge's GitHub-compatible API. The `next` channel is an **unverified development source build**: it resolves the branch through the GitHub API, pins the resulting commit SHA, downloads that exact source snapshot, and builds it locally for the detected platform. It requires the Go version declared by that commit's `go.mod`, is not covered by release checksums, and may be unstable. Do not combine `GORDON_CHANNEL=next` with `GORDON_VERSION` or `GORDON_PRERELEASE`.
356356
357357 ## Verify Installation
358358
@@ -56,7 +56,7 @@ Manual archive installation requires downloading the matching `checksums.txt` re
56 **Linux (x86_64)**56 **Linux (x86_64)**
57 57
58 ```bash58 ```bash
59-wget https://github.com/bnema/gordon/releases/latest/download/{gordon_linux_amd64.tar.gz,checksums.txt}59+wget https://git.bnema.dev/gordon/releases/latest/download/{gordon_linux_amd64.tar.gz,checksums.txt}
60 grep -E '^[[:xdigit:]]{64} ([* ]?)gordon_linux_amd64\.tar\.gz$' checksums.txt | sha256sum --check --strict60 grep -E '^[[:xdigit:]]{64} ([* ]?)gordon_linux_amd64\.tar\.gz$' checksums.txt | sha256sum --check --strict
61 tar -xzf gordon_linux_amd64.tar.gz61 tar -xzf gordon_linux_amd64.tar.gz
62 chmod +x gordon62 chmod +x gordon
@@ -66,7 +66,7 @@ sudo mv gordon /usr/local/bin/
66 **Linux (ARM64)** - for Raspberry Pi 4, AWS Graviton, Oracle Ampere, etc.66 **Linux (ARM64)** - for Raspberry Pi 4, AWS Graviton, Oracle Ampere, etc.
67 67
68 ```bash68 ```bash
69-wget https://github.com/bnema/gordon/releases/latest/download/{gordon_linux_arm64.tar.gz,checksums.txt}69+wget https://git.bnema.dev/gordon/releases/latest/download/{gordon_linux_arm64.tar.gz,checksums.txt}
70 grep -E '^[[:xdigit:]]{64} ([* ]?)gordon_linux_arm64\.tar\.gz$' checksums.txt | sha256sum --check --strict70 grep -E '^[[:xdigit:]]{64} ([* ]?)gordon_linux_arm64\.tar\.gz$' checksums.txt | sha256sum --check --strict
71 tar -xzf gordon_linux_arm64.tar.gz71 tar -xzf gordon_linux_arm64.tar.gz
72 chmod +x gordon72 chmod +x gordon
@@ -76,7 +76,7 @@ sudo mv gordon /usr/local/bin/
76 **macOS (Apple Silicon)**76 **macOS (Apple Silicon)**
77 77
78 ```bash78 ```bash
79-curl -LO https://github.com/bnema/gordon/releases/latest/download/{gordon_darwin_arm64.tar.gz,checksums.txt}79+curl -LO https://git.bnema.dev/gordon/releases/latest/download/{gordon_darwin_arm64.tar.gz,checksums.txt}
80 grep -E '^[[:xdigit:]]{64} ([* ]?)gordon_darwin_arm64\.tar\.gz$' checksums.txt | shasum -a 256 --check80 grep -E '^[[:xdigit:]]{64} ([* ]?)gordon_darwin_arm64\.tar\.gz$' checksums.txt | shasum -a 256 --check
81 tar -xzf gordon_darwin_arm64.tar.gz81 tar -xzf gordon_darwin_arm64.tar.gz
82 chmod +x gordon82 chmod +x gordon
@@ -86,7 +86,7 @@ sudo mv gordon /usr/local/bin/
86 **macOS (Intel)**86 **macOS (Intel)**
87 87
88 ```bash88 ```bash
89-curl -LO https://github.com/bnema/gordon/releases/latest/download/{gordon_darwin_amd64.tar.gz,checksums.txt}89+curl -LO https://git.bnema.dev/gordon/releases/latest/download/{gordon_darwin_amd64.tar.gz,checksums.txt}
90 grep -E '^[[:xdigit:]]{64} ([* ]?)gordon_darwin_amd64\.tar\.gz$' checksums.txt | shasum -a 256 --check90 grep -E '^[[:xdigit:]]{64} ([* ]?)gordon_darwin_amd64\.tar\.gz$' checksums.txt | shasum -a 256 --check
91 tar -xzf gordon_darwin_amd64.tar.gz91 tar -xzf gordon_darwin_amd64.tar.gz
92 chmod +x gordon92 chmod +x gordon
@@ -352,7 +352,7 @@ curl -fsSL https://bnema.dev/gordon/install | GORDON_PRERELEASE=1 sh
352 curl -fsSL https://bnema.dev/gordon/install | GORDON_CHANNEL=next sh352 curl -fsSL https://bnema.dev/gordon/install | GORDON_CHANNEL=next sh
353 ```353 ```
354 354
355-Stable, exact-version, and pre-release installs download release binaries and verify their published checksums. The default stable install resolves the latest tag from the `github.com/bnema/gordon/releases/latest` redirect, so it does not use the rate-limited GitHub API; exact-version installs make no lookup at all. Pre-release lookups still use the GitHub API. The `next` channel is an **unverified development source build**: it resolves the branch through the GitHub API, pins the resulting commit SHA, downloads that exact source snapshot, and builds it locally for the detected platform. It requires the Go version declared by that commit's `go.mod`, is not covered by release checksums, and may be unstable. Do not combine `GORDON_CHANNEL=next` with `GORDON_VERSION` or `GORDON_PRERELEASE`.355+Stable, exact-version, and pre-release installs download release binaries and verify their published checksums. The default stable install resolves the latest tag from the `git.bnema.dev/gordon/releases/latest` redirect on the ermite forge (no API call); exact-version installs make no lookup at all. Pre-release lookups use the forge's GitHub-compatible API. The `next` channel is an **unverified development source build**: it resolves the branch through the GitHub API, pins the resulting commit SHA, downloads that exact source snapshot, and builds it locally for the detected platform. It requires the Go version declared by that commit's `go.mod`, is not covered by release checksums, and may be unstable. Do not combine `GORDON_CHANNEL=next` with `GORDON_VERSION` or `GORDON_PRERELEASE`.
356 356
357 ## Verify Installation357 ## Verify Installation
358 358
M install.sh +15 -9
@@ -7,6 +7,9 @@ set -e
77 # Usage with next source build: curl -fsSL https://bnema.dev/gordon/install | GORDON_CHANNEL=next sh
88
99 REPO="bnema/gordon"
10+# Releases are hosted on the ermite forge; only the `next` source build uses GitHub.
11+FORGE="https://git.bnema.dev"
12+FORGE_REPO="gordon"
1013 VERSION="${GORDON_VERSION:-latest}"
1114 CHANNEL="${GORDON_CHANNEL:-stable}"
1215
@@ -345,13 +348,16 @@ TARBALL="gordon_${OS}_${ARCH}.tar.gz"
345348 # Determine version to download
346349 if [ "$VERSION" = "latest" ] && [ -n "$GORDON_PRERELEASE" ]; then
347350 echo "Finding latest pre-release..."
348- # Get latest release (including pre-releases) from GitHub API
349- RELEASE_DATA=$(curl -fsSL "https://api.github.com/repos/${REPO}/releases?per_page=1" 2>/dev/null || echo "")
351+ # Get latest release (including pre-releases) from the forge's GitHub-compatible API
352+ RELEASE_DATA=$(curl -fsSL "${FORGE}/-/github/api/repos/${REPO}/releases?per_page=1" 2>/dev/null || echo "")
350353 if [ -z "$RELEASE_DATA" ]; then
351- echo "Error: Failed to fetch release information from GitHub API"
354+ echo "Error: Failed to fetch release information from ${FORGE}/-/github/api/repos/${REPO}/releases"
352355 exit 1
353356 fi
354- VERSION=$(echo "$RELEASE_DATA" | grep -m1 '"tag_name"' | sed -E 's/.*"tag_name":\s*"([^"]+)".*/\1/')
357+ VERSION=$(printf '%s\n' "$RELEASE_DATA" | grep -o '"tag_name"[[:space:]]*:[[:space:]]*"[^"]*"' | head -n 1 | cut -d'"' -f4)
358+ case "$VERSION" in
359+ *[!0-9A-Za-z._+-]*) VERSION="" ;;
360+ esac
355361 if [ -z "$VERSION" ]; then
356362 echo "Error: Could not determine latest pre-release version"
357363 exit 1
@@ -362,13 +368,13 @@ elif [ "$VERSION" = "latest" ]; then
362368 # Resolve "latest" to an exact tag by following the web redirect
363369 # (releases/latest -> releases/tag/<tag>). Unlike the REST API, this is
364370 # not rate-limited per IP for anonymous clients.
365- LATEST_URL=$(curl -fsSL -o /dev/null -w '%{url_effective}' "https://github.com/${REPO}/releases/latest" 2>/dev/null || echo "")
366- VERSION=${LATEST_URL#"https://github.com/${REPO}/releases/tag/"}
371+ LATEST_URL=$(curl -fsSL -o /dev/null -w '%{url_effective}' "${FORGE}/${FORGE_REPO}/releases/latest" 2>/dev/null || echo "")
372+ VERSION=${LATEST_URL#"${FORGE}/${FORGE_REPO}/releases/tag/"}
367373 case "$VERSION" in
368374 "$LATEST_URL"|''|*[!0-9A-Za-z._+-]*) VERSION="" ;;
369375 esac
370376 if [ -z "$VERSION" ]; then
371- echo "Error: Could not determine latest stable version from https://github.com/${REPO}/releases/latest"
377+ echo "Error: Could not determine latest stable version from ${FORGE}/${FORGE_REPO}/releases/latest"
372378 echo "Set GORDON_VERSION (e.g. GORDON_VERSION=v3.4.0) to install a specific release."
373379 exit 1
374380 fi
@@ -377,14 +383,14 @@ else
377383 echo "Using version: ${VERSION}"
378384 fi
379385
380-DOWNLOAD_URL="https://github.com/${REPO}/releases/download/${VERSION}/${TARBALL}"
386+DOWNLOAD_URL="${FORGE}/${FORGE_REPO}/releases/download/${VERSION}/${TARBALL}"
381387
382388 # Create temporary directory
383389 TMP_DIR=$(mktemp -d)
384390 trap 'rm -rf "$TMP_DIR"' EXIT
385391
386392 # Download checksums file
387-CHECKSUMS_URL="https://github.com/${REPO}/releases/download/${VERSION}/checksums.txt"
393+CHECKSUMS_URL="${FORGE}/${FORGE_REPO}/releases/download/${VERSION}/checksums.txt"
388394 echo "Downloading checksums..."
389395 if ! curl -fsSL "$CHECKSUMS_URL" -o "$TMP_DIR/checksums.txt"; then
390396 echo "Error: Failed to download checksums file"
@@ -7,6 +7,9 @@ set -e
7 # Usage with next source build: curl -fsSL https://bnema.dev/gordon/install | GORDON_CHANNEL=next sh7 # Usage with next source build: curl -fsSL https://bnema.dev/gordon/install | GORDON_CHANNEL=next sh
8 8
9 REPO="bnema/gordon"9 REPO="bnema/gordon"
10+# Releases are hosted on the ermite forge; only the `next` source build uses GitHub.
11+FORGE="https://git.bnema.dev"
12+FORGE_REPO="gordon"
10 VERSION="${GORDON_VERSION:-latest}"13 VERSION="${GORDON_VERSION:-latest}"
11 CHANNEL="${GORDON_CHANNEL:-stable}"14 CHANNEL="${GORDON_CHANNEL:-stable}"
12 15
@@ -345,13 +348,16 @@ TARBALL="gordon_${OS}_${ARCH}.tar.gz"
345 # Determine version to download348 # Determine version to download
346 if [ "$VERSION" = "latest" ] && [ -n "$GORDON_PRERELEASE" ]; then349 if [ "$VERSION" = "latest" ] && [ -n "$GORDON_PRERELEASE" ]; then
347 echo "Finding latest pre-release..."350 echo "Finding latest pre-release..."
348- # Get latest release (including pre-releases) from GitHub API351+ # Get latest release (including pre-releases) from the forge's GitHub-compatible API
349- RELEASE_DATA=$(curl -fsSL "https://api.github.com/repos/${REPO}/releases?per_page=1" 2>/dev/null || echo "")352+ RELEASE_DATA=$(curl -fsSL "${FORGE}/-/github/api/repos/${REPO}/releases?per_page=1" 2>/dev/null || echo "")
350 if [ -z "$RELEASE_DATA" ]; then353 if [ -z "$RELEASE_DATA" ]; then
351- echo "Error: Failed to fetch release information from GitHub API"354+ echo "Error: Failed to fetch release information from ${FORGE}/-/github/api/repos/${REPO}/releases"
352 exit 1355 exit 1
353 fi356 fi
354- VERSION=$(echo "$RELEASE_DATA" | grep -m1 '"tag_name"' | sed -E 's/.*"tag_name":\s*"([^"]+)".*/\1/')357+ VERSION=$(printf '%s\n' "$RELEASE_DATA" | grep -o '"tag_name"[[:space:]]*:[[:space:]]*"[^"]*"' | head -n 1 | cut -d'"' -f4)
358+ case "$VERSION" in
359+ *[!0-9A-Za-z._+-]*) VERSION="" ;;
360+ esac
355 if [ -z "$VERSION" ]; then361 if [ -z "$VERSION" ]; then
356 echo "Error: Could not determine latest pre-release version"362 echo "Error: Could not determine latest pre-release version"
357 exit 1363 exit 1
@@ -362,13 +368,13 @@ elif [ "$VERSION" = "latest" ]; then
362 # Resolve "latest" to an exact tag by following the web redirect368 # Resolve "latest" to an exact tag by following the web redirect
363 # (releases/latest -> releases/tag/<tag>). Unlike the REST API, this is369 # (releases/latest -> releases/tag/<tag>). Unlike the REST API, this is
364 # not rate-limited per IP for anonymous clients.370 # not rate-limited per IP for anonymous clients.
365- LATEST_URL=$(curl -fsSL -o /dev/null -w '%{url_effective}' "https://github.com/${REPO}/releases/latest" 2>/dev/null || echo "")371+ LATEST_URL=$(curl -fsSL -o /dev/null -w '%{url_effective}' "${FORGE}/${FORGE_REPO}/releases/latest" 2>/dev/null || echo "")
366- VERSION=${LATEST_URL#"https://github.com/${REPO}/releases/tag/"}372+ VERSION=${LATEST_URL#"${FORGE}/${FORGE_REPO}/releases/tag/"}
367 case "$VERSION" in373 case "$VERSION" in
368 "$LATEST_URL"|''|*[!0-9A-Za-z._+-]*) VERSION="" ;;374 "$LATEST_URL"|''|*[!0-9A-Za-z._+-]*) VERSION="" ;;
369 esac375 esac
370 if [ -z "$VERSION" ]; then376 if [ -z "$VERSION" ]; then
371- echo "Error: Could not determine latest stable version from https://github.com/${REPO}/releases/latest"377+ echo "Error: Could not determine latest stable version from ${FORGE}/${FORGE_REPO}/releases/latest"
372 echo "Set GORDON_VERSION (e.g. GORDON_VERSION=v3.4.0) to install a specific release."378 echo "Set GORDON_VERSION (e.g. GORDON_VERSION=v3.4.0) to install a specific release."
373 exit 1379 exit 1
374 fi380 fi
@@ -377,14 +383,14 @@ else
377 echo "Using version: ${VERSION}"383 echo "Using version: ${VERSION}"
378 fi384 fi
379 385
380-DOWNLOAD_URL="https://github.com/${REPO}/releases/download/${VERSION}/${TARBALL}"386+DOWNLOAD_URL="${FORGE}/${FORGE_REPO}/releases/download/${VERSION}/${TARBALL}"
381 387
382 # Create temporary directory388 # Create temporary directory
383 TMP_DIR=$(mktemp -d)389 TMP_DIR=$(mktemp -d)
384 trap 'rm -rf "$TMP_DIR"' EXIT390 trap 'rm -rf "$TMP_DIR"' EXIT
385 391
386 # Download checksums file392 # Download checksums file
387-CHECKSUMS_URL="https://github.com/${REPO}/releases/download/${VERSION}/checksums.txt"393+CHECKSUMS_URL="${FORGE}/${FORGE_REPO}/releases/download/${VERSION}/checksums.txt"
388 echo "Downloading checksums..."394 echo "Downloading checksums..."
389 if ! curl -fsSL "$CHECKSUMS_URL" -o "$TMP_DIR/checksums.txt"; then395 if ! curl -fsSL "$CHECKSUMS_URL" -o "$TMP_DIR/checksums.txt"; then
390 echo "Error: Failed to download checksums file"396 echo "Error: Failed to download checksums file"
M tests/install_next_test.sh +5 -4
@@ -36,7 +36,7 @@ printf '%s\n' "\$*" >>'$case_dir/curl.log'
3636 case "\$*" in
3737 *api.github.com/repos/bnema/gordon/commits/next*) printf '%s\n' '{"sha":"$SHA"}' ;;
3838 *codeload.github.com/bnema/gordon/tar.gz/$SHA*) : >'$case_dir/source.tar.gz' ;;
39- *github.com/bnema/gordon/releases/latest*) printf '%s' "\${MOCK_LATEST_URL-https://github.com/bnema/gordon/releases/tag/v9.9.9}" ;;
39+ *git.bnema.dev/gordon/releases/latest*) printf '%s' "\${MOCK_LATEST_URL-https://git.bnema.dev/gordon/releases/tag/v9.9.9}" ;;
4040 *) exit 90 ;;
4141 esac
4242 EOF
@@ -249,7 +249,8 @@ test_stable_latest_without_api() {
249249 run_case stable-latest env sh "$ROOT/install.sh"
250250 # The mock refuses the checksum download; resolution is what is tested.
251251 if grep -q "Resolved version: v9.9.9" "$case_dir/out" &&
252- grep -q "github.com/bnema/gordon/releases/download/v9.9.9/checksums.txt" "$case_dir/curl.log" &&
252+ grep -q "git.bnema.dev/gordon/releases/download/v9.9.9/checksums.txt" "$case_dir/curl.log" &&
253+ ! grep -q "/-/github/api" "$case_dir/curl.log" &&
253254 ! grep -q "api.github.com" "$case_dir/curl.log"; then
254255 pass "stable latest resolves from the release redirect without the API"
255256 else
@@ -257,7 +258,7 @@ test_stable_latest_without_api() {
257258 fail "stable latest resolves from the release redirect without the API"
258259 fi
259260
260- run_case stable-latest-bad env MOCK_LATEST_URL='https://github.com/bnema/gordon/releases' sh "$ROOT/install.sh"
261+ run_case stable-latest-bad env MOCK_LATEST_URL='https://git.bnema.dev/gordon/releases' sh "$ROOT/install.sh"
261262 if [ "$status" -ne 0 ] && grep -q "Could not determine latest stable version" "$case_dir/out" &&
262263 ! grep -q "releases/download" "$case_dir/curl.log"; then
263264 pass "unexpected latest redirect is rejected"
@@ -266,7 +267,7 @@ test_stable_latest_without_api() {
266267 fail "unexpected latest redirect is rejected"
267268 fi
268269
269- run_case stable-latest-unsafe env MOCK_LATEST_URL='https://github.com/bnema/gordon/releases/tag/v1.0.0;rm' sh "$ROOT/install.sh"
270+ run_case stable-latest-unsafe env MOCK_LATEST_URL='https://git.bnema.dev/gordon/releases/tag/v1.0.0;rm' sh "$ROOT/install.sh"
270271 if [ "$status" -ne 0 ] && grep -q "Could not determine latest stable version" "$case_dir/out"; then
271272 pass "unsafe latest tag is rejected"
272273 else
@@ -36,7 +36,7 @@ printf '%s\n' "\$*" >>'$case_dir/curl.log'
36 case "\$*" in36 case "\$*" in
37 *api.github.com/repos/bnema/gordon/commits/next*) printf '%s\n' '{"sha":"$SHA"}' ;;37 *api.github.com/repos/bnema/gordon/commits/next*) printf '%s\n' '{"sha":"$SHA"}' ;;
38 *codeload.github.com/bnema/gordon/tar.gz/$SHA*) : >'$case_dir/source.tar.gz' ;;38 *codeload.github.com/bnema/gordon/tar.gz/$SHA*) : >'$case_dir/source.tar.gz' ;;
39- *github.com/bnema/gordon/releases/latest*) printf '%s' "\${MOCK_LATEST_URL-https://github.com/bnema/gordon/releases/tag/v9.9.9}" ;;39+ *git.bnema.dev/gordon/releases/latest*) printf '%s' "\${MOCK_LATEST_URL-https://git.bnema.dev/gordon/releases/tag/v9.9.9}" ;;
40 *) exit 90 ;;40 *) exit 90 ;;
41 esac41 esac
42 EOF42 EOF
@@ -249,7 +249,8 @@ test_stable_latest_without_api() {
249 run_case stable-latest env sh "$ROOT/install.sh"249 run_case stable-latest env sh "$ROOT/install.sh"
250 # The mock refuses the checksum download; resolution is what is tested.250 # The mock refuses the checksum download; resolution is what is tested.
251 if grep -q "Resolved version: v9.9.9" "$case_dir/out" &&251 if grep -q "Resolved version: v9.9.9" "$case_dir/out" &&
252- grep -q "github.com/bnema/gordon/releases/download/v9.9.9/checksums.txt" "$case_dir/curl.log" &&252+ grep -q "git.bnema.dev/gordon/releases/download/v9.9.9/checksums.txt" "$case_dir/curl.log" &&
253+ ! grep -q "/-/github/api" "$case_dir/curl.log" &&
253 ! grep -q "api.github.com" "$case_dir/curl.log"; then254 ! grep -q "api.github.com" "$case_dir/curl.log"; then
254 pass "stable latest resolves from the release redirect without the API"255 pass "stable latest resolves from the release redirect without the API"
255 else256 else
@@ -257,7 +258,7 @@ test_stable_latest_without_api() {
257 fail "stable latest resolves from the release redirect without the API"258 fail "stable latest resolves from the release redirect without the API"
258 fi259 fi
259 260
260- run_case stable-latest-bad env MOCK_LATEST_URL='https://github.com/bnema/gordon/releases' sh "$ROOT/install.sh"261+ run_case stable-latest-bad env MOCK_LATEST_URL='https://git.bnema.dev/gordon/releases' sh "$ROOT/install.sh"
261 if [ "$status" -ne 0 ] && grep -q "Could not determine latest stable version" "$case_dir/out" &&262 if [ "$status" -ne 0 ] && grep -q "Could not determine latest stable version" "$case_dir/out" &&
262 ! grep -q "releases/download" "$case_dir/curl.log"; then263 ! grep -q "releases/download" "$case_dir/curl.log"; then
263 pass "unexpected latest redirect is rejected"264 pass "unexpected latest redirect is rejected"
@@ -266,7 +267,7 @@ test_stable_latest_without_api() {
266 fail "unexpected latest redirect is rejected"267 fail "unexpected latest redirect is rejected"
267 fi268 fi
268 269
269- run_case stable-latest-unsafe env MOCK_LATEST_URL='https://github.com/bnema/gordon/releases/tag/v1.0.0;rm' sh "$ROOT/install.sh"270+ run_case stable-latest-unsafe env MOCK_LATEST_URL='https://git.bnema.dev/gordon/releases/tag/v1.0.0;rm' sh "$ROOT/install.sh"
270 if [ "$status" -ne 0 ] && grep -q "Could not determine latest stable version" "$case_dir/out"; then271 if [ "$status" -ne 0 ] && grep -q "Could not determine latest stable version" "$case_dir/out"; then
271 pass "unsafe latest tag is rejected"272 pass "unsafe latest tag is rejected"
272 else273 else
M wiki/guides/podman-rootless.md +2 -2
@@ -95,9 +95,9 @@ EOF
9595
9696 ```bash
9797 # Download (choose your architecture)
98-wget https://github.com/bnema/gordon/releases/latest/download/gordon_linux_amd64.tar.gz
98+wget https://git.bnema.dev/gordon/releases/latest/download/gordon_linux_amd64.tar.gz
9999 # or for ARM64:
100-# wget https://github.com/bnema/gordon/releases/latest/download/gordon_linux_arm64.tar.gz
100+# wget https://git.bnema.dev/gordon/releases/latest/download/gordon_linux_arm64.tar.gz
101101
102102 tar -xzf gordon_linux_*.tar.gz
103103 chmod +x gordon
@@ -95,9 +95,9 @@ EOF
95 95
96 ```bash96 ```bash
97 # Download (choose your architecture)97 # Download (choose your architecture)
98-wget https://github.com/bnema/gordon/releases/latest/download/gordon_linux_amd64.tar.gz98+wget https://git.bnema.dev/gordon/releases/latest/download/gordon_linux_amd64.tar.gz
99 # or for ARM64:99 # or for ARM64:
100-# wget https://github.com/bnema/gordon/releases/latest/download/gordon_linux_arm64.tar.gz100+# wget https://git.bnema.dev/gordon/releases/latest/download/gordon_linux_arm64.tar.gz
101 101
102 tar -xzf gordon_linux_*.tar.gz102 tar -xzf gordon_linux_*.tar.gz
103 chmod +x gordon103 chmod +x gordon

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 7

Tags 106

↑↓ moveenter openesc close