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.
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
core/git/git.go +11
| @@ -188,6 +188,17 @@ func (r *Repo) RevParseAny(rev string) (string, error) { | |||
| 188 | 188 | return strings.TrimSpace(string(out)), nil | |
| 189 | 189 | } | |
| 190 | 190 | ||
| 191 | // TreeOf resolves a revision to the tree it names. It is how a merge commit is | ||
| 192 | // compared with the tree a clean merge of its parents would produce, without | ||
| 193 | // reading either tree into memory. | ||
| 194 | func (r *Repo) TreeOf(rev string) (string, error) { | ||
| 195 | out, errs, err := r.run(nil, "rev-parse", "--verify", "--quiet", rev+"^{tree}") | ||
| 196 | if err != nil { | ||
| 197 | return "", fmt.Errorf("rev-parse %q^{tree}: %w: %s", rev, err, errs) | ||
| 198 | } | ||
| 199 | return strings.TrimSpace(string(out)), nil | ||
| 200 | } | ||
| 201 | |||
| 191 | 202 | func (r *Repo) Exists() bool { | |
| 192 | 203 | st, err := os.Stat(r.Dir) | |
| 193 | 204 | return err == nil && st.IsDir() | |