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 merged change requests their own colour and filter
0e35a6a00a03201f382c9669d01c2af81f3dbdd5 · Keenan Nemetz · 11d ago · parent f2360c20
Give merged change requests their own colour and filter The merged state borrowed --accent, which is green in Everforest and therefore read like an open request. It now has its own purple tokens in both the fallback and Everforest themes. The list also gains a Merged chip with its own count. Closed now counts only requests that were closed without landing, so the three state filters partition the list instead of overlapping.
server/web_test.go +63
| @@ -480,3 +480,66 @@ func TestReadmeRelativeLinksOpenTheFileTheyName(t *testing.T) { | |||
| 480 | 480 | t.Fatalf("the source view is not the file as written:\n%s", body) | |
| 481 | 481 | } | |
| 482 | 482 | } | |
| 483 | |||
| 484 | // TestChangeListFiltersMergedRequests: merged is its own state, not a synonym for | ||
| 485 | // closed. The page offers a filter and a count for it, and the Closed filter does | ||
| 486 | // not quietly include landings. | ||
| 487 | func TestChangeListFiltersMergedRequests(t *testing.T) { | ||
| 488 | t.Parallel() | ||
| 489 | f := newFixture(t) | ||
| 490 | f.publish(f.repo) | ||
| 491 | |||
| 492 | base := workRepo(t, map[string]string{"readme.md": "v1\n"}) | ||
| 493 | if _, errs, err := f.git(base, "push", f.sshURL(f.repo), "main:refs/heads/main"); err != nil { | ||
| 494 | t.Fatalf("main push: %s", errs) | ||
| 495 | } | ||
| 496 | feature, head := f.cloneWithChange(t, map[string]string{"readme.md": "v1\nfeature line\n"}, "feature") | ||
| 497 | if _, errs, err := f.git(feature, "push", f.sshURL(f.repo), "HEAD:refs/heads/feature"); err != nil { | ||
| 498 | t.Fatalf("feature push: %s", errs) | ||
| 499 | } | ||
| 500 | |||
| 501 | const ( | ||
| 502 | openID = "01M5JR2JK29KKMAA1T9MDNTR02" | ||
| 503 | mergedID = "01M5JR2JK29KKMAA1T9MDNTR03" | ||
| 504 | ) | ||
| 505 | meta := f.newMetaRepo(t) | ||
| 506 | if err := meta.apply(map[string]string{ | ||
| 507 | "requests/" + openID + "/request.md": requestFileTitled("Still open", "main", head, "keenan", "open body\n"), | ||
| 508 | "requests/" + mergedID + "/request.md": requestFileTitled("Already landed", "main", head, "keenan", "merged body\n"), | ||
| 509 | }, "requests"); err != nil { | ||
| 510 | t.Fatalf("requests push: %v", err) | ||
| 511 | } | ||
| 512 | if _, errs, err := f.cli(feature, "change", "merge", mergedID); err != nil { | ||
| 513 | t.Fatalf("merge: %v\n%s", err, errs) | ||
| 514 | } | ||
| 515 | |||
| 516 | code, body := f.get("/r/" + f.repo + "/requests?state=merged") | ||
| 517 | if code != 200 { | ||
| 518 | t.Fatalf("merged list = %d", code) | ||
| 519 | } | ||
| 520 | if !strings.Contains(body, "Already landed") || strings.Contains(body, "Still open") { | ||
| 521 | t.Fatalf("the Merged filter did not narrow to merged requests:\n%s", body) | ||
| 522 | } | ||
| 523 | if !strings.Contains(body, `class="state merged"`) { | ||
| 524 | t.Fatalf("the merged row has no merged state mark:\n%s", body) | ||
| 525 | } | ||
| 526 | for _, want := range []string{ | ||
| 527 | `>Merged <span class="chip-count">1</span>`, | ||
| 528 | `>Open <span class="chip-count">1</span>`, | ||
| 529 | `>Closed <span class="chip-count">0</span>`, | ||
| 530 | } { | ||
| 531 | if !strings.Contains(body, want) { | ||
| 532 | t.Fatalf("the change list does not show %q:\n%s", want, body) | ||
| 533 | } | ||
| 534 | } | ||
| 535 | |||
| 536 | // Closed means closed, not "no longer open": a landing is reachable through | ||
| 537 | // its own filter and is not counted twice. | ||
| 538 | code, body = f.get("/r/" + f.repo + "/requests?state=closed") | ||
| 539 | if code != 200 { | ||
| 540 | t.Fatalf("closed list = %d", code) | ||
| 541 | } | ||
| 542 | if strings.Contains(body, "Already landed") { | ||
| 543 | t.Fatalf("the Closed filter included a merged request:\n%s", body) | ||
| 544 | } | ||
| 545 | } | ||