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.
Number issues and change requests for human references
e05f1c48d4ee55635cd7b77889f0545137198106 · Keenan Nemetz · 13d ago · parent 41d1fee9
Number issues and change requests for human references A ULID is an unreadable handle, and the 8-character prefix the list showed is mostly timestamp: this repository's 27 issues shared seven distinct six-character prefixes and two pairs already collided at eight. The part people actually type carried almost no information. Issues and change requests now share one gap-free sequence (#1, #42, ...) derived from the creation order in the metadata branch's history, the way one forge counts both in a single run. The number is not stored. It is the rank of the entity's creation commit, so nothing is written when an entity is created, a repository needs no backfill, the same history gives the same numbers on every clone, and `vole admin index rebuild` reproduces them from git. A ULID stays the identity: paths, front matter, `closes:` and audit entries are unchanged, and data/index.db only caches the mapping so a page render does not walk history. Every id-taking command accepts a number, `#42` links in a body through a kind-agnostic /r/<repo>/n/42 route, and --closes resolves an alias to the ULID before writing. Closes #45
docs/change-requests.md +17−8
| @@ -93,22 +93,31 @@ moved. | |||
| 93 | 93 | A change request names the issues it fixes in its own metadata, not in its | |
| 94 | 94 | description: `request.md` carries a `closes` list, the request page shows those | |
| 95 | 95 | issues, and landing the request closes them in the same commit that marks it | |
| 96 | merged. A `#<ulid>` or `Fixes #<ulid>` in the description is only prose — it does | ||
| 97 | not link anything and closes nothing. | ||
| 96 | merged. A `#42`, `#<ulid>` or `Fixes #42` in the description is only prose — it | ||
| 97 | does not link anything and closes nothing. | ||
| 98 | 98 | ||
| 99 | 99 | Set the list when the request is opened, or later while it is still open: | |
| 100 | 100 | ||
| 101 | 101 | ```sh | |
| 102 | 102 | vole change new --title "Retry on timeout" --base main --head feature \ | |
| 103 | 103 | --closes 01M5JR2JK29KKMAA1T9MDNTPBP,01M5N1PRC4GJPZNEEG8PR8J4D6 | |
| 104 | vole change update <id> --closes 01M5JR2JK29KKMAA1T9MDNTPBP # replace the list | ||
| 105 | vole change update <id> --no-closes # clear it | ||
| 104 | vole change new --title "Retry on timeout" --base main --head feature \ | ||
| 105 | --closes 42,43 # the same list by number | ||
| 106 | vole change update <id> --closes 42 # replace the list | ||
| 107 | vole change update <id> --no-closes # clear it | ||
| 106 | 108 | ``` | |
| 107 | 109 | ||
| 108 | Ids are full 26-character ULIDs, and the issue has to exist when the link is | ||
| 109 | written, so a typo fails while the author is still looking at the command. The | ||
| 110 | browser's **Open change request** form takes the same list in its **Closes** | ||
| 111 | field. | ||
| 110 | The flag takes a full ULID or the `#42` number, and `42` is resolved to the ULID | ||
| 111 | before the link is written, so the file always holds ids. The issue has to exist | ||
| 112 | when the link is written, so a typo fails while the author is still looking at the | ||
| 113 | command, and a number that names a change request is refused: a request cannot | ||
| 114 | close a request. The browser's **Open change request** form takes the same list in | ||
| 115 | its **Closes** field. | ||
| 116 | |||
| 117 | A number is shared with issues, so `#42` may name either kind and the server | ||
| 118 | resolves it when the link is rendered. `closes:` is not where that resolution | ||
| 119 | lives: it holds ULIDs, because that is the reference that survives a rewritten | ||
| 120 | history. | ||
| 112 | 121 | ||
| 113 | 122 | Only an open request may be relinked: a merged request's list records what the | |
| 114 | 123 | merge did, and a closed one is not going to land. Landing is what closes an | |