From 5be6ca2d0bb78a97e78c9e0e90d2a01a090fc08e Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Wed, 24 Oct 2018 16:09:03 +0200 Subject: [PATCH 1/9] Allow to fetch both default and source or javadoc artifacts Pass --classifer _ along --sources or --javadoc --- .../scala-2.12/coursier/cli/Bootstrap.scala | 6 ++--- .../main/scala-2.12/coursier/cli/Fetch.scala | 3 ++- .../main/scala-2.12/coursier/cli/Helper.scala | 19 +++++++++++--- .../scala-2.12/coursier/cli/SparkSubmit.scala | 8 +++--- .../cli/options/ArtifactOptions.scala | 12 +++++---- .../cli/CliFetchIntegrationTest.scala | 26 +++++++++++++++++++ 6 files changed, 57 insertions(+), 17 deletions(-) diff --git a/modules/cli/src/main/scala-2.12/coursier/cli/Bootstrap.scala b/modules/cli/src/main/scala-2.12/coursier/cli/Bootstrap.scala index 8fede6c593..2dc83871d5 100644 --- a/modules/cli/src/main/scala-2.12/coursier/cli/Bootstrap.scala +++ b/modules/cli/src/main/scala-2.12/coursier/cli/Bootstrap.scala @@ -27,7 +27,7 @@ object Bootstrap extends CaseApp[BootstrapOptions] { val files = helper.fetch( sources = false, javadoc = false, - artifactTypes = options.artifactOptions.artifactTypes(sources = false, javadoc = false) + artifactTypes = options.artifactOptions.artifactTypes() ) val log: String => Unit = @@ -168,7 +168,7 @@ object Bootstrap extends CaseApp[BootstrapOptions] { val m = helper.fetchMap( sources = false, javadoc = false, - artifactTypes = options.artifactOptions.artifactTypes(sources = false, javadoc = false), + artifactTypes = options.artifactOptions.artifactTypes(), subset = isolatedDeps.getOrElse(target, Seq.empty).toSet ) @@ -353,7 +353,7 @@ object Bootstrap extends CaseApp[BootstrapOptions] { helper.fetchMap( sources = false, javadoc = false, - artifactTypes = options.artifactOptions.artifactTypes(sources = false, javadoc = false) + artifactTypes = options.artifactOptions.artifactTypes() ).toList.foldLeft((List.empty[String], List.empty[File])){ case ((urls, files), (url, file)) => if (options.options.assembly || options.options.standalone) (urls, file :: files) diff --git a/modules/cli/src/main/scala-2.12/coursier/cli/Fetch.scala b/modules/cli/src/main/scala-2.12/coursier/cli/Fetch.scala index 01684383bc..ae580c309c 100644 --- a/modules/cli/src/main/scala-2.12/coursier/cli/Fetch.scala +++ b/modules/cli/src/main/scala-2.12/coursier/cli/Fetch.scala @@ -16,7 +16,8 @@ final class Fetch(options: FetchOptions, args: RemainingArgs) { javadoc = options.javadoc, artifactTypes = options.artifactOptions.artifactTypes( options.sources || options.common.classifier0(Classifier.sources), - options.javadoc || options.common.classifier0(Classifier.javadoc) + options.javadoc || options.common.classifier0(Classifier.javadoc), + (!options.sources && !options.javadoc) || options.common.classifier0(Classifier("_")) ) ) diff --git a/modules/cli/src/main/scala-2.12/coursier/cli/Helper.scala b/modules/cli/src/main/scala-2.12/coursier/cli/Helper.scala index fd09977978..a5506dd670 100644 --- a/modules/cli/src/main/scala-2.12/coursier/cli/Helper.scala +++ b/modules/cli/src/main/scala-2.12/coursier/cli/Helper.scala @@ -599,11 +599,22 @@ class Helper( } private def getDepArtifactsForClassifier(sources: Boolean, javadoc: Boolean, res0: Resolution): Seq[(Dependency, Attributes, Artifact)] = { + val raw = - if (hasOverrideClassifiers(sources, javadoc)) - //TODO: this function somehow gives duplicated things - res0.dependencyArtifacts(Some(overrideClassifiers(sources, javadoc).toVector.sorted)) - else + if (hasOverrideClassifiers(sources, javadoc)) { + val classifiers = overrideClassifiers(sources, javadoc) + + val baseArtifacts = + if (classifiers(Classifier("_"))) + res0.dependencyArtifacts(None) + else + Nil + + val classifierArtifacts = + res0.dependencyArtifacts(Some(classifiers.filter(_ != Classifier("_")).toVector.sorted)) + + baseArtifacts ++ classifierArtifacts + } else res0.dependencyArtifacts(None) raw.map { diff --git a/modules/cli/src/main/scala-2.12/coursier/cli/SparkSubmit.scala b/modules/cli/src/main/scala-2.12/coursier/cli/SparkSubmit.scala index 9baf518366..80838872ec 100644 --- a/modules/cli/src/main/scala-2.12/coursier/cli/SparkSubmit.scala +++ b/modules/cli/src/main/scala-2.12/coursier/cli/SparkSubmit.scala @@ -65,7 +65,7 @@ object SparkSubmit extends CaseApp[SparkSubmitOptions] { helper.fetch( sources = false, javadoc = false, - artifactTypes = options.artifactOptions.artifactTypes(sources = false, javadoc = false) + artifactTypes = options.artifactOptions.artifactTypes() ) ++ options.extraJars.map(new File(_)) val (scalaVersion, sparkVersion) = @@ -93,7 +93,7 @@ object SparkSubmit extends CaseApp[SparkSubmitOptions] { options.assemblyDependencies.flatMap(_.split(",")).filter(_.nonEmpty) ++ options.sparkAssemblyDependencies.flatMap(_.split(",")).filter(_.nonEmpty).map(_ + s":$sparkVersion"), options.common, - options.artifactOptions.artifactTypes(sources = false, javadoc = false) + options.artifactOptions.artifactTypes() ) val extraConf = @@ -115,7 +115,7 @@ object SparkSubmit extends CaseApp[SparkSubmitOptions] { options.assemblyDependencies.flatMap(_.split(",")).filter(_.nonEmpty) ++ options.sparkAssemblyDependencies.flatMap(_.split(",")).filter(_.nonEmpty).map(_ + s":$sparkVersion"), options.common, - options.artifactOptions.artifactTypes(sources = false, javadoc = false) + options.artifactOptions.artifactTypes() ) val (assembly, assemblyJars) = assemblyAndJarsOrError match { @@ -191,7 +191,7 @@ object SparkSubmit extends CaseApp[SparkSubmitOptions] { sparkVersion, options.noDefaultSubmitDependencies, options.submitDependencies.flatMap(_.split(",")).filter(_.nonEmpty), - options.artifactOptions.artifactTypes(sources = false, javadoc = false), + options.artifactOptions.artifactTypes(), options.common ) diff --git a/modules/cli/src/main/scala-2.12/coursier/cli/options/ArtifactOptions.scala b/modules/cli/src/main/scala-2.12/coursier/cli/options/ArtifactOptions.scala index 63092684bb..50a89f4916 100644 --- a/modules/cli/src/main/scala-2.12/coursier/cli/options/ArtifactOptions.scala +++ b/modules/cli/src/main/scala-2.12/coursier/cli/options/ArtifactOptions.scala @@ -18,7 +18,9 @@ final case class ArtifactOptions( @Help("Fetch artifacts even if the resolution is errored") force: Boolean = false ) { - def artifactTypes(sources: Boolean, javadoc: Boolean): Set[Type] = { + def artifactTypes(): Set[Type] = + artifactTypes(sources = false, javadoc = false, default = true) + def artifactTypes(sources: Boolean, javadoc: Boolean, default: Boolean): Set[Type] = { val types0 = artifactType .flatMap(_.split(',')) @@ -27,10 +29,10 @@ final case class ArtifactOptions( .toSet if (types0.isEmpty) { - if (sources || javadoc) - Some(Type.source).filter(_ => sources).toSet ++ Some(Type.doc).filter(_ => javadoc) - else - ArtifactOptions.defaultArtifactTypes + val sourceTypes = Some(Type.source).filter(_ => sources).toSet + val javadocTypes = Some(Type.doc).filter(_ => javadoc).toSet + val defaultTypes = if (default) ArtifactOptions.defaultArtifactTypes else Set() + sourceTypes ++ javadocTypes ++ defaultTypes } else if (types0(Type("*"))) Set(Type("*")) else diff --git a/modules/cli/src/test/scala-2.12/coursier/cli/CliFetchIntegrationTest.scala b/modules/cli/src/test/scala-2.12/coursier/cli/CliFetchIntegrationTest.scala index 850525cf11..f5a47fc2a9 100644 --- a/modules/cli/src/test/scala-2.12/coursier/cli/CliFetchIntegrationTest.scala +++ b/modules/cli/src/test/scala-2.12/coursier/cli/CliFetchIntegrationTest.scala @@ -42,6 +42,32 @@ class CliFetchIntegrationTest extends FlatSpec with CliTestLib with Matchers { assert(fetch.files0.map(_.getName).toSet.equals(Set("junit-4.12.jar", "hamcrest-core-1.3.jar"))) } + "Underscore classifier" should "fetch default files" in { + val commonOpt = CommonOptions( + classifier = List("_") + ) + val fetchOpt = FetchOptions(common = commonOpt) + val fetch = Fetch(fetchOpt, RemainingArgs(Seq("junit:junit:4.12"), Seq())) + assert(fetch.files0.map(_.getName).toSet.equals(Set("junit-4.12.jar", "hamcrest-core-1.3.jar"))) + } + + "Underscore and source classifier" should "fetch default and source files" in { + val commonOpt = CommonOptions( + classifier = List("_") + ) + val fetchOpt = FetchOptions( + common = commonOpt, + sources = true + ) + val fetch = Fetch(fetchOpt, RemainingArgs(Seq("junit:junit:4.12"), Seq())) + assert(fetch.files0.map(_.getName).toSet.equals(Set( + "junit-4.12.jar", + "junit-4.12-sources.jar", + "hamcrest-core-1.3.jar", + "hamcrest-core-1.3-sources.jar" + ))) + } + "scalafmt-cli fetch" should "discover all main classes" in { val fetchOpt = FetchOptions(common = CommonOptions()) val fetch = Fetch(fetchOpt, RemainingArgs(Seq("com.geirsson:scalafmt-cli_2.12:1.4.0"), Seq())) From b8b9fb5e47eee0850c430b491572ebb3b233fc6a Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Wed, 24 Oct 2018 16:29:17 +0200 Subject: [PATCH 2/9] Accept --default option to get default artifacts along --sources --- .../scala-2.12/coursier/cli/Bootstrap.scala | 3 ++ .../main/scala-2.12/coursier/cli/Fetch.scala | 8 +++- .../main/scala-2.12/coursier/cli/Helper.scala | 48 ++++++++++++++----- .../scala-2.12/coursier/cli/SparkSubmit.scala | 1 + .../coursier/cli/options/FetchOptions.scala | 2 + .../coursier/cli/spark/SparkAssembly.scala | 6 +-- .../coursier/cli/spark/Submit.scala | 1 + .../cli/CliFetchIntegrationTest.scala | 15 ++++++ 8 files changed, 69 insertions(+), 15 deletions(-) diff --git a/modules/cli/src/main/scala-2.12/coursier/cli/Bootstrap.scala b/modules/cli/src/main/scala-2.12/coursier/cli/Bootstrap.scala index 2dc83871d5..2eb868ad4d 100644 --- a/modules/cli/src/main/scala-2.12/coursier/cli/Bootstrap.scala +++ b/modules/cli/src/main/scala-2.12/coursier/cli/Bootstrap.scala @@ -27,6 +27,7 @@ object Bootstrap extends CaseApp[BootstrapOptions] { val files = helper.fetch( sources = false, javadoc = false, + default = true, artifactTypes = options.artifactOptions.artifactTypes() ) @@ -168,6 +169,7 @@ object Bootstrap extends CaseApp[BootstrapOptions] { val m = helper.fetchMap( sources = false, javadoc = false, + default = true, artifactTypes = options.artifactOptions.artifactTypes(), subset = isolatedDeps.getOrElse(target, Seq.empty).toSet ) @@ -353,6 +355,7 @@ object Bootstrap extends CaseApp[BootstrapOptions] { helper.fetchMap( sources = false, javadoc = false, + default = true, artifactTypes = options.artifactOptions.artifactTypes() ).toList.foldLeft((List.empty[String], List.empty[File])){ case ((urls, files), (url, file)) => diff --git a/modules/cli/src/main/scala-2.12/coursier/cli/Fetch.scala b/modules/cli/src/main/scala-2.12/coursier/cli/Fetch.scala index ae580c309c..8ae21a3a95 100644 --- a/modules/cli/src/main/scala-2.12/coursier/cli/Fetch.scala +++ b/modules/cli/src/main/scala-2.12/coursier/cli/Fetch.scala @@ -11,13 +11,19 @@ final class Fetch(options: FetchOptions, args: RemainingArgs) { val helper = new Helper(options.common, args.all, ignoreErrors = options.artifactOptions.force) + val default = options.default.getOrElse { + (!options.sources && !options.javadoc && options.common.classifier0.isEmpty) || + options.common.classifier0(Classifier("_")) + } + val files0 = helper.fetch( sources = options.sources, javadoc = options.javadoc, + default = default, artifactTypes = options.artifactOptions.artifactTypes( options.sources || options.common.classifier0(Classifier.sources), options.javadoc || options.common.classifier0(Classifier.javadoc), - (!options.sources && !options.javadoc) || options.common.classifier0(Classifier("_")) + default ) ) diff --git a/modules/cli/src/main/scala-2.12/coursier/cli/Helper.scala b/modules/cli/src/main/scala-2.12/coursier/cli/Helper.scala index a5506dd670..6bb793efd8 100644 --- a/modules/cli/src/main/scala-2.12/coursier/cli/Helper.scala +++ b/modules/cli/src/main/scala-2.12/coursier/cli/Helper.scala @@ -564,6 +564,7 @@ class Helper( def artifacts( sources: Boolean, javadoc: Boolean, + default: Boolean, artifactTypes: Set[Type], subset: Set[Dependency] = null ): Seq[Artifact] = { @@ -587,7 +588,7 @@ class Helper( val res0 = Option(subset).fold(res)(res.subset) - val artifacts0 = getDepArtifactsForClassifier(sources, javadoc, res0).map(t => (t._2, t._3)) + val artifacts0 = getDepArtifactsForClassifier(sources, javadoc, default, res0).map(t => (t._2, t._3)) if (artifactTypes(Type("*"))) artifacts0.map(_._2) @@ -598,11 +599,16 @@ class Helper( } } - private def getDepArtifactsForClassifier(sources: Boolean, javadoc: Boolean, res0: Resolution): Seq[(Dependency, Attributes, Artifact)] = { + private def getDepArtifactsForClassifier( + sources: Boolean, + javadoc: Boolean, + default: Boolean, + res0: Resolution + ): Seq[(Dependency, Attributes, Artifact)] = { val raw = if (hasOverrideClassifiers(sources, javadoc)) { - val classifiers = overrideClassifiers(sources, javadoc) + val classifiers = overrideClassifiers(sources, javadoc, default) val baseArtifacts = if (classifiers(Classifier("_"))) @@ -628,12 +634,18 @@ class Helper( } } - private def overrideClassifiers(sources: Boolean, javadoc:Boolean): Set[Classifier] = { + private def overrideClassifiers( + sources: Boolean, + javadoc: Boolean, + default: Boolean + ): Set[Classifier] = { var classifiers = classifier0 if (sources) classifiers = classifiers + Classifier.sources if (javadoc) classifiers = classifiers + Classifier.javadoc + if (default) + classifiers = classifiers + Classifier("_") classifiers } @@ -644,11 +656,12 @@ class Helper( def fetchMap( sources: Boolean, javadoc: Boolean, + default: Boolean, artifactTypes: Set[Type], subset: Set[Dependency] = null ): Map[String, File] = { - val artifacts0 = artifacts(sources, javadoc, artifactTypes, subset).distinct + val artifacts0 = artifacts(sources, javadoc, default, artifactTypes, subset).distinct val logger = if (common.verbosityLevel >= 0) @@ -729,13 +742,13 @@ class Helper( } val depToArtifacts: Map[Dependency, Vector[(Attributes, Artifact)]] = - getDepArtifactsForClassifier(sources, javadoc, res).groupBy(_._1).mapValues(_.map(t => (t._2, t._3)).toVector) + getDepArtifactsForClassifier(sources, javadoc, default, res).groupBy(_._1).mapValues(_.map(t => (t._2, t._3)).toVector) if (!jsonOutputFile.isEmpty) { // TODO(wisechengyi): This is not exactly the root dependencies we are asking for on the command line, but it should be // a strict super set. - val deps: Seq[Dependency] = Set(getDepArtifactsForClassifier(sources, javadoc, res).map(_._1): _*).toSeq + val deps: Seq[Dependency] = Set(getDepArtifactsForClassifier(sources, javadoc, default, res).map(_._1): _*).toSeq // A map from requested org:name:version to reconciled org:name:version val conflictResolutionForRoots: Map[String, String] = allDependencies.map({ dep => @@ -754,7 +767,18 @@ class Helper( } val jsonReq = JsonPrintRequirement(artifactToFile, depToArtifacts) - val roots = deps.toVector.map(JsonElem(_, artifacts, Option(jsonReq), res, printExclusions = common.verbosityLevel >= 1, excluded = false, colors = false, overrideClassifiers = overrideClassifiers(sources, javadoc))) + val roots = deps.toVector.map(d => + JsonElem( + d, + artifacts, + Option(jsonReq), + res, + printExclusions = common.verbosityLevel >= 1, + excluded = false, + colors = false, + overrideClassifiers = overrideClassifiers(sources, javadoc, default) + ) + ) val jsonStr = JsonReport( roots, conflictResolutionForRoots @@ -774,11 +798,11 @@ class Helper( def fetch( sources: Boolean, javadoc: Boolean, + default: Boolean, artifactTypes: Set[Type], subset: Set[Dependency] = null - ): Seq[File] = { - fetchMap(sources, javadoc, artifactTypes, subset).values.toSeq - } + ): Seq[File] = + fetchMap(sources, javadoc, default, artifactTypes, subset).values.toSeq def contextLoader = Thread.currentThread().getContextClassLoader @@ -803,6 +827,7 @@ class Helper( val files0 = fetch( sources = false, javadoc = false, + default = true, artifactTypes = artifactTypes ) @@ -819,6 +844,7 @@ class Helper( val isolatedFiles = fetch( sources = false, javadoc = false, + default = true, artifactTypes = artifactTypes, subset = isolatedDeps.getOrElse(target, Seq.empty).toSet ) diff --git a/modules/cli/src/main/scala-2.12/coursier/cli/SparkSubmit.scala b/modules/cli/src/main/scala-2.12/coursier/cli/SparkSubmit.scala index 80838872ec..6bb200c3ac 100644 --- a/modules/cli/src/main/scala-2.12/coursier/cli/SparkSubmit.scala +++ b/modules/cli/src/main/scala-2.12/coursier/cli/SparkSubmit.scala @@ -65,6 +65,7 @@ object SparkSubmit extends CaseApp[SparkSubmitOptions] { helper.fetch( sources = false, javadoc = false, + default = true, artifactTypes = options.artifactOptions.artifactTypes() ) ++ options.extraJars.map(new File(_)) diff --git a/modules/cli/src/main/scala-2.12/coursier/cli/options/FetchOptions.scala b/modules/cli/src/main/scala-2.12/coursier/cli/options/FetchOptions.scala index 59fa5daebe..19bb2e9804 100644 --- a/modules/cli/src/main/scala-2.12/coursier/cli/options/FetchOptions.scala +++ b/modules/cli/src/main/scala-2.12/coursier/cli/options/FetchOptions.scala @@ -9,6 +9,8 @@ final case class FetchOptions( @Help("Fetch javadoc artifacts") @Short("D") javadoc: Boolean = false, + @Help("Fetch default artifacts (default: false if --sources or --javadoc or --classifier are passed, true else)") + default: Option[Boolean] = None, @Help("Print java -cp compatible output") @Short("p") classpath: Boolean = false, diff --git a/modules/cli/src/main/scala-2.12/coursier/cli/spark/SparkAssembly.scala b/modules/cli/src/main/scala-2.12/coursier/cli/spark/SparkAssembly.scala index 72685e8eef..8b18b4be29 100644 --- a/modules/cli/src/main/scala-2.12/coursier/cli/spark/SparkAssembly.scala +++ b/modules/cli/src/main/scala-2.12/coursier/cli/spark/SparkAssembly.scala @@ -82,7 +82,7 @@ object SparkAssembly { val helper = sparkJarsHelper(scalaVersion, sparkVersion, yarnVersion, default, extraDependencies, options) - helper.fetch(sources = false, javadoc = false, artifactTypes = artifactTypes) + helper.fetch(sources = false, javadoc = false, default = true, artifactTypes = artifactTypes) } def spark( @@ -99,8 +99,8 @@ object SparkAssembly { val helper = sparkJarsHelper(scalaVersion, sparkVersion, yarnVersion, default, extraDependencies, options) - val artifacts = helper.artifacts(sources = false, javadoc = false, artifactTypes = artifactTypes) - val jars = helper.fetch(sources = false, javadoc = false, artifactTypes = artifactTypes) + val artifacts = helper.artifacts(sources = false, javadoc = false, default = true, artifactTypes = artifactTypes) + val jars = helper.fetch(sources = false, javadoc = false, default = true, artifactTypes = artifactTypes) val checksums = artifacts.map { a => val f = a.checksumUrls.get("SHA-1") match { diff --git a/modules/cli/src/main/scala-2.12/coursier/cli/spark/Submit.scala b/modules/cli/src/main/scala-2.12/coursier/cli/spark/Submit.scala index 8e52bf3207..160ed970a2 100644 --- a/modules/cli/src/main/scala-2.12/coursier/cli/spark/Submit.scala +++ b/modules/cli/src/main/scala-2.12/coursier/cli/spark/Submit.scala @@ -51,6 +51,7 @@ object Submit { helper.fetch( sources = false, javadoc = false, + default = true, artifactTypes = artifactTypes ) ++ extraCp } diff --git a/modules/cli/src/test/scala-2.12/coursier/cli/CliFetchIntegrationTest.scala b/modules/cli/src/test/scala-2.12/coursier/cli/CliFetchIntegrationTest.scala index f5a47fc2a9..6c530c63d3 100644 --- a/modules/cli/src/test/scala-2.12/coursier/cli/CliFetchIntegrationTest.scala +++ b/modules/cli/src/test/scala-2.12/coursier/cli/CliFetchIntegrationTest.scala @@ -68,6 +68,21 @@ class CliFetchIntegrationTest extends FlatSpec with CliTestLib with Matchers { ))) } + "Default and source options" should "fetch default and source files" in { + val fetchOpt = FetchOptions( + common = CommonOptions(), + default = Some(true), + sources = true + ) + val fetch = Fetch(fetchOpt, RemainingArgs(Seq("junit:junit:4.12"), Seq())) + assert(fetch.files0.map(_.getName).toSet.equals(Set( + "junit-4.12.jar", + "junit-4.12-sources.jar", + "hamcrest-core-1.3.jar", + "hamcrest-core-1.3-sources.jar" + ))) + } + "scalafmt-cli fetch" should "discover all main classes" in { val fetchOpt = FetchOptions(common = CommonOptions()) val fetch = Fetch(fetchOpt, RemainingArgs(Seq("com.geirsson:scalafmt-cli_2.12:1.4.0"), Seq())) From b0a3d1ef1a5a9388a7f5dd356b14f6716b0de6c3 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Wed, 24 Oct 2018 16:36:36 +0200 Subject: [PATCH 3/9] Move --sources / --javadoc / --default options to ArtifactOptions So that they can be taken into account from other commands --- .../src/main/scala-2.12/coursier/cli/Fetch.scala | 12 ++++++------ .../coursier/cli/options/ArtifactOptions.scala | 8 ++++++++ .../coursier/cli/options/FetchOptions.scala | 8 -------- .../coursier/cli/CliFetchIntegrationTest.scala | 15 +++++++++++---- 4 files changed, 25 insertions(+), 18 deletions(-) diff --git a/modules/cli/src/main/scala-2.12/coursier/cli/Fetch.scala b/modules/cli/src/main/scala-2.12/coursier/cli/Fetch.scala index 8ae21a3a95..48379d37e9 100644 --- a/modules/cli/src/main/scala-2.12/coursier/cli/Fetch.scala +++ b/modules/cli/src/main/scala-2.12/coursier/cli/Fetch.scala @@ -11,18 +11,18 @@ final class Fetch(options: FetchOptions, args: RemainingArgs) { val helper = new Helper(options.common, args.all, ignoreErrors = options.artifactOptions.force) - val default = options.default.getOrElse { - (!options.sources && !options.javadoc && options.common.classifier0.isEmpty) || + val default = options.artifactOptions.default.getOrElse { + (!options.artifactOptions.sources && !options.artifactOptions.javadoc && options.common.classifier0.isEmpty) || options.common.classifier0(Classifier("_")) } val files0 = helper.fetch( - sources = options.sources, - javadoc = options.javadoc, + sources = options.artifactOptions.sources, + javadoc = options.artifactOptions.javadoc, default = default, artifactTypes = options.artifactOptions.artifactTypes( - options.sources || options.common.classifier0(Classifier.sources), - options.javadoc || options.common.classifier0(Classifier.javadoc), + options.artifactOptions.sources || options.common.classifier0(Classifier.sources), + options.artifactOptions.javadoc || options.common.classifier0(Classifier.javadoc), default ) ) diff --git a/modules/cli/src/main/scala-2.12/coursier/cli/options/ArtifactOptions.scala b/modules/cli/src/main/scala-2.12/coursier/cli/options/ArtifactOptions.scala index 50a89f4916..711f2e4ea7 100644 --- a/modules/cli/src/main/scala-2.12/coursier/cli/options/ArtifactOptions.scala +++ b/modules/cli/src/main/scala-2.12/coursier/cli/options/ArtifactOptions.scala @@ -11,6 +11,14 @@ object ArtifactOptions { } final case class ArtifactOptions( + @Help("Fetch source artifacts") + @Short("S") + sources: Boolean = false, + @Help("Fetch javadoc artifacts") + @Short("D") + javadoc: Boolean = false, + @Help("Fetch default artifacts (default: false if --sources or --javadoc or --classifier are passed, true else)") + default: Option[Boolean] = None, @Help("Artifact types that should be retained (e.g. jar, src, doc, etc.) - defaults to jar,bundle") @Value("type1,type2,...") @Short("A") diff --git a/modules/cli/src/main/scala-2.12/coursier/cli/options/FetchOptions.scala b/modules/cli/src/main/scala-2.12/coursier/cli/options/FetchOptions.scala index 19bb2e9804..3e5a94a10c 100644 --- a/modules/cli/src/main/scala-2.12/coursier/cli/options/FetchOptions.scala +++ b/modules/cli/src/main/scala-2.12/coursier/cli/options/FetchOptions.scala @@ -3,14 +3,6 @@ package coursier.cli.options import caseapp.{ HelpMessage => Help, ExtraName => Short, _ } final case class FetchOptions( - @Help("Fetch source artifacts") - @Short("S") - sources: Boolean = false, - @Help("Fetch javadoc artifacts") - @Short("D") - javadoc: Boolean = false, - @Help("Fetch default artifacts (default: false if --sources or --javadoc or --classifier are passed, true else)") - default: Option[Boolean] = None, @Help("Print java -cp compatible output") @Short("p") classpath: Boolean = false, diff --git a/modules/cli/src/test/scala-2.12/coursier/cli/CliFetchIntegrationTest.scala b/modules/cli/src/test/scala-2.12/coursier/cli/CliFetchIntegrationTest.scala index 6c530c63d3..91696ac3d0 100644 --- a/modules/cli/src/test/scala-2.12/coursier/cli/CliFetchIntegrationTest.scala +++ b/modules/cli/src/test/scala-2.12/coursier/cli/CliFetchIntegrationTest.scala @@ -55,9 +55,12 @@ class CliFetchIntegrationTest extends FlatSpec with CliTestLib with Matchers { val commonOpt = CommonOptions( classifier = List("_") ) + val artifactOpt = ArtifactOptions( + sources = true + ) val fetchOpt = FetchOptions( common = commonOpt, - sources = true + artifactOptions = artifactOpt ) val fetch = Fetch(fetchOpt, RemainingArgs(Seq("junit:junit:4.12"), Seq())) assert(fetch.files0.map(_.getName).toSet.equals(Set( @@ -69,11 +72,14 @@ class CliFetchIntegrationTest extends FlatSpec with CliTestLib with Matchers { } "Default and source options" should "fetch default and source files" in { - val fetchOpt = FetchOptions( - common = CommonOptions(), + val artifactOpt = ArtifactOptions( default = Some(true), sources = true ) + val fetchOpt = FetchOptions( + common = CommonOptions(), + artifactOptions = artifactOpt + ) val fetch = Fetch(fetchOpt, RemainingArgs(Seq("junit:junit:4.12"), Seq())) assert(fetch.files0.map(_.getName).toSet.equals(Set( "junit-4.12.jar", @@ -722,7 +728,8 @@ class CliFetchIntegrationTest extends FlatSpec with CliTestLib with Matchers { "classifier sources" should "fetch sources jar" in withFile() { (jsonFile, _) => { val commonOpt = CommonOptions(jsonOutputFile = jsonFile.getPath) - val fetchOpt = FetchOptions(common = commonOpt, sources=true) + val artifactOpt = ArtifactOptions(sources = true) + val fetchOpt = FetchOptions(common = commonOpt, artifactOptions = artifactOpt) // encode path to different jar than requested From ebf4ce3f4538fed596981a3ece2dde6195c71835 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Wed, 24 Oct 2018 16:41:47 +0200 Subject: [PATCH 4/9] Move some helper methods around --- .../main/scala-2.12/coursier/cli/Fetch.scala | 11 ++--------- .../cli/options/ArtifactOptions.scala | 19 +++++++++++++------ 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/modules/cli/src/main/scala-2.12/coursier/cli/Fetch.scala b/modules/cli/src/main/scala-2.12/coursier/cli/Fetch.scala index 48379d37e9..6d1a9a7823 100644 --- a/modules/cli/src/main/scala-2.12/coursier/cli/Fetch.scala +++ b/modules/cli/src/main/scala-2.12/coursier/cli/Fetch.scala @@ -11,20 +11,13 @@ final class Fetch(options: FetchOptions, args: RemainingArgs) { val helper = new Helper(options.common, args.all, ignoreErrors = options.artifactOptions.force) - val default = options.artifactOptions.default.getOrElse { - (!options.artifactOptions.sources && !options.artifactOptions.javadoc && options.common.classifier0.isEmpty) || - options.common.classifier0(Classifier("_")) - } + val default = options.artifactOptions.default0(options.common.classifier0) val files0 = helper.fetch( sources = options.artifactOptions.sources, javadoc = options.artifactOptions.javadoc, default = default, - artifactTypes = options.artifactOptions.artifactTypes( - options.artifactOptions.sources || options.common.classifier0(Classifier.sources), - options.artifactOptions.javadoc || options.common.classifier0(Classifier.javadoc), - default - ) + artifactTypes = options.artifactOptions.artifactTypes(options.common.classifier0) ) } diff --git a/modules/cli/src/main/scala-2.12/coursier/cli/options/ArtifactOptions.scala b/modules/cli/src/main/scala-2.12/coursier/cli/options/ArtifactOptions.scala index 711f2e4ea7..503f49f145 100644 --- a/modules/cli/src/main/scala-2.12/coursier/cli/options/ArtifactOptions.scala +++ b/modules/cli/src/main/scala-2.12/coursier/cli/options/ArtifactOptions.scala @@ -1,7 +1,7 @@ package coursier.cli.options import caseapp.{ExtraName => Short, HelpMessage => Help, ValueDescription => Value, _} -import coursier.core.{Resolution, Type} +import coursier.core.{Classifier, Resolution, Type} object ArtifactOptions { def defaultArtifactTypes = Resolution.defaultTypes @@ -26,9 +26,16 @@ final case class ArtifactOptions( @Help("Fetch artifacts even if the resolution is errored") force: Boolean = false ) { + + def default0(classifiers: Set[Classifier]): Boolean = + default.getOrElse { + (!sources && !javadoc && classifiers.isEmpty) || + classifiers(Classifier("_")) + } + def artifactTypes(): Set[Type] = - artifactTypes(sources = false, javadoc = false, default = true) - def artifactTypes(sources: Boolean, javadoc: Boolean, default: Boolean): Set[Type] = { + artifactTypes(Set()) + def artifactTypes(classifiers: Set[Classifier]): Set[Type] = { val types0 = artifactType .flatMap(_.split(',')) @@ -37,9 +44,9 @@ final case class ArtifactOptions( .toSet if (types0.isEmpty) { - val sourceTypes = Some(Type.source).filter(_ => sources).toSet - val javadocTypes = Some(Type.doc).filter(_ => javadoc).toSet - val defaultTypes = if (default) ArtifactOptions.defaultArtifactTypes else Set() + val sourceTypes = Some(Type.source).filter(_ => sources || classifiers(Classifier.sources)).toSet + val javadocTypes = Some(Type.doc).filter(_ => javadoc || classifiers(Classifier.javadoc)).toSet + val defaultTypes = if (default0(classifiers)) ArtifactOptions.defaultArtifactTypes else Set() sourceTypes ++ javadocTypes ++ defaultTypes } else if (types0(Type("*"))) Set(Type("*")) From 345492b60c8885afe711eb6adca35da2ffe1e448 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Wed, 24 Oct 2018 16:43:50 +0200 Subject: [PATCH 5/9] Allow to add classifier artifacts in bootstraps Source JARs in particular --- .../scala-2.12/coursier/cli/Bootstrap.scala | 16 ++-- .../cli/CliBootstrapIntegrationTest.scala | 90 +++++++++++++------ scripts/generate-launcher.sh | 1 + 3 files changed, 71 insertions(+), 36 deletions(-) diff --git a/modules/cli/src/main/scala-2.12/coursier/cli/Bootstrap.scala b/modules/cli/src/main/scala-2.12/coursier/cli/Bootstrap.scala index 2eb868ad4d..7dc9c0019f 100644 --- a/modules/cli/src/main/scala-2.12/coursier/cli/Bootstrap.scala +++ b/modules/cli/src/main/scala-2.12/coursier/cli/Bootstrap.scala @@ -25,10 +25,10 @@ object Bootstrap extends CaseApp[BootstrapOptions] { ): Unit = { val files = helper.fetch( - sources = false, - javadoc = false, - default = true, - artifactTypes = options.artifactOptions.artifactTypes() + sources = options.artifactOptions.sources, + javadoc = options.artifactOptions.javadoc, + default = options.artifactOptions.default0(options.options.common.classifier0), + artifactTypes = options.artifactOptions.artifactTypes(options.options.common.classifier0) ) val log: String => Unit = @@ -353,10 +353,10 @@ object Bootstrap extends CaseApp[BootstrapOptions] { val (urls, files) = helper.fetchMap( - sources = false, - javadoc = false, - default = true, - artifactTypes = options.artifactOptions.artifactTypes() + sources = options.artifactOptions.sources, + javadoc = options.artifactOptions.javadoc, + default = options.artifactOptions.default0(options.options.common.classifier0), + artifactTypes = options.artifactOptions.artifactTypes(options.options.common.classifier0) ).toList.foldLeft((List.empty[String], List.empty[File])){ case ((urls, files), (url, file)) => if (options.options.assembly || options.options.standalone) (urls, file :: files) diff --git a/modules/cli/src/test/scala-2.12/coursier/cli/CliBootstrapIntegrationTest.scala b/modules/cli/src/test/scala-2.12/coursier/cli/CliBootstrapIntegrationTest.scala index 0913391843..00b77e6bba 100644 --- a/modules/cli/src/test/scala-2.12/coursier/cli/CliBootstrapIntegrationTest.scala +++ b/modules/cli/src/test/scala-2.12/coursier/cli/CliBootstrapIntegrationTest.scala @@ -17,18 +17,37 @@ import org.scalatest.junit.JUnitRunner @RunWith(classOf[JUnitRunner]) class CliBootstrapIntegrationTest extends FlatSpec with CliTestLib { - "bootstrap" should "not add POMs to the classpath" in withFile() { + private def zipEntryContent(zis: ZipInputStream, path: String): Array[Byte] = { + val e = zis.getNextEntry + if (e == null) + throw new NoSuchElementException(s"Entry $path in zip file") + else if (e.getName == path) + coursier.internal.FileUtil.readFully(zis) + else + zipEntryContent(zis, path) + } + + private def actualContent(file: File) = { - def zipEntryContent(zis: ZipInputStream, path: String): Array[Byte] = { - val e = zis.getNextEntry - if (e == null) - throw new NoSuchElementException(s"Entry $path in zip file") - else if (e.getName == path) - coursier.internal.FileUtil.readFully(zis) - else - zipEntryContent(zis, path) + var fis: InputStream = null + + val content = try { + fis = new FileInputStream(file) + coursier.internal.FileUtil.readFully(fis) + } finally { + if (fis != null) fis.close() } + val header = Seq[Byte](0x50, 0x4b, 0x03, 0x04) + val idx = content.indexOfSlice(header) + if (idx < 0) + throw new Exception(s"ZIP header not found in ${file.getPath}") + else + content.drop(idx) + } + + "bootstrap" should "not add POMs to the classpath" in withFile() { + (bootstrapFile, _) => val repositoryOpt = RepositoryOptions(repository = List("bintray:scalameta/maven")) val artifactOptions = ArtifactOptions() @@ -52,25 +71,7 @@ class CliBootstrapIntegrationTest extends FlatSpec with CliTestLib { RemainingArgs(Seq("com.geirsson:scalafmt-cli_2.12:1.4.0"), Seq()) ) - var fis: InputStream = null - - val content = try { - fis = new FileInputStream(bootstrapFile) - coursier.internal.FileUtil.readFully(fis) - } finally { - if (fis != null) fis.close() - } - - val actualContent = { - val header = Seq[Byte](0x50, 0x4b, 0x03, 0x04) - val idx = content.indexOfSlice(header) - if (idx < 0) - throw new Exception(s"ZIP header not found in ${bootstrapFile.getPath}") - else - content.drop(idx) - } - - val zis = new ZipInputStream(new ByteArrayInputStream(actualContent)) + val zis = new ZipInputStream(new ByteArrayInputStream(actualContent(bootstrapFile))) val lines = new String(zipEntryContent(zis, "bootstrap-isolation-foo-jar-urls"), UTF_8).lines.toVector @@ -86,4 +87,37 @@ class CliBootstrapIntegrationTest extends FlatSpec with CliTestLib { assert(extensions == Set("jar")) } + + "bootstrap" should "add standard and source JARs to the classpath" in withFile() { + + (bootstrapFile, _) => + val repositoryOpt = RepositoryOptions(repository = List("bintray:scalameta/maven")) + val artifactOptions = ArtifactOptions( + sources = true, + default = Some(true) + ) + val common = CommonOptions( + repositoryOptions = repositoryOpt + ) + val bootstrapSpecificOptions = BootstrapSpecificOptions( + output = bootstrapFile.getPath, + force = true, + common = common + ) + val bootstrapOptions = BootstrapOptions(artifactOptions, bootstrapSpecificOptions) + + Bootstrap.run( + bootstrapOptions, + RemainingArgs(Seq("com.geirsson:scalafmt-cli_2.12:1.4.0"), Seq()) + ) + + val zis = new ZipInputStream(new ByteArrayInputStream(actualContent(bootstrapFile))) + + val lines = new String(zipEntryContent(zis, "bootstrap-jar-urls"), UTF_8) + .lines + .toVector + + assert(lines.exists(_.endsWith("/scalaparse_2.12-0.4.2.jar"))) + assert(lines.exists(_.endsWith("/scalaparse_2.12-0.4.2-sources.jar"))) + } } diff --git a/scripts/generate-launcher.sh b/scripts/generate-launcher.sh index 9e7dedf26c..c1d5c94201 100755 --- a/scripts/generate-launcher.sh +++ b/scripts/generate-launcher.sh @@ -16,6 +16,7 @@ fi "$SBTPACK_LAUNCHER" bootstrap \ --intransitive "io.get-coursier::coursier-cli:$ACTUAL_VERSION" \ --classifier standalone \ + -A jar \ -J "-noverify" \ --no-default \ -r central \ From 00638a4982922191e7bc83aad33586618d44f4c7 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Wed, 24 Oct 2018 17:22:58 +0200 Subject: [PATCH 6/9] Disable -S and -D short options for --sources and --javadoc The first one now conflicts with --native in the bootstrap options, and the second one with the Java property handling. --- .../main/scala-2.12/coursier/cli/options/ArtifactOptions.scala | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/cli/src/main/scala-2.12/coursier/cli/options/ArtifactOptions.scala b/modules/cli/src/main/scala-2.12/coursier/cli/options/ArtifactOptions.scala index 503f49f145..8d0d89a41b 100644 --- a/modules/cli/src/main/scala-2.12/coursier/cli/options/ArtifactOptions.scala +++ b/modules/cli/src/main/scala-2.12/coursier/cli/options/ArtifactOptions.scala @@ -12,10 +12,8 @@ object ArtifactOptions { final case class ArtifactOptions( @Help("Fetch source artifacts") - @Short("S") sources: Boolean = false, @Help("Fetch javadoc artifacts") - @Short("D") javadoc: Boolean = false, @Help("Fetch default artifacts (default: false if --sources or --javadoc or --classifier are passed, true else)") default: Option[Boolean] = None, From 136423b1ff51c65922c01e0d779fad1dca225ba6 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Wed, 24 Oct 2018 17:24:06 +0200 Subject: [PATCH 7/9] Switch to latest case-app --- project/Deps.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Deps.scala b/project/Deps.scala index b94bd0d063..474eeeae24 100644 --- a/project/Deps.scala +++ b/project/Deps.scala @@ -12,7 +12,7 @@ object Deps { def jsoup = "org.jsoup" % "jsoup" % "1.10.3" def scalaXml = "org.scala-lang.modules" %% "scala-xml" % "1.1.0" def scalazConcurrent = "org.scalaz" %% "scalaz-concurrent" % SharedVersions.scalaz - def caseApp = "com.github.alexarchambault" %% "case-app" % "2.0.0-M3" + def caseApp = "com.github.alexarchambault" %% "case-app" % "2.0.0-M5" def okhttpUrlConnection = "com.squareup.okhttp" % "okhttp-urlconnection" % "2.7.5" def argonautShapeless = "com.github.alexarchambault" %% "argonaut-shapeless_6.2" % "1.2.0-M8" def scalatest = "org.scalatest" %% "scalatest" % "3.0.5" From 2cc187040baec7e24dd1ed2eca77297162a30ccb Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Wed, 24 Oct 2018 18:11:40 +0200 Subject: [PATCH 8/9] Ensure bootstrap with classloader isolation don't duplicate JARs in the classpath --- .../scala-2.12/coursier/cli/Bootstrap.scala | 22 +++++++++---------- .../cli/CliBootstrapIntegrationTest.scala | 13 ++++++++--- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/modules/cli/src/main/scala-2.12/coursier/cli/Bootstrap.scala b/modules/cli/src/main/scala-2.12/coursier/cli/Bootstrap.scala index 7dc9c0019f..112a29f9ff 100644 --- a/modules/cli/src/main/scala-2.12/coursier/cli/Bootstrap.scala +++ b/modules/cli/src/main/scala-2.12/coursier/cli/Bootstrap.scala @@ -160,8 +160,8 @@ object Bootstrap extends CaseApp[BootstrapOptions] { val isolatedDeps = options.options.isolated.isolatedDeps(options.options.common.resolutionOptions.scalaVersion) - val (_, isolatedArtifactFiles) = - options.options.isolated.targets.foldLeft((Vector.empty[String], Map.empty[String, (Seq[String], Seq[File])])) { + val (done, isolatedArtifactFiles) = + options.options.isolated.targets.foldLeft((Set.empty[String], Map.empty[String, (Seq[String], Seq[File])])) { case ((done, acc), target) => // TODO Add non regression test checking that optional artifacts indeed land in the isolated loader URLs @@ -174,14 +174,14 @@ object Bootstrap extends CaseApp[BootstrapOptions] { subset = isolatedDeps.getOrElse(target, Seq.empty).toSet ) - val (done0, subUrls, subFiles) = - if (options.options.standalone) { - val subFiles0 = m.values.toSeq - (done, Nil, subFiles0) - } else { - val filteredSubArtifacts = m.keys.toSeq.diff(done) - (done ++ filteredSubArtifacts, filteredSubArtifacts, Nil) - } + val m0 = m.filterKeys(url => !done(url)) + val done0 = done ++ m0.keys + + val (subUrls, subFiles) = + if (options.options.standalone) + (Nil, m0.values.toSeq) + else + (m0.keys.toSeq, Nil) val updatedAcc = acc + (target -> (subUrls, subFiles)) @@ -223,7 +223,7 @@ object Bootstrap extends CaseApp[BootstrapOptions] { outputZip.closeEntry() } - putStringEntry("bootstrap-jar-urls", urls.mkString("\n")) + putStringEntry("bootstrap-jar-urls", urls.filterNot(done).mkString("\n")) if (options.options.isolated.anyIsolatedDep) { putStringEntry("bootstrap-isolation-ids", options.options.isolated.targets.mkString("\n")) diff --git a/modules/cli/src/test/scala-2.12/coursier/cli/CliBootstrapIntegrationTest.scala b/modules/cli/src/test/scala-2.12/coursier/cli/CliBootstrapIntegrationTest.scala index 00b77e6bba..3148814c1c 100644 --- a/modules/cli/src/test/scala-2.12/coursier/cli/CliBootstrapIntegrationTest.scala +++ b/modules/cli/src/test/scala-2.12/coursier/cli/CliBootstrapIntegrationTest.scala @@ -71,11 +71,18 @@ class CliBootstrapIntegrationTest extends FlatSpec with CliTestLib { RemainingArgs(Seq("com.geirsson:scalafmt-cli_2.12:1.4.0"), Seq()) ) - val zis = new ZipInputStream(new ByteArrayInputStream(actualContent(bootstrapFile))) + def zis = new ZipInputStream(new ByteArrayInputStream(actualContent(bootstrapFile))) + + val fooLines = new String(zipEntryContent(zis, "bootstrap-isolation-foo-jar-urls"), UTF_8).lines.toVector + val lines = new String(zipEntryContent(zis, "bootstrap-jar-urls"), UTF_8).lines.toVector + + assert(fooLines.exists(_.endsWith("/scalaparse_2.12-0.4.2.jar"))) + assert(!lines.exists(_.endsWith("/scalaparse_2.12-0.4.2.jar"))) - val lines = new String(zipEntryContent(zis, "bootstrap-isolation-foo-jar-urls"), UTF_8).lines.toVector + assert(!fooLines.exists(_.endsWith("/scalameta_2.12-1.7.0.jar"))) + assert(lines.exists(_.endsWith("/scalameta_2.12-1.7.0.jar"))) - val extensions = lines + val extensions = fooLines .map { l => val idx = l.lastIndexOf('.') if (idx < 0) From d3bf181785403609ebdaf89d31c823403a5ac77a Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Wed, 24 Oct 2018 18:18:00 +0200 Subject: [PATCH 9/9] Take classifiers into account for bootstraps with classloader isolation --- .../scala-2.12/coursier/cli/Bootstrap.scala | 8 +-- .../cli/CliBootstrapIntegrationTest.scala | 50 +++++++++++++++++++ 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/modules/cli/src/main/scala-2.12/coursier/cli/Bootstrap.scala b/modules/cli/src/main/scala-2.12/coursier/cli/Bootstrap.scala index 112a29f9ff..051f532827 100644 --- a/modules/cli/src/main/scala-2.12/coursier/cli/Bootstrap.scala +++ b/modules/cli/src/main/scala-2.12/coursier/cli/Bootstrap.scala @@ -167,10 +167,10 @@ object Bootstrap extends CaseApp[BootstrapOptions] { // TODO Add non regression test checking that optional artifacts indeed land in the isolated loader URLs val m = helper.fetchMap( - sources = false, - javadoc = false, - default = true, - artifactTypes = options.artifactOptions.artifactTypes(), + sources = options.artifactOptions.sources, + javadoc = options.artifactOptions.javadoc, + default = options.artifactOptions.default0(options.options.common.classifier0), + artifactTypes = options.artifactOptions.artifactTypes(options.options.common.classifier0), subset = isolatedDeps.getOrElse(target, Seq.empty).toSet ) diff --git a/modules/cli/src/test/scala-2.12/coursier/cli/CliBootstrapIntegrationTest.scala b/modules/cli/src/test/scala-2.12/coursier/cli/CliBootstrapIntegrationTest.scala index 3148814c1c..c0f3e950b0 100644 --- a/modules/cli/src/test/scala-2.12/coursier/cli/CliBootstrapIntegrationTest.scala +++ b/modules/cli/src/test/scala-2.12/coursier/cli/CliBootstrapIntegrationTest.scala @@ -82,6 +82,12 @@ class CliBootstrapIntegrationTest extends FlatSpec with CliTestLib { assert(!fooLines.exists(_.endsWith("/scalameta_2.12-1.7.0.jar"))) assert(lines.exists(_.endsWith("/scalameta_2.12-1.7.0.jar"))) + // checking that there are no sources just in caseā€¦ + assert(!fooLines.exists(_.endsWith("/scalaparse_2.12-0.4.2-sources.jar"))) + assert(!lines.exists(_.endsWith("/scalaparse_2.12-0.4.2-sources.jar"))) + assert(!fooLines.exists(_.endsWith("/scalameta_2.12-1.7.0-sources.jar"))) + assert(!lines.exists(_.endsWith("/scalameta_2.12-1.7.0-sources.jar"))) + val extensions = fooLines .map { l => val idx = l.lastIndexOf('.') @@ -127,4 +133,48 @@ class CliBootstrapIntegrationTest extends FlatSpec with CliTestLib { assert(lines.exists(_.endsWith("/scalaparse_2.12-0.4.2.jar"))) assert(lines.exists(_.endsWith("/scalaparse_2.12-0.4.2-sources.jar"))) } + + "bootstrap" should "add standard and source JARs to the classpath with classloader isolation" in withFile() { + + (bootstrapFile, _) => + val repositoryOpt = RepositoryOptions(repository = List("bintray:scalameta/maven")) + val artifactOptions = ArtifactOptions( + sources = true, + default = Some(true) + ) + val common = CommonOptions( + repositoryOptions = repositoryOpt + ) + val isolatedLoaderOptions = IsolatedLoaderOptions( + isolateTarget = List("foo"), + isolated = List("foo:org.scalameta:trees_2.12:1.7.0") + ) + val bootstrapSpecificOptions = BootstrapSpecificOptions( + output = bootstrapFile.getPath, + isolated = isolatedLoaderOptions, + force = true, + common = common + ) + val bootstrapOptions = BootstrapOptions(artifactOptions, bootstrapSpecificOptions) + + Bootstrap.run( + bootstrapOptions, + RemainingArgs(Seq("com.geirsson:scalafmt-cli_2.12:1.4.0"), Seq()) + ) + + def zis = new ZipInputStream(new ByteArrayInputStream(actualContent(bootstrapFile))) + + val fooLines = new String(zipEntryContent(zis, "bootstrap-isolation-foo-jar-urls"), UTF_8).lines.toVector + val lines = new String(zipEntryContent(zis, "bootstrap-jar-urls"), UTF_8).lines.toVector + + assert(fooLines.exists(_.endsWith("/scalaparse_2.12-0.4.2.jar"))) + assert(fooLines.exists(_.endsWith("/scalaparse_2.12-0.4.2-sources.jar"))) + assert(!lines.exists(_.endsWith("/scalaparse_2.12-0.4.2.jar"))) + assert(!lines.exists(_.endsWith("/scalaparse_2.12-0.4.2-sources.jar"))) + + assert(!fooLines.exists(_.endsWith("/scalameta_2.12-1.7.0.jar"))) + assert(!fooLines.exists(_.endsWith("/scalameta_2.12-1.7.0-sources.jar"))) + assert(lines.exists(_.endsWith("/scalameta_2.12-1.7.0.jar"))) + assert(lines.exists(_.endsWith("/scalameta_2.12-1.7.0-sources.jar"))) + } }