aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew O'Gorman <mog@rldn.net>2018-03-01 22:59:00 -0500
committerMatthew O'Gorman <mog@rldn.net>2018-03-01 22:59:00 -0500
commit467fdd8ca4d63972dbd94f0496918522c58916a0 (patch)
tree35b9fecc948d238e1a24ae9bd063459bfd7c111f
parent3c16044cb0acc87e128534cb3e2a2006b71059b6 (diff)
only delete things older than current gen and update logic in doc as
well
-rw-r--r--doc/manual/command-ref/nix-env.xml10
-rw-r--r--src/libstore/profiles.cc13
2 files changed, 14 insertions, 9 deletions
diff --git a/doc/manual/command-ref/nix-env.xml b/doc/manual/command-ref/nix-env.xml
index f0e70a41c..7eb9cc855 100644
--- a/doc/manual/command-ref/nix-env.xml
+++ b/doc/manual/command-ref/nix-env.xml
@@ -1349,9 +1349,9 @@ special value <literal>old</literal> to delete all non-current
generations, a value such as <literal>30d</literal> to delete all
generations older than the specified number of days (except for the
generation that was active at that point in time), or a value such as.
-<literal>+5</literal> to delete all but the number of items specified.
-Periodically deleting old generations is important to make garbage
-collection effective.</para>
+<literal>+5</literal> to only keep the specified items older than the
+current generation. Periodically deleting old generations is important
+to make garbage collection effective.</para>
</refsection>
@@ -1461,7 +1461,7 @@ error: no generation older than the current (91) exists</screen>
<refsection condition="manpage"><title>Environment variables</title>
<variablelist>
-
+
<varlistentry><term><envar>NIX_PROFILE</envar></term>
<listitem><para>Location of the Nix profile. Defaults to the
@@ -1475,6 +1475,6 @@ error: no generation older than the current (91) exists</screen>
</variablelist>
</refsection>
-
+
</refentry>
diff --git a/src/libstore/profiles.cc b/src/libstore/profiles.cc
index b43ec66f6..4c6af567a 100644
--- a/src/libstore/profiles.cc
+++ b/src/libstore/profiles.cc
@@ -160,19 +160,24 @@ void deleteGenerations(const Path & profile, const std::set<unsigned int> & gens
void deleteGenerationsGreaterThan(const Path & profile, int max, bool dryRun)
{
PathLocks lock;
-
lockProfile(lock, profile);
int curGen;
+ bool fromCurGen = false;
Generations gens = findGenerations(profile, curGen);
-
for (auto i = gens.rbegin(); i != gens.rend(); ++i) {
- if (max) {
+ if (i->number == curGen) {
+ fromCurGen = true;
max--;
continue;
}
- if (i->number != curGen)
+ if (fromCurGen) {
+ if (max) {
+ max--;
+ continue;
+ }
deleteGeneration2(profile, i->number, dryRun);
+ }
}
}