summaryrefslogtreecommitdiff
path: root/apt-pkg/algorithms.cc
diff options
context:
space:
mode:
authorMichael Vogt <michael.vogt@ubuntu.com>2005-06-30 08:53:45 +0000
committerMichael Vogt <michael.vogt@ubuntu.com>2005-06-30 08:53:45 +0000
commit22dcc318d978813b3c4d1ae1a1f41933d0e1d69b (patch)
treecc54b55a72e34f82f551d7e790fd4ce32c654fe2 /apt-pkg/algorithms.cc
parent2ac6ce927cda2847baf8e71a74e595e6b82c6d98 (diff)
* added APT::NeverAutoRemove (a list of regexp for package names that should never be automatically removed)
Diffstat (limited to 'apt-pkg/algorithms.cc')
-rw-r--r--apt-pkg/algorithms.cc49
1 files changed, 48 insertions, 1 deletions
diff --git a/apt-pkg/algorithms.cc b/apt-pkg/algorithms.cc
index 11f5b5671..8e55649ca 100644
--- a/apt-pkg/algorithms.cc
+++ b/apt-pkg/algorithms.cc
@@ -26,7 +26,8 @@
#include <apti18n.h>
-
+#include <sys/types.h>
+#include <regex.h>
#include <iostream>
/*}}}*/
using namespace std;
@@ -1329,6 +1330,19 @@ void pkgMarkPackage(pkgDepCache &Cache,
}
+// Helper for APT::NeverAutoRemove, always include the packages matching
+// this regexp into the root-set
+inline bool
+pkgMarkAlwaysInclude(pkgCache::PkgIterator p, vector<regex_t*> alwaysMark)
+{
+ for(unsigned int i=0;i<alwaysMark.size();i++)
+ if (regexec(alwaysMark[i],p.Name(),0,0,0) == 0)
+ return true;
+
+ return false;
+}
+
+// the main mark algorithm
bool pkgMarkUsed(pkgDepCache &Cache, InRootSetFunc func)
{
bool follow_recommends;
@@ -1346,10 +1360,37 @@ bool pkgMarkUsed(pkgDepCache &Cache, InRootSetFunc func)
follow_suggests=_config->FindB("APT::AutoRemove::SuggestsImportant", false);
+ // init the "NeverAutoRemove" variable
+ vector<regex_t *> neverAutoRemoveRegexp;
+ Configuration::Item const *Opts;
+ Opts = _config->Tree("APT::NeverAutoRemove");
+ if (Opts != 0 && Opts->Child != 0)
+ {
+ Opts = Opts->Child;
+ for (; Opts != 0; Opts = Opts->Next)
+ {
+ if (Opts->Value.empty() == true)
+ continue;
+
+ regex_t *p = new regex_t;
+ if(regcomp(p,Opts->Value.c_str(),
+ REG_EXTENDED | REG_ICASE | REG_NOSUB) != 0)
+ {
+ regfree(p);
+ for(unsigned int i=0;i<neverAutoRemoveRegexp.size();i++)
+ regfree(neverAutoRemoveRegexp[i]);
+ return _error->Error("Regex compilation error for APT::NeverAutoRemove");
+ }
+ neverAutoRemoveRegexp.push_back(p);
+ }
+ }
+
+
// do the mark part
for(pkgCache::PkgIterator p=Cache.PkgBegin(); !p.end(); ++p)
{
if( (func != NULL ? (*func)(p) : false) ||
+ pkgMarkAlwaysInclude(p, neverAutoRemoveRegexp) ||
!(Cache[p].Flags & pkgCache::Flag::Auto) ||
(p->Flags & pkgCache::Flag::Essential))
@@ -1434,5 +1475,11 @@ bool pkgMarkUsed(pkgDepCache &Cache, InRootSetFunc func)
#endif
}
}
+
+ // cleanup
+ for(unsigned int i=0;i<neverAutoRemoveRegexp.size();i++)
+ regfree(neverAutoRemoveRegexp[i]);
+
+
return true;
}