4
4
} = require ( './review_state' ) ;
5
5
const { isCollaborator } = require ( './collaborators' ) ;
6
6
const { ascending } = require ( './comp' ) ;
7
- const LGTM_RE = / ( \W | ^ ) l g t m ( \W | $ ) / i;
7
+ const LGTM_RE = / ^ l g t m \W ? $ / i;
8
8
const FROM_REVIEW = 'review' ;
9
9
const FROM_COMMENT = 'comment' ;
10
+ const FROM_REVIEW_COMMENT = 'review_comment' ;
10
11
11
12
class Review {
12
13
/**
@@ -55,7 +56,14 @@ class ReviewAnalyzer {
55
56
const map = new Map ( ) ;
56
57
const collaborators = this . collaborators ;
57
58
const list = this . reviews
58
- . filter ( ( r ) => r . state !== PENDING && r . state !== COMMENTED )
59
+ . filter ( ( r ) => r . state !== PENDING )
60
+ . filter ( ( r ) => {
61
+ if ( r . state === COMMENTED ) {
62
+ return this . isApprovedInComment ( r ) ;
63
+ } else {
64
+ return true ;
65
+ }
66
+ } )
59
67
. filter ( ( r ) => {
60
68
return ( isCollaborator ( collaborators , r . author ) ) ;
61
69
} ) . sort ( ( a , b ) => {
@@ -80,6 +88,12 @@ class ReviewAnalyzer {
80
88
new Review ( r . state , r . publishedAt , r . url , FROM_REVIEW )
81
89
) ;
82
90
break ;
91
+ case COMMENTED :
92
+ map . set (
93
+ login ,
94
+ new Review ( APPROVED , r . publishedAt , r . bodyText , FROM_REVIEW_COMMENT )
95
+ ) ;
96
+ break ;
83
97
case DISMISSED :
84
98
// TODO: check the state of the dismissed review?
85
99
map . delete ( login ) ;
@@ -97,7 +111,7 @@ class ReviewAnalyzer {
97
111
updateMapByRawReviews ( oldMap ) {
98
112
const comments = this . comments ;
99
113
const collaborators = this . collaborators ;
100
- const withLgtm = comments . filter ( ( c ) => LGTM_RE . test ( c . bodyText ) )
114
+ const withLgtm = comments . filter ( ( c ) => this . hasLGTM ( c ) )
101
115
. filter ( ( c ) => {
102
116
return ( isCollaborator ( collaborators , c . author ) ) ;
103
117
} ) . sort ( ( a , b ) => {
@@ -133,17 +147,34 @@ class ReviewAnalyzer {
133
147
for ( const [ login , review ] of reviewers ) {
134
148
const reviewer = collaborators . get ( login . toLowerCase ( ) ) ;
135
149
if ( review . state === APPROVED ) {
136
- result . approved . push ( { reviewer, review } ) ;
150
+ result . approved . push ( { reviewer, review} ) ;
137
151
} else if ( review . state === CHANGES_REQUESTED ) {
138
152
result . rejected . push ( { reviewer, review } ) ;
139
153
}
140
154
}
141
155
return result ;
142
156
}
157
+
158
+ /**
159
+ * @param review
160
+ * @returns {boolean }
161
+ */
162
+ isApprovedInComment ( review ) {
163
+ return review . state === COMMENTED && this . hasLGTM ( review ) ;
164
+ }
165
+
166
+ /**
167
+ * @param object
168
+ * @param prop: string
169
+ * @returns {boolean }
170
+ */
171
+ hasLGTM ( object ) {
172
+ return LGTM_RE . test ( object . bodyText . trim ( ) ) ;
173
+ }
143
174
}
144
175
145
176
const REVIEW_SOURCES = {
146
- FROM_COMMENT , FROM_REVIEW
177
+ FROM_COMMENT , FROM_REVIEW , FROM_REVIEW_COMMENT
147
178
} ;
148
179
149
180
module . exports = {
0 commit comments