/
main.go
138 lines (110 loc) · 3.84 KB
/
main.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
package gh
import (
"context"
"fmt"
"io/ioutil"
"strings"
"time"
"github.com/shurcooL/githubv4"
log "github.com/sirupsen/logrus"
"golang.org/x/oauth2"
"github.com/fgimenez/ci-health/pkg/constants"
"github.com/fgimenez/ci-health/pkg/types"
)
var (
zeroDate = time.Time{}
)
type Client struct {
inner *githubv4.Client
source string
}
func NewClient(tokenPath string, source string) (*Client, error) {
token, err := ioutil.ReadFile(tokenPath)
if err != nil {
return nil, err
}
src := oauth2.StaticTokenSource(
&oauth2.Token{AccessToken: strings.TrimSpace(string(token))},
)
httpClient := oauth2.NewClient(context.Background(), src)
inner := githubv4.NewClient(httpClient)
client := &Client{
inner,
source,
}
return client, nil
}
// OpenPRsAt returns the list of open PRs at a given date.
func (c *Client) OpenPRsAt(date time.Time) (types.MergeQueuePRList, error) {
mergedQueryString := fmt.Sprintf("repo:%s created:<%[2]s type:pr merged:>=%[2]s", c.source, date.Format(constants.DateFormat))
log.Debugf("merged open query: %q", mergedQueryString)
mergedQueryResult, err := c.mergeQueuePRQuery(mergedQueryString)
if err != nil {
return nil, err
}
notMergedQueryString := fmt.Sprintf("repo:%s created:<=%s type:pr is:open", c.source, date.Format(constants.DateFormat))
log.Debugf("not merged open query: %q", notMergedQueryString)
notMergedQueryResult, err := c.mergeQueuePRQuery(notMergedQueryString)
if err != nil {
return nil, err
}
log.Debugf("merge query result length: %d, not merged query result length: %d", len(mergedQueryResult), len(notMergedQueryResult))
return append(mergedQueryResult, notMergedQueryResult...), nil
}
// MergedPRsBetween returns a slice of PRs that were merged in the time frame
// defined by the start and end dates given as parameters.
func (c *Client) MergedPRsBetween(startDate, endDate time.Time) (types.MergeQueuePRList, error) {
mergedQueryString := fmt.Sprintf("repo:%s type:pr merged:%s..%s",
c.source,
startDate.Format(constants.DateFormat),
endDate.Format(constants.DateFormat),
)
log.Debugf("merged between query: %q", mergedQueryString)
mergedQueryResult, err := c.mergeQueuePRQuery(mergedQueryString)
if err != nil {
return nil, err
}
log.Debugf("merged between query result length: %d", len(mergedQueryResult))
return mergedQueryResult, nil
}
func (c *Client) mergeQueuePRQuery(query string) (types.MergeQueuePRList, error) {
variables := map[string]interface{}{
"querystring": githubv4.String(query),
}
var mergedQuery struct {
Search struct {
Nodes types.MergeQueuePRList
} `graphql:"search(query: $querystring, type: ISSUE, first:100)"`
}
err := c.inner.Query(context.Background(), &mergedQuery, variables)
return mergedQuery.Search.Nodes, err
}
// ChatopsMergedPRsBetween returns a slice of PRs that were merged in the time
// frame defined by the start and end dates given as parameters with data
// required by chatops tools.
func (c *Client) ChatopsMergedPRsBetween(startDate, endDate time.Time) (types.ChatopsPRList, error) {
mergedQueryString := fmt.Sprintf("repo:%s type:pr merged:%s..%s",
c.source,
startDate.Format(constants.DateFormat),
endDate.Format(constants.DateFormat),
)
log.Debugf("merged between query: %q", mergedQueryString)
mergedQueryResult, err := c.chatopsPRQuery(mergedQueryString)
if err != nil {
return nil, err
}
log.Debugf("merged between query result length: %d", len(mergedQueryResult))
return mergedQueryResult, nil
}
func (c *Client) chatopsPRQuery(query string) (types.ChatopsPRList, error) {
variables := map[string]interface{}{
"querystring": githubv4.String(query),
}
var mergedQuery struct {
Search struct {
Nodes types.ChatopsPRList
} `graphql:"search(query: $querystring, type: ISSUE, first:100)"`
}
err := c.inner.Query(context.Background(), &mergedQuery, variables)
return mergedQuery.Search.Nodes, err
}