aboutsummaryrefslogtreecommitdiff
path: root/issues.go
diff options
context:
space:
mode:
Diffstat (limited to 'issues.go')
-rw-r--r--issues.go85
1 files changed, 82 insertions, 3 deletions
diff --git a/issues.go b/issues.go
index 055b720..48ced5f 100644
--- a/issues.go
+++ b/issues.go
@@ -21,6 +21,7 @@ package main
*/
import (
+ "log"
"sort"
"strings"
"time"
@@ -103,7 +104,7 @@ func (b ByCategory) Less(i, j int) bool {
}
func (b ByCategory) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
-type ByAssignment []Issue
+type ByAssignment []Issue
func (b ByAssignment) Len() int { return len(b) }
func (b ByAssignment) Less(i, j int) bool {
@@ -111,7 +112,6 @@ func (b ByAssignment) Less(i, j int) bool {
}
func (b ByAssignment) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
-
type ById []Issue
func (b ById) Len() int { return len(b) }
@@ -199,7 +199,7 @@ func (i Issues) ByCategory(cat string) (issues Issues) {
issues = append(issues, issue)
}
}
- sort.Sort(sort.Reverse(ByHandlerAndId(issues)))
+ sort.Sort(sort.Reverse(ByHandlerAndId(issues)))
return issues
}
@@ -213,3 +213,82 @@ func (i Issues) ByCategoryAndTarget(cat, tar string) (issues Issues) {
sort.Sort(sort.Reverse(ByHandlerAndId(issues)))
return
}
+
+// Follow the example for multiSort in https://pkg.go.dev/sort
+
+type lessFunc func(i1, i2 *Issue) bool
+
+type multiSorter struct {
+ issues Issues
+ less []lessFunc
+}
+
+func (ms *multiSorter) Len() int {
+ return len(ms.issues)
+}
+
+func (ms *multiSorter) Sort(issues Issues) Issues {
+ ms.issues = issues
+ sort.Sort(ms)
+ return ms.issues
+}
+
+func (ms *multiSorter) Swap(i, j int) {
+ ms.issues[i], ms.issues[j] = ms.issues[j], ms.issues[i]
+}
+
+func (ms *multiSorter) Less(i, j int) bool {
+ p, q := &ms.issues[i], &ms.issues[j]
+ var k int
+ for k = 0; k < len(ms.less)-1; k++ {
+ less := ms.less[k]
+ switch {
+ case less(p, q):
+ return true
+ case less(q, p):
+ return false
+ }
+ }
+ return ms.less[k](p, q)
+}
+
+var severityOrder = map[string]int{
+ "block": 0,
+ "crash": 1,
+ "major": 2,
+ "minor": 3,
+ "text": 4,
+ "trivial": 5,
+ "tweak": 6}
+
+var lessFuncs = map[string]lessFunc{
+ "Category": func(i1, i2 *Issue) bool { return strings.Compare(i1.Category.Name, i2.Category.Name) < 0 },
+ "Assignment": func(i1, i2 *Issue) bool { return strings.Compare(i1.Handler.Name, i2.Handler.Name) < 0 },
+ "Handler": func(i1, i2 *Issue) bool { return strings.Compare(i1.Handler.Name, i2.Handler.Name) < 0 },
+ "Target": func(i1, i2 *Issue) bool { return strings.Compare(i1.TargetVersion.Name, i2.TargetVersion.Name) < 0 },
+ "Id": func(i1, i2 *Issue) bool { return i1.Id < i2.Id },
+ "Severity": func(i1, i2 *Issue) bool {
+ s1, ok := severityOrder[i1.Severity.Name]
+ if !ok {
+ return true
+ }
+ s2, ok := severityOrder[i2.Severity.Name]
+ if !ok {
+ return false
+ }
+ return s1 < s2
+ },
+}
+
+func OrderedBy(fields ...string) *multiSorter {
+ m := &multiSorter{}
+ for _, field := range fields {
+ fn, ok := lessFuncs[field]
+ if !ok {
+ log.Printf("unknown field to order by: %s\n", field)
+ return nil
+ }
+ m.less = append(m.less, fn)
+ }
+ return m
+}