@@ -8,6 +8,7 @@ import org.http4s.headers.Authorization
8
8
import cats .syntax .applicative ._
9
9
import scalaz .concurrent .Task
10
10
import scala .util .control .NonFatal
11
+ import scala .Function .tupled
11
12
12
13
import io .circe ._
13
14
import io .circe .generic .auto ._
@@ -85,34 +86,32 @@ trait PullRequestService {
85
86
86
87
/** Partitions invalid and valid commits */
87
88
def checkCLA (xs : List [Commit ], httpClient : Client ): Task [List [CommitStatus ]] = {
88
- def checkUser (user : String , commit : Commit ): Task [CommitStatus ] = {
89
+ def checkUser (user : String ): Task [Commit => CommitStatus ] = {
89
90
val claStatus = for {
90
91
endpoint <- toUri(claUrl(user))
91
92
claReq <- getRequest(endpoint).pure[Task ]
92
93
claRes <- httpClient.expect(claReq)(jsonOf[CLASignature ])
93
- res = if (claRes.signed) Valid (user, commit) else Invalid (user, commit)
94
- } yield res
94
+ } yield { (commit : Commit ) =>
95
+ if (claRes.signed) Valid (user, commit)
96
+ else Invalid (user, commit)
97
+ }
95
98
96
99
claStatus.handleWith {
97
100
case NonFatal (e) =>
98
101
println(e)
99
- Task .now(CLAServiceDown (user, commit))
102
+ Task .now(( commit : Commit ) => CLAServiceDown (user, commit))
100
103
}
101
104
}
102
105
103
- def checkCommit (commit : Commit , author : Author ): Task [CommitStatus ] =
104
- author.login.map(checkUser(_, commit)).getOrElse(Task .now(MissingUser (commit)))
106
+ def checkCommit (author : Author , commit : List [Commit ]): Task [List [CommitStatus ]] =
107
+ author.login.map(checkUser)
108
+ .getOrElse(Task .now(MissingUser ))
109
+ .map(f => commit.map(f))
105
110
106
111
Task .gatherUnordered {
107
- xs.flatMap {
108
- case c @ Commit (_, author, commiter, _) =>
109
- if (author == commiter) List (checkCommit(c, author))
110
- else List (
111
- checkCommit(c, author),
112
- checkCommit(c, commiter)
113
- )
114
- }
115
- }
112
+ val groupedByAuthor : Map [Author , List [Commit ]] = xs.groupBy(_.author)
113
+ groupedByAuthor.map(tupled(checkCommit)).toList
114
+ }.map(_.flatten)
116
115
}
117
116
118
117
def sendStatuses (xs : List [CommitStatus ], httpClient : Client ): Task [List [StatusResponse ]] = {
@@ -176,15 +175,15 @@ trait PullRequestService {
176
175
177
176
for {
178
177
// First get all the commits from the PR
179
- commits <- getCommits(issue.number, httpClient)
178
+ commits <- getCommits(issue.number, httpClient)
180
179
181
180
// Then check the CLA of each commit for both author and committer
182
- statuses <- checkCLA(commits, httpClient)
181
+ statuses <- checkCLA(commits, httpClient)
183
182
184
183
// Send statuses to Github and exit
185
- _ <- sendStatuses(statuses, httpClient)
186
- _ <- shutdownClient(httpClient).pure[Task ]
187
- resp <- Ok (" All statuses checked" )
184
+ _ <- sendStatuses(statuses, httpClient)
185
+ _ <- shutdownClient(httpClient).pure[Task ]
186
+ resp <- Ok (" All statuses checked" )
188
187
} yield resp
189
188
}
190
189
}
0 commit comments