vole
Clone
Read only, no credentials:
https://rodent.software/git/vole.git
Write over SSH with a registered key:
git clone ssh://git@0.0.0.0:2222/vole.git
A free and open-source forge that lives in your Git repo.
Store changes under changes/<ulid>/change.md
b492b557f5cc5633b3dcb21fdbb5e2ad98d0bc16 · Keenan Nemetz · 3d ago · parent 9bce3723
Store changes under changes/<ulid>/change.md The web, the CLI, and the docs call these items changes; only the metadata tree still said requests. Rename the directory and the record file so the format and the product use one word. The tree is a contract, so this is a format change rather than a display change: the top-level layout stays closed, and a request path no longer validates. An existing repository is migrated by rewriting its vole branch, which is an audited admin force-push; the index rebuilds from the new tip and the #N aliases keep their ULIDs because the rewrite preserves commit order. Refs #202 (01M6S3JC3Y2KA6EFJK6APX7A1T).
metadata/issues_test.go +2−2
| @@ -263,7 +263,7 @@ func TestAnchorMustBeWhole(t *testing.T) { | |||
| 263 | 263 | {"escaping path", "author: keenan\ncreated: 2026-10-23T09:00:00Z\npath: ../secret\nside: new\nline: 4\nblob: " + blob + "\n"}, | |
| 264 | 264 | } | |
| 265 | 265 | for _, c := range cases { | |
| 266 | _, prob := ParseComment(idB, "---\n"+c.head+"---\nbody\n", "requests/"+idA+"/comments/"+idB+".md") | ||
| 266 | _, prob := ParseComment(idB, "---\n"+c.head+"---\nbody\n", "changes/"+idA+"/comments/"+idB+".md") | ||
| 267 | 267 | if prob == "" { | |
| 268 | 268 | t.Fatalf("%s was accepted", c.name) | |
| 269 | 269 | } | |
| @@ -310,7 +310,7 @@ func TestCommentPathMatchesTheReader(t *testing.T) { | |||
| 310 | 310 | if IsIssueCommentPath("issues/" + idA + "/issue.md") { | |
| 311 | 311 | t.Fatal("an issue file was mistaken for a comment") | |
| 312 | 312 | } | |
| 313 | if IsIssueCommentPath("requests/" + idA + "/request.md") { | ||
| 313 | if IsIssueCommentPath("changes/" + idA + "/change.md") { | ||
| 314 | 314 | t.Fatal("a request file was mistaken for a comment") | |
| 315 | 315 | } | |
| 316 | 316 | } | |