override def createPullRequest()

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)
  }