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.
Test the merge result before landing it
e5478085e5b53a2892d0649d6f07c6f0a5653378 · Keenan Nemetz · 11d ago · parent db5e4382
Test the merge result before landing it A protected branch could receive a non-fast-forward landing whose tree was never built: the gate asked for checks on the request head, and the merge commit was made at landing time. A pushed merge with the right parents but extra content was accepted too. Publish the merge commit under refs/vole/candidates/, test it as the base branch, and make the gate require its results. Approvals name the head and the base branch, so a moved base retests without a new approval. A merger who clicks while that run is still going waits for it instead of clicking again. A pushed merge commit now has to carry exactly the tree a clean merge would produce. Closes: 01M61QQ56TESQ1HTMB1Z5C3733
ci/validate.go +5
| @@ -40,6 +40,11 @@ func ValidRef(ref string) bool { | |||
| 40 | 40 | name = strings.TrimPrefix(ref, "refs/heads/") | |
| 41 | 41 | case strings.HasPrefix(ref, "refs/tags/"): | |
| 42 | 42 | name = strings.TrimPrefix(ref, "refs/tags/") | |
| 43 | case strings.HasPrefix(ref, "refs/vole/candidates/"): | ||
| 44 | // A combined result is a server-published commit a runner is asked to | ||
| 45 | // build before it lands. It is not a branch or a tag, but it is a ref the | ||
| 46 | // server owns and the runner must fetch by id. | ||
| 47 | name = strings.TrimPrefix(ref, "refs/vole/candidates/") | ||
| 43 | 48 | default: | |
| 44 | 49 | return false | |
| 45 | 50 | } | |