Public Methods | |
Use* | operate (Use* ref_use, Use* new_use) |
|
Reimplemented from VersionSelector. Definition at line 2344 of file cmt_use.cxx. 02345 { 02346 Use* selected = ref_use; 02347 02348 int old_v = -1; 02349 int old_r = -1; 02350 int old_p = -1; 02351 cmt_string old_pp; 02352 02353 int new_v = -1; 02354 int new_r = -1; 02355 int new_p = -1; 02356 cmt_string new_pp; 02357 02358 int alias_v = -1; 02359 int alias_r = -1; 02360 int alias_p = -1; 02361 cmt_string alias_pp; 02362 02363 enum { no_alias, new_has_alias, ref_has_alias } has_alias = no_alias; 02364 02365 CmtSystem::is_version_directory (ref_use->version, old_v, old_r, old_p); 02366 old_pp = ref_use->path; 02367 02368 CmtSystem::is_version_directory (new_use->version, new_v, new_r, new_p); 02369 new_pp = new_use->path; 02370 02371 if (new_use->version_alias != "") 02372 { 02373 has_alias = new_has_alias; 02374 CmtSystem::is_version_directory (new_use->version_alias, 02375 alias_v, alias_r, alias_p); 02376 alias_pp = new_use->path_alias; 02377 } 02378 else if (ref_use->version_alias != "") 02379 { 02380 has_alias = ref_has_alias; 02381 CmtSystem::is_version_directory (ref_use->version_alias, 02382 alias_v, alias_r, alias_p); 02383 alias_pp = ref_use->path_alias; 02384 } 02385 02386 ref_use->undiscard (); 02387 new_use->undiscard (); 02388 02389 if (new_v != old_v) 02390 { 02391 if (has_alias != no_alias) 02392 { 02393 if (has_alias == new_has_alias) 02394 { 02395 new_v = alias_v; 02396 new_r = alias_r; 02397 new_p = alias_p; 02398 new_pp = alias_pp; 02399 } 02400 else if (has_alias == ref_has_alias) 02401 { 02402 old_v = alias_v; 02403 old_r = alias_r; 02404 old_p = alias_p; 02405 old_pp = alias_pp; 02406 } 02407 } 02408 } 02409 02410 if (new_v < old_v) 02411 { 02412 if (!Cmt::get_quiet ()) 02413 { 02414 cout << "# Keep version " << ref_use->version << 02415 " of package " << ref_use->package << 02416 " (ignore version " << new_use->version << ")" << 02417 endl; 02418 } 02419 02420 if (ref_use != new_use) new_use->discard (); 02421 } 02422 else if (new_v > old_v) 02423 { 02424 if (!Cmt::get_quiet ()) 02425 { 02426 cout << "# Select version " << new_use->version << 02427 " of package " << ref_use->package << 02428 " instead of existing " << ref_use->version << 02429 endl; 02430 } 02431 02432 if (ref_use != new_use) ref_use->discard (); 02433 selected = new_use; 02434 selected->done = false; // Will read the new requirements 02435 } 02436 else if (new_r < old_r) 02437 { 02438 if (!Cmt::get_quiet ()) 02439 { 02440 cout << "# keep release " << ref_use->version << 02441 " of package " << ref_use->package << 02442 " (ignore release " << new_use->version << ")" << 02443 endl; 02444 } 02445 02446 if (ref_use != new_use) new_use->discard (); 02447 } 02448 else if (new_r > old_r) 02449 { 02450 if (!Cmt::get_quiet ()) 02451 { 02452 cout << "# Select release " << new_use->version << 02453 " of package " << ref_use->package << 02454 " instead of existing " << ref_use->version << 02455 endl; 02456 } 02457 02458 if (ref_use != new_use) ref_use->discard (); 02459 selected = new_use; 02460 selected->done = false; // Will read the new requirements 02461 } 02462 else if (new_p > old_p) 02463 { 02464 if (!Cmt::get_quiet ()) 02465 { 02466 cout << "# Select patch " << new_use->version << 02467 " of package " << ref_use->package << 02468 " instead of existing " << ref_use->version << 02469 endl; 02470 } 02471 02472 if (ref_use != new_use) ref_use->discard (); 02473 selected = new_use; 02474 selected->done = false; // Will read the new requirements 02475 } 02476 else if (new_pp != old_pp) // same version-r-p but from different path 02477 { 02478 if (ref_use != new_use) ref_use->discard (); 02479 selected = new_use; 02480 selected->done = false; // Will read the new requirements 02481 } 02482 02483 return (selected); 02484 } |