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.
Require a linked issue when a change request opens
0789f22ea633bf995417893c0052abb6a36d5520 · Keenan Nemetz · 9d ago · parent 1265ea55
Require a linked issue when a change request opens Add a per-repository policy for teams that want every proposed update to trace back to an issue. The browser marks Closes as required, and the pre-receive hook applies the same rule to requests added through the CLI or a hand-written metadata commit. Existing requests stay editable and landable.
forge/access/acl.go +11
| @@ -79,6 +79,11 @@ type ACL struct { | |||
| 79 | 79 | // them before merging. A repository with no workflows is unaffected, because | |
| 80 | 80 | // there is nothing to run. | |
| 81 | 81 | ChecksRequired *bool `json:"checks_required,omitempty"` | |
| 82 | // RequireLinkedIssue makes opening a new change request require at least one | ||
| 83 | // linked issue in its closes list. It is about how a team files work, not who | ||
| 84 | // may write: existing requests keep their history and can still be edited, | ||
| 85 | // approved, and landed after the setting is turned on. | ||
| 86 | RequireLinkedIssue bool `json:"require_linked_issue,omitempty"` | ||
| 82 | 87 | // Runners are the accounts whose CI results count as checks here. It is an | |
| 83 | 88 | // allowlist rather than a role because it answers a different question from | |
| 84 | 89 | // read/write: not "may this account touch the repository" but "may this | |
| @@ -182,6 +187,12 @@ func (a *ACL) RequiresChecks() bool { | |||
| 182 | 187 | return *a.ChecksRequired | |
| 183 | 188 | } | |
| 184 | 189 | ||
| 190 | // RequiresLinkedIssue reports whether new change requests must name at least | ||
| 191 | // one issue they close. | ||
| 192 | func (a *ACL) RequiresLinkedIssue() bool { | ||
| 193 | return a != nil && a.RequireLinkedIssue | ||
| 194 | } | ||
| 195 | |||
| 185 | 196 | // RequiredApprovals resolves the nil-means-default rule. | |
| 186 | 197 | func (a *ACL) RequiredApprovals() int { | |
| 187 | 198 | if a.ApprovalsRequired == nil { | |