Browse Source

add hidden config to set packages as Essential/Important

You can pretty much achieve the same with a local dummy package if you
want to, but libapt has an inbuilt setting for essential: "apt" which
can be overridden with this option as well – it could be helpful in
quick tests and what not so adding this alternative shouldn't really
hurt much.

We aren't going to document them much through as care must be taken in
regards to the binary caches as they aren't invalidated by config
options alone, so the effects of old settings could still be in them,
similar to the other already existing pkgCacheGen option(s).

Closes: 767891
Thanks: Anthony Towns for initial patch
tags/debian/1.4_beta1
David Kalnischkies 4 years ago
parent
commit
a9b724eedd
4 changed files with 122 additions and 5 deletions
  1. +14
    -2
      apt-pkg/deb/deblistparser.cc
  2. +2
    -2
      apt-pkg/deb/deblistparser.h
  3. +6
    -1
      doc/examples/configure-index
  4. +100
    -0
      test/integration/test-bug-767891-force-essential-important

+ 14
- 2
apt-pkg/deb/deblistparser.cc View File

@@ -50,8 +50,18 @@ static const debListParser::WordList PrioList[] = {
in Step(), if no Architecture is given we will accept every arch
we would accept in general with checkArchitecture() */
debListParser::debListParser(FileFd *File) :
pkgCacheListParser(), d(NULL), Tags(File)
pkgCacheListParser(), Tags(File)
{
// this dance allows an empty value to override the default
if (_config->Exists("pkgCacheGen::ForceEssential"))
{
forceEssential = _config->FindVector("pkgCacheGen::ForceEssential");
if (forceEssential.empty() == false && _config->Find("pkgCacheGen::ForceEssential").empty())
forceEssential.emplace_back("apt");
}
else
forceEssential.emplace_back("apt");
forceImportant = _config->FindVector("pkgCacheGen::ForceImportant");
}
/*}}}*/
// ListParser::Package - Return the package name /*{{{*/
@@ -311,7 +321,7 @@ bool debListParser::UsePackage(pkgCache::PkgIterator &Pkg,
if (Section.FindFlag("Important",Pkg->Flags,pkgCache::Flag::Important) == false)
return false;

if (strcmp(Pkg.Name(),"apt") == 0)
if (std::find(forceEssential.begin(), forceEssential.end(), Pkg.Name()) != forceEssential.end())
{
if ((essential == "native" && Pkg->Arch != 0 && myArch == Pkg.Arch()) ||
essential == "all")
@@ -319,6 +329,8 @@ bool debListParser::UsePackage(pkgCache::PkgIterator &Pkg,
else
Pkg->Flags |= pkgCache::Flag::Important;
}
else if (std::find(forceImportant.begin(), forceImportant.end(), Pkg.Name()) != forceImportant.end())
Pkg->Flags |= pkgCache::Flag::Important;

if (ParseStatus(Pkg,Ver) == false)
return false;


+ 2
- 2
apt-pkg/deb/deblistparser.h View File

@@ -43,8 +43,8 @@ class APT_HIDDEN debListParser : public pkgCacheListParser
#endif

private:
/** \brief dpointer placeholder (for later in case we need it) */
void * const d;
std::vector<std::string> forceEssential;
std::vector<std::string> forceImportant;

protected:
pkgTagFile Tags;


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

@@ -461,7 +461,12 @@ Debug
RunScripts "false"; // debug invocation of external scripts
}

pkgCacheGen::Essential "native"; // other modes: all, none, installed
pkgCacheGen
{
Essential "native"; // other modes: all, none, installed
ForceEssential { "apt"; };
ForceImportant "";
}

/* Whatever you do, do not use this configuration file!! Take out ONLY
the portions you need! */


+ 100
- 0
test/integration/test-bug-767891-force-essential-important View File

@@ -0,0 +1,100 @@
#!/bin/sh
set -e

TESTDIR="$(readlink -f "$(dirname "$0")")"
. "$TESTDIR/framework"
setupenvironment
configarchitecture 'amd64' 'i386'

insertinstalledpackage 'apt' 'amd64' '1'
insertinstalledpackage 'foo' 'amd64,i386' '1' 'Multi-Arch: same'
insertinstalledpackage 'bar' 'amd64' '1' 'Provides: foo'

insertpackage 'unstable' 'foo2' 'amd64,i386' '1' 'Multi-Arch: same'

setupaptarchive

rm -f rootdir/var/cache/apt/*.bin
testsuccessequal 'Reading package lists...
Building dependency tree...
The following packages will be REMOVED:
apt* bar* foo* foo:i386*
WARNING: The following essential packages will be removed.
This should NOT be done unless you know exactly what you are doing!
apt
0 upgraded, 0 newly installed, 4 to remove and 0 not upgraded.
Purg apt [1]
Purg bar [1]
Purg foo [1]
Purg foo:i386 [1]' apt purge apt foo foo:i386 bar -s

rm -f rootdir/var/cache/apt/*.bin
testsuccessequal 'Reading package lists...
Building dependency tree...
The following packages will be REMOVED:
apt* bar* foo* foo:i386*
0 upgraded, 0 newly installed, 4 to remove and 0 not upgraded.
Purg apt [1]
Purg bar [1]
Purg foo [1]
Purg foo:i386 [1]' apt purge apt foo foo:i386 bar -s -o pkgCacheGen::ForceEssential=''

msgmsg 'foo:i386 got the Important flag'
rm -f rootdir/var/cache/apt/*.bin
testsuccessequal 'Reading package lists...
Building dependency tree...
The following packages will be REMOVED:
apt* bar* foo* foo:i386*
WARNING: The following essential packages will be removed.
This should NOT be done unless you know exactly what you are doing!
foo foo:i386
0 upgraded, 0 newly installed, 4 to remove and 0 not upgraded.
Purg apt [1]
Purg bar [1]
Purg foo [1]
Purg foo:i386 [1]' apt purge apt foo foo:i386 bar -s -o pkgCacheGen::ForceEssential='foo'

rm -f rootdir/var/cache/apt/*.bin
testsuccessequal 'Reading package lists...
Building dependency tree...
The following packages will be REMOVED:
apt* bar* foo* foo:i386*
WARNING: The following essential packages will be removed.
This should NOT be done unless you know exactly what you are doing!
apt foo foo:i386
0 upgraded, 0 newly installed, 4 to remove and 0 not upgraded.
Purg apt [1]
Purg bar [1]
Purg foo [1]
Purg foo:i386 [1]' apt purge apt foo foo:i386 bar -s -o pkgCacheGen::ForceEssential::='foo'

msgmsg 'essentials only from native'
rm -f rootdir/var/cache/apt/*.bin
testsuccessequal 'Reading package lists...
Building dependency tree...
Calculating upgrade...
The following NEW packages will be installed:
foo2
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Inst foo2 (1 unstable [amd64])
Conf foo2 (1 unstable [amd64])' apt full-upgrade -s -o pkgCacheGen::ForceEssential::='foo2'

msgmsg 'important only effects installed'
rm -f rootdir/var/cache/apt/*.bin
testsuccessequal 'Reading package lists...
Building dependency tree...
The following packages will be REMOVED:
apt* bar* foo* foo:i386*
WARNING: The following essential packages will be removed.
This should NOT be done unless you know exactly what you are doing!
apt foo foo:i386
0 upgraded, 0 newly installed, 4 to remove and 0 not upgraded.
Purg apt [1]
Purg bar [1]
Purg foo [1]
Purg foo:i386 [1]' apt purge apt foo foo:i386 bar -s -o pkgCacheGen::ForceImportant::='foo'
rm -f rootdir/var/cache/apt/*.bin
testsuccessequal 'Reading package lists...
Building dependency tree...
Calculating upgrade...
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.' apt full-upgrade -s -o pkgCacheGen::ForceImportant::='foo2'

Loading…
Cancel
Save