X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/71180b9889046e30b63d70882c2381d6e3e9763f..7d5234ab88b4cd6b172f13d0912c585983c3410b:/apt-pkg/policy.cc diff --git a/apt-pkg/policy.cc b/apt-pkg/policy.cc index 111e43cd6..3dd6ddac4 100644 --- a/apt-pkg/policy.cc +++ b/apt-pkg/policy.cc @@ -132,7 +132,6 @@ bool pkgPolicy::InitDefaults() best package is. */ pkgCache::VerIterator pkgPolicy::GetCandidateVer(pkgCache::PkgIterator const &Pkg) { - // TODO: Replace GetCandidateVer() pkgCache::VerIterator cand; pkgCache::VerIterator cur = Pkg.CurrentVer(); int candPriority = -1; @@ -181,14 +180,13 @@ void pkgPolicy::CreatePin(pkgVersionMatch::MatchType Type,string Name, Name.erase(found); } - // Allow pinning by wildcards - // TODO: Maybe we should always prefer specific pins over non- - // specific ones. - if (Name[0] == '/' || Name.find_first_of("*[?") != string::npos) + // Allow pinning by wildcards - beware of package names looking like wildcards! + // TODO: Maybe we should always prefer specific pins over non-specific ones. + if ((Name[0] == '/' && Name[Name.length() - 1] == '/') || Name.find_first_of("*[?") != string::npos) { pkgVersionMatch match(Data, Type); for (pkgCache::GrpIterator G = Cache->GrpBegin(); G.end() != true; ++G) - if (match.ExpressionMatches(Name, G.Name())) + if (Name != G.Name() && match.ExpressionMatches(Name, G.Name())) { if (Arch.empty() == false) CreatePin(Type, string(G.Name()).append(":").append(Arch), Data, Priority); @@ -308,16 +306,21 @@ APT_PURE signed short pkgPolicy::GetPriority(pkgCache::PkgFileIterator const &Fi bool ReadPinDir(pkgPolicy &Plcy,string Dir) { if (Dir.empty() == true) - Dir = _config->FindDir("Dir::Etc::PreferencesParts"); + Dir = _config->FindDir("Dir::Etc::PreferencesParts", "/dev/null"); if (DirectoryExists(Dir) == false) { - if (Dir != "/dev/null") + if (APT::String::Endswith(Dir, "/dev/null") == false) _error->WarningE("DirectoryExists",_("Unable to read %s"),Dir.c_str()); return true; } + _error->PushToStack(); vector const List = GetListOfFilesInDir(Dir, "pref", true, true); + bool const PendingErrors = _error->PendingError(); + _error->MergeWithStack(); + if (PendingErrors) + return false; // Read the files for (vector::const_iterator I = List.begin(); I != List.end(); ++I)