From b093a199056673b55e6467ab9e22e8af15183c43 Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Sat, 28 Aug 2010 22:26:32 +0200 Subject: * apt-pkg/contrib/configuration.cc: - fix autoremove by using correct config-option name and don't make faulty assumptions in error handling (Closes: #594689) --- apt-pkg/contrib/configuration.cc | 14 +++++++++++--- apt-pkg/contrib/configuration.h | 1 + apt-pkg/depcache.h | 2 +- debian/changelog | 5 ++++- test/integration/test-autoremove | 31 +++++++++++++++++++++++++++++++ 5 files changed, 48 insertions(+), 5 deletions(-) create mode 100755 test/integration/test-autoremove diff --git a/apt-pkg/contrib/configuration.cc b/apt-pkg/contrib/configuration.cc index 81cc87d15..cc7093fe2 100644 --- a/apt-pkg/contrib/configuration.cc +++ b/apt-pkg/contrib/configuration.cc @@ -857,19 +857,27 @@ Configuration::MatchAgainstConfig::MatchAgainstConfig(char const * Config) { regfree(p); delete p; + clearPatterns(); _error->Warning("Regex compilation error for '%s' in configuration option '%s'", s->c_str(), Config); + return; } - } - + } + if (strings.size() == 0) + patterns.push_back(NULL); } /*}}}*/ // MatchAgainstConfig Destructor /*{{{*/ Configuration::MatchAgainstConfig::~MatchAgainstConfig() +{ + clearPatterns(); +} +void Configuration::MatchAgainstConfig::clearPatterns() { for(std::vector::const_iterator p = patterns.begin(); p != patterns.end(); ++p) { + if (*p == NULL) continue; regfree(*p); delete *p; } @@ -880,7 +888,7 @@ bool Configuration::MatchAgainstConfig::Match(char const * str) const { for(std::vector::const_iterator p = patterns.begin(); p != patterns.end(); ++p) - if (regexec(*p, str, 0, 0, 0) == 0) + if (*p != NULL && regexec(*p, str, 0, 0, 0) == 0) return true; return false; diff --git a/apt-pkg/contrib/configuration.h b/apt-pkg/contrib/configuration.h index cbe18e4e5..175c1bef3 100644 --- a/apt-pkg/contrib/configuration.h +++ b/apt-pkg/contrib/configuration.h @@ -109,6 +109,7 @@ class Configuration class MatchAgainstConfig { std::vector patterns; + void clearPatterns(); public: MatchAgainstConfig(char const * Config); diff --git a/apt-pkg/depcache.h b/apt-pkg/depcache.h index 45276dc95..08e683558 100644 --- a/apt-pkg/depcache.h +++ b/apt-pkg/depcache.h @@ -186,7 +186,7 @@ class pkgDepCache : protected pkgCache::Namespace class DefaultRootSetFunc : public InRootSetFunc, public Configuration::MatchAgainstConfig { public: - DefaultRootSetFunc() : Configuration::MatchAgainstConfig("APT::NeverRemove") {}; + DefaultRootSetFunc() : Configuration::MatchAgainstConfig("APT::NeverAutoRemove") {}; virtual ~DefaultRootSetFunc() {}; bool InRootSet(const pkgCache::PkgIterator &pkg) { return pkg.end() == true && Match(pkg.Name()); }; diff --git a/debian/changelog b/debian/changelog index 4ec71cbb6..072c00398 100644 --- a/debian/changelog +++ b/debian/changelog @@ -26,8 +26,11 @@ apt (0.8.1) UNRELEASED; urgency=low pass this purge forward to the non-pseudo package for pseudos * apt-pkg/contrib/fileutl.cc: - apply SilentlyIgnore also on files without an extension + * apt-pkg/contrib/configuration.cc: + - fix autoremove by using correct config-option name and + don't make faulty assumptions in error handling (Closes: #594689) - -- David Kalnischkies Sat, 28 Aug 2010 17:53:00 +0200 + -- David Kalnischkies Sat, 28 Aug 2010 22:23:20 +0200 apt (0.8.0) unstable; urgency=low diff --git a/test/integration/test-autoremove b/test/integration/test-autoremove new file mode 100755 index 000000000..fb39e979a --- /dev/null +++ b/test/integration/test-autoremove @@ -0,0 +1,31 @@ +#!/bin/sh +set -e + +local TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework +setupenvironment +configarchitecture "i386" + +buildsimplenativepackage "unrelated" "all" "1" "unstable" +buildsimplenativepackage "po-debconf" "all" "1.0.16" "unstable" +buildsimplenativepackage "debhelper" "all" "8.0.0" "unstable" "Depends: po-debconf" +setupaptarchive + +aptget install unrelated debhelper -qq 2>&1 > /dev/null + +testfileequal "rootdir/var/lib/apt/extended_states" "Package: po-debconf +Architecture: i386 +Auto-Installed: 1 +" +aptget remove debhelper -y -qq 2>&1 > /dev/null +aptget autoremove -y -qq 2>&1 > /dev/null + +testfileequal "rootdir/var/lib/apt/extended_states" "" + +sed -i rootdir/var/log/apt/history.log -e '/^Commandline: / d' -e '/^Start-Date: / d' -e '/^End-Date: / d' +testfileequal "rootdir/var/log/apt/history.log" ' +Install: unrelated:i386 (1), debhelper:i386 (8.0.0), po-debconf:i386 (1.0.16, automatic) + +Remove: debhelper:i386 (8.0.0) + +Remove: po-debconf:i386 (1.0.16)' -- cgit v1.2.3