Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ignore query parameters in input urls #2334

Merged
merged 1 commit into from Aug 8, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
17 changes: 12 additions & 5 deletions modules/build/src/main/scala/scala/build/input/Element.scala
Expand Up @@ -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)
}
}
Expand Down
61 changes: 60 additions & 1 deletion modules/build/src/test/scala/scala/build/tests/InputsTests.scala
Expand Up @@ -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
Expand Down Expand Up @@ -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")
}
}
}
}