From a9b215409207ecb1c94478e5d6d3ccb1ed6dfbcc Mon Sep 17 00:00:00 2001 From: Dan Sanduleac Date: Thu, 29 May 2014 15:20:38 +0100 Subject: [PATCH 1/5] ModuleID to have a branch now, that ends up in the ModuleRevisionId too. Also, add branch when converting ModuleID -> Ivy XML and include it in IvyActions.substitute. --- .../scala/sbt/internal/librarymanagement/Ivy.scala | 5 +++-- .../sbt/internal/librarymanagement/IvyActions.scala | 2 +- .../main/scala/sbt/librarymanagement/ModuleID.scala | 10 +++++++++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/librarymanagement/src/main/scala/sbt/internal/librarymanagement/Ivy.scala b/librarymanagement/src/main/scala/sbt/internal/librarymanagement/Ivy.scala index c39c30565..21c6cf6e2 100644 --- a/librarymanagement/src/main/scala/sbt/internal/librarymanagement/Ivy.scala +++ b/librarymanagement/src/main/scala/sbt/internal/librarymanagement/Ivy.scala @@ -422,7 +422,7 @@ private[sbt] object IvySbt { def toID(m: ModuleID) = { import m._ - ModuleRevisionId.newInstance(organization, name, revision, javaMap(extraAttributes)) + ModuleRevisionId.newInstance(organization, name, branchName.orNull, revision, javaMap(extraAttributes)) } private def substituteCross(m: ModuleSettings): ModuleSettings = @@ -490,7 +490,8 @@ private[sbt] object IvySbt { } private[this] def defaultInfo(module: ModuleID): scala.xml.Elem = { import module._ - + val base = + branchName.fold(base) { br => base % new scala.xml.UnprefixedAttribute("branch", br, scala.xml.Null) } } private[this] def addExtraAttributes(elem: scala.xml.Elem, extra: Map[String, String]): scala.xml.Elem = (elem /: extra) { case (e, (key, value)) => e % new scala.xml.UnprefixedAttribute(key, value, scala.xml.Null) } diff --git a/librarymanagement/src/main/scala/sbt/internal/librarymanagement/IvyActions.scala b/librarymanagement/src/main/scala/sbt/internal/librarymanagement/IvyActions.scala index 8d646ee65..64249a6c6 100644 --- a/librarymanagement/src/main/scala/sbt/internal/librarymanagement/IvyActions.scala +++ b/librarymanagement/src/main/scala/sbt/internal/librarymanagement/IvyActions.scala @@ -365,7 +365,7 @@ object IvyActions { { val mextra = IvySbt.javaMap(mid.extraAttributes, true) val aextra = IvySbt.extra(art, true) - IvyPatternHelper.substitute(pattern, mid.organization, mid.name, mid.revision, art.name, art.`type`, art.extension, conf, mextra, aextra) + IvyPatternHelper.substitute(pattern, mid.organization, mid.name, mid.branchName.orNull, mid.revision, art.name, art.`type`, art.extension, conf, null, mextra, aextra) } import UpdateLogging.{ Quiet, Full, DownloadOnly, Default } diff --git a/librarymanagement/src/main/scala/sbt/librarymanagement/ModuleID.scala b/librarymanagement/src/main/scala/sbt/librarymanagement/ModuleID.scala index 46b63ce39..1da5a1e0a 100644 --- a/librarymanagement/src/main/scala/sbt/librarymanagement/ModuleID.scala +++ b/librarymanagement/src/main/scala/sbt/librarymanagement/ModuleID.scala @@ -8,7 +8,7 @@ import java.net.URL import sbt.internal.librarymanagement.mavenint.SbtPomExtraProperties import sbt.serialization._ -final case class ModuleID(organization: String, name: String, revision: String, configurations: Option[String] = None, isChanging: Boolean = false, isTransitive: Boolean = true, isForce: Boolean = false, explicitArtifacts: Seq[Artifact] = Nil, exclusions: Seq[ExclusionRule] = Nil, extraAttributes: Map[String, String] = Map.empty, crossVersion: CrossVersion = CrossVersion.Disabled) { +final case class ModuleID(organization: String, name: String, revision: String, configurations: Option[String] = None, isChanging: Boolean = false, isTransitive: Boolean = true, isForce: Boolean = false, explicitArtifacts: Seq[Artifact] = Nil, exclusions: Seq[ExclusionRule] = Nil, extraAttributes: Map[String, String] = Map.empty, crossVersion: CrossVersion = CrossVersion.Disabled, branchName: Option[String] = None) { override def toString: String = organization + ":" + name + ":" + revision + (configurations match { case Some(s) => ":" + s; case None => "" }) + @@ -118,7 +118,15 @@ final case class ModuleID(organization: String, name: String, revision: String, * as when adding a dependency on an artifact with a classifier. */ def jar() = artifacts(Artifact(name)) + + /** + * Sets the Ivy branch of this module. + */ + def branch(branchName: String) = copy(branchName = Some(branchName)) + + def branch(branchName: Option[String]) = copy(branchName = branchName) } + object ModuleID { implicit val pickler: Pickler[ModuleID] with Unpickler[ModuleID] = PicklerUnpickler.generate[ModuleID] From 5ea0e0e07ae9c8a194b2ff2690dc093f8ef237ec Mon Sep 17 00:00:00 2001 From: Dan Sanduleac Date: Wed, 2 Jul 2014 09:24:24 +0100 Subject: [PATCH 2/5] [branch] as part of Resolver.localBasePattern --- .../src/main/scala/sbt/librarymanagement/Resolver.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/librarymanagement/src/main/scala/sbt/librarymanagement/Resolver.scala b/librarymanagement/src/main/scala/sbt/librarymanagement/Resolver.scala index 6831a2520..62227ce18 100644 --- a/librarymanagement/src/main/scala/sbt/librarymanagement/Resolver.scala +++ b/librarymanagement/src/main/scala/sbt/librarymanagement/Resolver.scala @@ -349,7 +349,7 @@ object Resolver { def defaultPatterns = mavenStylePatterns def mavenStyleBasePattern = "[organisation]/[module](_[scalaVersion])(_[sbtVersion])/[revision]/[artifact]-[revision](-[classifier]).[ext]" - def localBasePattern = "[organisation]/[module]/" + PluginPattern + "[revision]/[type]s/[artifact](-[classifier]).[ext]" + def localBasePattern = "[organisation]/[module]/" + PluginPattern + "(/[branch])/[revision]/[type]s/[artifact](-[classifier]).[ext]" def defaultRetrievePattern = "[type]s/[organisation]/[module]/" + PluginPattern + "[artifact](-[revision])(-[classifier]).[ext]" final val PluginPattern = "(scala_[scalaVersion]/)(sbt_[sbtVersion]/)" private[this] def mavenLocalDir: File = { From 0fd248a19b8e34dfa71593e0ec75693c1d7232aa Mon Sep 17 00:00:00 2001 From: Dan Sanduleac Date: Tue, 29 Jul 2014 11:49:04 +0100 Subject: [PATCH 3/5] Add [branch] to pattern for sbt's resolution cache --- .../scala/sbt/internal/librarymanagement/ResolutionCache.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/librarymanagement/src/main/scala/sbt/internal/librarymanagement/ResolutionCache.scala b/librarymanagement/src/main/scala/sbt/internal/librarymanagement/ResolutionCache.scala index 26b85b0b7..a480c8ed3 100644 --- a/librarymanagement/src/main/scala/sbt/internal/librarymanagement/ResolutionCache.scala +++ b/librarymanagement/src/main/scala/sbt/internal/librarymanagement/ResolutionCache.scala @@ -88,5 +88,5 @@ private[sbt] object ResolutionCache { private val Name = "sbt-resolution-cache" // use sbt-specific extra attributes so that resolved xml files do not get overwritten when using different Scala/sbt versions - private val ResolvedPattern = "[organisation]/[module]/" + Resolver.PluginPattern + "[revision]/[artifact].[ext]" + private val ResolvedPattern = "[organisation]/[module]/" + Resolver.PluginPattern + "([branch]/)[revision]/[artifact].[ext]" } From 797fe0aa63f5e212e1e8bbc0db1d6de73c1fe91b Mon Sep 17 00:00:00 2001 From: Dan Sanduleac Date: Thu, 2 Apr 2015 17:14:48 +0100 Subject: [PATCH 4/5] Fix IvyActions.restrictedCopy to respect branch --- .../main/scala/sbt/internal/librarymanagement/IvyActions.scala | 2 ++ 1 file changed, 2 insertions(+) diff --git a/librarymanagement/src/main/scala/sbt/internal/librarymanagement/IvyActions.scala b/librarymanagement/src/main/scala/sbt/internal/librarymanagement/IvyActions.scala index 64249a6c6..6f131f049 100644 --- a/librarymanagement/src/main/scala/sbt/internal/librarymanagement/IvyActions.scala +++ b/librarymanagement/src/main/scala/sbt/internal/librarymanagement/IvyActions.scala @@ -298,6 +298,8 @@ object IvyActions { private[this] def restrictedCopy(m: ModuleID, confs: Boolean) = ModuleID(m.organization, m.name, m.revision, crossVersion = m.crossVersion, extraAttributes = m.extraAttributes, configurations = if (confs) m.configurations else None) + .branch(m.branchName) + private[this] def resolve(logging: UpdateLogging.Value)(ivy: Ivy, module: DefaultModuleDescriptor, defaultConf: String): (ResolveReport, Option[ResolveException]) = { val resolveOptions = new ResolveOptions From 2324c720c4821501d0fb1391954293c06c8e485f Mon Sep 17 00:00:00 2001 From: Dan Sanduleac Date: Thu, 2 Apr 2015 17:21:49 +0100 Subject: [PATCH 5/5] Set branch onto the ModuleID when constructing a ModuleReport --- .../main/scala/sbt/internal/librarymanagement/IvyRetrieve.scala | 1 + 1 file changed, 1 insertion(+) diff --git a/librarymanagement/src/main/scala/sbt/internal/librarymanagement/IvyRetrieve.scala b/librarymanagement/src/main/scala/sbt/internal/librarymanagement/IvyRetrieve.scala index 765af3ab1..0432719d5 100644 --- a/librarymanagement/src/main/scala/sbt/internal/librarymanagement/IvyRetrieve.scala +++ b/librarymanagement/src/main/scala/sbt/internal/librarymanagement/IvyRetrieve.scala @@ -154,6 +154,7 @@ object IvyRetrieve { def toModuleID(revID: ModuleRevisionId): ModuleID = ModuleID(revID.getOrganisation, revID.getName, revID.getRevision, extraAttributes = IvySbt.getExtraAttributes(revID)) + .branch(nonEmptyString(revID.getBranch)) def toArtifact(art: IvyArtifact): Artifact = {