Browse Source

* added APT::NeverAutoRemove (a list of regexp for package names that should never be automatically removed)

tags/debian/0.7.21
Michael Vogt 16 years ago
parent
commit
22dcc318d9
2 changed files with 52 additions and 2 deletions
  1. +48
    -1
      apt-pkg/algorithms.cc
  2. +4
    -1
      doc/examples/configure-index

+ 48
- 1
apt-pkg/algorithms.cc View File

@@ -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;
}

+ 4
- 1
doc/examples/configure-index View File

@@ -24,7 +24,10 @@ APT
{
Architecture "i386";
Build-Essential "build-essential";

NeverAutoRemove { "linux-kernel.*"; }; // packages that should never
// considered for autoRemove

// Options for apt-get
Get
{


Loading…
Cancel
Save