From c19068f00bdd6814818031f79829189b5c87ab77 Mon Sep 17 00:00:00 2001 From: Jack Bentley Date: Mon, 20 Jul 2020 19:16:46 +0100 Subject: [PATCH] Update to directly use git to calculate changes --- .../service/RepositoryFileService.kt | 3 ++- .../repositoryFile/CachedRepositoryFile.kt | 5 ++-- .../LocalRepositoryFileService.kt | 23 +++++++++++++------ .../repositoryFile/RepositoryFileDecorator.kt | 5 ++-- .../rework/internal/ReworkWatcherImpl.kt | 11 +++++---- .../task/GetCommitsTask.kt | 14 ++++++----- .../ui/mergeRequest/MergeRequestDetails.kt | 9 ++++---- .../mergeRequest/tab/commit/CommitChanges.kt | 4 ++-- .../ui/service/DisplayChangesService.kt | 23 ++++--------------- 9 files changed, 49 insertions(+), 48 deletions(-) diff --git a/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/infrastructure/service/RepositoryFileService.kt b/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/infrastructure/service/RepositoryFileService.kt index 463594e..6c3417a 100644 --- a/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/infrastructure/service/RepositoryFileService.kt +++ b/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/infrastructure/service/RepositoryFileService.kt @@ -1,12 +1,13 @@ package net.ntworld.mergeRequestIntegrationIde.infrastructure.service import com.intellij.openapi.vcs.changes.Change +import net.ntworld.mergeRequest.MergeRequestInfo import net.ntworld.mergeRequest.ProviderData import javax.swing.Icon interface RepositoryFileService { - fun findChanges(providerData: ProviderData, hashes: List): List + fun findChanges(providerData: ProviderData, mergeRequestInfo: MergeRequestInfo, hashes: List): List fun findIcon(providerData: ProviderData, path: String) : Icon diff --git a/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/infrastructure/service/repositoryFile/CachedRepositoryFile.kt b/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/infrastructure/service/repositoryFile/CachedRepositoryFile.kt index 44486b0..587d16c 100644 --- a/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/infrastructure/service/repositoryFile/CachedRepositoryFile.kt +++ b/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/infrastructure/service/repositoryFile/CachedRepositoryFile.kt @@ -2,6 +2,7 @@ package net.ntworld.mergeRequestIntegrationIde.infrastructure.service.repository import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.vcs.changes.Change +import net.ntworld.mergeRequest.MergeRequestInfo import net.ntworld.mergeRequest.ProviderData import net.ntworld.mergeRequest.api.Cache import net.ntworld.mergeRequestIntegrationIde.infrastructure.service.RepositoryFileService @@ -13,11 +14,11 @@ class CachedRepositoryFile( ) : RepositoryFileDecorator(service) { private val myLogger = Logger.getInstance(this.javaClass) - override fun findChanges(providerData: ProviderData, hashes: List): List { + override fun findChanges(providerData: ProviderData, mergeRequestInfo: MergeRequestInfo, hashes: List): List { val key = "${providerData.id}:${hashes.joinToString(",")}" return cache.getOrRun(key) { myLogger.info("Cache $key not found") - val result = super.findChanges(providerData, hashes) + val result = super.findChanges(providerData, mergeRequestInfo, hashes) cache.set(key, result, FIND_CHANGES_TTL) result diff --git a/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/infrastructure/service/repositoryFile/LocalRepositoryFileService.kt b/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/infrastructure/service/repositoryFile/LocalRepositoryFileService.kt index d6ab6b8..7140285 100644 --- a/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/infrastructure/service/repositoryFile/LocalRepositoryFileService.kt +++ b/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/infrastructure/service/repositoryFile/LocalRepositoryFileService.kt @@ -10,9 +10,13 @@ import com.intellij.psi.PsiFile import com.intellij.psi.PsiManager import com.intellij.vcs.log.impl.VcsLogContentUtil import com.intellij.vcs.log.util.VcsLogUtil +import git4idea.changes.GitChangeUtils +import net.ntworld.mergeRequest.MergeRequest +import net.ntworld.mergeRequest.MergeRequestInfo import net.ntworld.mergeRequest.ProviderData import net.ntworld.mergeRequestIntegrationIde.infrastructure.ProjectServiceProvider import net.ntworld.mergeRequestIntegrationIde.infrastructure.service.RepositoryFileService +import net.ntworld.mergeRequestIntegrationIde.ui.service.DisplayChangesService import net.ntworld.mergeRequestIntegrationIde.util.RepositoryUtil import javax.swing.Icon @@ -21,7 +25,7 @@ class LocalRepositoryFileService( ) : RepositoryFileService { private val myLogger = Logger.getInstance(this.javaClass) - override fun findChanges(providerData: ProviderData, hashes: List): List { + override fun findChanges(providerData: ProviderData, mergeRequestInfo: MergeRequestInfo, hashes: List): List { try { val repository = RepositoryUtil.findRepository(projectServiceProvider, providerData) if (null === repository) { @@ -32,12 +36,17 @@ class LocalRepositoryFileService( return listOf() } - val details = VcsLogUtil.getDetails( - log.dataManager.getLogProvider(repository.root), - repository.root, - hashes - ) - return VcsLogUtil.collectChanges(details) { it.changes } + if (mergeRequestInfo !is MergeRequest) { + return listOf(); + } + + val changes = GitChangeUtils.getDiff(repository, mergeRequestInfo.targetBranch, mergeRequestInfo.sourceBranch, true); + + if (changes == null) { + return listOf(); + } + + return changes.toList(); } catch (exception: Exception) { myLogger.info("Cannot findChanges for ${providerData.repository}, hashes: ${hashes.joinToString(",")}") throw exception diff --git a/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/infrastructure/service/repositoryFile/RepositoryFileDecorator.kt b/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/infrastructure/service/repositoryFile/RepositoryFileDecorator.kt index 3d15ecf..c1af12c 100644 --- a/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/infrastructure/service/repositoryFile/RepositoryFileDecorator.kt +++ b/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/infrastructure/service/repositoryFile/RepositoryFileDecorator.kt @@ -1,6 +1,7 @@ package net.ntworld.mergeRequestIntegrationIde.infrastructure.service.repositoryFile import com.intellij.openapi.vcs.changes.Change +import net.ntworld.mergeRequest.MergeRequestInfo import net.ntworld.mergeRequest.ProviderData import net.ntworld.mergeRequestIntegrationIde.infrastructure.service.RepositoryFileService import javax.swing.Icon @@ -9,8 +10,8 @@ open class RepositoryFileDecorator( private val service: RepositoryFileService ) : RepositoryFileService { - override fun findChanges(providerData: ProviderData, hashes: List): List { - return service.findChanges(providerData, hashes) + override fun findChanges(providerData: ProviderData, mergeRequestInfo: MergeRequestInfo, hashes: List): List { + return service.findChanges(providerData, mergeRequestInfo, hashes) } override fun findIcon(providerData: ProviderData, path: String): Icon { diff --git a/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/rework/internal/ReworkWatcherImpl.kt b/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/rework/internal/ReworkWatcherImpl.kt index 192785c..60dedb0 100644 --- a/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/rework/internal/ReworkWatcherImpl.kt +++ b/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/rework/internal/ReworkWatcherImpl.kt @@ -69,9 +69,9 @@ class ReworkWatcherImpl( override val interval: Long = 10000 private val myGetCommitsTaskListener = object : GetCommitsTask.Listener { - override fun dataReceived(mergeRequestInfo: MergeRequestInfo, commits: List) { + override fun dataReceived(mergeRequest: MergeRequest, commits: List) { this@ReworkWatcherImpl.commits = commits - changes = projectServiceProvider.repositoryFile.findChanges(providerData, commits.map { it.id }) + changes = projectServiceProvider.repositoryFile.findChanges(providerData, mergeRequest, commits.map { it.id }) buildChangesMap() myIsChangesBuilt = true ApplicationManager.getApplication().invokeLater { @@ -100,6 +100,8 @@ class ReworkWatcherImpl( private val myFindMergeRequestTaskListener = object : FindMergeRequestTask.Listener { override fun dataReceived(mergeRequest: MergeRequest) { myMergeRequest = mergeRequest + + fetchCommits(mergeRequest) } } @@ -110,7 +112,6 @@ class ReworkWatcherImpl( init { myConnection.subscribe(ReworkWatcherNotifier.TOPIC, this) projectServiceProvider.singleMRToolWindowNotifierTopic.registerReworkWatcher(this) - fetchCommits() fetchMergeRequest() } @@ -470,12 +471,12 @@ class ReworkWatcherImpl( reviewContext.comments = comments } - private fun fetchCommits() { + private fun fetchCommits(mergeRequest: MergeRequest) { debug("${providerData.id}:$branchName: fetching commits") val task = GetCommitsTask( projectServiceProvider = projectServiceProvider, providerData = providerData, - mergeRequestInfo = mergeRequestInfo, + mergeRequest = mergeRequest, listener = myGetCommitsTaskListener ) task.start() diff --git a/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/task/GetCommitsTask.kt b/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/task/GetCommitsTask.kt index 6ec89fb..c058f01 100644 --- a/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/task/GetCommitsTask.kt +++ b/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/task/GetCommitsTask.kt @@ -5,16 +5,18 @@ import com.intellij.openapi.progress.ProgressManager import com.intellij.openapi.progress.Task import com.intellij.openapi.progress.impl.BackgroundableProcessIndicator import net.ntworld.mergeRequest.Commit -import net.ntworld.mergeRequest.MergeRequestInfo +import net.ntworld.mergeRequest.MergeRequest import net.ntworld.mergeRequest.ProviderData import net.ntworld.mergeRequest.query.GetCommitsQuery import net.ntworld.mergeRequestIntegration.make +import net.ntworld.mergeRequestIntegration.provider.gitlab.request.GitlabFindMRRequest +import net.ntworld.mergeRequestIntegration.provider.gitlab.transformer.GitlabMRTransformer import net.ntworld.mergeRequestIntegrationIde.infrastructure.ProjectServiceProvider class GetCommitsTask( private val projectServiceProvider: ProjectServiceProvider, private val providerData: ProviderData, - private val mergeRequestInfo: MergeRequestInfo, + private val mergeRequest: MergeRequest, private val listener: Listener ) : Task.Backgroundable(projectServiceProvider.project, "Fetching commit data...", false) { fun start() { @@ -31,11 +33,11 @@ class GetCommitsTask( listener.taskStarted() val result = projectServiceProvider.infrastructure.queryBus() process GetCommitsQuery.make( providerId = providerData.id, - mergeRequestId = mergeRequestInfo.id + mergeRequestId = mergeRequest.id ) - listener.dataReceived(mergeRequestInfo, result.commits) + listener.dataReceived(mergeRequest, result.commits) projectServiceProvider.reviewContextManager.updateCommits( - providerData.id, mergeRequestInfo.id, result.commits + providerData.id, mergeRequest.id, result.commits ) listener.taskEnded() } catch (exception: Exception) { @@ -50,7 +52,7 @@ class GetCommitsTask( fun taskStarted() {} - fun dataReceived(mergeRequestInfo: MergeRequestInfo, commits: List) + fun dataReceived(mergeRequest: MergeRequest, commits: List) fun taskEnded() {} } diff --git a/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/ui/mergeRequest/MergeRequestDetails.kt b/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/ui/mergeRequest/MergeRequestDetails.kt index cb4fdef..17fead3 100644 --- a/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/ui/mergeRequest/MergeRequestDetails.kt +++ b/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/ui/mergeRequest/MergeRequestDetails.kt @@ -78,6 +78,8 @@ class MergeRequestDetails( ApplicationManager.getApplication().invokeLater { setMergeRequest(mergeRequest) } + + GetCommitsTask(projectServiceProvider, providerData, mergeRequest, myGetCommitsListener).start() } } private val myGetPipelinesListener = object : GetPipelinesTask.Listener { @@ -102,12 +104,12 @@ class MergeRequestDetails( myCommitsTab.clear() } - override fun dataReceived(mergeRequestInfo: MergeRequestInfo, commits: List) { + override fun dataReceived(mergeRequest: MergeRequest, commits: List) { ApplicationManager.getApplication().invokeLater { myToolbars.forEach { - it.setCommits(mergeRequestInfo, commits) + it.setCommits(mergeRequest, commits) } - myCommitsTab.setCommits(providerData, mergeRequestInfo, commits) + myCommitsTab.setCommits(providerData, mergeRequest, commits) if (commits.isEmpty()) { myCommitsTabInfo.text = "Commits" } else { @@ -190,7 +192,6 @@ class MergeRequestDetails( } FindMergeRequestTask(projectServiceProvider, providerData, mergeRequestInfo, myFindMRListener).start() GetPipelinesTask(projectServiceProvider, providerData, mergeRequestInfo, myGetPipelinesListener).start() - GetCommitsTask(projectServiceProvider, providerData, mergeRequestInfo, myGetCommitsListener).start() if (providerData.hasApprovalFeature) { FindApprovalTask(projectServiceProvider, providerData, mergeRequestInfo, myFindApprovalListener).start() } diff --git a/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/ui/mergeRequest/tab/commit/CommitChanges.kt b/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/ui/mergeRequest/tab/commit/CommitChanges.kt index 58afe67..132ca54 100644 --- a/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/ui/mergeRequest/tab/commit/CommitChanges.kt +++ b/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/ui/mergeRequest/tab/commit/CommitChanges.kt @@ -76,7 +76,7 @@ class CommitChanges(private val projectServiceProvider: ProjectServiceProvider) myMergeRequestInfo = mergeRequestInfo thread { myTree.isVisible = false - val changes = projectServiceProvider.repositoryFile.findChanges(providerData, commits.map { it.id }) + val changes = projectServiceProvider.repositoryFile.findChanges(providerData, mergeRequestInfo, commits.map { it.id }) projectServiceProvider.reviewContextManager.updateChanges(providerData.id, mergeRequestInfo.id, changes) projectServiceProvider.reviewContextManager.updateReviewingChanges(providerData.id, mergeRequestInfo.id, changes) ApplicationManager.getApplication().invokeLater { @@ -95,7 +95,7 @@ class CommitChanges(private val projectServiceProvider: ProjectServiceProvider) myMergeRequestInfo = mergeRequestInfo thread { myTree.isVisible = false - val partialChanges = projectServiceProvider.repositoryFile.findChanges(providerData, selectedCommits.map { it.id }) + val partialChanges = projectServiceProvider.repositoryFile.findChanges(providerData, mergeRequestInfo, selectedCommits.map { it.id }) projectServiceProvider.reviewContextManager.updateReviewingChanges( providerData.id, mergeRequestInfo.id, partialChanges ) diff --git a/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/ui/service/DisplayChangesService.kt b/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/ui/service/DisplayChangesService.kt index dcf5c14..fc59913 100644 --- a/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/ui/service/DisplayChangesService.kt +++ b/merge-request-integration-core/src/main/kotlin/net/ntworld/mergeRequestIntegrationIde/ui/service/DisplayChangesService.kt @@ -10,6 +10,7 @@ import com.intellij.vcs.log.Hash import com.intellij.vcs.log.impl.VcsLogContentUtil import com.intellij.vcs.log.impl.VcsLogManager import com.intellij.vcs.log.util.VcsLogUtil +import git4idea.changes.GitChangeUtils import git4idea.repo.GitRepository import net.ntworld.mergeRequest.Commit import net.ntworld.mergeRequest.MergeRequest @@ -112,27 +113,11 @@ object DisplayChangesService { log: VcsLogManager, commits: List ) { - // TODO: Reduce repetition - val details = VcsLogUtil.getDetails( - log.dataManager.getLogProvider(repository.root), - repository.root, - commits.map { it.id } - ) - if (details.isEmpty()) { - return - } - - if (details.size == 1) { - return displayChanges( - applicationServiceProvider, ideaProject, - providerData, mergeRequest, details.first().changes.toList() - ) - } + val changes = GitChangeUtils.getDiff(repository, mergeRequest.targetBranch, mergeRequest.sourceBranch, true); - val changes = VcsLogUtil.collectChanges(details) { - it.changes + if (changes != null) { + displayChanges(applicationServiceProvider, ideaProject, providerData, mergeRequest, changes.toList()) } - displayChanges(applicationServiceProvider, ideaProject, providerData, mergeRequest, changes) } private fun displayChanges(