diff --git a/main-actions/src/main/scala/sbt/Sync.scala b/main-actions/src/main/scala/sbt/Sync.scala index 8f175b2c92..0be07cf1f4 100644 --- a/main-actions/src/main/scala/sbt/Sync.scala +++ b/main-actions/src/main/scala/sbt/Sync.scala @@ -17,7 +17,15 @@ import sbt.util.CacheImplicits._ import sbt.util.{ CacheStore, FileInfo } import sbt.io.IO import sbt.librarymanagement.LibraryManagementCodec -import sjsonnew.{ Builder, JsonFormat, Unbuilder, deserializationError } +import sjsonnew.{ + Builder, + IsoString, + IsoStringLong, + JsonFormat, + PathOnlyFormats, + Unbuilder, + deserializationError, +} import xsbti.{ FileConverter, VirtualFileRef } /** @@ -126,11 +134,20 @@ object Sync { } } + private lazy val fileIsoString: IsoString[File] = + val iso = summon[IsoStringLong[File]] + IsoString.iso( + (file: File) => iso.to(file)._1, + (s: String) => iso.from((s, 0)), + ) + def writeInfo[F <: FileInfo]( store: CacheStore, relation: Relation[File, File], info: Map[File, F] )(implicit infoFormat: JsonFormat[F]): Unit = + given IsoString[File] = fileIsoString + import PathOnlyFormats.given store.write((relation, info)) def writeInfoVirtual[F <: FileInfo]( @@ -213,6 +230,8 @@ object Sync { private def readUncaught[F <: FileInfo]( store: CacheStore )(implicit infoFormat: JsonFormat[F]): RelationInfo[F] = + given IsoString[File] = fileIsoString + import PathOnlyFormats.given store.read(default = (Relation.empty[File, File], Map.empty[File, F])) private def readUncaughtVirtual[F <: FileInfo]( diff --git a/main/src/main/scala/sbt/Defaults.scala b/main/src/main/scala/sbt/Defaults.scala index 57a35a032a..6fed837301 100644 --- a/main/src/main/scala/sbt/Defaults.scala +++ b/main/src/main/scala/sbt/Defaults.scala @@ -3043,7 +3043,10 @@ object Classpaths { } }).value, moduleName := normalizedName.value, - ivyPaths := IvyPaths(baseDirectory.value, bootIvyHome(appConfiguration.value)), + ivyPaths := IvyPaths( + baseDirectory.value.toString, + bootIvyHome(appConfiguration.value).map(_.toString) + ), csrCacheDirectory := { val old = csrCacheDirectory.value val ac = appConfiguration.value @@ -3055,7 +3058,7 @@ object Classpaths { else if (ip.ivyHome == defaultIvyCache) old else ip.ivyHome match { - case Some(home) => home / "coursier-cache" + case Some(home) => new File(home) / "coursier-cache" case _ => old } } else Classpaths.dummyCoursierDirectory(ac) diff --git a/main/src/main/scala/sbt/RemoteCache.scala b/main/src/main/scala/sbt/RemoteCache.scala index a9e8c866c3..ae7622be59 100644 --- a/main/src/main/scala/sbt/RemoteCache.scala +++ b/main/src/main/scala/sbt/RemoteCache.scala @@ -65,7 +65,7 @@ object RemoteCache { val app = appConfiguration.value val base = app.baseDirectory.getCanonicalFile // base is used only to resolve relative paths, which should never happen - IvyPaths(base, localCacheDirectory.value) + IvyPaths(base.toString, localCacheDirectory.value.toString) }, ) diff --git a/main/src/main/scala/sbt/coursierint/CoursierRepositoriesTasks.scala b/main/src/main/scala/sbt/coursierint/CoursierRepositoriesTasks.scala index 7839d70ba0..fbf8043dad 100644 --- a/main/src/main/scala/sbt/coursierint/CoursierRepositoriesTasks.scala +++ b/main/src/main/scala/sbt/coursierint/CoursierRepositoriesTasks.scala @@ -67,7 +67,7 @@ object CoursierRepositoriesTasks { val result2 = paths.ivyHome match { case Some(ivyHome) => - val ivyHomeUri = ivyHome.getPath + val ivyHomeUri = ivyHome result1 map { case r: FileRepository => val ivyPatterns = r.patterns.ivyPatterns map { diff --git a/main/src/main/scala/sbt/coursierint/LMCoursier.scala b/main/src/main/scala/sbt/coursierint/LMCoursier.scala index ac63a08ba6..06d5fb159e 100644 --- a/main/src/main/scala/sbt/coursierint/LMCoursier.scala +++ b/main/src/main/scala/sbt/coursierint/LMCoursier.scala @@ -92,7 +92,7 @@ object LMCoursier { createLogger: Option[CacheLogger], cacheDirectory: File, reconciliation: Seq[(ModuleMatchers, Reconciliation)], - ivyHome: Option[File], + ivyHome: Option[String], strict: Option[CStrict], depsOverrides: Seq[ModuleID], log: Logger @@ -140,7 +140,7 @@ object LMCoursier { createLogger: Option[CacheLogger], cacheDirectory: File, reconciliation: Seq[(ModuleMatchers, Reconciliation)], - ivyHome: Option[File], + ivyHome: Option[String], strict: Option[CStrict], depsOverrides: Seq[ModuleID], updateConfig: Option[UpdateConfiguration], @@ -192,7 +192,7 @@ object LMCoursier { .withCache(cacheDirectory) .withReconciliation(reconciliation.toVector) .withLog(log) - .withIvyHome(ivyHome) + .withIvyHome(ivyHome.map(new File(_))) .withStrict(strict) .withForceVersions(userForceVersions.toVector) .withMissingOk(missingOk) diff --git a/main/src/main/scala/sbt/internal/LibraryManagement.scala b/main/src/main/scala/sbt/internal/LibraryManagement.scala index d793b0f4c7..85bd5f971f 100644 --- a/main/src/main/scala/sbt/internal/LibraryManagement.scala +++ b/main/src/main/scala/sbt/internal/LibraryManagement.scala @@ -110,8 +110,8 @@ private[sbt] object LibraryManagement { !force && !depsUpdated && !inChanged && - out.allFiles.forall(f => fileUptodate(f, out.stamps, log)) && - fileUptodate(out.cachedDescriptor, out.stamps, log) + out.allFiles.forall(f => fileUptodate(f.toString, out.stamps, log)) && + fileUptodate(out.cachedDescriptor.toString, out.stamps, log) } /* Skip resolve if last output exists, otherwise error. */ @@ -166,7 +166,8 @@ private[sbt] object LibraryManagement { handler((extraInputHash, settings, withoutClock)) } - private[this] def fileUptodate(file: File, stamps: Map[File, Long], log: Logger): Boolean = { + private[this] def fileUptodate(file0: String, stamps: Map[String, Long], log: Logger): Boolean = { + val file = File(file0) val exists = file.exists // https://github.com/sbt/sbt/issues/5292 warn the user that the file is missing since this indicates // that UpdateReport was persisted but Coursier cache was not. @@ -175,7 +176,7 @@ private[sbt] object LibraryManagement { } // coursier doesn't populate stamps val timeStampIsSame = stamps - .get(file) + .get(file0) .forall(_ == IO.getModifiedTimeOrZero(file)) exists && timeStampIsSame } diff --git a/main/src/main/scala/sbt/internal/Load.scala b/main/src/main/scala/sbt/internal/Load.scala index 302a87d1e1..e44079a046 100755 --- a/main/src/main/scala/sbt/internal/Load.scala +++ b/main/src/main/scala/sbt/internal/Load.scala @@ -82,7 +82,9 @@ private[sbt] object Load { Attributed.blankSeq(provider.mainClasspath.toIndexedSeq ++ scalaProvider.jars.toIndexedSeq) val ivyConfiguration = InlineIvyConfiguration() - .withPaths(IvyPaths(baseDirectory, bootIvyHome(state.configuration))) + .withPaths( + IvyPaths(baseDirectory.toString, bootIvyHome(state.configuration).map(_.toString)) + ) .withResolvers(Resolver.combineDefaultResolvers(Vector.empty)) .withLog(log) val dependencyResolution = IvyDependencyResolution(ivyConfiguration) diff --git a/project/Dependencies.scala b/project/Dependencies.scala index bd3225ba6e..5fd069bbf7 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -15,7 +15,7 @@ object Dependencies { // sbt modules private val ioVersion = nightlyVersion.getOrElse("1.8.0") private val lmVersion = - sys.props.get("sbt.build.lm.version").orElse(nightlyVersion).getOrElse("2.0.0-alpha12") + sys.props.get("sbt.build.lm.version").orElse(nightlyVersion).getOrElse("2.0.0-alpha13") val zincVersion = nightlyVersion.getOrElse("2.0.0-alpha6") private val sbtIO = "org.scala-sbt" %% "io" % ioVersion @@ -82,7 +82,7 @@ object Dependencies { // val lmCoursierShaded = "io.get-coursier" %% "lm-coursier-shaded" % "2.0.10" val lmCoursierShaded = "org.scala-sbt" %% "librarymanagement-coursier" % "2.0.0-alpha6" - lazy val sjsonNewVersion = "0.13.0" + lazy val sjsonNewVersion = "0.14.0-M1" def sjsonNew(n: String) = Def.setting( "com.eed3si9n" %% n % sjsonNewVersion ) // contrabandSjsonNewVersion.value diff --git a/zinc-lm-integration/src/test/scala/sbt/internal/inc/IvyBridgeProviderSpecification.scala b/zinc-lm-integration/src/test/scala/sbt/internal/inc/IvyBridgeProviderSpecification.scala index e465c397a8..a45af34620 100644 --- a/zinc-lm-integration/src/test/scala/sbt/internal/inc/IvyBridgeProviderSpecification.scala +++ b/zinc-lm-integration/src/test/scala/sbt/internal/inc/IvyBridgeProviderSpecification.scala @@ -88,7 +88,7 @@ abstract class IvyBridgeProviderSpecification val resolvers = resolvers0.toVector val chainResolver = ChainedResolver("zinc-chain", resolvers) InlineIvyConfiguration() - .withPaths(IvyPaths(baseDirectory, Some(ivyHome))) + .withPaths(IvyPaths(baseDirectory.toString, Some(ivyHome.toString))) .withResolvers(resolvers) .withModuleConfigurations(Vector(ModuleConfiguration("*", chainResolver))) .withLock(None)