diff --git a/.bazelrc b/.bazelrc index c433651c2..888a22617 100644 --- a/.bazelrc +++ b/.bazelrc @@ -1,3 +1,2 @@ common --config=rules -common:v2.2 --config=rules_v2.2 import %workspace%/.bazelrc_shared diff --git a/.bazelrc_shared b/.bazelrc_shared index 3d0d7e82a..535ef2f73 100644 --- a/.bazelrc_shared +++ b/.bazelrc_shared @@ -14,16 +14,15 @@ test --test_output=all build:rules --disk_cache=.bazel_cache build:tests --disk_cache=../.bazel_cache -# bazel 2.2.0 -common:rules_v2.1 --config=noop -common:rules_v2.2 --config=noop +common:rules_v3.2 --config=noop +common:rules_v3.3 --config=noop # route potentially unrouted configs to a terminating noop config # it's a noop because we use the default value common:rules --config=noop common:tests --config=noop -common:v2.1 --config=rules_v2.1 -common:v2.2 --config=rules_v2.2 +common:v3.2 --config=rules_v3.2 +common:v3.3 --config=rules_v3.3 # pick something trivial as a "noop" common:noop --logging=3 diff --git a/.travis.yml b/.travis.yml index 514077d82..c8584c933 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,36 +28,36 @@ jobs: # Build - stage: build <<: *osx - env: BAZEL_VERSION=2.1.0 + env: BAZEL_VERSION=3.2.0 script: ./scripts/travis.sh build - <<: *linux - env: BAZEL_VERSION=2.1.0 + env: BAZEL_VERSION=3.2.0 script: ./scripts/travis.sh build - <<: *osx - env: BAZEL_VERSION=2.2.0 + env: BAZEL_VERSION=3.3.0 script: ./scripts/travis.sh build - <<: *linux - env: BAZEL_VERSION=2.2.0 + env: BAZEL_VERSION=3.3.0 script: ./scripts/travis.sh build # Lint - stage: lint <<: *osx - env: BAZEL_VERSION=2.1.0 + env: BAZEL_VERSION=3.2.0 script: ./scripts/travis.sh lint - <<: *linux - env: BAZEL_VERSION=2.2.0 + env: BAZEL_VERSION=3.3.0 script: ./scripts/travis.sh lint # Test - stage: test <<: *osx - env: BAZEL_VERSION=2.1.0 + env: BAZEL_VERSION=3.2.0 script: ./scripts/travis.sh test - <<: *linux - env: BAZEL_VERSION=2.1.0 + env: BAZEL_VERSION=3.2.0 script: ./scripts/travis.sh test - <<: *osx - env: BAZEL_VERSION=2.2.0 + env: BAZEL_VERSION=3.3.0 script: ./scripts/travis.sh test - <<: *linux - env: BAZEL_VERSION=2.2.0 + env: BAZEL_VERSION=3.3.0 script: ./scripts/travis.sh test diff --git a/docs/stardoc/scala.md b/docs/stardoc/scala.md index c85daa1fc..023561d3a 100644 --- a/docs/stardoc/scala.md +++ b/docs/stardoc/scala.md @@ -72,7 +72,7 @@ configure_bootstrap_scala(name, -scala_binary(name, data, deps, deps_used_whitelist, javacopts, jvm_flags, main_class, plugins, resource_jars, resource_strip_prefix, resources, runtime_deps, scala, scalacopts, srcs) +scala_binary(name, data, deps, deps_unused_whitelist, deps_used_whitelist, javacopts, jvm_flags, main_class, plugins, resource_jars, resource_strip_prefix, resources, runtime_deps, scala, scalacopts, srcs) @@ -122,6 +122,15 @@ To run the program: `bazel run `

+ + deps_unused_whitelist + + List of labels; optional +

+ The JVM library dependencies to always consider unused for `scala_deps_direct` checks. +

+ + deps_used_whitelist @@ -311,7 +320,7 @@ Use this only for libraries with macros. Otherwise, use `java_import`. ## scala_library
-scala_library(name, data, deps, deps_used_whitelist, exports, javacopts, macro, neverlink, plugins, resource_jars, resource_strip_prefix, resources, runtime_deps, scala, scalacopts, srcs)
+scala_library(name, data, deps, deps_unused_whitelist, deps_used_whitelist, exports, javacopts, macro, neverlink, plugins, resource_jars, resource_strip_prefix, resources, runtime_deps, scala, scalacopts, srcs)
 
