16
16
17
17
package org .scalasteward .core .forge .gitlab
18
18
19
- import cats .{MonadThrow , Parallel }
19
+ import cats .effect .Temporal
20
+ import cats .Parallel
20
21
import cats .syntax .all ._
21
22
import io .circe ._
22
23
import io .circe .generic .semiauto ._
@@ -31,6 +32,8 @@ import org.scalasteward.core.util.uri.uriDecoder
31
32
import org .scalasteward .core .util .{intellijThisImportIsUsed , HttpJsonClient , UnexpectedResponse }
32
33
import org .typelevel .log4cats .Logger
33
34
35
+ import scala .concurrent .duration .{Duration , DurationInt }
36
+
34
37
final private [gitlab] case class ForkPayload (id : String , namespace : String )
35
38
final private [gitlab] case class MergeRequestPayload (
36
39
id : String ,
@@ -162,7 +165,7 @@ final class GitLabApiAlg[F[_]: Parallel](
162
165
)(implicit
163
166
client : HttpJsonClient [F ],
164
167
logger : Logger [F ],
165
- F : MonadThrow [F ]
168
+ F : Temporal [F ]
166
169
) extends ForgeApiAlg [F ] {
167
170
import GitLabJsonCodec ._
168
171
@@ -205,14 +208,29 @@ final class GitLabApiAlg[F[_]: Parallel](
205
208
206
209
def waitForMergeRequestStatus (
207
210
number : PullRequestNumber ,
208
- retries : Int = 10
211
+ retries : Int = 10 ,
212
+ initialDelay : Duration = 100 .milliseconds,
213
+ backoffMultiplier : Double = 2.0
209
214
): F [MergeRequestOut ] =
210
215
client
211
216
.get[MergeRequestOut ](url.existingMergeRequest(repo, number), modify(repo))
212
217
.flatMap {
213
218
case mr if mr.mergeStatus =!= GitLabMergeStatus .Checking => F .pure(mr)
214
- case _ if retries > 0 => waitForMergeRequestStatus(number, retries - 1 )
215
- case other => F .pure(other)
219
+ case mr if retries > 0 =>
220
+ logger.info(
221
+ s " Merge request is still in ' ${mr.mergeStatus}' state. We will check merge request status in $initialDelay again. " +
222
+ s " Remaining retries count is $retries"
223
+ ) >> F .sleep(initialDelay) >> waitForMergeRequestStatus(
224
+ number,
225
+ retries - 1 ,
226
+ initialDelay * backoffMultiplier
227
+ )
228
+ case mr =>
229
+ logger
230
+ .warn(
231
+ s " Exhausted all retries while waiting for merge request status. Last known status is ' ${mr.mergeStatus}' "
232
+ )
233
+ .as(mr)
216
234
}
217
235
218
236
val updatedMergeRequest =
0 commit comments