diff --git a/main/src/main/scala/sbt/internal/Clean.scala b/main/src/main/scala/sbt/internal/Clean.scala index 9d0094ce3..0d1d9eb96 100644 --- a/main/src/main/scala/sbt/internal/Clean.scala +++ b/main/src/main/scala/sbt/internal/Clean.scala @@ -167,10 +167,9 @@ private[sbt] object Clean { }) .flatMapTask { case scope => Def.task { - val targetDir = (scope / target).value.toPath + val baseDir = (scope / baseDirectory).value.toPath val filter = cleanFilter(scope).value - // We do not want to inadvertently delete files that are not in the target directory. - val excludeFilter: Path => Boolean = path => !path.startsWith(targetDir) || filter(path) + val excludeFilter: Path => Boolean = path => !path.startsWith(baseDir) || filter(path) val delete = cleanDelete(scope).value val st = (scope / streams).value taskKey.previous.foreach(_.toSeqPath.foreach(p => if (!excludeFilter(p)) delete(p))) diff --git a/sbt-app/src/sbt-test/actions/clean-managed-outside-target/build.sbt b/sbt-app/src/sbt-test/actions/clean-managed-outside-target/build.sbt new file mode 100644 index 000000000..77a169f59 --- /dev/null +++ b/sbt-app/src/sbt-test/actions/clean-managed-outside-target/build.sbt @@ -0,0 +1,8 @@ +name := "clean-managed-outside-target" +scalaVersion := "3.3.1" +Compile / sourceManaged := baseDirectory.value / "src_managed" +Compile / sourceGenerators += Def.task { + val file = (Compile / sourceManaged).value / "demo" / "Test.scala" + IO.write(file, """object Test extends App { println("Hi") }""") + Seq(file) +}.taskValue diff --git a/sbt-app/src/sbt-test/actions/clean-managed-outside-target/test b/sbt-app/src/sbt-test/actions/clean-managed-outside-target/test new file mode 100644 index 000000000..b65fdc4db --- /dev/null +++ b/sbt-app/src/sbt-test/actions/clean-managed-outside-target/test @@ -0,0 +1,6 @@ +> compile +$ exists src_managed/demo/Test.scala + +> Compile / managedSourcePaths +> Compile / managedSourcePaths / clean +$ absent src_managed/demo/Test.scala