Compiles a Scala JVM library. @@ -351,6 +360,15 @@ Compiles a Scala JVM library.

+ + deps_unused_whitelist + + List of labels; optional +

+ The JVM library dependencies to always consider unused for `scala_deps_direct` checks. +

+ + deps_used_whitelist @@ -555,7 +573,7 @@ To run: `bazel run ` ## scala_test
-scala_test(name, data, deps, deps_used_whitelist, frameworks, isolation, javacopts, jvm_flags, plugins, resource_jars, resource_strip_prefix, resources, runner, runtime_deps, scala, scalacopts, shared_deps, srcs, subprocess_runner)
+scala_test(name, data, deps, deps_unused_whitelist, deps_used_whitelist, frameworks, isolation, javacopts, jvm_flags, plugins, resource_jars, resource_strip_prefix, resources, runner, runtime_deps, scala, scalacopts, shared_deps, srcs, subprocess_runner)
 
@@ -604,6 +622,15 @@ To build and run a specific test: `bazel test --test_filter= + + deps_unused_whitelist + + List of labels; optional +

+ The JVM library dependencies to always consider unused for `scala_deps_direct` checks. +

+ + deps_used_whitelist diff --git a/docs/stardoc/scala_with_scalafmt.md b/docs/stardoc/scala_with_scalafmt.md index 22fc91d4b..9f8a81b32 100644 --- a/docs/stardoc/scala_with_scalafmt.md +++ b/docs/stardoc/scala_with_scalafmt.md @@ -5,7 +5,7 @@ ## scala_binary
-scala_binary(name, config, data, deps, deps_used_whitelist, format, javacopts, jvm_flags, main_class, plugins, resource_jars, resource_strip_prefix, resources, runtime_deps, scala, scalacopts, srcs)
+scala_binary(name, config, data, deps, deps_unused_whitelist, deps_used_whitelist, format, javacopts, jvm_flags, main_class, plugins, resource_jars, resource_strip_prefix, resources, runtime_deps, scala, scalacopts, srcs)
 
@@ -64,6 +64,15 @@ To run the program: `bazel run `

+ + deps_unused_whitelist + + List of labels; optional +

+ The JVM library dependencies to always consider unused for `scala_deps_direct` checks. +

+ + deps_used_whitelist @@ -188,7 +197,7 @@ To run the program: `bazel run ` ## scala_library
-scala_library(name, config, data, deps, deps_used_whitelist, exports, format, javacopts, macro, neverlink, plugins, resource_jars, resource_strip_prefix, resources, runtime_deps, scala, scalacopts, srcs)
+scala_library(name, config, data, deps, deps_unused_whitelist, deps_used_whitelist, exports, format, javacopts, macro, neverlink, plugins, resource_jars, resource_strip_prefix, resources, runtime_deps, scala, scalacopts, srcs)
 
Compiles a Scala JVM library. @@ -237,6 +246,15 @@ Compiles a Scala JVM library.

+ + deps_unused_whitelist + + List of labels; optional +

+ The JVM library dependencies to always consider unused for `scala_deps_direct` checks. +

+ + deps_used_whitelist @@ -370,7 +388,7 @@ Compiles a Scala JVM library. ## scala_test
-scala_test(name, config, data, deps, deps_used_whitelist, format, frameworks, isolation, javacopts, jvm_flags, plugins, resource_jars, resource_strip_prefix, resources, runner, runtime_deps, scala, scalacopts, shared_deps, srcs, subprocess_runner)
+scala_test(name, config, data, deps, deps_unused_whitelist, deps_used_whitelist, format, frameworks, isolation, javacopts, jvm_flags, plugins, resource_jars, resource_strip_prefix, resources, runner, runtime_deps, scala, scalacopts, shared_deps, srcs, subprocess_runner)
 
@@ -428,6 +446,15 @@ To build and run a specific test: `bazel test --test_filter= + + deps_unused_whitelist + + List of labels; optional +

+ The JVM library dependencies to always consider unused for `scala_deps_direct` checks. +

