1616
1717package org .scalasteward .core .forge .gitlab
1818
19+ import cats .effect .Temporal
1920import cats .{MonadThrow , Parallel }
2021import cats .syntax .all ._
2122import io .circe ._
@@ -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,8 @@ final class GitLabApiAlg[F[_]: Parallel](
162165)(implicit
163166 client : HttpJsonClient [F ],
164167 logger : Logger [F ],
165- F : MonadThrow [F ]
168+ F : MonadThrow [F ],
169+ temporal : Temporal [F ]
166170) extends ForgeApiAlg [F ] {
167171 import GitLabJsonCodec ._
168172
@@ -205,14 +209,26 @@ final class GitLabApiAlg[F[_]: Parallel](
205209
206210 def waitForMergeRequestStatus (
207211 number : PullRequestNumber ,
208- retries : Int = 10
212+ retries : Int = 10 ,
213+ initialDelay : Duration = 100 .milliseconds,
214+ backoffMultiplier : Double = 2.0
209215 ): F [MergeRequestOut ] =
210216 client
211217 .get[MergeRequestOut ](url.existingMergeRequest(repo, number), modify(repo))
212218 .flatMap {
213219 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)
220+ case _ if retries > 0 =>
221+ temporal.sleep(initialDelay) >> waitForMergeRequestStatus(
222+ number,
223+ retries - 1 ,
224+ initialDelay * backoffMultiplier
225+ )
226+ case other =>
227+ logger
228+ .warn(
229+ s " Exhausted all retires while waiting for merge request status. Last known status is ${other.mergeStatus}"
230+ )
231+ .as(other)
216232 }
217233
218234 val updatedMergeRequest =
0 commit comments