From 04db4b92b8b7ab6b85dd344356c569068d506285 Mon Sep 17 00:00:00 2001 From: Maciej Gajek Date: Mon, 7 Aug 2023 10:20:02 +0200 Subject: [PATCH] Ignore query parameters --- .../scala/scala/build/input/Element.scala | 17 ++++-- .../scala/scala/build/tests/InputsTests.scala | 61 ++++++++++++++++++- 2 files changed, 72 insertions(+), 6 deletions(-) diff --git a/modules/build/src/main/scala/scala/build/input/Element.scala b/modules/build/src/main/scala/scala/build/input/Element.scala index 09456e5238..a293c02a11 100644 --- a/modules/build/src/main/scala/scala/build/input/Element.scala +++ b/modules/build/src/main/scala/scala/build/input/Element.scala @@ -28,12 +28,19 @@ sealed abstract class Virtual extends SingleElement { } object Virtual { + val urlPathWithQueryParamsRegex = "https?://.*/([^/^?]+)(/?.*)?$".r def apply(path: String, content: Array[Byte]): Virtual = { - val wrapperPath = os.sub / path.split("/").last - if path.endsWith(".scala") then VirtualScalaFile(content, path) - else if path.endsWith(".java") then VirtualJavaFile(content, path) - else if path.endsWith(".sc") then VirtualScript(content, path, wrapperPath) - else if path.endsWith(".md") then VirtualMarkdownFile(content, path, wrapperPath) + val filename = path match { + case urlPathWithQueryParamsRegex(name, _) => name + case _ => path.split("/").last + } + + val wrapperPath = os.sub / filename + + if filename.endsWith(".scala") then VirtualScalaFile(content, path) + else if filename.endsWith(".java") then VirtualJavaFile(content, path) + else if filename.endsWith(".sc") then VirtualScript(content, path, wrapperPath) + else if filename.endsWith(".md") then VirtualMarkdownFile(content, path, wrapperPath) else VirtualData(content, path) } } diff --git a/modules/build/src/test/scala/scala/build/tests/InputsTests.scala b/modules/build/src/test/scala/scala/build/tests/InputsTests.scala index f133303146..446c016f89 100644 --- a/modules/build/src/test/scala/scala/build/tests/InputsTests.scala +++ b/modules/build/src/test/scala/scala/build/tests/InputsTests.scala @@ -4,7 +4,13 @@ import bloop.rifle.BloopRifleConfig import com.eed3si9n.expecty.Expecty.expect import scala.build.Build -import scala.build.input.Inputs +import scala.build.input.{ + Inputs, + ScalaCliInvokeData, + VirtualJavaFile, + VirtualScalaFile, + VirtualScript +} import scala.build.input.ElementsUtils.* import scala.build.options.{BuildOptions, InternalOptions, MaybeScalaVersion} import scala.build.tests.util.BloopServer @@ -121,4 +127,57 @@ class InputsTests extends munit.FunSuite { assert(!filesUnderScalaBuild.exists(_.baseName.startsWith("project"))) } } + + test("URLs with query parameters") { + val urlBase = + "https://gist.githubusercontent.com/USER/hash/raw/hash" + val urls = Seq( + s"$urlBase/test.sc", + s"$urlBase/test.sc?foo=bar", + s"$urlBase/test.sc?foo=endsWith.md", + s"http://gist.githubusercontent.com/USER/hash/raw/hash/test.sc?foo=bar", + s"$urlBase/test.scala?foo=endsWith.java", + s"$urlBase/test.java?token=123456789123456789", + s"file:///Users/user/content/test.sc" + ) + + TestInputs().fromRoot { root => + val elements = Inputs.validateArgs( + urls, + root, + download = url => Right(Array.emptyByteArray), + stdinOpt = None, + acceptFds = true, + enableMarkdown = true + )(using ScalaCliInvokeData.dummy) + + elements match { + case Seq( + Right(Seq(el1: VirtualScript)), + Right(Seq(el2: VirtualScript)), + Right(Seq(el3: VirtualScript)), + Right(Seq(el4: VirtualScript)), + Right(Seq(el5: VirtualScalaFile)), + Right(Seq(el6: VirtualJavaFile)), + Right(Seq(el7: VirtualScript)) + ) => + Seq(el1, el2, el3, el4, el5, el6, el7) + .zip(urls) + .foreach { + case (el: VirtualScript, url) => + expect(el.source == url) + expect(el.content.isEmpty) + expect(el.wrapperPath.endsWith(os.rel / "test.sc")) + case (el: VirtualScalaFile, url) => + expect(el.source == url) + expect(el.content.isEmpty) + case (el: VirtualJavaFile, url) => + expect(el.source == url) + expect(el.content.isEmpty) + case _ => fail("Unexpected elements") + } + case _ => fail("Unexpected elements") + } + } + } }