// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: apt-cache.cc,v 1.62 2003/04/27 01:32:48 doogie Exp $
+// $Id: apt-cache.cc,v 1.72 2004/04/30 04:34:03 mdz Exp $
/* ######################################################################
apt-cache - Manages the cache files
#include <errno.h>
#include <regex.h>
#include <stdio.h>
+
+#include <iomanip>
/*}}}*/
using namespace std;
bool Stats(CommandLine &Cmd)
{
pkgCache &Cache = *GCache;
- cout << _("Total Package Names : ") << Cache.Head().PackageCount << " (" <<
+ cout << _("Total package names : ") << Cache.Head().PackageCount << " (" <<
SizeToStr(Cache.Head().PackageCount*Cache.Head().PackageSz) << ')' << endl;
int Normal = 0;
continue;
}
}
- cout << _(" Normal Packages: ") << Normal << endl;
- cout << _(" Pure Virtual Packages: ") << Virtual << endl;
- cout << _(" Single Virtual Packages: ") << DVirt << endl;
- cout << _(" Mixed Virtual Packages: ") << NVirt << endl;
+ cout << _(" Normal packages: ") << Normal << endl;
+ cout << _(" Pure virtual packages: ") << Virtual << endl;
+ cout << _(" Single virtual packages: ") << DVirt << endl;
+ cout << _(" Mixed virtual packages: ") << NVirt << endl;
cout << _(" Missing: ") << Missing << endl;
- cout << _("Total Distinct Versions: ") << Cache.Head().VersionCount << " (" <<
+ cout << _("Total distinct versions: ") << Cache.Head().VersionCount << " (" <<
SizeToStr(Cache.Head().VersionCount*Cache.Head().VersionSz) << ')' << endl;
- cout << _("Total Dependencies: ") << Cache.Head().DependsCount << " (" <<
+ cout << _("Total dependencies: ") << Cache.Head().DependsCount << " (" <<
SizeToStr(Cache.Head().DependsCount*Cache.Head().DependencySz) << ')' << endl;
- cout << _("Total Ver/File relations: ") << Cache.Head().VerFileCount << " (" <<
+ cout << _("Total ver/file relations: ") << Cache.Head().VerFileCount << " (" <<
SizeToStr(Cache.Head().VerFileCount*Cache.Head().VerFileSz) << ')' << endl;
- cout << _("Total Provides Mappings: ") << Cache.Head().ProvidesCount << " (" <<
+ cout << _("Total Provides mappings: ") << Cache.Head().ProvidesCount << " (" <<
SizeToStr(Cache.Head().ProvidesCount*Cache.Head().ProvidesSz) << ')' << endl;
// String list stats
Count++;
Size += strlen(Cache.StrP + I->String) + 1;
}
- cout << _("Total Globbed Strings: ") << Count << " (" << SizeToStr(Size) << ')' << endl;
+ cout << _("Total globbed strings: ") << Count << " (" << SizeToStr(Size) << ')' << endl;
unsigned long DepVerSize = 0;
for (pkgCache::PkgIterator P = Cache.PkgBegin(); P.end() == false; P++)
}
}
}
- cout << _("Total Dependency Version space: ") << SizeToStr(DepVerSize) << endl;
+ cout << _("Total dependency version space: ") << SizeToStr(DepVerSize) << endl;
unsigned long Slack = 0;
for (int I = 0; I != 7; I++)
Slack += Cache.Head().Pools[I].ItemSize*Cache.Head().Pools[I].Count;
- cout << _("Total Slack space: ") << SizeToStr(Slack) << endl;
+ cout << _("Total slack space: ") << SizeToStr(Slack) << endl;
unsigned long Total = 0;
Total = Slack + Size + Cache.Head().DependsCount*Cache.Head().DependencySz +
Cache.Head().PackageCount*Cache.Head().PackageSz +
Cache.Head().VerFileCount*Cache.Head().VerFileSz +
Cache.Head().ProvidesCount*Cache.Head().ProvidesSz;
- cout << _("Total Space Accounted for: ") << SizeToStr(Total) << endl;
+ cout << _("Total space accounted for: ") << SizeToStr(Total) << endl;
return true;
}
}
bool Recurse = _config->FindB("APT::Cache::RecurseDepends",false);
+ bool Installed = _config->FindB("APT::Cache::Installed",false);
bool DidSomething;
do
{
for (pkgCache::DepIterator D = Ver.DependsList(); D.end() == false; D++)
{
- if ((D->CompareOp & pkgCache::Dep::Or) == pkgCache::Dep::Or)
- cout << " |";
- else
- cout << " ";
-
- // Show the package
+
pkgCache::PkgIterator Trg = D.TargetPkg();
- if (Trg->VersionList == 0)
- cout << D.DepType() << ": <" << Trg.Name() << ">" << endl;
- else
- cout << D.DepType() << ": " << Trg.Name() << endl;
+
+ if((Installed && Trg->CurrentVer != 0) || !Installed)
+ {
+
+ if ((D->CompareOp & pkgCache::Dep::Or) == pkgCache::Dep::Or)
+ cout << " |";
+ else
+ cout << " ";
- if (Recurse == true)
- Colours[D.TargetPkg()->ID]++;
+ // Show the package
+ if (Trg->VersionList == 0)
+ cout << D.DepType() << ": <" << Trg.Name() << ">" << endl;
+ else
+ cout << D.DepType() << ": " << Trg.Name() << endl;
+
+ if (Recurse == true)
+ Colours[D.TargetPkg()->ID]++;
+
+ }
+
+ // Display all solutions
+ SPtrArray<pkgCache::Version *> List = D.AllTargets();
+ pkgPrioSortList(Cache,List);
+ for (pkgCache::Version **I = List; *I != 0; I++)
+ {
+ pkgCache::VerIterator V(Cache,*I);
+ if (V != Cache.VerP + V.ParentPkg()->VersionList ||
+ V->ParentPkg == D->Package)
+ continue;
+ cout << " " << V.ParentPkg().Name() << endl;
+
+ if (Recurse == true)
+ Colours[D.ParentPkg()->ID]++;
+ }
+ }
+ }
+ }
+ while (DidSomething == true);
+
+ return true;
+}
+
+// RDepends - Print out a reverse dependency tree - mbc /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+bool RDepends(CommandLine &CmdL)
+{
+ pkgCache &Cache = *GCache;
+ SPtrArray<unsigned> Colours = new unsigned[Cache.Head().PackageCount];
+ memset(Colours,0,sizeof(*Colours)*Cache.Head().PackageCount);
+
+ for (const char **I = CmdL.FileList + 1; *I != 0; I++)
+ {
+ pkgCache::PkgIterator Pkg = Cache.FindPkg(*I);
+ if (Pkg.end() == true)
+ {
+ _error->Warning(_("Unable to locate package %s"),*I);
+ continue;
+ }
+ Colours[Pkg->ID] = 1;
+ }
+
+ bool Recurse = _config->FindB("APT::Cache::RecurseDepends",false);
+ bool Installed = _config->FindB("APT::Cache::Installed",false);
+ bool DidSomething;
+ do
+ {
+ DidSomething = false;
+ for (pkgCache::PkgIterator Pkg = Cache.PkgBegin(); Pkg.end() == false; Pkg++)
+ {
+ if (Colours[Pkg->ID] != 1)
+ continue;
+ Colours[Pkg->ID] = 2;
+ DidSomething = true;
+
+ pkgCache::VerIterator Ver = Pkg.VersionList();
+ if (Ver.end() == true)
+ {
+ cout << '<' << Pkg.Name() << '>' << endl;
+ continue;
+ }
+
+ cout << Pkg.Name() << endl;
+
+ cout << "Reverse Depends:" << endl;
+ for (pkgCache::DepIterator D = Pkg.RevDependsList(); D.end() == false; D++)
+ {
+ // Show the package
+ pkgCache::PkgIterator Trg = D.ParentPkg();
+
+ if((Installed && Trg->CurrentVer != 0) || !Installed)
+ {
+
+ if ((D->CompareOp & pkgCache::Dep::Or) == pkgCache::Dep::Or)
+ cout << " |";
+ else
+ cout << " ";
+
+ if (Trg->VersionList == 0)
+ cout << D.DepType() << ": <" << Trg.Name() << ">" << endl;
+ else
+ cout << Trg.Name() << endl;
+
+ if (Recurse == true)
+ Colours[D.ParentPkg()->ID]++;
+
+ }
// Display all solutions
SPtrArray<pkgCache::Version *> List = D.AllTargets();
return true;
}
+
/*}}}*/
Buffer[V.FileList()->Size] = '\n';
if (PkgF.Seek(V.FileList()->Offset) == false ||
PkgF.Read(Buffer,V.FileList()->Size) == false ||
- write(STDOUT_FILENO,Buffer,V.FileList()->Size+1) != V.FileList()->Size+1)
+ fwrite(Buffer,1,V.FileList()->Size+1,stdout) < (size_t)(V.FileList()->Size+1))
{
delete [] Buffer;
return false;
{
pkgCache &Cache = *GCache;
pkgDepCache::Policy Plcy;
+
+ unsigned found = 0;
for (const char **I = CmdL.FileList + 1; *I != 0; I++)
{
continue;
}
+ ++found;
+
// Find the proper version to use.
if (_config->FindB("APT::Cache::AllVersions","true") == true)
{
return false;
}
}
- return true;
+
+ if (found > 0)
+ return true;
+ return _error->Error(_("No packages found"));
}
/*}}}*/
// ShowPkgNames - Show package names /*{{{*/
// Print out all of the package files
if (CmdL.FileList[1] == 0)
{
- cout << _("Package Files:") << endl;
+ cout << _("Package files:") << endl;
for (pkgCache::PkgFileIterator F = Cache.FileBegin(); F.end() == false; F++)
{
// Locate the associated index files so we can derive a description
}
// Show any packages have explicit pins
- cout << _("Pinned Packages:") << endl;
+ cout << _("Pinned packages:") << endl;
pkgCache::PkgIterator I = Cache.PkgBegin();
for (;I.end() != true; I++)
{
// Pinned version
if (Plcy.GetPriority(Pkg) != 0)
{
- cout << _(" Package Pin: ");
+ cout << _(" Package pin: ");
V = Plcy.GetMatch(Pkg);
if (V.end() == true)
cout << _("(not found)") << endl;
}
// Show the priority tables
- cout << _(" Version Table:") << endl;
+ cout << _(" Version table:") << endl;
for (V = Pkg.VersionList(); V.end() == false; V++)
{
if (Pkg.CurrentVer() == V)
return true;
}
+ /*}}}*/
+// Madison - Look a bit like katie's madison /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+bool Madison(CommandLine &CmdL)
+{
+ if (SrcList == 0)
+ return _error->Error("Generate must be enabled for this function");
+
+ SrcList->ReadMainList();
+
+ pkgCache &Cache = *GCache;
+
+ // Create the src text record parsers and ignore errors about missing
+ // deb-src lines that are generated from pkgSrcRecords::pkgSrcRecords
+ pkgSrcRecords SrcRecs(*SrcList);
+ if (_error->PendingError() == true)
+ _error->Discard();
+
+ for (const char **I = CmdL.FileList + 1; *I != 0; I++)
+ {
+ pkgCache::PkgIterator Pkg = Cache.FindPkg(*I);
+
+ if (Pkg.end() == false)
+ {
+ for (pkgCache::VerIterator V = Pkg.VersionList(); V.end() == false; V++)
+ {
+ for (pkgCache::VerFileIterator VF = V.FileList(); VF.end() == false; VF++)
+ {
+// This might be nice, but wouldn't uniquely identify the source -mdz
+// if (VF.File().Archive() != 0)
+// {
+// cout << setw(10) << Pkg.Name() << " | " << setw(10) << V.VerStr() << " | "
+// << VF.File().Archive() << endl;
+// }
+
+ // Locate the associated index files so we can derive a description
+ for (pkgSourceList::const_iterator S = SrcList->begin(); S != SrcList->end(); S++)
+ {
+ vector<pkgIndexFile *> *Indexes = (*S)->GetIndexFiles();
+ for (vector<pkgIndexFile *>::const_iterator IF = Indexes->begin();
+ IF != Indexes->end(); IF++)
+ {
+ if ((*IF)->FindInCache(*(VF.File().Cache())) == VF.File())
+ {
+ cout << setw(10) << Pkg.Name() << " | " << setw(10) << V.VerStr() << " | "
+ << (*IF)->Describe(true) << endl;
+ }
+ }
+ }
+ }
+ }
+ }
+
+
+ SrcRecs.Restart();
+ pkgSrcRecords::Parser *SrcParser;
+ while ((SrcParser = SrcRecs.Find(*I,false)) != 0)
+ {
+ // Maybe support Release info here too eventually
+ cout << setw(10) << SrcParser->Package() << " | "
+ << setw(10) << SrcParser->Version() << " | "
+ << SrcParser->Index().Describe(true) << endl;
+ }
+ }
+
+ return true;
+}
+
/*}}}*/
// GenCaches - Call the main cache generator /*{{{*/
// ---------------------------------------------------------------------
ioprintf(cout,_("%s %s for %s %s compiled on %s %s\n"),PACKAGE,VERSION,
COMMON_OS,COMMON_CPU,__DATE__,__TIME__);
+ if (_config->FindB("version") == true)
+ return true;
+
cout <<
_("Usage: apt-cache [options] command\n"
- " apt-cache [options] add file1 [file1 ...]\n"
+ " apt-cache [options] add file1 [file2 ...]\n"
" apt-cache [options] showpkg pkg1 [pkg2 ...]\n"
" apt-cache [options] showsrc pkg1 [pkg2 ...]\n"
"\n"
" search - Search the package list for a regex pattern\n"
" show - Show a readable record for the package\n"
" depends - Show raw dependency information for a package\n"
+ " rdepends - Show reverse dependency information for a package\n"
" pkgnames - List the names of all packages\n"
" dotty - Generate package graphs for GraphVis\n"
" xvcg - Generate package graphs for xvcg\n"
" -q Disable progress indicator.\n"
" -i Show only important deps for the unmet command.\n"
" -c=? Read this configuration file\n"
- " -o=? Set an arbitary configuration option, eg -o dir::cache=/tmp\n"
+ " -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n"
"See the apt-cache(8) and apt.conf(5) manual pages for more information.\n");
return true;
}
{'f',"full","APT::Cache::ShowFull",0},
{'g',"generate","APT::Cache::Generate",0},
{'a',"all-versions","APT::Cache::AllVersions",0},
- {0,"names-only","APT::Cache::NamesOnly",0},
- {'n',"all-names","APT::Cache::AllNames",0},
+ {'n',"names-only","APT::Cache::NamesOnly",0},
+ {0,"all-names","APT::Cache::AllNames",0},
{0,"recurse","APT::Cache::RecurseDepends",0},
{'c',"config-file",0,CommandLine::ConfigFile},
{'o',"option",0,CommandLine::ArbItem},
+ {0,"installed","APT::Cache::Installed",0},
{0,0,0,0}};
CommandLine::Dispatch CmdsA[] = {{"help",&ShowHelp},
{"add",&DoAdd},
{"unmet",&UnMet},
{"search",&Search},
{"depends",&Depends},
+ {"rdepends",&RDepends},
{"dotty",&Dotty},
{"xvcg",&XVcg},
{"show",&ShowPackage},
{"pkgnames",&ShowPkgNames},
{"policy",&Policy},
+ {"madison",&Madison},
{0,0}};
CacheInitialize();
}
// Deal with stdout not being a tty
- if (ttyname(STDOUT_FILENO) == 0 && _config->FindI("quiet",0) < 1)
+ if (isatty(STDOUT_FILENO) && _config->FindI("quiet",0) < 1)
_config->Set("quiet","1");
if (CmdL.DispatchArg(CmdsA,false) == false && _error->PendingError() == false)