X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/7488f4586fd29c8ce9ac184b6d5205958b8381b2..dabe757a0a6d91e07ba30e3d580e49fe56eb4737:/cmdline/apt-cache.cc diff --git a/cmdline/apt-cache.cc b/cmdline/apt-cache.cc index 046d6f76c..c0655da40 100644 --- a/cmdline/apt-cache.cc +++ b/cmdline/apt-cache.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: apt-cache.cc,v 1.67 2003/08/02 19:53:23 mdz Exp $ +// $Id: apt-cache.cc,v 1.72 2004/04/30 04:34:03 mdz Exp $ /* ###################################################################### apt-cache - Manages the cache files @@ -37,6 +37,8 @@ #include #include #include + +#include /*}}}*/ using namespace std; @@ -69,6 +71,12 @@ void LocalitySort(pkgCache::VerFile **begin, { qsort(begin,Count,Size,LocalityCompare); } + +void LocalitySort(pkgCache::DescFile **begin, + unsigned long Count,size_t Size) +{ + qsort(begin,Count,Size,LocalityCompare); +} /*}}}*/ // UnMet - Show unmet dependencies /*{{{*/ // --------------------------------------------------------------------- @@ -94,13 +102,15 @@ bool UnMet(CommandLine &CmdL) if (End->Type != pkgCache::Dep::PreDepends && End->Type != pkgCache::Dep::Depends && End->Type != pkgCache::Dep::Suggests && - End->Type != pkgCache::Dep::Recommends) + End->Type != pkgCache::Dep::Recommends && + End->Type != pkgCache::Dep::DpkgBreaks) continue; // Important deps only if (Important == true) if (End->Type != pkgCache::Dep::PreDepends && - End->Type != pkgCache::Dep::Depends) + End->Type != pkgCache::Dep::Depends && + End->Type != pkgCache::Dep::DpkgBreaks) continue; // Verify the or group @@ -180,7 +190,14 @@ bool DumpPackage(CommandLine &CmdL) { cout << Cur.VerStr(); for (pkgCache::VerFileIterator Vf = Cur.FileList(); Vf.end() == false; Vf++) - cout << "(" << Vf.File().FileName() << ")"; + cout << " (" << Vf.File().FileName() << ")"; + cout << endl; + for (pkgCache::DescIterator D = Cur.DescriptionList(); D.end() == false; D++) + { + cout << " Description Language: " << D.LanguageCode() << endl + << " File: " << D.FileList().File().FileName() << endl + << " MD5: " << D.md5() << endl; + } cout << endl; } @@ -227,7 +244,7 @@ bool DumpPackage(CommandLine &CmdL) 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; @@ -267,20 +284,24 @@ bool Stats(CommandLine &Cmd) 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 Distinct Descriptions: ") << Cache.Head().DescriptionCount << " (" << + SizeToStr(Cache.Head().DescriptionCount*Cache.Head().DescriptionSz) << ')' << endl; + 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 Desc/File relations: ") << Cache.Head().DescFileCount << " (" << + SizeToStr(Cache.Head().DescFileCount*Cache.Head().DescFileSz) << ')' << endl; + cout << _("Total Provides mappings: ") << Cache.Head().ProvidesCount << " (" << SizeToStr(Cache.Head().ProvidesCount*Cache.Head().ProvidesSz) << ')' << endl; // String list stats @@ -292,7 +313,7 @@ bool Stats(CommandLine &Cmd) 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++) @@ -306,12 +327,12 @@ bool Stats(CommandLine &Cmd) } } } - 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 + @@ -319,7 +340,7 @@ bool Stats(CommandLine &Cmd) 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; } @@ -342,6 +363,12 @@ bool Dump(CommandLine &Cmd) for (pkgCache::DepIterator D = V.DependsList(); D.end() == false; D++) cout << " Depends: " << D.TargetPkg().Name() << ' ' << DeNull(D.TargetVer()) << endl; + for (pkgCache::DescIterator D = V.DescriptionList(); D.end() == false; D++) + { + cout << " Description Language: " << D.LanguageCode() << endl + << " File: " << D.FileList().File().FileName() << endl + << " MD5: " << D.md5() << endl; + } } } @@ -844,6 +871,7 @@ bool XVcg(CommandLine &CmdL) then show the relation but do not recurse */ if (Hit == false && (D->Type == pkgCache::Dep::Conflicts || + D->Type == pkgCache::Dep::DpkgBreaks || D->Type == pkgCache::Dep::Obsoletes)) { if (Show[D.TargetPkg()->ID] == None && @@ -865,6 +893,9 @@ bool XVcg(CommandLine &CmdL) case pkgCache::Dep::Conflicts: printf("label: \"conflicts\" color: lightgreen }\n"); break; + case pkgCache::Dep::DpkgBreaks: + printf("label: \"breaks\" color: lightgreen }\n"); + break; case pkgCache::Dep::Obsoletes: printf("label: \"obsoletes\" color: lightgreen }\n"); break; @@ -1190,17 +1221,50 @@ bool DisplayRecord(pkgCache::VerIterator V) if (_error->PendingError() == true) return false; - // Read the record and then write it out again. + // Read the record unsigned char *Buffer = new unsigned char[GCache->HeaderP->MaxVerFileSize+1]; Buffer[V.FileList()->Size] = '\n'; if (PkgF.Seek(V.FileList()->Offset) == false || - PkgF.Read(Buffer,V.FileList()->Size) == false || - fwrite(Buffer,1,V.FileList()->Size+1,stdout) < V.FileList()->Size+1) + PkgF.Read(Buffer,V.FileList()->Size) == false) { delete [] Buffer; return false; } - + + // Get a pointer to start of Description field + const unsigned char *DescP = (unsigned char*)strstr((char*)Buffer, "Description:"); + + // Write all but Description + if (fwrite(Buffer,1,DescP - Buffer,stdout) < (size_t)(DescP - Buffer)) + { + delete [] Buffer; + return false; + } + + // Show the right description + pkgRecords Recs(*GCache); + pkgCache::DescIterator Desc = V.TranslatedDescription(); + pkgRecords::Parser &P = Recs.Lookup(Desc.FileList()); + cout << "Description" << ( (strcmp(Desc.LanguageCode(),"") != 0) ? "-" : "" ) << Desc.LanguageCode() << ": " << P.LongDesc(); + + // Find the first field after the description (if there is any) + for(DescP++;DescP != &Buffer[V.FileList()->Size];DescP++) + { + if(*DescP == '\n' && *(DescP+1) != ' ') + { + // write the rest of the buffer + const unsigned char *end=&Buffer[V.FileList()->Size]; + if (fwrite(DescP,1,end-DescP,stdout) < (size_t)(end-DescP)) + { + delete [] Buffer; + return false; + } + + break; + } + } + // write a final newline (after the description) + cout<PackageCount+1]; - memset(VFList,0,sizeof(*VFList)*Cache.HeaderP->PackageCount+1); + ExDescFile *DFList = new ExDescFile[Cache.HeaderP->PackageCount+1]; + memset(DFList,0,sizeof(*DFList)*Cache.HeaderP->PackageCount+1); // Map versions that we want to write out onto the VerList array. for (pkgCache::PkgIterator P = Cache.PkgBegin(); P.end() == false; P++) { - VFList[P->ID].NameMatch = NumPatterns != 0; + DFList[P->ID].NameMatch = NumPatterns != 0; for (unsigned I = 0; I != NumPatterns; I++) { if (regexec(&Patterns[I],P.Name(),0,0,0) == 0) - VFList[P->ID].NameMatch &= true; + DFList[P->ID].NameMatch &= true; else - VFList[P->ID].NameMatch = false; + DFList[P->ID].NameMatch = false; } // Doing names only, drop any that dont match.. - if (NamesOnly == true && VFList[P->ID].NameMatch == false) + if (NamesOnly == true && DFList[P->ID].NameMatch == false) continue; // Find the proper version to use. pkgCache::VerIterator V = Plcy.GetCandidateVer(P); if (V.end() == false) - VFList[P->ID].Vf = V.FileList(); + DFList[P->ID].Df = V.DescriptionList().FileList(); } // Include all the packages that provide matching names too for (pkgCache::PkgIterator P = Cache.PkgBegin(); P.end() == false; P++) { - if (VFList[P->ID].NameMatch == false) + if (DFList[P->ID].NameMatch == false) continue; for (pkgCache::PrvIterator Prv = P.ProvidesList() ; Prv.end() == false; Prv++) @@ -1287,18 +1351,18 @@ bool Search(CommandLine &CmdL) pkgCache::VerIterator V = Plcy.GetCandidateVer(Prv.OwnerPkg()); if (V.end() == false) { - VFList[Prv.OwnerPkg()->ID].Vf = V.FileList(); - VFList[Prv.OwnerPkg()->ID].NameMatch = true; + DFList[Prv.OwnerPkg()->ID].Df = V.DescriptionList().FileList(); + DFList[Prv.OwnerPkg()->ID].NameMatch = true; } } } - - LocalitySort(&VFList->Vf,Cache.HeaderP->PackageCount,sizeof(*VFList)); + + LocalitySort(&DFList->Df,Cache.HeaderP->PackageCount,sizeof(*DFList)); // Iterate over all the version records and check them - for (ExVerFile *J = VFList; J->Vf != 0; J++) + for (ExDescFile *J = DFList; J->Df != 0; J++) { - pkgRecords::Parser &P = Recs.Lookup(pkgCache::VerFileIterator(Cache,J->Vf)); + pkgRecords::Parser &P = Recs.Lookup(pkgCache::DescFileIterator(Cache,J->Df)); bool Match = true; if (J->NameMatch == false) @@ -1329,7 +1393,7 @@ bool Search(CommandLine &CmdL) } } - delete [] VFList; + delete [] DFList; for (unsigned I = 0; I != NumPatterns; I++) regfree(&Patterns[I]); if (ferror(stdout)) @@ -1457,7 +1521,7 @@ bool Policy(CommandLine &CmdL) // 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 @@ -1477,7 +1541,7 @@ bool Policy(CommandLine &CmdL) } // Show any packages have explicit pins - cout << _("Pinned Packages:") << endl; + cout << _("Pinned packages:") << endl; pkgCache::PkgIterator I = Cache.PkgBegin(); for (;I.end() != true; I++) { @@ -1527,7 +1591,7 @@ bool Policy(CommandLine &CmdL) // 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; @@ -1536,7 +1600,7 @@ bool Policy(CommandLine &CmdL) } // Show the priority tables - cout << _(" Version Table:") << endl; + cout << _(" Version table:") << endl; for (V = Pkg.VersionList(); V.end() == false; V++) { if (Pkg.CurrentVer() == V) @@ -1559,6 +1623,75 @@ bool Policy(CommandLine &CmdL) 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 *Indexes = (*S)->GetIndexFiles(); + for (vector::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 /*{{{*/ // --------------------------------------------------------------------- @@ -1578,8 +1711,8 @@ bool GenCaches(CommandLine &Cmd) /* */ bool ShowHelp(CommandLine &Cmd) { - ioprintf(cout,_("%s %s for %s %s compiled on %s %s\n"),PACKAGE,VERSION, - COMMON_OS,COMMON_CPU,__DATE__,__TIME__); + ioprintf(cout,_("%s %s for %s compiled on %s %s\n"),PACKAGE,VERSION, + COMMON_ARCH,__DATE__,__TIME__); if (_config->FindB("version") == true) return true; @@ -1618,7 +1751,7 @@ bool ShowHelp(CommandLine &Cmd) " -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; } @@ -1645,12 +1778,12 @@ int main(int argc,const char *argv[]) {'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}, - {'n',"installed","APT::Cache::Installed",0}, + {0,"installed","APT::Cache::Installed",0}, {0,0,0,0}}; CommandLine::Dispatch CmdsA[] = {{"help",&ShowHelp}, {"add",&DoAdd}, @@ -1670,6 +1803,7 @@ int main(int argc,const char *argv[]) {"show",&ShowPackage}, {"pkgnames",&ShowPkgNames}, {"policy",&Policy}, + {"madison",&Madison}, {0,0}}; CacheInitialize(); @@ -1697,7 +1831,7 @@ int main(int argc,const char *argv[]) } // 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)