diff --git a/cli/src/main/scala/coursier/cli/Coursier.scala b/cli/src/main/scala/coursier/cli/Coursier.scala index b576c79ff..1fcbbcf8f 100644 --- a/cli/src/main/scala/coursier/cli/Coursier.scala +++ b/cli/src/main/scala/coursier/cli/Coursier.scala @@ -30,6 +30,8 @@ case class CommonOptions( repository: List[String], @HelpMessage("Do not add default repositories (~/.ivy2/local, and Central)") noDefault: Boolean = false, + @HelpMessage("Modify names in Maven repository paths for SBT plugins") + sbtPluginHack: Boolean = false, @HelpMessage("Force module version") @ValueDescription("organization:name:forcedVersion") @ExtraName("V") diff --git a/cli/src/main/scala/coursier/cli/Helper.scala b/cli/src/main/scala/coursier/cli/Helper.scala index ce4db9ea2..8ec1f43ef 100644 --- a/cli/src/main/scala/coursier/cli/Helper.scala +++ b/cli/src/main/scala/coursier/cli/Helper.scala @@ -114,10 +114,19 @@ class Helper( sys.exit(255) } - val repositories = + val repositories1 = (if (common.noDefault) Nil else defaultRepositories) ++ repositories0.collect { case Right(r) => r } + val repositories = + if (common.sbtPluginHack) + repositories1.map { + case m: MavenRepository => m.copy(sbtAttrStub = true) + case other => other + } + else + repositories1 + val (rawDependencies, extraArgs) = { val idxOpt = Some(remainingArgs.indexOf("--")).filter(_ >= 0) idxOpt.fold((remainingArgs, Seq.empty[String])) { idx => diff --git a/core/shared/src/main/scala/coursier/maven/MavenRepository.scala b/core/shared/src/main/scala/coursier/maven/MavenRepository.scala index f549bb73b..1ab35e5e8 100644 --- a/core/shared/src/main/scala/coursier/maven/MavenRepository.scala +++ b/core/shared/src/main/scala/coursier/maven/MavenRepository.scala @@ -49,7 +49,9 @@ object MavenRepository { case class MavenRepository( root: String, ivyLike: Boolean = false, - changing: Option[Boolean] = None + changing: Option[Boolean] = None, + /** Hackish hack for sbt plugins mainly - what this does really sucks */ + sbtAttrStub: Boolean = false ) extends Repository { import Repository._ @@ -58,6 +60,17 @@ case class MavenRepository( val root0 = if (root.endsWith("/")) root else root + "/" val source = MavenSource(root0, ivyLike) + private def dirModuleName(module: Module): String = + if (sbtAttrStub) { + var name = module.name + for (scalaVersion <- module.attributes.get("scalaVersion")) + name = name + "_" + scalaVersion + for (sbtVersion <- module.attributes.get("sbtVersion")) + name = name + "_" + sbtVersion + name + } else + module.name + def projectArtifact( module: Module, version: String, @@ -68,7 +81,7 @@ case class MavenRepository( if (ivyLike) ivyLikePath( module.organization, - module.name, + dirModuleName(module), // maybe not what we should do here, don't know versioningValue getOrElse version, "poms", "", @@ -76,7 +89,7 @@ case class MavenRepository( ) else module.organization.split('.').toSeq ++ Seq( - module.name, + dirModuleName(module), version, s"${module.name}-${versioningValue getOrElse version}.pom" ) @@ -98,7 +111,7 @@ case class MavenRepository( else { val path = ( module.organization.split('.').toSeq ++ Seq( - module.name, + dirModuleName(module), "maven-metadata.xml" ) ) .map(encodeURIComponent) @@ -125,7 +138,7 @@ case class MavenRepository( else { val path = ( module.organization.split('.').toSeq ++ Seq( - module.name, + dirModuleName(module), version, "maven-metadata.xml" ) diff --git a/plugin/src/main/scala/coursier/FromSbt.scala b/plugin/src/main/scala/coursier/FromSbt.scala index 761979d07..2e8dec8e1 100644 --- a/plugin/src/main/scala/coursier/FromSbt.scala +++ b/plugin/src/main/scala/coursier/FromSbt.scala @@ -28,6 +28,11 @@ object FromSbt { } yield (from, to) } + def attributes(attr: Map[String, String]): Map[String, String] = + attr.map { case (k, v) => + k.stripPrefix("e:") -> v + } + def dependencies( module: ModuleID, scalaVersion: String, @@ -39,7 +44,7 @@ object FromSbt { val fullName = sbtModuleIdName(module, scalaVersion, scalaBinaryVersion) val dep = Dependency( - Module(module.organization, fullName, module.extraAttributes), + Module(module.organization, fullName, FromSbt.attributes(module.extraAttributes)), module.revision, exclusions = module.exclusions.map { rule => // FIXME Other `rule` fields are ignored here @@ -82,7 +87,7 @@ object FromSbt { Module( projectID.organization, sbtModuleIdName(projectID, scalaVersion, scalaBinaryVersion), - projectID.extraAttributes + FromSbt.attributes(projectID.extraAttributes) ), projectID.revision, deps, @@ -102,7 +107,7 @@ object FromSbt { case sbt.MavenRepository(_, root) => if (root.startsWith("http://") || root.startsWith("https://")) { val root0 = if (root.endsWith("/")) root else root + "/" - Some(MavenRepository(root0)) + Some(MavenRepository(root0, sbtAttrStub = true)) } else { Console.err.println(s"Warning: unrecognized Maven repository protocol in $root, ignoring it") None