-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathreview.go
107 lines (92 loc) · 2.09 KB
/
review.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
package vsts
import (
"log"
"strings"
)
var config *Config
func init() {
var err error
config, err = GetConfig()
if err != nil {
log.Fatal(err)
}
}
// Review do multiple reviews
func Review(pr *PullRequest) error {
diffs, err := getDiffsBetweenBranches(getBranchNameFromRefName(pr.Resource.TargetRefName), getBranchNameFromRefName(pr.Resource.SourceRefName))
if err != nil {
return err
}
ir := imageReview{diffs, pr}
imagePass, err := ir.review()
if err != nil {
return err
}
cgr := changeGroupReview{diffs, pr}
changeGroupPass, err := cgr.review()
if err != nil {
return err
}
ser := storageEntitiesReview{diffs, pr}
storageEntitiesPass, err := ser.review()
if err != nil {
return err
}
err = vote(pr, imagePass && changeGroupPass && storageEntitiesPass)
if err != nil {
return err
}
return nil
}
func vote(pr *PullRequest, pass bool) error {
if pass {
log.Printf("All check passed for PR: %v\n", pr.Resource.PullRequestID)
c, err := containsHumanComments(pr)
if err != nil {
return nil
}
if c {
log.Printf("PR contains human comments, skip voting.\n")
return nil
}
for _, reviewer := range pr.Resource.Reviewers {
if strings.EqualFold(reviewer.ID, config.UserID) {
if reviewer.Vote < 0 {
// reset
err := votePullRequest(pr.Resource.PullRequestID, 0)
if err != nil {
return err
}
}
break
}
}
} else {
// wait
err := votePullRequest(pr.Resource.PullRequestID, -5)
if err != nil {
return err
}
}
return nil
}
func containsHumanComments(pr *PullRequest) (bool, error) {
commentThreads, err := getCommentThreads(pr.Resource.PullRequestID)
if err != nil {
return false, err
}
for _, thread := range commentThreads.Value {
if !thread.IsDeleted {
for _, comment := range thread.Comments {
if !comment.IsDeleted &&
!strings.EqualFold(comment.CommentType, "system") &&
strings.EqualFold(comment.Author.ID, config.UserID) &&
!strings.HasPrefix(comment.Content, "[BOT_") {
log.Printf("Found human comment: %+v\n", comment)
return true, nil
}
}
}
}
return false, nil
}