From 649b6dffc21ad4c7f875f655468c0ecedab310ac Mon Sep 17 00:00:00 2001 From: Sam Desborough Date: Fri, 28 Jun 2024 13:05:54 +0100 Subject: [PATCH 1/6] Preserve backslashes in `expandMavenSettings` We use `expandMavenSettings` to turn environment variable expressions in `settings.xml` into their actual values. Before this change, if an environment variable value contained backslashes, they would have been treated as escape characters by `Regex.replaceAllIn` and removed from the returned string. This caused an issue when using backslashes for Windows paths. --- .../sbt/librarymanagement/ResolverExtra.scala | 25 +++++++++++++------ .../librarymanagement/ResolverExtraTest.scala | 7 ++++++ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/core/src/main/scala/sbt/librarymanagement/ResolverExtra.scala b/core/src/main/scala/sbt/librarymanagement/ResolverExtra.scala index ca980b7e8..cb0eebe80 100644 --- a/core/src/main/scala/sbt/librarymanagement/ResolverExtra.scala +++ b/core/src/main/scala/sbt/librarymanagement/ResolverExtra.scala @@ -3,13 +3,15 @@ */ package sbt.librarymanagement -import java.io.{ IOException, File } +import java.io.{ File, IOException } import java.net.{ URI, URL } import scala.annotation.nowarn import scala.xml.XML import org.xml.sax.SAXParseException import sbt.util.Logger + import java.net.URI +import scala.util.matching.Regex final class RawRepository(val resolver: AnyRef, name: String) extends Resolver(name) { override def toString = "Raw(" + resolver.toString + ")" @@ -400,20 +402,29 @@ private[librarymanagement] abstract class ResolverFunctions { def defaultRetrievePattern = "[type]s/[organisation]/[module]/" + PluginPattern + "[artifact](-[revision])(-[classifier]).[ext]" 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. // 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 findQuoted.replaceAllIn( str, - _.group(1) match { - case env(variable) => sys.env.getOrElse(variable, "") - case property => sys.props.getOrElse(property, "") - } + regexMatch => + Regex.quoteReplacement { + regexMatch.group(1) match { + case env(variable) => envVars.getOrElse(variable, "") + case property => props.getOrElse(property, "") + } + } ) } + private[this] def mavenLocalDir: File = { def loadHomeFromSettings(f: () => File): Option[File] = try { diff --git a/core/src/test/scala/sbt/librarymanagement/ResolverExtraTest.scala b/core/src/test/scala/sbt/librarymanagement/ResolverExtraTest.scala index 10cad9012..e1a06a944 100644 --- a/core/src/test/scala/sbt/librarymanagement/ResolverExtraTest.scala +++ b/core/src/test/scala/sbt/librarymanagement/ResolverExtraTest.scala @@ -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 ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------------- def assertExpansion(input: String, expected: String) = From 765740c066320f700a588d4c9e23a71aeb87ddb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Ferreira?= Date: Sat, 6 Jul 2024 22:27:19 +0100 Subject: [PATCH 2/6] upgrade sbt-scalafmt (#440) Co-authored-by: eugene yokota --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index 279b64f16..eaa324382 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,7 +1,7 @@ addSbtPlugin("com.dwijnand" % "sbt-dynver" % "4.0.0") addSbtPlugin("com.github.sbt" % "sbt-pgp" % "2.1.2") addSbtPlugin("com.typesafe" % "sbt-mima-plugin" % "0.8.1") -addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.0.2") +addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.5.2") addSbtPlugin("org.scala-sbt" % "sbt-contraband" % "0.5.1") scalacOptions += "-language:postfixOps" From 598be45e2c9c8db2f8960ae9bac75080340433ad Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Sat, 6 Jul 2024 17:32:35 -0400 Subject: [PATCH 3/6] Update GitHub Actions --- .github/workflows/ci.yml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d938ee7f9..1f4f448c6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,12 +10,15 @@ jobs: include: - os: ubuntu-latest java: 8 + distribution: zulu jobtype: 1 - os: ubuntu-latest java: 11 + distribution: temurin jobtype: 1 - - os: ubuntu-latest + - os: macos-latest java: 17 + distribution: temurin jobtype: 1 runs-on: ${{ matrix.os }} env: @@ -26,11 +29,13 @@ jobs: - name: Checkout uses: actions/checkout@v4 - name: Setup JDK - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: - distribution: temurin + distribution: "${{ matrix.distribution }}" java-version: "${{ matrix.java }}" cache: sbt + - name: Setup sbt + uses: sbt/setup-sbt@v1 - name: Build and test (1) if: ${{ matrix.jobtype == 1 }} shell: bash From 3b3b155d1a3abf2d35938f14c4c119ca07dbd64a Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Sat, 6 Jul 2024 17:39:32 -0400 Subject: [PATCH 4/6] Relax the test --- .../sbt/internal/librarymanagement/ModuleResolversTest.scala | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ivy/src/test/scala/sbt/internal/librarymanagement/ModuleResolversTest.scala b/ivy/src/test/scala/sbt/internal/librarymanagement/ModuleResolversTest.scala index d1b06b242..96f4c5b28 100644 --- a/ivy/src/test/scala/sbt/internal/librarymanagement/ModuleResolversTest.scala +++ b/ivy/src/test/scala/sbt/internal/librarymanagement/ModuleResolversTest.scala @@ -43,8 +43,7 @@ object ModuleResolversTest extends BaseIvySpecification { println(s"NORMAL RESOLUTION TIME $normalResolutionTime") println(s"FASTER RESOLUTION TIME $fasterResolutionTime") - // Check that faster resolution is at least 1/5 faster than normal resolution - // This is a conservative check just to make sure we don't regress -- speedup is higher - assert(fasterResolutionTime <= (normalResolutionTime * 0.80)) + // Check that faster resolution is faster + assert(fasterResolutionTime < normalResolutionTime) } } From dd9e3265031fc318066935417182dac4f84fde67 Mon Sep 17 00:00:00 2001 From: Adrien Piquerez Date: Mon, 7 Oct 2024 15:41:15 +0200 Subject: [PATCH 5/6] Exclude custom extra from POM dependency --- .../PomExtraDependencyAttributes.scala | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/ivy/src/main/scala/sbt/internal/librarymanagement/mavenint/PomExtraDependencyAttributes.scala b/ivy/src/main/scala/sbt/internal/librarymanagement/mavenint/PomExtraDependencyAttributes.scala index 25ab896b1..4160b6009 100644 --- a/ivy/src/main/scala/sbt/internal/librarymanagement/mavenint/PomExtraDependencyAttributes.scala +++ b/ivy/src/main/scala/sbt/internal/librarymanagement/mavenint/PomExtraDependencyAttributes.scala @@ -78,9 +78,7 @@ object PomExtraDependencyAttributes { item.getQualifiedExtraAttributes.asInstanceOf[java.util.Map[String, String]].asScala.toMap } def filterCustomExtra(item: ExtendableItem, include: Boolean): Map[String, String] = - (qualifiedExtra(item) filterKeys { k => - qualifiedIsExtra(k) == include - }).toMap + qualifiedExtra(item).filterKeys { k => qualifiedIsExtra(k) == include }.toMap def qualifiedIsExtra(k: String): Boolean = k.endsWith(ScalaVersionKey) || k.endsWith(SbtVersionKey) @@ -107,17 +105,27 @@ object PomExtraDependencyAttributes { /** * Creates the "extra" property values for DependencyDescriptors that can be written into a maven pom - * so we don't loose the information. + * so we don't lose the information. * @param s * @return */ def writeDependencyExtra(s: Seq[DependencyDescriptor]): Seq[String] = s.flatMap { dd => val revId = dd.getDependencyRevisionId - if (filterCustomExtra(revId, include = true).isEmpty) + val filteredExtra = filterCustomExtra(revId, include = true) + if (filteredExtra.isEmpty) Nil - else - revId.encodeToString :: Nil + else { + import scala.collection.JavaConverters._ + val revId0 = ModuleRevisionId.newInstance( + revId.getOrganisation, + revId.getName, + revId.getBranch, + revId.getRevision, + filteredExtra.asJava + ) + revId0.encodeToString :: Nil + } } } From a4d2b9c03bac2a8167ccab9d3a0e31ddfcf2987a Mon Sep 17 00:00:00 2001 From: Adrien Piquerez Date: Mon, 7 Oct 2024 15:41:25 +0200 Subject: [PATCH 6/6] Fix ModuleResolversTest --- .../internal/librarymanagement/ModuleResolversTest.scala | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ivy/src/test/scala/sbt/internal/librarymanagement/ModuleResolversTest.scala b/ivy/src/test/scala/sbt/internal/librarymanagement/ModuleResolversTest.scala index 96f4c5b28..94c30d244 100644 --- a/ivy/src/test/scala/sbt/internal/librarymanagement/ModuleResolversTest.scala +++ b/ivy/src/test/scala/sbt/internal/librarymanagement/ModuleResolversTest.scala @@ -3,13 +3,13 @@ package sbt.internal.librarymanagement import sbt.librarymanagement._ import sbt.librarymanagement.syntax._ import sbt.librarymanagement.ivy.UpdateOptions -import Resolver._ object ModuleResolversTest extends BaseIvySpecification { override final val resolvers = Vector( - DefaultMavenRepository, - JavaNet2Repository, - JCenterRepository, + MavenRepository( + "JFrog OSS Releases", + "https://releases.jfrog.io/artifactory/oss-releases/" + ), Resolver.sbtPluginRepo("releases") )