diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c89fc9f3..cb75a95da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,10 @@ | [#249](https://github.com/JetBrains/bazel-bsp/pull/249) - e2e test for local jdk and remote jdk | [#253](https://github.com/JetBrains/bazel-bsp/pull/253) +- Dependency sources are now filtered if they belong to other root target + | [#265](https://github.com/JetBrains/bazel-bsp/pull/265) +- JvmEnvironmentItem is set using env from target + | [#260](https://github.com/JetBrains/bazel-bsp/pull/260) ### Fixes 🛠️ - CLI project view generator now supports `--excluded-targets` and `--excluded-directories` instead of excluded `-` prefix. diff --git a/e2e/runTest.sh b/e2e/runTest.sh index f4e62a2dc..13143d2bc 100755 --- a/e2e/runTest.sh +++ b/e2e/runTest.sh @@ -15,6 +15,7 @@ TEST_TARGET="$1" # second argument (optional) of the script should be a path to the directory with tested project (relative to the project root) TEST_PROJECT_PATH="$2" + GREEN='\033[0;32m' RED='\033[0;31m' NC='\033[0m' @@ -52,7 +53,7 @@ echo -e "-----------------------------------\n" cd "$BUILD_WORKSPACE_DIRECTORY" || exit -bazel run "$TEST_TARGET" +foo1=invalid_val1 foo2=invalid_val2 foo3=val3 foo4=val4 bazel run "$TEST_TARGET" EXECUTION_CODE=$? if [ $EXECUTION_CODE -ne 0 ]; then diff --git a/e2e/src/main/java/org/jetbrains/bsp/bazel/BazelBspSampleRepoTest.kt b/e2e/src/main/java/org/jetbrains/bsp/bazel/BazelBspSampleRepoTest.kt index 27cacc51b..a91fa0ecd 100644 --- a/e2e/src/main/java/org/jetbrains/bsp/bazel/BazelBspSampleRepoTest.kt +++ b/e2e/src/main/java/org/jetbrains/bsp/bazel/BazelBspSampleRepoTest.kt @@ -229,6 +229,20 @@ object BazelBspSampleRepoTest : BazelBspTestBaseScenario() { ) manualTargetTestScalaBinarySources.roots = listOf("file://\$WORKSPACE/") + val environmentVariablesJavaBinary = SourceItem("file://\$WORKSPACE/environment_variables/JavaEnv.java", SourceItemKind.FILE, false) + val environmentVariablesJavaBinarySources = SourcesItem( + BuildTargetIdentifier("//environment_variables:java_binary"), + listOf(environmentVariablesJavaBinary) + ) + environmentVariablesJavaBinarySources.roots = listOf("file://\$WORKSPACE/") + + val environmentVariablesJavaTest = SourceItem("file://\$WORKSPACE/environment_variables/JavaTest.java", SourceItemKind.FILE, false) + val environmentVariablesJavaTestSources = SourcesItem( + BuildTargetIdentifier("//environment_variables:java_test"), + listOf(environmentVariablesJavaTest) + ) + environmentVariablesJavaTestSources.roots = listOf("file://\$WORKSPACE/") + val sourcesParams = SourcesParams(expectedTargetIdentifiers()) val expectedSourcesResult = SourcesResult( listOf( @@ -248,7 +262,9 @@ object BazelBspSampleRepoTest : BazelBspTestBaseScenario() { manualTargetTestJavaBinarySources, manualTargetTestScalaBinarySources, manualTargetTestJavaTestSources, - manualTargetTestScalaTestSources + manualTargetTestScalaTestSources, + environmentVariablesJavaBinarySources, + environmentVariablesJavaTestSources ) ) return BazelBspTestScenarioStep("sources results") { @@ -301,6 +317,10 @@ object BazelBspSampleRepoTest : BazelBspTestBaseScenario() { ResourcesItem(BuildTargetIdentifier("//manual_target:java_test"), emptyList()) val manualTargetScalaTest = ResourcesItem(BuildTargetIdentifier("//manual_target:scala_test"), emptyList()) + val environmentVariablesJavaBinary = + ResourcesItem(BuildTargetIdentifier("//environment_variables:java_binary"), emptyList()) + val environmentVariablesJavaTest = + ResourcesItem(BuildTargetIdentifier("//environment_variables:java_test"), emptyList()) val expectedResourcesResult = ResourcesResult( listOf( @@ -320,7 +340,9 @@ object BazelBspSampleRepoTest : BazelBspTestBaseScenario() { manualTargetJavaBinary, manualTargetScalaBinary, manualTargetJavaTest, - manualTargetScalaTest + manualTargetScalaTest, + environmentVariablesJavaBinary, + environmentVariablesJavaTest ) ) val resourcesParams = ResourcesParams(expectedTargetIdentifiers()) @@ -409,12 +431,10 @@ object BazelBspSampleRepoTest : BazelBspTestBaseScenario() { private fun dependencySourcesResults(): BazelBspTestScenarioStep { val javaTargetsJavaBinary = DependencySourcesItem( - BuildTargetIdentifier("//java_targets:java_binary"), - emptyList() + BuildTargetIdentifier("//java_targets:java_binary"), emptyList() ) val javaTargetsJavaLibrary = DependencySourcesItem( - BuildTargetIdentifier("//java_targets:java_library"), - emptyList() + BuildTargetIdentifier("//java_targets:java_library"), emptyList() ) val targetWithDependencyJavaBinary = DependencySourcesItem( BuildTargetIdentifier("//target_with_dependency:java_binary"), @@ -423,32 +443,25 @@ object BazelBspSampleRepoTest : BazelBspTestBaseScenario() { ) ) val javaTargetsSubpackageJavaLibrary = DependencySourcesItem( - BuildTargetIdentifier("//java_targets/subpackage:java_library"), - emptyList() + BuildTargetIdentifier("//java_targets/subpackage:java_library"), emptyList() ) val scalaTargetsScalaBinary = DependencySourcesItem( - BuildTargetIdentifier("//scala_targets:scala_binary"), - emptyList() + BuildTargetIdentifier("//scala_targets:scala_binary"), emptyList() ) val scalaTargetsScalaTest = DependencySourcesItem( - BuildTargetIdentifier("//scala_targets:scala_test"), - emptyList() + BuildTargetIdentifier("//scala_targets:scala_test"), emptyList() ) val targetWithResourcesJavaBinary = DependencySourcesItem( - BuildTargetIdentifier("//target_with_resources:java_binary"), - emptyList() + BuildTargetIdentifier("//target_with_resources:java_binary"), emptyList() ) val targetWithoutArgsBinary = DependencySourcesItem( - BuildTargetIdentifier("//target_without_args:binary"), - emptyList() + BuildTargetIdentifier("//target_without_args:binary"), emptyList() ) val targetWithoutJvmFlagsBinary = DependencySourcesItem( - BuildTargetIdentifier("//target_without_jvm_flags:binary"), - emptyList() + BuildTargetIdentifier("//target_without_jvm_flags:binary"), emptyList() ) val targetWithoutMainClassLibrary = DependencySourcesItem( - BuildTargetIdentifier("//target_without_main_class:library"), - emptyList() + BuildTargetIdentifier("//target_without_main_class:library"), emptyList() ) val javaTargetsJavaLibraryExported = DependencySourcesItem( BuildTargetIdentifier("//java_targets:java_library_exported"), emptyList() @@ -471,6 +484,12 @@ object BazelBspSampleRepoTest : BazelBspTestBaseScenario() { val manualTargetScalaTest = DependencySourcesItem( BuildTargetIdentifier("//manual_target:scala_test"), emptyList() ) + val environmentVariablesJavaBinary = DependencySourcesItem( + BuildTargetIdentifier("//environment_variables:java_binary"), emptyList() + ) + val environmentVariablesJavaTest = DependencySourcesItem( + BuildTargetIdentifier("//environment_variables:java_test"), emptyList() + ) val expectedDependencies = DependencySourcesResult( listOf( javaTargetsJavaBinary, @@ -489,7 +508,9 @@ object BazelBspSampleRepoTest : BazelBspTestBaseScenario() { manualTargetJavaBinary, manualTargetScalaBinary, manualTargetJavaTest, - manualTargetScalaTest + manualTargetScalaTest, + environmentVariablesJavaBinary, + environmentVariablesJavaTest ) ) val dependencySourcesParams = DependencySourcesParams(expectedTargetIdentifiers()) @@ -622,6 +643,25 @@ object BazelBspSampleRepoTest : BazelBspTestBaseScenario() { emptyList(), "\$WORKSPACE", mapOf() + ), + JvmEnvironmentItem( + BuildTargetIdentifier("//environment_variables:java_binary"), + listOf( + "file://\$BAZEL_CACHE/bazel-out/k8-fastbuild/bin/environment_variables/java_binary.jar" + ), + emptyList(), + "\$WORKSPACE", + mapOf("foo1" to "val1" , "foo2" to "val2") + ), + JvmEnvironmentItem( + BuildTargetIdentifier("//environment_variables:java_test"), + listOf( + "file://\$BAZEL_CACHE/bazel-out/k8-fastbuild/bin/environment_variables/java_test.jar", + "file://\$BAZEL_CACHE/external/remote_java_tools/java_tools/Runner_deploy.jar" + ), + emptyList(), + "\$WORKSPACE", + mapOf("foo1" to "val1" , "foo2" to "val2", "foo3" to "val3", "foo4" to "val4") ) ) ) @@ -748,7 +788,26 @@ object BazelBspSampleRepoTest : BazelBspTestBaseScenario() { emptyList(), "\$WORKSPACE", mapOf() - ) + ), + JvmEnvironmentItem( + BuildTargetIdentifier("//environment_variables:java_binary"), + listOf( + "file://\$BAZEL_CACHE/bazel-out/k8-fastbuild/bin/environment_variables/java_binary.jar" + ), + emptyList(), + "\$WORKSPACE", + mapOf("foo1" to "val1" , "foo2" to "val2") + ), + JvmEnvironmentItem( + BuildTargetIdentifier("//environment_variables:java_test"), + listOf( + "file://\$BAZEL_CACHE/bazel-out/k8-fastbuild/bin/environment_variables/java_test.jar", + "file://\$BAZEL_CACHE/external/remote_java_tools/java_tools/Runner_deploy.jar" + ), + emptyList(), + "\$WORKSPACE", + mapOf("foo1" to "val1" , "foo2" to "val2", "foo3" to "val3", "foo4" to "val4") + ), ) ) return BazelBspTestScenarioStep( @@ -992,6 +1051,30 @@ object BazelBspSampleRepoTest : BazelBspTestBaseScenario() { manualTargetJavaTest.displayName = "//manual_target:java_test" manualTargetJavaTest.baseDirectory = "file://\$WORKSPACE/manual_target/" + val environmentVariablesJavaLibrary = BuildTarget( + BuildTargetIdentifier("//environment_variables:java_binary"), + listOf("application"), + listOf("java"), + emptyList(), + BuildTargetCapabilities(true, false, true, false) + ) + environmentVariablesJavaLibrary.displayName = "//environment_variables:java_binary" + environmentVariablesJavaLibrary.baseDirectory = "file://\$WORKSPACE/environment_variables/" + environmentVariablesJavaLibrary.dataKind = "jvm" + environmentVariablesJavaLibrary.data = jvmBuildTarget + + val environmentVariablesJavaTest = BuildTarget( + BuildTargetIdentifier("//environment_variables:java_test"), + listOf("test"), + listOf("java"), + emptyList(), + BuildTargetCapabilities(true, true, false, false) + ) + environmentVariablesJavaTest.displayName = "//environment_variables:java_test" + environmentVariablesJavaTest.baseDirectory = "file://\$WORKSPACE/environment_variables/" + environmentVariablesJavaTest.dataKind = "jvm" + environmentVariablesJavaTest.data = jvmBuildTarget + return WorkspaceBuildTargetsResult( listOf( javaTargetsJavaBinary, @@ -1010,7 +1093,9 @@ object BazelBspSampleRepoTest : BazelBspTestBaseScenario() { manualTargetJavaBinary, manualTargetScalaBinary, manualTargetJavaTest, - manualTargetScalaTest + manualTargetScalaTest, + environmentVariablesJavaLibrary, + environmentVariablesJavaTest ) ) } diff --git a/e2e/test-resources/sample-repo/environment_variables/BUILD b/e2e/test-resources/sample-repo/environment_variables/BUILD new file mode 100644 index 000000000..d0275636c --- /dev/null +++ b/e2e/test-resources/sample-repo/environment_variables/BUILD @@ -0,0 +1,27 @@ +load("@rules_java//java:defs.bzl", "java_binary", "java_test") + +java_binary( + name = "java_binary", + srcs = ["JavaEnv.java"], + env = { + "foo1": "val1", + "foo2": "val2", + }, + main_class = "environment_variables.JavaEnv", + visibility = ["//visibility:public"], +) + +java_test( + name = "java_test", + srcs = ["JavaTest.java"], + env = { + "foo1": "val1", + "foo2": "val2", + }, + env_inherit = [ + "foo3", + "foo4", + ], + test_class = "environment_variables.JavaTest", + visibility = ["//visibility:public"], +) diff --git a/e2e/test-resources/sample-repo/environment_variables/JavaEnv.java b/e2e/test-resources/sample-repo/environment_variables/JavaEnv.java new file mode 100644 index 000000000..0e42997fa --- /dev/null +++ b/e2e/test-resources/sample-repo/environment_variables/JavaEnv.java @@ -0,0 +1,5 @@ +package environment_variables; + +public class JavaEnv { + public static final String value = "value"; +} diff --git a/e2e/test-resources/sample-repo/environment_variables/JavaTest.java b/e2e/test-resources/sample-repo/environment_variables/JavaTest.java new file mode 100644 index 000000000..73fc4d7ff --- /dev/null +++ b/e2e/test-resources/sample-repo/environment_variables/JavaTest.java @@ -0,0 +1,5 @@ +package environment_variables; + +public class JavaTest { + public static final String value = "value"; +} diff --git a/install/src/main/resources/aspects.bzl b/install/src/main/resources/aspects.bzl index bcd2832a9..792a0b07e 100644 --- a/install/src/main/resources/aspects.bzl +++ b/install/src/main/resources/aspects.bzl @@ -501,6 +501,8 @@ def _bsp_target_info_aspect_impl(target, ctx): java_target_info = java_target_info, java_toolchain_info = java_toolchain_info, java_runtime_info = java_runtime_info, + env = getattr(rule_attrs, "env", {}), + env_inherit = getattr(rule_attrs, "env_inherit", []), ) file_name = target.label.name diff --git a/server/src/main/java/org/jetbrains/bsp/bazel/server/sync/BazelProjectMapper.kt b/server/src/main/java/org/jetbrains/bsp/bazel/server/sync/BazelProjectMapper.kt index 27dc3679f..26597e600 100644 --- a/server/src/main/java/org/jetbrains/bsp/bazel/server/sync/BazelProjectMapper.kt +++ b/server/src/main/java/org/jetbrains/bsp/bazel/server/sync/BazelProjectMapper.kt @@ -5,9 +5,11 @@ import kotlinx.coroutines.flow.filterNot import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.toList import kotlinx.coroutines.runBlocking +import org.jetbrains.bsp.bazel.info.BspTargetInfo import org.jetbrains.bsp.bazel.info.BspTargetInfo.FileLocation import org.jetbrains.bsp.bazel.info.BspTargetInfo.TargetInfo import org.jetbrains.bsp.bazel.server.sync.dependencytree.DependencyTree +import org.jetbrains.bsp.bazel.server.sync.languages.LanguageData import org.jetbrains.bsp.bazel.server.sync.languages.LanguagePlugin import org.jetbrains.bsp.bazel.server.sync.languages.LanguagePluginsService import org.jetbrains.bsp.bazel.server.sync.model.Label @@ -18,6 +20,8 @@ import org.jetbrains.bsp.bazel.server.sync.model.SourceSet import org.jetbrains.bsp.bazel.server.sync.model.Tag import org.jetbrains.bsp.bazel.workspacecontext.WorkspaceContext import java.net.URI +import java.util.stream.Collector +import java.util.stream.Collectors class BazelProjectMapper( private val languagePluginsService: LanguagePluginsService, @@ -74,6 +78,7 @@ class BazelProjectMapper( val resources = resolveResources(target) val languageData = languagePlugin.resolveModule(target) val sourceDependencies = languagePlugin.dependencySources(target, dependencyTree) + val environment = environmentItem(target) return Module( label = label, isSynthetic = false, @@ -84,7 +89,8 @@ class BazelProjectMapper( sourceSet = sourceSet, resources = resources, sourceDependencies = sourceDependencies, - languageData = languageData + languageData = languageData, + environmentVariables = environment ) } @@ -129,4 +135,14 @@ class BazelProjectMapper( with(module) { (sourceSet.sources + resources).map { Pair(it, label) } } + + private fun environmentItem(target: TargetInfo): Map { + val inheritedEnvs = collectInheritedEnvs(target) + val targetEnv = target.envMap + return inheritedEnvs + targetEnv + } + + private fun collectInheritedEnvs(targetInfo: TargetInfo): Map = + targetInfo.envInheritList.associateWith { System.getenv(it)} + } diff --git a/server/src/main/java/org/jetbrains/bsp/bazel/server/sync/IntelliJProjectTreeViewFix.kt b/server/src/main/java/org/jetbrains/bsp/bazel/server/sync/IntelliJProjectTreeViewFix.kt index ae4f91423..b2dee9c51 100644 --- a/server/src/main/java/org/jetbrains/bsp/bazel/server/sync/IntelliJProjectTreeViewFix.kt +++ b/server/src/main/java/org/jetbrains/bsp/bazel/server/sync/IntelliJProjectTreeViewFix.kt @@ -106,7 +106,8 @@ class IntelliJProjectTreeViewFix(private val bazelPathsResolver: BazelPathsResol SourceSet(emptySet(), emptySet()), resources, emptySet(), - null + null, + hashMapOf() ) } } diff --git a/server/src/main/java/org/jetbrains/bsp/bazel/server/sync/languages/java/JavaLanguagePlugin.kt b/server/src/main/java/org/jetbrains/bsp/bazel/server/sync/languages/java/JavaLanguagePlugin.kt index e9782a48b..ce31f9059 100644 --- a/server/src/main/java/org/jetbrains/bsp/bazel/server/sync/languages/java/JavaLanguagePlugin.kt +++ b/server/src/main/java/org/jetbrains/bsp/bazel/server/sync/languages/java/JavaLanguagePlugin.kt @@ -112,7 +112,7 @@ class JavaLanguagePlugin( javaModule.runtimeClasspath.map { obj: URI -> obj.toString() }.toList(), javaModule.jvmOps.toList(), bazelInfo.workspaceRoot.toString(), - mapOf() + module.environmentVariables ) // FIXME: figure out what we should pass here, because passing the environment // of the *SERVER* makes little sense diff --git a/server/src/main/java/org/jetbrains/bsp/bazel/server/sync/model/Module.kt b/server/src/main/java/org/jetbrains/bsp/bazel/server/sync/model/Module.kt index 2c90e9a2f..62742a39d 100644 --- a/server/src/main/java/org/jetbrains/bsp/bazel/server/sync/model/Module.kt +++ b/server/src/main/java/org/jetbrains/bsp/bazel/server/sync/model/Module.kt @@ -15,4 +15,5 @@ data class Module( val resources: Set, val sourceDependencies: Set, val languageData: LanguageData?, + val environmentVariables: Map ) diff --git a/server/src/main/java/org/jetbrains/bsp/bazel/server/sync/proto/bsp_target_info.proto b/server/src/main/java/org/jetbrains/bsp/bazel/server/sync/proto/bsp_target_info.proto index a57daeb11..ce2eafa38 100644 --- a/server/src/main/java/org/jetbrains/bsp/bazel/server/sync/proto/bsp_target_info.proto +++ b/server/src/main/java/org/jetbrains/bsp/bazel/server/sync/proto/bsp_target_info.proto @@ -64,6 +64,8 @@ message TargetInfo { repeated Dependency dependencies = 40; repeated FileLocation sources = 50; repeated FileLocation resources = 60; + map env = 70; + repeated string env_inherit = 80; JavaTargetInfo java_target_info = 1000; JavaToolchainInfo java_toolchain_info = 2000; JavaRuntimeInfo java_runtime_info = 3000; diff --git a/server/src/test/java/org/jetbrains/bsp/bazel/server/bloop/BspModuleExporterTest.kt b/server/src/test/java/org/jetbrains/bsp/bazel/server/bloop/BspModuleExporterTest.kt index 79854504b..30724a70b 100644 --- a/server/src/test/java/org/jetbrains/bsp/bazel/server/bloop/BspModuleExporterTest.kt +++ b/server/src/test/java/org/jetbrains/bsp/bazel/server/bloop/BspModuleExporterTest.kt @@ -50,9 +50,10 @@ class BspModuleExporterTest { emptyList(), listOf(baseDirectory.resolve("cp1").toUri()), emptyList(), - emptyList() + emptyList(), ) - ) + ), + hashMapOf() ) val project = Project( baseDirectory.toUri(), listOf(bspModule), emptyMap() diff --git a/server/src/test/java/org/jetbrains/bsp/bazel/server/sync/ProjectStorageTest.kt b/server/src/test/java/org/jetbrains/bsp/bazel/server/sync/ProjectStorageTest.kt index f0eb3b485..f50d3a747 100644 --- a/server/src/test/java/org/jetbrains/bsp/bazel/server/sync/ProjectStorageTest.kt +++ b/server/src/test/java/org/jetbrains/bsp/bazel/server/sync/ProjectStorageTest.kt @@ -58,10 +58,10 @@ class ProjectStorageTest { ), emptySet(), emptySet(), - scalaModule - + scalaModule, + hashMapOf() ) - ), mapOf(URI.create("file:///root/project/Lib.java") to Label("file:///root")) + ), mapOf(URI.create("file:///root/project/Lib.java") to Label("file:///root")), ) storage.store(project) val loaded = storage.load()