From b99aa06820657362990ed00eab79671c769ead3a Mon Sep 17 00:00:00 2001 From: idanakav Date: Tue, 8 Aug 2023 11:54:35 -0700 Subject: [PATCH] Skip computing working set when possible Computing the working set involves running few git commands, including git diff, it can be skipped if the "Expand Sync to Working Set" option is disabled. The working set will be computed on each `collectProjectState` call, given that this method is triggered three times per sync operation, disabling unnecessary working set computations can reduce the sync times by roughly three times the duration typically taken by git diff operations. --- .../idea/blaze/base/sync/BlazeSyncManager.java | 2 +- .../idea/blaze/base/sync/ProjectStateSyncTask.java | 14 ++++++++++---- .../idea/blaze/base/sync/SyncPhaseCoordinator.java | 4 ++-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/base/src/com/google/idea/blaze/base/sync/BlazeSyncManager.java b/base/src/com/google/idea/blaze/base/sync/BlazeSyncManager.java index defe1b0ae64..6a342718a71 100644 --- a/base/src/com/google/idea/blaze/base/sync/BlazeSyncManager.java +++ b/base/src/com/google/idea/blaze/base/sync/BlazeSyncManager.java @@ -156,7 +156,7 @@ public void requestProjectSync(BlazeSyncParams syncParams) { try { projectState = ProjectStateSyncTask.collectProjectState( - project, context); + project, context, syncParams); } catch (SyncCanceledException | SyncFailedException e) { ApplicationManager.getApplication() .invokeLater( diff --git a/base/src/com/google/idea/blaze/base/sync/ProjectStateSyncTask.java b/base/src/com/google/idea/blaze/base/sync/ProjectStateSyncTask.java index cb276dfc243..011e8cdebe6 100644 --- a/base/src/com/google/idea/blaze/base/sync/ProjectStateSyncTask.java +++ b/base/src/com/google/idea/blaze/base/sync/ProjectStateSyncTask.java @@ -17,6 +17,7 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Lists; +import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningExecutorService; import com.google.idea.blaze.base.async.FutureUtil; @@ -61,10 +62,10 @@ /** Collects information about the project state (VCS, blaze info, .blazeproject contents, etc.). */ final class ProjectStateSyncTask { - static SyncProjectState collectProjectState(Project project, BlazeContext context) + static SyncProjectState collectProjectState(Project project, BlazeContext context, BlazeSyncParams syncParams) throws SyncCanceledException, SyncFailedException { ProjectStateSyncTask task = new ProjectStateSyncTask(project); - return task.getProjectState(context); + return task.getProjectState(context, syncParams); } private final Project project; @@ -77,7 +78,7 @@ private ProjectStateSyncTask(Project project) { this.workspaceRoot = WorkspaceRoot.fromImportSettings(importSettings); } - private SyncProjectState getProjectState(BlazeContext context) + private SyncProjectState getProjectState(BlazeContext context, BlazeSyncParams params) throws SyncFailedException, SyncCanceledException { if (!FileOperationProvider.getInstance().exists(workspaceRoot.directory())) { String message = String.format("Workspace '%s' doesn't exist.", workspaceRoot.directory()); @@ -124,7 +125,12 @@ private SyncProjectState getProjectState(BlazeContext context) importSettings.getBuildSystem(), syncFlags); - ListenableFuture workingSetFuture = vcsHandler.getWorkingSet(context, executor); + ListenableFuture workingSetFuture; + if(params.addWorkingSet() || params.syncMode() == SyncMode.FULL) { + workingSetFuture = vcsHandler.getWorkingSet(context, executor); + } else { + workingSetFuture = Futures.immediateFuture(null); + } BlazeInfo blazeInfo = FutureUtil.waitForFuture(context, blazeInfoFuture) diff --git a/base/src/com/google/idea/blaze/base/sync/SyncPhaseCoordinator.java b/base/src/com/google/idea/blaze/base/sync/SyncPhaseCoordinator.java index d96202016f2..632d6d70a3b 100644 --- a/base/src/com/google/idea/blaze/base/sync/SyncPhaseCoordinator.java +++ b/base/src/com/google/idea/blaze/base/sync/SyncPhaseCoordinator.java @@ -361,7 +361,7 @@ private void doFilterProjectTargets( context, childContext -> { SyncProjectState projectState = - ProjectStateSyncTask.collectProjectState(project, context); + ProjectStateSyncTask.collectProjectState(project, context, params); if (projectState == null) { return; } @@ -436,7 +436,7 @@ void runSync(BlazeSyncParams params, boolean singleThreaded, BlazeContext contex SyncStats.builder()); return; } - SyncProjectState projectState = ProjectStateSyncTask.collectProjectState(project, context); + SyncProjectState projectState = ProjectStateSyncTask.collectProjectState(project, context, params); BlazeSyncBuildResult buildResult = BuildPhaseSyncTask.runBuildPhase( project, params, projectState, buildId, context, buildSystem);