diff options
Diffstat (limited to 'src/libstore/gc.cc')
-rw-r--r-- | src/libstore/gc.cc | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/src/libstore/gc.cc b/src/libstore/gc.cc index 323acf2651dc..6f09e9cb7852 100644 --- a/src/libstore/gc.cc +++ b/src/libstore/gc.cc @@ -213,14 +213,9 @@ static void readTempRoots(PathSet & tempRoots, FDs & fds) lockFile(*fd, ltRead, true); /* Read the entire file. */ - struct stat st; - if (fstat(*fd, &st) == -1) - throw SysError(format("statting `%1%'") % path); - unsigned char buf[st.st_size]; /* !!! stack space */ - readFull(*fd, buf, st.st_size); + string contents = readFile(*fd); /* Extract the roots. */ - string contents((char *) buf, st.st_size); unsigned int pos = 0, end; while ((end = contents.find((char) 0, pos)) != string::npos) { @@ -310,7 +305,9 @@ static Paths topoSort(const PathSet & paths) void collectGarbage(GCAction action, PathSet & result) { result.clear(); - + + string gcKeepOutputs = querySetting("gc-keep-outputs", "false"); + /* Acquire the global GC root. This prevents a) New roots from being added. b) Processes from creating new temporary root files. */ @@ -333,6 +330,19 @@ void collectGarbage(GCAction action, PathSet & result) for (PathSet::const_iterator i = roots.begin(); i != roots.end(); ++i) computeFSClosure(canonPath(*i), livePaths); + if (gcKeepOutputs == "true") { + /* Hmz, identical to storePathRequisites in nix-store. */ + for (PathSet::iterator i = livePaths.begin(); + i != livePaths.end(); ++i) + if (isDerivation(*i)) { + Derivation drv = derivationFromPath(*i); + for (DerivationOutputs::iterator j = drv.outputs.begin(); + j != drv.outputs.end(); ++j) + if (isValidPath(j->second.path)) + computeFSClosure(j->second.path, livePaths); + } + } + if (action == gcReturnLive) { result = livePaths; return; |