+ + deps_used_whitelist diff --git a/rules/external/third_party/bazel/tools/build_defs/repo/java.bzl b/rules/external/third_party/bazel/tools/build_defs/repo/java.bzl index a444e421f..9f93c2772 100644 --- a/rules/external/third_party/bazel/tools/build_defs/repo/java.bzl +++ b/rules/external/third_party/bazel/tools/build_defs/repo/java.bzl @@ -26,7 +26,7 @@ These import rules must have the following attributes: - "runtime_deps" - "exports" -the code here is solely based on `jave_import_external` from bazelbuild/bazel repository and is proposed to be upstreamed back. +the code here is solely based on `java_import_external` from bazelbuild/bazel repository and is proposed to be upstreamed back. the following macros are defined below that utilize jvm_import_external: diff --git a/rules/private/phases/phase_zinc_compile.bzl b/rules/private/phases/phase_zinc_compile.bzl index 7d1b57016..c53272501 100644 --- a/rules/private/phases/phase_zinc_compile.bzl +++ b/rules/private/phases/phase_zinc_compile.bzl @@ -89,6 +89,7 @@ def phase_zinc_compile(ctx, g): executable = worker.files_to_run.executable, input_manifests = input_manifests, execution_requirements = _resolve_execution_reqs(ctx, {"no-sandbox": "1", "supports-workers": "1"}), + use_default_shell_env = True, arguments = [args], ) @@ -104,7 +105,7 @@ def phase_zinc_compile(ctx, g): deps = depset( [struct( apis = apis, - jars = jars, + jars = tuple(jars), label = ctx.label, relations = relations, )], diff --git a/rules/private/phases/phase_zinc_depscheck.bzl b/rules/private/phases/phase_zinc_depscheck.bzl index f68db0719..c611220a4 100644 --- a/rules/private/phases/phase_zinc_depscheck.bzl +++ b/rules/private/phases/phase_zinc_depscheck.bzl @@ -31,7 +31,8 @@ def phase_zinc_depscheck(ctx, g): deps_args.add_all("--direct", [dep.label for dep in ctx.attr.deps], format_each = "_%s") deps_args.add_all(labeled_jars, map_each = _depscheck_labeled_group) deps_args.add("--label", ctx.label, format = "_%s") - deps_args.add_all("--whitelist", [dep.label for dep in ctx.attr.deps_used_whitelist], format_each = "_%s") + deps_args.add_all("--used_whitelist", [dep.label for dep in ctx.attr.deps_used_whitelist], format_each = "_%s") + deps_args.add_all("--unused_whitelist", [dep.label for dep in ctx.attr.deps_unused_whitelist], format_each = "_%s") deps_args.add("--") deps_args.add(g.compile.used) deps_args.add(deps_check) @@ -44,6 +45,7 @@ def phase_zinc_depscheck(ctx, g): executable = deps_configuration.worker.files_to_run.executable, input_manifests = worker_input_manifests, execution_requirements = _resolve_execution_reqs(ctx, {"supports-workers": "1"}), + use_default_shell_env = True, arguments = [deps_args], ) deps_checks[name] = deps_check diff --git a/rules/scala.bzl b/rules/scala.bzl index 01c68ced4..4dff32b2c 100644 --- a/rules/scala.bzl +++ b/rules/scala.bzl @@ -107,6 +107,10 @@ _compile_attributes = { doc = "The JVM library dependencies to always consider used for `scala_deps_used` checks.", providers = [JavaInfo], ), + "deps_unused_whitelist": attr.label_list( + doc = "The JVM library dependencies to always consider unused for `scala_deps_direct` checks.", + providers = [JavaInfo], + ), "runtime_deps": attr.label_list( doc = "The JVM runtime-only library dependencies.", providers = [JavaInfo], diff --git a/rules/scala/workspace.bzl b/rules/scala/workspace.bzl index 2327c75ae..de6e2515f 100644 --- a/rules/scala/workspace.bzl +++ b/rules/scala/workspace.bzl @@ -21,12 +21,12 @@ def scala_artifacts(): "org.scala-sbt:util-interface:1.3.0", "org.scala-sbt:util-logging_2.12:1.3.0", "org.scala-sbt:compiler-interface:1.3.4", - "org.scala-sbt:zinc-compile-core_2.12:1.3.4", - "org.scala-sbt:zinc_2.12:1.3.4", - "org.scala-sbt:zinc-persist_2.12:1.3.4", - "org.scala-sbt:zinc-core_2.12:1.3.4", - "org.scala-sbt:zinc-apiinfo_2.12:1.3.4", - "org.scala-sbt:zinc-classpath_2.12:1.3.4", + "org.scala-sbt:zinc-compile-core_2.12:1.4.0", + "org.scala-sbt:zinc_2.12:1.4.0", + "org.scala-sbt:zinc-persist_2.12:1.4.0", + "org.scala-sbt:zinc-core_2.12:1.4.0", + "org.scala-sbt:zinc-apiinfo_2.12:1.4.0", + "org.scala-sbt:zinc-classpath_2.12:1.4.0", "ch.epfl.scala:bloop-frontend_2.12:1.0.0", "com.thesamet.scalapb:scalapb-runtime_2.12:0.9.0", ] diff --git a/rules/scalafmt/scalafmt/ScalafmtRunner.scala b/rules/scalafmt/scalafmt/ScalafmtRunner.scala index 3755fb4d8..ac33064bd 100644 --- a/rules/scalafmt/scalafmt/ScalafmtRunner.scala +++ b/rules/scalafmt/scalafmt/ScalafmtRunner.scala @@ -39,9 +39,14 @@ object ScalafmtRunner extends WorkerMain[Unit] { format(source) } catch { case e @ (_: org.scalafmt.Error | _: scala.meta.parsers.ParseException) => { - System.err.println(Color.Warning("Unable to format file due to bug in scalafmt")) - System.err.println(Color.Warning(e.toString)) - source + if (config.runner.fatalWarnings) { + System.err.println(Color.Error("Exception thrown by Scalafmt and fatalWarnings is enabled")) + throw e + } else { + System.err.println(Color.Warning("Unable to format file due to bug in scalafmt")) + System.err.println(Color.Warning(e.toString)) + source + } } } diff --git a/src/main/scala/higherkindness/rules_scala/workers/deps/DepsRunner.scala b/src/main/scala/higherkindness/rules_scala/workers/deps/DepsRunner.scala index 12970919f..23b4319f2 100644 --- a/src/main/scala/higherkindness/rules_scala/workers/deps/DepsRunner.scala +++ b/src/main/scala/higherkindness/rules_scala/workers/deps/DepsRunner.scala @@ -30,11 +30,17 @@ object DepsRunner extends WorkerMain[Unit] { .nargs("+") parser.addArgument("--label").help("Label of current target").metavar("label").required(true) parser - .addArgument("--whitelist") + .addArgument("--used_whitelist") .help("Whitelist of labels to ignore for unused deps") .metavar("label") .nargs("*") .setDefault_(Collections.emptyList) + parser + .addArgument("--unused_whitelist") + .help("Whitelist of labels to ignore for direct deps") + .metavar("label") + .nargs("*") + .setDefault_(Collections.emptyList) parser.addArgument("used").help("Manifest of used").`type`(Arguments.fileType.verifyCanRead().verifyIsFile()) parser.addArgument("success").help("Success file").`type`(Arguments.fileType.verifyCanCreate()) parser @@ -54,8 +60,8 @@ object DepsRunner extends WorkerMain[Unit] { val usedPaths = Files.readAllLines(namespace.get[File]("used").toPath).asScala.toSet val remove = if (namespace.getBoolean("check_used") == true) { - val whitelist = namespace.getList[String]("whitelist").asScala.map(_.tail) - (directLabels -- whitelist).filterNot(labelToPaths(_).exists(usedPaths)) + val usedWhitelist = namespace.getList[String]("used_whitelist").asScala.map(_.tail) + (directLabels -- usedWhitelist).filterNot(labelToPaths(_).exists(usedPaths)) } else Nil remove.foreach { depLabel => println(s"Target '$depLabel' not used, please remove it from the deps.") @@ -64,7 +70,8 @@ object DepsRunner extends WorkerMain[Unit] { } val add = if (namespace.getBoolean("check_direct") == true) { - (usedPaths -- directLabels.flatMap(labelToPaths)) + val unusedWhitelist = namespace.getList[String]("unused_whitelist").asScala.map(_.tail) + (usedPaths -- (directLabels ++ unusedWhitelist).flatMap(labelToPaths)) .flatMap(path => groups.collectFirst { case (label, paths) if paths(path) => label }.orElse { System.err.println(s"Warning: There is a reference to $path, but no dependency of $label provides it") diff --git a/tests/dependencies/unused/BUILD b/tests/dependencies/unused/BUILD index 21683ed4a..262843c52 100644 --- a/tests/dependencies/unused/BUILD +++ b/tests/dependencies/unused/BUILD @@ -20,6 +20,19 @@ scala_library( ], ) +scala_library( + name = "0_unused_whitelist", + srcs = ["0_unused.scala"], + deps_used_whitelist = [ + "@annex_test//:org_scalacheck_scalacheck_2_12", + ], + scala = "//scala:2_12", + tags = ["manual"], + deps = [ + "@annex_test//:org_scalacheck_scalacheck_2_12", + ], +) + scala_library( name = "indirect_unused", srcs = ["indirect_unused.scala"], @@ -31,3 +44,28 @@ scala_library( "@annex_test//:org_specs2_specs2_matcher_2_12", ], ) + +scala_library( + name = "indirect_unused_missing", + srcs = ["indirect_unused.scala"], + scala = "//scala:2_12", + tags = ["manual"], + deps = [ + "@annex_test//:org_specs2_specs2_common_2_12", + "@annex_test//:org_specs2_specs2_core_2_12", + ], +) + +scala_library( + name = "indirect_unused_whitelist", + srcs = ["indirect_unused.scala"], + deps_unused_whitelist = [ + "@annex_test//:org_specs2_specs2_matcher_2_12", + ], + scala = "//scala:2_12", + tags = ["manual"], + deps = [ + "@annex_test//:org_specs2_specs2_common_2_12", + "@annex_test//:org_specs2_specs2_core_2_12", + ], +) diff --git a/tests/dependencies/unused/test b/tests/dependencies/unused/test index 053439628..86fa95fc0 100755 --- a/tests/dependencies/unused/test +++ b/tests/dependencies/unused/test @@ -4,4 +4,8 @@ bazel build :0_used ! bazel build :0_unused || false bazel build :0_unused |& grep "buildozer 'remove deps @annex_test//:org_scalacheck_scalacheck_2_12' //dependencies/unused:0_unused" +bazel build :0_unused_whitelist bazel build :indirect_unused +! bazel build :indirect_unused_missing || false +bazel build :indirect_unused_missing |& grep "buildozer 'add deps @annex_test//:org_specs2_specs2_matcher_2_12' //dependencies/unused:indirect_unused_missing" +bazel build :indirect_unused_whitelist diff --git a/tools/bazel b/tools/bazel index 2c261caaf..a4541b354 100755 --- a/tools/bazel +++ b/tools/bazel @@ -15,7 +15,7 @@ abs_path() { workspace=$(cd $(dirname "$0")/..; pwd) root_workspace=$(cd $(dirname $(abs_path "$0"))/..; pwd) -default_bazel_version='2.2.0' +default_bazel_version='3.3.0' if [ -z "$BAZEL_VERSION" ]; then bazel_version="$default_bazel_version" @@ -28,13 +28,13 @@ case "$bazel_version" in bazel_version=$("$BAZEL_REAL" version | awk '/Build label/ {print $3}' | cut -d '-' -f 1) bazel="$BAZEL_REAL" ;; - '2.1.0') - darwin_sha='0be7e8266523922ab63720775a6e4174468bd617e016e89d726a0f3441c46396' - linux_sha='501c5a48bf6e4d836ecfe27f471bfbab029d2bf0cf62e69a0320f0dc576be56a' + '3.2.0') + darwin_sha='0a9379a835a63186220e7dfc160be8971f03b9892bd0c3de6971c521138a1e28' + linux_sha='27d0b65201bc1936ea40eae149b19353e95d9a3b5e2a7d9dd3b4e12665534b0a' ;; - '2.2.0') - darwin_sha='8a0238c126d086f3641efda177fa8fc1e85ba09c2af10c0977f14b202a9e7a5a' - linux_sha='6dfcd3b3d7a8811f53a1776c285cf533bc12c33d1eaf49b6105e9699df26ef57' + '3.3.0') + darwin_sha='fb340fc910630ec2825ef35d7a385726b515e96f80cd52b4cf8e9d4df01f7bae' + linux_sha='1ec706d44d5980b27988601bbac8aa3028488ea136a958d0f57086aa1214ca41' ;; *) echo "The requested Bazel version '$bazel_version' is not supported"