From 7271faacbcc3b62ef54ad34d4e048e7f2efc7c24 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Mon, 1 Jun 2026 06:36:19 -0400 Subject: [PATCH] [2.x] fix: Avoid updateFull **Problem** updateFull is called in no-op compile. **Solution** Avoid it for the default dependency mode. --- main/src/main/scala/sbt/Defaults.scala | 84 ++++++++++++++++++-------- 1 file changed, 58 insertions(+), 26 deletions(-) diff --git a/main/src/main/scala/sbt/Defaults.scala b/main/src/main/scala/sbt/Defaults.scala index 8962a9d86..ac273d5d7 100644 --- a/main/src/main/scala/sbt/Defaults.scala +++ b/main/src/main/scala/sbt/Defaults.scala @@ -2744,17 +2744,31 @@ object Classpaths { dependencyMode.value match case DependencyMode.Transitive => Def.task { dependencyClasspath.value } - case mode => + case DependencyMode.Direct => Def.task { val internalFiltered = ClasspathImpl.filterInternalByMode( - mode, + DependencyMode.Direct, thisProjectRef.value, settingsData.value, buildDependencies.value, internalDependencyClasspath.value, ) - val externalFiltered = ClasspathImpl.filterByDependencyMode( - mode, + val externalFiltered = ClasspathImpl.filterByDirectDeps( + allDependencies.value, + externalDependencyClasspath.value, + ) + internalFiltered ++ externalFiltered + } + case DependencyMode.PlusOne => + Def.task { + val internalFiltered = ClasspathImpl.filterInternalByMode( + DependencyMode.PlusOne, + thisProjectRef.value, + settingsData.value, + buildDependencies.value, + internalDependencyClasspath.value, + ) + val externalFiltered = ClasspathImpl.filterByPlusOne( allDependencies.value, projectID.value, classpathConfiguration.value, @@ -2822,28 +2836,46 @@ object Classpaths { // Note: invoking this task from shell would block indefinitely because it will // wait for the upstream compilation to start. dependencyPicklePath := Def.uncached { - // This is a conditional task. Do not refactor. - if (incOptions.value.pipelining) { - val mode = dependencyMode.value - val internalFiltered = ClasspathImpl.filterInternalByMode( - mode, - thisProjectRef.value, - settingsData.value, - buildDependencies.value, - internalDependencyPicklePath.value, - ) - val externalFiltered = ClasspathImpl.filterByDependencyMode( - mode, - allDependencies.value, - projectID.value, - classpathConfiguration.value, - updateFull.value, - externalDependencyClasspath.value, - ) - internalFiltered ++ externalFiltered - } else { - filteredDependencyClasspath.value - } + Def.taskDyn { + (incOptions.value.pipelining, dependencyMode.value) match + case (false, _) => + Def.task { filteredDependencyClasspath.value } + case (true, DependencyMode.Transitive) => + Def.task { dependencyClasspath.value } + case (true, DependencyMode.Direct) => + Def.task { + val internalFiltered = ClasspathImpl.filterInternalByMode( + DependencyMode.Direct, + thisProjectRef.value, + settingsData.value, + buildDependencies.value, + internalDependencyClasspath.value, + ) + val externalFiltered = ClasspathImpl.filterByDirectDeps( + allDependencies.value, + externalDependencyClasspath.value, + ) + internalFiltered ++ externalFiltered + } + case (true, DependencyMode.PlusOne) => + Def.task { + val internalFiltered = ClasspathImpl.filterInternalByMode( + DependencyMode.PlusOne, + thisProjectRef.value, + settingsData.value, + buildDependencies.value, + internalDependencyClasspath.value, + ) + val externalFiltered = ClasspathImpl.filterByPlusOne( + allDependencies.value, + projectID.value, + classpathConfiguration.value, + updateFull.value, + externalDependencyClasspath.value, + ) + internalFiltered ++ externalFiltered + } + }.value }, internalDependencyPicklePath := ClasspathImpl.internalDependencyPicklePathTask.value, exportedPickles := ClasspathImpl.exportedPicklesTask.value,