(use-modules (srfi srfi-1) (srfi srfi-19) (srfi srfi-28) (tissue issue) (tissue web)) (define %forgotten-threshold ;; 90 days 90) (define (forgotten-issue? issue) "Return #t if ISSUE is forgotten. Else, return #f. An issue is considered forgotten if there has been no activity for longer than %forgotten-threshold days." (timetime-monotonic (issue-last-updated-date issue)) (subtract-duration (date->time-monotonic (current-date)) (make-time time-duration 0 (* %forgotten-threshold 24 60 60))))) (define (unanswered-issue? issue) "Return #t if ISSUE is unanswered. Else, return #f. An issue is considered unanswered if none but the creator of the issue has posted to it." (= (length (delete-duplicates (map post-author (issue-posts issue)))) 1)) (define (numbered-issue-listing title-format issues) (section :title (format title-format (length issues)) :number #f (issue-listing (reverse issues)))) (document :title "GeneNetwork issue tracker" (ref :url "https://github.com/genenetwork/gn-gemtext-threads/new/main/issues" :text "Create new issue") " | " (ref :url "team.html" :text "Team agenda view") " | " (ref :url "topics.html" :text "Topics") " | " (ref :url "/topics/links.html" :text "Links") (numbered-issue-listing "~a unanswered issues" (filter (lambda (issue) (and (issue-open? issue) (unanswered-issue? issue))) (issues))) (numbered-issue-listing "~a forgotten issues" (filter (lambda (issue) (and (issue-open? issue) (forgotten-issue? issue))) (issues))) (numbered-issue-listing "~a active issues" (filter (lambda (issue) (and (issue-open? issue) (not (forgotten-issue? issue)) (not (unanswered-issue? issue)))) (issues))) (numbered-issue-listing "~a closed issues" (remove issue-open? (issues))))