From f279a86c929d2e6ed98adb8f17b4cb212f6d49d1 Mon Sep 17 00:00:00 2001 From: Javier Goday Date: Fri, 15 Aug 2025 08:40:15 +0200 Subject: [PATCH] Using directive with URL + query parameters (#3720) --- .../main/scala/scala/build/CrossSources.scala | 14 +++++++- .../scala/build/tests/SourcesTests.scala | 33 +++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/modules/build/src/main/scala/scala/build/CrossSources.scala b/modules/build/src/main/scala/scala/build/CrossSources.scala index 0bb2ae2637..737344add8 100644 --- a/modules/build/src/main/scala/scala/build/CrossSources.scala +++ b/modules/build/src/main/scala/scala/build/CrossSources.scala @@ -401,11 +401,23 @@ object CrossSources { fromInputs ++ fromSources ++ fromSourcesWithRequirements } + /** @return + * a java.net.URI to a String without query parameters + */ + private def uriToString(uri: java.net.URI): String = + java.net.URI( + uri.getScheme(), + uri.getAuthority(), + uri.getPath(), + null, + uri.getFragment() + ).toString() + private def downloadFile(download: BuildOptions.Download)(pUri: Positioned[java.net.URI]) = download(pUri.value.toString).left.map( new UsingFileFromUriError(pUri.value, pUri.positions, _) ).map(content => - Seq(Virtual(pUri.value.toString, content)) + Seq(Virtual(uriToString(pUri.value), content)) ) type CodeFile = os.Path | java.net.URI diff --git a/modules/build/src/test/scala/scala/build/tests/SourcesTests.scala b/modules/build/src/test/scala/scala/build/tests/SourcesTests.scala index 30614a97e0..56b114d8cd 100644 --- a/modules/build/src/test/scala/scala/build/tests/SourcesTests.scala +++ b/modules/build/src/test/scala/scala/build/tests/SourcesTests.scala @@ -125,6 +125,39 @@ class SourcesTests extends TestUtil.ScalaCliBuildSuite { } } + test("dependencies in .scala - using URL with query parameters") { + val testInputs = TestInputs( + os.rel / "something.scala" -> + """| //> using file http://github.com/VirtusLab/scala-cli/blob/main/modules/dummy/amm/src/main/scala/AmmDummy.scala?version=3 + | + |object Main { + |} + |""".stripMargin + ) + testInputs.withInputs { (root, inputs) => + val (crossSources, _) = + CrossSources.forInputs( + inputs, + preprocessors, + TestLogger(), + SuppressWarningOptions(), + download = _ => Right(Array.empty[Byte]) + ).orThrow + val scopedSources = crossSources.scopedSources(BuildOptions()).orThrow + val sources = + scopedSources.sources( + Scope.Main, + crossSources.sharedOptions(BuildOptions()), + root, + TestLogger() + ).orThrow + + expect(sources.paths.length == 1) + expect(sources.inMemory.length == 1) + expect(sources.inMemory(0).generatedRelPath.last == "AmmDummy.scala") + } + } + test("dependencies in .test.scala - using") { val testInputs = TestInputs( os.rel / "something.test.scala" ->