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.

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 }