Reimplemented from VersionSelector.
Definition at line 3527 of file cmt_use.cxx.
03528 {
03529 Use* selected = ref_use;
03530
03531 int old_v = -1;
03532 int old_r = -1;
03533 int old_p = -1;
03534 cmt_string old_pp;
03535
03536 int new_v = -1;
03537 int new_r = -1;
03538 int new_p = -1;
03539 cmt_string new_pp;
03540
03541 int alias_v = -1;
03542 int alias_r = -1;
03543 int alias_p = -1;
03544 cmt_string alias_pp;
03545
03546 enum { no_alias, new_has_alias, ref_has_alias } has_alias = no_alias;
03547
03548 CmtSystem::is_version_directory (ref_use->version, old_v, old_r, old_p);
03549 old_pp = ref_use->path;
03550
03551 CmtSystem::is_version_directory (new_use->version, new_v, new_r, new_p);
03552 new_pp = new_use->path;
03553
03554 if (new_use->version_alias != "")
03555 {
03556 has_alias = new_has_alias;
03557 CmtSystem::is_version_directory (new_use->version_alias,
03558 alias_v, alias_r, alias_p);
03559 alias_pp = new_use->path_alias;
03560 }
03561 else if (ref_use->version_alias != "")
03562 {
03563 has_alias = ref_has_alias;
03564 CmtSystem::is_version_directory (ref_use->version_alias,
03565 alias_v, alias_r, alias_p);
03566 alias_pp = ref_use->path_alias;
03567 }
03568
03569 ref_use->undiscard ();
03570 new_use->undiscard ();
03571
03572 if (new_v != old_v)
03573 {
03574 if (has_alias != no_alias)
03575 {
03576 if (has_alias == new_has_alias)
03577 {
03578 new_v = alias_v;
03579 new_r = alias_r;
03580 new_p = alias_p;
03581 new_pp = alias_pp;
03582 }
03583 else if (has_alias == ref_has_alias)
03584 {
03585 old_v = alias_v;
03586 old_r = alias_r;
03587 old_p = alias_p;
03588 old_pp = alias_pp;
03589 }
03590 }
03591 }
03592
03593 if (new_v < old_v)
03594 {
03595 if (!Cmt::get_quiet ())
03596 {
03597 cout << "# Keep version " << ref_use->version <<
03598 " of package " << ref_use->get_package_name () <<
03599 " (ignore version " << new_use->version << ")" <<
03600 endl;
03601 }
03602
03603 if (ref_use != new_use) new_use->discard ();
03604 }
03605 else if (new_v > old_v)
03606 {
03607 if (!Cmt::get_quiet ())
03608 {
03609 cout << "# Select version " << new_use->version <<
03610 " of package " << ref_use->get_package_name () <<
03611 " instead of existing " << ref_use->version <<
03612 endl;
03613 }
03614
03615 if (ref_use != new_use) ref_use->discard ();
03616 selected = new_use;
03617 selected->done = false;
03618 }
03619 else if (new_r < old_r)
03620 {
03621 if (!Cmt::get_quiet ())
03622 {
03623 cout << "# keep release " << ref_use->version <<
03624 " of package " << ref_use->get_package_name () <<
03625 " (ignore release " << new_use->version << ")" <<
03626 endl;
03627 }
03628
03629 if (ref_use != new_use) new_use->discard ();
03630 }
03631 else if (new_r > old_r)
03632 {
03633 if (!Cmt::get_quiet ())
03634 {
03635 cout << "# Select release " << new_use->version <<
03636 " of package " << ref_use->get_package_name () <<
03637 " instead of existing " << ref_use->version <<
03638 endl;
03639 }
03640
03641 if (ref_use != new_use) ref_use->discard ();
03642 selected = new_use;
03643 selected->done = false;
03644 }
03645 else if (new_p > old_p)
03646 {
03647 if (!Cmt::get_quiet ())
03648 {
03649 cout << "# Select patch " << new_use->version <<
03650 " of package " << ref_use->get_package_name () <<
03651 " instead of existing " << ref_use->version <<
03652 endl;
03653 }
03654
03655 if (ref_use != new_use) ref_use->discard ();
03656 selected = new_use;
03657 selected->done = false;
03658 }
03659 else if (new_pp != old_pp)
03660 {
03661 if (ref_use != new_use) ref_use->discard ();
03662 selected = new_use;
03663 selected->done = false;
03664 }
03665
03666 return (selected);
03667 }