mirror of https://github.com/sbt/sbt.git
Refactor applyDependencyOverrides into testable function
This commit is contained in:
parent
9475f278b5
commit
e63a4b8f8c
|
|
@ -118,44 +118,9 @@ object IvyActions {
|
|||
moduleSettings match {
|
||||
case ic: InlineConfiguration if ic.overrides.nonEmpty =>
|
||||
val overrideMap = ic.overrides.map(m => (m.organization, m.name) -> m.revision).toMap
|
||||
|
||||
if (ivyFile.exists()) {
|
||||
val xml = scala.xml.XML.loadFile(ivyFile)
|
||||
val updated =
|
||||
new scala.xml.transform.RuleTransformer(new scala.xml.transform.RewriteRule {
|
||||
override def transform(n: scala.xml.Node): Seq[scala.xml.Node] = n match {
|
||||
case e @ scala.xml.Elem(prefix, "dependency", attrs, scope, children*) =>
|
||||
val org = attrs.get("org").map(_.text).getOrElse("")
|
||||
val name = attrs.get("name").map(_.text).getOrElse("")
|
||||
overrideMap.get((org, name)) match {
|
||||
case Some(overrideRev) =>
|
||||
// Build new attributes by replacing 'rev' attribute value
|
||||
def updateAttrs(metadata: scala.xml.MetaData): scala.xml.MetaData = {
|
||||
metadata match {
|
||||
case scala.xml.Null => scala.xml.Null
|
||||
case attr if attr.key == "rev" =>
|
||||
new scala.xml.UnprefixedAttribute(
|
||||
"rev",
|
||||
overrideRev,
|
||||
updateAttrs(attr.next)
|
||||
)
|
||||
case attr =>
|
||||
attr.copy(next = updateAttrs(attr.next))
|
||||
}
|
||||
}
|
||||
scala.xml.Elem(
|
||||
prefix,
|
||||
"dependency",
|
||||
updateAttrs(attrs),
|
||||
scope,
|
||||
minimizeEmpty = true,
|
||||
children*
|
||||
)
|
||||
case None => e
|
||||
}
|
||||
case other => other
|
||||
}
|
||||
}).transform(xml).head
|
||||
val updated = applyDependencyOverrides(xml, overrideMap)
|
||||
scala.xml.XML.save(ivyFile.getAbsolutePath, updated, "UTF-8", xmlDecl = true, null)
|
||||
log.debug(s"Applied ${overrideMap.size} dependency override(s) to ${ivyFile.getName}")
|
||||
}
|
||||
|
|
@ -163,6 +128,53 @@ object IvyActions {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Applies dependency overrides to an Ivy XML node by updating the rev attribute
|
||||
* of dependency elements that match entries in the override map.
|
||||
*
|
||||
* @param xml The Ivy XML root node to transform
|
||||
* @param overrideMap Map from (organization, name) to the overridden revision
|
||||
* @return The transformed XML node with updated dependency revisions
|
||||
*/
|
||||
def applyDependencyOverrides(
|
||||
xml: scala.xml.Node,
|
||||
overrideMap: Map[(String, String), String]
|
||||
): scala.xml.Node = {
|
||||
new scala.xml.transform.RuleTransformer(new scala.xml.transform.RewriteRule {
|
||||
override def transform(n: scala.xml.Node): Seq[scala.xml.Node] = n match {
|
||||
case e @ scala.xml.Elem(prefix, "dependency", attrs, scope, children*) =>
|
||||
val org = attrs.get("org").map(_.text).getOrElse("")
|
||||
val name = attrs.get("name").map(_.text).getOrElse("")
|
||||
overrideMap.get((org, name)) match {
|
||||
case Some(overrideRev) =>
|
||||
def updateAttrs(metadata: scala.xml.MetaData): scala.xml.MetaData = {
|
||||
metadata match {
|
||||
case scala.xml.Null => scala.xml.Null
|
||||
case attr if attr.key == "rev" =>
|
||||
new scala.xml.UnprefixedAttribute(
|
||||
"rev",
|
||||
overrideRev,
|
||||
updateAttrs(attr.next)
|
||||
)
|
||||
case attr =>
|
||||
attr.copy(next = updateAttrs(attr.next))
|
||||
}
|
||||
}
|
||||
scala.xml.Elem(
|
||||
prefix,
|
||||
"dependency",
|
||||
updateAttrs(attrs),
|
||||
scope,
|
||||
minimizeEmpty = true,
|
||||
children*
|
||||
)
|
||||
case None => e
|
||||
}
|
||||
case other => other
|
||||
}
|
||||
}).transform(xml).head
|
||||
}
|
||||
|
||||
def getConfigurations(
|
||||
module: ModuleDescriptor,
|
||||
configurations: Option[Vector[ConfigRef]]
|
||||
|
|
|
|||
|
|
@ -5,11 +5,9 @@ import org.scalatest.matchers.should.Matchers
|
|||
|
||||
class IvyActionsOverrideSpec extends AnyFlatSpec with Matchers {
|
||||
|
||||
"applyOverridesToDeliveredIvy XML transformation" should "replace rev attribute for matching dependencies" in {
|
||||
// Simulate the override map
|
||||
"IvyActions.applyDependencyOverrides" should "replace rev attribute for matching dependencies" in {
|
||||
val overrideMap = Map(("org.slf4j", "slf4j-api") -> "2.0.16")
|
||||
|
||||
// Sample Ivy XML with "managed" version (as reported in issue #7951)
|
||||
val sampleXml =
|
||||
<ivy-module version="2.0">
|
||||
<info organisation="test" module="test" revision="1.0"/>
|
||||
|
|
@ -19,44 +17,8 @@ class IvyActionsOverrideSpec extends AnyFlatSpec with Matchers {
|
|||
</dependencies>
|
||||
</ivy-module>
|
||||
|
||||
// Apply the same transformation logic as in IvyActions
|
||||
val updated =
|
||||
new scala.xml.transform.RuleTransformer(new scala.xml.transform.RewriteRule {
|
||||
override def transform(n: scala.xml.Node): Seq[scala.xml.Node] = n match {
|
||||
case e @ scala.xml.Elem(prefix, "dependency", attrs, scope, children*) =>
|
||||
val org = attrs.get("org").map(_.text).getOrElse("")
|
||||
val name = attrs.get("name").map(_.text).getOrElse("")
|
||||
overrideMap.get((org, name)) match {
|
||||
case Some(overrideRev) =>
|
||||
// Build new attributes by replacing 'rev' attribute value
|
||||
def updateAttrs(metadata: scala.xml.MetaData): scala.xml.MetaData = {
|
||||
metadata match {
|
||||
case scala.xml.Null => scala.xml.Null
|
||||
case attr if attr.key == "rev" =>
|
||||
new scala.xml.UnprefixedAttribute(
|
||||
"rev",
|
||||
overrideRev,
|
||||
updateAttrs(attr.next)
|
||||
)
|
||||
case attr =>
|
||||
attr.copy(next = updateAttrs(attr.next))
|
||||
}
|
||||
}
|
||||
scala.xml.Elem(
|
||||
prefix,
|
||||
"dependency",
|
||||
updateAttrs(attrs),
|
||||
scope,
|
||||
minimizeEmpty = true,
|
||||
children*
|
||||
)
|
||||
case None => e
|
||||
}
|
||||
case other => other
|
||||
}
|
||||
}).transform(sampleXml).head
|
||||
val updated = IvyActions.applyDependencyOverrides(sampleXml, overrideMap)
|
||||
|
||||
// Verify the transformation
|
||||
val dependencies = (updated \\ "dependency")
|
||||
|
||||
// Check slf4j-api has overridden version
|
||||
|
|
@ -83,40 +45,7 @@ class IvyActionsOverrideSpec extends AnyFlatSpec with Matchers {
|
|||
</dependencies>
|
||||
</ivy-module>
|
||||
|
||||
val updated =
|
||||
new scala.xml.transform.RuleTransformer(new scala.xml.transform.RewriteRule {
|
||||
override def transform(n: scala.xml.Node): Seq[scala.xml.Node] = n match {
|
||||
case e @ scala.xml.Elem(prefix, "dependency", attrs, scope, children*) =>
|
||||
val org = attrs.get("org").map(_.text).getOrElse("")
|
||||
val name = attrs.get("name").map(_.text).getOrElse("")
|
||||
overrideMap.get((org, name)) match {
|
||||
case Some(overrideRev) =>
|
||||
def updateAttrs(metadata: scala.xml.MetaData): scala.xml.MetaData = {
|
||||
metadata match {
|
||||
case scala.xml.Null => scala.xml.Null
|
||||
case attr if attr.key == "rev" =>
|
||||
new scala.xml.UnprefixedAttribute(
|
||||
"rev",
|
||||
overrideRev,
|
||||
updateAttrs(attr.next)
|
||||
)
|
||||
case attr =>
|
||||
attr.copy(next = updateAttrs(attr.next))
|
||||
}
|
||||
}
|
||||
scala.xml.Elem(
|
||||
prefix,
|
||||
"dependency",
|
||||
updateAttrs(attrs),
|
||||
scope,
|
||||
minimizeEmpty = true,
|
||||
children*
|
||||
)
|
||||
case None => e
|
||||
}
|
||||
case other => other
|
||||
}
|
||||
}).transform(sampleXml).head
|
||||
val updated = IvyActions.applyDependencyOverrides(sampleXml, overrideMap)
|
||||
|
||||
val dep = (updated \\ "dependency").head
|
||||
(dep \ "@org").text shouldBe "org.example"
|
||||
|
|
@ -137,40 +66,7 @@ class IvyActionsOverrideSpec extends AnyFlatSpec with Matchers {
|
|||
</dependencies>
|
||||
</ivy-module>
|
||||
|
||||
val updated =
|
||||
new scala.xml.transform.RuleTransformer(new scala.xml.transform.RewriteRule {
|
||||
override def transform(n: scala.xml.Node): Seq[scala.xml.Node] = n match {
|
||||
case e @ scala.xml.Elem(prefix, "dependency", attrs, scope, children*) =>
|
||||
val org = attrs.get("org").map(_.text).getOrElse("")
|
||||
val name = attrs.get("name").map(_.text).getOrElse("")
|
||||
overrideMap.get((org, name)) match {
|
||||
case Some(overrideRev) =>
|
||||
def updateAttrs(metadata: scala.xml.MetaData): scala.xml.MetaData = {
|
||||
metadata match {
|
||||
case scala.xml.Null => scala.xml.Null
|
||||
case attr if attr.key == "rev" =>
|
||||
new scala.xml.UnprefixedAttribute(
|
||||
"rev",
|
||||
overrideRev,
|
||||
updateAttrs(attr.next)
|
||||
)
|
||||
case attr =>
|
||||
attr.copy(next = updateAttrs(attr.next))
|
||||
}
|
||||
}
|
||||
scala.xml.Elem(
|
||||
prefix,
|
||||
"dependency",
|
||||
updateAttrs(attrs),
|
||||
scope,
|
||||
minimizeEmpty = true,
|
||||
children*
|
||||
)
|
||||
case None => e
|
||||
}
|
||||
case other => other
|
||||
}
|
||||
}).transform(sampleXml).head
|
||||
val updated = IvyActions.applyDependencyOverrides(sampleXml, overrideMap)
|
||||
|
||||
val dep = (updated \\ "dependency").head
|
||||
(dep \ "@rev").text shouldBe "1.0.0" // Should remain unchanged
|
||||
|
|
|
|||
Loading…
Reference in New Issue