summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Kalnischkies <david@kalnischkies.de>2023-01-29 16:54:39 +0100
committerDavid Kalnischkies <david@kalnischkies.de>2023-01-30 00:55:05 +0100
commit8aeb07448c09375c730c76a6baf31303b129bb96 (patch)
tree45e6007657f9a1ba3b0d80c7e9c4a74da2f31aa4
parent0dd4e0b4caeeb3e943a993db79c416d491c469cd (diff)
Have values in Section config trees refer to them in all components
Hard coding each and every component is not only boring but given that everyone is free to add or use more we end up in situations in which apt behaves differently for the same binary package just because metadata said it is in different components (e.g. non-free vs. non-free-firmware). It is also probably not what the casual user would expect. So we instead treat a value without a component as if it applies for all of them. The previous behaviour can be restored by prefixing the value with "<undefined>/" as in the component is not defined. In an ideal world we would probably use "*/foo" for the new default instead of changing the behaviour for "foo", but it seems rather unlikely that the old behaviour is actually desired. All existing values were duplicated for all (previously) known components in Debian and Ubuntu.
-rw-r--r--apt-pkg/depcache.cc38
-rw-r--r--cmdline/apt-mark.cc33
-rw-r--r--debian/apt.conf.autoremove12
-rwxr-xr-xtest/integration/test-apt-move-and-forget-manual-sections45
-rwxr-xr-xtest/integration/test-apt-never-markauto-sections3
5 files changed, 95 insertions, 36 deletions
diff --git a/apt-pkg/depcache.cc b/apt-pkg/depcache.cc
index bc5843153..b19d180a4 100644
--- a/apt-pkg/depcache.cc
+++ b/apt-pkg/depcache.cc
@@ -67,24 +67,38 @@ class DefaultRootSetFunc2 : public pkgDepCache::DefaultRootSetFunc
/*}}}*/
// helper for Install-Recommends-Sections and Never-MarkAuto-Sections /*{{{*/
-static bool
-ConfigValueInSubTree(const char* SubTree, const char *needle)
+// FIXME: Has verbatim copy in cmdline/apt-mark.cc
+static bool ConfigValueInSubTree(const char* SubTree, std::string_view const needle)
{
- Configuration::Item const *Opts;
- Opts = _config->Tree(SubTree);
- if (Opts != 0 && Opts->Child != 0)
+ if (needle.empty())
+ return false;
+ Configuration::Item const *Opts = _config->Tree(SubTree);
+ if (Opts != nullptr && Opts->Child != nullptr)
{
Opts = Opts->Child;
- for (; Opts != 0; Opts = Opts->Next)
+ for (; Opts != nullptr; Opts = Opts->Next)
{
- if (Opts->Value.empty() == true)
+ if (Opts->Value.empty())
continue;
- if (strcmp(needle, Opts->Value.c_str()) == 0)
+ if (needle == Opts->Value)
return true;
}
}
return false;
}
+static bool SectionInSubTree(char const * const SubTree, std::string_view Needle)
+{
+ if (ConfigValueInSubTree(SubTree, Needle))
+ return true;
+ auto const sub = Needle.find('/');
+ if (sub == std::string_view::npos)
+ {
+ std::string special{"<undefined>/"};
+ special.append(Needle);
+ return ConfigValueInSubTree(SubTree, special);
+ }
+ return ConfigValueInSubTree(SubTree, Needle.substr(sub + 1));
+}
/*}}}*/
pkgDepCache::ActionGroup::ActionGroup(pkgDepCache &cache) : /*{{{*/
d(NULL), cache(cache), released(false)
@@ -1050,7 +1064,7 @@ bool pkgDepCache::MarkDelete(PkgIterator const &Pkg, bool rPurge,
// We do not check for or-groups here as we don't know which package takes care of
// providing the feature the user likes e.g.: browser1 | browser2 | browser3
// Temporary removals are effected by this as well, which is bad, but unlikely in practice
- bool const PinNeverMarkAutoSection = (PV->Section != 0 && ConfigValueInSubTree("APT::Never-MarkAuto-Sections", PV.Section()));
+ bool const PinNeverMarkAutoSection = (PV->Section != 0 && SectionInSubTree("APT::Never-MarkAuto-Sections", PV.Section()));
if (PinNeverMarkAutoSection)
{
for (DepIterator D = PV.DependsList(); D.end() != true; ++D)
@@ -1761,8 +1775,8 @@ bool pkgDepCache::MarkInstall(PkgIterator const &Pkg, bool AutoInst,
VerIterator const CurVer = Pkg.CurrentVer();
if (not CurVer.end() && CurVer->Section != 0 && strcmp(CurVer.Section(), PV.Section()) != 0)
{
- bool const CurVerInMoveSection = ConfigValueInSubTree("APT::Move-Autobit-Sections", CurVer.Section());
- bool const InstVerInMoveSection = ConfigValueInSubTree("APT::Move-Autobit-Sections", PV.Section());
+ bool const CurVerInMoveSection = SectionInSubTree("APT::Move-Autobit-Sections", CurVer.Section());
+ bool const InstVerInMoveSection = SectionInSubTree("APT::Move-Autobit-Sections", PV.Section());
return (not CurVerInMoveSection && InstVerInMoveSection);
}
return false;
@@ -2254,7 +2268,7 @@ bool pkgDepCache::Policy::IsImportantDep(DepIterator const &Dep) const
// FIXME: this is a meant as a temporary solution until the
// recommends are cleaned up
const char *sec = Dep.ParentVer().Section();
- if (sec && ConfigValueInSubTree("APT::Install-Recommends-Sections", sec))
+ if (sec && SectionInSubTree("APT::Install-Recommends-Sections", sec))
return true;
}
else if(Dep->Type == pkgCache::Dep::Suggests)
diff --git a/cmdline/apt-mark.cc b/cmdline/apt-mark.cc
index 5eaed2c71..46d3ca5b8 100644
--- a/cmdline/apt-mark.cc
+++ b/cmdline/apt-mark.cc
@@ -140,25 +140,38 @@ static bool DoMarkAuto(CommandLine &CmdL)
}
/*}}}*/
// helper for Install-Recommends-Sections and Never-MarkAuto-Sections /*{{{*/
-static bool
-ConfigValueInSubTree(const char *SubTree, const char *needle)
+// FIXME: Copied verbatim from apt-pkg/depcache.cc
+static bool ConfigValueInSubTree(const char* SubTree, std::string_view const needle)
{
- // copied from depcache.cc
- Configuration::Item const *Opts;
- Opts = _config->Tree(SubTree);
- if (Opts != 0 && Opts->Child != 0)
+ if (needle.empty())
+ return false;
+ Configuration::Item const *Opts = _config->Tree(SubTree);
+ if (Opts != nullptr && Opts->Child != nullptr)
{
Opts = Opts->Child;
- for (; Opts != 0; Opts = Opts->Next)
+ for (; Opts != nullptr; Opts = Opts->Next)
{
- if (Opts->Value.empty() == true)
+ if (Opts->Value.empty())
continue;
- if (strcmp(needle, Opts->Value.c_str()) == 0)
+ if (needle == Opts->Value)
return true;
}
}
return false;
}
+static bool SectionInSubTree(char const * const SubTree, std::string_view Needle)
+{
+ if (ConfigValueInSubTree(SubTree, Needle))
+ return true;
+ auto const sub = Needle.find('/');
+ if (sub == std::string_view::npos)
+ {
+ std::string special{"<undefined>/"};
+ special.append(Needle);
+ return ConfigValueInSubTree(SubTree, special);
+ }
+ return ConfigValueInSubTree(SubTree, Needle.substr(sub + 1));
+}
/*}}}*/
/* DoMinimize - minimize manually installed {{{*/
/* Traverses dependencies of meta packages and marks them as manually
@@ -179,7 +192,7 @@ static bool DoMinimize(CommandLine &CmdL)
auto ver = pkg.CurrentVer();
return ver.end() == false && ((*DepCache)[pkg].Flags & pkgCache::Flag::Auto) == 0 &&
ver->Section != 0 &&
- ConfigValueInSubTree("APT::Never-MarkAuto-Sections", ver.Section());
+ SectionInSubTree("APT::Never-MarkAuto-Sections", ver.Section());
};
APT::PackageSet roots;
diff --git a/debian/apt.conf.autoremove b/debian/apt.conf.autoremove
index 90ee8908b..10438e848 100644
--- a/debian/apt.conf.autoremove
+++ b/debian/apt.conf.autoremove
@@ -22,23 +22,11 @@ APT
Never-MarkAuto-Sections
{
"metapackages";
- "contrib/metapackages";
- "non-free/metapackages";
- "restricted/metapackages";
- "universe/metapackages";
- "multiverse/metapackages";
"tasks";
- "contrib/tasks";
- "non-free/tasks";
};
Move-Autobit-Sections
{
"oldlibs";
- "contrib/oldlibs";
- "non-free/oldlibs";
- "restricted/oldlibs";
- "universe/oldlibs";
- "multiverse/oldlibs";
};
};
diff --git a/test/integration/test-apt-move-and-forget-manual-sections b/test/integration/test-apt-move-and-forget-manual-sections
index 4617abab3..ab90be0c0 100755
--- a/test/integration/test-apt-move-and-forget-manual-sections
+++ b/test/integration/test-apt-move-and-forget-manual-sections
@@ -11,15 +11,18 @@ testsuccess grep '^oldlibs$' move-autobit.sections
buildsimplenativepackage 'libabc' 'native' '1' 'stable' '' '' 'libs'
buildsimplenativepackage 'libabc' 'native' '2' 'unstable' 'Depends: libdef' '' 'oldlibs'
+buildsimplenativepackage 'libzoo' 'native' '1' 'stable' '' '' 'libs'
+buildsimplenativepackage 'libzoo' 'native' '2' 'unstable' 'Depends: libdef' '' 'non-free/oldlibs'
buildsimplenativepackage 'libdef' 'native' '1' 'unstable' '' '' 'libs'
setupaptarchive
testmarkedauto
testmarkedmanual
+msgmsg 'Move bit on install of replacement'
testsuccess aptget install libabc/stable -y
testdpkginstalled 'libabc'
-testdpkgnotinstalled 'libdef'
+testdpkgnotinstalled 'libdef' 'libzoo'
testmarkedmanual 'libabc'
testmarkedauto
@@ -29,3 +32,43 @@ testdpkginstalled 'libabc' 'libdef'
testmarkedauto 'libabc'
testmarkedmanual 'libdef'
+
+testsuccess apt autopurge -y
+testdpkgnotinstalled 'libabc' 'libzoo'
+
+msgmsg 'Do not move bit if replacement is already installed'
+testsuccess aptget install libzoo/stable -y
+testdpkginstalled 'libzoo'
+
+testmarkedmanual 'libzoo' 'libdef'
+testmarkedauto
+
+testsuccess aptmark auto libdef
+testmarkedauto 'libdef'
+
+testsuccess aptget dist-upgrade -y
+testdpkginstalled 'libzoo' 'libdef'
+
+testmarkedmanual 'libzoo'
+testmarkedauto 'libdef'
+
+testsuccess apt autopurge -y libzoo-
+testdpkgnotinstalled 'libabc' 'libzoo' 'libdef'
+
+msgmsg 'Move bit on install of replacement (subsection)'
+testfailure grep '^non-free/oldlibs$' move-autobit.sections
+testsuccess aptget install libzoo/stable -y
+testdpkginstalled 'libzoo'
+testdpkgnotinstalled 'libdef' 'libabc'
+
+testmarkedmanual 'libzoo'
+testmarkedauto
+
+testsuccess aptget dist-upgrade -y
+testdpkginstalled 'libzoo' 'libdef'
+
+testmarkedauto 'libzoo'
+testmarkedmanual 'libdef'
+
+testsuccess apt autopurge -y
+testdpkgnotinstalled 'libabc' 'libzoo'
diff --git a/test/integration/test-apt-never-markauto-sections b/test/integration/test-apt-never-markauto-sections
index a77d6b22b..b47966e75 100755
--- a/test/integration/test-apt-never-markauto-sections
+++ b/test/integration/test-apt-never-markauto-sections
@@ -8,12 +8,13 @@ configarchitecture 'amd64' 'i386'
aptconfig dump --no-empty --format '%v%n' APT::Never-MarkAuto-Sections > nevermarkauto.sections
testsuccess grep '^metapackages$' nevermarkauto.sections
+testfailure grep '^universe/metapackages$' nevermarkauto.sections
buildsimplenativepackage 'mydesktop' 'all' '1' 'unstable' 'Depends: mydesktop-core, foreignpkg
Recommends: notavailable' '' 'metapackages'
buildsimplenativepackage 'mydesktop-core' 'amd64' '1' 'unstable' 'Depends: bad-texteditor | texteditor, browser (>= 42), nosection, foreignpkg
Recommends: notavailable
-Multi-Arch: foreign' '' 'metapackages'
+Multi-Arch: foreign' '' 'universe/metapackages'
buildsimplenativepackage 'browser' 'amd64' '41' 'stable'
buildsimplenativepackage 'browser' 'amd64' '42' 'unstable'
buildsimplenativepackage 'texteditor' 'amd64' '1' 'stable'