diff options
Diffstat (limited to 'cmdline/apt-get.cc')
-rw-r--r-- | cmdline/apt-get.cc | 132 |
1 files changed, 91 insertions, 41 deletions
diff --git a/cmdline/apt-get.cc b/cmdline/apt-get.cc index 75424926d..1ee47e8c4 100644 --- a/cmdline/apt-get.cc +++ b/cmdline/apt-get.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: apt-get.cc,v 1.70 1999/07/10 05:32:26 jgg Exp $ +// $Id: apt-get.cc,v 1.71 1999/07/12 04:39:37 jgg Exp $ /* ###################################################################### apt-get - Cover for dpkg @@ -61,6 +61,31 @@ ostream c2out; ofstream devnull("/dev/null"); unsigned int ScreenWidth = 80; +// class CacheFile - Cover class for some dependency cache functions /*{{{*/ +// --------------------------------------------------------------------- +/* */ +class CacheFile : public pkgCacheFile +{ + static pkgCache *SortCache; + static int NameComp(const void *a,const void *b); + + public: + pkgCache::Package **List; + + void Sort(); + bool CheckDeps(bool AllowBroken = false); + bool Open(bool WithLock = true) + { + OpTextProgress Prog(*_config); + if (pkgCacheFile::Open(Prog,WithLock) == false) + return false; + Sort(); + return true; + }; + CacheFile() : List(0) {}; +}; + /*}}}*/ + // YnPrompt - Yes No Prompt. /*{{{*/ // --------------------------------------------------------------------- /* Returns true on a Yes.*/ @@ -129,12 +154,13 @@ bool ShowList(ostream &out,string Title,string List) /* This prints out the names of all the packages that are broken along with the name of each each broken dependency and a quite version description. */ -void ShowBroken(ostream &out,pkgDepCache &Cache) +void ShowBroken(ostream &out,CacheFile &Cache) { out << "Sorry, but the following packages have unmet dependencies:" << endl; - pkgCache::PkgIterator I = Cache.PkgBegin(); - for (;I.end() != true; I++) + for (unsigned J = 0; J < Cache->Head().PackageCount; J++) { + pkgCache::PkgIterator I(Cache,Cache.List[J]); + if (Cache[I].InstBroken() == false) continue; @@ -155,7 +181,7 @@ void ShowBroken(ostream &out,pkgDepCache &Cache) pkgCache::DepIterator End; D.GlobOr(Start,End); - if (Cache.IsImportantDep(End) == false || + if (Cache->IsImportantDep(End) == false || (Cache[End] & pkgDepCache::DepGInstall) == pkgDepCache::DepGInstall) continue; @@ -203,32 +229,35 @@ void ShowBroken(ostream &out,pkgDepCache &Cache) // ShowNew - Show packages to newly install /*{{{*/ // --------------------------------------------------------------------- /* */ -void ShowNew(ostream &out,pkgDepCache &Dep) +void ShowNew(ostream &out,CacheFile &Cache) { /* Print out a list of packages that are going to be removed extra to what the user asked */ - pkgCache::PkgIterator I = Dep.PkgBegin(); string List; - for (;I.end() != true; I++) - if (Dep[I].NewInstall() == true) + for (unsigned J = 0; J < Cache->Head().PackageCount; J++) + { + pkgCache::PkgIterator I(Cache,Cache.List[J]); + if (Cache[I].NewInstall() == true) List += string(I.Name()) + " "; + } + ShowList(out,"The following NEW packages will be installed:",List); } /*}}}*/ // ShowDel - Show packages to delete /*{{{*/ // --------------------------------------------------------------------- /* */ -void ShowDel(ostream &out,pkgDepCache &Dep) +void ShowDel(ostream &out,CacheFile &Cache) { /* Print out a list of packages that are going to be removed extra to what the user asked */ - pkgCache::PkgIterator I = Dep.PkgBegin(); string List; - for (;I.end() != true; I++) + for (unsigned J = 0; J < Cache->Head().PackageCount; J++) { - if (Dep[I].Delete() == true) + pkgCache::PkgIterator I(Cache,Cache.List[J]); + if (Cache[I].Delete() == true) { - if ((Dep[I].iFlags & pkgDepCache::Purge) == pkgDepCache::Purge) + if ((Cache[I].iFlags & pkgDepCache::Purge) == pkgDepCache::Purge) List += string(I.Name()) + "* "; else List += string(I.Name()) + " "; @@ -260,14 +289,15 @@ void ShowKept(ostream &out,pkgDepCache &Dep) // ShowUpgraded - Show upgraded packages /*{{{*/ // --------------------------------------------------------------------- /* */ -void ShowUpgraded(ostream &out,pkgDepCache &Dep) +void ShowUpgraded(ostream &out,CacheFile &Cache) { - pkgCache::PkgIterator I = Dep.PkgBegin(); string List; - for (;I.end() != true; I++) + for (unsigned J = 0; J < Cache->Head().PackageCount; J++) { + pkgCache::PkgIterator I(Cache,Cache.List[J]); + // Not interesting - if (Dep[I].Upgrade() == false || Dep[I].NewInstall() == true) + if (Cache[I].Upgrade() == false || Cache[I].NewInstall() == true) continue; List += string(I.Name()) + " "; @@ -278,13 +308,13 @@ void ShowUpgraded(ostream &out,pkgDepCache &Dep) // ShowHold - Show held but changed packages /*{{{*/ // --------------------------------------------------------------------- /* */ -bool ShowHold(ostream &out,pkgDepCache &Dep) +bool ShowHold(ostream &out,CacheFile &Cache) { - pkgCache::PkgIterator I = Dep.PkgBegin(); string List; - for (;I.end() != true; I++) + for (unsigned J = 0; J < Cache->Head().PackageCount; J++) { - if (Dep[I].InstallVer != (pkgCache::Version *)I.CurrentVer() && + pkgCache::PkgIterator I(Cache,Cache.List[J]); + if (Cache[I].InstallVer != (pkgCache::Version *)I.CurrentVer() && I->SelectedState == pkgCache::State::Hold) List += string(I.Name()) + " "; } @@ -297,21 +327,21 @@ bool ShowHold(ostream &out,pkgDepCache &Dep) /* This prints out a warning message that is not to be ignored. It shows all essential packages and their dependents that are to be removed. It is insanely risky to remove the dependents of an essential package! */ -bool ShowEssential(ostream &out,pkgDepCache &Dep) +bool ShowEssential(ostream &out,CacheFile &Cache) { - pkgCache::PkgIterator I = Dep.PkgBegin(); string List; - bool *Added = new bool[Dep.HeaderP->PackageCount]; - for (unsigned int I = 0; I != Dep.HeaderP->PackageCount; I++) + bool *Added = new bool[Cache->HeaderP->PackageCount]; + for (unsigned int I = 0; I != Cache->HeaderP->PackageCount; I++) Added[I] = false; - for (;I.end() != true; I++) + for (unsigned J = 0; J < Cache->Head().PackageCount; J++) { + pkgCache::PkgIterator I(Cache,Cache.List[J]); if ((I->Flags & pkgCache::Flag::Essential) != pkgCache::Flag::Essential) continue; // The essential package is being removed - if (Dep[I].Delete() == true) + if (Cache[I].Delete() == true) { if (Added[I->ID] == false) { @@ -332,7 +362,7 @@ bool ShowEssential(ostream &out,pkgDepCache &Dep) continue; pkgCache::PkgIterator P = D.SmartTargetPkg(); - if (Dep[P].Delete() == true) + if (Cache[P].Delete() == true) { if (Added[P->ID] == true) continue; @@ -377,20 +407,40 @@ void Stats(ostream &out,pkgDepCache &Dep) } /*}}}*/ -// class CacheFile - Cover class for some dependency cache functions /*{{{*/ +// CacheFile::NameComp - QSort compare by name /*{{{*/ // --------------------------------------------------------------------- /* */ -class CacheFile : public pkgCacheFile +pkgCache *CacheFile::SortCache = 0; +int CacheFile::NameComp(const void *a,const void *b) { - public: + if (a == 0 && b == 0) + return 0; + if (a == 0) + return -1; + if (b == 0) + return 1; - bool CheckDeps(bool AllowBroken = false); - bool Open(bool WithLock = true) - { - OpTextProgress Prog(*_config); - return pkgCacheFile::Open(Prog,WithLock); - }; -}; + const pkgCache::Package &A = **(pkgCache::Package **)a; + const pkgCache::Package &B = **(pkgCache::Package **)b; + + return strcmp(SortCache->StrP + A.Name,SortCache->StrP + B.Name); +} + /*}}}*/ +// CacheFile::Sort - Sort by name /*{{{*/ +// --------------------------------------------------------------------- +/* */ +void CacheFile::Sort() +{ + delete [] List; + List = new pkgCache::Package *[Cache->Head().PackageCount]; + memset(List,0,sizeof(*List)*Cache->Head().PackageCount); + pkgCache::PkgIterator I = Cache->PkgBegin(); + for (;I.end() != true; I++) + List[I->ID] = I; + + SortCache = *this; + qsort(List,Cache->Head().PackageCount,sizeof(*List),NameComp); +} /*}}}*/ // CacheFile::Open - Open the cache file /*{{{*/ // --------------------------------------------------------------------- @@ -940,9 +990,9 @@ bool DoInstall(CommandLine &CmdL) if (Cache->InstCount() != ExpectedInst) { string List; - pkgCache::PkgIterator I = Cache->PkgBegin(); - for (;I.end() != true; I++) + for (unsigned J = 0; J < Cache->Head().PackageCount; J++) { + pkgCache::PkgIterator I(Cache,Cache.List[J]); if ((*Cache)[I].Install() == false) continue; |