@@ -117,10 +117,10 @@ trait PullRequestService {
117
117
final case class InvalidPrevious (users : List [String ], commit : Commit ) extends CommitStatus { def isValid = false }
118
118
119
119
/** Partitions invalid and valid commits */
120
- def checkCLA (xs : List [Commit ], httpClient : Client ): Task [List [CommitStatus ]] = {
120
+ def checkCLA (xs : List [Commit ])( implicit client : Client ): Task [List [CommitStatus ]] = {
121
121
def checkUser (user : String ): Task [Commit => CommitStatus ] = {
122
122
val claStatus = for {
123
- claRes <- httpClient .expect(get(claUrl(user)))(jsonOf[CLASignature ])
123
+ claRes <- client .expect(get(claUrl(user)))(jsonOf[CLASignature ])
124
124
} yield { (commit : Commit ) =>
125
125
if (claRes.signed) Valid (Some (user), commit)
126
126
else Invalid (user, commit)
@@ -303,7 +303,7 @@ trait PullRequestService {
303
303
304
304
for {
305
305
commits <- getCommits(issue.number)
306
- statuses <- checkCLA(commits, httpClient )
306
+ statuses <- checkCLA(commits)
307
307
308
308
(validStatuses, invalidStatuses) = statuses.partition(_.isValid)
309
309
invalidUsers = usersFromInvalid(invalidStatuses)
@@ -372,23 +372,41 @@ trait PullRequestService {
372
372
.map(_.forall(identity))
373
373
374
374
def checkSynchronize (issue : Issue ): Task [Response ] = {
375
- implicit val httpClient = PooledHttp1Client ()
375
+ implicit val client = PooledHttp1Client ()
376
+
377
+ def extractFailures (c : List [CommitStatus ]): List [String ] = c.collect {
378
+ case Invalid (user, _) =>
379
+ s " @ $user hasn't signed the CLA "
380
+ case MissingUser (commit) =>
381
+ s " missing user for commit: ${commit.sha} - correct email associated with GitHub account? "
382
+ case CLAServiceDown (user, _) =>
383
+ s " couldn't fetch status for: $user"
384
+ }
376
385
377
386
for {
378
387
commits <- getCommits(issue.number)
379
- statuses <- checkCLA(commits, httpClient )
388
+ statuses <- checkCLA(commits)
380
389
invalid = statuses.filterNot(_.isValid)
381
- _ <- sendStatuses(invalid, httpClient )
382
- _ <- cancelBuilds(commits.dropRight(1 ))(httpClient)
390
+ _ <- sendStatuses(invalid, client )
391
+ _ <- cancelBuilds(commits.dropRight(1 ))
383
392
384
393
// Set final commit status based on `invalid`:
385
394
_ <- {
386
395
if (invalid.nonEmpty)
387
- setStatus(InvalidPrevious (usersFromInvalid(invalid), commits.last), httpClient )
396
+ setStatus(InvalidPrevious (usersFromInvalid(invalid), commits.last), client )
388
397
else
389
- setStatus(statuses.last, httpClient )
398
+ setStatus(statuses.last, client )
390
399
}
391
- _ <- httpClient.shutdown
400
+
401
+ // Send comment regarding recheck:
402
+ comment =
403
+ if (invalid.isEmpty) " All users have signed the CLA as far as I can tell! :tada:"
404
+ else s " There are still some issues: \n\n - ${extractFailures(invalid).mkString(" \n - " )}"
405
+
406
+ req <- post(issueCommentsUrl(issue.number)).withAuth(githubUser, githubToken)
407
+ _ <- client.fetch(req.withBody(comment.asJson))(Task .now)
408
+
409
+ _ <- client.shutdown
392
410
resp <- Ok (" Updated PR checked" )
393
411
} yield resp
394
412
}
0 commit comments