Skip to content

Commit bcd8ccf

Browse files
author
Ender Tunc
committed
check merge request status with backoff
1 parent e42f060 commit bcd8ccf

File tree

2 files changed

+23
-6
lines changed

2 files changed

+23
-6
lines changed

modules/core/src/main/scala/org/scalasteward/core/forge/ForgeSelection.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@
1616

1717
package org.scalasteward.core.forge
1818

19+
import cats.effect.Temporal
1920
import cats.syntax.all._
20-
import cats.{Applicative, MonadThrow, Parallel}
21+
import cats.{Applicative, Parallel}
2122
import org.http4s.headers.Authorization
2223
import org.http4s.{BasicCredentials, Header, Request}
2324
import org.scalasteward.core.application.Config
@@ -42,7 +43,7 @@ object ForgeSelection {
4243
)(implicit
4344
httpJsonClient: HttpJsonClient[F],
4445
logger: Logger[F],
45-
F: MonadThrow[F]
46+
temporal: Temporal[F]
4647
): ForgeApiAlg[F] = {
4748
val auth = (_: Any) => authenticate(forgeCfg.tpe, user)
4849
forgeSpecificCfg match {

modules/core/src/main/scala/org/scalasteward/core/forge/gitlab/GitLabApiAlg.scala

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.scalasteward.core.forge.gitlab
1818

19+
import cats.effect.Temporal
1920
import cats.{MonadThrow, Parallel}
2021
import cats.syntax.all._
2122
import io.circe._
@@ -31,6 +32,8 @@ import org.scalasteward.core.util.uri.uriDecoder
3132
import org.scalasteward.core.util.{intellijThisImportIsUsed, HttpJsonClient, UnexpectedResponse}
3233
import org.typelevel.log4cats.Logger
3334

35+
import scala.concurrent.duration.{Duration, DurationInt}
36+
3437
final private[gitlab] case class ForkPayload(id: String, namespace: String)
3538
final 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

Comments
 (0)