~ubuntu-branches/ubuntu/oneiric/apt/oneiric-proposed

« back to all changes in this revision

Viewing changes to apt-pkg/algorithms.cc

  • Committer: Package Import Robot
  • Author(s): Colin Watson
  • Date: 2012-01-30 14:05:20 UTC
  • mfrom: (1.4.36 sid)
  • Revision ID: package-import@ubuntu.com-20120130140520-u14zifmvpi2so08m
Tags: 0.8.16~exp5ubuntu13.1
* apt-pkg/algorithms.cc: Iterate Breaks the same way as Conflicts, so that
  we resolve virtual package Breaks more effectively (LP: #922485).
* apt-pkg/algorithms.{cc,h}: Use an int to represent resolver scores, not
  a signed short, because large upgrades can result in an overflow for
  core packages (LP: #917173).

Show diffs side-by-side

added added

removed removed

Lines of Context:
470
470
{
471
471
   // Allocate memory
472
472
   unsigned long Size = Cache.Head().PackageCount;
473
 
   Scores = new signed short[Size];
 
473
   Scores = new int[Size];
474
474
   Flags = new unsigned char[Size];
475
475
   memset(Flags,0,sizeof(*Flags)*Size);
476
476
   
510
510
   memset(Scores,0,sizeof(*Scores)*Size);
511
511
 
512
512
   // Important Required Standard Optional Extra
513
 
   signed short PrioMap[] = {
 
513
   int PrioMap[] = {
514
514
      0,
515
 
      (signed short) _config->FindI("pkgProblemResolver::Scores::Important",3),
516
 
      (signed short) _config->FindI("pkgProblemResolver::Scores::Required",2),
517
 
      (signed short) _config->FindI("pkgProblemResolver::Scores::Standard",1),
518
 
      (signed short) _config->FindI("pkgProblemResolver::Scores::Optional",-1),
519
 
      (signed short) _config->FindI("pkgProblemResolver::Scores::Extra",-2)
 
515
      _config->FindI("pkgProblemResolver::Scores::Important",3),
 
516
      _config->FindI("pkgProblemResolver::Scores::Required",2),
 
517
      _config->FindI("pkgProblemResolver::Scores::Standard",1),
 
518
      _config->FindI("pkgProblemResolver::Scores::Optional",-1),
 
519
      _config->FindI("pkgProblemResolver::Scores::Extra",-2)
520
520
   };
521
 
   signed short PrioEssentials = _config->FindI("pkgProblemResolver::Scores::Essentials",100);
522
 
   signed short PrioInstalledAndNotObsolete = _config->FindI("pkgProblemResolver::Scores::NotObsolete",1);
523
 
   signed short PrioDepends = _config->FindI("pkgProblemResolver::Scores::Depends",1);
524
 
   signed short PrioRecommends = _config->FindI("pkgProblemResolver::Scores::Recommends",1);
525
 
   signed short AddProtected = _config->FindI("pkgProblemResolver::Scores::AddProtected",10000);
526
 
   signed short AddEssential = _config->FindI("pkgProblemResolver::Scores::AddEssential",5000);
 
521
   int PrioEssentials = _config->FindI("pkgProblemResolver::Scores::Essentials",100);
 
522
   int PrioInstalledAndNotObsolete = _config->FindI("pkgProblemResolver::Scores::NotObsolete",1);
 
523
   int PrioDepends = _config->FindI("pkgProblemResolver::Scores::Depends",1);
 
524
   int PrioRecommends = _config->FindI("pkgProblemResolver::Scores::Recommends",1);
 
525
   int AddProtected = _config->FindI("pkgProblemResolver::Scores::AddProtected",10000);
 
526
   int AddEssential = _config->FindI("pkgProblemResolver::Scores::AddEssential",5000);
527
527
 
528
528
   if (_config->FindB("Debug::pkgProblemResolver::ShowScores",false) == true)
529
529
      clog << "Settings used to calculate pkgProblemResolver::Scores::" << endl
545
545
      if (Cache[I].InstallVer == 0)
546
546
         continue;
547
547
      
548
 
      signed short &Score = Scores[I->ID];
 
548
      int &Score = Scores[I->ID];
549
549
      
550
550
      /* This is arbitrary, it should be high enough to elevate an
551
551
         essantial package above most other packages but low enough
583
583
   }   
584
584
   
585
585
   // Copy the scores to advoid additive looping
586
 
   SPtrArray<signed short> OldScores = new signed short[Size];
 
586
   SPtrArray<int> OldScores = new int[Size];
587
587
   memcpy(OldScores,Scores,sizeof(*Scores)*Size);
588
588
      
589
589
   /* Now we cause 1 level of dependency inheritance, that is we add the 
1093
1093
                  LEnd->Dep = End;
1094
1094
                  LEnd++;
1095
1095
                  
1096
 
                  if (Start->Type != pkgCache::Dep::Conflicts &&
1097
 
                      Start->Type != pkgCache::Dep::Obsoletes)
 
1096
                  if (Start.IsNegative() == false)
1098
1097
                     break;
1099
1098
               }
1100
1099
            }