

Public Methods | |
| Use* | operate (Use* ref_use, Use* new_use) |
|
|
Reimplemented from VersionSelector. Definition at line 2349 of file cmt_use.cxx. 02350 {
02351 Use* selected = ref_use;
02352
02353 int old_v = -1;
02354 int old_r = -1;
02355 int old_p = -1;
02356 cmt_string old_pp;
02357
02358 int new_v = -1;
02359 int new_r = -1;
02360 int new_p = -1;
02361 cmt_string new_pp;
02362
02363 int alias_v = -1;
02364 int alias_r = -1;
02365 int alias_p = -1;
02366 cmt_string alias_pp;
02367
02368 enum { no_alias, new_has_alias, ref_has_alias } has_alias = no_alias;
02369
02370 CmtSystem::is_version_directory (ref_use->version, old_v, old_r, old_p);
02371 old_pp = ref_use->path;
02372
02373 CmtSystem::is_version_directory (new_use->version, new_v, new_r, new_p);
02374 new_pp = new_use->path;
02375
02376 if (new_use->version_alias != "")
02377 {
02378 has_alias = new_has_alias;
02379 CmtSystem::is_version_directory (new_use->version_alias,
02380 alias_v, alias_r, alias_p);
02381 alias_pp = new_use->path_alias;
02382 }
02383 else if (ref_use->version_alias != "")
02384 {
02385 has_alias = ref_has_alias;
02386 CmtSystem::is_version_directory (ref_use->version_alias,
02387 alias_v, alias_r, alias_p);
02388 alias_pp = ref_use->path_alias;
02389 }
02390
02391 ref_use->undiscard ();
02392 new_use->undiscard ();
02393
02394 if (new_v != old_v)
02395 {
02396 if (has_alias != no_alias)
02397 {
02398 if (has_alias == new_has_alias)
02399 {
02400 new_v = alias_v;
02401 new_r = alias_r;
02402 new_p = alias_p;
02403 new_pp = alias_pp;
02404 }
02405 else if (has_alias == ref_has_alias)
02406 {
02407 old_v = alias_v;
02408 old_r = alias_r;
02409 old_p = alias_p;
02410 old_pp = alias_pp;
02411 }
02412 }
02413 }
02414
02415 if (new_v != old_v)
02416 {
02417 if (!Cmt::get_quiet ())
02418 cout << "# Required version " << new_use->version <<
02419 " of package " << ref_use->package <<
02420 " incompatible with selected version " << ref_use->version <<
02421 endl;
02422
02423 CmtError::set (CmtError::version_conflict, "BestFitSelector::operate> ");
02424
02425 if (ref_use != new_use) new_use->discard ();
02426 }
02427 else if (new_r < old_r)
02428 {
02429 //
02430 // we plan to discard new_use, but if it was specified as explicit
02431 // and ref_use was wildcarded then new_use will win !!
02432 //
02433 // So then we'll have to understand where are the wild
02434 // cards... If they are on v or r, then we consider them.
02435 //
02436 //
02437
02438
02439 bool new_is_wildcarded = false;
02440 bool ref_is_wildcarded = false;
02441
02442 if (new_use->specified_version.find ("*") != cmt_string::npos)
02443 {
02444 int nv = -1;
02445 int nr = -1;
02446 int np = -1;
02447
02448 CmtSystem::is_version_directory (new_use->specified_version, nv, nr, np);
02449 if ((nv == -1) || (nr == -1)) new_is_wildcarded = true;
02450 }
02451
02452 if (ref_use->specified_version.find ("*") != cmt_string::npos)
02453 {
02454 int nv = -1;
02455 int nr = -1;
02456 int np = -1;
02457
02458 CmtSystem::is_version_directory (ref_use->specified_version, nv, nr, np);
02459 if ((nv == -1) || (nr == -1)) new_is_wildcarded = true;
02460 }
02461
02462 if (!ref_is_wildcarded && new_is_wildcarded)
02463 {
02464 if (ref_use != new_use) ref_use->discard ();
02465 selected = new_use;
02466 selected->done = false; // Will read the new requirements
02467 }
02468 else
02469 {
02470 if (!Cmt::get_quiet ())
02471 cout << "# keep release " << ref_use->version <<
02472 " of package " << ref_use->package <<
02473 " (ignore release " << new_use->version << ")" <<
02474 endl;
02475
02476 if (ref_use != new_use) new_use->discard ();
02477 }
02478 }
02479 else if (new_r > old_r)
02480 {
02481 if (!Cmt::get_quiet ())
02482 {
02483 cout << "# Select release " << new_use->version <<
02484 " of package " << ref_use->package <<
02485 " instead of existing " << ref_use->version <<
02486 endl;
02487 }
02488
02489 if (ref_use != new_use) ref_use->discard ();
02490 selected = new_use;
02491 selected->done = false; // Will read the new requirements
02492 }
02493 else if (new_p > old_p)
02494 {
02495 if (!Cmt::get_quiet ())
02496 {
02497 cout << "# Select patch " << new_use->version <<
02498 " of package " << ref_use->package <<
02499 " instead of existing " << ref_use->version <<
02500 endl;
02501 }
02502
02503 if (ref_use != new_use) ref_use->discard ();
02504 selected = new_use;
02505 selected->done = false; // Will read the new requirements
02506 }
02507 else if (new_pp != old_pp) // same version-r-p but from different path
02508 {
02509 if (ref_use != new_use) ref_use->discard ();
02510 selected = new_use;
02511 selected->done = false; // Will read the new requirements
02512 }
02513
02514 return (selected);
02515 }
|
1.2.3 written by Dimitri van Heesch,
© 1997-2000