Skip to content

Commit e8a1a8c

Browse files
authored
Merge pull request #3012 from endertunc/check-merge-reguest-status-with-backoff
Check merge request status with backoff
2 parents 75b49de + 9a99f9d commit e8a1a8c

File tree

2 files changed

+26
-7
lines changed

2 files changed

+26
-7
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+
F: 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: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616

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

19-
import cats.{MonadThrow, Parallel}
19+
import cats.effect.Temporal
20+
import cats.Parallel
2021
import cats.syntax.all._
2122
import io.circe._
2223
import io.circe.generic.semiauto._
@@ -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,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

Comments
 (0)