snix/third_party/nix/src/libstore/local-fs-store.cc
Vincent Ambo 5a00e58904 chore(3p): Bump nixpkgs to nixos-unstable from 2020-11-21
Included fixes for random breakage:

* 3p/awscli: pick from the stable channel; it is broken on unstable
* 3p/googletest: bumped version & removed patches that nixpkgs applies
* 3p/lisp/cffi: bumped library version for SBCL compat
* 3p/nix: fix libsystemd attribute
* 3p/nix: reformatted (clang-format handling of ternaries changed)
* glittershark/home: Use home-manager from nixkpgs
* glittershark/kernel: bumped linux-ck patch hash
* glittershark/kernel: removed "patch patch"
* multi/whitby: Use home-manager from nixpkgs
* tazjin/frog: drop Sourcetrail (it doesn't build currently)

Note that in addition to these changes, some previous CLs updated the
versions of git and cgit which was necessary for this channel bump,
but which could not be done in the same commit due to the nature of
the subtree merges.

Change-Id: If2563e8a68e2750c4b913a976ff7b93b42e8b7f3
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2110
Tested-by: BuildkiteCI
Reviewed-by: multi <depot@in-addr.xyz>
Reviewed-by: glittershark <grfn@gws.fyi>
2020-11-21 23:18:27 +00:00

123 lines
3.3 KiB
C++

#include "libstore/derivations.hh"
#include "libstore/fs-accessor.hh"
#include "libstore/globals.hh"
#include "libstore/store-api.hh"
#include "libutil/archive.hh"
#include "libutil/compression.hh"
namespace nix {
LocalFSStore::LocalFSStore(const Params& params) : Store(params) {}
struct LocalStoreAccessor : public FSAccessor {
ref<LocalFSStore> store;
explicit LocalStoreAccessor(const ref<LocalFSStore>& store) : store(store) {}
Path toRealPath(const Path& path) {
Path storePath = store->toStorePath(path);
if (!store->isValidPath(storePath)) {
throw InvalidPath(format("path '%1%' is not a valid store path") %
storePath);
}
return store->getRealStoreDir() + std::string(path, store->storeDir.size());
}
FSAccessor::Stat stat(const Path& path) override {
auto realPath = toRealPath(path);
struct stat st;
if (lstat(realPath.c_str(), &st) != 0) {
if (errno == ENOENT || errno == ENOTDIR) {
return {Type::tMissing, 0, false};
}
throw SysError(format("getting status of '%1%'") % path);
}
if (!S_ISREG(st.st_mode) && !S_ISDIR(st.st_mode) && !S_ISLNK(st.st_mode)) {
throw Error(format("file '%1%' has unsupported type") % path);
}
return {S_ISREG(st.st_mode) ? Type::tRegular
: S_ISLNK(st.st_mode) ? Type::tSymlink
: Type::tDirectory,
S_ISREG(st.st_mode) ? static_cast<uint64_t>(st.st_size) : 0,
S_ISREG(st.st_mode) && ((st.st_mode & S_IXUSR) != 0u)};
}
StringSet readDirectory(const Path& path) override {
auto realPath = toRealPath(path);
auto entries = nix::readDirectory(realPath);
StringSet res;
for (auto& entry : entries) {
res.insert(entry.name);
}
return res;
}
std::string readFile(const Path& path) override {
return nix::readFile(toRealPath(path));
}
std::string readLink(const Path& path) override {
return nix::readLink(toRealPath(path));
}
};
ref<FSAccessor> LocalFSStore::getFSAccessor() {
return make_ref<LocalStoreAccessor>(ref<LocalFSStore>(
std::dynamic_pointer_cast<LocalFSStore>(shared_from_this())));
}
void LocalFSStore::narFromPath(const Path& path, Sink& sink) {
if (!isValidPath(path)) {
throw Error(format("path '%s' is not valid") % path);
}
dumpPath(getRealStoreDir() + std::string(path, storeDir.size()), sink);
}
const std::string LocalFSStore::drvsLogDir = "drvs";
std::shared_ptr<std::string> LocalFSStore::getBuildLog(const Path& path_) {
auto path(path_);
assertStorePath(path);
if (!isDerivation(path)) {
try {
path = queryPathInfo(path)->deriver;
} catch (InvalidPath&) {
return nullptr;
}
if (path.empty()) {
return nullptr;
}
}
std::string baseName = baseNameOf(path);
for (int j = 0; j < 2; j++) {
Path logPath =
j == 0 ? fmt("%s/%s/%s/%s", logDir, drvsLogDir,
std::string(baseName, 0, 2), std::string(baseName, 2))
: fmt("%s/%s/%s", logDir, drvsLogDir, baseName);
Path logBz2Path = logPath + ".bz2";
if (pathExists(logPath)) {
return std::make_shared<std::string>(readFile(logPath));
}
if (pathExists(logBz2Path)) {
try {
return decompress("bzip2", readFile(logBz2Path));
} catch (Error&) {
}
}
}
return nullptr;
}
} // namespace nix