1616
1717package org .scalasteward .core .forge .gitlab
1818
19- import cats .{MonadThrow , Parallel }
19+ import cats .effect .Temporal
20+ import cats .Parallel
2021import cats .syntax .all ._
2122import io .circe ._
2223import io .circe .generic .semiauto ._
@@ -31,6 +32,8 @@ import org.scalasteward.core.util.uri.uriDecoder
3132import org .scalasteward .core .util .{intellijThisImportIsUsed , HttpJsonClient , UnexpectedResponse }
3233import org .typelevel .log4cats .Logger
3334
35+ import scala .concurrent .duration .{Duration , DurationInt }
36+
3437final private [gitlab] case class ForkPayload (id : String , namespace : String )
3538final private [gitlab] case class MergeRequestPayload (
3639 id : String ,
@@ -162,7 +165,7 @@ final class GitLabApiAlg[F[_]: Parallel](
162165)(implicit
163166 client : HttpJsonClient [F ],
164167 logger : Logger [F ],
165- F : MonadThrow [F ]
168+ F : Temporal [F ]
166169) extends ForgeApiAlg [F ] {
167170 import GitLabJsonCodec ._
168171
@@ -205,14 +208,29 @@ final class GitLabApiAlg[F[_]: Parallel](
205208
206209 def waitForMergeRequestStatus (
207210 number : PullRequestNumber ,
208- retries : Int = 10
211+ retries : Int = 10 ,
212+ initialDelay : Duration = 100 .milliseconds,
213+ backoffMultiplier : Double = 2.0
209214 ): F [MergeRequestOut ] =
210215 client
211216 .get[MergeRequestOut ](url.existingMergeRequest(repo, number), modify(repo))
212217 .flatMap {
213218 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)
216234 }
217235
218236 val updatedMergeRequest =
0 commit comments