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.
Give the CLI rerun too
70291860685b74018f96a47686e5e6160e11f14f · Keenan Nemetz · 6d ago · parent deb024d4
Give the CLI rerun too The run page offered Rerun while the CLI did not. It is the same maintainer action against the same instance-side queue: `vole run rerun <id>` queues a finished run again with the job it already pinned, refuses one that has not finished, and writes the same `run.rerun` audit record the page writes. Both transports now offer both run actions, which is what #168 asked of issues and comments applied to CI.
client/remote.go +14−1
| @@ -324,6 +324,19 @@ func MergeChange(gitDir, remote, id string) (string, error) { | |||
| 324 | 324 | // maintainer capability, records the audit line, and says which of the two happened. | |
| 325 | 325 | // The id is the 26-character one the run page shows in its URL. | |
| 326 | 326 | func CancelRun(gitDir, remote, runID string) (string, error) { | |
| 327 | return runVerb(gitDir, remote, runID, "vole-run-cancel") | ||
| 328 | } | ||
| 329 | |||
| 330 | // RerunRun queues a finished run again with the same pinned job. Attempts keep their | ||
| 331 | // history; the run is a rerun of the job it already named, not a new row. The server | ||
| 332 | // checks the maintainer capability and records the audit line. | ||
| 333 | func RerunRun(gitDir, remote, runID string) (string, error) { | ||
| 334 | return runVerb(gitDir, remote, runID, "vole-run-rerun") | ||
| 335 | } | ||
| 336 | |||
| 337 | // runVerb resolves the instance and repository for one run-management verb and runs | ||
| 338 | // it. The caller has already decided which verb; this is only the wire. | ||
| 339 | func runVerb(gitDir, remote, runID, verb string) (string, error) { | ||
| 327 | 340 | runID = strings.ToUpper(strings.TrimSpace(runID)) | |
| 328 | 341 | if !voleid.Valid(runID) { | |
| 329 | 342 | return "", fmt.Errorf("%q is not a run id; use the 26-character id from the run page", runID) | |
| @@ -335,7 +348,7 @@ func CancelRun(gitDir, remote, runID string) (string, error) { | |||
| 335 | 348 | if RepoNameFromPath(path) == "" { | |
| 336 | 349 | return "", fmt.Errorf("%s does not name a repository", remote) | |
| 337 | 350 | } | |
| 338 | out, err := RunSSH(host, port, "vole-run-cancel "+quoteSSHArg(path)+" "+quoteSSHArg(runID)) | ||
| 351 | out, err := RunSSH(host, port, verb+" "+quoteSSHArg(path)+" "+quoteSSHArg(runID)) | ||
| 339 | 352 | if err != nil { | |
| 340 | 353 | return "", err | |
| 341 | 354 | } | |