forked from jenkins-x/test-infra
/
items.go
154 lines (120 loc) · 3.27 KB
/
items.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/*
Copyright 2017 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package matchers
import (
"sort"
"time"
"github.com/google/go-github/github"
)
type Items []Item
// AddComments returns a new list with the added comments
func (i Items) AddComments(comments ...*github.IssueComment) Items {
for _, comment := range comments {
i = append(i, (*Comment)(comment))
}
sort.Sort(i)
return i
}
// AddEvents returns a new list with the added events
func (i Items) AddEvents(events ...*github.IssueEvent) Items {
for _, event := range events {
i = append(i, (*Event)(event))
}
sort.Sort(i)
return i
}
// AddReviewComments returns a new list with the added review comments
func (i Items) AddReviewComments(reviews ...*github.PullRequestComment) Items {
for _, review := range reviews {
i = append(i, (*ReviewComment)(review))
}
sort.Sort(i)
return i
}
// Events returns the events from the list
func (i Items) Events() []*github.IssueEvent {
events := []*github.IssueEvent{}
for _, item := range i {
events = item.AppendEvent(events)
}
return events
}
// Comments returns the comments from the list
func (i Items) Comments() []*github.IssueComment {
comments := []*github.IssueComment{}
for _, item := range i {
comments = item.AppendComment(comments)
}
return comments
}
// ReviewComments returns the review comments from the list
func (i Items) ReviewComments() []*github.PullRequestComment {
reviews := []*github.PullRequestComment{}
for _, item := range i {
reviews = item.AppendReviewComment(reviews)
}
return reviews
}
// Swap two Items
func (i Items) Swap(x, y int) {
i[x], i[y] = i[y], i[x]
}
// Less compares two Items
func (i Items) Less(x, y int) bool {
if i[x].Date() == nil {
return true
} else if i[y].Date() == nil {
return false
}
return i[x].Date().Before(*i[y].Date())
}
// Len is the number of Items
func (i Items) Len() int {
return len(i)
}
// Empty checks for emptiness
func (i Items) IsEmpty() bool {
return len(i) == 0
}
// GetLast returns the last item from the list
func (i Items) GetLast() Item {
return i[len(i)-1]
}
// GetLast returns the first item from the list
func (i Items) GetFirst() Item {
return i[0]
}
// Filter will return the list of matching Items
func (i Items) Filter(matcher Matcher) Items {
matches := Items{}
for _, item := range i {
if item.Match(matcher) {
matches = append(matches, item)
}
}
return matches
}
// LastDate returns the date of the last matching event, or deflt if no match
func (i Items) LastDate(deflt *time.Time) *time.Time {
if i.IsEmpty() {
return deflt
}
return i.GetLast().Date()
}
// FirstDate returns the date of the first matching event, or deflt if no match
func (i Items) FirstDate(deflt *time.Time) *time.Time {
if i.IsEmpty() {
return deflt
}
return i.GetFirst().Date()
}