2023-10-19 15:45:26 +03:00
|
|
|
#include "source-accessor.hh"
|
|
|
|
#include "archive.hh"
|
|
|
|
|
|
|
|
namespace nix {
|
|
|
|
|
|
|
|
static std::atomic<size_t> nextNumber{0};
|
|
|
|
|
|
|
|
SourceAccessor::SourceAccessor()
|
|
|
|
: number(++nextNumber)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2023-10-20 17:36:41 +03:00
|
|
|
std::string SourceAccessor::readFile(const CanonPath & path)
|
|
|
|
{
|
|
|
|
StringSink sink;
|
|
|
|
std::optional<uint64_t> size;
|
|
|
|
readFile(path, sink, [&](uint64_t _size)
|
|
|
|
{
|
|
|
|
size = _size;
|
|
|
|
});
|
|
|
|
assert(size && *size == sink.s.size());
|
|
|
|
return std::move(sink.s);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SourceAccessor::readFile(
|
|
|
|
const CanonPath & path,
|
|
|
|
Sink & sink,
|
|
|
|
std::function<void(uint64_t)> sizeCallback)
|
|
|
|
{
|
|
|
|
auto s = readFile(path);
|
|
|
|
sizeCallback(s.size());
|
|
|
|
sink(s);
|
|
|
|
}
|
|
|
|
|
2023-10-19 15:45:26 +03:00
|
|
|
Hash SourceAccessor::hashPath(
|
|
|
|
const CanonPath & path,
|
|
|
|
PathFilter & filter,
|
|
|
|
HashType ht)
|
|
|
|
{
|
|
|
|
HashSink sink(ht);
|
|
|
|
dumpPath(path, sink, filter);
|
|
|
|
return sink.finish().first;
|
|
|
|
}
|
|
|
|
|
2023-11-01 16:26:07 +02:00
|
|
|
SourceAccessor::Stat SourceAccessor::lstat(const CanonPath & path)
|
2023-10-19 15:45:26 +03:00
|
|
|
{
|
2023-11-01 16:26:07 +02:00
|
|
|
if (auto st = maybeLstat(path))
|
|
|
|
return *st;
|
|
|
|
else
|
|
|
|
throw Error("path '%s' does not exist", showPath(path));
|
2023-10-19 15:45:26 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
std::string SourceAccessor::showPath(const CanonPath & path)
|
|
|
|
{
|
|
|
|
return path.abs();
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|