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.

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