diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2012-09-13T17·08-0400 |
---|---|---|
committer | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2012-09-13T17·08-0400 |
commit | 2923b55f9d67bda340053a27e08f7bcddc025f7c (patch) | |
tree | f89ce72820e096678f0d5885ae034510ad43f3ef /src | |
parent | 31114ec3a5ce08ccf9526f62316f1cc60c8b399a (diff) |
Delete paths in a component in topologically sorted order
The outputs of a derivation can refer to each other (even though they cannot have cycles), so they have to be deleted in the right order. http://hydra.nixos.org/build/3026118
Diffstat (limited to 'src')
-rw-r--r-- | src/libstore/gc.cc | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/src/libstore/gc.cc b/src/libstore/gc.cc index 0e0c15934ec5..dc1de48ea605 100644 --- a/src/libstore/gc.cc +++ b/src/libstore/gc.cc @@ -454,6 +454,7 @@ bool LocalStore::tryToDelete(GCState & state, const Path & path) is, we can delete the elements of ‘paths’ only if all referrers of ‘paths’ are garbage. */ PathSet paths, referrers; + Paths pathsSorted; if (isValidPath(path)) { @@ -516,7 +517,8 @@ bool LocalStore::tryToDelete(GCState & state, const Path & path) } /* The paths are garbage, so delete them. */ - foreach (PathSet::iterator, i, paths) { + pathsSorted = topoSortPaths(*this, paths); + foreach (Paths::iterator, i, pathsSorted) { if (shouldDelete(state.options.action)) { /* If it's a valid path that's not a regular file or |