diff --git a/base/src/com/google/idea/blaze/base/command/mod/BlazeModRunnerImpl.java b/base/src/com/google/idea/blaze/base/command/mod/BlazeModRunnerImpl.java index f85fa9ce9fb..3d543d3c160 100644 --- a/base/src/com/google/idea/blaze/base/command/mod/BlazeModRunnerImpl.java +++ b/base/src/com/google/idea/blaze/base/command/mod/BlazeModRunnerImpl.java @@ -38,6 +38,19 @@ public class BlazeModRunnerImpl extends BlazeModRunner { + private static final String DUMP_REPO_MAPPING = "dump_repo_mapping"; + private static final String ROOT_WORKSPACE = ""; + + /** + * {@code bazel mod dump_repo_mapping} takes a canonical repository name and will dump a map from + * repoName -> canonicalName of all the external repositories available to that repository The + * name {@code ""} is special and considered to be the main workspace so in order to dump + * the main repository map we would invoke it like {@code bazel mod dump_repo_mapping ""}. + * + *

Additionally the flag {@code --enable_workspace} needs to be off for this to work. The flag + * is default off in bazel 8.0.0 but it is on between 7.1.0 and 8.0.0. So we need to also pass + * this along in between those versions for the command to work well. + */ @Override public ListenableFuture dumpRepoMapping( Project project, @@ -45,10 +58,17 @@ public ListenableFuture dumpRepoMapping( BlazeContext context, BuildSystemName buildSystemName, List flags) { + + // TODO: when 8.0.0 is released add this only if it's disabled explicitly for the repo + flags.add("--noenable_workspace"); + return Futures.transform( - runBlazeModGetBytes(project, invoker, context, ImmutableList.of( "dump_repo_mapping", "workspace"), flags), + runBlazeModGetBytes( + project, invoker, context, ImmutableList.of(DUMP_REPO_MAPPING, ROOT_WORKSPACE), flags), bytes -> { - JsonObject json = JsonParser.parseString(new String(bytes, StandardCharsets.UTF_8).trim()).getAsJsonObject(); + JsonObject json = + JsonParser.parseString(new String(bytes, StandardCharsets.UTF_8).trim()) + .getAsJsonObject(); ImmutableList externalWorkspaces = json.entrySet().stream() @@ -70,21 +90,22 @@ protected ListenableFuture runBlazeModGetBytes( List args, List flags) { return BlazeExecutor.getInstance() - .submit(() -> { - BlazeCommand.Builder builder = - BlazeCommand.builder(invoker, BlazeCommandName.MOD) - .addBlazeFlags(flags); + .submit( + () -> { + BlazeCommand.Builder builder = + BlazeCommand.builder(invoker, BlazeCommandName.MOD).addBlazeFlags(flags); - if (args != null) { - builder.addBlazeFlags(args); - } + if (args != null) { + builder.addBlazeFlags(args); + } - try (BuildResultHelper buildResultHelper = invoker.createBuildResultHelper()) { - BlazeCommandRunner runner = invoker.getCommandRunner(); - try (InputStream stream = runner.runBlazeMod(project, builder, buildResultHelper, context)) { - return stream.readAllBytes(); - } - } - }); + try (BuildResultHelper buildResultHelper = invoker.createBuildResultHelper()) { + BlazeCommandRunner runner = invoker.getCommandRunner(); + try (InputStream stream = + runner.runBlazeMod(project, builder, buildResultHelper, context)) { + return stream.readAllBytes(); + } + } + }); } } diff --git a/base/src/com/google/idea/blaze/base/model/ExternalWorkspaceDataProvider.java b/base/src/com/google/idea/blaze/base/model/ExternalWorkspaceDataProvider.java index 21ebefc744b..8e5a748aa02 100644 --- a/base/src/com/google/idea/blaze/base/model/ExternalWorkspaceDataProvider.java +++ b/base/src/com/google/idea/blaze/base/model/ExternalWorkspaceDataProvider.java @@ -57,12 +57,12 @@ public static ExternalWorkspaceDataProvider getInstance(Project project) { } static Boolean isEnabled(BlazeVersionData blazeVersionData) { - // disable this until a more reliable opt-in mechanism is chosen. - // - // bg: some blaze workspaces with blaze > MINIMUM_BLAZE_VERSION - // have explicitly disabled this bzlmod support and this causes - // `blaze mod` to fail. - return blazeVersionData.bazelIsAtLeastVersion(MINIMUM_BLAZE_VERSION) && Registry.is("bazel.read.external.workspace.data"); + if (!Registry.is("bazel.read.external.workspace.data")) { + logger.info("disabled by registry"); + return false; + } + + return blazeVersionData.bazelIsAtLeastVersion(MINIMUM_BLAZE_VERSION); } public ListenableFuture getExternalWorkspaceData( 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 8bbdcb1a480..8696f18bfd2 100644 --- a/base/src/com/google/idea/blaze/base/sync/ProjectStateSyncTask.java +++ b/base/src/com/google/idea/blaze/base/sync/ProjectStateSyncTask.java @@ -233,7 +233,7 @@ private ExternalWorkspaceData getExternalWorkspaceData( SyncMode syncMode) throws SyncCanceledException, SyncFailedException { - List syncFlags = + List blazeModFlags = BlazeFlags.blazeFlags( project, projectViewSet, @@ -243,7 +243,7 @@ private ExternalWorkspaceData getExternalWorkspaceData( ListenableFuture externalWorkspaceDataFuture = ExternalWorkspaceDataProvider.getInstance(project) - .getExternalWorkspaceData(context, syncFlags, blazeVersionData, blazeInfo); + .getExternalWorkspaceData(context, blazeModFlags, blazeVersionData, blazeInfo); FutureResult externalWorkspaceDataResult = FutureUtil.waitForFuture(context, externalWorkspaceDataFuture)