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); + } }