OXYGENHUB

Write the forge's name as OxygenHub in everything people read 8d2caf122517

Author
Andy McCall @andymccall <[email protected]>
When
· 2026-09-28 11:16 UTC
Signature
✔ signed by Andy McCall
Hash
8d2caf1225172e2a53172fa6e85d88cb18e5d01807a47f4c96473aab76c281cf
Depends on
18e381ea88c2 19bb31ff1f5c 3f4b0ea6eabf 93be9ce4653e b64e2537d702 d23464c0ac60 f160cbc57756
Depended on by
e9bfea8e26db 756fe44a0f4d
In bookmarks
api-unknown-fields cancel-landed-runs clear-waiting close-proposal-140 diffusion-pin-bookmark draft-ready image-check job-waits main oh-comment-body-file proposal-list-fast run-one-job wiki-says-so
In tags
v0.1.0 v0.2.0 v0.3.0 v0.3.1 v0.4.0 v0.4.1 v0.4.2 v0.5.0 v0.5.1 v0.5.2 v0.6.0 v0.6.1 v0.7.0 v0.8.0 v0.9.0 v0.9.1 v0.9.11 v0.9.15 v0.9.16 v0.9.19 v0.9.2 v0.9.20 v0.9.21 v0.9.22 v0.9.23 v0.9.24 v0.9.3 v0.9.4 v0.9.5 v0.9.6 v0.9.7 v0.9.8 v0.9.9
Edits
37 atoms, 0 tree operations, 16 files

Browse the tree at this change

modified README.md +1 −1
1 -
# Oxygenhub
1 +
# OxygenHub
2 2
3 3
A forge for [Oxygen](../oxygen) repositories: hosting, browsing, review,
4 4
issues and releases, in one Rust binary with one data directory. It works
…
61 unchanged lines
modified crates/hub-api/Cargo.toml +1 −1
1 1
[package]
2 2
name = "hub-api"
3 -
description = "Types of the Oxygenhub JSON API, shared by the server and its clients"
3 +
description = "Types of the OxygenHub JSON API, shared by the server and its clients"
4 4
version.workspace = true
5 5
edition.workspace = true
6 6
license.workspace = true
…
10 unchanged lines
modified crates/hub-api/src/bin/typescript.rs +1 −1
…
60 unchanged lines
61 61
62 62
fn main() {
63 63
    println!("// Generated by `cargo run -p hub-api --bin hub-api-typescript`; do not edit.");
64 -
    println!("// Types of the Oxygenhub JSON API (hub spec §12.1).\n");
64 +
    println!("// Types of the OxygenHub JSON API (hub spec §12.1).\n");
65 65
    let mut printed = std::collections::BTreeSet::new();
66 66
    for (name, schema) in hub_api::schemas() {
67 67
        let v = serde_json::to_value(&schema).unwrap();
…
11 unchanged lines
modified crates/hub-api/src/lib.rs +1 −1
1 -
//! Types of the Oxygenhub JSON API (hub spec §12.1). Everything here is
1 +
//! Types of the OxygenHub JSON API (hub spec §12.1). Everything here is
2 2
//! `serde` data with no behaviour, so clients in other languages can be
3 3
//! generated from it and the server can never drift from them.
4 4
//!
…
645 unchanged lines
modified crates/hub-api/ts/index.d.ts +1 −1
1 1
// Generated by `cargo run -p hub-api --bin hub-api-typescript`; do not edit.
2 -
// Types of the Oxygenhub JSON API (hub spec §12.1).
2 +
// Types of the OxygenHub JSON API (hub spec §12.1).
3 3
4 4
export type Visibility = "public" | "internal" | "private";
5 5
…
382 unchanged lines
modified crates/hub/src/auth/totp.rs +1 −1
…
85 unchanged lines
86 86
        let rest = use_recovery_code(&stored, &codes[3]).unwrap();
87 87
        assert!(use_recovery_code(&rest, &codes[3]).is_none(), "a code is single use");
88 88
        assert!(use_recovery_code(&rest, &codes[4]).is_some());
89 -
        assert!(qr_svg(&uri("Oxygenhub", "andy", &new_secret())).unwrap().contains("<svg"));
89 +
        assert!(qr_svg(&uri("OxygenHub", "andy", &new_secret())).unwrap().contains("<svg"));
90 90
    }
91 91
}
modified crates/hub/src/config.rs +3 −3
…
25 unchanged lines
26 26
pub struct Email {
27 27
    /// `smtp://user:pass@host:port` or `smtps://…`; empty disables email.
28 28
    pub smtp: String,
29 -
    /// `Oxygenhub <hub@example>`.
29 +
    /// `OxygenHub <hub@example>`.
30 30
    pub from: String,
31 31
}
32 32
…
105 unchanged lines
138 138
139 139
impl Default for Site {
140 140
    fn default() -> Self {
141 -
        Site { name: "Oxygenhub".into(), description: "Repositories, proposals and issues for Oxygen".into() }
141 +
        Site { name: "OxygenHub".into(), description: "Repositories, proposals and issues for Oxygen".into() }
142 142
    }
143 143
}
144 144
…
148 unchanged lines
293 293
        let mut cfg = Config::parse("[server]\nbind = \"0.0.0.0:7300\"\n[limits]\nrender_limit = \"1MiB\"\n").unwrap();
