---
 src/defaults.cc                              |    4 ++++
 src/generic/apt/matching/compare_patterns.cc |    3 +++
 src/generic/apt/matching/match.cc            |   17 +++++++++++++++++
 src/generic/apt/matching/parse.cc            |   10 +++++++++-
 src/generic/apt/matching/pattern.cc          |    1 +
 src/generic/apt/matching/pattern.h           |   18 ++++++++++++++++++
 src/generic/apt/matching/serialize.cc        |    4 ++++
 src/pkg_item.cc                              |    5 ++++-
 8 files changed, 60 insertions(+), 2 deletions(-)

diff --git a/src/defaults.cc b/src/defaults.cc
index 73d91dd..0df5ada 100644
--- a/src/defaults.cc
+++ b/src/defaults.cc
@@ -92,6 +92,7 @@ static void init_styles()
   cw::set_style("PkgToHold", cw::style_fg(COLOR_WHITE) + 
cw::style_attrs_on(A_REVERSE));
   cw::set_style("PkgToRemove", cw::style_fg(COLOR_MAGENTA) + 
cw::style_attrs_on(A_REVERSE));
   cw::set_style("PkgBroken", cw::style_fg(COLOR_RED) + 
cw::style_attrs_on(A_REVERSE));
+  cw::set_style("PkgForbidden", cw::style_fg(COLOR_BLUE) + 
cw::style_attrs_on(A_REVERSE));
   cw::set_style("PkgToInstall", cw::style_fg(COLOR_GREEN) + 
cw::style_attrs_on(A_REVERSE));
   cw::set_style("PkgToUpgrade", cw::style_fg(COLOR_CYAN) + 
cw::style_attrs_on(A_REVERSE));
   cw::set_style("PkgToDowngrade", cw::style_attrs_on(A_BOLD));
@@ -107,6 +108,9 @@ static void init_styles()
            cw::style_fg(COLOR_MAGENTA));
   cw::set_style("PkgBrokenHighlighted",
            cw::style_fg(COLOR_RED));
+  cw::set_style("PkgForbiddenHighlighted",
+           cw::style_fg(COLOR_MAGENTA) + cw::style_attrs_on(A_DIM) +
+           cw::style_attrs_flip(A_REVERSE));
   cw::set_style("PkgToInstallHighlighted",
            cw::style_fg(COLOR_GREEN));
   cw::set_style("PkgToUpgradeHighlighted",
diff --git a/src/generic/apt/matching/compare_patterns.cc 
b/src/generic/apt/matching/compare_patterns.cc
index f8414ae..33ba16a 100644
--- a/src/generic/apt/matching/compare_patterns.cc
+++ b/src/generic/apt/matching/compare_patterns.cc
@@ -183,6 +183,9 @@ namespace aptitude
                                      p2->get_for_pattern());
            }
 
+         case pattern::forbidden_version:
+           return 0;
+
          case pattern::foreign_architecture:
            return 0;
 
diff --git a/src/generic/apt/matching/match.cc 
b/src/generic/apt/matching/match.cc
index 2054529..a27d181 100644
--- a/src/generic/apt/matching/match.cc
+++ b/src/generic/apt/matching/match.cc
@@ -1165,6 +1165,18 @@ namespace aptitude
            return NULL;
            break;
 
+         case pattern::forbidden_version:
+           {
+             pkgCache::PkgIterator pkg(target.get_package_iterator(cache));
+             aptitudeDepCache::aptitude_state &estate = 
cache.get_ext_state(pkg);
+             if(target.get_has_version() &&
+                target.get_version_iterator(cache).VerStr() == 
estate.forbidver)
+               return match::make_atomic(p);
+             else
+               return NULL;
+           }
+           break;
+
          case pattern::foreign_architecture:
            if(!target.get_has_version())
              return NULL;
@@ -2106,6 +2118,7 @@ namespace aptitude
          case pattern::equal:
          case pattern::exact_name:
          case pattern::false_tp:
+         case pattern::forbidden_version:
          case pattern::foreign_architecture:
          case pattern::garbage:
          case pattern::install_version:
@@ -2319,6 +2332,7 @@ namespace aptitude
          case pattern::essential:
          case pattern::equal:
          case pattern::false_tp:
+         case pattern::forbidden_version:
          case pattern::foreign_architecture:
          case pattern::garbage:
          case pattern::install_version:
@@ -2445,6 +2459,7 @@ namespace aptitude
          case pattern::essential:
          case pattern::equal:
          case pattern::false_tp:
+         case pattern::forbidden_version:
          case pattern::foreign_architecture:
          case pattern::garbage:
          case pattern::install_version:
@@ -2645,6 +2660,7 @@ namespace aptitude
          case pattern::equal:
          case pattern::exact_name:
          case pattern::false_tp:
+         case pattern::forbidden_version:
          case pattern::foreign_architecture:
          case pattern::garbage:
          case pattern::install_version:
@@ -2936,6 +2952,7 @@ namespace aptitude
          case pattern::essential:
          case pattern::equal:
          case pattern::false_tp:
+         case pattern::forbidden_version:
          case pattern::foreign_architecture:
          case pattern::garbage:
          case pattern::install_version:
diff --git a/src/generic/apt/matching/parse.cc 
b/src/generic/apt/matching/parse.cc
index f114cd8..fc697cc 100644
--- a/src/generic/apt/matching/parse.cc
+++ b/src/generic/apt/matching/parse.cc
@@ -118,6 +118,7 @@ namespace
       term_type_exact_name,
       term_type_false,
       term_type_for,
