Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

BestFitSelector Class Reference

Inheritance diagram for BestFitSelector

Inheritance graph
[legend]
Collaboration diagram for BestFitSelector:

Collaboration graph
[legend]
List of all members.

Public Methods

Useoperate (Use* ref_use, Use* new_use)

Member Function Documentation

Use * BestFitSelector::operate ( Use * ref_use,
Use * new_use ) [virtual]
 

Reimplemented from VersionSelector.

Definition at line 2170 of file cmt_use.cxx.

02171 {
02172   Use* selected = ref_use;
02173 
02174   int old_v = -1;
02175   int old_r = -1;
02176   int old_p = -1;
02177   cmt_string old_pp;
02178 
02179   int new_v = -1;
02180   int new_r = -1;
02181   int new_p = -1;
02182   cmt_string new_pp;
02183 
02184   int alias_v = -1;
02185   int alias_r = -1;
02186   int alias_p = -1;
02187   cmt_string alias_pp;
02188 
02189   enum { no_alias, new_has_alias, ref_has_alias } has_alias = no_alias;
02190 
02191   CmtSystem::is_version_directory (ref_use->version, old_v, old_r, old_p);
02192   old_pp = ref_use->path;
02193 
02194   CmtSystem::is_version_directory (new_use->version, new_v, new_r, new_p);
02195   new_pp = new_use->path;
02196 
02197   if (new_use->version_alias != "")
02198     {
02199       has_alias = new_has_alias;
02200       CmtSystem::is_version_directory (new_use->version_alias, 
02201                                        alias_v, alias_r, alias_p);
02202       alias_pp = new_use->path_alias;
02203     }
02204   else if (ref_use->version_alias != "")
02205     {
02206       has_alias = ref_has_alias;
02207       CmtSystem::is_version_directory (ref_use->version_alias, 
02208                                        alias_v, alias_r, alias_p);
02209       alias_pp = ref_use->path_alias;
02210     }
02211 
02212   ref_use->undiscard ();
02213   new_use->undiscard ();
02214 
02215   if (new_v != old_v)
02216     {
02217       if (has_alias != no_alias)
02218         {
02219           if (has_alias == new_has_alias)
02220             {
02221               new_v = alias_v;
02222               new_r = alias_r;
02223               new_p = alias_p;
02224               new_pp = alias_pp;
02225             }
02226           else if (has_alias == ref_has_alias)
02227             {
02228               old_v = alias_v;
02229               old_r = alias_r;
02230               old_p = alias_p;
02231               old_pp = alias_pp;
02232             }
02233         }
02234     }
02235 
02236   if (new_v != old_v)
02237     {
02238       if (!Cmt::get_quiet ())
02239         cout << "# Required version " << new_use->version <<
02240           " of package " << ref_use->package <<
02241           " incompatible with selected version " << ref_use->version <<
02242           endl;
02243 
02244       CmtError::set (CmtError::version_conflict, "BestFitSelector::operate> ");
02245 
02246       if (ref_use != new_use) new_use->discard ();
02247     }
02248   else if (new_r < old_r)
02249     {
02250       //
02251       // we plan to discard new_use, but if it was specified as explicit 
02252       // and ref_use was wildcarded then new_use will win !!
02253       //
02254       // So then we'll have to understand where are the wild
02255       // cards... If they are on v or r, then we consider them.
02256       // 
02257       //
02258 
02259 
02260       bool new_is_wildcarded = false;
02261       bool ref_is_wildcarded = false;
02262 
02263       if (new_use->specified_version.find ("*") != cmt_string::npos)
02264         {
02265           int nv = -1;
02266           int nr = -1;
02267           int np = -1;
02268 
02269           CmtSystem::is_version_directory (new_use->specified_version, nv, nr, np);
02270           if ((nv == -1) || (nr == -1)) new_is_wildcarded = true;
02271         }
02272 
02273       if (ref_use->specified_version.find ("*") != cmt_string::npos)
02274         {
02275           int nv = -1;
02276           int nr = -1;
02277           int np = -1;
02278 
02279           CmtSystem::is_version_directory (ref_use->specified_version, nv, nr, np);
02280           if ((nv == -1) || (nr == -1)) new_is_wildcarded = true;
02281         }
02282 
02283       if (!ref_is_wildcarded && new_is_wildcarded)
02284         {
02285           if (ref_use != new_use) ref_use->discard ();
02286           selected = new_use;
02287           selected->done = false; // Will read the new requirements
02288         }
02289       else
02290         {
02291           if (!Cmt::get_quiet ())
02292             cout << "# keep release " << ref_use->version <<
02293               " of package " << ref_use->package <<
02294               " (ignore release " << new_use->version << ")" <<
02295               endl;
02296 
02297           if (ref_use != new_use) new_use->discard ();
02298         }
02299     }
02300   else if (new_r > old_r)
02301     {
02302       if (!Cmt::get_quiet ())
02303         {
02304           cout << "# Select release " << new_use->version <<
02305             " of package " << ref_use->package <<
02306             " instead of existing " << ref_use->version <<
02307             endl;
02308         }
02309 
02310       if (ref_use != new_use) ref_use->discard ();
02311       selected = new_use;
02312       selected->done = false; // Will read the new requirements
02313     }
02314   else if (new_p > old_p)
02315     {
02316       if (!Cmt::get_quiet ())
02317         {
02318           cout << "# Select patch " << new_use->version <<
02319             " of package " << ref_use->package <<
02320             " instead of existing " << ref_use->version <<
02321             endl;
02322         }
02323 
02324       if (ref_use != new_use) ref_use->discard ();
02325       selected = new_use;
02326       selected->done = false; // Will read the new requirements
02327     }
02328   else if (new_pp != old_pp) // same version-r-p but from different path
02329     {
02330       if (ref_use != new_use) ref_use->discard ();
02331       selected = new_use;
02332       selected->done = false; // Will read the new requirements
02333     }
02334 
02335   return (selected);
02336 }


The documentation for this class was generated from the following file:
Generated at Thu May 16 16:27:35 2002 for CMT by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000