vole
Clone
Read only, no credentials:
https://rodent.software/vole.git
Write over SSH with a registered key:
git clone ssh://git@rodent.software:2222/vole.git
A free and open-source forge that lives in your Git repo.
Docs: rewrite the README and organize the guides
520470e19cd906bd6fff987e2d132d793ce56486 · Keenan Nemetz · 16d ago · parent c5902451
Docs: rewrite the README and organize the guides Replace the long README with a landing page, split feature details into focused guides, and remove the roadmap and spike notes. Update comments that referenced them.
server/pages/pages.go +7−7
| @@ -1,8 +1,8 @@ | |||
| 1 | 1 | // Package pages serves a repository's site straight out of its git tree. | |
| 2 | 2 | // | |
| 3 | 3 | // There is no export step and no build to drift: the site is a branch, a push | |
| 4 | // moves the tip, and the next request reads the new tree. Two consequences shape | ||
| 5 | // the design, both measured in docs/spikes/tree-serving: | ||
| 4 | // moves the tip, and the next request reads the new tree. Two measurements shape | ||
| 5 | // the design: | ||
| 6 | 6 | // | |
| 7 | 7 | // - Blobs come through a pool of `git cat-file --batch` processes, because one | |
| 8 | 8 | // process serialises every read (12.1k req/s vs 24.8k with four). | |
| @@ -33,8 +33,8 @@ import ( | |||
| 33 | 33 | ||
| 34 | 34 | const ( | |
| 35 | 35 | // tipTTL is how long a resolved branch tip is trusted. A push is live within | |
| 36 | // this window, well inside the phase's five-second criterion, and in exchange | ||
| 37 | // git sees one ref read per second per site instead of one per request. | ||
| 36 | // this window, well under five seconds, and in exchange git sees one ref read | ||
| 37 | // per second per site instead of one per request. | ||
| 38 | 38 | tipTTL = time.Second | |
| 39 | 39 | // poolIdle is how long an unused cat-file pool lives. A forge with a hundred | |
| 40 | 40 | // repositories should not keep four hundred processes because somebody once | |
| @@ -76,9 +76,9 @@ type poolRef struct { | |||
| 76 | 76 | ||
| 77 | 77 | // siteState is everything a request needs to route and authorize, resolved in one | |
| 78 | 78 | // place and reused for the memo window. Resolving it means git subprocesses — | |
| 79 | // `Open` reads the default branch, `ACL` reads a ref — and the Phase 6 benchmark | ||
| 80 | // showed three spawns per request costing ~3.8 ms, forty times the cost of serving | ||
| 81 | // the blob itself. | ||
| 79 | // `Open` reads the default branch, `ACL` reads a ref — and benchmarking showed | ||
| 80 | // three spawns per request costing ~3.8 ms, forty times the cost of serving the | ||
| 81 | // blob itself. | ||
| 82 | 82 | type siteState struct { | |
| 83 | 83 | m *repo.Meta | |
| 84 | 84 | public bool | |