in modules/core/src/main/scala/org/scalasteward/core/forge/gitlab/GitLabApiAlg.scala [189:248]
override def createPullRequest(repo: Repo, data: NewPullRequestData): F[PullRequestOut] = {
val targetRepo = if (forgeCfg.doNotFork) repo else repo.copy(owner = forgeCfg.login)
val mergeRequest = for {
projectId <- client.get[ProjectId](url.repos(repo), modify)
usernameMapping <- getUsernameToUserIdsMapping((data.assignees ++ data.reviewers).toSet)
payload = MergeRequestPayload(
id = url.encodedProjectId(targetRepo),
projectId = projectId.id,
data = data,
usernamesToUserIdsMapping = usernameMapping,
removeSourceBranch = gitLabCfg.removeSourceBranch
)
res <- client.postWithBody[MergeRequestOut, MergeRequestPayload](
uri = url.mergeRequest(targetRepo),
body = payload,
modify = modify
)
} yield res
def waitForMergeRequestStatus(
number: PullRequestNumber,
retries: Int = 10,
initialDelay: Duration = 100.milliseconds,
backoffMultiplier: Double = 2.0
): F[MergeRequestOut] =
client
.get[MergeRequestOut](url.existingMergeRequest(repo, number), modify)
.flatMap {
case mr if mr.mergeStatus =!= GitLabMergeStatus.Checking => F.pure(mr)
case mr if retries > 0 =>
logger.info(
s"Merge request is still in '${mr.mergeStatus}' state. We will check merge request status in $initialDelay again. " +
s"Remaining retries count is $retries"
) >> F.sleep(initialDelay) >> waitForMergeRequestStatus(
number,
retries - 1,
initialDelay * backoffMultiplier
)
case mr =>
logger
.warn(
s"Exhausted all retries while waiting for merge request status. Last known status is '${mr.mergeStatus}'"
)
.as(mr)
}
val updatedMergeRequest =
if (!gitLabCfg.mergeWhenPipelineSucceeds)
mergeRequest
else {
for {
mr <- mergeRequest
mrWithStatus <- waitForMergeRequestStatus(mr.iid)
_ <- maybeSetReviewers(repo, mrWithStatus)
mergedUponSuccess <- mergePipelineUponSuccess(repo, mrWithStatus)
} yield mergedUponSuccess
}
updatedMergeRequest.map(_.pullRequestOut)
}