about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/libstore/profiles.cc17
-rw-r--r--src/libstore/profiles.hh2
-rw-r--r--src/nix-env/nix-env.cc8
3 files changed, 14 insertions, 13 deletions
diff --git a/src/libstore/profiles.cc b/src/libstore/profiles.cc
index e6300cf05552..44c3c6e0d478 100644
--- a/src/libstore/profiles.cc
+++ b/src/libstore/profiles.cc
@@ -157,15 +157,10 @@ void deleteGenerations(const Path & profile, const std::set<unsigned int> & gens
     }
 }
 
-void deleteGenerationsGreaterThan(const Path & profile, const string & max, bool dryRun)
+void deleteGenerationsGreaterThan(const Path & profile, int max, bool dryRun)
 {
     int max_keep = 0;
     PathLocks lock;
-    if(max.size() < 2)
-     throw Error(format("invalid number of generations ‘%1%’") % max);
-    string str_max = string(max, 1, max.size());
-    if (!string2Int(str_max, max_keep) || max_keep == 0)
-      throw Error(format("invalid number of generations to keep ‘%1%’") % max);
 
     lockProfile(lock, profile);
 
@@ -173,11 +168,11 @@ void deleteGenerationsGreaterThan(const Path & profile, const string & max, bool
     Generations gens = findGenerations(profile, curGen);
 
     for (auto i = gens.rbegin(); i != gens.rend(); ++i) {
-      if (max_keep) {
-	max_keep--;
-	continue;
-      }
-      deleteGeneration2(profile, i->number, dryRun);
+        if (max) {
+            max--;
+            continue;
+        }
+        deleteGeneration2(profile, i->number, dryRun);
     }
 }
 
diff --git a/src/libstore/profiles.hh b/src/libstore/profiles.hh
index 3cad08dc5265..5fa1533de311 100644
--- a/src/libstore/profiles.hh
+++ b/src/libstore/profiles.hh
@@ -39,7 +39,7 @@ void deleteGeneration(const Path & profile, unsigned int gen);
 
 void deleteGenerations(const Path & profile, const std::set<unsigned int> & gensToDelete, bool dryRun);
 
-void deleteGenerationsGreaterThan(const Path & profile, const string & max, bool dryRun);
+void deleteGenerationsGreaterThan(const Path & profile, const int max, bool dryRun);
 
 void deleteOldGenerations(const Path & profile, bool dryRun);
 
diff --git a/src/nix-env/nix-env.cc b/src/nix-env/nix-env.cc
index 1440b7744fd6..0da31588d23b 100644
--- a/src/nix-env/nix-env.cc
+++ b/src/nix-env/nix-env.cc
@@ -1285,7 +1285,13 @@ static void opDeleteGenerations(Globals & globals, Strings opFlags, Strings opAr
     } else if (opArgs.size() == 1 && opArgs.front().find('d') != string::npos) {
         deleteGenerationsOlderThan(globals.profile, opArgs.front(), globals.dryRun);
     } else if (opArgs.size() == 1 && opArgs.front().find('+') != string::npos) {
-        deleteGenerationsGreaterThan(globals.profile, opArgs.front(), globals.dryRun);
+        if(opArgs.front().size() < 2)
+            throw Error(format("invalid number of generations ‘%1%’") % opArgs.front());
+        string str_max = string(opArgs.front() 1, opArgs.front().size());
+        int max;
+        if (!string2Int(str_max, max) || max == 0)
+            throw Error(format("invalid number of generations to keep ‘%1%’") % opArgs.front());
+        deleteGenerationsGreaterThan(globals.profile, max, globals.dryRun);
     } else {
         std::set<unsigned int> gens;
         for (auto & i : opArgs) {