]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/policy.cc
Release 1.4~beta1
[apt.git] / apt-pkg / policy.cc
index 111e43cd63676e3f63415a6575aad8011fcd661a..3dd6ddac4798621e9194f86ca30fb771336284cb 100644 (file)
@@ -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<string> const List = GetListOfFilesInDir(Dir, "pref", true, true);
+   bool const PendingErrors = _error->PendingError();
+   _error->MergeWithStack();
+   if (PendingErrors)
+      return false;
 
    // Read the files
    for (vector<string>::const_iterator I = List.begin(); I != List.end(); ++I)