1
1
Fork 0
mirror of https://github.com/NixOS/nix.git synced 2025-11-24 11:19:35 +01:00

nix store delete: Give a more specific error message

This commit is contained in:
Eelco Dolstra 2025-06-27 14:33:18 +02:00
parent 99c20e6c3e
commit 1929d84f9e

View file

@ -622,10 +622,8 @@ void LocalStore::collectGarbage(const GCOptions & options, GCResults & results)
GC root. Any new roots will be sent to our socket. */ GC root. Any new roots will be sent to our socket. */
Roots tempRoots; Roots tempRoots;
findTempRoots(tempRoots, true); findTempRoots(tempRoots, true);
for (auto & root : tempRoots) { for (auto & root : tempRoots)
_shared.lock()->tempRoots.insert(std::string(root.first.hashPart())); _shared.lock()->tempRoots.insert(std::string(root.first.hashPart()));
roots.insert(root.first);
}
/* Synchronisation point for testing, see tests/functional/gc-non-blocking.sh. */ /* Synchronisation point for testing, see tests/functional/gc-non-blocking.sh. */
if (auto p = getEnv("_NIX_TEST_GC_SYNC_2")) if (auto p = getEnv("_NIX_TEST_GC_SYNC_2"))
@ -718,19 +716,31 @@ void LocalStore::collectGarbage(const GCOptions & options, GCResults & results)
/* If this is a root, bail out. */ /* If this is a root, bail out. */
if (roots.count(*path)) { if (roots.count(*path)) {
if (options.action == GCOptions::gcDeleteSpecific)
throw Error(
"Cannot delete path '%s' because it's a GC root.",
printStorePath(start));
debug("cannot delete '%s' because it's a root", printStorePath(*path)); debug("cannot delete '%s' because it's a root", printStorePath(*path));
return markAlive(); return markAlive();
} }
if (options.action == GCOptions::gcDeleteSpecific if (options.action == GCOptions::gcDeleteSpecific
&& !options.pathsToDelete.count(*path)) && !options.pathsToDelete.count(*path))
return; {
throw Error(
"Cannot delete path '%s' because it's referenced by path '%s'.",
printStorePath(start),
printStorePath(*path));
}
{ {
auto hashPart = std::string(path->hashPart()); auto hashPart = std::string(path->hashPart());
auto shared(_shared.lock()); auto shared(_shared.lock());
if (shared->tempRoots.count(hashPart)) { if (shared->tempRoots.count(hashPart)) {
debug("cannot delete '%s' because it's a temporary root", printStorePath(*path)); if (options.action == GCOptions::gcDeleteSpecific)
throw Error(
"Cannot delete path '%s' because it's in use by a Nix process.",
printStorePath(start));
return markAlive(); return markAlive();
} }
shared->pending = hashPart; shared->pending = hashPart;
@ -789,12 +799,7 @@ void LocalStore::collectGarbage(const GCOptions & options, GCResults & results)
for (auto & i : options.pathsToDelete) { for (auto & i : options.pathsToDelete) {
deleteReferrersClosure(i); deleteReferrersClosure(i);
if (!dead.count(i)) assert(dead.count(i));
throw Error(
"Cannot delete path '%1%' since it is still alive. "
"To find out why, use: "
"nix-store --query --roots and nix-store --query --referrers",
printStorePath(i));
} }
} else if (options.maxFreed > 0) { } else if (options.maxFreed > 0) {