diff --git a/src/libstore/gc.cc b/src/libstore/gc.cc index 3f5c2b39e..75773d6c1 100644 --- a/src/libstore/gc.cc +++ b/src/libstore/gc.cc @@ -717,6 +717,15 @@ void LocalStore::collectGarbage(const GCOptions & options, GCResults & results) } catch (InvalidPath &) { } }; + if (options.action == GCOptions::gcDeleteSpecific + && !options.pathsToDelete.count(*path)) + { + throw Error( + "Cannot delete path '%s' because it's referenced by path '%s'.", + printStorePath(start), + printStorePath(*path)); + } + /* If this is a root, bail out. */ if (auto i = roots.find(*path); i != roots.end()) { if (options.action == GCOptions::gcDeleteSpecific) @@ -728,15 +737,6 @@ void LocalStore::collectGarbage(const GCOptions & options, GCResults & results) return markAlive(); } - if (options.action == GCOptions::gcDeleteSpecific - && !options.pathsToDelete.count(*path)) - { - throw Error( - "Cannot delete path '%s' because it's referenced by path '%s'.", - printStorePath(start), - printStorePath(*path)); - } - { auto hashPart = std::string(path->hashPart()); auto shared(_shared.lock()); diff --git a/tests/functional/gc.sh b/tests/functional/gc.sh index 66dd12eac..92ac7fac4 100755 --- a/tests/functional/gc.sh +++ b/tests/functional/gc.sh @@ -23,7 +23,7 @@ if nix-store --gc --print-dead | grep -E "$outPath"$; then false; fi nix-store --gc --print-dead inUse=$(readLink "$outPath/reference-to-input-2") -expectStderr 1 nix-store --delete "$inUse" | grepQuiet "Cannot delete path.*because it's referenced by the GC root " +expectStderr 1 nix-store --delete "$inUse" | grepQuiet "Cannot delete path.*because it's referenced by path '" test -e "$inUse" expectStderr 1 nix-store --delete "$outPath" | grepQuiet "Cannot delete path.*because it's referenced by the GC root "