diff --git a/core-jvm/src/main/scala/coursier/core/compatibility/package.scala b/core-jvm/src/main/scala/coursier/core/compatibility/package.scala index a1e051060..5eb8cbc97 100644 --- a/core-jvm/src/main/scala/coursier/core/compatibility/package.scala +++ b/core-jvm/src/main/scala/coursier/core/compatibility/package.scala @@ -17,10 +17,7 @@ package object compatibility { def label = node.label def child = node.child.map(fromNode) def isText = node match { case _: scala.xml.Text => true; case _ => false } - def textContent = node match { - case t: scala.xml.Text => t.data - case _ => throw new NoSuchElementException("text of non text node") - } + def textContent = node.text def isElement = node match { case _: scala.xml.Elem => true; case _ => false } } diff --git a/core/src/main/scala/coursier/core/Xml.scala b/core/src/main/scala/coursier/core/Xml.scala index 4449985de..70b3b3fcf 100644 --- a/core/src/main/scala/coursier/core/Xml.scala +++ b/core/src/main/scala/coursier/core/Xml.scala @@ -41,12 +41,10 @@ object Xml { .toRightDisjunction(s"$description not found") } - private def property(elem: Node): String \/ (String, String) = { - elem.child match { - case Seq() => \/-(elem.label -> "") - case Seq(Text(t)) => \/-(elem.label -> t) - case _ => -\/(s"Can't parse property $elem") - } + def property(elem: Node): String \/ (String, String) = { + // Not matching with Text, which fails on scala-js if the property value has xml comments + if (elem.isElement) \/-(elem.label -> elem.textContent) + else -\/(s"Can't parse property $elem") } // TODO Allow no version in some contexts diff --git a/core/src/test/scala/coursier/test/PomParsingTests.scala b/core/src/test/scala/coursier/test/PomParsingTests.scala index 568ae6be8..1582fdf1d 100644 --- a/core/src/test/scala/coursier/test/PomParsingTests.scala +++ b/core/src/test/scala/coursier/test/PomParsingTests.scala @@ -138,6 +138,62 @@ object PomParsingTests extends TestSuite { assert(result == expected) } + 'beFineWithCommentsInProperties{ + import scalaz._, Scalaz._ + + val properties = + """ + | + | 1.6 + | 1.6 + | io + | RC1 + | 2.4 + | (requires JDK 1.6+) + | 2.2 + | (requires JDK 1.5+) + | IO + | 12310477 + | + | + | org.apache.commons.io; + | org.apache.commons.io.comparator; + | org.apache.commons.io.filefilter; + | org.apache.commons.io.input; + | org.apache.commons.io.output;version=1.4.9999;-noimport:=true, + | + | org.apache.commons.io; + | org.apache.commons.io.comparator; + | org.apache.commons.io.filefilter; + | org.apache.commons.io.input; + | org.apache.commons.io.output; + | org.apache.commons.io.*;version=${project.version};-noimport:=true + | + | + | + """.stripMargin + + val parsed = core.compatibility.xmlParse(properties) + assert(parsed.isRight) + + val node = parsed.right.get + assert(node.label == "properties") + + val children = node.child.collect{case elem if elem.isElement => elem} + val props0 = children.toList.traverseU(Xml.property) + + assert(props0.isRight) + + val props = props0.getOrElse(???).toMap + + assert(props.contains("commons.release.2.desc")) + assert(props.contains("commons.osgi.export")) + + assert(props("commons.rc.version") == "RC1") + assert(props("commons.release.2.desc") == "(requires JDK 1.5+)") + assert(props("commons.osgi.export").contains("org.apache.commons.io.filefilter;")) + assert(props("commons.osgi.export").contains("org.apache.commons.io.input;")) + } } }