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.

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()