From 1be27e93ba8ce67411050a4e3ad80e7f03de2930 Mon Sep 17 00:00:00 2001 From: Googler Date: Tue, 26 Mar 2024 11:31:10 -0700 Subject: [PATCH] Set bazel version for bazel project (cherry picked from commit 957b04d9333975cbbc1edc5a92bc92f60b35040a) --- .../blaze/base/bazel/BazelBuildSystem.java | 5 +++ .../idea/blaze/base/bazel/BazelVersion.java | 2 +- .../idea/blaze/base/bazel/BuildSystem.java | 3 ++ .../blaze/base/qsync/BazelVersionHandler.java | 45 +++++++++++++++++++ .../idea/blaze/base/qsync/ProjectLoader.java | 12 +++-- .../blaze/base/qsync/ProjectQuerierImpl.java | 17 +++++-- .../base/qsync/QuerySyncProjectData.java | 28 +++++++----- .../bazel/BuildSystemProviderWrapper.java | 5 +++ .../blaze/base/bazel/FakeBuildSystem.java | 9 ++++ .../idea/blaze/qsync/FullProjectUpdate.java | 6 ++- .../idea/blaze/qsync/NoopProjectRefresh.java | 6 ++- .../blaze/qsync/PartialProjectRefresh.java | 4 ++ .../idea/blaze/qsync/ProjectRefresher.java | 22 ++++++--- .../idea/blaze/qsync/RefreshParameters.java | 10 +++++ .../qsync/project/PostQuerySyncData.java | 6 +++ .../qsync/project/SnapshotDeserializer.java | 3 ++ .../idea/blaze/qsync/project/snapshot.proto | 4 +- .../qsync/PartialProjectRefreshTest.java | 5 +++ .../blaze/qsync/ProjectRefresherTest.java | 45 +++++++++++++++++++ .../idea/blaze/qsync/TestDataSyncRunner.java | 1 + 20 files changed, 210 insertions(+), 28 deletions(-) create mode 100644 base/src/com/google/idea/blaze/base/qsync/BazelVersionHandler.java diff --git a/base/src/com/google/idea/blaze/base/bazel/BazelBuildSystem.java b/base/src/com/google/idea/blaze/base/bazel/BazelBuildSystem.java index 3e08f6b4242..1fa124ce963 100644 --- a/base/src/com/google/idea/blaze/base/bazel/BazelBuildSystem.java +++ b/base/src/com/google/idea/blaze/base/bazel/BazelBuildSystem.java @@ -120,6 +120,11 @@ public void populateBlazeVersionData( builder.setBazelVersion(BazelVersion.parseVersion(blazeInfo)); } + @Override + public Optional getBazelVersionString(BlazeInfo blazeInfo) { + return Optional.ofNullable(BazelVersion.parseVersion(blazeInfo).toString()); + } + @Override public BazelQueryRunner createQueryRunner(Project project) { return new BazelQueryRunner(project, this); diff --git a/base/src/com/google/idea/blaze/base/bazel/BazelVersion.java b/base/src/com/google/idea/blaze/base/bazel/BazelVersion.java index 067ef9f2d5a..e9f6b62cfb6 100644 --- a/base/src/com/google/idea/blaze/base/bazel/BazelVersion.java +++ b/base/src/com/google/idea/blaze/base/bazel/BazelVersion.java @@ -67,7 +67,7 @@ int getBugfix() { } @VisibleForTesting - static BazelVersion parseVersion(@Nullable String string) { + public static BazelVersion parseVersion(@Nullable String string) { // treat all unknown / development versions as the very latest version if (string == null) { return DEVELOPMENT; diff --git a/base/src/com/google/idea/blaze/base/bazel/BuildSystem.java b/base/src/com/google/idea/blaze/base/bazel/BuildSystem.java index 64a828888d8..98eb76e0b5f 100644 --- a/base/src/com/google/idea/blaze/base/bazel/BuildSystem.java +++ b/base/src/com/google/idea/blaze/base/bazel/BuildSystem.java @@ -131,6 +131,9 @@ default BuildInvoker getBuildInvoker( void populateBlazeVersionData( WorkspaceRoot workspaceRoot, BlazeInfo blazeInfo, BlazeVersionData.Builder builder); + /** Get bazel only version. Returns empty if it's not bazel project. */ + Optional getBazelVersionString(BlazeInfo blazeInfo); + /** * Returns the parallel invoker if the sync strategy is PARALLEL and the system supports it; * otherwise returns the standard invoker. diff --git a/base/src/com/google/idea/blaze/base/qsync/BazelVersionHandler.java b/base/src/com/google/idea/blaze/base/qsync/BazelVersionHandler.java new file mode 100644 index 00000000000..81544f6a787 --- /dev/null +++ b/base/src/com/google/idea/blaze/base/qsync/BazelVersionHandler.java @@ -0,0 +1,45 @@ +/* + * Copyright 2024 The Bazel Authors. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.idea.blaze.base.qsync; + +import com.google.idea.blaze.base.bazel.BuildSystem; +import com.google.idea.blaze.base.bazel.BuildSystem.BuildInvoker; +import com.google.idea.blaze.base.sync.SyncScope.SyncFailedException; +import com.google.idea.blaze.exception.BuildException; +import java.util.Optional; + +/** + * Helps to collect bazel version by using {@link BuildSystem} and {@link BuildInvoker}. Handle + * exception casting to avoid sync runner to handle too many exceptions. + */ +public class BazelVersionHandler { + BuildSystem buildSystem; + BuildInvoker buildInvoker; + + public BazelVersionHandler(BuildSystem buildSystem, BuildInvoker buildInvoker) { + this.buildSystem = buildSystem; + this.buildInvoker = buildInvoker; + } + + public Optional getBazelVersion() throws BuildException { + try { + return buildSystem.getBazelVersionString(buildInvoker.getBlazeInfo()); + } catch (SyncFailedException e) { + throw new BuildException( + "Could not get bazel version, incorrect aspect file may be used. ", e); + } + } +} diff --git a/base/src/com/google/idea/blaze/base/qsync/ProjectLoader.java b/base/src/com/google/idea/blaze/base/qsync/ProjectLoader.java index b30e111997a..4faa46f3fb1 100644 --- a/base/src/com/google/idea/blaze/base/qsync/ProjectLoader.java +++ b/base/src/com/google/idea/blaze/base/qsync/ProjectLoader.java @@ -205,7 +205,12 @@ public QuerySyncProject loadProject(BlazeContext context) throws BuildException () -> !QuerySync.EXTRACT_RES_PACKAGES_AT_BUILD_TIME.getValue(), QuerySync.USE_NEW_BUILD_ARTIFACT_MANAGEMENT); QueryRunner queryRunner = createQueryRunner(buildSystem); - ProjectQuerier projectQuerier = createProjectQuerier(projectRefresher, queryRunner, vcsHandler); + ProjectQuerier projectQuerier = + createProjectQuerier( + projectRefresher, + queryRunner, + vcsHandler, + new BazelVersionHandler(buildSystem, buildSystem.getBuildInvoker(project, context))); QuerySyncSourceToTargetMap sourceToTargetMap = new QuerySyncSourceToTargetMap(graph, workspaceRoot.path()); @@ -248,8 +253,9 @@ private ParallelPackageReader createWorkspaceRelativePackageReader() { private ProjectQuerierImpl createProjectQuerier( ProjectRefresher projectRefresher, QueryRunner queryRunner, - Optional vcsHandler) { - return new ProjectQuerierImpl(queryRunner, projectRefresher, vcsHandler); + Optional vcsHandler, + BazelVersionHandler bazelVersionProvider) { + return new ProjectQuerierImpl(queryRunner, projectRefresher, vcsHandler, bazelVersionProvider); } protected QueryRunner createQueryRunner(BuildSystem buildSystem) { diff --git a/base/src/com/google/idea/blaze/base/qsync/ProjectQuerierImpl.java b/base/src/com/google/idea/blaze/base/qsync/ProjectQuerierImpl.java index b818392d016..a0232f05dc2 100644 --- a/base/src/com/google/idea/blaze/base/qsync/ProjectQuerierImpl.java +++ b/base/src/com/google/idea/blaze/base/qsync/ProjectQuerierImpl.java @@ -45,14 +45,18 @@ public class ProjectQuerierImpl implements ProjectQuerier { private final ProjectRefresher projectRefresher; private final Optional vcsHandler; + private final BazelVersionHandler bazelVersionProvider; + @VisibleForTesting public ProjectQuerierImpl( QueryRunner queryRunner, ProjectRefresher projectRefresher, - Optional vcsHandler) { + Optional vcsHandler, + BazelVersionHandler bazelVersionProvider) { this.queryRunner = queryRunner; this.projectRefresher = projectRefresher; this.vcsHandler = vcsHandler; + this.bazelVersionProvider = bazelVersionProvider; } /** @@ -74,7 +78,9 @@ public PostQuerySyncData fullQuery(ProjectDefinition projectDef, BlazeContext co vcsState.map(s -> s.upstreamRevision).orElse(""), vcsState.flatMap(s -> s.workspaceSnapshotPath).map(Object::toString).orElse(""))); - RefreshOperation fullQuery = projectRefresher.startFullUpdate(context, projectDef, vcsState); + RefreshOperation fullQuery = + projectRefresher.startFullUpdate( + context, projectDef, vcsState, bazelVersionProvider.getBazelVersion()); QuerySpec querySpec = fullQuery.getQuerySpec().get(); return fullQuery.createPostQuerySyncData(queryRunner.runQuery(querySpec, context)); @@ -124,7 +130,12 @@ public PostQuerySyncData update( vcsState.flatMap(s -> s.workspaceSnapshotPath).map(Object::toString).orElse(""))); RefreshOperation refresh = - projectRefresher.startPartialRefresh(context, previousState, vcsState, currentProjectDef); + projectRefresher.startPartialRefresh( + context, + previousState, + vcsState, + bazelVersionProvider.getBazelVersion(), + currentProjectDef); Optional spec = refresh.getQuerySpec(); QuerySummary querySummary; diff --git a/base/src/com/google/idea/blaze/base/qsync/QuerySyncProjectData.java b/base/src/com/google/idea/blaze/base/qsync/QuerySyncProjectData.java index 51eaa969df7..f0dce652b5f 100644 --- a/base/src/com/google/idea/blaze/base/qsync/QuerySyncProjectData.java +++ b/base/src/com/google/idea/blaze/base/qsync/QuerySyncProjectData.java @@ -17,6 +17,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; +import com.google.idea.blaze.base.bazel.BazelVersion; import com.google.idea.blaze.base.command.info.BlazeInfo; import com.google.idea.blaze.base.dependencies.TargetInfo; import com.google.idea.blaze.base.ideinfo.TargetMap; @@ -145,18 +146,21 @@ public BlazeVersionData getBlazeVersionData() { // assumes that the base VCS revision is a decimal integer, which may not be true. logger.warn("Usage of legacy getBlazeVersionData"); BlazeVersionData.Builder data = BlazeVersionData.builder(); - String baseRev = - blazeProject - .flatMap(p -> p.queryData().vcsState()) - .map(q -> q.upstreamRevision) - .orElse(null); - if (baseRev != null) { - try { - data.setClientCl(Long.parseLong(baseRev)); - } catch (NumberFormatException e) { - logger.warn(e); - } - } + blazeProject + .flatMap(p -> p.queryData().vcsState()) + .map(q -> q.upstreamRevision) + .ifPresent( + revision -> { + try { + data.setClientCl(Long.parseLong(revision)); + } catch (NumberFormatException e) { + logger.warn(e); + } + }); + blazeProject + .flatMap(p -> p.queryData().bazelVersion()) + .ifPresent(version -> data.setBazelVersion(BazelVersion.parseVersion(version))); + return data.build(); } diff --git a/base/tests/utils/unit/com/google/idea/blaze/base/bazel/BuildSystemProviderWrapper.java b/base/tests/utils/unit/com/google/idea/blaze/base/bazel/BuildSystemProviderWrapper.java index 56300d4ebc3..e2dad7d263e 100644 --- a/base/tests/utils/unit/com/google/idea/blaze/base/bazel/BuildSystemProviderWrapper.java +++ b/base/tests/utils/unit/com/google/idea/blaze/base/bazel/BuildSystemProviderWrapper.java @@ -305,6 +305,11 @@ public void populateBlazeVersionData( inner.populateBlazeVersionData(workspaceRoot, blazeInfo, builder); } + @Override + public Optional getBazelVersionString(BlazeInfo blazeInfo) { + return inner.getBazelVersionString(blazeInfo); + } + @Override public BazelQueryRunner createQueryRunner(Project project) { return inner.createQueryRunner(project); diff --git a/base/tests/utils/unit/com/google/idea/blaze/base/bazel/FakeBuildSystem.java b/base/tests/utils/unit/com/google/idea/blaze/base/bazel/FakeBuildSystem.java index 28ebdccdebe..93d99dcfc0d 100644 --- a/base/tests/utils/unit/com/google/idea/blaze/base/bazel/FakeBuildSystem.java +++ b/base/tests/utils/unit/com/google/idea/blaze/base/bazel/FakeBuildSystem.java @@ -80,6 +80,13 @@ public SyncStrategy getSyncStrategy(Project project) { public void populateBlazeVersionData( WorkspaceRoot workspaceRoot, BlazeInfo blazeInfo, BlazeVersionData.Builder builder) {} + abstract Optional getBazelVersionString(); + + @Override + public Optional getBazelVersionString(BlazeInfo blazeInfo) { + return getBazelVersionString(); + } + @Override public BazelQueryRunner createQueryRunner(Project project) { return null; @@ -102,6 +109,8 @@ public abstract static class Builder { public abstract Builder setLocalBuildInvoker(Optional value); + public abstract Builder setBazelVersionString(Optional value); + public abstract Builder setSyncStrategy(SyncStrategy value); } } diff --git a/querysync/java/com/google/idea/blaze/qsync/FullProjectUpdate.java b/querysync/java/com/google/idea/blaze/qsync/FullProjectUpdate.java index 4bcebceda75..2c8c4bca84b 100644 --- a/querysync/java/com/google/idea/blaze/qsync/FullProjectUpdate.java +++ b/querysync/java/com/google/idea/blaze/qsync/FullProjectUpdate.java @@ -37,16 +37,19 @@ public class FullProjectUpdate implements RefreshOperation { private final Path effectiveWorkspaceRoot; private final ProjectDefinition projectDefinition; private final Optional vcsState; + private final Optional bazelVersion; public FullProjectUpdate( Context context, Path effectiveWorkspaceRoot, ProjectDefinition definition, - Optional vcsState) { + Optional vcsState, + Optional bazelVersion) { this.context = context; this.effectiveWorkspaceRoot = effectiveWorkspaceRoot; this.projectDefinition = definition; this.vcsState = vcsState; + this.bazelVersion = bazelVersion; } @Override @@ -60,6 +63,7 @@ public PostQuerySyncData createPostQuerySyncData(QuerySummary output) { return PostQuerySyncData.builder() .setProjectDefinition(projectDefinition) .setVcsState(vcsState) + .setBazelVersion(bazelVersion) .setQuerySummary(output) .build(); } diff --git a/querysync/java/com/google/idea/blaze/qsync/NoopProjectRefresh.java b/querysync/java/com/google/idea/blaze/qsync/NoopProjectRefresh.java index 1590bec9f06..89c64416630 100644 --- a/querysync/java/com/google/idea/blaze/qsync/NoopProjectRefresh.java +++ b/querysync/java/com/google/idea/blaze/qsync/NoopProjectRefresh.java @@ -33,12 +33,15 @@ public class NoopProjectRefresh implements RefreshOperation { private final Supplier latestProjectSnapshotSupplier; private final Optional currentVcsState; + private final Optional bazelVersion; public NoopProjectRefresh( Supplier latestProjectSnapshotSupplier, - Optional currentVcsState) { + Optional currentVcsState, + Optional bazelVersion) { this.latestProjectSnapshotSupplier = latestProjectSnapshotSupplier; this.currentVcsState = currentVcsState; + this.bazelVersion = bazelVersion; } @Override @@ -50,6 +53,7 @@ public Optional getQuerySpec() { public PostQuerySyncData createPostQuerySyncData(QuerySummary output) { return latestProjectSnapshotSupplier.get().queryData().toBuilder() .setVcsState(currentVcsState) + .setBazelVersion(bazelVersion) .build(); } } diff --git a/querysync/java/com/google/idea/blaze/qsync/PartialProjectRefresh.java b/querysync/java/com/google/idea/blaze/qsync/PartialProjectRefresh.java index e265dd7f357..63fd3b8a629 100644 --- a/querysync/java/com/google/idea/blaze/qsync/PartialProjectRefresh.java +++ b/querysync/java/com/google/idea/blaze/qsync/PartialProjectRefresh.java @@ -42,6 +42,7 @@ class PartialProjectRefresh implements RefreshOperation { private final Path effectiveWorkspaceRoot; private final PostQuerySyncData previousState; private final Optional currentVcsState; + private final Optional bazelVersion; @VisibleForTesting final ImmutableSet modifiedPackages; @VisibleForTesting final ImmutableSet deletedPackages; @@ -49,6 +50,7 @@ class PartialProjectRefresh implements RefreshOperation { Path effectiveWorkspaceRoot, PostQuerySyncData previousState, Optional currentVcsState, + Optional bazelVersion, ImmutableSet modifiedPackages, ImmutableSet deletedPackages) { this.effectiveWorkspaceRoot = effectiveWorkspaceRoot; @@ -56,6 +58,7 @@ class PartialProjectRefresh implements RefreshOperation { this.currentVcsState = currentVcsState; this.modifiedPackages = modifiedPackages; this.deletedPackages = deletedPackages; + this.bazelVersion = bazelVersion; } private Optional createQuerySpec() { @@ -82,6 +85,7 @@ public PostQuerySyncData createPostQuerySyncData(QuerySummary partialQuery) { QuerySummary effectiveQuery = applyDelta(partialQuery); return PostQuerySyncData.builder() .setVcsState(currentVcsState) + .setBazelVersion(bazelVersion) .setProjectDefinition(previousState.projectDefinition()) .setQuerySummary(effectiveQuery) .build(); diff --git a/querysync/java/com/google/idea/blaze/qsync/ProjectRefresher.java b/querysync/java/com/google/idea/blaze/qsync/ProjectRefresher.java index d3d9ec95afe..9f8fec043ea 100644 --- a/querysync/java/com/google/idea/blaze/qsync/ProjectRefresher.java +++ b/querysync/java/com/google/idea/blaze/qsync/ProjectRefresher.java @@ -45,27 +45,36 @@ public ProjectRefresher( } public RefreshOperation startFullUpdate( - Context context, ProjectDefinition spec, Optional vcsState) { + Context context, + ProjectDefinition spec, + Optional vcsState, + Optional bazelVersion) { Path effectiveWorkspaceRoot = vcsState.flatMap(s -> s.workspaceSnapshotPath).orElse(workspaceRoot); - return new FullProjectUpdate(context, effectiveWorkspaceRoot, spec, vcsState); + return new FullProjectUpdate(context, effectiveWorkspaceRoot, spec, vcsState, bazelVersion); } public RefreshOperation startPartialRefresh( Context context, PostQuerySyncData currentProject, Optional latestVcsState, + Optional latestBazelVersion, ProjectDefinition latestProjectDefinition) throws BuildException { return startPartialRefresh( - new RefreshParameters(currentProject, latestVcsState, latestProjectDefinition, vcsDiffer), + new RefreshParameters( + currentProject, latestVcsState, latestBazelVersion, latestProjectDefinition, vcsDiffer), context); } public RefreshOperation startPartialRefresh(RefreshParameters params, Context context) throws BuildException { if (params.requiresFullUpdate(context)) { - return startFullUpdate(context, params.latestProjectDefinition, params.latestVcsState); + return startFullUpdate( + context, + params.latestProjectDefinition, + params.latestVcsState, + params.latestBazelVersion); } AffectedPackages affected = params.calculateAffectedPackages(context); @@ -75,7 +84,9 @@ public RefreshOperation startPartialRefresh(RefreshParameters params, Context // We have full project state. We don't need to do anything. context.output(PrintOutput.log("Nothing has changed since last sync.")); return new NoopProjectRefresh( - latestProjectSnapshotSupplier.get()::get, params.latestVcsState); + latestProjectSnapshotSupplier.get()::get, + params.latestVcsState, + params.latestBazelVersion); } // else we need to recalculate the project structure. This happens on the first sync after // reloading the project. @@ -88,6 +99,7 @@ public RefreshOperation startPartialRefresh(RefreshParameters params, Context effectiveWorkspaceRoot, params.currentProject, params.latestVcsState, + params.latestBazelVersion, affected.getModifiedPackages(), affected.getDeletedPackages()); } diff --git a/querysync/java/com/google/idea/blaze/qsync/RefreshParameters.java b/querysync/java/com/google/idea/blaze/qsync/RefreshParameters.java index 81d2056d13c..23985f17b9b 100644 --- a/querysync/java/com/google/idea/blaze/qsync/RefreshParameters.java +++ b/querysync/java/com/google/idea/blaze/qsync/RefreshParameters.java @@ -38,16 +38,19 @@ public class RefreshParameters { final PostQuerySyncData currentProject; final Optional latestVcsState; + final Optional latestBazelVersion; final ProjectDefinition latestProjectDefinition; final VcsStateDiffer vcsDiffer; RefreshParameters( PostQuerySyncData currentProject, Optional latestVcsState, + Optional latestBazelVersion, ProjectDefinition latestProjectDefinition, VcsStateDiffer vcsDiffer) { this.currentProject = currentProject; this.latestVcsState = latestVcsState; + this.latestBazelVersion = latestBazelVersion; this.latestProjectDefinition = latestProjectDefinition; this.vcsDiffer = vcsDiffer; } @@ -87,6 +90,13 @@ boolean requiresFullUpdate(Context context) { latestVcsState.get().upstreamRevision)); return true; } + if (!Objects.equals(currentProject.bazelVersion(), latestBazelVersion)) { + context.output( + PrintOutput.output( + "Bazel version has changed %s -> %s", + currentProject.bazelVersion().orElse(null), latestBazelVersion.orElse(null))); + return true; + } return false; } diff --git a/querysync/java/com/google/idea/blaze/qsync/project/PostQuerySyncData.java b/querysync/java/com/google/idea/blaze/qsync/project/PostQuerySyncData.java index 2ec24fdf760..711e5d30909 100644 --- a/querysync/java/com/google/idea/blaze/qsync/project/PostQuerySyncData.java +++ b/querysync/java/com/google/idea/blaze/qsync/project/PostQuerySyncData.java @@ -44,6 +44,7 @@ public abstract class PostQuerySyncData { /* languageClasses= */ ImmutableSet.of(), /* testSources= */ ImmutableSet.of())) .setVcsState(Optional.empty()) + .setBazelVersion(Optional.empty()) .setQuerySummary(QuerySummary.EMPTY) .build(); @@ -53,6 +54,9 @@ public abstract class PostQuerySyncData { /** The VCS state at the time that the query was run. */ public abstract Optional vcsState(); + /** The version of bazel that the query was run. */ + public abstract Optional bazelVersion(); + /** The summarised output from the query. */ public abstract QuerySummary querySummary(); @@ -71,6 +75,8 @@ public abstract static class Builder { public abstract Builder setVcsState(Optional value); + public abstract Builder setBazelVersion(Optional value); + public abstract Builder setQuerySummary(QuerySummary value); @CanIgnoreReturnValue diff --git a/querysync/java/com/google/idea/blaze/qsync/project/SnapshotDeserializer.java b/querysync/java/com/google/idea/blaze/qsync/project/SnapshotDeserializer.java index e81c6e0a1bb..10379e5f64f 100644 --- a/querysync/java/com/google/idea/blaze/qsync/project/SnapshotDeserializer.java +++ b/querysync/java/com/google/idea/blaze/qsync/project/SnapshotDeserializer.java @@ -57,6 +57,9 @@ public Optional readFrom(InputStream in, Context contex if (proto.hasVcsState()) { visitVcsState(proto.getVcsState()); } + if (proto.hasBazelVersion()) { + snapshot.setBazelVersion(Optional.of(proto.getBazelVersion())); + } visitQuerySummay(proto.getQuerySummary()); return Optional.of(this); } diff --git a/querysync/java/com/google/idea/blaze/qsync/project/snapshot.proto b/querysync/java/com/google/idea/blaze/qsync/project/snapshot.proto index e811b51a74b..fde699ff0f0 100644 --- a/querysync/java/com/google/idea/blaze/qsync/project/snapshot.proto +++ b/querysync/java/com/google/idea/blaze/qsync/project/snapshot.proto @@ -2,9 +2,8 @@ syntax = "proto3"; package ij.qsync; -import "querysync/java/com/google/idea/blaze/qsync/query/querysummary.proto"; import "querysync/java/com/google/idea/blaze/qsync/project/language_class.proto"; - +import "querysync/java/com/google/idea/blaze/qsync/query/querysummary.proto"; // option java_api_version = 2; option java_outer_classname = "SnapshotProto"; @@ -15,6 +14,7 @@ message Snapshot { VcsState vcs_state = 2; Summary query_summary = 3; int32 version = 4; + optional string bazel_version = 5; } message ProjectDefinition { diff --git a/querysync/javatests/com/google/idea/blaze/qsync/PartialProjectRefreshTest.java b/querysync/javatests/com/google/idea/blaze/qsync/PartialProjectRefreshTest.java index e88f285ab87..252af5da2e4 100644 --- a/querysync/javatests/com/google/idea/blaze/qsync/PartialProjectRefreshTest.java +++ b/querysync/javatests/com/google/idea/blaze/qsync/PartialProjectRefreshTest.java @@ -24,6 +24,7 @@ import com.google.idea.blaze.qsync.query.Query; import com.google.idea.blaze.qsync.query.QuerySummary; import java.nio.file.Path; +import java.util.Optional; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -101,6 +102,7 @@ public void testApplyDelta_replacePackage() { Path.of("/workspace/root"), baseProject, QuerySyncTestUtils.CLEAN_VCS_STATE, + Optional.empty(), /* modifiedPackages= */ ImmutableSet.of(Path.of("my/build/package1")), ImmutableSet.of()); QuerySummary applied = queryStrategy.applyDelta(delta); @@ -166,6 +168,7 @@ public void testApplyDelta_deletePackage() { Path.of("/workspace/root"), baseProject, QuerySyncTestUtils.CLEAN_VCS_STATE, + Optional.empty(), ImmutableSet.of(), /* deletedPackages= */ ImmutableSet.of(Path.of("my/build/package1"))); Truth8.assertThat(queryStrategy.getQuerySpec()).isEmpty(); @@ -227,6 +230,7 @@ public void testDelta_addPackage() { Path.of("/workspace/root"), baseProject, QuerySyncTestUtils.CLEAN_VCS_STATE, + Optional.empty(), /* modifiedPackages= */ ImmutableSet.of(Path.of("my/build/package2")), ImmutableSet.of()); QuerySummary applied = queryStrategy.applyDelta(delta); @@ -257,6 +261,7 @@ public void testDelta_packagesWithErrors() { Path.of("/workspace/root"), baseProject, QuerySyncTestUtils.CLEAN_VCS_STATE, + Optional.empty(), /* modifiedPackages= */ ImmutableSet.of(Path.of("my/build/package")), ImmutableSet.of()); QuerySummary applied = queryStrategy.applyDelta(delta); diff --git a/querysync/javatests/com/google/idea/blaze/qsync/ProjectRefresherTest.java b/querysync/javatests/com/google/idea/blaze/qsync/ProjectRefresherTest.java index 067343f7cae..74ba33f1fb9 100644 --- a/querysync/javatests/com/google/idea/blaze/qsync/ProjectRefresherTest.java +++ b/querysync/javatests/com/google/idea/blaze/qsync/ProjectRefresherTest.java @@ -71,6 +71,7 @@ public void testStartPartialRefresh_pluginVersionChanged() throws Exception { QuerySyncTestUtils.LOGGING_CONTEXT, project, project.vcsState(), + project.bazelVersion(), project.projectDefinition()); assertThat(update).isInstanceOf(FullProjectUpdate.class); } @@ -96,6 +97,7 @@ public void testStartPartialRefresh_vcsSnapshotUnchanged_existingProjectSnapshot QuerySyncTestUtils.LOGGING_CONTEXT, project, project.vcsState(), + project.bazelVersion(), project.projectDefinition()); assertThat(update).isInstanceOf(NoopProjectRefresh.class); assertThat(update.createPostQuerySyncData(QuerySummary.EMPTY)) @@ -123,6 +125,7 @@ public void testStartPartialRefresh_vcsSnapshotUnchanged_noExistingProjectSnapsh QuerySyncTestUtils.LOGGING_CONTEXT, project, project.vcsState(), + project.bazelVersion(), project.projectDefinition()); assertThat(update).isInstanceOf(PartialProjectRefresh.class); } @@ -141,6 +144,7 @@ public void testStartPartialRefresh_workspaceChange() throws Exception { QuerySyncTestUtils.LOGGING_CONTEXT, project, Optional.of(new VcsState("workspace2", "1", ImmutableSet.of(), Optional.empty())), + project.bazelVersion(), project.projectDefinition()); assertThat(update).isInstanceOf(FullProjectUpdate.class); } @@ -159,10 +163,46 @@ public void testStartPartialRefresh_upstreamRevisionChange() throws Exception { QuerySyncTestUtils.LOGGING_CONTEXT, project, Optional.of(new VcsState("workspaceId", "2", ImmutableSet.of(), Optional.empty())), + project.bazelVersion(), project.projectDefinition()); assertThat(update).isInstanceOf(FullProjectUpdate.class); } + @Test + public void testStartPartialRefresh_bazelVersionChanged() throws Exception { + PostQuerySyncData project = + PostQuerySyncData.EMPTY.toBuilder() + .setQuerySummary(QuerySummaryTestUtil.createProtoForPackages("//package/path:rule")) + .setVcsState( + Optional.of( + new VcsState( + "workspaceId", + "1", + ImmutableSet.of( + new WorkspaceFileChange( + Operation.MODIFY, Path.of("package/path/BUILD"))), + Optional.empty()))) + .setProjectDefinition( + ProjectDefinition.create( + ImmutableSet.of(Path.of("package")), + ImmutableSet.of(), + ImmutableSet.of(QuerySyncLanguage.JAVA), + ImmutableSet.of())) + .setBazelVersion(Optional.of("1.0.0")) + .build(); + + RefreshOperation update = + createRefresher(VcsStateDiffer.NONE) + .startPartialRefresh( + QuerySyncTestUtils.LOGGING_CONTEXT, + project, + project.vcsState(), + Optional.of("2.0.0"), + project.projectDefinition()); + + assertThat(update).isInstanceOf(FullProjectUpdate.class); + } + @Test public void testStartPartialRefresh_buildFileAddedThenReverted() throws Exception { PostQuerySyncData project = @@ -190,6 +230,7 @@ public void testStartPartialRefresh_buildFileAddedThenReverted() throws Exceptio QuerySyncTestUtils.LOGGING_CONTEXT, project, Optional.of(new VcsState("workspaceId", "1", ImmutableSet.of(), Optional.empty())), + project.bazelVersion(), project.projectDefinition()); assertThat(update).isInstanceOf(PartialProjectRefresh.class); @@ -225,6 +266,7 @@ public void testStartPartialRefresh_buildFileDeletedThenReverted() throws Except QuerySyncTestUtils.LOGGING_CONTEXT, project, Optional.of(new VcsState("workspaceId", "1", ImmutableSet.of(), Optional.empty())), + project.bazelVersion(), project.projectDefinition()); assertThat(update).isInstanceOf(PartialProjectRefresh.class); @@ -256,6 +298,7 @@ public void testStartPartialRefresh_buildFileModified() throws Exception { QuerySyncTestUtils.LOGGING_CONTEXT, project, Optional.of(new VcsState("workspaceId", "1", workingSet, Optional.empty())), + project.bazelVersion(), project.projectDefinition()); assertThat(update).isInstanceOf(PartialProjectRefresh.class); @@ -289,6 +332,7 @@ public void testStartPartialRefresh_buildFileInWorkingSet_unmodified() throws Ex QuerySyncTestUtils.LOGGING_CONTEXT, project, Optional.of(new VcsState("workspaceId", "1", workingSet, Optional.empty())), + project.bazelVersion(), project.projectDefinition()); assertThat(update).isInstanceOf(NoopProjectRefresh.class); @@ -322,6 +366,7 @@ public void testStartPartialRefresh_buildFileModifiedThenReverted() throws Excep QuerySyncTestUtils.LOGGING_CONTEXT, project, Optional.of(new VcsState("workspaceId", "1", ImmutableSet.of(), Optional.empty())), + project.bazelVersion(), project.projectDefinition()); assertThat(update).isInstanceOf(PartialProjectRefresh.class); diff --git a/querysync/javatests/com/google/idea/blaze/qsync/TestDataSyncRunner.java b/querysync/javatests/com/google/idea/blaze/qsync/TestDataSyncRunner.java index b22868b56e0..4a74415da04 100644 --- a/querysync/javatests/com/google/idea/blaze/qsync/TestDataSyncRunner.java +++ b/querysync/javatests/com/google/idea/blaze/qsync/TestDataSyncRunner.java @@ -63,6 +63,7 @@ public BlazeProjectSnapshot sync(TestData testProject) throws IOException, Build .setProjectDefinition(projectDefinition) .setQuerySummary(querySummary) .setVcsState(Optional.empty()) + .setBazelVersion(Optional.empty()) .build(); BuildGraphData buildGraphData = new BlazeQueryParser(querySummary, context, ImmutableSet.of()).parse();