+      term_type_forbidden,
       term_type_garbage,
       term_type_installed,
       term_type_maintainer,
@@ -174,6 +175,7 @@ namespace
     { "false", term_type_false },
     // ForTranslators: As in the sentence "for x = 5, do BLAH".
     { "for", term_type_for },
+    { "forbidden", term_type_forbidden },
     { "garbage", term_type_garbage },
     { "installed", term_type_installed },
     { "maintainer", term_type_maintainer },
@@ -760,7 +762,7 @@ ref_ptr<pattern> maybe_bind(const string &bound_variable,
 }
 
 /** \brief Return a ?version term giving consideration
- *  to the special values CURRENT, CANDIDATE, TARGET.
+ *  to the special values CURRENT, CANDIDATE, FORBIDDEN, TARGET.
  */
 ref_ptr<pattern> parse_version(const string &version)
 {
@@ -770,6 +772,8 @@ ref_ptr<pattern> parse_version(const string &version)
     return pattern::make_install_version();
   else if(version == "CANDIDATE")
     return pattern::make_candidate_version();
+  else if(version == "FORBIDDEN")
+    return pattern::make_forbidden_version();
   else
     return pattern::make_version(version);
 }
@@ -984,6 +988,8 @@ ref_ptr<pattern> parse_term_args(const string &term_name,
       return pattern::make_false();
     case term_type_for:
       return parse_explicit_term(term_name, start, end, terminators, 
wide_context, partial, name_context);
+    case term_type_forbidden:
+      return pattern::make_forbidden_version();
     case term_type_garbage:
       return pattern::make_garbage();
     case term_type_installed:
@@ -1225,6 +1231,8 @@ ref_ptr<pattern> parse_atom(string::const_iterator &start,
                  return pattern::make_true();
                case 'U':
                  return pattern::make_upgradable();
+               case 'f':
+                 return pattern::make_forbidden_version();
                case 'o':
                  return pattern::make_obsolete();
                case 'P':
diff --git a/src/generic/apt/matching/pattern.cc 
b/src/generic/apt/matching/pattern.cc
index 56cea31..99f4826 100644
--- a/src/generic/apt/matching/pattern.cc
+++ b/src/generic/apt/matching/pattern.cc
@@ -128,6 +128,7 @@ switch(p->get_type())
   case pattern::equal:
   case pattern::false_tp:
   case pattern::foreign_architecture:
+  case pattern::forbidden_version:
   case pattern::garbage:
   case pattern::install_version:
   case pattern::installed:
diff --git a/src/generic/apt/matching/pattern.h 
b/src/generic/apt/matching/pattern.h
index b1870ac..8583ec3 100644
--- a/src/generic/apt/matching/pattern.h
+++ b/src/generic/apt/matching/pattern.h
@@ -369,6 +369,11 @@ namespace aptitude
            *
            *  Matches packages of foreign architectures.
            */
+         forbidden_version,
+         /** \brief ?version(FORBIDDEN)
+          *
+          *  Matches package versions which are marked as forbidden.
+          */
           foreign_architecture,
          /** \brief ?garbage
           *
@@ -1327,6 +1332,19 @@ namespace aptitude
 
       // @}
 
+      /** \name forbidden_version term constructor. */
+
+      // @{
+
+      /** \brief Create a ?version(FORBIDDEN) term. */
+      static cwidget::util::ref_ptr<pattern>
+      make_forbidden_version()
+      {
+        return new pattern(forbidden_version);
+      }
+
+      // @}
+
       /** \name foreign_architecture term constructor */
 
       // @{
diff --git a/src/generic/apt/matching/serialize.cc 
b/src/generic/apt/matching/serialize.cc
index ea506b1..ecf567f 100644
--- a/src/generic/apt/matching/serialize.cc
+++ b/src/generic/apt/matching/serialize.cc
@@ -358,6 +358,10 @@ namespace aptitude
            variable_name_stack.pop_back();
            break;
 
+         case pattern::forbidden_version:
+           out << "?version(forbidden)";
+           break;
+
          case pattern::foreign_architecture:
            out << "?architecture(foreign)";
            break;
diff --git a/src/pkg_item.cc b/src/pkg_item.cc
index e9d70df..f49b2ae 100644
--- a/src/pkg_item.cc
+++ b/src/pkg_item.cc
@@ -278,12 +278,15 @@ cw::style pkg_item::pkg_style(pkgCache::PkgIterator 
package, bool highlighted)
   else
     {
       pkgDepCache::StateCache &state=(*apt_cache_file)[package];
+      aptitudeDepCache::aptitude_state 
&estate=(*apt_cache_file)->get_ext_state(package);
 
       if(!state.InstBroken() &&
         (state.NewInstall() || (state.iFlags&pkgDepCache::ReInstall)))
        return cw::get_style(MAYBE_HIGHLIGHTED("PkgToInstall"));
+      else if (package.VersionList().VerStr() == estate.forbidver)
+       return cw::get_style(MAYBE_HIGHLIGHTED("PktBroken"));
       else if(state.Status!=2 && // Not being upgraded
-             
(*apt_cache_file)->get_ext_state(package).selection_state==pkgCache::State::Hold
 // Flagged for hold
+             estate.selection_state==pkgCache::State::Hold // Flagged for hold
              && !state.InstBroken()) // Not currently broken.
        return cw::get_style(MAYBE_HIGHLIGHTED("PkgToHold"));
       else if(state.Delete())
-- 
1.7.10.4


_______________________________________________
Aptitude-devel mailing list
[email protected]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/aptitude-devel

Reply via email to