Allow bare flakerefs as installables
So now $ nix build blender-bin works and builds the default package from that flake. You don't need to add a colon at the end anymore.
This commit is contained in:
parent
7adb10d29b
commit
ccb1bad612
|
@ -65,7 +65,7 @@ FlakeRef::FlakeRef(const std::string & uri_, bool allowRelative)
|
||||||
auto handleSubdir = [&](const std::string & name, const std::string & value) {
|
auto handleSubdir = [&](const std::string & name, const std::string & value) {
|
||||||
if (name == "dir") {
|
if (name == "dir") {
|
||||||
if (value != "" && !std::regex_match(value, subDirRegex2))
|
if (value != "" && !std::regex_match(value, subDirRegex2))
|
||||||
throw Error("flake '%s' has invalid subdirectory '%s'", uri, value);
|
throw BadFlakeRef("flake '%s' has invalid subdirectory '%s'", uri, value);
|
||||||
subdir = value;
|
subdir = value;
|
||||||
return true;
|
return true;
|
||||||
} else
|
} else
|
||||||
|
@ -75,11 +75,11 @@ FlakeRef::FlakeRef(const std::string & uri_, bool allowRelative)
|
||||||
auto handleGitParams = [&](const std::string & name, const std::string & value) {
|
auto handleGitParams = [&](const std::string & name, const std::string & value) {
|
||||||
if (name == "rev") {
|
if (name == "rev") {
|
||||||
if (!std::regex_match(value, revRegex))
|
if (!std::regex_match(value, revRegex))
|
||||||
throw Error("invalid Git revision '%s'", value);
|
throw BadFlakeRef("invalid Git revision '%s'", value);
|
||||||
rev = Hash(value, htSHA1);
|
rev = Hash(value, htSHA1);
|
||||||
} else if (name == "ref") {
|
} else if (name == "ref") {
|
||||||
if (!std::regex_match(value, refRegex2))
|
if (!std::regex_match(value, refRegex2))
|
||||||
throw Error("invalid Git ref '%s'", value);
|
throw BadFlakeRef("invalid Git ref '%s'", value);
|
||||||
ref = value;
|
ref = value;
|
||||||
} else if (handleSubdir(name, value))
|
} else if (handleSubdir(name, value))
|
||||||
;
|
;
|
||||||
|
@ -114,7 +114,7 @@ FlakeRef::FlakeRef(const std::string & uri_, bool allowRelative)
|
||||||
if (handleSubdir(param.first, param.second))
|
if (handleSubdir(param.first, param.second))
|
||||||
;
|
;
|
||||||
else
|
else
|
||||||
throw Error("invalid Git flakeref parameter '%s', in '%s'", param.first, uri);
|
throw BadFlakeRef("invalid Git flakeref parameter '%s', in '%s'", param.first, uri);
|
||||||
}
|
}
|
||||||
data = d;
|
data = d;
|
||||||
}
|
}
|
||||||
|
@ -129,14 +129,16 @@ FlakeRef::FlakeRef(const std::string & uri_, bool allowRelative)
|
||||||
;
|
;
|
||||||
else
|
else
|
||||||
// FIXME: should probably pass through unknown parameters
|
// FIXME: should probably pass through unknown parameters
|
||||||
throw Error("invalid Git flakeref parameter '%s', in '%s'", param.first, uri);
|
throw BadFlakeRef("invalid Git flakeref parameter '%s', in '%s'", param.first, uri);
|
||||||
}
|
}
|
||||||
if (rev && !ref)
|
if (rev && !ref)
|
||||||
throw Error("flake URI '%s' lacks a Git ref", uri);
|
throw BadFlakeRef("flake URI '%s' lacks a Git ref", uri);
|
||||||
data = d;
|
data = d;
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (hasPrefix(uri, "/") || (allowRelative && (hasPrefix(uri, "./") || hasPrefix(uri, "../") || uri == "."))) {
|
else if ((hasPrefix(uri, "/") || (allowRelative && (hasPrefix(uri, "./") || hasPrefix(uri, "../") || uri == ".")))
|
||||||
|
&& uri.find(':') == std::string::npos)
|
||||||
|
{
|
||||||
IsPath d;
|
IsPath d;
|
||||||
d.path = allowRelative ? absPath(uri) : canonPath(uri);
|
d.path = allowRelative ? absPath(uri) : canonPath(uri);
|
||||||
data = d;
|
data = d;
|
||||||
|
@ -144,12 +146,12 @@ FlakeRef::FlakeRef(const std::string & uri_, bool allowRelative)
|
||||||
if (handleGitParams(param.first, param.second))
|
if (handleGitParams(param.first, param.second))
|
||||||
;
|
;
|
||||||
else
|
else
|
||||||
throw Error("invalid Git flakeref parameter '%s', in '%s'", param.first, uri);
|
throw BadFlakeRef("invalid Git flakeref parameter '%s', in '%s'", param.first, uri);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
throw Error("'%s' is not a valid flake reference", uri);
|
throw BadFlakeRef("'%s' is not a valid flake reference", uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string FlakeRef::to_string() const
|
std::string FlakeRef::to_string() const
|
||||||
|
@ -225,4 +227,15 @@ FlakeRef FlakeRef::baseRef() const // Removes the ref and rev from a FlakeRef.
|
||||||
result.rev = std::nullopt;
|
result.rev = std::nullopt;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::optional<FlakeRef> parseFlakeRef(
|
||||||
|
const std::string & uri, bool allowRelative)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
return FlakeRef(uri, allowRelative);
|
||||||
|
} catch (BadFlakeRef & e) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -180,4 +180,9 @@ struct FlakeRef
|
||||||
|
|
||||||
std::ostream & operator << (std::ostream & str, const FlakeRef & flakeRef);
|
std::ostream & operator << (std::ostream & str, const FlakeRef & flakeRef);
|
||||||
|
|
||||||
|
MakeError(BadFlakeRef, Error);
|
||||||
|
|
||||||
|
std::optional<FlakeRef> parseFlakeRef(
|
||||||
|
const std::string & uri, bool allowRelative = false);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -332,6 +332,10 @@ std::vector<std::shared_ptr<Installable>> SourceExprCommand::parseInstallables(
|
||||||
getDefaultFlakeAttrPaths()));
|
getDefaultFlakeAttrPaths()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else if (auto flakeRef = parseFlakeRef(s, true))
|
||||||
|
result.push_back(std::make_shared<InstallableFlake>(*this, s,
|
||||||
|
getDefaultFlakeAttrPaths()));
|
||||||
|
|
||||||
else
|
else
|
||||||
result.push_back(std::make_shared<InstallableFlake>(*this, FlakeRef("nixpkgs"), s));
|
result.push_back(std::make_shared<InstallableFlake>(*this, FlakeRef("nixpkgs"), s));
|
||||||
}
|
}
|
||||||
|
|
|
@ -131,7 +131,7 @@ nix build -o $TEST_ROOT/result --flake-registry $registry flake1:foo
|
||||||
[[ -e $TEST_ROOT/result/hello ]]
|
[[ -e $TEST_ROOT/result/hello ]]
|
||||||
|
|
||||||
# Test defaultPackage.
|
# Test defaultPackage.
|
||||||
nix build -o $TEST_ROOT/result --flake-registry $registry flake1:
|
nix build -o $TEST_ROOT/result --flake-registry $registry flake1
|
||||||
[[ -e $TEST_ROOT/result/hello ]]
|
[[ -e $TEST_ROOT/result/hello ]]
|
||||||
|
|
||||||
# Building a flake with an unlocked dependency should fail in pure mode.
|
# Building a flake with an unlocked dependency should fail in pure mode.
|
||||||
|
|
Loading…
Reference in a new issue