From facf76eb20b558a3a44a9bf21b78ccd7c12192b8 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Sat, 20 Feb 2016 15:53:09 +0100 Subject: [PATCH 1/8] Automatically publish the proguarded JAR --- build.sbt | 44 ++++++++++++++++++- .../scala-2.10/coursier/cli/Coursier.scala | 6 +++ 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 cli/src/main/scala-2.10/coursier/cli/Coursier.scala diff --git a/build.sbt b/build.sbt index 1816ce648..2d78c84bb 100644 --- a/build.sbt +++ b/build.sbt @@ -266,7 +266,49 @@ lazy val cli = project "-keep class coursier.cli.IsolatedClassLoader {\n public java.lang.String[] getIsolationTargets();\n}" ), javaOptions in (Proguard, ProguardKeys.proguard) := Seq("-Xmx3172M"), - artifactPath in Proguard := (ProguardKeys.proguardDirectory in Proguard).value / "coursier-standalone.jar" + artifactPath in Proguard := (ProguardKeys.proguardDirectory in Proguard).value / "coursier-standalone.jar", + artifacts ++= { + if (scalaBinaryVersion.value == "2.10") + Nil + else Seq( + Artifact( + moduleName.value, + "jar", + "jar", + "standalone" + ) + ) + }, + packagedArtifacts <++= { + ( + moduleName, + scalaBinaryVersion, + ProguardKeys.proguard in Proguard + ).map { + (mod, sbv, files) => + if (sbv == "2.10") + Map.empty[Artifact, File] + else { + val f = files match { + case Seq(f) => f + case Seq() => + throw new Exception("Found no proguarded files. Expected one.") + case _ => + throw new Exception("Found several proguarded files. Don't know how to publish all of them.") + } + + Map( + // FIXME Same Artifact as above + Artifact( + mod, + "jar", + "jar", + "standalone" + ) -> f + ) + } + } + } ) lazy val web = project diff --git a/cli/src/main/scala-2.10/coursier/cli/Coursier.scala b/cli/src/main/scala-2.10/coursier/cli/Coursier.scala new file mode 100644 index 000000000..1f106cc1a --- /dev/null +++ b/cli/src/main/scala-2.10/coursier/cli/Coursier.scala @@ -0,0 +1,6 @@ +package coursier.cli + +// dummy app to keep proguard quiet in 2.10 +object Coursier { + def main(args: Array[String]): Unit = {} +} From 6830bc14cfe61742b8e8c319fea59775c0d003ef Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Sat, 20 Feb 2016 15:53:09 +0100 Subject: [PATCH 2/8] Handle extra SBT artifacts --- .../src/main/scala-2.10/coursier/Tasks.scala | 61 +++++++++++++------ 1 file changed, 44 insertions(+), 17 deletions(-) diff --git a/plugin/src/main/scala-2.10/coursier/Tasks.scala b/plugin/src/main/scala-2.10/coursier/Tasks.scala index 5790e0a25..78eb8d7a7 100644 --- a/plugin/src/main/scala-2.10/coursier/Tasks.scala +++ b/plugin/src/main/scala-2.10/coursier/Tasks.scala @@ -70,8 +70,9 @@ object Tasks { sbt.Keys.thisProjectRef, sbt.Keys.projectID, sbt.Keys.scalaVersion, - sbt.Keys.scalaBinaryVersion - ).map { (state, projectRef, projId, sv, sbv) => + sbt.Keys.scalaBinaryVersion, + sbt.Keys.ivyConfigurations + ).map { (state, projectRef, projId, sv, sbv, ivyConfs) => val packageTasks = Seq(packageBin, packageSrc, packageDoc) val configs = Seq(Compile, Test) @@ -89,24 +90,50 @@ object Tasks { None } - sbtArtifacts.collect { - case Some((config, artifact)) => - val name = FromSbt.sbtCrossVersionName( - artifact.name, - projId.crossVersion, - sv, - sbv - ) + def artifactPublication(artifact: sbt.Artifact) = { - val publication = Publication( - name, - artifact.`type`, - artifact.extension, - artifact.classifier.getOrElse("") - ) + val name = FromSbt.sbtCrossVersionName( + artifact.name, + projId.crossVersion, + sv, + sbv + ) - config -> publication + Publication( + name, + artifact.`type`, + artifact.extension, + artifact.classifier.getOrElse("") + ) } + + val sbtArtifactsPublication = sbtArtifacts.collect { + case Some((config, artifact)) => + config -> artifactPublication(artifact) + } + + val stdArtifactsSet = sbtArtifacts.flatMap(_.map { case (_, a) => a }.toSeq).toSet + + // Second-way of getting artifacts from SBT + // No obvious way of getting the corresponding publishArtifact value for the ones + // only here, it seems. + val extraSbtArtifacts = Option(artifacts.in(projectRef).getOrElse(state, null)) + .toSeq + .flatten + .filterNot(stdArtifactsSet) + + // Seems that SBT does that - if an artifact has no configs, + // it puts it in all of them. See for example what happens to + // the standalone JAR artifact of the coursier cli module. + def allConfigsIfEmpty(configs: Iterable[sbt.Configuration]): Iterable[sbt.Configuration] = + if (configs.isEmpty) ivyConfs else configs + + val extraSbtArtifactsPublication = for { + artifact <- extraSbtArtifacts + config <- allConfigsIfEmpty(artifact.configurations) if config.isPublic + } yield config.name -> artifactPublication(artifact) + + sbtArtifactsPublication ++ extraSbtArtifactsPublication } // FIXME More things should possibly be put here too (resolvers, etc.) From ec52cb5b3e37f82d8d0a4e29a5d39c6d9ab34b11 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Sat, 20 Feb 2016 15:53:10 +0100 Subject: [PATCH 3/8] More compact publications in generated ivy.xml --- plugin/src/main/scala-2.10/coursier/MakeIvyXml.scala | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/plugin/src/main/scala-2.10/coursier/MakeIvyXml.scala b/plugin/src/main/scala-2.10/coursier/MakeIvyXml.scala index c6d836ca1..8a75ae8d9 100644 --- a/plugin/src/main/scala-2.10/coursier/MakeIvyXml.scala +++ b/plugin/src/main/scala-2.10/coursier/MakeIvyXml.scala @@ -40,9 +40,14 @@ object MakeIvyXml { n } - val publicationElems = project.publications.map { - case (conf, pub) => - var n = + val publications = project + .publications + .groupBy { case (_, p) => p } + .mapValues { _.map { case (cfg, _) => cfg } } + + val publicationElems = publications.map { + case (pub, configs) => + var n = if (pub.classifier.nonEmpty) n = n % .attributes n From f6da1277597f414891c8a0bcd61607c700249c6d Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Sat, 20 Feb 2016 15:53:10 +0100 Subject: [PATCH 4/8] Minor refactoring --- .../main/scala/coursier/maven/MavenRepository.scala | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/core/shared/src/main/scala/coursier/maven/MavenRepository.scala b/core/shared/src/main/scala/coursier/maven/MavenRepository.scala index f08bfcb97..3f7b9d57f 100644 --- a/core/shared/src/main/scala/coursier/maven/MavenRepository.scala +++ b/core/shared/src/main/scala/coursier/maven/MavenRepository.scala @@ -45,6 +45,12 @@ object MavenRepository { "test" -> Seq("runtime") ) + def defaultPublications(moduleName: String) = Seq( + "compile" -> Publication(moduleName, "jar", "jar", ""), + "docs" -> Publication(moduleName, "doc", "jar", "javadoc"), + "sources" -> Publication(moduleName, "src", "jar", "sources") + ) + def dirModuleName(module: Module, sbtAttrStub: Boolean): String = if (sbtAttrStub) { var name = module.name @@ -241,11 +247,7 @@ case class MavenRepository( proj <- Pom.project(xml) } yield proj.copy( configurations = defaultConfigurations, - publications = Seq( - "compile" -> Publication(module.name, "jar", "jar", ""), - "docs" -> Publication(module.name, "doc", "jar", "javadoc"), - "sources" -> Publication(module.name, "src", "jar", "sources") - ) + publications = defaultPublications(module.name) )): (String \/ Project) } } From 1d58d8d453eca70e13c29885410cf84ca251f78b Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Sat, 20 Feb 2016 15:53:10 +0100 Subject: [PATCH 5/8] Allow for non default classifiers to be given a try from Maven repositories TODO Add test with the standalone classifier on coursier-cli once coursier 1.0.0-M8 is released --- .../main/scala/coursier/maven/MavenSource.scala | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/core/shared/src/main/scala/coursier/maven/MavenSource.scala b/core/shared/src/main/scala/coursier/maven/MavenSource.scala index 583f28072..bc0556459 100644 --- a/core/shared/src/main/scala/coursier/maven/MavenSource.scala +++ b/core/shared/src/main/scala/coursier/maven/MavenSource.scala @@ -79,10 +79,23 @@ case class MavenSource( overrideClassifiers match { case Some(classifiers) => val classifiersSet = classifiers.toSet - project.publications.collect { + val publications = project.publications.collect { case (_, p) if classifiersSet(p.classifier) => - artifactOf(dependency.module, p) + p } + + val publications0 = + if (publications.isEmpty) + classifiers.map { classifier => + Publication(dependency.module.name, "jar", "jar", classifier) + } + else + publications + + publications0.map { p => + artifactOf(dependency.module, p) + } + case None => Seq( artifactOf( From 80807f4d9322b56ca26b935d2f25b1eaa1225ce3 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Sat, 20 Feb 2016 15:53:10 +0100 Subject: [PATCH 6/8] Add --intransitive option --- cli/src/main/scala-2.11/coursier/cli/Coursier.scala | 2 ++ cli/src/main/scala-2.11/coursier/cli/Helper.scala | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/cli/src/main/scala-2.11/coursier/cli/Coursier.scala b/cli/src/main/scala-2.11/coursier/cli/Coursier.scala index 901842efb..2d6747ffd 100644 --- a/cli/src/main/scala-2.11/coursier/cli/Coursier.scala +++ b/cli/src/main/scala-2.11/coursier/cli/Coursier.scala @@ -48,6 +48,8 @@ case class CommonOptions( @Value("organization:name") @Short("E") exclude: List[String], + @Help("Consider provided dependencies to be intransitive. Applies to all the provided dependencies.") + intransitive: Boolean, @Help("Maximum number of parallel downloads (default: 6)") @Short("n") parallel: Int = 6, diff --git a/cli/src/main/scala-2.11/coursier/cli/Helper.scala b/cli/src/main/scala-2.11/coursier/cli/Helper.scala index ab785404a..a5cca7ad6 100644 --- a/cli/src/main/scala-2.11/coursier/cli/Helper.scala +++ b/cli/src/main/scala-2.11/coursier/cli/Helper.scala @@ -169,7 +169,8 @@ class Helper( module, version, configuration = "default(compile)", - exclusions = excludes + exclusions = excludes, + transitive = !intransitive ) } From bccffaab6de32bdfed9f327f73ae3b4bd34bc17b Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Sat, 20 Feb 2016 15:53:11 +0100 Subject: [PATCH 7/8] Add --classifier option --- cli/src/main/scala-2.11/coursier/cli/Coursier.scala | 5 +++++ cli/src/main/scala-2.11/coursier/cli/Helper.scala | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/cli/src/main/scala-2.11/coursier/cli/Coursier.scala b/cli/src/main/scala-2.11/coursier/cli/Coursier.scala index 2d6747ffd..687069a06 100644 --- a/cli/src/main/scala-2.11/coursier/cli/Coursier.scala +++ b/cli/src/main/scala-2.11/coursier/cli/Coursier.scala @@ -50,6 +50,10 @@ case class CommonOptions( exclude: List[String], @Help("Consider provided dependencies to be intransitive. Applies to all the provided dependencies.") intransitive: Boolean, + @Help("Classifiers that should be fetched") + @Value("classifier1,classifier2,...") + @Short("C") + classifier: List[String], @Help("Maximum number of parallel downloads (default: 6)") @Short("n") parallel: Int = 6, @@ -60,6 +64,7 @@ case class CommonOptions( cacheOptions: CacheOptions ) { val verbose0 = verbose.length - (if (quiet) 1 else 0) + lazy val classifier0 = classifier.flatMap(_.split(',')).filter(_.nonEmpty) } case class CacheOptions( diff --git a/cli/src/main/scala-2.11/coursier/cli/Helper.scala b/cli/src/main/scala-2.11/coursier/cli/Helper.scala index a5cca7ad6..132cba5a4 100644 --- a/cli/src/main/scala-2.11/coursier/cli/Helper.scala +++ b/cli/src/main/scala-2.11/coursier/cli/Helper.scala @@ -288,14 +288,14 @@ class Helper( val res0 = Option(subset).fold(res)(res.subset) val artifacts = - if (sources || javadoc) { - var classifiers = Seq.empty[String] + if (classifier0.nonEmpty || sources || javadoc) { + var classifiers = classifier0 if (sources) classifiers = classifiers :+ "sources" if (javadoc) classifiers = classifiers :+ "javadoc" - res0.classifiersArtifacts(classifiers) + res0.classifiersArtifacts(classifiers.distinct) } else res0.artifacts From 1bf84ee3fa40257fe727accb15cd42c2481c918b Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Sat, 20 Feb 2016 16:01:46 +0100 Subject: [PATCH 8/8] Run CI only on PRs and master branch --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index c183ff96c..8dbe9edf7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,3 +25,6 @@ env: - secure: miHFMwVRD/yjOLy794nOwc2lJTMyL5O0MXABT9ksg5ejQy1FrFVc2YH86Agp80W02/lGLGl0qWCiK1TBcs9q4Apt01nkD1a/0/iuTRm//bdhnu8BbRxFITf+2cyYJVytKPsF585aHldMv1rwZs3TDaTzEEecAEki5r50yyTVo7ycG0lVj9aVWXerKRMIT54Wb8M6nqbyRB1jGWT0ETNU13vOvQznPTUXQG5hsiKnGYRf8T3umOMdOHpV0rvdwYqAIMsikaAFcYCS5P/pLXMtmRHICH9KUG8TV/ST07p1BXtbBg9y1Q+lpnXotXh4ZNoWOp8B6v7fxJ/WlLYTDROWCiHJ4s2V4Di00db/nW4OWrEEBlrh7vJ/npZqyt9V9YeNv6alxi+DCESwusgvD4Cx5c3zh+2X6RB6BYwWHlFnd80rmsLe4R4fFUcc8E/ZR9vUFjP1CsQKqfJ5yfKR6V+n8jK8FjLpoaU9PHPo2H4V3FZM/fCLcxhE37vfaYI7/O7MqE/cdGpZIuz7g3c4toWCgNZJDn8iJCPmrgcbW5zbfDxvWU2K816ycgnUwSQ5dufrJpAbLNrjR1O8EPRkMDDp9bB7/4RVQvfDfP9GGoiHPHHgxGzY0Lf5bm+Bj1mRfB5/SXHd3IjhUCD9q7eD1/ANifEYALC5BJ4TB8RhQUPU8uM= - secure: 2/SSqa7A+aIzTJrMuqfK53QoHqes8HZPpIXUC9BH+bP2V2n7LqlFCnLZ9OSFfiJYfgeYMQDILpt8GTXHYc7JgM/N9xXpywrpYNDCYo7GMhqRyUPQOuK9044IRnZmme289Ut6ozHHptZUeZp/9DEUNZcPOxTN+KbzbHrUL+9l5BxnAxJ3e0HihxhmaINrla3T36EetdfINigarB9muyvuCRdRhZjwxsSF1fo5P+ZgWvAIDhPgNJH8eyjxHVbTabk7efPtWNWu0HjyOqJaIVk+TNjuQhvQPHKpYel0gVlCAfUjq7ZP8hZurfC6NjCFcnfTZ3d4R8GDcWJ47pgBWND8saIQOigNd7KHBPntD4fEJqgBSq3ZWakNBYzOtm8CxMGmiJHDCVqAEGzUG+lowN+SnPS2UluL3QtZ7oL/7MeJqCscH7sPwHtmZY+o0Muqo0ZJ2T2TzekQNYOAE7jeSzG1xOa/NNghny5fT+w6asPxfeolkMgyzuRFp1SLaLUf/XRV4fux0meGY9NIXso47xMSfAYVAAXT1FA2OOwmM1O4yvm3Ur95oEGDNw6z7MnWOSKS663WFwuw2cCaheCfAwvoa5jZUMWMbyUM/cBTgCaQdmETpvCzZzUr5Ls/nBXjyiTdJaQLZATr7HSGZHgYVmEAhVwBvuhTar/6VUZUMKGc2P4= - secure: NmXh4uxqvvqxYvOBOiXE131HajCYhJyd9+7kc1YjllRZVYG11YLah9Np7qnRUyugNOdcBnWVQGlfDHOFe8GHQsZKt5PvsIzxszTor0GeDQOePX3L4YXPkZRJatmoJJ0COxdI6weCAWkI6Zr934RsOndT0mO55gk9c6eeXCcLdNjAJ3izGQHy5Wb2KTzwMhBfwjdTQ0s65c1rzz5dZ/JODilWfTHiHsz+4sKwWVmAvXDTjePd0X3svX775ot23QesJgtaC/p0AKSLcHg3zEjKkJJvvLooQyNn/zU/bio/UatDZWXnNMsTBfEr3qUedjoOY65g3EX/vYlbNRkF3Itk0dpuPooTFmezJASI4ZpewBS9OvPZheMmU/dy5Bx//622x7p4MHyao9IvYmSX0C92VWEd3gwkSzKCJtBEz4Csd5BaGhzeL41di6NSVx4IEiehC9191G1wk4Yj7S2t69N6OdAJEq+znQlYISF5ogCqip7PuesBMYTW4FaIgpnfW/OYP6VpWW87ohw/dz/CcTzP9MzuoM249EHNZKTfnJrmPJBRYSn+W4y9sTgGElPhY1U/NVQ+C/9Fov1kHFD25WeTDPdZe6yCczaUrcvfTDitfo6qnWf8ZW5dJMXN744idaZ25AT/SGoCzkPXMe+us5XLTAOtrbBMP8NXLMv5OtU999E= +branches: + only: + - master