Skip to content

Commit

Permalink
Set bazel version for bazel project
Browse files Browse the repository at this point in the history
(cherry picked from commit 957b04d)
  • Loading branch information
Googler authored and mai93 committed Mar 26, 2024
1 parent 534cc62 commit 1be27e9
Show file tree
Hide file tree
Showing 20 changed files with 210 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,11 @@ public void populateBlazeVersionData(
builder.setBazelVersion(BazelVersion.parseVersion(blazeInfo));
}

@Override
public Optional<String> getBazelVersionString(BlazeInfo blazeInfo) {
return Optional.ofNullable(BazelVersion.parseVersion(blazeInfo).toString());
}

@Override
public BazelQueryRunner createQueryRunner(Project project) {
return new BazelQueryRunner(project, this);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
3 changes: 3 additions & 0 deletions base/src/com/google/idea/blaze/base/bazel/BuildSystem.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<String> getBazelVersionString(BlazeInfo blazeInfo);

/**
* Returns the parallel invoker if the sync strategy is PARALLEL and the system supports it;
* otherwise returns the standard invoker.
Expand Down
45 changes: 45 additions & 0 deletions base/src/com/google/idea/blaze/base/qsync/BazelVersionHandler.java
Original file line number Diff line number Diff line change
@@ -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<String> 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);
}
}
}
12 changes: 9 additions & 3 deletions base/src/com/google/idea/blaze/base/qsync/ProjectLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -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());

Expand Down Expand Up @@ -248,8 +253,9 @@ private ParallelPackageReader createWorkspaceRelativePackageReader() {
private ProjectQuerierImpl createProjectQuerier(
ProjectRefresher projectRefresher,
QueryRunner queryRunner,
Optional<BlazeVcsHandler> vcsHandler) {
return new ProjectQuerierImpl(queryRunner, projectRefresher, vcsHandler);
Optional<BlazeVcsHandler> vcsHandler,
BazelVersionHandler bazelVersionProvider) {
return new ProjectQuerierImpl(queryRunner, projectRefresher, vcsHandler, bazelVersionProvider);
}

protected QueryRunner createQueryRunner(BuildSystem buildSystem) {
Expand Down
17 changes: 14 additions & 3 deletions base/src/com/google/idea/blaze/base/qsync/ProjectQuerierImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,14 +45,18 @@ public class ProjectQuerierImpl implements ProjectQuerier {
private final ProjectRefresher projectRefresher;
private final Optional<BlazeVcsHandler> vcsHandler;

private final BazelVersionHandler bazelVersionProvider;

@VisibleForTesting
public ProjectQuerierImpl(
QueryRunner queryRunner,
ProjectRefresher projectRefresher,
Optional<BlazeVcsHandler> vcsHandler) {
Optional<BlazeVcsHandler> vcsHandler,
BazelVersionHandler bazelVersionProvider) {
this.queryRunner = queryRunner;
this.projectRefresher = projectRefresher;
this.vcsHandler = vcsHandler;
this.bazelVersionProvider = bazelVersionProvider;
}

/**
Expand All @@ -74,7 +78,9 @@ public PostQuerySyncData fullQuery(ProjectDefinition projectDef, BlazeContext co
vcsState.map(s -> s.upstreamRevision).orElse("<unknown>"),
vcsState.flatMap(s -> s.workspaceSnapshotPath).map(Object::toString).orElse("<none>")));

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));
Expand Down Expand Up @@ -124,7 +130,12 @@ public PostQuerySyncData update(
vcsState.flatMap(s -> s.workspaceSnapshotPath).map(Object::toString).orElse("<none>")));

RefreshOperation refresh =
projectRefresher.startPartialRefresh(context, previousState, vcsState, currentProjectDef);
projectRefresher.startPartialRefresh(
context,
previousState,
vcsState,
bazelVersionProvider.getBazelVersion(),
currentProjectDef);

Optional<QuerySpec> spec = refresh.getQuerySpec();
QuerySummary querySummary;
Expand Down
28 changes: 16 additions & 12 deletions base/src/com/google/idea/blaze/base/qsync/QuerySyncProjectData.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,11 @@ public void populateBlazeVersionData(
inner.populateBlazeVersionData(workspaceRoot, blazeInfo, builder);
}

@Override
public Optional<String> getBazelVersionString(BlazeInfo blazeInfo) {
return inner.getBazelVersionString(blazeInfo);
}

@Override
public BazelQueryRunner createQueryRunner(Project project) {
return inner.createQueryRunner(project);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,13 @@ public SyncStrategy getSyncStrategy(Project project) {
public void populateBlazeVersionData(
WorkspaceRoot workspaceRoot, BlazeInfo blazeInfo, BlazeVersionData.Builder builder) {}

abstract Optional<String> getBazelVersionString();

@Override
public Optional<String> getBazelVersionString(BlazeInfo blazeInfo) {
return getBazelVersionString();
}

@Override
public BazelQueryRunner createQueryRunner(Project project) {
return null;
Expand All @@ -102,6 +109,8 @@ public abstract static class Builder {

public abstract Builder setLocalBuildInvoker(Optional<BuildInvoker> value);

public abstract Builder setBazelVersionString(Optional<String> value);

public abstract Builder setSyncStrategy(SyncStrategy value);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,16 +37,19 @@ public class FullProjectUpdate implements RefreshOperation {
private final Path effectiveWorkspaceRoot;
private final ProjectDefinition projectDefinition;
private final Optional<VcsState> vcsState;
private final Optional<String> bazelVersion;

public FullProjectUpdate(
Context<?> context,
Path effectiveWorkspaceRoot,
ProjectDefinition definition,
Optional<VcsState> vcsState) {
Optional<VcsState> vcsState,
Optional<String> bazelVersion) {
this.context = context;
this.effectiveWorkspaceRoot = effectiveWorkspaceRoot;
this.projectDefinition = definition;
this.vcsState = vcsState;
this.bazelVersion = bazelVersion;
}

@Override
Expand All @@ -60,6 +63,7 @@ public PostQuerySyncData createPostQuerySyncData(QuerySummary output) {
return PostQuerySyncData.builder()
.setProjectDefinition(projectDefinition)
.setVcsState(vcsState)
.setBazelVersion(bazelVersion)
.setQuerySummary(output)
.build();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,15 @@ public class NoopProjectRefresh implements RefreshOperation {

private final Supplier<BlazeProjectSnapshot> latestProjectSnapshotSupplier;
private final Optional<VcsState> currentVcsState;
private final Optional<String> bazelVersion;

public NoopProjectRefresh(
Supplier<BlazeProjectSnapshot> latestProjectSnapshotSupplier,
Optional<VcsState> currentVcsState) {
Optional<VcsState> currentVcsState,
Optional<String> bazelVersion) {
this.latestProjectSnapshotSupplier = latestProjectSnapshotSupplier;
this.currentVcsState = currentVcsState;
this.bazelVersion = bazelVersion;
}

@Override
Expand All @@ -50,6 +53,7 @@ public Optional<QuerySpec> getQuerySpec() {
public PostQuerySyncData createPostQuerySyncData(QuerySummary output) {
return latestProjectSnapshotSupplier.get().queryData().toBuilder()
.setVcsState(currentVcsState)
.setBazelVersion(bazelVersion)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,20 +42,23 @@ class PartialProjectRefresh implements RefreshOperation {
private final Path effectiveWorkspaceRoot;
private final PostQuerySyncData previousState;
private final Optional<VcsState> currentVcsState;
private final Optional<String> bazelVersion;
@VisibleForTesting final ImmutableSet<Path> modifiedPackages;
@VisibleForTesting final ImmutableSet<Path> deletedPackages;

PartialProjectRefresh(
Path effectiveWorkspaceRoot,
PostQuerySyncData previousState,
Optional<VcsState> currentVcsState,
Optional<String> bazelVersion,
ImmutableSet<Path> modifiedPackages,
ImmutableSet<Path> deletedPackages) {
this.effectiveWorkspaceRoot = effectiveWorkspaceRoot;
this.previousState = previousState;
this.currentVcsState = currentVcsState;
this.modifiedPackages = modifiedPackages;
this.deletedPackages = deletedPackages;
this.bazelVersion = bazelVersion;
}

private Optional<QuerySpec> createQuerySpec() {
Expand All @@ -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();
Expand Down
22 changes: 17 additions & 5 deletions querysync/java/com/google/idea/blaze/qsync/ProjectRefresher.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,27 +45,36 @@ public ProjectRefresher(
}

public RefreshOperation startFullUpdate(
Context<?> context, ProjectDefinition spec, Optional<VcsState> vcsState) {
Context<?> context,
ProjectDefinition spec,
Optional<VcsState> vcsState,
Optional<String> 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<VcsState> latestVcsState,
Optional<String> 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);

Expand All @@ -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.
Expand All @@ -88,6 +99,7 @@ public RefreshOperation startPartialRefresh(RefreshParameters params, Context<?>
effectiveWorkspaceRoot,
params.currentProject,
params.latestVcsState,
params.latestBazelVersion,
affected.getModifiedPackages(),
affected.getDeletedPackages());
}
Expand Down
Loading

0 comments on commit 1be27e9

Please sign in to comment.