This commit is contained in:
Eelco Dolstra 2023-11-14 14:47:17 +01:00
parent 7f576f5dfe
commit c257c82447
3 changed files with 17 additions and 6 deletions

View file

@ -54,18 +54,16 @@ struct MountedInputAccessor : InputAccessor
std::pair<ref<InputAccessor>, CanonPath> resolve(CanonPath path)
{
// Find the nearest parent of `path` that is a mount point.
std::vector<std::string> ss;
std::vector<std::string> subpath;
while (true) {
auto i = mounts.find(path);
if (i != mounts.end()) {
auto subpath = CanonPath::root;
for (auto j = ss.rbegin(); j != ss.rend(); ++j)
subpath.push(*j);
return {i->second, std::move(subpath)};
std::reverse(subpath.begin(), subpath.end());
return {i->second, CanonPath(subpath)};
}
assert(!path.isRoot());
ss.push_back(std::string(*path.baseName()));
subpath.push_back(std::string(*path.baseName()));
path.pop();
}
}

View file

@ -13,6 +13,13 @@ CanonPath::CanonPath(std::string_view raw, const CanonPath & root)
: path(absPath((Path) raw, root.abs()))
{ }
CanonPath::CanonPath(const std::vector<std::string> & elems)
: path("/")
{
for (auto & s : elems)
push(s);
}
CanonPath CanonPath::fromCwd(std::string_view path)
{
return CanonPath(unchecked_t(), absPath((Path) path));

View file

@ -6,6 +6,7 @@
#include <cassert>
#include <iostream>
#include <set>
#include <vector>
namespace nix {
@ -46,6 +47,11 @@ public:
: path(std::move(path))
{ }
/**
* Construct a canon path from a vector of elements.
*/
CanonPath(const std::vector<std::string> & elems);
static CanonPath fromCwd(std::string_view path = ".");
static CanonPath root;