Sign in

Search issue titles and bodies, change requests and comments. Private repositories you cannot read are not included.

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.

docs/releases.md +88

@@ -0,0 +1,88 @@
1 # Releases
2
3 A release should travel with the code. In Vole, it does: a release is a Git tag
4 with a message. The message is the release notes, and the tagged code is the
5 source. Both travel with every clone, so there is no separate release database to
6 keep in sync.
7
8 ## Create a release
9
10 ```sh
11 vole release create v1.0.0 -F notes.md
12 git push --follow-tags
13 ```
14
15 Plain Git works the same way:
16
17 ```sh
18 git tag -a v1.0.0 -F notes.md
19 git push --follow-tags
20 ```
21
22 Use an annotated tag (`git tag -a`). It has a message and a tagger. A lightweight
23 tag appears in the release list for completeness, but it has no notes and cannot
24 carry release files. `vole release create` refuses to overwrite an existing tag
25 and tells you to choose a new name.
26
27 ## Download source archives
28
29 The `/r/<repo>/releases` page lists every tag. A release page shows the notes, the
30 commits since the previous release, and two generated downloads:
31
32 ```sh
33 curl -O http://host/r/demo/releases/v1.0.0/archive.tar
34 curl -OJ http://host/r/demo/releases/v1.0.0/archive.tar.gz
35 ```
36
37 Vole builds the archives from the tagged tree when someone requests them, so they
38 cannot go stale. The `ETag` is the tag's id, so repeat downloads get a `304`, and
39 the same tag produces the same bytes on every instance.
40
41 If a repository tracks files with Git LFS, the release page shows a warning.
42 `git archive` copies pointer files, not the files themselves.
43
44 ## Attach release files
45
46 Binaries attach over SSH into the shared storage, and Vole records a pointer for
47 them:
48
49 ```sh
50 vole release attach v1.0.0 dist/vole-linux-amd64 dist/vole-darwin-arm64
51 curl -O http://host/r/demo/releases/v1.0.0/artifacts/vole-linux-amd64
52 sha256sum vole-linux-amd64
53 ```
54
55 Attach files after pushing the tag, not before. The pointer is what publishes the
56 file, and Vole refuses a pointer whose file was never uploaded. That way a
57 download link never points at nothing.
58
59 If you attach the same file twice, Vole stores one copy and the second upload
60 transfers nothing. Downloads support `ETag`, `304`, `Content-Disposition:
61 attachment`, and Range requests, so large files can resume. Files from a private
62 repository return `404`.
63
64 ## Releases do not change
65
66 Once a release has files attached, Vole refuses to move or delete that tag, remove
67 a file, or point a file name at different bytes. A saved download keeps meaning
68 what it meant.
69
70 You can add another file; that does not invalidate anything. An admin can repair a
71 mistyped release, and the override is recorded in `data/audit.log`.
72
73 Release file pointers live on the `vole` branch, so `vole gc --dry-run` treats a
74 published release file as something to keep.
75
76 ## Build a release in CI
77
78 A workflow can build and publish a release instead of attaching files by hand:
79
80 ```yaml
81 artifacts:
82 - path: dist/*
83 release: true
84 ```
85
86 The run records the same pointers that `vole release attach` writes, so the
87 release page, download behavior, and immutability rules stay the same. See
88 [CI § Build a release in CI](ci.md#build-a-release-in-ci).