From 4b3923d3e54eaed31031f2a033e412ae98fa3933 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Mon, 30 Jan 2017 22:57:24 +0100 Subject: [PATCH 01/13] Add shading plugin --- .ci/travis.sh | 24 ++ .travis.yml | 6 + appveyor.yml | 12 + build.sbt | 54 +-- .../scala-2.10/coursier/CoursierPlugin.scala | 38 ++- .../src/main/scala-2.10/coursier/Keys.scala | 5 + .../main/scala-2.10/coursier/MakeIvyXml.scala | 24 +- .../src/main/scala-2.10/coursier/Tasks.scala | 309 +++++++++++------- .../main/scala-2.10/coursier/Shading.scala | 152 +++++++++ .../scala-2.10/coursier/ShadingPlugin.scala | 97 ++++++ .../cross-project-shading/build.sbt | 20 ++ .../cross-project-shading/coursier | Bin 0 -> 11832 bytes .../jvm/src/main/scala/Main.scala | 21 ++ .../cross-project-shading/project/plugins.sbt | 33 ++ .../shared/src/main/scala/Foo.scala | 16 + .../sbt-shading/cross-project-shading/test | 10 + .../sbt-test/sbt-shading/shading/build.sbt | 10 + .../src/sbt-test/sbt-shading/shading/coursier | Bin 0 -> 11832 bytes .../sbt-shading/shading/project/plugins.sbt | 31 ++ .../shading/src/main/scala/Main.scala | 27 ++ .../src/sbt-test/sbt-shading/shading/test | 9 + .../sbt-shading/transitive-shading/build.sbt | 14 + .../sbt-shading/transitive-shading/coursier | Bin 0 -> 11832 bytes .../transitive-shading/project/plugins.sbt | 31 ++ .../src/main/scala/Main.scala | 27 ++ .../sbt-shading/transitive-shading/test | 9 + 26 files changed, 835 insertions(+), 144 deletions(-) create mode 100644 sbt-shading/src/main/scala-2.10/coursier/Shading.scala create mode 100644 sbt-shading/src/main/scala-2.10/coursier/ShadingPlugin.scala create mode 100644 sbt-shading/src/sbt-test/sbt-shading/cross-project-shading/build.sbt create mode 100755 sbt-shading/src/sbt-test/sbt-shading/cross-project-shading/coursier create mode 100644 sbt-shading/src/sbt-test/sbt-shading/cross-project-shading/jvm/src/main/scala/Main.scala create mode 100644 sbt-shading/src/sbt-test/sbt-shading/cross-project-shading/project/plugins.sbt create mode 100644 sbt-shading/src/sbt-test/sbt-shading/cross-project-shading/shared/src/main/scala/Foo.scala create mode 100644 sbt-shading/src/sbt-test/sbt-shading/cross-project-shading/test create mode 100644 sbt-shading/src/sbt-test/sbt-shading/shading/build.sbt create mode 100755 sbt-shading/src/sbt-test/sbt-shading/shading/coursier create mode 100644 sbt-shading/src/sbt-test/sbt-shading/shading/project/plugins.sbt create mode 100644 sbt-shading/src/sbt-test/sbt-shading/shading/src/main/scala/Main.scala create mode 100644 sbt-shading/src/sbt-test/sbt-shading/shading/test create mode 100644 sbt-shading/src/sbt-test/sbt-shading/transitive-shading/build.sbt create mode 100755 sbt-shading/src/sbt-test/sbt-shading/transitive-shading/coursier create mode 100644 sbt-shading/src/sbt-test/sbt-shading/transitive-shading/project/plugins.sbt create mode 100644 sbt-shading/src/sbt-test/sbt-shading/transitive-shading/src/main/scala/Main.scala create mode 100644 sbt-shading/src/sbt-test/sbt-shading/transitive-shading/test diff --git a/.ci/travis.sh b/.ci/travis.sh index 544e3214b..9a1c66ac8 100755 --- a/.ci/travis.sh +++ b/.ci/travis.sh @@ -43,9 +43,33 @@ function isMasterOrDevelop() { SBT_COMMANDS="compile test it:test" +RUN_SHADING_TESTS=0 + if echo "$TRAVIS_SCALA_VERSION" | grep -q "^2\.10"; then SBT_COMMANDS="$SBT_COMMANDS publishLocal" # to make the scripted tests happy SBT_COMMANDS="$SBT_COMMANDS plugin/scripted" + + if [ "$RUN_SHADING_TESTS" = 1 ]; then + # for the shading scripted test + sudo cp coursier /usr/local/bin/ + + JARJAR_VERSION=1.0.1-coursier-SNAPSHOT + + if [ ! -d "$HOME/.m2/repository/org/anarres/jarjar/jarjar-core/$JARJAR_VERSION" ]; then + git clone https://github.com/alexarchambault/jarjar.git + cd jarjar + if ! grep -q "^version=$JARJAR_VERSION\$" gradle.properties; then + echo "Expected jarjar version not found" 1>&2 + exit 1 + fi + git checkout 249c8dbb970f8 + ./gradlew :jarjar-core:install + cd .. + rm -rf jarjar + fi + + SBT_COMMANDS="$SBT_COMMANDS sbt-shading/scripted" + fi fi SBT_COMMANDS="$SBT_COMMANDS tut coreJVM/mimaReportBinaryIssues cache/mimaReportBinaryIssues" diff --git a/.travis.yml b/.travis.yml index 427805666..4b2fda4ff 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,3 +36,9 @@ env: branches: only: - master +cache: + directories: + - $HOME/.m2 + - $HOME/.ivy2/cache + - $HOME/.sbt +# Not adding $HOME/.coursier, we check that sbt-coursier works fine with an initially empty cache diff --git a/appveyor.yml b/appveyor.yml index 6013b49bc..c9ad467a4 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -14,6 +14,15 @@ install: - cmd: SET PATH=C:\sbt\sbt\bin;%JAVA_HOME%\bin;%PATH% - cmd: SET SBT_OPTS=-XX:MaxPermSize=2g -Xmx4g - cmd: SET COURSIER_NO_TERM=1 + # required by the sbt-shading scripted tests, disabled for now (see below) + # ps: | + # if (!(Test-Path 'C:\Users\appveyor\.m2\repository\org\anarres\jarjar\jarjar-core\1.0.1-coursier-SNAPSHOT')) { + # iex 'git clone https://github.com/alexarchambault/jarjar' + # Set-Location -Path jarjar + # iex 'git checkout 249c8dbb970f8' + # iex './gradlew.bat :jarjar-core:install' + # Set-Location -Path .. + # } build_script: - sbt ++2.11.8 clean compile coreJVM/publishLocal http-server/publishLocal - sbt ++2.10.6 clean compile @@ -23,6 +32,9 @@ test_script: - sbt ++2.12.0 testsJVM/test testsJVM/it:test # Would node be around for testsJS/test? - sbt ++2.11.8 testsJVM/test testsJVM/it:test - sbt ++2.10.6 testsJVM/test testsJVM/it:test plugin/scripted + # not running the scripted tests of sbt-shading here, as these seem to fail randomly on single core machines + # (which is kind of worrying) cache: - C:\Users\appveyor\.ivy2 + - C:\Users\appveyor\.m2 - C:\Users\appveyor\.sbt diff --git a/build.sbt b/build.sbt index b55aa8e2f..0ff75dd5a 100644 --- a/build.sbt +++ b/build.sbt @@ -107,6 +107,28 @@ lazy val commonSettings = scalaVersionAgnosticCommonSettings ++ Seq( } ) +lazy val pluginSettings = + scalaVersionAgnosticCommonSettings ++ + noPublishForScalaVersionSettings("2.11", "2.12") ++ + ScriptedPlugin.scriptedSettings ++ + Seq( + scriptedLaunchOpts ++= Seq( + "-Xmx1024M", + "-XX:MaxPermSize=256M", + "-Dplugin.version=" + version.value, + "-Dsbttest.base=" + (sourceDirectory.value / "sbt-test").getAbsolutePath + ), + scriptedBufferLog := false, + sbtPlugin := (scalaBinaryVersion.value == "2.10"), + resolvers ++= Seq( + // added so that 2.10 artifacts of the other modules can be found by + // the too-naive-for-now inter-project resolver of the coursier SBT plugin + Resolver.sonatypeRepo("snapshots"), + // added for sbt-scripted to be fine even with ++2.11.x + Resolver.typesafeIvyRepo("releases") + ) + ) + val scalazVersion = "7.2.7" lazy val core = crossProject @@ -550,28 +572,20 @@ lazy val doc = project // Don't try to compile that if you're not in 2.10 lazy val plugin = project .dependsOn(coreJvm, cache) - .settings(scalaVersionAgnosticCommonSettings) - .settings(noPublishForScalaVersionSettings("2.11", "2.12")) + .settings(pluginSettings) .settings( - name := "sbt-coursier", - sbtPlugin := (scalaBinaryVersion.value == "2.10"), - resolvers ++= Seq( - // added so that 2.10 artifacts of the other modules can be found by - // the too-naive-for-now inter-project resolver of the coursier SBT plugin - Resolver.sonatypeRepo("snapshots"), - // added for sbt-scripted to be fine even with ++2.11.x - Resolver.typesafeIvyRepo("releases") - ) + name := "sbt-coursier" ) - .settings(ScriptedPlugin.scriptedSettings) + +// Don't try to compile that if you're not in 2.10 +lazy val `sbt-shading` = project + .dependsOn(plugin) + .settings(pluginSettings) .settings( - scriptedLaunchOpts ++= Seq( - "-Xmx1024M", - "-XX:MaxPermSize=256M", - "-Dplugin.version=" + version.value, - "-Dsbttest.base=" + (sourceDirectory.value / "sbt-test").getAbsolutePath - ), - scriptedBufferLog := false + // Warning: this version doesn't handle well class names with '$'s + // (so basically any Scala library) + // See https://github.com/shevek/jarjar/pull/4 + libraryDependencies += "org.anarres.jarjar" % "jarjar-core" % "1.0.0" ) val http4sVersion = "0.8.6" @@ -606,7 +620,7 @@ lazy val okhttp = project ) lazy val `coursier` = project.in(file(".")) - .aggregate(coreJvm, coreJs, `fetch-js`, testsJvm, testsJs, cache, bootstrap, cli, plugin, web, doc, `http-server`, okhttp) + .aggregate(coreJvm, coreJs, `fetch-js`, testsJvm, testsJs, cache, bootstrap, cli, plugin, `sbt-shading`, web, doc, `http-server`, okhttp) .settings(commonSettings) .settings(noPublishSettings) .settings(releaseSettings) diff --git a/plugin/src/main/scala-2.10/coursier/CoursierPlugin.scala b/plugin/src/main/scala-2.10/coursier/CoursierPlugin.scala index dcf7378c2..0778c35f9 100644 --- a/plugin/src/main/scala-2.10/coursier/CoursierPlugin.scala +++ b/plugin/src/main/scala-2.10/coursier/CoursierPlugin.scala @@ -38,6 +38,10 @@ object CoursierPlugin extends AutoPlugin { val coursierDependencyTree = Keys.coursierDependencyTree val coursierDependencyInverseTree = Keys.coursierDependencyInverseTree + + val coursierArtifacts = Keys.coursierArtifacts + val coursierClassifiersArtifacts = Keys.coursierClassifiersArtifacts + val coursierSbtClassifiersArtifacts = Keys.coursierSbtClassifiersArtifacts } import autoImport._ @@ -51,7 +55,10 @@ object CoursierPlugin extends AutoPlugin { ) ) - override lazy val projectSettings = Seq( + def coursierSettings( + shadedConfigOpt: Option[(String, String)], + packageConfigs: Seq[(Configuration, String)] + ) = Seq( coursierParallelDownloads := 6, coursierMaxIterations := 50, coursierDefaultArtifactType := "", @@ -68,27 +75,42 @@ object CoursierPlugin extends AutoPlugin { coursierCredentials := Map.empty, coursierFallbackDependencies <<= Tasks.coursierFallbackDependenciesTask, coursierCache := Cache.default, - update <<= Tasks.updateTask(withClassifiers = false), + coursierArtifacts <<= Tasks.artifactFilesOrErrors(withClassifiers = false), + coursierClassifiersArtifacts <<= Tasks.artifactFilesOrErrors( + withClassifiers = true + ), + coursierSbtClassifiersArtifacts <<= Tasks.artifactFilesOrErrors( + withClassifiers = true, + sbtClassifiers = true + ), + update <<= Tasks.updateTask( + shadedConfigOpt, + withClassifiers = false + ), updateClassifiers <<= Tasks.updateTask( + shadedConfigOpt, withClassifiers = true, ignoreArtifactErrors = true ), updateSbtClassifiers in Defaults.TaskGlobal <<= Tasks.updateTask( + shadedConfigOpt, withClassifiers = true, sbtClassifiers = true, ignoreArtifactErrors = true ), coursierProject <<= Tasks.coursierProjectTask, coursierInterProjectDependencies <<= Tasks.coursierInterProjectDependenciesTask, - coursierPublications <<= Tasks.coursierPublicationsTask, + coursierPublications <<= Tasks.coursierPublicationsTask(packageConfigs: _*), coursierSbtClassifiersModule <<= classifiersModule in updateSbtClassifiers, - coursierConfigurations <<= Tasks.coursierConfigurationsTask, + coursierConfigurations <<= Tasks.coursierConfigurationsTask(None), coursierResolution <<= Tasks.resolutionTask(), coursierSbtClassifiersResolution <<= Tasks.resolutionTask( sbtClassifiers = true ) - ) ++ - inConfig(Compile)(treeSettings) ++ - inConfig(Test)(treeSettings) + ) -} + override lazy val projectSettings = coursierSettings(None, Seq(Compile, Test).map(c => c -> c.name)) ++ + inConfig(Compile)(treeSettings) ++ + inConfig(Test)(treeSettings) + +} \ No newline at end of file diff --git a/plugin/src/main/scala-2.10/coursier/Keys.scala b/plugin/src/main/scala-2.10/coursier/Keys.scala index e8b5c5bc7..f2c894163 100644 --- a/plugin/src/main/scala-2.10/coursier/Keys.scala +++ b/plugin/src/main/scala-2.10/coursier/Keys.scala @@ -8,6 +8,7 @@ import coursier.core.Publication import sbt.{ GetClassifiersModule, Resolver, SettingKey, TaskKey } import scala.concurrent.duration.Duration +import scalaz.\/ object Keys { val coursierParallelDownloads = SettingKey[Int]("coursier-parallel-downloads") @@ -51,4 +52,8 @@ object Keys { "coursier-dependency-inverse-tree", "Prints dependencies and transitive dependencies as an inverted tree (dependees as children)" ) + + val coursierArtifacts = TaskKey[Map[Artifact, FileError \/ File]]("coursier-artifacts") + val coursierClassifiersArtifacts = TaskKey[Map[Artifact, FileError \/ File]]("coursier-classifiers-artifacts") + val coursierSbtClassifiersArtifacts = TaskKey[Map[Artifact, FileError \/ File]]("coursier-sbt-classifiers-artifacts") } diff --git a/plugin/src/main/scala-2.10/coursier/MakeIvyXml.scala b/plugin/src/main/scala-2.10/coursier/MakeIvyXml.scala index 45ef60556..eb81ed8c7 100644 --- a/plugin/src/main/scala-2.10/coursier/MakeIvyXml.scala +++ b/plugin/src/main/scala-2.10/coursier/MakeIvyXml.scala @@ -4,7 +4,20 @@ import scala.xml.{ Node, PrefixedAttribute } object MakeIvyXml { - def apply(project: Project): Node = { + def apply(project0: Project, shadedConfigOpt: Option[String]): Node = { + + val filterOutDependencies = + shadedConfigOpt.toSet[String].flatMap { shadedConfig => + project0 + .dependencies + .collect { case (`shadedConfig`, dep) => dep } + } + + val project: Project = project0.copy( + dependencies = project0.dependencies.collect { + case p @ (_, dep) if !filterOutDependencies(dep) => p + } + ) val infoAttrs = project.module.attributes.foldLeft[xml.MetaData](xml.Null) { case (acc, (k, v)) => @@ -31,11 +44,12 @@ object MakeIvyXml { } % infoAttrs - val confElems = project.configurations.toVector.map { - case (name, extends0) => + val confElems = project.configurations.toVector.collect { + case (name, extends0) if shadedConfigOpt != Some(name) => + val extends1 = shadedConfigOpt.fold(extends0)(c => extends0.filter(_ != c)) val n = - if (extends0.nonEmpty) - n % .attributes + if (extends1.nonEmpty) + n % .attributes else n } diff --git a/plugin/src/main/scala-2.10/coursier/Tasks.scala b/plugin/src/main/scala-2.10/coursier/Tasks.scala index 8f681ff8e..33bb136e2 100644 --- a/plugin/src/main/scala-2.10/coursier/Tasks.scala +++ b/plugin/src/main/scala-2.10/coursier/Tasks.scala @@ -13,7 +13,6 @@ import coursier.util.{ Config, Print } import org.apache.ivy.core.module.id.ModuleRevisionId import sbt.{ UpdateReport, Classpaths, Resolver, Def } -import sbt.Configurations.{ Compile, Test } import sbt.Keys._ import scala.collection.mutable @@ -147,7 +146,7 @@ object Tasks { coursierProject.forAllProjects(state, projects).map(_.values.toVector) } - def coursierPublicationsTask: Def.Initialize[sbt.Task[Seq[(String, Publication)]]] = + def coursierPublicationsTask(configsMap: (sbt.Configuration, String)*): Def.Initialize[sbt.Task[Seq[(String, Publication)]]] = ( sbt.Keys.state, sbt.Keys.thisProjectRef, @@ -158,17 +157,16 @@ object Tasks { ).map { (state, projectRef, projId, sv, sbv, ivyConfs) => val packageTasks = Seq(packageBin, packageSrc, packageDoc) - val configs = Seq(Compile, Test) val sbtArtifacts = for { pkgTask <- packageTasks - config <- configs + (config, targetConfig) <- configsMap } yield { val publish = publishArtifact.in(projectRef).in(pkgTask).in(config).getOrElse(state, false) if (publish) Option(artifact.in(projectRef).in(pkgTask).in(config).getOrElse(state, null)) - .map(config.name -> _) + .map(targetConfig -> _) else None } @@ -219,7 +217,7 @@ object Tasks { sbtArtifactsPublication ++ extraSbtArtifactsPublication } - def coursierConfigurationsTask = Def.task { + def coursierConfigurationsTask(shadedConfig: Option[(String, String)]) = Def.task { val configs0 = ivyConfigurations.value.map { config => config.name -> config.extendsConfigs.map(_.name) @@ -238,10 +236,18 @@ object Tasks { helper(Set(c)) } - configs0.map { + val map = configs0.map { case (config, _) => config -> allExtends(config) } + + map ++ shadedConfig.toSeq.flatMap { + case (baseConfig, shadedConfig) => + Seq( + baseConfig -> (map.getOrElse(baseConfig, Set(baseConfig)) + shadedConfig), + shadedConfig -> map.getOrElse(shadedConfig, Set(shadedConfig)) + ) + } } private case class ResolutionCacheKey( @@ -647,14 +653,155 @@ object Tasks { } } - def updateTask( + def artifactFilesOrErrors( withClassifiers: Boolean, sbtClassifiers: Boolean = false, ignoreArtifactErrors: Boolean = false ) = Def.task { - def grouped[K, V](map: Seq[(K, V)]): Map[K, Seq[V]] = - map.groupBy { case (k, _) => k }.map { + // let's update only one module at once, for a better output + // Downloads are already parallel, no need to parallelize further anyway + synchronized { + + lazy val cm = coursierSbtClassifiersModule.value + + lazy val projectName = thisProjectRef.value.project + + val parallelDownloads = coursierParallelDownloads.value + val artifactsChecksums = coursierArtifactsChecksums.value + val cachePolicies = coursierCachePolicies.value + val ttl = coursierTtl.value + val cache = coursierCache.value + + val log = streams.value.log + + val verbosityLevel = coursierVerbosity.value + + val res = { + if (withClassifiers && sbtClassifiers) + coursierSbtClassifiersResolution + else + coursierResolution + }.value + + val classifiers = + if (withClassifiers) + Some { + if (sbtClassifiers) + cm.classifiers + else + transitiveClassifiers.value + } + else + None + + val allArtifacts = + classifiers match { + case None => res.artifacts + case Some(cl) => res.classifiersArtifacts(cl) + } + + var pool: ExecutorService = null + var artifactsLogger: TermDisplay = null + + val printOptionalMessage = verbosityLevel >= 0 && verbosityLevel <= 1 + + val artifactFilesOrErrors = try { + pool = Executors.newFixedThreadPool(parallelDownloads, Strategy.DefaultDaemonThreadFactory) + artifactsLogger = createLogger() + + val artifactFileOrErrorTasks = allArtifacts.toVector.map { a => + def f(p: CachePolicy) = + Cache.file( + a, + cache, + p, + checksums = artifactsChecksums, + logger = Some(artifactsLogger), + pool = pool, + ttl = ttl + ) + + cachePolicies.tail + .foldLeft(f(cachePolicies.head))(_ orElse f(_)) + .run + .map((a, _)) + } + + val artifactInitialMessage = + if (verbosityLevel >= 0) + s"Fetching artifacts of $projectName" + + (if (sbtClassifiers) " (sbt classifiers)" else "") + else + "" + + if (verbosityLevel >= 2) + log.info(artifactInitialMessage) + + artifactsLogger.init(if (printOptionalMessage) log.info(artifactInitialMessage)) + + Task.gatherUnordered(artifactFileOrErrorTasks).attemptRun match { + case -\/(ex) => + ResolutionError.UnknownDownloadException(ex) + .throwException() + case \/-(l) => + l.toMap + } + } finally { + if (pool != null) + pool.shutdown() + if (artifactsLogger != null) + if ((artifactsLogger.stopDidPrintSomething() && printOptionalMessage) || verbosityLevel >= 2) + log.info( + s"Fetched artifacts of $projectName" + + (if (sbtClassifiers) " (sbt classifiers)" else "") + ) + } + + artifactFilesOrErrors + } + } + + private def artifactFileOpt( + sbtBootJarOverrides: Map[(Module, String), File], + artifactFiles: Map[Artifact, File], + erroredArtifacts: Set[Artifact], + log: sbt.Logger, + module: Module, + version: String, + artifact: Artifact + ) = { + + val artifact0 = artifact + .copy(attributes = Attributes()) // temporary hack :-( + + // Under some conditions, SBT puts the scala JARs of its own classpath + // in the application classpath. Ensuring we return SBT's jars rather than + // JARs from the coursier cache, so that a same JAR doesn't land twice in the + // application classpath (once via SBT jars, once via coursier cache). + val fromBootJars = + if (artifact.classifier.isEmpty && artifact.`type` == "jar") + sbtBootJarOverrides.get((module, version)) + else + None + + val res = fromBootJars.orElse(artifactFiles.get(artifact0)) + + if (res.isEmpty && !erroredArtifacts(artifact0)) + log.error(s"${artifact.url} not downloaded (should not happen)") + + res + } + + def updateTask( + shadedConfigOpt: Option[(String, String)], + withClassifiers: Boolean, + sbtClassifiers: Boolean = false, + ignoreArtifactErrors: Boolean = false + ) = Def.task { + + def grouped[K, V](map: Seq[(K, V)])(mapKey: K => K): Map[K, Seq[V]] = + map.groupBy { case (k, _) => mapKey(k) }.map { case (k, l) => k -> l.map { case (_, v) => v } } @@ -677,8 +824,6 @@ object Tasks { lazy val cm = coursierSbtClassifiersModule.value - lazy val projectName = thisProjectRef.value.project - val currentProject = if (sbtClassifiers) { val sv = scalaVersion.value @@ -713,12 +858,6 @@ object Tasks { val cacheIvyFile = ivyCacheManager.getResolvedIvyFileInCache(ivyModule) val cacheIvyPropertiesFile = ivyCacheManager.getResolvedIvyPropertiesInCache(ivyModule) - val parallelDownloads = coursierParallelDownloads.value - val artifactsChecksums = coursierArtifactsChecksums.value - val cachePolicies = coursierCachePolicies.value - val ttl = coursierTtl.value - val cache = coursierCache.value - val log = streams.value.log val verbosityLevel = coursierVerbosity.value @@ -730,7 +869,7 @@ object Tasks { val b = new StringBuilder b ++= """""" b += '\n' - b ++= printer.format(MakeIvyXml(currentProject)) + b ++= printer.format(MakeIvyXml(currentProject, shadedConfigOpt.map(_._2))) cacheIvyFile.getParentFile.mkdirs() FileUtil.write(cacheIvyFile, b.result().getBytes("UTF-8")) @@ -739,6 +878,8 @@ object Tasks { FileUtil.write(cacheIvyPropertiesFile, "".getBytes("UTF-8")) } + writeIvyFiles() + val res = { if (withClassifiers && sbtClassifiers) coursierSbtClassifiersResolution @@ -748,9 +889,25 @@ object Tasks { def report = { - val depsByConfig = grouped(currentProject.dependencies) + val depsByConfig = grouped(currentProject.dependencies)( + config => + shadedConfigOpt match { + case Some((baseConfig, `config`)) => + baseConfig + case _ => + config + } + ) - val configs = coursierConfigurations.value + val configs = { + val m = coursierConfigurations.value + shadedConfigOpt.fold(m) { + case (baseConfig, shadedConfig) => + (m - shadedConfig) + ( + baseConfig -> (m.getOrElse(baseConfig, Set()) - shadedConfig) + ) + } + } if (verbosityLevel >= 2) { val finalDeps = Config.dependenciesWithConfig( @@ -775,75 +932,22 @@ object Tasks { else None - val allArtifacts = - classifiers match { - case None => res.artifacts - case Some(cl) => res.classifiersArtifacts(cl) - } - - var pool: ExecutorService = null - var artifactsLogger: TermDisplay = null - - val printOptionalMessage = verbosityLevel >= 0 && verbosityLevel <= 1 - - val artifactFilesOrErrors = try { - pool = Executors.newFixedThreadPool(parallelDownloads, Strategy.DefaultDaemonThreadFactory) - artifactsLogger = createLogger() - - val artifactFileOrErrorTasks = allArtifacts.toVector.map { a => - def f(p: CachePolicy) = - Cache.file( - a, - cache, - p, - checksums = artifactsChecksums, - logger = Some(artifactsLogger), - pool = pool, - ttl = ttl - ) - - cachePolicies.tail - .foldLeft(f(cachePolicies.head))(_ orElse f(_)) - .run - .map((a, _)) - } - - val artifactInitialMessage = - if (verbosityLevel >= 0) - s"Fetching artifacts of $projectName" + - (if (sbtClassifiers) " (sbt classifiers)" else "") + val artifactFilesOrErrors0 = ( + if (withClassifiers) { + if (sbtClassifiers) + Keys.coursierSbtClassifiersArtifacts else - "" + Keys.coursierClassifiersArtifacts + } else + Keys.coursierArtifacts + ).value - if (verbosityLevel >= 2) - log.info(artifactInitialMessage) - - artifactsLogger.init(if (printOptionalMessage) log.info(artifactInitialMessage)) - - Task.gatherUnordered(artifactFileOrErrorTasks).attemptRun match { - case -\/(ex) => - ResolutionError.UnknownDownloadException(ex) - .throwException() - case \/-(l) => - l.toMap - } - } finally { - if (pool != null) - pool.shutdown() - if (artifactsLogger != null) - if ((artifactsLogger.stopDidPrintSomething() && printOptionalMessage) || verbosityLevel >= 2) - log.info( - s"Fetched artifacts of $projectName" + - (if (sbtClassifiers) " (sbt classifiers)" else "") - ) - } - - val artifactFiles = artifactFilesOrErrors.collect { + val artifactFiles = artifactFilesOrErrors0.collect { case (artifact, \/-(file)) => artifact -> file } - val artifactErrors = artifactFilesOrErrors.toVector.collect { + val artifactErrors = artifactFilesOrErrors0.toVector.collect { case (_, -\/(err)) => err } @@ -858,42 +962,25 @@ object Tasks { } // can be non empty only if ignoreArtifactErrors is true - val erroredArtifacts = artifactFilesOrErrors.collect { + val erroredArtifacts = artifactFilesOrErrors0.collect { case (artifact, -\/(_)) => artifact }.toSet - def artifactFileOpt(module: Module, version: String, artifact: Artifact) = { - - val artifact0 = artifact - .copy(attributes = Attributes()) // temporary hack :-( - - // Under some conditions, SBT puts the scala JARs of its own classpath - // in the application classpath. Ensuring we return SBT's jars rather than - // JARs from the coursier cache, so that a same JAR doesn't land twice in the - // application classpath (once via SBT jars, once via coursier cache). - val fromBootJars = - if (artifact.classifier.isEmpty && artifact.`type` == "jar") - sbtBootJarOverrides.get((module, version)) - else - None - - val res = fromBootJars.orElse(artifactFiles.get(artifact0)) - - if (res.isEmpty && !erroredArtifacts(artifact0)) - log.error(s"${artifact.url} not downloaded (should not happen)") - - res - } - - writeIvyFiles() - ToSbt.updateReport( depsByConfig, res, configs, classifiers, - artifactFileOpt + artifactFileOpt( + sbtBootJarOverrides, + artifactFiles, + erroredArtifacts, + log, + _, + _, + _ + ) ) } diff --git a/sbt-shading/src/main/scala-2.10/coursier/Shading.scala b/sbt-shading/src/main/scala-2.10/coursier/Shading.scala new file mode 100644 index 000000000..510c479fa --- /dev/null +++ b/sbt-shading/src/main/scala-2.10/coursier/Shading.scala @@ -0,0 +1,152 @@ +package coursier + +import java.io.{File, FileInputStream} +import java.util.jar.JarInputStream +import java.util.zip.{ZipEntry, ZipInputStream} + +import com.tonicsystems.jarjar.classpath.ClassPath +import com.tonicsystems.jarjar.transform.JarTransformer +import com.tonicsystems.jarjar.transform.config.ClassRename +import com.tonicsystems.jarjar.transform.jar.DefaultJarProcessor +import coursier.core.Orders +import sbt.file + +import scalaz.{\/, \/-} + +object Shading { + + // FIXME Also vaguely in cli + def zipEntries(zipStream: ZipInputStream): Iterator[ZipEntry] = + new Iterator[ZipEntry] { + var nextEntry = Option.empty[ZipEntry] + def update() = + nextEntry = Option(zipStream.getNextEntry) + + update() + + def hasNext = nextEntry.nonEmpty + def next() = { + val ent = nextEntry.get + update() + ent + } + } + + def jarClassNames(jar: File): Seq[String] = { + + var fis: FileInputStream = null + var zis: JarInputStream = null + + try { + fis = new FileInputStream(jar) + zis = new JarInputStream(fis) + + zipEntries(zis) + .map(_.getName) + .filter(_.endsWith(".class")) + .map(_.stripSuffix(".class").replace('/', '.')) + .toVector + } finally { + if (zis != null) + zis.close() + if (fis != null) + fis.close() + } + } + + def createPackage( + baseJar: File, + currentProject: Project, + res: Resolution, + configs: Map[String, Set[String]], + artifactFilesOrErrors: Map[Artifact, FileError \/ File], + shadingNamespace: String, + baseConfig: String, + shadedConf: String, + log: sbt.Logger + ) = { + + val outputJar = new File( + baseJar.getParentFile, + baseJar.getName.stripSuffix(".jar") + "-shading.jar" + ) + + def configDependencies(config: String) = { + + def minDependencies(dependencies: Set[Dependency]): Set[Dependency] = + Orders.minDependencies( + dependencies, + dep => + res + .projectCache + .get(dep) + .map(_._2.configurations) + .getOrElse(Map.empty) + ) + + val includedConfigs = configs.getOrElse(config, Set.empty) + config + + minDependencies( + currentProject + .dependencies + .collect { + case (cfg, dep) if includedConfigs(cfg) => + dep + } + .toSet + ) + } + + val dependencyArtifacts = res.dependencyArtifacts.toMap + + val artifactFilesOrErrors0 = artifactFilesOrErrors + .collect { + case (a, \/-(f)) => a.url -> f + } + + val compileDeps = configDependencies(baseConfig) + val shadedDeps = configDependencies(shadedConf) + + val compileOnlyDeps = compileDeps.filterNot(shadedDeps) + + log.info(s"Found ${compileDeps.size} dependencies in $baseConfig") + log.debug(compileDeps.toVector.map(" " + _).sorted.mkString("\n")) + log.info(s"Found ${compileOnlyDeps.size} dependencies only in $baseConfig") + log.debug(compileOnlyDeps.toVector.map(" " + _).sorted.mkString("\n")) + log.info(s"Found ${shadedDeps.size} dependencies in $shadedConf") + log.debug(shadedDeps.toVector.map(" " + _).sorted.mkString("\n")) + + def files(deps: Set[Dependency]) = res + .subset(deps) + .dependencies + .toSeq + .flatMap(dependencyArtifacts.get) + .map(_.url) + .flatMap(artifactFilesOrErrors0.get) + + val compileOnlyJars = files(compileOnlyDeps) + val shadedJars = files(shadedDeps) + + log.info(s"Found ${compileOnlyJars.length} JAR(s) only in $baseConfig") + log.debug(compileOnlyJars.map(" " + _).sorted.mkString("\n")) + log.info(s"Found ${shadedJars.length} JAR(s) in $shadedConf") + log.debug(shadedJars.map(" " + _).sorted.mkString("\n")) + + val shadeJars = shadedJars.filterNot(compileOnlyJars.toSet) + val shadeClasses = shadeJars.flatMap(Shading.jarClassNames) + + log.info(s"Will shade ${shadeClasses.length} class(es)") + log.debug(shadeClasses.map(" " + _).sorted.mkString("\n")) + + val processor = new DefaultJarProcessor + for (cls <- shadeClasses) + processor.addClassRename(new ClassRename(cls, shadingNamespace + ".@0")) + + val transformer = new JarTransformer(outputJar, processor) + val cp = new ClassPath(file(sys.props("user.dir")), (baseJar +: shadeJars).toArray) + transformer.transform(cp) + + outputJar + } + +} \ No newline at end of file diff --git a/sbt-shading/src/main/scala-2.10/coursier/ShadingPlugin.scala b/sbt-shading/src/main/scala-2.10/coursier/ShadingPlugin.scala new file mode 100644 index 000000000..510fcdaf9 --- /dev/null +++ b/sbt-shading/src/main/scala-2.10/coursier/ShadingPlugin.scala @@ -0,0 +1,97 @@ +package coursier + +import coursier.ivy.IvyXml +import sbt.Keys._ +import sbt.{AutoPlugin, Compile, Configuration, TaskKey, inConfig} + +object ShadingPlugin extends AutoPlugin { + + override def trigger = noTrigger + + override def requires = sbt.plugins.IvyPlugin + + private val baseSbtConfiguration = Compile + val Shading = Configuration("shading", "", isPublic = false, List(baseSbtConfiguration), transitive = true) + + private val baseDependencyConfiguration = "compile" + val Shaded = Configuration("shaded", "", isPublic = true, List(), transitive = true) + + val shadingNamespace = TaskKey[String]("shading-namespace") + + object autoImport { + + /** Scope for shading related tasks */ + val Shading = ShadingPlugin.Shading + + /** Ivy configuration for shaded dependencies */ + val Shaded = ShadingPlugin.Shaded + + val shadingNamespace = ShadingPlugin.shadingNamespace + } + + // same as similar things under sbt.Classpaths, tweaking a bit the configuration scope + lazy val shadingDefaultArtifactTasks = + makePom +: Seq(packageBin, packageSrc, packageDoc).map(_.in(Shading)) + lazy val shadingJvmPublishSettings = Seq( + artifacts <<= sbt.Classpaths.artifactDefs(shadingDefaultArtifactTasks), + packagedArtifacts <<= sbt.Classpaths.packaged(shadingDefaultArtifactTasks) + ) + + import CoursierPlugin.autoImport._ + + override lazy val projectSettings = + Seq( + coursierConfigurations <<= Tasks.coursierConfigurationsTask( + Some(baseDependencyConfiguration -> Shaded.name) + ), + ivyConfigurations := Shaded +: ivyConfigurations.value.map { + conf => + if (conf.name == "compile") + conf.extend(Shaded) + else + conf + } + ) ++ + inConfig(Shading)( + sbt.Defaults.configSettings ++ + sbt.Classpaths.ivyBaseSettings ++ + sbt.Classpaths.ivyPublishSettings ++ + shadingJvmPublishSettings ++ + CoursierPlugin.coursierSettings( + Some(baseDependencyConfiguration -> Shaded.name), + Seq(Shading -> Compile.name) + ) ++ + CoursierPlugin.treeSettings ++ + Seq( + configuration := baseSbtConfiguration, // wuw + ivyConfigurations := ivyConfigurations.in(baseSbtConfiguration).value + .filter(_.name != Shaded.name) + .map(c => c.copy(extendsConfigs = c.extendsConfigs.filter(_.name != Shaded.name))), + libraryDependencies := libraryDependencies.in(baseSbtConfiguration).value.filter { dep => + val isShaded = dep.configurations.exists { mappings => + IvyXml.mappings(mappings).exists(_._1 == Shaded.name) + } + + !isShaded + }, + // required for cross-projects in particular + unmanagedSourceDirectories := (unmanagedSourceDirectories in Compile).value, + packageBin := { + coursier.Shading.createPackage( + packageBin.in(baseSbtConfiguration).value, + coursierProject.in(baseSbtConfiguration).value, + coursierResolution.in(baseSbtConfiguration).value, + coursierConfigurations.in(baseSbtConfiguration).value, + Keys.coursierArtifacts.in(baseSbtConfiguration).value, + shadingNamespace.?.value.getOrElse { + throw new NoSuchElementException("shadingNamespace key not set") + }, + baseDependencyConfiguration, + Shaded.name, + streams.value.log + ) + } + ) + ) + +} \ No newline at end of file diff --git a/sbt-shading/src/sbt-test/sbt-shading/cross-project-shading/build.sbt b/sbt-shading/src/sbt-test/sbt-shading/cross-project-shading/build.sbt new file mode 100644 index 000000000..0144a1ce2 --- /dev/null +++ b/sbt-shading/src/sbt-test/sbt-shading/cross-project-shading/build.sbt @@ -0,0 +1,20 @@ + +lazy val root = crossProject + .in(file(".")) + .jvmConfigure( + _.enablePlugins(coursier.ShadingPlugin) + ) + .jvmSettings( + shadingNamespace := "test.shaded", + libraryDependencies += "io.argonaut" %% "argonaut" % "6.2-RC2" % "shaded" + ) + .settings( + scalaVersion := "2.11.8", + organization := "io.get-coursier.test", + name := "shading-cross-test", + version := "0.1.0-SNAPSHOT", + libraryDependencies += "org.scala-lang" % "scala-reflect" % scalaVersion.value + ) + +lazy val jvm = root.jvm +lazy val js = root.js diff --git a/sbt-shading/src/sbt-test/sbt-shading/cross-project-shading/coursier b/sbt-shading/src/sbt-test/sbt-shading/cross-project-shading/coursier new file mode 100755 index 0000000000000000000000000000000000000000..13c8a2b55460c6b5eb639e6f89e5c32e9be629aa GIT binary patch literal 11832 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 literal 0 HcmV?d00001 diff --git a/sbt-shading/src/sbt-test/sbt-shading/cross-project-shading/jvm/src/main/scala/Main.scala b/sbt-shading/src/sbt-test/sbt-shading/cross-project-shading/jvm/src/main/scala/Main.scala new file mode 100644 index 000000000..30502dda1 --- /dev/null +++ b/sbt-shading/src/sbt-test/sbt-shading/cross-project-shading/jvm/src/main/scala/Main.scala @@ -0,0 +1,21 @@ +import java.io.File +import java.nio.file.Files + +import argonaut._ + +import Foo._ + +object Main extends App { + + val expectedClassName0 = expectedClassName(args.headOption == Some("--shaded")) + + Console.err.println(s"Expected class name: $expectedClassName0") + Console.err.println(s"Class name: $className") + + if (className != expectedClassName0) + sys.error(s"Expected class name $expectedClassName0, got $className") + + val msg = Json.obj().nospaces + + Files.write(new File("output").toPath, msg.getBytes("UTF-8")) +} diff --git a/sbt-shading/src/sbt-test/sbt-shading/cross-project-shading/project/plugins.sbt b/sbt-shading/src/sbt-test/sbt-shading/cross-project-shading/project/plugins.sbt new file mode 100644 index 000000000..fc3a48bf6 --- /dev/null +++ b/sbt-shading/src/sbt-test/sbt-shading/cross-project-shading/project/plugins.sbt @@ -0,0 +1,33 @@ +{ + val pluginVersion = sys.props.getOrElse( + "plugin.version", + throw new RuntimeException( + """|The system property 'plugin.version' is not defined. + |Specify this property using the scriptedLaunchOpts -D.""".stripMargin + ) + ) + + addSbtPlugin("io.get-coursier" % "sbt-shading" % pluginVersion) +} + +// for the locally publish jarjar +resolvers += Resolver.mavenLocal + +val coursierJarjarVersion = "1.0.1-coursier-SNAPSHOT" + +def coursierJarjarFoundInM2 = + (file(sys.props("user.home")) / s".m2/repository/org/anarres/jarjar/jarjar-core/$coursierJarjarVersion").exists() + +def jarjarVersion = + if (coursierJarjarFoundInM2) + coursierJarjarVersion + else + sys.error( + "Ad hoc jarjar version not found. Run\n" + + " git clone https://github.com/alexarchambault/jarjar.git && cd jarjar && git checkout 249c8dbb970f8 && ./gradlew install\n" + + "to run this test" + ) + +libraryDependencies += "org.anarres.jarjar" % "jarjar-core" % jarjarVersion + +addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.13") diff --git a/sbt-shading/src/sbt-test/sbt-shading/cross-project-shading/shared/src/main/scala/Foo.scala b/sbt-shading/src/sbt-test/sbt-shading/cross-project-shading/shared/src/main/scala/Foo.scala new file mode 100644 index 000000000..6e510b152 --- /dev/null +++ b/sbt-shading/src/sbt-test/sbt-shading/cross-project-shading/shared/src/main/scala/Foo.scala @@ -0,0 +1,16 @@ + +import argonaut._ + +object Foo { + + def expectedClassName(shaded: Boolean) = + if (shaded) + "test.shaded.argonaut.Json" + else + // Don't use the literal "argonaut.Json", that seems to get + // changed to "test.shaded.argonaut.Json" by shading + "argonaut" + '.' + "Json" + + val className = classOf[Json].getName + +} diff --git a/sbt-shading/src/sbt-test/sbt-shading/cross-project-shading/test b/sbt-shading/src/sbt-test/sbt-shading/cross-project-shading/test new file mode 100644 index 000000000..72419bd1d --- /dev/null +++ b/sbt-shading/src/sbt-test/sbt-shading/cross-project-shading/test @@ -0,0 +1,10 @@ +$ delete output +> rootJVM/run +$ exists output +$ delete output +> rootJVM/publishLocal +$ exec java -jar coursier launch io.get-coursier.test:shading-cross-test_2.11:0.1.0-SNAPSHOT +-$ exec java -jar coursier launch io.get-coursier.test:shading-cross-test_2.11:0.1.0-SNAPSHOT -- --shaded +> rootJVM/shading:publishLocal +-$ exec java -jar coursier launch io.get-coursier.test:shading-cross-test_2.11:0.1.0-SNAPSHOT +$ exec java -jar coursier launch io.get-coursier.test:shading-cross-test_2.11:0.1.0-SNAPSHOT -- --shaded diff --git a/sbt-shading/src/sbt-test/sbt-shading/shading/build.sbt b/sbt-shading/src/sbt-test/sbt-shading/shading/build.sbt new file mode 100644 index 000000000..c125c822d --- /dev/null +++ b/sbt-shading/src/sbt-test/sbt-shading/shading/build.sbt @@ -0,0 +1,10 @@ + +enablePlugins(coursier.ShadingPlugin) +shadingNamespace := "test.shaded" + +libraryDependencies += "io.argonaut" %% "argonaut" % "6.2-RC2" % "shaded" + +scalaVersion := "2.11.8" +organization := "io.get-coursier.test" +name := "shading-base-test" +version := "0.1.0-SNAPSHOT" diff --git a/sbt-shading/src/sbt-test/sbt-shading/shading/coursier b/sbt-shading/src/sbt-test/sbt-shading/shading/coursier new file mode 100755 index 0000000000000000000000000000000000000000..13c8a2b55460c6b5eb639e6f89e5c32e9be629aa GIT binary patch literal 11832 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 literal 0 HcmV?d00001 diff --git a/sbt-shading/src/sbt-test/sbt-shading/shading/project/plugins.sbt b/sbt-shading/src/sbt-test/sbt-shading/shading/project/plugins.sbt new file mode 100644 index 000000000..8f83e814d --- /dev/null +++ b/sbt-shading/src/sbt-test/sbt-shading/shading/project/plugins.sbt @@ -0,0 +1,31 @@ +{ + val pluginVersion = sys.props.getOrElse( + "plugin.version", + throw new RuntimeException( + """|The system property 'plugin.version' is not defined. + |Specify this property using the scriptedLaunchOpts -D.""".stripMargin + ) + ) + + addSbtPlugin("io.get-coursier" % "sbt-shading" % pluginVersion) +} + +// for the locally publish jarjar +resolvers += Resolver.mavenLocal + +val coursierJarjarVersion = "1.0.1-coursier-SNAPSHOT" + +def coursierJarjarFoundInM2 = + (file(sys.props("user.home")) / s".m2/repository/org/anarres/jarjar/jarjar-core/$coursierJarjarVersion").exists() + +def jarjarVersion = + if (coursierJarjarFoundInM2) + coursierJarjarVersion + else + sys.error( + "Ad hoc jarjar version not found. Run\n" + + " git clone https://github.com/alexarchambault/jarjar.git && cd jarjar && git checkout 249c8dbb970f8 && ./gradlew install\n" + + "to run this test" + ) + +libraryDependencies += "org.anarres.jarjar" % "jarjar-core" % jarjarVersion diff --git a/sbt-shading/src/sbt-test/sbt-shading/shading/src/main/scala/Main.scala b/sbt-shading/src/sbt-test/sbt-shading/shading/src/main/scala/Main.scala new file mode 100644 index 000000000..b7eee31a8 --- /dev/null +++ b/sbt-shading/src/sbt-test/sbt-shading/shading/src/main/scala/Main.scala @@ -0,0 +1,27 @@ +import java.io.File +import java.nio.file.Files + +import argonaut._ + +object Main extends App { + + val expectedClassName = + if (args.headOption == Some("--shaded")) + "test.shaded.argonaut.Json" + else + // Don't use the literal "argonaut.Json", that seems to get + // changed to "test.shaded.argonaut.Json" by shading + "argonaut" + '.' + "Json" + + val className = classOf[Json].getName + + Console.err.println(s"Expected class name: $expectedClassName") + Console.err.println(s"Class name: $className") + + if (className != expectedClassName) + sys.error(s"Expected class name $expectedClassName, got $className") + + val msg = Json.obj().nospaces + + Files.write(new File("output").toPath, msg.getBytes("UTF-8")) +} diff --git a/sbt-shading/src/sbt-test/sbt-shading/shading/test b/sbt-shading/src/sbt-test/sbt-shading/shading/test new file mode 100644 index 000000000..6f020327e --- /dev/null +++ b/sbt-shading/src/sbt-test/sbt-shading/shading/test @@ -0,0 +1,9 @@ +$ delete output +> run +$ exists output +> publishLocal +$ exec java -jar coursier launch io.get-coursier.test:shading-base-test_2.11:0.1.0-SNAPSHOT +-$ exec java -jar coursier launch io.get-coursier.test:shading-base-test_2.11:0.1.0-SNAPSHOT -- --shaded +> shading:publishLocal +-$ exec java -jar coursier launch io.get-coursier.test:shading-base-test_2.11:0.1.0-SNAPSHOT +$ exec java -jar coursier launch io.get-coursier.test:shading-base-test_2.11:0.1.0-SNAPSHOT -- --shaded diff --git a/sbt-shading/src/sbt-test/sbt-shading/transitive-shading/build.sbt b/sbt-shading/src/sbt-test/sbt-shading/transitive-shading/build.sbt new file mode 100644 index 000000000..3f4280d74 --- /dev/null +++ b/sbt-shading/src/sbt-test/sbt-shading/transitive-shading/build.sbt @@ -0,0 +1,14 @@ + +enablePlugins(coursier.ShadingPlugin) +shadingNamespace := "test.shaded" + +libraryDependencies ++= Seq( + "com.github.alexarchambault" %% "argonaut-shapeless_6.2" % "1.2.0-M4" % "shaded", + "com.chuusai" %% "shapeless" % "2.3.2", + "org.scala-lang" % "scala-reflect" % scalaVersion.value +) + +scalaVersion := "2.11.8" +organization := "io.get-coursier.test" +name := "shading-transitive-test" +version := "0.1.0-SNAPSHOT" diff --git a/sbt-shading/src/sbt-test/sbt-shading/transitive-shading/coursier b/sbt-shading/src/sbt-test/sbt-shading/transitive-shading/coursier new file mode 100755 index 0000000000000000000000000000000000000000..13c8a2b55460c6b5eb639e6f89e5c32e9be629aa GIT binary patch literal 11832 zcmZ`<19WA}(hep*u`#i2+qOBeZO&Li zRlR%HM?^s9?C3yeU~WTaY~zCOXa;TUW^9OWq3@!PPh+9)fKNtaW9wq7s4$k^YZai%1kcEo-lszoBRm#iB`wbJ zqGIwWk+3&FaCUvT9HESv;_S;%tl_RHB-wbNQQ^zOcXIwS9x*ufm*_04YQIu-(9RpR zHUg{ZUH0hd3RT->7TzIg&nd*-mG_8OrFSI3C2G#3K%bC_p!PA3eS#703+8)6n)pTz ztQJFgo@Fet-bZD&Rx1Z509>+IlY zZtOt!->dPiE|z-zu@VxXKtNc39VTdN>*VOe?vsXmCyoN!k(Fc9O| zjFfiAiRSxEu3yg+QF=h<+xx`qw97}a{?N2sO@1PgWpJcbefAM~-S!#X-l>I(m868D zMg#P%RI#FZ6mgg|F1lvM%K1ovM|M)Dq4lI-c>8Uq4r5+afL`xCY#m77EnyWR;@#AsKlFFiEC(~^z zppn?LiCfL=pbPydrL-1i4t3fOW-CS^v|$BsaK%{nSgz%2LHZ`E6#lO21Hax9!vVe9 zCB{x7M)7a_GMo~kSM@jpDKSr74JrGuRIC+4>-OEnde^Vw#CME1366YG3G>*20VeFU z))rVcGXZ5^^^w3PYGZ-wVkw;{U~c9%r;aq1X=Z$I|l3aQlD`^--_WlgG}tf{Zh}a z|Ng59D9B~TXs0SqaDoWW7x=$DW%p_)IvC_5Zax74;rxxK5HtMKR|1qT4=3k3OBEcj&}nzY&MJXTp<)wZ(=pb~|VUd^`O^X=~l)wBDg zJX&ji?T@ddG{3#P-eP~{C?}Z;OXGZsp0S5%j1%99ghO_R1%r*_WZp$eR8(34PNz5)yTh@? z*ju%P8|yoWKsB8D<&cUivzYbH_4|9^MU&Gs)kzPPgrsp$?x?`?WQBNT%4Ta{dl^S?t zqZZ;;W;te46a=^;27Pq5kOA{0WEgnjrFw78H!`;odMtB?`~vkdM(sG*N|)3mee&zp z)s^}N!K@)QtVk_nULgmiPcfPHpc7RF+4)0EZZ@0HswHD*lF4ZW#|??!#KAW74s^#= z@>5&{042XDi%Tk~0ia~}i*9qdK9i((^4epDuV*qad(Cg@P}ykCsin`$KOpsf*+s>t zK8B&p=7FB?YY*ok!PevFUQvm``5CWpVzh+3=l=j8zpIoKCN7v?S^)Y-r_i6pzJQGCREFs9#fp}#c@;jDog{qkg(M^5f*VKfyRRXPU=sG~h7c%RbJ z*(2E7-O8@xCzy8ePKo%QK?e8f%+dtOHM1-&aC7*AJBVC-SjjKq%<^lL4B71xEV-GI zuTim5B?Drk-Yp}8hbUjNMvOUSzGMwB?eZ$^81CuPQc*Ggi1$p;F7?*#tyTV!@N9)Q zvDHk8S2P32Ec$h&U33M-IdOo@0%xIJc?A+77yB(hkW=c8QzKLM>Wa|j^2$J$FsXpC zLHba3?vdFhe$=5komP=GWMurhPH>OOsU=J8*o(Asx;a4YggIlu%qvm4G9js!#YV+F zLw3}y9gs;RcTnn;DLeY;l|VOH5+dZVgrD?Pds*2=ZE4y(A=!z@wYW{9hy_RWQ7~h^ zMy}2}dUT%~gCN(TXh0$3=T_W@{^ z+rtAA!mqwGm&SxMk=4|SyBvS2`##!(SjG#JL=?FwYvWf@;pQE{w4MPFv&cbj&?~xj zly;}tiZml%`W$qq_HuEjMemX`%40!diRg6;gJ{r?gh91aO&bDA_03tD34W)L;fcHQ z8eYXmU=KYdm3KauS}@`>VzXC9jvb192V?x|cMQ79q5YqD-N`ZPTI7TchNZa1V=>FB z;ps+{%SiBK6@i)g3F@C6+2g}q#Dw}a_%*N<^aKfA)rU!!;9n4^VfQdcSOSoTpRAsv zf=8xcl;5gH_!J(E6Z8ZKKo(11lpuIi-Y{nZr?jXs&U)TmMi~GIpiopx0LP-ML5vG!^a+Lq^6rVw?|SyW2x$n2E8UQw48|Nq$ckj>KQsS0FnitNe9XQHg={>Zv9s6awU(O{1&=e4X>U3;3osAp>Q zOk}s;@!#0*#Lp3hv7Nk!#6Q=l_0Smi67Tk9d9ZzPoyAz& zbUg%9E|JC-W79e-3P4J;LP(`g)ev%JH^6pX4UBhT=`E-n*z~>R1BPHh58P&1yAto& zbUl*s_aSdZS53N4Xlj32%s^|K-}=#?)dSAsQ81;|TUqH_~VXR^lURiU1#NT!gQ z{4@y+7{eQ9HfDEeVY8{*R(&>0JqpI&!w{m#Bl}ii9t4Med)kmuM#%&)E_9%tDR=V9 zf5t3tTyBZ0e%MwwRqI0%rBQv^wo5C{jxTDcQClLQIkF^2olMWn=Ar1fQa~%<%r3Zc z19Y=A8Y`7^P3vMskVvrww6v6))xV}6o*##jl;2GomDjDE6-maWAtXU9)lFwN9(4;JhE>wVykq??~^-jRScgTWZIAqQv8xfAf{IK zwE9UHKcLJ9VUBP&awXqX$CNJ4pR8!_;GUaX*Dx!8d}z)rCRUYQoZ-@6SEqtC1>e83 zrXx|tSmzCc)?JMNrr9!zVW;j%NYR*Y7o`i%TSQ-u8l@cM&Ro=X-p8S!J)wcMv-}JkC@YPmKJenxzg_w1}G4?!oRgL1)u6T zE+|+!nPbr&2R!jR(MU{$D6$6kf?zXNv33vxV5m_s zmBj)T?Pb~ZM=>d_;Rh>NKhef(lL{lx2W~4g(Woz@g+fbUE0R&9MwHP8w8n0kHM+5& zoGl?8r-1FTYzj&_bQ##?p9qllPNQ(KrxW+4QpKBupeCNG7t!}#j9)} zq)|{8E?>ZaRLvzx}mF;w57*SR&>6zMXG}WOPMk6vr zr6t5se=U^F%W@;bQiz$|^6#T98NJJOTZcAqBCG@38LC`8+`UX9M9TizM3OQi@3P#H zR!JU{B0U-$U)9*%nu_#7x@0r*8FA7X0NF>ejgSo!G`4lE5~im0Ufx26h9X3EbG(Ou zsIPss4AU81%_B+Su=n0I>l`7i9!1I+?hg*41TsK5C%EZi-*Y(pxNGMEz}4gYE<{4& z!BLlfUTDb0L2@5PzhZ1hs87LhQ18dDNRqV>UR(EAqT3fMI6mkMxTGvfNDZVDV2~nq z2%jc}Hz!i!O_gv}(O<{;bAg-V^USw&^hqV}P z-=yG4S)b-L5a6Be^deHTpy5|dw=Nx8$>aqD2^hUVUZXSxlcx!W zpaxT|B%Nei&-!3u2AjjULT;pJP^TwopGgbM*{4XM*+Ta#WyRN+oos8huZc;qyCV(D za~~1wP2dgnwa73I_ETsbz~S9QQ8-aeml5{hk}EtGH~ExTB$(0 zSK5qc2%E0Gr3fBjJP2OiMWX^z4V7!5uyd9eST;cX1agWV+dvdOj(L(^3Gx&DGoBs6 zQt-_6JQFM9=eXO^@k0O|t_X=CW)=#Q9G)z6{OCRQ>I$LRn$m-JlLdjEN#1;-@m7Uu zE2smNVXm^HyP?v20FlL1a5RS(O({A$Zpt(o583Rx4+azTtcI2X5kVChrdDmKeYh#s zi5RXKw$2D?A&1zDXd*$1qq=>Akg_XuA}x3LVVF=%aQsy-W;aE4EZ6X)3Hx^ObrfNG zEDhE4;%T)dZZ3IDisY}Tm$^Oh%_0qln=0UuFbtkG5H48w^B~vCnWUnOqyYWp8%{LV zJXnBp6Gi+R<$KHtNr~)>x`)vOB1^jZ@)F5>a(q>17ssO=RvTvZc5lQ?_%&jh2~o|` zV^0W42@}lNWHTliMqdW$*HskcWKcmmbYB|2*iN+g$_X?xL(cELUi#$^$)f?R6K@5* z93*28!ONy`0&UzY`m$;+BVt|;PV+_%m`e*1rtw4Tm@<@neyi*BkzlbnWF`_%R%@aS z%cKOY?6Wjq*z}zi_MMim=W5m@yNb?wvv@UQbBtX5A`9aV2?(zzg`d!Fx02VR*aBQO zz43QmUD_^wx^;qHY!r5H-4BM5j+mlxqw8DI@r0bXUb3RPqP-=&_C-Z|`FcqD1lK@> ziO11F(;iVPo=*9RNtB%Cr5j*jWv||(g2ZN3Ns1TP$IAhizvA-vv((%n$A|IdKKk#P zpOM)rT~XXL&1-99D76UVIRBjGoeqTX40=TeOj>;7o#4}je8>UV6P!G#z6`qYqnd}s__f*b z<*S#s5wnUw<;(uDsl=$eAGC`Ky!=+E0Hs;Q75c4`J^jMi8PPkO>-^Yl(#=#;of#7a z{DLG#HuQ>`62si2Te3CdC$2=39nPTrDQ&Gb`+S`IE6Vob=_t5qWyq3gDWd$o5Ik^H zij7`%-t$H{MW6v}ys-*s59x_aPFvXwEP2rN45yMKsA5O|WqcW+e&Nm~u{dd1^mile zC$kYC8QA@ZjEuz0xp8i#${(27d49YzYEWxZ{(&i$7KQp)tw&~}FVY(_gXF=rH8`5B zGJESe)+Xm>uW|#ha&vL3dZ)`tyhX^XmynUT|u-#XWh9Q9mDH&q91e8T>MDoxg!0w_7{P9!O zSDf+Q{_9TPC?gTS>ur-s27~gI>U0D?yT^zn32SzbPHY63l@qgKtDnD7a&%<5(*a%^&AGsQ=&VU9 z{BcOalpNNbdy@^pkkxvRXvUCW!oR`Pz4|E=v5G3#!-+K0bm<~8-kFti?R%rvkXR$( ziw)?jOL+(AS1&TRRj}hTb#Dl>i%(IlU*YZ-vBu)EDT{EhA-;a=BoiLQLo2%(B#6h8 z^S~gwL-7svX0*SSyD^18j`x;t2THzN#IF!Ut1l05_*8{0Zlw z1aGltVx2>`pb1Tn_JYv}U4hX)kx+53GDv@mV+tWwCtj zlsXaUkvOW@OlvyiP>l+eLK}rVr)3#*PHu0) zG@@Xk16qqprk6DTNAd@XFC)mO;fv8mN}mAynnir6xG@Vz?&GeTrBMd$yD(4bE;+8` z>rx)__k$4Rz#TpGCLXRaJxq_H9VspBSr^-$hlFfRHX;uQn)t9o+MmQTrK5=P#ycV`QB~~K}ml?NBOE!(78lpyE5q(ZK3kSMH&$c%KX{sncTKh`Q0F49k?I3wCg2^ z`R%Jwx0Fzq>BbgjhavpOhs~|5X9*Q7Wse1}boh6Nt4p5b6Yr ztOxlNDxNOW3?+o_3^-tH&OI6`O8e0LtYG!8w_<@zUTvG0&*A|~(9K^d?JD;OS0LT< zak9DB;rYz3)561qvj%net0-#gv9f8#=UUCnw6xS_o33;eb^=|aZq!?kkXnaEW(w}& zhGw~LMu>>M#Y|Z`d<}Ku9v2OB#j3h=Vztf*EqG3gJ*LoIfo~h>3-`Xs3BzPTmuyl^`TbvGjWiCT`Yt08)8| zZnS7s(F<-gr@vq;75&9GxTi-1;3a^1qE;zLzmd>4W$JLC?$u3Y7N5~7TN*nlDx=@Q zte$H(7?xvzgDryMdT;P~VrHFi{vw*tSHDKDler2m#?<~+Rz0K1?_U>M^-d>KxkgJO zJwc0616`r(uY=P^q+mo!kaz8d_1GL=>c;tbVsLWUi<-p_lV%IE4tNQzTRWZVs8(Bq z&5^}B#PX0KQ$)^=hG)3;2rN^m(%{XRH}h@C`Gz*DtDiedhBqc^A3w>SN9~v3%BapR zwqU|=E!WT%>9hn&YZMNM@?lU)0-P}Ph)?OFSf&u`=U)OARTLxy3|5W%&u5U7Vl5F8 zb?^AeaQOWh!ew3Qgr-pfErs<+Ylo)bhs!s>5=j!eqTr4AmT&@`Tq+JQ-NZmPj^Kx! z#D}J@S=iYpuWZ=_R@c6`3nq!B-anWj=gja_XBThtaT>8*Cu@|ydI8JUaIK^%T3hEX zkhZu(e9jQHdq-DtYRtdnAX9O7P-1SBtlBDf)WY+Y5FFnjW-u5q^nfsH^$kkLP<}si z5Nhus=+0!9jLjRk8Cnv!-yo>%z?wObUdLqaB2A_X=!Qf~?)Z|U(Ny$>ZaaQ;-@xxj_zqgw8HEc# zyPw{@DXnZSO9!LKzdV>t_#{aQTmn3!he@7tQm6|h?6oq+2J?J)^5rdBoGx{#25qsX z;gi&u0jmOCXEje5_9{fF3orV#QYcWNK{B=aRt z;))qsBT*cU#a2XJB-ht<^y!4Q6c;0ZP4}z(eW*2OM4`mAi8GFt+|T3;b^|$-BaLp=uJJ)iX60}@~z9X$!&SYo3|-Z^gdgi*H3K& zQ?d)wl=SwG8VlV>To*-ek+iON#0f${Fld)YWA*HYa}~`X2ihgS+b(nzgE*-JAKLwl zuT}Y(VK@2XhCBlqnbK2J`7Se*bsVT&c*mM-+$K$PUw3u zzJJt2tv;$xQA$WIKlb z=;ocN-07T2LL&_J<}FulGYm{H65S1b@rx1lRGz@q>rPuL)WF$q&;bd<>glXDWrBK_ z7Q(?wwitnDiKN?CDt4;vh%B`;A>~ej09_3hCm9@xlljidc!}`+TNbGTF!&wKd?ZZ0 zgzwF&Ibr5_Ov$%X{1&I}iMc%Xn@7Dl=J$?mADZE$~IoIyc6VQvXw z!E%>%$BJV?Z1XMcqGWw~MQ*EFNi;2sf+R}z$P&Cdm~Pw7owwuaS}V_`dx!zfj5H~+ zp&AYBP!kmyoJnLA8=Q zU=$EZ0o%t+Ef>DKx-(6FIJ6S6*0en0sL?$LfecH#lbyhxw_d+hDRZ0Bo1?*ifP6nH z;eYe&nEq9xRDE<*QbBpMNxdtmM90!<0GWdfJ`ycfnFXIJM1du(V+EsDxngOy)^qo! z>$sm5>4!x{z1LY~v&#?w7ZekHS>x-%9JJpseZih}jI)uDI+LDg=Xien*?iwo`S$pN z^L6ynoWpOCRw9U)OL=z70~K*KI~PO&mCHUa6k|K~G}ccROh?fr&d&x_D&GYR$zfrq z*9O(IO6{#lBUYDUg-jxgxn1PkM#WBx<8H?V73+zFtOQ>L?i(;3c)?sWd`qY%;MtBp z;2UCzQE64QD#aid$|AHj7$&&0G7~Gn^3G+=L>&uzUbH^iCcxz|5R!>pF||4ZGlpVy z^88%gZDewOES{xDJ|W3Odkxb0z%5^)L50oP6V=ZRqTW6z6GiI7#-MCtEoY6F69OepIA+|-4vQc?OK#5h{C2@Ip21<=C2%Uk( zkDX;rk2vN08qTqNeU26m4D|Ep1V#E0hCusBaApT)ePl7nG>%k;ZhNxx?Ivsp)YV>l zx^pEvzClp-zAJp(Z8wY{%m?l79Jt+i04mc_@g`QVFe4`-6068TyYD;p+}&NNDBQzW zD4B`jrtFysxhC9$S8d_1AiBG5P;^Y?BMagL;N-%^Ym#zK`}``G(1QwXrJF2~3s>NS zX>MUT9;{D*H|X_!H;9YaM!1!R)2>B?N9g==hMB55lmd)s^R~fF^MbW!c0p@vfV?Gj ziZ6dr4$pu+4xXJ?a1@Hy*cDWRo%T1H*=1t=^TQsv@y+&}fb5Xe!m1V6ar;lOUpt$c z0rg=nNdul8h7MfhtH~lW;xuH9F`Ma_AxA%N#!%p1(@nmggu-G-`Z?T1%Il`HuK-Rz{7N--`wj%yqk+K~Cvt=llOKiA&k1jlv=)FA3?9g_YGXrmW+BdwpO3l2=7!SRS* zc@gEfmNt7ND|z7w-Hn7&Y+@(C&*@Q+NbHr;xngZ?%3V%_S=-GfPbrnbs<5#Y4sc6; z^}HtqJSiC^VpDMM$15&**qOpBg`sJ-014k#M_Xpg4y(H1hL!nLI742-2YO-JXWEo* zhFQ_IAbf;H0#jo|(|3z_ul-8F$PG3@ENKX<5&yZL;gJc3WIZ{6PB6c%zOK*-$-;6; zL-{5ai7$+#-LxvcAwlDzj22%|lte?>SRtdohDm+Bbe3GByja0vgtS`mTrK8_@&dj1 zh=wC%E<~byX~oVS&GH^sOzMT0Hr+wfSz#T!0HK($Ig3%9EU%nQu%mWy@`0qeg*YsN zthmquCzq@y@i?|#bd&4}mc4^y*j3&C0DID4x_7*J$Pg2j;`kI zbI=up?3SF-726MD__@m$DUc|?G8Apt!fclB^iXXmHS-&y@;2i_5;+=ho6}F!v^)&( zx0pn^3zO^q)=jL9x zVi#;#Y04JKB^bNhR62<2NFN5bXTj?8m}F z{5|Q5@n4IoxMDNIkHC|b++r_-E!Zq{M1sOqK|f-N08dl#eb;X`k@v>BR%5ziRi{o@ z=#l)>9vr+E5MBTV*<@hYr^L1s%q$KjN0Sbp=NB-3Yr?Y(z6t6DIICE zwADxkcS9LyT@(45RRk%;*BG)tdd9J_n{o~q6w`E z3-iF_jwjR&GZ@#7BdjlIF3*J@G>>5(lY#M^o=a_E?7!1M3+>3cY@bUdVRhGvrBT>d z3KKmQQo3g3R7fkbu3#b>j%plV7V(k+1DJd(OwQy({U~#&!xUb84a?tu@W@ano#Q4! zh|Z|zt+_!ong@B&YZ8i{h?GuiaLF@DX|yuZkPIT2Xyi6^dp+9OB)a`ut&?Z+0LK`> zVNy2NYoPNVJVBHXHY6mFd%UN_M{NB^kUn|_|K|PuL8zp0cCd0Z9u|P>;fLg(LI%zt zwP_QY_%b9;IsS?CD~#=ijnmHg>x1pSx>@j-qB0{VDu|A+iN%m*9vPZ(M|2U|O12Pbo5N2Ps5 zINEWg%TYQddPX(+x++H2dPWv`I~Q05dPaKY9m$aiItp3}N$SZ_Not2->Kc_2S{hlJ z>CvGHnTojush@N-ls~0uri036*k+j~nI>;pm_?@3(vnjS(&N;%tzc%dlhWf#4gh<0 z!2eL!vq?0``a_w(k0vh#41)4ON&P#b>OXAy&*krEtAC(C1N}V@^gjSV2Or(PutNX) z=D+ho|C|Q*kvRS{?fdWH*5IEw>>tVJf8qR_L-;$=@9eEVk)A%@_y0fAKNHyR zD8HZW{zM_f{a+}5r_Jx@j6ZSK@%|^yzfK*$>+}0Q_a{yv$zO2(cGvqI@AuUHCmtx- zU-15XZvRU3|Hk=u(ET+W|40je3OvPMV&^|e;`jM~jQ@8W{t>i)O7;Jn|DO>49ptak h@khx1DGz@I`AY!HOM!v^F$(bU6aH|pBFaDh{U3O~NhJUP literal 0 HcmV?d00001 diff --git a/sbt-shading/src/sbt-test/sbt-shading/transitive-shading/project/plugins.sbt b/sbt-shading/src/sbt-test/sbt-shading/transitive-shading/project/plugins.sbt new file mode 100644 index 000000000..8f83e814d --- /dev/null +++ b/sbt-shading/src/sbt-test/sbt-shading/transitive-shading/project/plugins.sbt @@ -0,0 +1,31 @@ +{ + val pluginVersion = sys.props.getOrElse( + "plugin.version", + throw new RuntimeException( + """|The system property 'plugin.version' is not defined. + |Specify this property using the scriptedLaunchOpts -D.""".stripMargin + ) + ) + + addSbtPlugin("io.get-coursier" % "sbt-shading" % pluginVersion) +} + +// for the locally publish jarjar +resolvers += Resolver.mavenLocal + +val coursierJarjarVersion = "1.0.1-coursier-SNAPSHOT" + +def coursierJarjarFoundInM2 = + (file(sys.props("user.home")) / s".m2/repository/org/anarres/jarjar/jarjar-core/$coursierJarjarVersion").exists() + +def jarjarVersion = + if (coursierJarjarFoundInM2) + coursierJarjarVersion + else + sys.error( + "Ad hoc jarjar version not found. Run\n" + + " git clone https://github.com/alexarchambault/jarjar.git && cd jarjar && git checkout 249c8dbb970f8 && ./gradlew install\n" + + "to run this test" + ) + +libraryDependencies += "org.anarres.jarjar" % "jarjar-core" % jarjarVersion diff --git a/sbt-shading/src/sbt-test/sbt-shading/transitive-shading/src/main/scala/Main.scala b/sbt-shading/src/sbt-test/sbt-shading/transitive-shading/src/main/scala/Main.scala new file mode 100644 index 000000000..b7eee31a8 --- /dev/null +++ b/sbt-shading/src/sbt-test/sbt-shading/transitive-shading/src/main/scala/Main.scala @@ -0,0 +1,27 @@ +import java.io.File +import java.nio.file.Files + +import argonaut._ + +object Main extends App { + + val expectedClassName = + if (args.headOption == Some("--shaded")) + "test.shaded.argonaut.Json" + else + // Don't use the literal "argonaut.Json", that seems to get + // changed to "test.shaded.argonaut.Json" by shading + "argonaut" + '.' + "Json" + + val className = classOf[Json].getName + + Console.err.println(s"Expected class name: $expectedClassName") + Console.err.println(s"Class name: $className") + + if (className != expectedClassName) + sys.error(s"Expected class name $expectedClassName, got $className") + + val msg = Json.obj().nospaces + + Files.write(new File("output").toPath, msg.getBytes("UTF-8")) +} diff --git a/sbt-shading/src/sbt-test/sbt-shading/transitive-shading/test b/sbt-shading/src/sbt-test/sbt-shading/transitive-shading/test new file mode 100644 index 000000000..84b72a875 --- /dev/null +++ b/sbt-shading/src/sbt-test/sbt-shading/transitive-shading/test @@ -0,0 +1,9 @@ +$ delete output +> run +$ exists output +> publishLocal +$ exec java -jar coursier launch io.get-coursier.test:shading-transitive-test_2.11:0.1.0-SNAPSHOT +-$ exec java -jar coursier launch io.get-coursier.test:shading-transitive-test_2.11:0.1.0-SNAPSHOT -- --shaded +> shading:publishLocal +-$ exec java -jar coursier launch io.get-coursier.test:shading-transitive-test_2.11:0.1.0-SNAPSHOT +$ exec java -jar coursier launch io.get-coursier.test:shading-transitive-test_2.11:0.1.0-SNAPSHOT -- --shaded From 5583efffd00b76e7ccd19c2fcb7a78127ea4622e Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Tue, 31 Jan 2017 15:19:08 +0100 Subject: [PATCH 02/13] Move ivy xml generation In the hope that this might address issues with shading plugin on single core machines --- .../scala-2.10/coursier/CoursierPlugin.scala | 17 +++++++ .../main/scala-2.10/coursier/FromSbt.scala | 5 ++- .../{MakeIvyXml.scala => IvyXml.scala} | 45 +++++++++++++++++-- .../src/main/scala-2.10/coursier/Tasks.scala | 32 ------------- .../scala-2.10/coursier/ShadingPlugin.scala | 4 +- 5 files changed, 64 insertions(+), 39 deletions(-) rename plugin/src/main/scala-2.10/coursier/{MakeIvyXml.scala => IvyXml.scala} (65%) diff --git a/plugin/src/main/scala-2.10/coursier/CoursierPlugin.scala b/plugin/src/main/scala-2.10/coursier/CoursierPlugin.scala index 0778c35f9..c2c04c982 100644 --- a/plugin/src/main/scala-2.10/coursier/CoursierPlugin.scala +++ b/plugin/src/main/scala-2.10/coursier/CoursierPlugin.scala @@ -55,6 +55,21 @@ object CoursierPlugin extends AutoPlugin { ) ) + def makeIvyXmlBefore[T]( + task: TaskKey[T], + shadedConfigOpt: Option[(String, String)] + ): Setting[Task[T]] = + // not 100% sure that make writeFiles below happen before the actions triggered by task.value... + task := { + val currentProject = { + val proj = coursierProject.value + val publications = coursierPublications.value + proj.copy(publications = publications) + } + IvyXml.writeFiles(currentProject, shadedConfigOpt, ivySbt.value, streams.value.log) + task.value + } + def coursierSettings( shadedConfigOpt: Option[(String, String)], packageConfigs: Seq[(Configuration, String)] @@ -83,6 +98,8 @@ object CoursierPlugin extends AutoPlugin { withClassifiers = true, sbtClassifiers = true ), + makeIvyXmlBefore(deliverLocalConfiguration, shadedConfigOpt), + makeIvyXmlBefore(deliverConfiguration, shadedConfigOpt), update <<= Tasks.updateTask( shadedConfigOpt, withClassifiers = false diff --git a/plugin/src/main/scala-2.10/coursier/FromSbt.scala b/plugin/src/main/scala-2.10/coursier/FromSbt.scala index c162efad4..befd22c47 100644 --- a/plugin/src/main/scala-2.10/coursier/FromSbt.scala +++ b/plugin/src/main/scala-2.10/coursier/FromSbt.scala @@ -1,6 +1,7 @@ package coursier -import coursier.ivy.{ IvyXml, IvyRepository } +import coursier.ivy.IvyRepository +import coursier.ivy.IvyXml.{ mappings => ivyXmlMappings } import java.net.{ MalformedURLException, URL } @@ -71,7 +72,7 @@ object FromSbt { ) val mapping = module.configurations.getOrElse("compile") - val allMappings = IvyXml.mappings(mapping) + val allMappings = ivyXmlMappings(mapping) val attributes = if (module.explicitArtifacts.isEmpty) diff --git a/plugin/src/main/scala-2.10/coursier/MakeIvyXml.scala b/plugin/src/main/scala-2.10/coursier/IvyXml.scala similarity index 65% rename from plugin/src/main/scala-2.10/coursier/MakeIvyXml.scala rename to plugin/src/main/scala-2.10/coursier/IvyXml.scala index eb81ed8c7..b3972ea5e 100644 --- a/plugin/src/main/scala-2.10/coursier/MakeIvyXml.scala +++ b/plugin/src/main/scala-2.10/coursier/IvyXml.scala @@ -1,10 +1,49 @@ package coursier -import scala.xml.{ Node, PrefixedAttribute } +import coursier.internal.FileUtil +import org.apache.ivy.core.module.id.ModuleRevisionId -object MakeIvyXml { +import scala.collection.JavaConverters._ +import scala.xml.{Node, PrefixedAttribute} - def apply(project0: Project, shadedConfigOpt: Option[String]): Node = { +object IvyXml { + + // These are required for publish to be fine, later on. + def writeFiles( + currentProject: Project, + shadedConfigOpt: Option[(String, String)], + ivySbt: sbt.IvySbt, + log: sbt.Logger + ): Unit = { + + val ivyCacheManager = ivySbt.withIvy(log)(ivy => + ivy.getResolutionCacheManager + ) + + val ivyModule = ModuleRevisionId.newInstance( + currentProject.module.organization, + currentProject.module.name, + currentProject.version, + currentProject.module.attributes.asJava + ) + + val cacheIvyFile = ivyCacheManager.getResolvedIvyFileInCache(ivyModule) + val cacheIvyPropertiesFile = ivyCacheManager.getResolvedIvyPropertiesInCache(ivyModule) + + val printer = new scala.xml.PrettyPrinter(80, 2) + + val content0 = """""" + '\n' + + printer.format(content(currentProject, shadedConfigOpt.map(_._2))) + cacheIvyFile.getParentFile.mkdirs() + log.info(s"Writing Ivy file $cacheIvyFile") + FileUtil.write(cacheIvyFile, content0.getBytes("UTF-8")) + + // Just writing an empty file here... Are these only used? + cacheIvyPropertiesFile.getParentFile.mkdirs() + FileUtil.write(cacheIvyPropertiesFile, Array()) + } + + def content(project0: Project, shadedConfigOpt: Option[String]): Node = { val filterOutDependencies = shadedConfigOpt.toSet[String].flatMap { shadedConfig => diff --git a/plugin/src/main/scala-2.10/coursier/Tasks.scala b/plugin/src/main/scala-2.10/coursier/Tasks.scala index 33bb136e2..2dbcc116b 100644 --- a/plugin/src/main/scala-2.10/coursier/Tasks.scala +++ b/plugin/src/main/scala-2.10/coursier/Tasks.scala @@ -844,42 +844,10 @@ object Tasks { proj.copy(publications = publications) } - val ivySbt0 = ivySbt.value - val ivyCacheManager = ivySbt0.withIvy(streams.value.log)(ivy => - ivy.getResolutionCacheManager - ) - - val ivyModule = ModuleRevisionId.newInstance( - currentProject.module.organization, - currentProject.module.name, - currentProject.version, - currentProject.module.attributes.asJava - ) - val cacheIvyFile = ivyCacheManager.getResolvedIvyFileInCache(ivyModule) - val cacheIvyPropertiesFile = ivyCacheManager.getResolvedIvyPropertiesInCache(ivyModule) - val log = streams.value.log val verbosityLevel = coursierVerbosity.value - // required for publish to be fine, later on - def writeIvyFiles() = { - val printer = new scala.xml.PrettyPrinter(80, 2) - - val b = new StringBuilder - b ++= """""" - b += '\n' - b ++= printer.format(MakeIvyXml(currentProject, shadedConfigOpt.map(_._2))) - cacheIvyFile.getParentFile.mkdirs() - FileUtil.write(cacheIvyFile, b.result().getBytes("UTF-8")) - - // Just writing an empty file here... Are these only used? - cacheIvyPropertiesFile.getParentFile.mkdirs() - FileUtil.write(cacheIvyPropertiesFile, "".getBytes("UTF-8")) - } - - writeIvyFiles() - val res = { if (withClassifiers && sbtClassifiers) coursierSbtClassifiersResolution diff --git a/sbt-shading/src/main/scala-2.10/coursier/ShadingPlugin.scala b/sbt-shading/src/main/scala-2.10/coursier/ShadingPlugin.scala index 510fcdaf9..9b262a61a 100644 --- a/sbt-shading/src/main/scala-2.10/coursier/ShadingPlugin.scala +++ b/sbt-shading/src/main/scala-2.10/coursier/ShadingPlugin.scala @@ -1,6 +1,6 @@ package coursier -import coursier.ivy.IvyXml +import coursier.ivy.IvyXml.{ mappings => ivyXmlMappings } import sbt.Keys._ import sbt.{AutoPlugin, Compile, Configuration, TaskKey, inConfig} @@ -69,7 +69,7 @@ object ShadingPlugin extends AutoPlugin { .map(c => c.copy(extendsConfigs = c.extendsConfigs.filter(_.name != Shaded.name))), libraryDependencies := libraryDependencies.in(baseSbtConfiguration).value.filter { dep => val isShaded = dep.configurations.exists { mappings => - IvyXml.mappings(mappings).exists(_._1 == Shaded.name) + ivyXmlMappings(mappings).exists(_._1 == Shaded.name) } !isShaded From 3b102da857192c68a937475d5cbdba4c1a16ddc6 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Tue, 31 Jan 2017 15:23:03 +0100 Subject: [PATCH 03/13] Run sbt-shading tests on CI --- .ci/travis.sh | 4 ++-- appveyor.yml | 21 +++++++++------------ 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/.ci/travis.sh b/.ci/travis.sh index 9a1c66ac8..e81ac14dc 100755 --- a/.ci/travis.sh +++ b/.ci/travis.sh @@ -43,7 +43,7 @@ function isMasterOrDevelop() { SBT_COMMANDS="compile test it:test" -RUN_SHADING_TESTS=0 +RUN_SHADING_TESTS=1 if echo "$TRAVIS_SCALA_VERSION" | grep -q "^2\.10"; then SBT_COMMANDS="$SBT_COMMANDS publishLocal" # to make the scripted tests happy @@ -68,7 +68,7 @@ if echo "$TRAVIS_SCALA_VERSION" | grep -q "^2\.10"; then rm -rf jarjar fi - SBT_COMMANDS="$SBT_COMMANDS sbt-shading/scripted" + SBT_COMMANDS="$SBT_COMMANDS plugin/publishLocal sbt-shading/scripted" fi fi diff --git a/appveyor.yml b/appveyor.yml index c9ad467a4..8b1a98d8d 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -14,15 +14,14 @@ install: - cmd: SET PATH=C:\sbt\sbt\bin;%JAVA_HOME%\bin;%PATH% - cmd: SET SBT_OPTS=-XX:MaxPermSize=2g -Xmx4g - cmd: SET COURSIER_NO_TERM=1 - # required by the sbt-shading scripted tests, disabled for now (see below) - # ps: | - # if (!(Test-Path 'C:\Users\appveyor\.m2\repository\org\anarres\jarjar\jarjar-core\1.0.1-coursier-SNAPSHOT')) { - # iex 'git clone https://github.com/alexarchambault/jarjar' - # Set-Location -Path jarjar - # iex 'git checkout 249c8dbb970f8' - # iex './gradlew.bat :jarjar-core:install' - # Set-Location -Path .. - # } + - ps: | + if (!(Test-Path 'C:\Users\appveyor\.m2\repository\org\anarres\jarjar\jarjar-core\1.0.1-coursier-SNAPSHOT')) { + iex 'git clone https://github.com/alexarchambault/jarjar' + Set-Location -Path jarjar + iex 'git checkout 249c8dbb970f8' + iex './gradlew.bat :jarjar-core:install' + Set-Location -Path .. + } build_script: - sbt ++2.11.8 clean compile coreJVM/publishLocal http-server/publishLocal - sbt ++2.10.6 clean compile @@ -31,9 +30,7 @@ test_script: - ps: Start-Job { & java -jar -noverify C:\projects\coursier\coursier launch -r http://dl.bintray.com/scalaz/releases io.get-coursier:http-server-java7_2.11:1.0.0-SNAPSHOT -- -d /C:/projects/coursier/tests/jvm/src/test/resources/test-repo/http/abc.com -u user -P pass -r realm -v } - sbt ++2.12.0 testsJVM/test testsJVM/it:test # Would node be around for testsJS/test? - sbt ++2.11.8 testsJVM/test testsJVM/it:test - - sbt ++2.10.6 testsJVM/test testsJVM/it:test plugin/scripted - # not running the scripted tests of sbt-shading here, as these seem to fail randomly on single core machines - # (which is kind of worrying) + - sbt ++2.10.6 testsJVM/test testsJVM/it:test plugin/scripted plugin/publishLocal sbt-shading/scripted cache: - C:\Users\appveyor\.ivy2 - C:\Users\appveyor\.m2 From 51eb69db280c0ba05becccfbdce49705a6e32573 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Mon, 30 Jan 2017 23:00:23 +0100 Subject: [PATCH 04/13] Add coursier.bat script --- coursier.bat | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 coursier.bat diff --git a/coursier.bat b/coursier.bat new file mode 100644 index 000000000..194c3aed2 --- /dev/null +++ b/coursier.bat @@ -0,0 +1,29 @@ +@REM https://github.com/xerial/sbt-pack/blob/master/src/main/templates/launch-bat.mustache +@REM would be worth getting more inspiration from + +@echo off + +SET ERROR_CODE=0 + +SET LAUNCHER_PATH=%~dp0/coursier + +IF NOT EXIST %LAUNCHER_PATH% ( + bitsadmin /transfer "DownloadCoursierLauncher" https://github.com/alexarchambault/coursier/raw/master/coursier %LAUNCHER_PATH% +) + +SET CMD_LINE_ARGS=%* + +java -jar %LAUNCHER_PATH% %CMD_LINE_ARGS% + +IF ERRORLEVEL 1 GOTO error +GOTO end + +:error +SET ERROR_CODE=1 + +:end +SET LAUNCHER_PATH= +SET CMD_LINE_ARGS= + +EXIT /B %ERROR_CODE% + From 98a4e6e617ce3e78ba18a1e466c8111ce3391aee Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Mon, 30 Jan 2017 23:05:40 +0100 Subject: [PATCH 05/13] Bump plugin dependencies --- project/plugins.sbt | 8 ++++---- project/project/plugins.sbt | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index 3af981297..2997486e7 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,9 +1,9 @@ -addSbtPlugin("org.xerial.sbt" % "sbt-pack" % "0.8.0") -addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.13") +addSbtPlugin("org.xerial.sbt" % "sbt-pack" % "0.8.2") +addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.14") addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.0.0") addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.4.0") -addSbtPlugin("org.tpolecat" % "tut-plugin" % "0.4.6") -addSbtPlugin("io.get-coursier" % "sbt-coursier" % "1.0.0-M14") +addSbtPlugin("org.tpolecat" % "tut-plugin" % "0.4.8") +addSbtPlugin("io.get-coursier" % "sbt-coursier" % "1.0.0-M15-1") addSbtPlugin("com.typesafe.sbt" % "sbt-proguard" % "0.2.2") addSbtPlugin("com.typesafe" % "sbt-mima-plugin" % "0.1.11") libraryDependencies += "org.scala-sbt" % "scripted-plugin" % sbtVersion.value diff --git a/project/project/plugins.sbt b/project/project/plugins.sbt index 2617da214..1994c65c9 100644 --- a/project/project/plugins.sbt +++ b/project/project/plugins.sbt @@ -1 +1 @@ -addSbtPlugin("io.get-coursier" % "sbt-coursier" % "1.0.0-M14") +addSbtPlugin("io.get-coursier" % "sbt-coursier" % "1.0.0-M15-1") From e94dbc7e6868fa5908635ed0e64b835153d5ff59 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Mon, 30 Jan 2017 23:07:14 +0100 Subject: [PATCH 06/13] Switch to scala 2.12.1 --- .travis.yml | 2 +- appveyor.yml | 2 +- build.sbt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4b2fda4ff..b9d531540 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,7 +12,7 @@ script: # - bash <(curl -s https://codecov.io/bash) matrix: include: - - env: TRAVIS_SCALA_VERSION=2.12.0 PUBLISH=1 + - env: TRAVIS_SCALA_VERSION=2.12.1 PUBLISH=1 os: linux jdk: oraclejdk8 - env: TRAVIS_SCALA_VERSION=2.11.8 PUBLISH=1 diff --git a/appveyor.yml b/appveyor.yml index 8b1a98d8d..a58ad00ae 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -28,7 +28,7 @@ build_script: - sbt ++2.10.6 coreJVM/publishLocal cache/publishLocal # to make the scripted tests happy test_script: - ps: Start-Job { & java -jar -noverify C:\projects\coursier\coursier launch -r http://dl.bintray.com/scalaz/releases io.get-coursier:http-server-java7_2.11:1.0.0-SNAPSHOT -- -d /C:/projects/coursier/tests/jvm/src/test/resources/test-repo/http/abc.com -u user -P pass -r realm -v } - - sbt ++2.12.0 testsJVM/test testsJVM/it:test # Would node be around for testsJS/test? + - sbt ++2.12.1 testsJVM/test testsJVM/it:test # Would node be around for testsJS/test? - sbt ++2.11.8 testsJVM/test testsJVM/it:test - sbt ++2.10.6 testsJVM/test testsJVM/it:test plugin/scripted plugin/publishLocal sbt-shading/scripted cache: diff --git a/build.sbt b/build.sbt index 0ff75dd5a..17e290b61 100644 --- a/build.sbt +++ b/build.sbt @@ -98,7 +98,7 @@ lazy val scalaVersionAgnosticCommonSettings = Seq( lazy val commonSettings = scalaVersionAgnosticCommonSettings ++ Seq( scalaVersion := "2.11.8", - crossScalaVersions := Seq("2.12.0", "2.11.8", "2.10.6"), + crossScalaVersions := Seq("2.12.1", "2.11.8", "2.10.6"), libraryDependencies ++= { if (scalaBinaryVersion.value == "2.10") Seq(compilerPlugin("org.scalamacros" % "paradise" % "2.1.0" cross CrossVersion.full)) From ff0e441f43c3a3336cd62c9c08281ef9dbd94c23 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Mon, 30 Jan 2017 23:07:51 +0100 Subject: [PATCH 07/13] Set default scala version to 2.12.1 Rather than 2.11.8 --- .ci/travis.sh | 2 +- build.sbt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.ci/travis.sh b/.ci/travis.sh index e81ac14dc..f52120f17 100755 --- a/.ci/travis.sh +++ b/.ci/travis.sh @@ -28,7 +28,7 @@ function isMasterOrDevelop() { } # Required for ~/.ivy2/local repo tests -~/sbt coreJVM/publishLocal http-server/publishLocal +~/sbt ++2.11.8 coreJVM/publishLocal http-server/publishLocal # Required for HTTP authentication tests ./coursier launch \ diff --git a/build.sbt b/build.sbt index 17e290b61..08e60bd78 100644 --- a/build.sbt +++ b/build.sbt @@ -97,7 +97,7 @@ lazy val scalaVersionAgnosticCommonSettings = Seq( ) ++ releaseSettings lazy val commonSettings = scalaVersionAgnosticCommonSettings ++ Seq( - scalaVersion := "2.11.8", + scalaVersion := "2.12.1", crossScalaVersions := Seq("2.12.1", "2.11.8", "2.10.6"), libraryDependencies ++= { if (scalaBinaryVersion.value == "2.10") From aae1f1e2a7d0b72e8bfd0d785a5d4768fe2aecda Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Mon, 30 Jan 2017 23:28:45 +0100 Subject: [PATCH 08/13] Clean-up things in build.sbt --- build.sbt | 278 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 145 insertions(+), 133 deletions(-) diff --git a/build.sbt b/build.sbt index 08e60bd78..8486bb71a 100644 --- a/build.sbt +++ b/build.sbt @@ -1,139 +1,13 @@ import java.io.FileOutputStream -import com.typesafe.tools.mima.plugin.MimaPlugin.mimaDefaultSettings - val binaryCompatibilityVersion = "1.0.0-M7" lazy val IntegrationTest = config("it") extend Test -lazy val releaseSettings = Seq( - publishMavenStyle := true, - licenses := Seq("Apache 2.0" -> url("http://opensource.org/licenses/Apache-2.0")), - homepage := Some(url("https://github.com/alexarchambault/coursier")), - scmInfo := Some(ScmInfo( - url("https://github.com/alexarchambault/coursier.git"), - "scm:git:github.com/alexarchambault/coursier.git", - Some("scm:git:git@github.com:alexarchambault/coursier.git") - )), - pomExtra := { - - - alexarchambault - Alexandre Archambault - https://github.com/alexarchambault - - - }, - publishTo := { - val nexus = "https://oss.sonatype.org/" - if (isSnapshot.value) - Some("snapshots" at nexus + "content/repositories/snapshots") - else - Some("releases" at nexus + "service/local/staging/deploy/maven2") - }, - credentials ++= { - Seq("SONATYPE_USER", "SONATYPE_PASS").map(sys.env.get) match { - case Seq(Some(user), Some(pass)) => - Seq(Credentials("Sonatype Nexus Repository Manager", "oss.sonatype.org", user, pass)) - case _ => - Seq() - } - } -) - -lazy val noPublishSettings = Seq( - publish := (), - publishLocal := (), - publishArtifact := false -) - -def noPublishForScalaVersionSettings(sbv: String*) = Seq( - publish := { - if (sbv.contains(scalaBinaryVersion.value)) - () - else - publish.value - }, - publishLocal := { - if (sbv.contains(scalaBinaryVersion.value)) - () - else - publishLocal.value - }, - publishArtifact := { - if (sbv.contains(scalaBinaryVersion.value)) - false - else - publishArtifact.value - } -) - -lazy val scalaVersionAgnosticCommonSettings = Seq( - organization := "io.get-coursier", - resolvers ++= Seq( - "Scalaz Bintray Repo" at "http://dl.bintray.com/scalaz/releases", - Resolver.sonatypeRepo("releases") - ), - scalacOptions ++= { - scalaBinaryVersion.value match { - case "2.10" | "2.11" => - Seq("-target:jvm-1.6") - case _ => - Seq() - } - }, - javacOptions ++= { - scalaBinaryVersion.value match { - case "2.10" | "2.11" => - Seq( - "-source", "1.6", - "-target", "1.6" - ) - case _ => - Seq() - } - }, - javacOptions in Keys.doc := Seq() -) ++ releaseSettings - -lazy val commonSettings = scalaVersionAgnosticCommonSettings ++ Seq( - scalaVersion := "2.12.1", - crossScalaVersions := Seq("2.12.1", "2.11.8", "2.10.6"), - libraryDependencies ++= { - if (scalaBinaryVersion.value == "2.10") - Seq(compilerPlugin("org.scalamacros" % "paradise" % "2.1.0" cross CrossVersion.full)) - else - Seq() - } -) - -lazy val pluginSettings = - scalaVersionAgnosticCommonSettings ++ - noPublishForScalaVersionSettings("2.11", "2.12") ++ - ScriptedPlugin.scriptedSettings ++ - Seq( - scriptedLaunchOpts ++= Seq( - "-Xmx1024M", - "-XX:MaxPermSize=256M", - "-Dplugin.version=" + version.value, - "-Dsbttest.base=" + (sourceDirectory.value / "sbt-test").getAbsolutePath - ), - scriptedBufferLog := false, - sbtPlugin := (scalaBinaryVersion.value == "2.10"), - resolvers ++= Seq( - // added so that 2.10 artifacts of the other modules can be found by - // the too-naive-for-now inter-project resolver of the coursier SBT plugin - Resolver.sonatypeRepo("snapshots"), - // added for sbt-scripted to be fine even with ++2.11.x - Resolver.typesafeIvyRepo("releases") - ) - ) - -val scalazVersion = "7.2.7" +lazy val scalazVersion = "7.2.7" lazy val core = crossProject - .settings(commonSettings: _*) - .settings(mimaDefaultSettings: _*) + .settings(commonSettings) .settings( name := "coursier", libraryDependencies ++= Seq( @@ -282,10 +156,10 @@ lazy val `fetch-js` = project lazy val tests = crossProject .dependsOn(core) - .settings(commonSettings: _*) - .settings(noPublishSettings: _*) + .settings(commonSettings) + .settings(noPublishSettings) .configs(IntegrationTest) - .settings(Defaults.itSettings: _*) + .settings(Defaults.itSettings) .settings( name := "coursier-tests", libraryDependencies += { @@ -311,7 +185,6 @@ lazy val testsJs = tests.js.dependsOn(`fetch-js` % "test") lazy val cache = project .dependsOn(coreJvm) .settings(commonSettings) - .settings(mimaDefaultSettings) .settings( name := "coursier-cache", libraryDependencies += "org.scalaz" %% "scalaz-concurrent" % scalazVersion, @@ -620,10 +493,149 @@ lazy val okhttp = project ) lazy val `coursier` = project.in(file(".")) - .aggregate(coreJvm, coreJs, `fetch-js`, testsJvm, testsJs, cache, bootstrap, cli, plugin, `sbt-shading`, web, doc, `http-server`, okhttp) + .aggregate( + coreJvm, + coreJs, + `fetch-js`, + testsJvm, + testsJs, + cache, + bootstrap, + cli, + plugin, + `sbt-shading`, + web, + doc, + `http-server`, + okhttp + ) .settings(commonSettings) .settings(noPublishSettings) .settings(releaseSettings) .settings( moduleName := "coursier-root" ) + +lazy val releaseSettings = Seq( + publishMavenStyle := true, + licenses := Seq("Apache 2.0" -> url("http://opensource.org/licenses/Apache-2.0")), + homepage := Some(url("https://github.com/alexarchambault/coursier")), + scmInfo := Some(ScmInfo( + url("https://github.com/alexarchambault/coursier.git"), + "scm:git:github.com/alexarchambault/coursier.git", + Some("scm:git:git@github.com:alexarchambault/coursier.git") + )), + pomExtra := { + + + alexarchambault + Alexandre Archambault + https://github.com/alexarchambault + + + }, + publishTo := { + val nexus = "https://oss.sonatype.org/" + if (isSnapshot.value) + Some("snapshots" at nexus + "content/repositories/snapshots") + else + Some("releases" at nexus + "service/local/staging/deploy/maven2") + }, + credentials ++= { + Seq("SONATYPE_USER", "SONATYPE_PASS").map(sys.env.get) match { + case Seq(Some(user), Some(pass)) => + Seq(Credentials("Sonatype Nexus Repository Manager", "oss.sonatype.org", user, pass)) + case _ => + Seq() + } + } +) + +lazy val noPublishSettings = Seq( + publish := (), + publishLocal := (), + publishArtifact := false +) + +def noPublishForScalaVersionSettings(sbv: String*) = Seq( + publish := { + if (sbv.contains(scalaBinaryVersion.value)) + () + else + publish.value + }, + publishLocal := { + if (sbv.contains(scalaBinaryVersion.value)) + () + else + publishLocal.value + }, + publishArtifact := { + if (sbv.contains(scalaBinaryVersion.value)) + false + else + publishArtifact.value + } +) + +lazy val scalaVersionAgnosticCommonSettings = Seq( + organization := "io.get-coursier", + resolvers ++= Seq( + "Scalaz Bintray Repo" at "http://dl.bintray.com/scalaz/releases", + Resolver.sonatypeRepo("releases") + ), + scalacOptions ++= { + scalaBinaryVersion.value match { + case "2.10" | "2.11" => + Seq("-target:jvm-1.6") + case _ => + Seq() + } + }, + javacOptions ++= { + scalaBinaryVersion.value match { + case "2.10" | "2.11" => + Seq( + "-source", "1.6", + "-target", "1.6" + ) + case _ => + Seq() + } + }, + javacOptions in Keys.doc := Seq() +) ++ releaseSettings + +lazy val commonSettings = scalaVersionAgnosticCommonSettings ++ Seq( + scalaVersion := "2.12.1", + crossScalaVersions := Seq("2.12.1", "2.11.8", "2.10.6"), + libraryDependencies ++= { + if (scalaBinaryVersion.value == "2.10") + Seq(compilerPlugin("org.scalamacros" % "paradise" % "2.1.0" cross CrossVersion.full)) + else + Seq() + } +) + +lazy val pluginSettings = + scalaVersionAgnosticCommonSettings ++ + noPublishForScalaVersionSettings("2.11", "2.12") ++ + ScriptedPlugin.scriptedSettings ++ + Seq( + scriptedLaunchOpts ++= Seq( + "-Xmx1024M", + "-XX:MaxPermSize=256M", + "-Dplugin.version=" + version.value, + "-Dsbttest.base=" + (sourceDirectory.value / "sbt-test").getAbsolutePath + ), + scriptedBufferLog := false, + sbtPlugin := (scalaBinaryVersion.value == "2.10"), + resolvers ++= Seq( + // added so that 2.10 artifacts of the other modules can be found by + // the too-naive-for-now inter-project resolver of the coursier SBT plugin + Resolver.sonatypeRepo("snapshots"), + // added for sbt-scripted to be fine even with ++2.11.x + Resolver.typesafeIvyRepo("releases") + ) + ) + From 704811efe9d9415a70f0cec4e92d99fedb48a1e6 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Mon, 30 Jan 2017 23:30:22 +0100 Subject: [PATCH 09/13] Bump dependencies --- build.sbt | 14 +++++++------- .../io.get-coursier/coursier_2.11/1.0.0-SNAPSHOT | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/build.sbt b/build.sbt index 8486bb71a..ec4258778 100644 --- a/build.sbt +++ b/build.sbt @@ -107,11 +107,11 @@ lazy val core = crossProject .jvmSettings( libraryDependencies ++= Seq( - "org.jsoup" % "jsoup" % "1.9.2" + "org.jsoup" % "jsoup" % "1.10.2" ) ++ { if (scalaBinaryVersion.value == "2.10") Seq() else Seq( - "org.scala-lang.modules" %% "scala-xml" % "1.0.5" + "org.scala-lang.modules" %% "scala-xml" % "1.0.6" ) }, resourceGenerators.in(Compile) += { @@ -171,7 +171,7 @@ lazy val tests = crossProject "org.scala-lang.modules" %% "scala-async" % asyncVersion % "provided" }, - libraryDependencies += "com.lihaoyi" %%% "utest" % "0.4.4" % "test", + libraryDependencies += "com.lihaoyi" %%% "utest" % "0.4.5" % "test", unmanagedResourceDirectories in Test += (baseDirectory in LocalRootProject).value / "tests" / "shared" / "src" / "test" / "resources", testFrameworks += new TestFramework("utest.runner.Framework") ) @@ -279,7 +279,7 @@ lazy val cli = project name := "coursier-cli", libraryDependencies ++= { if (scalaBinaryVersion.value == "2.11") - Seq("com.github.alexarchambault" %% "case-app" % "1.1.2") + Seq("com.github.alexarchambault" %% "case-app" % "1.1.3") else Seq() }, @@ -407,7 +407,7 @@ lazy val web = project libraryDependencies ++= { if (scalaBinaryVersion.value == "2.11") Seq( - "be.doeraene" %%% "scalajs-jquery" % "0.9.0", + "be.doeraene" %%% "scalajs-jquery" % "0.9.1", "com.github.japgolly.scalajs-react" %%% "core" % "0.9.0" ) else @@ -474,8 +474,8 @@ lazy val `http-server` = project Seq( "org.http4s" %% "http4s-blazeserver" % http4sVersion, "org.http4s" %% "http4s-dsl" % http4sVersion, - "org.slf4j" % "slf4j-nop" % "1.7.21", - "com.github.alexarchambault" %% "case-app" % "1.1.2" + "org.slf4j" % "slf4j-nop" % "1.7.22", + "com.github.alexarchambault" %% "case-app" % "1.1.3" ) else Seq() diff --git a/tests/shared/src/test/resources/resolutions/io.get-coursier/coursier_2.11/1.0.0-SNAPSHOT b/tests/shared/src/test/resources/resolutions/io.get-coursier/coursier_2.11/1.0.0-SNAPSHOT index cd8ddc0fb..3027785bf 100644 --- a/tests/shared/src/test/resources/resolutions/io.get-coursier/coursier_2.11/1.0.0-SNAPSHOT +++ b/tests/shared/src/test/resources/resolutions/io.get-coursier/coursier_2.11/1.0.0-SNAPSHOT @@ -2,7 +2,7 @@ com.lihaoyi:fastparse-utils_2.11:0.4.2:default com.lihaoyi:fastparse_2.11:0.4.2:default com.lihaoyi:sourcecode_2.11:0.1.3:default io.get-coursier:coursier_2.11:1.0.0-SNAPSHOT:compile -org.jsoup:jsoup:1.9.2:default +org.jsoup:jsoup:1.10.2:default org.scala-lang:scala-library:2.11.8:default -org.scala-lang.modules:scala-xml_2.11:1.0.5:default +org.scala-lang.modules:scala-xml_2.11:1.0.6:default org.scalaz:scalaz-core_2.11:7.2.7:default From b65a76136fa7b8df76374a4014de6967d6677f24 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Tue, 31 Jan 2017 16:19:31 +0100 Subject: [PATCH 10/13] Switch to sbt-mima 0.1.13, update mima settings In particular, check compatibility only against current latest version New issues unearthed after mima plugin version bump --- build.sbt | 155 +++++++------------------------------------- project/plugins.sbt | 2 +- 2 files changed, 25 insertions(+), 132 deletions(-) diff --git a/build.sbt b/build.sbt index ec4258778..313a76c9f 100644 --- a/build.sbt +++ b/build.sbt @@ -1,6 +1,7 @@ import java.io.FileOutputStream -val binaryCompatibilityVersion = "1.0.0-M7" +val binaryCompatibilityVersion = "1.0.0-M14" +val binaryCompatibility212Version = "1.0.0-M15" lazy val IntegrationTest = config("it") extend Test @@ -8,26 +9,21 @@ lazy val scalazVersion = "7.2.7" lazy val core = crossProject .settings(commonSettings) + .settings(mimaPreviousArtifactSettings) .settings( name := "coursier", libraryDependencies ++= Seq( "org.scalaz" %%% "scalaz-core" % scalazVersion, "com.lihaoyi" %%% "fastparse" % "0.4.2" ), - mimaPreviousArtifacts := { - scalaBinaryVersion.value match { - case "2.10" | "2.11" => - Set("com.github.alexarchambault" %% moduleName.value % binaryCompatibilityVersion) - case _ => - Set() - } - }, mimaBinaryIssueFilters ++= { import com.typesafe.tools.mima.core._ Seq( - // Since 1.0.0-M15 - // reworked profile activation + ProblemFilters.exclude[IncompatibleResultTypeProblem]("coursier.package#Resolution.apply$default$9"), + ProblemFilters.exclude[DirectMissingMethodProblem]("coursier.package#Resolution.apply"), + ProblemFilters.exclude[IncompatibleResultTypeProblem]("coursier.core.Resolution.copy$default$9"), + ProblemFilters.exclude[IncompatibleResultTypeProblem]("coursier.core.Resolution.copyWithCache$default$8"), ProblemFilters.exclude[DirectMissingMethodProblem]("coursier.core.Resolution.copy"), ProblemFilters.exclude[DirectMissingMethodProblem]("coursier.core.Resolution.profileActivation"), ProblemFilters.exclude[DirectMissingMethodProblem]("coursier.core.Resolution.copyWithCache"), @@ -37,70 +33,7 @@ lazy val core = crossProject ProblemFilters.exclude[MissingTypesProblem]("coursier.core.Activation$"), ProblemFilters.exclude[DirectMissingMethodProblem]("coursier.core.Activation.apply"), ProblemFilters.exclude[DirectMissingMethodProblem]("coursier.core.Resolution.profiles"), - ProblemFilters.exclude[DirectMissingMethodProblem]("coursier.core.Resolution.apply"), - // Since 1.0.0-M13 - // reworked VersionConstraint - ProblemFilters.exclude[MissingClassProblem]("coursier.core.VersionConstraint$Interval"), - ProblemFilters.exclude[MissingClassProblem]("coursier.core.VersionConstraint$Preferred"), - ProblemFilters.exclude[MissingClassProblem]("coursier.core.VersionConstraint$Preferred$"), - ProblemFilters.exclude[MissingClassProblem]("coursier.core.VersionConstraint$Interval$"), - ProblemFilters.exclude[FinalClassProblem]("coursier.core.VersionConstraint"), - ProblemFilters.exclude[IncompatibleResultTypeProblem]("coursier.core.VersionConstraint.repr"), - ProblemFilters.exclude[IncompatibleMethTypeProblem]("coursier.core.VersionConstraint.this"), - // Extra `actualVersion` field in `Project` - ProblemFilters.exclude[MissingTypesProblem]("coursier.core.Project$"), - ProblemFilters.exclude[MissingMethodProblem]("coursier.core.Project.apply"), - ProblemFilters.exclude[MissingMethodProblem]("coursier.core.Project.copy"), - ProblemFilters.exclude[MissingMethodProblem]("coursier.core.Project.this"), - // Reworked Ivy pattern handling - ProblemFilters.exclude[DirectMissingMethodProblem]("coursier.ivy.Pattern.pattern"), - ProblemFilters.exclude[DirectMissingMethodProblem]("coursier.ivy.Pattern.copy"), - ProblemFilters.exclude[DirectMissingMethodProblem]("coursier.ivy.Pattern.properties"), - ProblemFilters.exclude[DirectMissingMethodProblem]("coursier.ivy.Pattern.parts"), - ProblemFilters.exclude[DirectMissingMethodProblem]("coursier.ivy.Pattern.substitute"), - ProblemFilters.exclude[DirectMissingMethodProblem]("coursier.ivy.Pattern.this"), - ProblemFilters.exclude[DirectMissingMethodProblem]("coursier.ivy.Pattern.substituteProperties"), - ProblemFilters.exclude[DirectMissingMethodProblem]("coursier.ivy.Pattern.propertyRegex"), - ProblemFilters.exclude[DirectMissingMethodProblem]("coursier.ivy.Pattern.apply"), - ProblemFilters.exclude[DirectMissingMethodProblem]("coursier.ivy.Pattern.variableRegex"), - ProblemFilters.exclude[DirectMissingMethodProblem]("coursier.ivy.Pattern.optionalPartRegex"), - ProblemFilters.exclude[MissingClassProblem]("coursier.ivy.Pattern$PatternPart$Literal$"), - ProblemFilters.exclude[MissingClassProblem]("coursier.ivy.Pattern$PatternPart"), - ProblemFilters.exclude[MissingClassProblem]("coursier.ivy.Pattern$PatternPart$"), - ProblemFilters.exclude[IncompatibleMethTypeProblem]("coursier.ivy.IvyRepository.apply"), - ProblemFilters.exclude[MissingClassProblem]("coursier.ivy.Pattern$PatternPart$Optional$"), - ProblemFilters.exclude[MissingClassProblem]("coursier.ivy.Pattern$PatternPart$Literal"), - ProblemFilters.exclude[MissingClassProblem]("coursier.ivy.Pattern$PatternPart$Optional"), - ProblemFilters.exclude[IncompatibleResultTypeProblem]("coursier.ivy.IvyRepository.pattern"), - ProblemFilters.exclude[IncompatibleMethTypeProblem]("coursier.ivy.IvyRepository.copy"), - ProblemFilters.exclude[DirectMissingMethodProblem]("coursier.ivy.IvyRepository.properties"), - ProblemFilters.exclude[IncompatibleResultTypeProblem]("coursier.ivy.IvyRepository.metadataPattern"), - ProblemFilters.exclude[IncompatibleMethTypeProblem]("coursier.ivy.IvyRepository.this"), - ProblemFilters.exclude[IncompatibleResultTypeProblem]("coursier.util.Parse.repository"), - // Since 1.0.0-M12 - // Extra `authentication` field - ProblemFilters.exclude[MissingMethodProblem]("coursier.core.Artifact.apply"), - ProblemFilters.exclude[MissingMethodProblem]("coursier.core.Artifact.copy"), - ProblemFilters.exclude[MissingMethodProblem]("coursier.core.Artifact.this"), - ProblemFilters.exclude[MissingTypesProblem]("coursier.ivy.IvyRepository$"), - ProblemFilters.exclude[MissingMethodProblem]("coursier.ivy.IvyRepository.apply"), - ProblemFilters.exclude[MissingMethodProblem]("coursier.ivy.IvyRepository.copy"), - ProblemFilters.exclude[MissingMethodProblem]("coursier.ivy.IvyRepository.this"), - ProblemFilters.exclude[MissingMethodProblem]("coursier.maven.MavenRepository.copy"), - ProblemFilters.exclude[MissingMethodProblem]("coursier.maven.MavenRepository.this"), - ProblemFilters.exclude[MissingMethodProblem]("coursier.maven.MavenSource.apply"), - ProblemFilters.exclude[MissingMethodProblem]("coursier.maven.MavenRepository.apply"), - ProblemFilters.exclude[MissingMethodProblem]("coursier.maven.MavenSource.copy"), - ProblemFilters.exclude[MissingMethodProblem]("coursier.maven.MavenSource.this"), - // Since 1.0.0-M11 - // Extra parameter with default value added, problem for forward compatibility only - ProblemFilters.exclude[MissingMethodProblem]("coursier.core.ResolutionProcess.next"), - // method made final (for - non critical - tail recursion) - ProblemFilters.exclude[FinalMethodProblem]("coursier.core.ResolutionProcess.next"), - // Since 1.0.0-M10 - ProblemFilters.exclude[IncompatibleResultTypeProblem]("coursier.core.Resolution.withParentConfigurations"), - // New singleton object, problem for forward compatibility only - ProblemFilters.exclude[MissingTypesProblem]("coursier.maven.MavenSource$") + ProblemFilters.exclude[DirectMissingMethodProblem]("coursier.core.Resolution.apply") ) } ) @@ -185,69 +118,19 @@ lazy val testsJs = tests.js.dependsOn(`fetch-js` % "test") lazy val cache = project .dependsOn(coreJvm) .settings(commonSettings) + .settings(mimaPreviousArtifactSettings) .settings( name := "coursier-cache", libraryDependencies += "org.scalaz" %% "scalaz-concurrent" % scalazVersion, - mimaPreviousArtifacts := { - scalaBinaryVersion.value match { - case "2.10" | "2.11" => - Set("com.github.alexarchambault" %% moduleName.value % binaryCompatibilityVersion) - case _ => - Set() - } - }, mimaBinaryIssueFilters ++= { import com.typesafe.tools.mima.core._ Seq( - // Since 1.0.0-M13 - ProblemFilters.exclude[MissingMethodProblem]("coursier.Cache.file"), - ProblemFilters.exclude[MissingMethodProblem]("coursier.Cache.fetch"), - // Since 1.0.0-M12 - // Remove deprecated / unused helper method - ProblemFilters.exclude[MissingMethodProblem]("coursier.Cache.readFully"), - // Since 1.0.0-M11 - // Add constructor parameter on FileError - shouldn't be built by users anyway - ProblemFilters.exclude[MissingMethodProblem]("coursier.FileError.this"), - ProblemFilters.exclude[MissingMethodProblem]("coursier.FileError#Recoverable.this"), - // Since 1.0.0-M10 - // methods that should have been private anyway - ProblemFilters.exclude[MissingMethodProblem]("coursier.TermDisplay.update"), - ProblemFilters.exclude[MissingMethodProblem]("coursier.TermDisplay.fallbackMode_="), - // cache argument type changed from `Seq[(String, File)]` to `File` - ProblemFilters.exclude[IncompatibleMethTypeProblem]("coursier.Cache.file"), - ProblemFilters.exclude[IncompatibleMethTypeProblem]("coursier.Cache.fetch"), - ProblemFilters.exclude[IncompatibleResultTypeProblem]("coursier.Cache.default"), - ProblemFilters.exclude[IncompatibleMethTypeProblem]("coursier.Cache.validateChecksum"), - ProblemFilters.exclude[MissingMethodProblem]("coursier.Cache.defaultBase"), - // New methdos in Cache.Logger - ProblemFilters.exclude[MissingMethodProblem]("coursier.Cache#Logger.checkingUpdates"), - ProblemFilters.exclude[MissingMethodProblem]("coursier.Cache#Logger.checkingUpdatesResult"), - // Better overload of Cache.Logger.downloadLength, deprecate previous one - ProblemFilters.exclude[MissingMethodProblem]("coursier.Cache#Logger.downloadLength"), - // Changes to private class TermDisplay#Info - ProblemFilters.exclude[MissingClassProblem]("coursier.TermDisplay$Info$"), - ProblemFilters.exclude[AbstractClassProblem]("coursier.TermDisplay$Info"), - ProblemFilters.exclude[MissingMethodProblem]("coursier.TermDisplay#Info.downloaded"), - ProblemFilters.exclude[MissingMethodProblem]("coursier.TermDisplay#Info.productElement"), - ProblemFilters.exclude[MissingMethodProblem]("coursier.TermDisplay#Info.productArity"), - ProblemFilters.exclude[MissingMethodProblem]("coursier.TermDisplay#Info.canEqual"), - ProblemFilters.exclude[MissingMethodProblem]("coursier.TermDisplay#Info.length"), - ProblemFilters.exclude[MissingMethodProblem]("coursier.TermDisplay#Info.display"), - ProblemFilters.exclude[MissingMethodProblem]("coursier.TermDisplay#Info.fraction"), - // Since 1.0.0-M9 - // Added an optional extra parameter to FileError.NotFound - only - // its unapply method should break compatibility at the source level. - ProblemFilters.exclude[MissingMethodProblem]("coursier.FileError#NotFound.copy"), - ProblemFilters.exclude[MissingMethodProblem]("coursier.FileError#NotFound.this"), - ProblemFilters.exclude[MissingTypesProblem]("coursier.FileError$NotFound$"), - ProblemFilters.exclude[MissingMethodProblem]("coursier.FileError#NotFound.apply"), - // Since 1.0.0-M8 - ProblemFilters.exclude[MissingTypesProblem]("coursier.TermDisplay$Info$"), - ProblemFilters.exclude[MissingMethodProblem]("coursier.TermDisplay#Info.apply"), - ProblemFilters.exclude[MissingMethodProblem]("coursier.TermDisplay#Info.copy"), - ProblemFilters.exclude[MissingMethodProblem]("coursier.TermDisplay#Info.pct"), - ProblemFilters.exclude[MissingMethodProblem]("coursier.TermDisplay#Info.this") + ProblemFilters.exclude[MissingClassProblem]("coursier.TermDisplay$Message$Stop$"), + ProblemFilters.exclude[MissingClassProblem]("coursier.TermDisplay$Message"), + ProblemFilters.exclude[MissingClassProblem]("coursier.TermDisplay$Message$"), + ProblemFilters.exclude[MissingClassProblem]("coursier.TermDisplay$Message$Update$"), + ProblemFilters.exclude[MissingClassProblem]("coursier.TermDisplay$UpdateDisplayThread") ) } ) @@ -639,3 +522,13 @@ lazy val pluginSettings = ) ) +lazy val mimaPreviousArtifactSettings = Seq( + mimaPreviousArtifacts := { + val version = scalaBinaryVersion.value match { + case "2.12" => binaryCompatibility212Version + case _ => binaryCompatibilityVersion + } + + Set(organization.value %% moduleName.value % version) + } +) diff --git a/project/plugins.sbt b/project/plugins.sbt index 2997486e7..cfb97f581 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -5,5 +5,5 @@ addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.4.0") addSbtPlugin("org.tpolecat" % "tut-plugin" % "0.4.8") addSbtPlugin("io.get-coursier" % "sbt-coursier" % "1.0.0-M15-1") addSbtPlugin("com.typesafe.sbt" % "sbt-proguard" % "0.2.2") -addSbtPlugin("com.typesafe" % "sbt-mima-plugin" % "0.1.11") +addSbtPlugin("com.typesafe" % "sbt-mima-plugin" % "0.1.13") libraryDependencies += "org.scala-sbt" % "scripted-plugin" % sbtVersion.value From 9544b793da80e4fcb8494326ed057ead8beba5e5 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Tue, 31 Jan 2017 15:19:45 +0100 Subject: [PATCH 11/13] Clean-up stuff after scripted test --- plugin/src/sbt-test/sbt-coursier/from/test | 1 + 1 file changed, 1 insertion(+) diff --git a/plugin/src/sbt-test/sbt-coursier/from/test b/plugin/src/sbt-test/sbt-coursier/from/test index 2182f57b0..11e0b3386 100644 --- a/plugin/src/sbt-test/sbt-coursier/from/test +++ b/plugin/src/sbt-test/sbt-coursier/from/test @@ -1,3 +1,4 @@ $ delete output > run $ exists output +$ delete shapeless_2.11-2.3.0.jar From c61370ac4f3267bbc04002b64920ffb3dc93c44e Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Tue, 31 Jan 2017 15:22:32 +0100 Subject: [PATCH 12/13] Don't cache the whole ~/.ivy2 on Windows CI --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index a58ad00ae..5a7cad557 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -32,6 +32,6 @@ test_script: - sbt ++2.11.8 testsJVM/test testsJVM/it:test - sbt ++2.10.6 testsJVM/test testsJVM/it:test plugin/scripted plugin/publishLocal sbt-shading/scripted cache: - - C:\Users\appveyor\.ivy2 + - C:\Users\appveyor\.ivy2\cache - C:\Users\appveyor\.m2 - C:\Users\appveyor\.sbt From ed03750c23dfda9fcde7cbea5a94f136b8dffa1a Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Tue, 31 Jan 2017 15:47:29 +0100 Subject: [PATCH 13/13] Switch to scalaz 7.2.8 --- build.sbt | 2 +- .../resolutions/io.get-coursier/coursier_2.11/1.0.0-SNAPSHOT | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.sbt b/build.sbt index 313a76c9f..e89a7febb 100644 --- a/build.sbt +++ b/build.sbt @@ -5,7 +5,7 @@ val binaryCompatibility212Version = "1.0.0-M15" lazy val IntegrationTest = config("it") extend Test -lazy val scalazVersion = "7.2.7" +lazy val scalazVersion = "7.2.8" lazy val core = crossProject .settings(commonSettings) diff --git a/tests/shared/src/test/resources/resolutions/io.get-coursier/coursier_2.11/1.0.0-SNAPSHOT b/tests/shared/src/test/resources/resolutions/io.get-coursier/coursier_2.11/1.0.0-SNAPSHOT index 3027785bf..a5ddf5449 100644 --- a/tests/shared/src/test/resources/resolutions/io.get-coursier/coursier_2.11/1.0.0-SNAPSHOT +++ b/tests/shared/src/test/resources/resolutions/io.get-coursier/coursier_2.11/1.0.0-SNAPSHOT @@ -5,4 +5,4 @@ io.get-coursier:coursier_2.11:1.0.0-SNAPSHOT:compile org.jsoup:jsoup:1.10.2:default org.scala-lang:scala-library:2.11.8:default org.scala-lang.modules:scala-xml_2.11:1.0.6:default -org.scalaz:scalaz-core_2.11:7.2.7:default +org.scalaz:scalaz-core_2.11:7.2.8:default