Public Methods | |
Use* | operate (Use* ref_use, Use* new_use) |
|
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 } |