From 99b30b8899d663c1153e88233d691c9a2e0879c8 Mon Sep 17 00:00:00 2001 From: Anatolii Kmetiuk Date: Fri, 22 May 2026 11:24:12 +0900 Subject: [PATCH] Fix duplicate autoplugins packageBin mappings --- main/src/main/scala/sbt/Defaults.scala | 12 ++++++++++-- .../duplicate-autoplugins-packagebin/build.sbt | 8 ++++++++ .../src/main/scala/example/ComponentsPlugin.scala | 5 +++++ .../src/main/scala/example/PluginsPlugin.scala | 5 +++++ .../src/main/scala/example/ScalacOptionsPlugin.scala | 5 +++++ .../plugins/duplicate-autoplugins-packagebin/test | 3 +++ 6 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 sbt-app/src/sbt-test/plugins/duplicate-autoplugins-packagebin/build.sbt create mode 100644 sbt-app/src/sbt-test/plugins/duplicate-autoplugins-packagebin/components/src/main/scala/example/ComponentsPlugin.scala create mode 100644 sbt-app/src/sbt-test/plugins/duplicate-autoplugins-packagebin/plugins/src/main/scala/example/PluginsPlugin.scala create mode 100644 sbt-app/src/sbt-test/plugins/duplicate-autoplugins-packagebin/scalac-options/src/main/scala/example/ScalacOptionsPlugin.scala create mode 100644 sbt-app/src/sbt-test/plugins/duplicate-autoplugins-packagebin/test diff --git a/main/src/main/scala/sbt/Defaults.scala b/main/src/main/scala/sbt/Defaults.scala index 7a9485e98..b45a34f23 100644 --- a/main/src/main/scala/sbt/Defaults.scala +++ b/main/src/main/scala/sbt/Defaults.scala @@ -1772,10 +1772,18 @@ object Defaults extends BuildCommon with DefExtra { def packageBinMappings: Initialize[Task[Seq[(HashedVirtualFileRef, String)]]] = Def.task { val converter = fileConverter.value + val classDirPath = classDirectory.value.toPath.toAbsolutePath.normalize val xs = products.value - xs + val allMappings = xs .flatMap(Path.allSubpaths) - .withFilter(_._1.isFile()) + .filter(_._1.isFile()) + val resourcePaths = allMappings.collect { + case (p, path) if !p.toPath.toAbsolutePath.normalize.startsWith(classDirPath) => path + }.toSet + allMappings + .filterNot { (p, path) => + resourcePaths(path) && p.toPath.toAbsolutePath.normalize.startsWith(classDirPath) + } .map { (p, path) => val vf = converter.toVirtualFile(p.toPath()) (vf: HashedVirtualFileRef) -> path diff --git a/sbt-app/src/sbt-test/plugins/duplicate-autoplugins-packagebin/build.sbt b/sbt-app/src/sbt-test/plugins/duplicate-autoplugins-packagebin/build.sbt new file mode 100644 index 000000000..25b1fd20e --- /dev/null +++ b/sbt-app/src/sbt-test/plugins/duplicate-autoplugins-packagebin/build.sbt @@ -0,0 +1,8 @@ +ThisBuild / organization := "com.example" +ThisBuild / version := "0.1.0-SNAPSHOT" + +val `scalac-options` = project.enablePlugins(SbtPlugin).settings( + addSbtPlugin("org.typelevel" % "sbt-tpolecat" % "0.5.4"), +) +val components = project.enablePlugins(SbtPlugin) +val plugins = project.dependsOn(components, `scalac-options`).enablePlugins(SbtPlugin) diff --git a/sbt-app/src/sbt-test/plugins/duplicate-autoplugins-packagebin/components/src/main/scala/example/ComponentsPlugin.scala b/sbt-app/src/sbt-test/plugins/duplicate-autoplugins-packagebin/components/src/main/scala/example/ComponentsPlugin.scala new file mode 100644 index 000000000..089c9592a --- /dev/null +++ b/sbt-app/src/sbt-test/plugins/duplicate-autoplugins-packagebin/components/src/main/scala/example/ComponentsPlugin.scala @@ -0,0 +1,5 @@ +package example + +import sbt.* + +object ComponentsPlugin extends AutoPlugin diff --git a/sbt-app/src/sbt-test/plugins/duplicate-autoplugins-packagebin/plugins/src/main/scala/example/PluginsPlugin.scala b/sbt-app/src/sbt-test/plugins/duplicate-autoplugins-packagebin/plugins/src/main/scala/example/PluginsPlugin.scala new file mode 100644 index 000000000..639beb45a --- /dev/null +++ b/sbt-app/src/sbt-test/plugins/duplicate-autoplugins-packagebin/plugins/src/main/scala/example/PluginsPlugin.scala @@ -0,0 +1,5 @@ +package example + +import sbt.* + +object PluginsPlugin extends AutoPlugin diff --git a/sbt-app/src/sbt-test/plugins/duplicate-autoplugins-packagebin/scalac-options/src/main/scala/example/ScalacOptionsPlugin.scala b/sbt-app/src/sbt-test/plugins/duplicate-autoplugins-packagebin/scalac-options/src/main/scala/example/ScalacOptionsPlugin.scala new file mode 100644 index 000000000..3d8f9eae2 --- /dev/null +++ b/sbt-app/src/sbt-test/plugins/duplicate-autoplugins-packagebin/scalac-options/src/main/scala/example/ScalacOptionsPlugin.scala @@ -0,0 +1,5 @@ +package example + +import sbt.* + +object ScalacOptionsPlugin extends AutoPlugin diff --git a/sbt-app/src/sbt-test/plugins/duplicate-autoplugins-packagebin/test b/sbt-app/src/sbt-test/plugins/duplicate-autoplugins-packagebin/test new file mode 100644 index 000000000..e00f9cbb0 --- /dev/null +++ b/sbt-app/src/sbt-test/plugins/duplicate-autoplugins-packagebin/test @@ -0,0 +1,3 @@ +> scalac-options / Compile / packageBin +> scalac-options / Compile / copyResources +> scalac-options / Compile / packageBin