[gitlab] Update commits on a creation panel on git repository changes

* #IDEA-336701 Fixed

GitOrigin-RevId: d05191264879a398f5bac010b5abd2377e335313
This commit is contained in:
Pavel Gromov
2023-12-11 14:08:45 +00:00
committed by intellij-monorepo-bot
parent 1663b7a188
commit 65a7a91c09
@@ -4,6 +4,7 @@ package org.jetbrains.plugins.gitlab.mergerequest.ui.create.model
import com.intellij.collaboration.api.HttpStatusErrorException
import com.intellij.collaboration.async.launchNow
import com.intellij.collaboration.async.modelFlow
import com.intellij.collaboration.async.withInitial
import com.intellij.collaboration.ui.ListenableProgressIndicator
import com.intellij.collaboration.ui.icon.IconsProvider
import com.intellij.collaboration.util.ResultUtil.runCatchingUser
@@ -13,6 +14,7 @@ import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Disposer
import com.intellij.platform.util.coroutines.childScope
import com.intellij.ui.awt.RelativePoint
import com.intellij.vcs.log.Hash
import com.intellij.vcs.log.VcsCommitMetadata
import git4idea.GitBranch
import git4idea.GitLocalBranch
@@ -20,6 +22,8 @@ import git4idea.GitPushUtil
import git4idea.GitRemoteBranch
import git4idea.config.GitSharedSettings
import git4idea.history.GitLogUtil
import git4idea.remote.hosting.changesSignalFlow
import git4idea.repo.GitRepository
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.*
@@ -106,8 +110,17 @@ internal class GitLabMergeRequestCreateViewModelImpl(
}?.iid
}
override val commits: SharedFlow<Result<List<VcsCommitMetadata>>?> = branchState.transformLatest { state ->
if (state == null) {
private val gitRepository: GitRepository = projectData.projectMapping.gitRepository
private val commitRevisionComparisonFlow: Flow<CommitRevisionComparison?> =
combine(gitRepository.changesSignalFlow().withInitial(Unit), branchState) { _, state -> state }
.map { state ->
state ?: return@map null
CommitRevisionComparison.create(gitRepository, state.headBranch, state.baseBranch)
}
.distinctUntilChangedBy { it }
override val commits: SharedFlow<Result<List<VcsCommitMetadata>>?> = commitRevisionComparisonFlow.transformLatest { revisionComparison ->
if (revisionComparison == null || revisionComparison.baseRevision == null || revisionComparison.headRevision == null) {
emit(Result.success(emptyList()))
return@transformLatest
}
@@ -115,11 +128,9 @@ internal class GitLabMergeRequestCreateViewModelImpl(
emit(null)
val result = withContext(Dispatchers.IO) {
runCatchingUser {
GitLogUtil.collectMetadata(
project,
state.headRepo.gitRepository.root,
"${state.baseBranch.name}..${state.headBranch.name}"
).commits
val revisionRange = "${revisionComparison.baseRevision}..${revisionComparison.headRevision}"
val metadata = GitLogUtil.collectMetadata(project, gitRepository.root, revisionRange)
metadata.commits
}
}
emit(result)
@@ -285,4 +296,15 @@ private fun checkProtectedBranch(branchState: BranchState, project: Project): Me
if (!settings.isBranchProtected(localBranchName)) return null
return MergeRequestRequirementsErrorType.PROTECTED_BRANCH
}
private data class CommitRevisionComparison(val headRevision: Hash?, val baseRevision: Hash?) {
companion object {
fun create(repository: GitRepository, headBranch: GitBranch, baseBranch: GitRemoteBranch): CommitRevisionComparison {
val info = repository.info
val headRevision = info.localBranchesWithHashes[headBranch]
val baseRevision = info.remoteBranchesWithHashes[baseBranch]
return CommitRevisionComparison(headRevision, baseRevision)
}
}
}