From 700bf842963d34e80d53ac3f5f224ebf7242f153 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Mon, 23 Nov 2015 22:55:30 +0100 Subject: [PATCH 1/4] Add fetchLocalFirst, fix in the way local repo are handled --- cli/src/main/scala/coursier/cli/Helper.scala | 2 +- .../src/main/scala/coursier/package.scala | 24 +++++++++++++++++++ files/src/main/scala/coursier/Files.scala | 23 +++++++++++------- 3 files changed, 39 insertions(+), 10 deletions(-) diff --git a/cli/src/main/scala/coursier/cli/Helper.scala b/cli/src/main/scala/coursier/cli/Helper.scala index ae28c8b83..e5cec37a9 100644 --- a/cli/src/main/scala/coursier/cli/Helper.scala +++ b/cli/src/main/scala/coursier/cli/Helper.scala @@ -192,7 +192,7 @@ class Helper( filter = Some(dep => keepOptional || !dep.optional) ) - val fetchQuiet = coursier.fetch(repositories) + val fetchQuiet = coursier.fetchLocalFirst(repositories) val fetch0 = if (verbose0 == 0) fetchQuiet else { diff --git a/core/shared/src/main/scala/coursier/package.scala b/core/shared/src/main/scala/coursier/package.scala index f3c3a58f6..bb58b4391 100644 --- a/core/shared/src/main/scala/coursier/package.scala +++ b/core/shared/src/main/scala/coursier/package.scala @@ -1,3 +1,4 @@ +import scalaz.{ -\/, \/- } import scalaz.concurrent.Task /** @@ -109,4 +110,27 @@ package object coursier { ) } + def fetchLocalFirst( + repositories: Seq[core.Repository] + )(implicit + cachePolicy: CachePolicy + ): ResolutionProcess.Fetch[Task] = { + + modVers => + Task.gatherUnordered( + modVers + .map {case (module, version) => + def attempt(cachePolicy: CachePolicy) = + Repository.find(repositories, module, version)(cachePolicy) + .run + .map((module, version) -> _) + + attempt(CachePolicy.LocalOnly).flatMap { + case v @ (_, \/-(_)) => Task.now(v) + case (_, -\/(_)) => attempt(cachePolicy) + } + } + ) + } + } diff --git a/files/src/main/scala/coursier/Files.scala b/files/src/main/scala/coursier/Files.scala index e64e0e690..23c74fd85 100644 --- a/files/src/main/scala/coursier/Files.scala +++ b/files/src/main/scala/coursier/Files.scala @@ -38,7 +38,7 @@ case class Files( cacheDir + "/" + url.stripPrefix(base) } - if (artifact.extra.contains("local") || isLocal) + if (artifact.extra.contains("local")) artifact else artifact.copy(extra = artifact.extra + ("local" -> @@ -141,14 +141,19 @@ case class Files( val tasks = - for ((f, url) <- pairs if url != ("file:" + f) && url != ("file://" + f)) yield { - val file = new File(f) - cachePolicy[FileError \/ File]( - _.isLeft )( - locally(file) )( - _ => remote(file, url) - ).map(e => (file, url) -> e.map(_ => ())) - } + for ((f, url) <- pairs) yield + if (url != ("file:" + f) && url != ("file://" + f)) { + assert(!f.startsWith("file:/"), s"Wrong file detection: $f, $url") + val file = new File(f) + cachePolicy[FileError \/ File]( + _.isLeft)( + locally(file))( + _ => remote(file, url) + ).map(e => (file, url) -> e.map(_ => ())) + } else { + val file = new File(f) + Task.now(((file, url), \/-(()))) + } Nondeterminism[Task].gather(tasks) } From a0efbc539faa81fcac40e020df46b0cb8ff105d2 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Mon, 23 Nov 2015 23:18:07 +0100 Subject: [PATCH 2/4] Slightly better help message --- cli/src/main/scala/coursier/cli/Coursier.scala | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cli/src/main/scala/coursier/cli/Coursier.scala b/cli/src/main/scala/coursier/cli/Coursier.scala index dbd8ec866..587c77f63 100644 --- a/cli/src/main/scala/coursier/cli/Coursier.scala +++ b/cli/src/main/scala/coursier/cli/Coursier.scala @@ -53,8 +53,6 @@ case class CacheOptions( cache: String = CacheOptions.default ) -@AppName("Coursier") -@ProgName("coursier") sealed trait CoursierCommand extends Command case class Fetch( @@ -413,5 +411,8 @@ case class BaseCommand( } object Coursier extends CommandAppOfWithBase[BaseCommand, CoursierCommand] { + override def appName = "Coursier" + override def progName = "coursier" + private[coursier] var baseCp = Seq.empty[String] } From 4b55618bdb21d30eb5c38e1feac33a387f03305a Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Mon, 23 Nov 2015 23:47:40 +0100 Subject: [PATCH 3/4] Allow to specify Maven repository with their base URL with the -r option --- cli/src/main/scala/coursier/cli/Helper.scala | 43 ++++++++++++++++---- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/cli/src/main/scala/coursier/cli/Helper.scala b/cli/src/main/scala/coursier/cli/Helper.scala index e5cec37a9..c46df1c1e 100644 --- a/cli/src/main/scala/coursier/cli/Helper.scala +++ b/cli/src/main/scala/coursier/cli/Helper.scala @@ -1,6 +1,7 @@ package coursier.cli import java.io.File +import java.util.UUID import caseapp.CaseApp import coursier._ @@ -133,22 +134,50 @@ class Helper( } val repoMap = cache.map() + val repoByBase = repoMap.map { case (_, v @ (m, _)) => + m.root -> v + } - if (repositoryIds.exists(!repoMap.contains(_))) { - val notFound = repositoryIds - .filter(!repoMap.contains(_)) + val repositoryIdsOpt0 = repositoryIds.map { id => + repoMap.get(id) match { + case Some(v) => Right(v) + case None => + if (id.contains("://")) { + val root0 = if (id.endsWith("/")) id else id + "/" + Right( + repoByBase.getOrElse(root0, { + val id0 = UUID.randomUUID().toString + if (verbose0 >= 1) + Console.err.println(s"Addding repository $id0 ($root0)") + // FIXME This could be done more cleanly + cache.add(id0, root0, ivyLike = false) + cache.map().getOrElse(id0, + sys.error(s"Adding repository $id0 ($root0)") + ) + }) + ) + } else + Left(id) + } + } + + val notFoundRepositoryIds = repositoryIdsOpt0.collect { + case Left(id) => id + } + + if (notFoundRepositoryIds.nonEmpty) { errPrintln( - (if (notFound.lengthCompare(1) == 1) "Repository" else "Repositories") + + (if (notFoundRepositoryIds.lengthCompare(1) == 0) "Repository" else "Repositories") + " not found: " + - notFound.mkString(", ") + notFoundRepositoryIds.mkString(", ") ) sys.exit(1) } - val (repositories0, fileCaches) = repositoryIds - .map(repoMap) + val (repositories0, fileCaches) = repositoryIdsOpt0 + .collect { case Right(v) => v } .unzip val repositories = repositories0 From 8bb95211998535135413811f3864c00455a646e6 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Mon, 23 Nov 2015 23:58:24 +0100 Subject: [PATCH 4/4] Better help messages --- cli/src/main/scala/coursier/cli/Coursier.scala | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cli/src/main/scala/coursier/cli/Coursier.scala b/cli/src/main/scala/coursier/cli/Coursier.scala index 587c77f63..b1ea1710d 100644 --- a/cli/src/main/scala/coursier/cli/Coursier.scala +++ b/cli/src/main/scala/coursier/cli/Coursier.scala @@ -276,7 +276,7 @@ case class Bootstrap( downloadDir: String, @ExtraName("f") force: Boolean, - @HelpMessage(s"Internal use - prepend base classpath options to arguments") + @HelpMessage(s"Internal use - prepend base classpath options to arguments (like -B jar1 -B jar2 etc.)") @ExtraName("b") prependClasspath: Boolean, @HelpMessage("Set environment variables in the generated launcher. No escaping is done. Value is simply put between quotes in the launcher preamble.") @@ -392,8 +392,7 @@ case class Bootstrap( } case class BaseCommand( - // FIXME Need a @NoHelp annotation in case-app to hide an option from help message - @HelpMessage("For internal use only - class path used to launch coursier") + @Hidden @ExtraName("B") baseCp: List[String] ) extends Command {