294 294
        assert_eq!(cfg.server.bind, "0.0.0.0:7300");
295 295
        assert_eq!(cfg.limits.render_limit, ByteSize(1 << 20));
296 -
        assert_eq!(cfg.site.name, "Oxygenhub");
296 +
        assert_eq!(cfg.site.name, "OxygenHub");
297 297
        cfg.apply_env(|k| match k {
298 298
            "OXYHUB_SITE_NAME" => Some("Earth".into()),
299 299
            "OXYHUB_AUTH_PUSH_TOKENS" => Some("a, b".into()),
…
7 unchanged lines
modified crates/hub/src/lib.rs +1 −1
1 -
//! Oxygenhub: a forge for Oxygen repositories (`docs/spec.md`).
1 +
//! OxygenHub: a forge for Oxygen repositories (`docs/spec.md`).
2 2
//!
3 3
//! One process: an axum router serving pages, the JSON API and the wire
4 4
//! protocol; SQLite for hub state; repositories as bare Oxygen stores.
…
93 unchanged lines
modified crates/hub/src/main.rs +1 −1
…
135 unchanged lines
136 136
    let toml_path = data.join("hub.toml");
137 137
    if !toml_path.exists() {
138 138
        let base = base_url.clone().unwrap_or_else(|| "http://127.0.0.1:7300".into());
139 -
        let mut text = String::from("# Oxygenhub configuration (docs/spec.md section 17.1)\n\n[site]\nname = \"Oxygenhub\"\n\n[server]\nbind = \"127.0.0.1:7300\"\n");
139 +
        let mut text = String::from("# OxygenHub configuration (docs/spec.md section 17.1)\n\n[site]\nname = \"OxygenHub\"\n\n[server]\nbind = \"127.0.0.1:7300\"\n");
140 140
        if self_signed {
141 141
            text.push_str("tls_bind = \"0.0.0.0:7343\"\n");
142 142
        }
…
140 unchanged lines
modified crates/hub/src/mirror.rs +1 −1
…
86 unchanged lines
87 87
}
88 88
89 89
fn challenge() -> Response {
90 -
    (StatusCode::UNAUTHORIZED, [(header::WWW_AUTHENTICATE, "Basic realm=\"Oxygenhub\"")], "authentication required").into_response()
90 +
    (StatusCode::UNAUTHORIZED, [(header::WWW_AUTHENTICATE, "Basic realm=\"OxygenHub\"")], "authentication required").into_response()
91 91
}
92 92
93 93
/// Every smart-HTTP path under `/{owner}/{name}.git/`.
…
102 unchanged lines
modified crates/hub/src/web/mod.rs +1 −1
…
388 unchanged lines
389 389
            tracing::error!("{}", self.detail);
390 390
        }
391 391
        let shell = self.shell.map(|b| *b).unwrap_or(Shell {
392 -
            site: "Oxygenhub".into(),
392 +
            site: "OxygenHub".into(),
393 393
            base_url: String::new(),
394 394
            path: String::new(),
395 395
            version: "",
…
94 unchanged lines
modified docs/plan.md +1 −1
1 -
# Oxygenhub plan
1 +
# OxygenHub plan
2 2
3 3
Milestones from `docs/spec.md` §19. Each item is checked when its tests
4 4
pass, clippy is clean, and the change is committed with `oxy`.
…
88 unchanged lines
modified docs/runner.md +1 −1
…
3 unchanged lines
4 4
|---|---|
5 5
| **Status** | Draft 0.1, for review |
6 6
| **Scope** | Continuous integration and delivery for Oxygen repositories: pipeline definitions in the repository, a runner daemon (`oxyrun`) that executes them in fresh containers, the hub's queue and job API, and results as signed seals that gate landing. |
7 -
| **Depends on** | Oxygenhub ≥ 0.6 (checks, required checks, webhooks, API), `oxy-core` for checkouts and seals, an OCI runtime (Podman preferred, Docker supported) |
7 +
| **Depends on** | OxygenHub ≥ 0.6 (checks, required checks, webhooks, API), `oxy-core` for checkouts and seals, an OCI runtime (Podman preferred, Docker supported) |
8 8
| **Date** | 2026-09-27 |
9 9
10 10
## 1. Why another CI system
…
184 unchanged lines
modified docs/spec.md +4 −4
1 -
# Oxygenhub — Specification
1 +
# OxygenHub — Specification
2 2
3 3
| | |
4 4
|---|---|
…
47 unchanged lines
52 52
53 53
## 2. How it compares with GitHub
54 54
55 -
| GitHub | Oxygenhub | Why it differs |
55 +
| GitHub | OxygenHub | Why it differs |
56 56
|---|---|---|
57 57
| Repository, owner, organisation | Same | — |
58 58
| Branch | **Bookmark** | An Oxygen bookmark names a set of heads, not one commit |
…
158 unchanged lines
217 217
218 218
`header` (wordmark, global search box, "+" menu for new repository/issue/proposal, notifications bell with unread count, avatar menu) · `.band` (Repositories · Explore · Proposals · Issues · Notifications, with admin links pushed right) · repository `.tabs` (Code · Changes · Proposals · Issues · Releases · Trust · Settings, each with a count pill) · `main` at 1180px max (wider than retroplay's 980 because diffs need it; tree and file pages use 100% with 22px gutters) · `footer`.
219 219
220 -
Every page has a `<title>` of the form `<thing> · <owner>/<name> · Oxygenhub`.
220 +
Every page has a `<title>` of the form `<thing> · <owner>/<name> · OxygenHub`.
221 221
222 222
### 6.3 Pages
223 223
…
245 unchanged lines
469 469
470 470
[email]
471 471
smtp = "smtp://…"               # optional
472 -
from = "Oxygenhub <hub@example>"
472 +
from = "OxygenHub <hub@example>"
473 473
474 474
[mirror]
475 475
git = "/usr/bin/git"
…
67 unchanged lines
modified templates/base.html +1 −1
…
29 unchanged lines
30 30
  {% if shell.user.is_some() %}<a href="/notifications">Notifications</a><a href="/settings">Settings</a>{% endif %}
31 31
  <span class="grow"></span>
32 32
  {% if shell.is_admin %}<a class="admin" href="/admin">Admin</a>{% endif %}
33 -
  <a class="dim" href="/{{ shell.version }}" title="Oxygenhub {{ shell.version }}" tabindex="-1">v{{ shell.version }}</a>
33 +
  <a class="dim" href="/{{ shell.version }}" title="OxygenHub {{ shell.version }}" tabindex="-1">v{{ shell.version }}</a>
34 34
</div>
35 35
{% block tabs %}{% endblock %}
36 36
<main{% block mainclass %}{% endblock %}>
…
21 unchanged lines
modified templates/style.css +1 −1
1 -
/* Oxygenhub. The RetroPlay Network theme (hub spec §6.1): dark by default
1 +
/* OxygenHub. The RetroPlay Network theme (hub spec §6.1): dark by default
2 2
   on the Commander X16 palette, light under [data-theme="light"], Barlow
3 3
   for text and Press Start 2P for the wordmark and first columns, square
4 4
   corners, thin rules, a band for navigation. Fonts are vendored. */
…
299 unchanged lines