@@ -11,7 +11,7 @@ const { NetworkError } = require("../utils/errors")
11
11
class Unapproved extends BaseCommand {
12
12
perform = ( ) => {
13
13
return this . projects
14
- . then ( projects => Promise . all ( projects . map ( this . __getUnapprovedRequests ) ) )
14
+ . then ( projects => Promise . all ( projects . map ( this . __getApplicableRequests ) ) )
15
15
. then ( this . __sortRequests )
16
16
. then ( this . __buildMessages )
17
17
. then ( this . __logMessages )
@@ -69,7 +69,7 @@ class Unapproved extends BaseCommand {
69
69
return this . __buildByReviewProgressMessages ( requests , markup )
70
70
}
71
71
72
- return this . __buildGeneralRequestsMessages ( requests , markup )
72
+ return this . __buildGeneralRequestsMessages ( "unapproved" , requests , markup )
73
73
}
74
74
75
75
__buildEmptyListMessage = markup => {
@@ -84,36 +84,50 @@ class Unapproved extends BaseCommand {
84
84
85
85
__buildByReviewProgressMessages = ( requests , markup ) => {
86
86
const messages = [ ]
87
- const [ toReviewRequests , underReviewRequests ] = _ . partition ( requests , req => (
88
- req . approvals_left > 0 && ! this . __isRequestUnderReview ( req )
89
- ) )
87
+ const [ toReviewRequests , underReviewRequests , reviewedWithConflicts ] = _ . values (
88
+ _ . groupBy ( requests , req => {
89
+ const isUnderReview = this . __isRequestUnderReview ( req )
90
+
91
+ switch ( true ) {
92
+ case req . approvals_left > 0 && ! isUnderReview :
93
+ return 0 // To review
94
+ case isUnderReview :
95
+ return 1 // Under review
96
+ default :
97
+ return 2 // Reviewed with conflicts
98
+ }
99
+ } ) ,
100
+ )
90
101
91
102
const makeSection = _ . flow (
92
103
markup . makeBold ,
93
104
markup . makeText ,
94
105
markup . makePrimaryInfo ,
95
106
)
96
107
97
- const toReviewSection = makeSection ( "Unapproved" )
98
- const underReviewSection = makeSection ( "Under review" )
99
-
100
- const toReviewMessages = this . __buildGeneralRequestsMessages ( toReviewRequests , markup )
101
- const underReviewMessages = this . __buildGeneralRequestsMessages ( underReviewRequests , markup )
108
+ const sections = [
109
+ { type : "unapproved" , name : "Unapproved" , requests : toReviewRequests } ,
110
+ { type : "under_review" , name : "Under review" , requests : underReviewRequests } ,
111
+ { type : "conflicts" , name : "With conflicts" , requests : reviewedWithConflicts } ,
112
+ ]
102
113
103
- toReviewMessages . forEach ( ( chunk , idx ) => {
104
- messages . push ( idx === 0 ? [ toReviewSection , ...chunk ] : chunk )
105
- } )
114
+ sections . forEach ( settings => {
115
+ const section = makeSection ( settings . name )
116
+ const sectionMessages = this . __buildGeneralRequestsMessages (
117
+ settings . type , settings . requests , markup ,
118
+ )
106
119
107
- underReviewMessages . forEach ( ( chunk , idx ) => {
108
- messages . push ( idx === 0 ? [ underReviewSection , ...chunk ] : chunk )
120
+ sectionMessages . forEach ( ( chunk , idx ) => {
121
+ messages . push ( idx === 0 ? [ section , ...chunk ] : chunk )
122
+ } )
109
123
} )
110
124
111
125
return messages
112
126
}
113
127
114
- __buildGeneralRequestsMessages = ( requests , markup ) => (
128
+ __buildGeneralRequestsMessages = ( type , requests , markup ) => (
115
129
this . __chunkRequests ( requests ) . map ( chunk => (
116
- chunk . map ( this . __buildRequestDescription ) . map ( markup . addDivider )
130
+ chunk . map ( request => this . __buildRequestDescription ( type , request ) ) . map ( markup . addDivider )
117
131
) )
118
132
)
119
133
@@ -123,21 +137,25 @@ class Unapproved extends BaseCommand {
123
137
return _ . chunk ( requests , requestsPerMessage )
124
138
}
125
139
126
- __buildRequestDescription = request =>
127
- new UnapprovedRequestDescription ( request , this . config ) . build ( )
140
+ __buildRequestDescription = ( type , request ) =>
141
+ new UnapprovedRequestDescription ( type , request , this . config ) . build ( )
128
142
129
143
__sortRequests = requests => requests
130
144
. flat ( ) . sort ( ( a , b ) => new Date ( a . updated_at ) - new Date ( b . updated_at ) )
131
145
132
- __getUnapprovedRequests = project => this . __getExtendedRequests ( project . id )
146
+ __getApplicableRequests = project => this . __getExtendedRequests ( project . id )
133
147
. then ( requests => requests . filter ( req => {
134
148
const isCompleted = ! req . work_in_progress
135
149
const isUnapproved = req . approvals_left > 0
136
150
const isUnderReview = this . __isRequestUnderReview ( req )
137
151
const hasPathsChanges = this . __hasPathsChanges ( req . changes , project . paths )
152
+ const checkConflicts = this . __getConfigSetting ( "unapproved.checkConflicts" , false )
138
153
const hasConflicts = req . has_conflicts
154
+ const isApplicable = checkConflicts
155
+ ? isUnapproved || isUnderReview || hasConflicts
156
+ : isUnapproved || isUnderReview
139
157
140
- return isCompleted && hasPathsChanges && ( isUnapproved || isUnderReview || hasConflicts )
158
+ return isCompleted && hasPathsChanges && isApplicable
141
159
} ) )
142
160
143
161
__isRequestUnderReview = req => req . discussions
@@ -156,12 +174,19 @@ class Unapproved extends BaseCommand {
156
174
) )
157
175
}
158
176
159
- __getExtendedRequests = projectId => this . gitlab
160
- . project ( projectId )
161
- . then ( project => this . gitlab . requests ( project . id ) . then ( requests => {
162
- const promises = requests . map ( request => this . __getExtendedRequest ( project , request ) )
163
- return Promise . all ( promises )
164
- } ) )
177
+ __getExtendedRequests = projectId => {
178
+ const checkConflicts = this . __getConfigSetting ( "unapproved.checkConflicts" , false )
179
+
180
+ return this . gitlab
181
+ . project ( projectId )
182
+ . then ( project => this . gitlab
183
+ . requests ( project . id , { withMergeStatusRecheck : checkConflicts } )
184
+ . then ( requests => {
185
+ const promises = requests . map ( request => this . __getExtendedRequest ( project , request ) )
186
+ return Promise . all ( promises )
187
+ } ) ,
188
+ )
189
+ }
165
190
166
191
__getExtendedRequest = ( project , request ) => Promise . resolve ( request )
167
192
. then ( req => this . __appendApprovals ( project , req ) )
0 commit comments