fetchTree(): Parse type attribute first
The 'url' attribute depends on whether type == 'git', so this is needed for builtins.fetchTree {url = "git@github.com:NixOS/nix.git"; type = "git";}
This commit is contained in:
parent
83d86cc1b0
commit
57a8eb4c01
|
@ -91,7 +91,7 @@ static void fetchTree(
|
||||||
const Pos & pos,
|
const Pos & pos,
|
||||||
Value * * args,
|
Value * * args,
|
||||||
Value & v,
|
Value & v,
|
||||||
const std::optional<std::string> & type,
|
std::optional<std::string> type,
|
||||||
const FetchTreeParams & params = FetchTreeParams{}
|
const FetchTreeParams & params = FetchTreeParams{}
|
||||||
) {
|
) {
|
||||||
fetchers::Input input;
|
fetchers::Input input;
|
||||||
|
@ -104,7 +104,23 @@ static void fetchTree(
|
||||||
|
|
||||||
fetchers::Attrs attrs;
|
fetchers::Attrs attrs;
|
||||||
|
|
||||||
|
if (auto aType = args[0]->attrs->get(state.sType)) {
|
||||||
|
if (type)
|
||||||
|
throw Error({
|
||||||
|
.msg = hintfmt("unexpected attribute 'type'"),
|
||||||
|
.errPos = pos
|
||||||
|
});
|
||||||
|
type = state.forceStringNoCtx(*aType->value, *aType->pos);
|
||||||
|
} else if (!type)
|
||||||
|
throw Error({
|
||||||
|
.msg = hintfmt("attribute 'type' is missing in call to 'fetchTree'"),
|
||||||
|
.errPos = pos
|
||||||
|
});
|
||||||
|
|
||||||
|
attrs.emplace("type", type.value());
|
||||||
|
|
||||||
for (auto & attr : *args[0]->attrs) {
|
for (auto & attr : *args[0]->attrs) {
|
||||||
|
if (attr.name == state.sType) continue;
|
||||||
state.forceValue(*attr.value);
|
state.forceValue(*attr.value);
|
||||||
if (attr.value->type() == nPath || attr.value->type() == nString) {
|
if (attr.value->type() == nPath || attr.value->type() == nString) {
|
||||||
auto s = state.coerceToString(*attr.pos, *attr.value, context, false, false);
|
auto s = state.coerceToString(*attr.pos, *attr.value, context, false, false);
|
||||||
|
@ -124,15 +140,6 @@ static void fetchTree(
|
||||||
attr.name, showType(*attr.value));
|
attr.name, showType(*attr.value));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type)
|
|
||||||
attrs.emplace("type", type.value());
|
|
||||||
|
|
||||||
if (!attrs.count("type"))
|
|
||||||
throw Error({
|
|
||||||
.msg = hintfmt("attribute 'type' is missing in call to 'fetchTree'"),
|
|
||||||
.errPos = pos
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!params.allowNameArgument)
|
if (!params.allowNameArgument)
|
||||||
if (auto nameIter = attrs.find("name"); nameIter != attrs.end())
|
if (auto nameIter = attrs.find("name"); nameIter != attrs.end())
|
||||||
throw Error({
|
throw Error({
|
||||||
|
|
Loading…
Reference in a new issue