From 72bf56319164e1fb11017f591abae70932236f85 Mon Sep 17 00:00:00 2001 From: Pascal Jungblut Date: Sat, 29 Mar 2025 13:50:51 +0100 Subject: [PATCH] Exclude 'dir' from the FlakeRef's URL This fixes an issue where nix would try to check out invalid URLs, because it would pass 'dir' to the HTTP endpoint. For later versions this was fixed in b2be6fed8600ee48c05cc9643c101d5eab4a5727. This is a backport of just the relevant part. See #12417 --- src/libflake/flake/flakeref.cc | 7 ++++--- tests/unit/libflake/flakeref.cc | 23 +++++++++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/libflake/flake/flakeref.cc b/src/libflake/flake/flakeref.cc index 8fd15a52d6f..1b7c2ff842f 100644 --- a/src/libflake/flake/flakeref.cc +++ b/src/libflake/flake/flakeref.cc @@ -234,15 +234,16 @@ std::optional> parseURLFlakeRef( return std::nullopt; } + const auto subdir = getOr(parsedURL.query, "dir", ""); + parsedURL.query.erase("dir"); + std::string fragment; std::swap(fragment, parsedURL.fragment); auto input = fetchers::Input::fromURL(fetchSettings, parsedURL, isFlake); input.parent = baseDir; - return std::make_pair( - FlakeRef(std::move(input), getOr(parsedURL.query, "dir", "")), - fragment); + return std::make_pair(FlakeRef(std::move(input), subdir), fragment); } std::pair parseFlakeRefWithFragment( diff --git a/tests/unit/libflake/flakeref.cc b/tests/unit/libflake/flakeref.cc index d704a26d36c..d857fbc6578 100644 --- a/tests/unit/libflake/flakeref.cc +++ b/tests/unit/libflake/flakeref.cc @@ -21,4 +21,27 @@ namespace nix { ASSERT_EQ(parsed, expected); } + /* ---------------------------------------------------------------------------- + * parseFlakeRef + * --------------------------------------------------------------------------*/ + + TEST(parseFlakeRef, removesDirFromInputURL) { + fetchers::Settings fetchSettings; + auto s = "git+https://localhost:8181/test/test.git?dir=subdir"; + auto flakeref = parseFlakeRef(fetchSettings, s); + auto expected = "git+https://localhost:8181/test/test.git"; + auto inputURL = flakeref.input.toURLString(); + + ASSERT_EQ(inputURL, expected); + } + + TEST(parseFlakeRef, setsSubdir) { + fetchers::Settings fetchSettings; + auto s = "git+https://localhost:8181/test/test.git?dir=subdir"; + auto flakeref = parseFlakeRef(fetchSettings, s); + auto expected = "subdir"; + auto flakerefSubdir = flakeref.subdir; + + ASSERT_EQ(flakerefSubdir, expected); + } }