Merge pull request #444 from desbo/fix-backslash-escaping

Preserve backslashes in `expandMavenSettings`
This commit is contained in:
eugene yokota 2024-06-30 21:40:15 -04:00 committed by GitHub
commit e63b6cce7d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 25 additions and 7 deletions

View File

@ -3,13 +3,15 @@
*/ */
package sbt.librarymanagement package sbt.librarymanagement
import java.io.{ IOException, File } import java.io.{ File, IOException }
import java.net.{ URI, URL } import java.net.{ URI, URL }
import scala.annotation.nowarn import scala.annotation.nowarn
import scala.xml.XML import scala.xml.XML
import org.xml.sax.SAXParseException import org.xml.sax.SAXParseException
import sbt.util.Logger import sbt.util.Logger
import java.net.URI import java.net.URI
import scala.util.matching.Regex
final class RawRepository(val resolver: AnyRef, name: String) extends Resolver(name) { final class RawRepository(val resolver: AnyRef, name: String) extends Resolver(name) {
override def toString = "Raw(" + resolver.toString + ")" override def toString = "Raw(" + resolver.toString + ")"
@ -400,20 +402,29 @@ private[librarymanagement] abstract class ResolverFunctions {
def defaultRetrievePattern = def defaultRetrievePattern =
"[type]s/[organisation]/[module]/" + PluginPattern + "[artifact](-[revision])(-[classifier]).[ext]" "[type]s/[organisation]/[module]/" + PluginPattern + "[artifact](-[revision])(-[classifier]).[ext]"
final val PluginPattern = "(scala_[scalaVersion]/)(sbt_[sbtVersion]/)" final val PluginPattern = "(scala_[scalaVersion]/)(sbt_[sbtVersion]/)"
private[librarymanagement] def expandMavenSettings(str: String): String = {
private[librarymanagement] def expandMavenSettings(
str: String,
envVars: Map[String, String] = sys.env,
props: Map[String, String] = sys.props.toMap
): String = {
// Aren't regular expressions beautifully clear and concise. // Aren't regular expressions beautifully clear and concise.
// This means "find all ${...}" blocks, with the first group of each being the text between curly brackets. // This means "find all ${...}" blocks, with the first group of each being the text between curly brackets.
val findQuoted = "\\$\\{([^\\}]*)\\}".r val findQuoted = "\\$\\{([^}]*)}".r
val env = "env\\.(.*)".r val env = "env\\.(.*)".r
findQuoted.replaceAllIn( findQuoted.replaceAllIn(
str, str,
_.group(1) match { regexMatch =>
case env(variable) => sys.env.getOrElse(variable, "") Regex.quoteReplacement {
case property => sys.props.getOrElse(property, "") regexMatch.group(1) match {
} case env(variable) => envVars.getOrElse(variable, "")
case property => props.getOrElse(property, "")
}
}
) )
} }
private[this] def mavenLocalDir: File = { private[this] def mavenLocalDir: File = {
def loadHomeFromSettings(f: () => File): Option[File] = def loadHomeFromSettings(f: () => File): Option[File] =
try { try {

View File

@ -33,6 +33,13 @@ object ResolverExtraTest extends BasicTestSuite {
) )
} }
test("expandMavenSettings should preserve backslashes in environment variable values") {
val path = """C:\foo\bar\baz"""
val env = Map("SOME_PATH" -> path)
assert(Resolver.expandMavenSettings("${env.SOME_PATH}", env) == path)
}
// - Helper functions ---------------------------------------------------------------------------- // - Helper functions ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------------
def assertExpansion(input: String, expected: String) = def assertExpansion(input: String, expected: String) =