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/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 }