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
b2be6fed86. This is a backport of just the
relevant part.

See #12417
This commit is contained in:
Pascal Jungblut 2025-03-29 13:50:51 +01:00
parent e1dad7daa5
commit 61069a52a7
2 changed files with 27 additions and 3 deletions

View File

@ -234,15 +234,16 @@ std::optional<std::pair<FlakeRef, std::string>> 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<FlakeRef, std::string> parseFlakeRefWithFragment(

View File

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