From 61069a52a74e183e6640ce9a23459af97a9a87ef 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 8fd15a52d..1b7c2ff84 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 d704a26d3..d857fbc65 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); + } }