Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion src/libexpr/primops/fetchTree.cc
Original file line number Diff line number Diff line change
Expand Up @@ -588,7 +588,11 @@ static void fetch(

if (expectedHash) {
auto hash = unpack ? state.store->queryPathInfo(storePath)->narHash
: hashFile(HashAlgorithm::SHA256, state.store->toRealPath(storePath));
: hashPath(
{state.store->requireStoreObjectAccessor(storePath)},
FileSerialisationMethod::Flat,
HashAlgorithm::SHA256)
.hash;
if (hash != *expectedHash) {
state
.error<EvalError>(
Expand Down
3 changes: 1 addition & 2 deletions src/libfetchers/fetchers.cc
Original file line number Diff line number Diff line change
Expand Up @@ -332,8 +332,7 @@ std::pair<ref<SourceAccessor>, Input> Input::getAccessorUnchecked(ref<Store> sto

debug("using substituted/cached input '%s' in '%s'", to_string(), store->printStorePath(storePath));

// We just ensured the store object was there
auto accessor = ref{store->getFSAccessor(storePath)};
auto accessor = store->requireStoreObjectAccessor(storePath);

accessor->fingerprint = getFingerprint(store);

Expand Down
10 changes: 6 additions & 4 deletions src/libfetchers/github.cc
Original file line number Diff line number Diff line change
Expand Up @@ -399,7 +399,8 @@ struct GitHubInputScheme : GitArchiveInputScheme
Headers headers = makeHeadersWithAuthTokens(*input.settings, host, input);

auto downloadResult = downloadFile(store, *input.settings, url, "source", headers);
auto json = nlohmann::json::parse(store->getFSAccessor(downloadResult.storePath)->readFile(CanonPath::root));
auto json = nlohmann::json::parse(
store->requireStoreObjectAccessor(downloadResult.storePath)->readFile(CanonPath::root));

return RefInfo{
.rev = Hash::parseAny(std::string{json["sha"]}, HashAlgorithm::SHA1),
Expand Down Expand Up @@ -473,7 +474,8 @@ struct GitLabInputScheme : GitArchiveInputScheme
Headers headers = makeHeadersWithAuthTokens(*input.settings, host, input);

auto downloadResult = downloadFile(store, *input.settings, url, "source", headers);
auto json = nlohmann::json::parse(store->getFSAccessor(downloadResult.storePath)->readFile(CanonPath::root));
auto json = nlohmann::json::parse(
store->requireStoreObjectAccessor(downloadResult.storePath)->readFile(CanonPath::root));

if (json.is_array() && json.size() >= 1 && json[0]["id"] != nullptr) {
return RefInfo{.rev = Hash::parseAny(std::string(json[0]["id"]), HashAlgorithm::SHA1)};
Expand Down Expand Up @@ -549,7 +551,7 @@ struct SourceHutInputScheme : GitArchiveInputScheme
std::string refUri;
if (ref == "HEAD") {
auto downloadFileResult = downloadFile(store, *input.settings, fmt("%s/HEAD", base_url), "source", headers);
auto contents = nix::ref(store->getFSAccessor(downloadFileResult.storePath))->readFile(CanonPath::root);
auto contents = store->requireStoreObjectAccessor(downloadFileResult.storePath)->readFile(CanonPath::root);

auto remoteLine = git::parseLsRemoteLine(getLine(contents).first);
if (!remoteLine) {
Expand All @@ -563,7 +565,7 @@ struct SourceHutInputScheme : GitArchiveInputScheme

auto downloadFileResult =
downloadFile(store, *input.settings, fmt("%s/info/refs", base_url), "source", headers);
auto contents = nix::ref(store->getFSAccessor(downloadFileResult.storePath))->readFile(CanonPath::root);
auto contents = store->requireStoreObjectAccessor(downloadFileResult.storePath)->readFile(CanonPath::root);
std::istringstream is(contents);

std::string line;
Expand Down
4 changes: 1 addition & 3 deletions src/libfetchers/mercurial.cc
Original file line number Diff line number Diff line change
Expand Up @@ -329,9 +329,7 @@ struct MercurialInputScheme : InputScheme
Input input(_input);

auto storePath = fetchToStore(store, input);

// We just added it, it should be there.
auto accessor = ref{store->getFSAccessor(storePath)};
auto accessor = store->requireStoreObjectAccessor(storePath);

accessor->setPathDisplay("«" + input.to_string() + "»");

Expand Down
2 changes: 1 addition & 1 deletion src/libfetchers/path.cc
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ struct PathInputScheme : InputScheme
storePath = store->addToStoreFromDump(*src, "source");
}

auto accessor = ref{store->getFSAccessor(*storePath)};
auto accessor = store->requireStoreObjectAccessor(*storePath);

// To prevent `fetchToStore()` copying the path again to Nix
// store, pre-create an entry in the fetcher cache.
Expand Down
12 changes: 3 additions & 9 deletions src/libstore/build/worker.cc
Original file line number Diff line number Diff line change
Expand Up @@ -529,15 +529,9 @@ bool Worker::pathContentsGood(const StorePath & path)
return i->second;
printInfo("checking path '%s'...", store.printStorePath(path));
auto info = store.queryPathInfo(path);
bool res;
if (!pathExists(store.printStorePath(path)))
res = false;
else {
auto current = hashPath(
{store.getFSAccessor(), CanonPath(path.to_string())},
FileIngestionMethod::NixArchive,
info->narHash.algo)
.first;
bool res = false;
if (auto accessor = store.getFSAccessor(path, /*requireValidPath=*/false)) {
auto current = hashPath({ref{accessor}}, FileIngestionMethod::NixArchive, info->narHash.algo).first;
Hash nullHash(HashAlgorithm::SHA256);
res = info->narHash == nullHash || info->narHash == current;
}
Expand Down
20 changes: 19 additions & 1 deletion src/libstore/include/nix/store/store-api.hh
Original file line number Diff line number Diff line change
Expand Up @@ -724,10 +724,28 @@ public:
* the Nix store.
*
* @return nullptr if the store doesn't contain an object at the
* givine path.
* given path.
*/
virtual std::shared_ptr<SourceAccessor> getFSAccessor(const StorePath & path, bool requireValidPath = true) = 0;

/**
* Get an accessor for the store object or throw an Error if it's invalid or
* doesn't exist.
*
* @throws InvalidPath if the store object doesn't exist or (if requireValidPath = true) is
* invalid.
*/
[[nodiscard]] ref<SourceAccessor> requireStoreObjectAccessor(const StorePath & path, bool requireValidPath = true)
{
auto accessor = getFSAccessor(path, requireValidPath);
if (!accessor) {
throw InvalidPath(
requireValidPath ? "path '%1%' is not a valid store path" : "store path '%1%' does not exist",
printStorePath(path));
}
return ref<SourceAccessor>{accessor};
}

/**
* Repair the contents of the given path by redownloading it using
* a substituter (if available).
Expand Down
2 changes: 1 addition & 1 deletion src/libstore/store-api.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1130,7 +1130,7 @@ Derivation Store::derivationFromPath(const StorePath & drvPath)

static Derivation readDerivationCommon(Store & store, const StorePath & drvPath, bool requireValidPath)
{
auto accessor = store.getFSAccessor(drvPath, requireValidPath);
auto accessor = store.requireStoreObjectAccessor(drvPath, requireValidPath);
try {
return parseDerivation(store, accessor->readFile(CanonPath::root), Derivation::nameFromPath(drvPath));
} catch (FormatError & e) {
Expand Down
5 changes: 1 addition & 4 deletions src/nix/cat.cc
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,7 @@ struct CmdCatStore : StoreCommand, MixCat
void run(ref<Store> store) override
{
auto [storePath, rest] = store->toStorePath(path);
auto accessor = store->getFSAccessor(storePath);
if (!accessor)
throw InvalidPath("path '%1%' is not a valid store path", store->printStorePath(storePath));
cat(ref{std::move(accessor)}, CanonPath{rest});
cat(store->requireStoreObjectAccessor(storePath), CanonPath{rest});
}
};

Expand Down
12 changes: 6 additions & 6 deletions src/nix/develop.cc
Original file line number Diff line number Diff line change
Expand Up @@ -299,11 +299,9 @@ static StorePath getDerivationEnvironment(ref<Store> store, ref<Store> evalStore

for (auto & [_0, optPath] : evalStore->queryPartialDerivationOutputMap(shellDrvPath)) {
assert(optPath);
auto & outPath = *optPath;
assert(store->isValidPath(outPath));
auto outPathS = store->toRealPath(outPath);
if (lstat(outPathS).st_size)
return outPath;
auto accessor = evalStore->requireStoreObjectAccessor(*optPath);
if (auto st = accessor->maybeLstat(CanonPath::root); st && st->fileSize.value_or(0))
return *optPath;
}

throw Error("get-env.sh failed to produce an environment");
Expand Down Expand Up @@ -502,7 +500,9 @@ struct Common : InstallableCommand, MixProfile

debug("reading environment file '%s'", strPath);

return {BuildEnvironment::parseJSON(readFile(store->toRealPath(shellOutPath))), strPath};
return {
BuildEnvironment::parseJSON(store->requireStoreObjectAccessor(shellOutPath)->readFile(CanonPath::root)),
strPath};
}
};

Expand Down
5 changes: 1 addition & 4 deletions src/nix/ls.cc
Original file line number Diff line number Diff line change
Expand Up @@ -115,10 +115,7 @@ struct CmdLsStore : StoreCommand, MixLs
void run(ref<Store> store) override
{
auto [storePath, rest] = store->toStorePath(path);
auto accessor = store->getFSAccessor(storePath);
if (!accessor)
throw InvalidPath("path '%1%' is not a valid store path", store->printStorePath(storePath));
list(ref{std::move(accessor)}, CanonPath{rest});
list(store->requireStoreObjectAccessor(storePath), CanonPath{rest});
}
};

Expand Down
2 changes: 1 addition & 1 deletion src/nix/nix-store/nix-store.cc
Original file line number Diff line number Diff line change
Expand Up @@ -603,7 +603,7 @@ static void registerValidity(bool reregister, bool hashGiven, bool canonicalise)
#endif
if (!hashGiven) {
HashResult hash = hashPath(
{ref{store->getFSAccessor(info->path, false)}},
{store->requireStoreObjectAccessor(info->path, /*requireValidPath=*/false)},
FileSerialisationMethod::NixArchive,
HashAlgorithm::SHA256);
info->narHash = hash.hash;
Expand Down
2 changes: 1 addition & 1 deletion src/nix/why-depends.cc
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ struct CmdWhyDepends : SourceExprCommand, MixOperateOnOptions
contain the reference. */
std::map<std::string, Strings> hits;

auto accessor = store->getFSAccessor(node.path);
auto accessor = store->requireStoreObjectAccessor(node.path);

auto visitPath = [&](this auto && recur, const CanonPath & p) -> void {
auto st = accessor->maybeLstat(p);
Expand Down
Loading