2021-03-02 03:50:41 +00:00
|
|
|
#include "path-with-outputs.hh"
|
2021-03-02 00:47:00 +00:00
|
|
|
#include "store-api.hh"
|
|
|
|
|
2022-04-22 13:17:01 +00:00
|
|
|
#include <regex>
|
|
|
|
|
2021-03-02 00:47:00 +00:00
|
|
|
namespace nix {
|
|
|
|
|
|
|
|
std::string StorePathWithOutputs::to_string(const Store & store) const
|
|
|
|
{
|
|
|
|
return outputs.empty()
|
|
|
|
? store.printStorePath(path)
|
|
|
|
: store.printStorePath(path) + "!" + concatStringsSep(",", outputs);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-04-05 13:48:18 +00:00
|
|
|
DerivedPath StorePathWithOutputs::toDerivedPath() const
|
2021-03-02 03:50:41 +00:00
|
|
|
{
|
|
|
|
if (!outputs.empty() || path.isDerivation())
|
2021-04-05 13:48:18 +00:00
|
|
|
return DerivedPath::Built { path, outputs };
|
2021-03-02 03:50:41 +00:00
|
|
|
else
|
2021-04-05 13:48:18 +00:00
|
|
|
return DerivedPath::Opaque { path };
|
2021-03-02 03:50:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-04-05 13:48:18 +00:00
|
|
|
std::vector<DerivedPath> toDerivedPaths(const std::vector<StorePathWithOutputs> ss)
|
2021-03-02 03:50:41 +00:00
|
|
|
{
|
2022-03-01 18:31:36 +00:00
|
|
|
std::vector<DerivedPath> reqs;
|
|
|
|
for (auto & s : ss) reqs.push_back(s.toDerivedPath());
|
|
|
|
return reqs;
|
2021-03-02 03:50:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-04-05 13:48:18 +00:00
|
|
|
std::variant<StorePathWithOutputs, StorePath> StorePathWithOutputs::tryFromDerivedPath(const DerivedPath & p)
|
2021-03-02 03:50:41 +00:00
|
|
|
{
|
|
|
|
return std::visit(overloaded {
|
2021-09-30 21:31:21 +00:00
|
|
|
[&](const DerivedPath::Opaque & bo) -> std::variant<StorePathWithOutputs, StorePath> {
|
2021-03-02 03:50:41 +00:00
|
|
|
if (bo.path.isDerivation()) {
|
|
|
|
// drv path gets interpreted as "build", not "get drv file itself"
|
|
|
|
return bo.path;
|
|
|
|
}
|
|
|
|
return StorePathWithOutputs { bo.path };
|
|
|
|
},
|
2021-09-30 21:31:21 +00:00
|
|
|
[&](const DerivedPath::Built & bfd) -> std::variant<StorePathWithOutputs, StorePath> {
|
2021-03-02 03:50:41 +00:00
|
|
|
return StorePathWithOutputs { bfd.drvPath, bfd.outputs };
|
|
|
|
},
|
2021-04-05 13:24:42 +00:00
|
|
|
}, p.raw());
|
2021-03-02 03:50:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-03-02 00:47:00 +00:00
|
|
|
std::pair<std::string_view, StringSet> parsePathWithOutputs(std::string_view s)
|
|
|
|
{
|
|
|
|
size_t n = s.find("!");
|
|
|
|
return n == s.npos
|
2022-02-25 15:00:00 +00:00
|
|
|
? std::make_pair(s, std::set<std::string>())
|
2021-03-02 00:47:00 +00:00
|
|
|
: std::make_pair(((std::string_view) s).substr(0, n),
|
2022-02-25 15:00:00 +00:00
|
|
|
tokenizeString<std::set<std::string>>(((std::string_view) s).substr(n + 1), ","));
|
2021-03-02 00:47:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-03-02 01:06:08 +00:00
|
|
|
StorePathWithOutputs parsePathWithOutputs(const Store & store, std::string_view pathWithOutputs)
|
2021-03-02 00:47:00 +00:00
|
|
|
{
|
2021-03-02 01:06:08 +00:00
|
|
|
auto [path, outputs] = parsePathWithOutputs(pathWithOutputs);
|
|
|
|
return StorePathWithOutputs { store.parseStorePath(path), std::move(outputs) };
|
2021-03-02 00:47:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-03-02 01:06:08 +00:00
|
|
|
StorePathWithOutputs followLinksToStorePathWithOutputs(const Store & store, std::string_view pathWithOutputs)
|
2021-03-02 00:47:00 +00:00
|
|
|
{
|
2021-03-02 01:06:08 +00:00
|
|
|
auto [path, outputs] = parsePathWithOutputs(pathWithOutputs);
|
|
|
|
return StorePathWithOutputs { store.followLinksToStorePath(path), std::move(outputs) };
|
2021-03-02 00:47:00 +00:00
|
|
|
}
|
|
|
|
|
2022-04-22 13:17:01 +00:00
|
|
|
std::pair<std::string, OutputsSpec> parseOutputsSpec(const std::string & s)
|
|
|
|
{
|
|
|
|
static std::regex regex(R"((.*)\^((\*)|([a-z]+(,[a-z]+)*)))");
|
|
|
|
|
|
|
|
std::smatch match;
|
|
|
|
if (!std::regex_match(s, match, regex))
|
|
|
|
return {s, DefaultOutputs()};
|
|
|
|
|
|
|
|
if (match[3].matched)
|
|
|
|
return {match[1], AllOutputs()};
|
|
|
|
|
|
|
|
return {match[1], tokenizeString<OutputNames>(match[4].str(), ",")};
|
|
|
|
}
|
|
|
|
|
2021-03-02 00:47:00 +00:00
|
|
|
}
|