From 7d77f44cdcd42c97429c224a473d24acaf87fef7 Mon Sep 17 00:00:00 2001 From: Anatolii Kmetiuk Date: Mon, 13 Jul 2026 10:18:10 +0900 Subject: [PATCH] Fix #9343 route pipelined dependencyPicklePath through internalDependencyPicklePath (#9425) --- main/src/main/scala/sbt/Defaults.scala | 6 ++-- .../pipelining-java-scala/build.sbt | 28 +++++++++++++++++++ .../src/main/scala/example/Main.scala | 5 ++++ .../src/main/scala/example/Main.scala | 5 ++++ .../src/main/scala/example/Main.scala | 5 ++++ .../pipelining-java-scala/test | 13 +++++++++ .../src/main/java/example/Greeter.java | 7 +++++ .../src/main/scala/example/Marker.scala | 5 ++++ 8 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 sbt-app/src/sbt-test/source-dependencies/pipelining-java-scala/build.sbt create mode 100644 sbt-app/src/sbt-test/source-dependencies/pipelining-java-scala/downstream-direct/src/main/scala/example/Main.scala create mode 100644 sbt-app/src/sbt-test/source-dependencies/pipelining-java-scala/downstream-plusone/src/main/scala/example/Main.scala create mode 100644 sbt-app/src/sbt-test/source-dependencies/pipelining-java-scala/downstream-transitive/src/main/scala/example/Main.scala create mode 100644 sbt-app/src/sbt-test/source-dependencies/pipelining-java-scala/test create mode 100644 sbt-app/src/sbt-test/source-dependencies/pipelining-java-scala/upstream/src/main/java/example/Greeter.java create mode 100644 sbt-app/src/sbt-test/source-dependencies/pipelining-java-scala/upstream/src/main/scala/example/Marker.scala diff --git a/main/src/main/scala/sbt/Defaults.scala b/main/src/main/scala/sbt/Defaults.scala index e4e9808a7..c57c9598b 100644 --- a/main/src/main/scala/sbt/Defaults.scala +++ b/main/src/main/scala/sbt/Defaults.scala @@ -2839,7 +2839,7 @@ object Classpaths { case (false, _) => Def.task { filteredDependencyClasspath.value } case (true, DependencyMode.Transitive) => - Def.task { dependencyClasspath.value } + Def.task { internalDependencyPicklePath.value ++ externalDependencyClasspath.value } case (true, DependencyMode.Direct) => Def.task { val internalFiltered = ClasspathImpl.filterInternalByMode( @@ -2847,7 +2847,7 @@ object Classpaths { thisProjectRef.value, settingsData.value, buildDependencies.value, - internalDependencyClasspath.value, + internalDependencyPicklePath.value, ) val externalFiltered = ClasspathImpl.filterByDirectDeps( allDependencies.value, @@ -2862,7 +2862,7 @@ object Classpaths { thisProjectRef.value, settingsData.value, buildDependencies.value, - internalDependencyClasspath.value, + internalDependencyPicklePath.value, ) val externalFiltered = ClasspathImpl.filterByPlusOne( allDependencies.value, diff --git a/sbt-app/src/sbt-test/source-dependencies/pipelining-java-scala/build.sbt b/sbt-app/src/sbt-test/source-dependencies/pipelining-java-scala/build.sbt new file mode 100644 index 000000000..63a0c33b5 --- /dev/null +++ b/sbt-app/src/sbt-test/source-dependencies/pipelining-java-scala/build.sbt @@ -0,0 +1,28 @@ +ThisBuild / scalaVersion := "2.13.18" +ThisBuild / usePipelining := true + +lazy val root = (project in file(".")) + .aggregate(upstream, `downstream-transitive`, `downstream-direct`, `downstream-plusone`) + .settings( + name := "pipelining Java then Scala", + ) + +lazy val upstream = project + +lazy val `downstream-transitive` = project + .in(file("downstream-transitive")) + .dependsOn(upstream) + +lazy val `downstream-direct` = project + .in(file("downstream-direct")) + .dependsOn(upstream) + .settings( + dependencyMode := DependencyMode.Direct, + ) + +lazy val `downstream-plusone` = project + .in(file("downstream-plusone")) + .dependsOn(upstream) + .settings( + dependencyMode := DependencyMode.PlusOne, + ) diff --git a/sbt-app/src/sbt-test/source-dependencies/pipelining-java-scala/downstream-direct/src/main/scala/example/Main.scala b/sbt-app/src/sbt-test/source-dependencies/pipelining-java-scala/downstream-direct/src/main/scala/example/Main.scala new file mode 100644 index 000000000..2f9d069ab --- /dev/null +++ b/sbt-app/src/sbt-test/source-dependencies/pipelining-java-scala/downstream-direct/src/main/scala/example/Main.scala @@ -0,0 +1,5 @@ +package example + +object Main { + def run(): String = Greeter.greet("world") +} diff --git a/sbt-app/src/sbt-test/source-dependencies/pipelining-java-scala/downstream-plusone/src/main/scala/example/Main.scala b/sbt-app/src/sbt-test/source-dependencies/pipelining-java-scala/downstream-plusone/src/main/scala/example/Main.scala new file mode 100644 index 000000000..2f9d069ab --- /dev/null +++ b/sbt-app/src/sbt-test/source-dependencies/pipelining-java-scala/downstream-plusone/src/main/scala/example/Main.scala @@ -0,0 +1,5 @@ +package example + +object Main { + def run(): String = Greeter.greet("world") +} diff --git a/sbt-app/src/sbt-test/source-dependencies/pipelining-java-scala/downstream-transitive/src/main/scala/example/Main.scala b/sbt-app/src/sbt-test/source-dependencies/pipelining-java-scala/downstream-transitive/src/main/scala/example/Main.scala new file mode 100644 index 000000000..2f9d069ab --- /dev/null +++ b/sbt-app/src/sbt-test/source-dependencies/pipelining-java-scala/downstream-transitive/src/main/scala/example/Main.scala @@ -0,0 +1,5 @@ +package example + +object Main { + def run(): String = Greeter.greet("world") +} diff --git a/sbt-app/src/sbt-test/source-dependencies/pipelining-java-scala/test b/sbt-app/src/sbt-test/source-dependencies/pipelining-java-scala/test new file mode 100644 index 000000000..0b73c7c3a --- /dev/null +++ b/sbt-app/src/sbt-test/source-dependencies/pipelining-java-scala/test @@ -0,0 +1,13 @@ +# Regression test for https://github.com/sbt/sbt/issues/9343 +# With usePipelining := true, a downstream Scala source that references a +# Java class defined in an upstream project must still compile; the early +# pickle artifacts from upstream must stay visible on the pipelined classpath. +# Three downstream projects exercise Transitive, Direct, and PlusOne modes. +# A single aggregate compile fans out from one upstream pickle-producing task +# to all three downstream compilations without reusing a pipelining promise. + +> compile + +$ exists target/**/downstream-transitive/classes/example/Main.class +$ exists target/**/downstream-direct/classes/example/Main.class +$ exists target/**/downstream-plusone/classes/example/Main.class diff --git a/sbt-app/src/sbt-test/source-dependencies/pipelining-java-scala/upstream/src/main/java/example/Greeter.java b/sbt-app/src/sbt-test/source-dependencies/pipelining-java-scala/upstream/src/main/java/example/Greeter.java new file mode 100644 index 000000000..fd71f0af1 --- /dev/null +++ b/sbt-app/src/sbt-test/source-dependencies/pipelining-java-scala/upstream/src/main/java/example/Greeter.java @@ -0,0 +1,7 @@ +package example; + +public class Greeter { + public static String greet(String name) { + return "Hello, " + name; + } +} diff --git a/sbt-app/src/sbt-test/source-dependencies/pipelining-java-scala/upstream/src/main/scala/example/Marker.scala b/sbt-app/src/sbt-test/source-dependencies/pipelining-java-scala/upstream/src/main/scala/example/Marker.scala new file mode 100644 index 000000000..0f5040847 --- /dev/null +++ b/sbt-app/src/sbt-test/source-dependencies/pipelining-java-scala/upstream/src/main/scala/example/Marker.scala @@ -0,0 +1,5 @@ +package example + +object Marker { + val tag = "upstream" +}