From cf48063f2f77ddd8ba46ce480da653c331785279 Mon Sep 17 00:00:00 2001 From: Brian Topping Date: Mon, 15 Sep 2014 10:48:47 -0400 Subject: [PATCH 1/4] Untested PR for #485. Unable to test because unable to build --- ivy/src/main/scala/sbt/Resolver.scala | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/ivy/src/main/scala/sbt/Resolver.scala b/ivy/src/main/scala/sbt/Resolver.scala index 3678adadb..91368abfc 100644 --- a/ivy/src/main/scala/sbt/Resolver.scala +++ b/ivy/src/main/scala/sbt/Resolver.scala @@ -5,7 +5,7 @@ package sbt import java.io.File import java.net.URL -import scala.xml.NodeSeq +import scala.xml.{ XML, NodeSeq } import org.apache.ivy.plugins.resolver.DependencyResolver sealed trait Resolver { @@ -300,8 +300,19 @@ object Resolver { def localBasePattern = "[organisation]/[module]/" + PluginPattern + "[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 = new File(Path.userHome, ".m2/repository/") + private[this] def mavenLocalDir: File = + { + val homeConfig = XML.loadFile(new File(Path.userHome, ".m2/settings.xml")) + homeConfig \ "settings" \ "localRepository" match { + case scala.xml.Text(x) => new File(x) + case _ => + val globalConfig = XML.loadFile(new File(Path.fileProperty("M2_HOME"), "conf/settings.xml")) + globalConfig \ "settings" \ "localRepository" match { + case scala.xml.Text(x) => new File(x) + case _ => new File(Path.userHome, ".m2/repository/") + } + } + } def publishMavenLocal = Resolver.file("publish-m2-local", mavenLocalDir) def mavenLocal = MavenRepository("Maven2 Local", mavenLocalDir.toURI.toString) def defaultLocal = defaultUserFileRepository("local") From e81e8596b77ea27e64d8d5e56908ffcaf6c82812 Mon Sep 17 00:00:00 2001 From: Brian Topping Date: Mon, 15 Sep 2014 10:48:47 -0400 Subject: [PATCH 2/4] Tested PR for #485. Had a hard time squashing this, maybe because I did a merge in between. Sorry about that! --- ivy/src/main/scala/sbt/Resolver.scala | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/ivy/src/main/scala/sbt/Resolver.scala b/ivy/src/main/scala/sbt/Resolver.scala index 91368abfc..9ba5d56ce 100644 --- a/ivy/src/main/scala/sbt/Resolver.scala +++ b/ivy/src/main/scala/sbt/Resolver.scala @@ -300,18 +300,19 @@ object Resolver { def localBasePattern = "[organisation]/[module]/" + PluginPattern + "[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 = - { - val homeConfig = XML.loadFile(new File(Path.userHome, ".m2/settings.xml")) - homeConfig \ "settings" \ "localRepository" match { - case scala.xml.Text(x) => new File(x) - case _ => - val globalConfig = XML.loadFile(new File(Path.fileProperty("M2_HOME"), "conf/settings.xml")) - globalConfig \ "settings" \ "localRepository" match { - case scala.xml.Text(x) => new File(x) - case _ => new File(Path.userHome, ".m2/repository/") - } + private[this] def mavenLocalDir: File = { + def loadHomeFromSettings(f: () => File): Option[File] = + try { + XML.loadFile(f()) \ "settings" \ "localRepository" match { + case scala.xml.Text(loc) => Some(new File(loc)) + case _ => None + } + } catch { + case _: Throwable => None } + loadHomeFromSettings(() => new File(Path.userHome, ".m2/settings.xml")) orElse + loadHomeFromSettings(() => new File(Path.fileProperty("M2_HOME"), "conf/settings.xml")) getOrElse + new File(Path.userHome, ".m2/repository") } def publishMavenLocal = Resolver.file("publish-m2-local", mavenLocalDir) def mavenLocal = MavenRepository("Maven2 Local", mavenLocalDir.toURI.toString) From 7edf77bc2800ab23e771734ed21839971bfd3498 Mon Sep 17 00:00:00 2001 From: Brian Topping Date: Wed, 17 Sep 2014 15:24:33 -0400 Subject: [PATCH 3/4] Additional updates, should be clean now. --- ivy/src/main/scala/sbt/Resolver.scala | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/ivy/src/main/scala/sbt/Resolver.scala b/ivy/src/main/scala/sbt/Resolver.scala index 9ba5d56ce..f7318fb5a 100644 --- a/ivy/src/main/scala/sbt/Resolver.scala +++ b/ivy/src/main/scala/sbt/Resolver.scala @@ -5,7 +5,7 @@ package sbt import java.io.File import java.net.URL -import scala.xml.{ XML, NodeSeq } +import scala.xml.{ Text, NodeSeq, Elem, XML } import org.apache.ivy.plugins.resolver.DependencyResolver sealed trait Resolver { @@ -303,17 +303,19 @@ object Resolver { private[this] def mavenLocalDir: File = { def loadHomeFromSettings(f: () => File): Option[File] = try { - XML.loadFile(f()) \ "settings" \ "localRepository" match { - case scala.xml.Text(loc) => Some(new File(loc)) - case _ => None + val file = XML.loadFile(f()) + (file \ "localRepository").text match { + case "" => None + case e @ _ => Some(new File(e)) } } catch { - case _: Throwable => None + // Occurs inside File constructor when property or environment variable does not exist + case _: NullPointerException => None } loadHomeFromSettings(() => new File(Path.userHome, ".m2/settings.xml")) orElse - loadHomeFromSettings(() => new File(Path.fileProperty("M2_HOME"), "conf/settings.xml")) getOrElse + loadHomeFromSettings(() => new File(new File(System.getenv("M2_HOME")), "conf/settings.xml")) getOrElse new File(Path.userHome, ".m2/repository") - } + } def publishMavenLocal = Resolver.file("publish-m2-local", mavenLocalDir) def mavenLocal = MavenRepository("Maven2 Local", mavenLocalDir.toURI.toString) def defaultLocal = defaultUserFileRepository("local") From db04fa53bef58c8bc85fc773b5b732b972aa4d9e Mon Sep 17 00:00:00 2001 From: Brian Topping Date: Mon, 22 Sep 2014 10:56:10 -0400 Subject: [PATCH 4/4] Add warning for bad XML parse of settings file --- ivy/src/main/scala/sbt/Resolver.scala | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ivy/src/main/scala/sbt/Resolver.scala b/ivy/src/main/scala/sbt/Resolver.scala index f7318fb5a..b0a45f949 100644 --- a/ivy/src/main/scala/sbt/Resolver.scala +++ b/ivy/src/main/scala/sbt/Resolver.scala @@ -7,6 +7,7 @@ import java.io.File import java.net.URL import scala.xml.{ Text, NodeSeq, Elem, XML } import org.apache.ivy.plugins.resolver.DependencyResolver +import org.xml.sax.SAXParseException sealed trait Resolver { def name: String @@ -311,6 +312,7 @@ object Resolver { } catch { // Occurs inside File constructor when property or environment variable does not exist case _: NullPointerException => None + case e: SAXParseException => System.err.println(s"WARNING: Problem parsing ${f().getAbsolutePath}, ${e.getMessage}"); None } loadHomeFromSettings(() => new File(Path.userHome, ".m2/settings.xml")) orElse loadHomeFromSettings(() => new File(new File(System.getenv("M2_HOME")), "conf/settings.xml")) getOrElse