diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2019-05-19 15:15:24 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-05-19 15:15:24 +0800 |
commit | 68505aad4a22686594965bc910e60c8d2b6a95d4 (patch) | |
tree | 4c2099e21593a840c7119901becc0cbb8682956f | |
parent | 7d706641f6f9caa0509903f691d16d78402b4623 (diff) | |
download | mill-68505aad4a22686594965bc910e60c8d2b6a95d4.tar.gz mill-68505aad4a22686594965bc910e60c8d2b6a95d4.tar.bz2 mill-68505aad4a22686594965bc910e60c8d2b6a95d4.zip |
Bump ammonite to 1.6.7 (#610)
* bump ammonite to 1.6.7
* upgrade all the things
* add scalaj-http shims for bootstrapping
* wip
* tweak-error-message
* tweak coursier
* .
30 files changed, 191 insertions, 137 deletions
@@ -1,7 +1,7 @@ import $file.ci.shared import $file.ci.upload import java.nio.file.attribute.PosixFilePermission - +import $ivy.`org.scalaj::scalaj-http:2.4.1` import ammonite.ops._ import coursier.maven.MavenRepository import mill._ @@ -93,7 +93,7 @@ object main extends MillModule { def ivyDeps = Agg( // Keep synchronized with ammonite in Versions.scala - ivy"com.lihaoyi:::ammonite:1.6.0", + ivy"com.lihaoyi:::ammonite:1.6.7", // Necessary so we can share the JNA classes throughout the build process ivy"net.java.dev.jna:jna:4.5.0", ivy"net.java.dev.jna:jna-platform:4.5.0" @@ -213,6 +213,7 @@ object scalajslib extends MillModule { object api extends MillApiModule{ def moduleDeps = Seq(main.core) + def ivyDeps = Agg(ivy"org.scala-sbt:test-interface:1.0") } object worker extends Cross[WorkerModule]("0.6", "1.0") class WorkerModule(scalajsBinary: String) extends MillApiModule{ @@ -337,6 +338,7 @@ object scalanativelib extends MillModule { } object api extends MillApiModule{ def moduleDeps = Seq(main.core) + def ivyDeps = Agg(ivy"org.scala-sbt:test-interface:1.0") } object worker extends Cross[WorkerModule]("0.3") class WorkerModule(scalaNativeBinary: String) extends MillApiModule { diff --git a/ci/shared.sc b/ci/shared.sc index a496fd1f..89e504fe 100644 --- a/ci/shared.sc +++ b/ci/shared.sc @@ -4,6 +4,7 @@ * via import $file */ +import $ivy.`org.scalaj::scalaj-http:2.4.1` import ammonite.ops.{write, Path, mkdir, RelPath, up} def argNames(n: Int) = { diff --git a/contrib/bloop/src/mill.contrib.bloop/BloopImpl.scala b/contrib/bloop/src/mill.contrib.bloop/BloopImpl.scala index e99b25d5..03af2465 100644 --- a/contrib/bloop/src/mill.contrib.bloop/BloopImpl.scala +++ b/contrib/bloop/src/mill.contrib.bloop/BloopImpl.scala @@ -238,19 +238,22 @@ class BloopImpl(ev: () => Evaluator, wd: Path) extends ExternalModule { outer => import coursier.util._ def source(r: Resolution) = Resolution( - r.dependencies.map(d => - d.copy(attributes = d.attributes.copy(classifier = "sources"))) + r.dependencies + .map(d => + d.copy(attributes = d.attributes.copy(classifier = coursier.Classifier("sources"))) + ) + .toSeq ) import scala.concurrent.ExecutionContext.Implicits.global - val unresolved = Resolution(deps.toSet) - val fetch = Fetch.from(repos, Cache.fetch[Task]()) + val unresolved = Resolution(deps) + val fetch = ResolutionProcess.fetch(repos, coursier.cache.Cache.default.fetch) val gatherTask = for { resolved <- unresolved.process.run(fetch) resolvedSources <- source(resolved).process.run(fetch) all = resolved.dependencyArtifacts ++ resolvedSources.dependencyArtifacts gathered <- Gather[Task].gather(all.distinct.map { - case (dep, art) => Cache.file[Task](art).run.map(dep -> _) + case (dep, art) => coursier.cache.Cache.default.file(art).run.map(dep -> _) }) } yield gathered @@ -268,14 +271,14 @@ class BloopImpl(ev: () => Evaluator, wd: Path) extends ExternalModule { outer => .mapValues { _.map { case (_, mod, _, classifier, file) => - BloopConfig.Artifact(mod, classifier, None, file.toPath) + BloopConfig.Artifact(mod.value, classifier.map(_.value), None, file.toPath) }.toList } .map { case ((org, mod, version), artifacts) => BloopConfig.Module( - organization = org, - name = mod, + organization = org.value, + name = mod.value, version = version, configurations = None, artifacts = artifacts diff --git a/contrib/playlib/src/mill/playlib/RouterModule.scala b/contrib/playlib/src/mill/playlib/RouterModule.scala index abf3082b..5af87839 100644 --- a/contrib/playlib/src/mill/playlib/RouterModule.scala +++ b/contrib/playlib/src/mill/playlib/RouterModule.scala @@ -1,7 +1,7 @@ package mill package playlib -import coursier.{Cache, MavenRepository} +import coursier.MavenRepository import mill.eval.PathRef import mill.playlib.api.RouteCompilerType import mill.scalalib.Lib.resolveDependencies @@ -49,7 +49,7 @@ trait RouterModule extends ScalaModule with Version { def routerClasspath: T[Agg[PathRef]] = T { resolveDependencies( Seq( - Cache.ivy2Local, + coursier.LocalRepositories.ivy2Local, MavenRepository("https://repo1.maven.org/maven2") ), Lib.depToDependency(_, scalaVersion()), diff --git a/contrib/scalapblib/src/ScalaPBModule.scala b/contrib/scalapblib/src/ScalaPBModule.scala index 57bfdd40..00b977ce 100644 --- a/contrib/scalapblib/src/ScalaPBModule.scala +++ b/contrib/scalapblib/src/ScalaPBModule.scala @@ -1,7 +1,7 @@ package mill package contrib.scalapblib -import coursier.{Cache, MavenRepository} +import coursier.MavenRepository import coursier.core.Version import mill.define.Sources import mill.api.PathRef @@ -51,7 +51,7 @@ trait ScalaPBModule extends ScalaModule { def scalaPBClasspath: T[Loose.Agg[PathRef]] = T { resolveDependencies( Seq( - Cache.ivy2Local, + coursier.LocalRepositories.ivy2Local, MavenRepository("https://repo1.maven.org/maven2") ), Lib.depToDependency(_, "2.12.4"), diff --git a/contrib/twirllib/src/TwirlModule.scala b/contrib/twirllib/src/TwirlModule.scala index 22e4a43a..72887019 100644 --- a/contrib/twirllib/src/TwirlModule.scala +++ b/contrib/twirllib/src/TwirlModule.scala @@ -1,7 +1,7 @@ package mill package twirllib -import coursier.{Cache, MavenRepository} +import coursier.MavenRepository import mill.define.Sources import mill.api.PathRef import mill.scalalib.Lib.resolveDependencies @@ -22,7 +22,7 @@ trait TwirlModule extends mill.Module { def twirlClasspath: T[Loose.Agg[PathRef]] = T { resolveDependencies( Seq( - Cache.ivy2Local, + coursier.LocalRepositories.ivy2Local, MavenRepository("https://repo1.maven.org/maven2") ), Lib.depToDependency(_, "2.12.4"), diff --git a/main/core/src/eval/Evaluator.scala b/main/core/src/eval/Evaluator.scala index ebb00ef1..f4ec8ff9 100644 --- a/main/core/src/eval/Evaluator.scala +++ b/main/core/src/eval/Evaluator.scala @@ -32,7 +32,7 @@ case class Evaluator(home: os.Path, externalOutPath: os.Path, rootModule: mill.define.BaseModule, log: Logger, - classLoaderSig: Seq[(Either[String, os.Path], Long)] = Evaluator.classLoaderSig, + classLoaderSig: Seq[(Either[String, java.net.URL], Long)] = Evaluator.classLoaderSig, workerCache: mutable.Map[Segments, (Int, Any)] = mutable.Map.empty, env : Map[String, String] = Evaluator.defaultEnv, failFast: Boolean = true @@ -374,7 +374,7 @@ object Evaluator{ implicit val rw: upickle.default.ReadWriter[Cached] = upickle.default.macroRW } case class State(rootModule: mill.define.BaseModule, - classLoaderSig: Seq[(Either[String, os.Path], Long)], + classLoaderSig: Seq[(Either[String, java.net.URL], Long)], workerCache: mutable.Map[Segments, (Int, Any)], watched: Seq[(os.Path, Long)]) // This needs to be a ThreadLocal because we need to pass it into the body of diff --git a/main/core/src/util/JsonFormatters.scala b/main/core/src/util/JsonFormatters.scala index 830782c6..c1dd18f0 100644 --- a/main/core/src/util/JsonFormatters.scala +++ b/main/core/src/util/JsonFormatters.scala @@ -6,5 +6,10 @@ trait JsonFormatters extends mill.api.JsonFormatters{ implicit lazy val modFormat: RW[coursier.Module] = upickle.default.macroRW implicit lazy val depFormat: RW[coursier.Dependency]= upickle.default.macroRW implicit lazy val attrFormat: RW[coursier.Attributes] = upickle.default.macroRW + implicit lazy val orgFormat: RW[coursier.Organization] = upickle.default.macroRW + implicit lazy val modNameFormat: RW[coursier.ModuleName] = upickle.default.macroRW + implicit lazy val configurationFormat: RW[coursier.core.Configuration] = upickle.default.macroRW + implicit lazy val typeFormat: RW[coursier.core.Type] = upickle.default.macroRW + implicit lazy val classifierFormat: RW[coursier.core.Classifier] = upickle.default.macroRW } object JsonFormatters extends JsonFormatters diff --git a/main/src/main/MainRunner.scala b/main/src/main/MainRunner.scala index c773087c..6705a4b3 100644 --- a/main/src/main/MainRunner.scala +++ b/main/src/main/MainRunner.scala @@ -128,7 +128,7 @@ class MainRunner(val config: ammonite.main.Cli.Config, ) } - object CustomCodeWrapper extends Preprocessor.CodeWrapper { + object CustomCodeWrapper extends ammonite.interp.CodeWrapper { def apply(code: String, source: CodeSource, imports: ammonite.util.Imports, diff --git a/main/src/main/VisualizeModule.scala b/main/src/main/VisualizeModule.scala index e950973f..b3d59509 100644 --- a/main/src/main/VisualizeModule.scala +++ b/main/src/main/VisualizeModule.scala @@ -2,7 +2,7 @@ package mill.main import java.util.concurrent.LinkedBlockingQueue -import coursier.Cache +import coursier.LocalRepositories import coursier.core.Repository import coursier.maven.MavenRepository import mill.T @@ -11,7 +11,7 @@ import mill.eval.{PathRef, Result} object VisualizeModule extends ExternalModule with VisualizeModule { def repositories = Seq( - Cache.ivy2Local, + LocalRepositories.ivy2Local, MavenRepository("https://repo1.maven.org/maven2"), MavenRepository("https://oss.sonatype.org/content/repositories/releases") ) diff --git a/main/src/modules/Jvm.scala b/main/src/modules/Jvm.scala index 9ee51aea..9f176974 100644 --- a/main/src/modules/Jvm.scala +++ b/main/src/modules/Jvm.scala @@ -8,7 +8,7 @@ import java.nio.file.attribute.PosixFilePermission import java.util.Collections import java.util.jar.{JarEntry, JarFile, JarOutputStream} -import coursier.{Cache, Dependency, Fetch, Repository, Resolution, CachePolicy} +import coursier.{Dependency, Fetch, Repository, Resolution} import coursier.util.{Gather, Task} import geny.Generator import mill.main.client.InputPumper @@ -37,7 +37,7 @@ object Jvm { val commandArgs = Vector("java") ++ jvmArgs ++ - Vector("-cp", classPath.mkString(File.pathSeparator), mainClass) ++ + Vector("-cp", classPath.mkString(java.io.File.pathSeparator), mainClass) ++ mainArgs val workingDir1 = Option(workingDir).getOrElse(ctx.dest) @@ -60,7 +60,7 @@ object Jvm { val args = Vector("java") ++ jvmArgs ++ - Vector("-cp", classPath.mkString(File.pathSeparator), mainClass) ++ + Vector("-cp", classPath.mkString(java.io.File.pathSeparator), mainClass) ++ mainArgs if (background) spawnSubprocess(args, envArgs, workingDir) @@ -409,6 +409,7 @@ object Jvm { repositories, deps, force, mapDependencies, ctx ) val errs = resolution.metadataErrors + if(errs.nonEmpty) { val header = s"""| @@ -424,13 +425,11 @@ object Jvm { } else { def load(artifacts: Seq[coursier.Artifact]) = { - val logger = None import scala.concurrent.ExecutionContext.Implicits.global val loadedArtifacts = Gather[Task].gather( for (a <- artifacts) - yield coursier.Cache.file[Task](a, logger = logger).run - .map(a.isOptional -> _) + yield coursier.cache.Cache.default.file(a).run.map(a.optional -> _) ).unsafeRun val errors = loadedArtifacts.collect { @@ -442,8 +441,13 @@ object Jvm { } val sourceOrJar = - if (sources) resolution.classifiersArtifacts(Seq("sources")) - else resolution.artifacts(true) + if (sources) { + resolution.artifacts( + types = Set(coursier.Type.source, coursier.Type.javaSource), + classifiers = Some(Seq(coursier.Classifier("sources"))) + ) + } + else resolution.artifacts() val (errors, successes) = load(sourceOrJar) if(errors.isEmpty){ mill.Agg.from( @@ -463,7 +467,7 @@ object Jvm { mapDependencies: Option[Dependency => Dependency] = None, ctx: Option[mill.util.Ctx.Log] = None) = { - val cachePolicies = CachePolicy.default + val cachePolicies = coursier.cache.CacheDefaults.cachePolicies val forceVersions = force .map(mapDependencies.getOrElse(identity[Dependency](_))) @@ -471,20 +475,23 @@ object Jvm { .toMap val start = Resolution( - deps.map(mapDependencies.getOrElse(identity[Dependency](_))).toSet, + deps.map(mapDependencies.getOrElse(identity[Dependency](_))).toSeq, forceVersions = forceVersions, mapDependencies = mapDependencies ) val resolutionLogger = ctx.map(c => new TickerResolutionLogger(c)) - val fetches = cachePolicies.map { p => - Cache.fetch[Task]( - logger = resolutionLogger, - cachePolicy = p - ) + val cache = resolutionLogger match { + case None => coursier.cache.FileCache[Task].withCachePolicies(cachePolicies) + case Some(l) => + coursier.cache.FileCache[Task] + .withCachePolicies(cachePolicies) + .withLogger(l) } - val fetch = Fetch.from(repositories, fetches.head, fetches.tail: _*) + val fetches = cache.fetchs + + val fetch = coursier.core.ResolutionProcess.fetch(repositories, fetches.head, fetches.tail: _*) import scala.concurrent.ExecutionContext.Implicits.global val resolution = start.process.run(fetch).unsafeRun() @@ -498,7 +505,7 @@ object Jvm { * In practice, this ticker output gets prefixed with the current target for which * dependencies are being resolved, using a [[mill.util.ProxyLogger]] subclass. */ - class TickerResolutionLogger(ctx: mill.util.Ctx.Log) extends Cache.Logger { + class TickerResolutionLogger(ctx: mill.util.Ctx.Log) extends coursier.cache.CacheLogger { case class DownloadState(var current: Long, var total: Long) var downloads = new mutable.TreeMap[String,DownloadState]() var totalDownloadCount = 0 @@ -518,7 +525,7 @@ object Jvm { ctx.log.ticker(s"Downloading [${downloads.size + finishedCount}/$totalDownloadCount] artifacts (~${sums.current}/${sums.total} bytes)") } - override def downloadingArtifact(url: String, file: File): Unit = synchronized { + override def downloadingArtifact(url: String): Unit = synchronized { totalDownloadCount += 1 downloads += url -> DownloadState(0,0) updateTicker() diff --git a/main/src/modules/Util.scala b/main/src/modules/Util.scala index 20f06d8f..8cb72e61 100644 --- a/main/src/modules/Util.scala +++ b/main/src/modules/Util.scala @@ -65,7 +65,7 @@ object Util { repositories, Seq( coursier.Dependency( - coursier.Module("com.lihaoyi", artifact + artifactSuffix), + coursier.Module(coursier.Organization("com.lihaoyi"), coursier.ModuleName(artifact + artifactSuffix)), sys.props("MILL_VERSION") ) ), diff --git a/scalajslib/src/ScalaJSModule.scala b/scalajslib/src/ScalaJSModule.scala index 230a3e5c..51b04e6a 100644 --- a/scalajslib/src/ScalaJSModule.scala +++ b/scalajslib/src/ScalaJSModule.scala @@ -1,7 +1,6 @@ package mill package scalajslib -import coursier.Cache import coursier.maven.MavenRepository import mill.eval.{PathRef, Result} import mill.api.Result.Success diff --git a/scalalib/api/src/ZincWorkerApi.scala b/scalalib/api/src/ZincWorkerApi.scala index 70128e8d..790ea274 100644 --- a/scalalib/api/src/ZincWorkerApi.scala +++ b/scalalib/api/src/ZincWorkerApi.scala @@ -60,7 +60,7 @@ object Util{ classPath .find(p => p.toString.endsWith(mavenStylePath) || p.toString.endsWith(ivyStylePath)) - .getOrElse(throw new Exception(s"Cannot find $mavenStylePath or $ivyStylePath")) + .getOrElse(throw new Exception(s"Cannot find $mavenStylePath or $ivyStylePath in ${classPath.mkString("[", ", ", "]")}")) } private val ReleaseVersion = raw"""(\d+)\.(\d+)\.(\d+)""".r diff --git a/scalalib/src/Dep.scala b/scalalib/src/Dep.scala index 714fa21e..59c3be5e 100644 --- a/scalalib/src/Dep.scala +++ b/scalalib/src/Dep.scala @@ -9,16 +9,28 @@ case class Dep(dep: coursier.Dependency, cross: CrossVersion, force: Boolean) { def artifactName(binaryVersion: String, fullVersion: String, platformSuffix: String) = { val suffix = cross.suffixString(binaryVersion, fullVersion, platformSuffix) - dep.module.name + suffix + dep.module.name.value + suffix } def configure(attributes: coursier.Attributes): Dep = copy(dep = dep.copy(attributes = attributes)) def forceVersion(): Dep = copy(force = true) - def exclude(exclusions: (String, String)*) = copy(dep = dep.copy(exclusions = dep.exclusions ++ exclusions)) + def exclude(exclusions: (String, String)*) = copy( + dep = dep.copy( + exclusions = + dep.exclusions ++ + exclusions.map{case (k, v) => (coursier.Organization(k), coursier.ModuleName(v))} + ) + ) def excludeOrg(organizations: String*): Dep = exclude(organizations.map(_ -> "*"): _*) def excludeName(names: String*): Dep = exclude(names.map("*" -> _): _*) def toDependency(binaryVersion: String, fullVersion: String, platformSuffix: String) = - dep.copy(module = dep.module.copy(name = artifactName(binaryVersion, fullVersion, platformSuffix))) - def withConfiguration(configuration: String): Dep = copy(dep = dep.copy(configuration = configuration)) + dep.copy( + module = dep.module.copy( + name = coursier.ModuleName(artifactName(binaryVersion, fullVersion, platformSuffix)) + ) + ) + def withConfiguration(configuration: String): Dep = copy( + dep = dep.copy(configuration = coursier.core.Configuration(configuration)) + ) /** * If scalaVersion is a Dotty version, replace the cross-version suffix @@ -49,14 +61,14 @@ case class Dep(dep: coursier.Dependency, cross: CrossVersion, force: Boolean) { object Dep { - val DefaultConfiguration = "default(compile)" + val DefaultConfiguration = coursier.core.Configuration("default(compile)") implicit def parse(signature: String): Dep = { val parts = signature.split(';') val module = parts.head val attributes = parts.tail.foldLeft(coursier.Attributes()) { (as, s) => s.split('=') match { - case Array("classifier", v) => as.copy(classifier = v) + case Array("classifier", v) => as.copy(classifier = coursier.Classifier(v)) case Array(k, v) => throw new Exception(s"Unrecognized attribute: [$s]") case _ => throw new Exception(s"Unable to parse attribute specifier: [$s]") } @@ -72,7 +84,15 @@ object Dep { }).configure(attributes = attributes) } def apply(org: String, name: String, version: String, cross: CrossVersion, force: Boolean = false): Dep = { - apply(coursier.Dependency(coursier.Module(org, name), version, DefaultConfiguration), cross, force) + apply( + coursier.Dependency( + coursier.Module(coursier.Organization(org), coursier.ModuleName(name)), + version, + DefaultConfiguration + ), + cross, + force + ) } implicit def rw: RW[Dep] = macroRW } diff --git a/scalalib/src/GenIdeaImpl.scala b/scalalib/src/GenIdeaImpl.scala index 379ce30b..404a0235 100755 --- a/scalalib/src/GenIdeaImpl.scala +++ b/scalalib/src/GenIdeaImpl.scala @@ -1,7 +1,7 @@ package mill.scalalib import ammonite.runtime.SpecialClassLoader -import coursier.{Cache, CoursierPaths, Repository} +import coursier.Repository import mill.define._ import mill.eval.{Evaluator, PathRef, Result} import mill.api.Ctx.{Home, Log} @@ -204,7 +204,7 @@ object GenIdeaImpl { // Tries to group jars with their poms and sources. def toResolvedJar(path : os.Path) : Option[ResolvedLibrary] = { - val inCoursierCache = path.startsWith(os.Path(CoursierPaths.cacheDirectory())) + val inCoursierCache = path.startsWith(os.Path(coursier.paths.CoursierPaths.cacheDirectory())) val isSource = path.last.endsWith("sources.jar") val isPom = path.ext == "pom" if (inCoursierCache && (isSource || isPom)) { diff --git a/scalalib/src/JavaModule.scala b/scalalib/src/JavaModule.scala index e1fd8628..7b373650 100644 --- a/scalalib/src/JavaModule.scala +++ b/scalalib/src/JavaModule.scala @@ -383,8 +383,14 @@ trait JavaModule extends mill.Module with TaskModule { outer => Some(mapDependencies()) ) - println(coursier.util.Print.dependencyTree(flattened, resolution, - printExclusions = false, reverse = inverse)) + println( + coursier.util.Print.dependencyTree( + roots = flattened, + resolution = resolution, + printExclusions = false, + reverse = inverse + ) + ) Result.Success() } diff --git a/scalalib/src/Lib.scala b/scalalib/src/Lib.scala index 2706850e..da133d94 100644 --- a/scalalib/src/Lib.scala +++ b/scalalib/src/Lib.scala @@ -8,7 +8,7 @@ import java.util.zip.ZipInputStream import javax.tools.ToolProvider import ammonite.util.Util -import coursier.{Cache, Dependency, Fetch, Repository, Resolution} +import coursier.{Dependency, Fetch, Repository, Resolution} import mill.scalalib.api.Util.isDotty import mill.Agg import mill.eval.{PathRef, Result} diff --git a/scalalib/src/ScalaModule.scala b/scalalib/src/ScalaModule.scala index 5fad1664..f45a7e98 100644 --- a/scalalib/src/ScalaModule.scala +++ b/scalalib/src/ScalaModule.scala @@ -48,8 +48,13 @@ trait ScalaModule extends JavaModule { outer => Set("dotty-library", "dotty-compiler") else Set("scala-library", "scala-compiler", "scala-reflect") - if (!artifacts(d.module.name)) d - else d.copy(module = d.module.copy(organization = scalaOrganization()), version = scalaVersion()) + if (!artifacts(d.module.name.value)) d + else d.copy( + module = d.module.copy( + organization = coursier.Organization(scalaOrganization()) + ), + version = scalaVersion() + ) } override def resolveCoursierDependency: Task[Dep => coursier.Dependency] = T.task{ diff --git a/scalalib/src/Versions.scala b/scalalib/src/Versions.scala index 231eb86b..973b05ed 100644 --- a/scalalib/src/Versions.scala +++ b/scalalib/src/Versions.scala @@ -2,7 +2,7 @@ package mill.scalalib object Versions { // Keep synchronized with ammonite dependency in core in build.sc - val ammonite = "1.6.0" + val ammonite = "1.6.7" // Keep synchronized with zinc dependency in scalalib.worker in build.sc val zinc = "1.2.5" } diff --git a/scalalib/src/ZincWorkerModule.scala b/scalalib/src/ZincWorkerModule.scala index 50d37611..7d81cb97 100644 --- a/scalalib/src/ZincWorkerModule.scala +++ b/scalalib/src/ZincWorkerModule.scala @@ -1,6 +1,6 @@ package mill.scalalib -import coursier.Cache + import coursier.maven.MavenRepository import mill.Agg import mill.T @@ -17,7 +17,7 @@ object ZincWorkerModule extends mill.define.ExternalModule with ZincWorkerModule } trait ZincWorkerModule extends mill.Module{ def repositories = Seq( - Cache.ivy2Local, + coursier.LocalRepositories.ivy2Local, MavenRepository("https://repo1.maven.org/maven2"), MavenRepository("https://oss.sonatype.org/content/repositories/releases") ) diff --git a/scalalib/src/dependency/metadata/MavenMetadataLoader.scala b/scalalib/src/dependency/metadata/MavenMetadataLoader.scala index 491911bf..e40337fc 100644 --- a/scalalib/src/dependency/metadata/MavenMetadataLoader.scala +++ b/scalalib/src/dependency/metadata/MavenMetadataLoader.scala @@ -1,6 +1,5 @@ package mill.scalalib.dependency.metadata -import coursier.Cache import coursier.maven.MavenRepository import coursier.util.Task import mill.scalalib.dependency.versions.Version @@ -8,14 +7,14 @@ import mill.scalalib.dependency.versions.Version private[dependency] final case class MavenMetadataLoader(mavenRepo: MavenRepository) extends MetadataLoader { - private val fetch = Cache.fetch[Task]() + private val fetch = coursier.cache.FileCache[Task].fetch override def getVersions(module: coursier.Module): List[Version] = { import scala.concurrent.ExecutionContext.Implicits.global // TODO fallback to 'versionsFromListing' if 'versions' doesn't work? (needs to be made public in coursier first) val allVersions = mavenRepo.versions(module, fetch).run.unsafeRun allVersions - .map(_.available.map(Version(_))) + .map(_._1.available.map(Version(_))) .getOrElse(List.empty) } } diff --git a/scalalib/src/publish/SonatypeHttpApi.scala b/scalalib/src/publish/SonatypeHttpApi.scala index 12defa93..217d556e 100644 --- a/scalalib/src/publish/SonatypeHttpApi.scala +++ b/scalalib/src/publish/SonatypeHttpApi.scala @@ -5,18 +5,10 @@ import java.util.Base64 import scala.concurrent.duration._ -import scalaj.http.{BaseHttp, HttpOptions, HttpRequest, HttpResponse} - -object PatientHttp - extends BaseHttp( - options = Seq( - HttpOptions.connTimeout(5.seconds.toMillis.toInt), - HttpOptions.readTimeout(1.minute.toMillis.toInt), - HttpOptions.followRedirects(false) - ) - ) + class SonatypeHttpApi(uri: String, credentials: String) { + val http = requests.Session(connectTimeout = 5000, readTimeout = 1000, maxRedirects = 0) private val base64Creds = base64(credentials) @@ -29,12 +21,19 @@ class SonatypeHttpApi(uri: String, credentials: String) { // https://oss.sonatype.org/nexus-staging-plugin/default/docs/path__staging_profiles.html def getStagingProfileUri(groupId: String): String = { val response = withRetry( - PatientHttp(s"$uri/staging/profiles").headers(commonHeaders)) - .throwError + http.get( + s"$uri/staging/profiles", + headers = commonHeaders + ) + ) + + if (!response.is2xx) { + throw new Exception(s"$uri/staging/profiles returned ${response.statusCode}") + } val resourceUri = ujson - .read(response.body)("data") + .read(response.data.text)("data") .arr .find(profile => groupId.split('.').startsWith(profile("name").str.split('.'))) @@ -47,79 +46,84 @@ class SonatypeHttpApi(uri: String, credentials: String) { } def getStagingRepoState(stagingRepoId: String): String = { - val response = PatientHttp(s"${uri}/staging/repository/${stagingRepoId}") - .option(HttpOptions.readTimeout(60000)) - .headers(commonHeaders) - .asString - .throwError - - ujson.read(response.body)("type").str.toString + val response = http.get( + s"${uri}/staging/repository/${stagingRepoId}", + readTimeout = 60000, + headers = commonHeaders + ) + ujson.read(response.data.text)("type").str.toString } // https://oss.sonatype.org/nexus-staging-plugin/default/docs/path__staging_profiles_-profileIdKey-_start.html def createStagingRepo(profileUri: String, groupId: String): String = { - val response = withRetry(PatientHttp(s"${profileUri}/start") - .headers(commonHeaders) - .postData( - s"""{"data": {"description": "fresh staging profile for ${groupId}"}}""")) - .throwError + val response = http.post( + s"${profileUri}/start", + headers = commonHeaders, + data = s"""{"data": {"description": "fresh staging profile for ${groupId}"}}""" + ) - ujson.read(response.body)("data")("stagedRepositoryId").str.toString + if (!response.is2xx) { + throw new Exception(s"$uri/staging/profiles returned ${response.statusCode}") + } + + ujson.read(response.data.text)("data")("stagedRepositoryId").str.toString } // https://oss.sonatype.org/nexus-staging-plugin/default/docs/path__staging_profiles_-profileIdKey-_finish.html def closeStagingRepo(profileUri: String, repositoryId: String): Boolean = { val response = withRetry( - PatientHttp(s"${profileUri}/finish") - .headers(commonHeaders) - .postData( - s"""{"data": {"stagedRepositoryId": "${repositoryId}", "description": "closing staging repository"}}""" - )) + http.post( + s"${profileUri}/finish", + headers = commonHeaders, + data = s"""{"data": {"stagedRepositoryId": "${repositoryId}", "description": "closing staging repository"}}""" + ) + ) - response.code == 201 + response.statusCode == 201 } // https://oss.sonatype.org/nexus-staging-plugin/default/docs/path__staging_profiles_-profileIdKey-_promote.html def promoteStagingRepo(profileUri: String, repositoryId: String): Boolean = { val response = withRetry( - PatientHttp(s"${profileUri}/promote") - .headers(commonHeaders) - .postData( - s"""{"data": {"stagedRepositoryId": "${repositoryId}", "description": "promote staging repository"}}""" - )) + http.post( + s"${profileUri}/promote", + headers = commonHeaders, + data = s"""{"data": {"stagedRepositoryId": "${repositoryId}", "description": "promote staging repository"}}""" + ) + ) - response.code == 201 + response.statusCode == 201 } // https://oss.sonatype.org/nexus-staging-plugin/default/docs/path__staging_profiles_-profileIdKey-_drop.html def dropStagingRepo(profileUri: String, repositoryId: String): Boolean = { val response = withRetry( - PatientHttp(s"${profileUri}/drop") - .headers(commonHeaders) - .postData( - s"""{"data": {"stagedRepositoryId": "${repositoryId}", "description": "drop staging repository"}}""" - )) - - response.code == 201 + http.post( + s"${profileUri}/drop", + headers = commonHeaders, + data = s"""{"data": {"stagedRepositoryId": "${repositoryId}", "description": "drop staging repository"}}""" + ) + ) + response.statusCode == 201 } private val uploadTimeout = 5.minutes.toMillis.toInt - def upload(uri: String, data: Array[Byte]): HttpResponse[String] = { - PatientHttp(uri) - .option(HttpOptions.readTimeout(uploadTimeout)) - .method("PUT") - .headers( + def upload(uri: String, data: Array[Byte]): requests.Response = { + http.put( + uri, + readTimeout = uploadTimeout, + headers = Seq( "Content-Type" -> "application/binary", "Authorization" -> s"Basic ${base64Creds}" - ) - .put(data) - .asString + ), + data = data + ) } - private def withRetry(request: HttpRequest, - retries: Int = 10): HttpResponse[String] = { - val resp = request.asString + private def withRetry(request: => requests.Response, + retries: Int = 10): requests.Response = { + val resp = request if (resp.is5xx && retries > 0) { Thread.sleep(500) withRetry(request, retries - 1) diff --git a/scalalib/src/publish/SonatypePublisher.scala b/scalalib/src/publish/SonatypePublisher.scala index 6dcadd5b..5ca8f5c1 100644 --- a/scalalib/src/publish/SonatypePublisher.scala +++ b/scalalib/src/publish/SonatypePublisher.scala @@ -5,7 +5,6 @@ import java.security.MessageDigest import mill.api.Logger import os.Shellable -import scalaj.http.HttpResponse class SonatypePublisher(uri: String, snapshotUri: String, @@ -105,13 +104,13 @@ class SonatypePublisher(uri: String, } } - private def reportPublishResults(publishResults: Seq[HttpResponse[String]], + private def reportPublishResults(publishResults: Seq[requests.Response], artifacts: Seq[Artifact]) = { if (publishResults.forall(_.is2xx)) { log.info(s"Published ${artifacts.map(_.id).mkString(", ")} to Sonatype") } else { val errors = publishResults.filterNot(_.is2xx).map { response => - s"Code: ${response.code}, message: ${response.body}" + s"Code: ${response.statusCode}, message: ${response.data.text}" } throw new RuntimeException( s"Failed to publish ${artifacts.map(_.id).mkString(", ")} to Sonatype. Errors: \n${errors.mkString("\n")}" diff --git a/scalalib/src/publish/settings.scala b/scalalib/src/publish/settings.scala index bca81cf0..d2801752 100644 --- a/scalalib/src/publish/settings.scala +++ b/scalalib/src/publish/settings.scala @@ -23,13 +23,13 @@ object Artifact { ) Dependency( Artifact( - dep.dep.module.organization, + dep.dep.module.organization.value, name, dep.dep.version ), Scope.Compile, - if (dep.dep.configuration == "") None else Some(dep.dep.configuration), - dep.dep.exclusions.toList + if (dep.dep.configuration == "") None else Some(dep.dep.configuration.value), + dep.dep.exclusions.toList.map{case (a, b) => (a.value, b.value)} ) } } diff --git a/scalalib/test/src/GenIdeaTests.scala b/scalalib/test/src/GenIdeaTests.scala index f8d9a0ed..60c9f9a8 100644 --- a/scalalib/test/src/GenIdeaTests.scala +++ b/scalalib/test/src/GenIdeaTests.scala @@ -1,6 +1,5 @@ package mill.scalalib -import coursier.Cache import mill._ import mill.util.{TestEvaluator, TestUtil} import utest._ @@ -57,6 +56,6 @@ object GenIdeaTests extends TestSuite { private def normaliseLibraryPaths(in: String): String = { - in.replaceAll(Cache.default.toPath.toAbsolutePath.toString, "COURSIER_HOME") + in.replaceAll(coursier.paths.CoursierPaths.cacheDirectory().toString, "COURSIER_HOME") } } diff --git a/scalalib/test/src/ResolveDepsTests.scala b/scalalib/test/src/ResolveDepsTests.scala index ce905907..94b8adb9 100644 --- a/scalalib/test/src/ResolveDepsTests.scala +++ b/scalalib/test/src/ResolveDepsTests.scala @@ -1,6 +1,5 @@ package mill.scalalib -import coursier.Cache import coursier.maven.MavenRepository import mill.api.Result.{Failure, Success} import mill.eval.{PathRef, Result} @@ -8,7 +7,7 @@ import mill.api.Loose.Agg import utest._ object ResolveDepsTests extends TestSuite { - val repos = Seq(Cache.ivy2Local, MavenRepository("https://repo1.maven.org/maven2")) + val repos = Seq(coursier.LocalRepositories.ivy2Local, MavenRepository("https://repo1.maven.org/maven2")) def evalDeps(deps: Agg[Dep]): Result[Agg[PathRef]] = Lib.resolveDependencies( repos, diff --git a/scalalib/test/src/dependency/metadata/MetadataLoaderFactoryTests.scala b/scalalib/test/src/dependency/metadata/MetadataLoaderFactoryTests.scala index 4c2206b8..af2ea617 100644 --- a/scalalib/test/src/dependency/metadata/MetadataLoaderFactoryTests.scala +++ b/scalalib/test/src/dependency/metadata/MetadataLoaderFactoryTests.scala @@ -28,8 +28,8 @@ */ package mill.scalalib.dependency.metadata -import coursier.Fetch.Content -import coursier.core.{Artifact, Module, Project, Repository} +import coursier.Fetch +import coursier.core.{Artifact, Classifier, Dependency, Module, Project, Repository} import coursier.ivy.IvyRepository import coursier.maven.MavenRepository import coursier.util.{EitherT, Monad} @@ -57,8 +57,12 @@ object MetadataLoaderFactoryTests extends TestSuite { } case class CustomRepository() extends Repository { - override def find[F[_]](module: Module, version: String, fetch: Content[F])( - implicit F: Monad[F]): EitherT[F, String, (Artifact.Source, Project)] = + override def find[F[_]](module: Module, version: String, fetch: coursier.Repository.Fetch[F]) + (implicit F: Monad[F]): EitherT[F, String, (Artifact.Source, Project)] = ??? + + override def artifacts(dependency: Dependency, + project: Project, + overrideClassifiers: Option[Seq[Classifier]]) = ??? } } diff --git a/scalalib/test/src/dependency/updates/UpdatesFinderTests.scala b/scalalib/test/src/dependency/updates/UpdatesFinderTests.scala index 7b6e6e36..3b613bcb 100644 --- a/scalalib/test/src/dependency/updates/UpdatesFinderTests.scala +++ b/scalalib/test/src/dependency/updates/UpdatesFinderTests.scala @@ -37,7 +37,10 @@ object UpdatesFinderTests extends TestSuite { available: Seq[String], allowPreRelease: Boolean) = { val dependency = coursier.Dependency( - coursier.Module("com.example.organization", "example-artifact"), + coursier.Module( + coursier.Organization("com.example.organization"), + coursier.ModuleName("example-artifact") + ), current) val currentVersion = Version(current) val allVersions = available.map(Version(_)).toSet diff --git a/scalanativelib/src/ScalaNativeModule.scala b/scalanativelib/src/ScalaNativeModule.scala index 38525032..b04b00a1 100644 --- a/scalanativelib/src/ScalaNativeModule.scala +++ b/scalanativelib/src/ScalaNativeModule.scala @@ -3,7 +3,6 @@ package scalanativelib import java.net.URLClassLoader -import coursier.Cache import coursier.maven.MavenRepository import mill.define.{Target, Task} import mill.api.Result @@ -50,7 +49,7 @@ trait ScalaNativeModule extends ScalaModule { outer => Result.Success(Agg(workerPath.split(',').map(p => PathRef(os.Path(p), quick = true)): _*)) else Lib.resolveDependencies( - Seq(Cache.ivy2Local, MavenRepository("https://repo1.maven.org/maven2")), + Seq(coursier.LocalRepositories.ivy2Local, MavenRepository("https://repo1.maven.org/maven2")), Lib.depToDependency(_, "2.12.4", ""), Seq(ivy"com.lihaoyi::mill-scalanativelib-worker-${scalaNativeBinaryVersion()}:${sys.props("MILL_VERSION")}"), ctx = Some(implicitly[mill.util.Ctx.Log]) @@ -82,7 +81,7 @@ trait ScalaNativeModule extends ScalaModule { outer => def bridgeFullClassPath = T { Lib.resolveDependencies( - Seq(Cache.ivy2Local, MavenRepository("https://repo1.maven.org/maven2")), + Seq(coursier.LocalRepositories.ivy2Local, MavenRepository("https://repo1.maven.org/maven2")), Lib.depToDependency(_, scalaVersion(), platformSuffix()), toolsIvyDeps(), ctx = Some(implicitly[mill.util.Ctx.Log]) @@ -202,7 +201,7 @@ trait TestScalaNativeModule extends ScalaNativeModule with TestModule { testOute Lib.resolveDependencies( repositories, Lib.depToDependency(_, scalaVersion(), ""), - transitiveIvyDeps().filter(d => d.cross.isBinary && supportedTestFrameworks(d.dep.module.name)), + transitiveIvyDeps().filter(d => d.cross.isBinary && supportedTestFrameworks(d.dep.module.name.value)), ctx = Some(implicitly[mill.util.Ctx.Log]) ) } |