##################################################################### */
/*}}}*/
// Include Files /*{{{*/
+#include<config.h>
+
#include <apt-pkg/error.h>
-#include <cassert>
-#include <apt-pkg/pkgcachegen.h>
#include <apt-pkg/cachefile.h>
#include <apt-pkg/cacheset.h>
#include <apt-pkg/init.h>
#include <apt-pkg/sourcelist.h>
#include <apt-pkg/cmndline.h>
#include <apt-pkg/strutl.h>
+#include <apt-pkg/fileutl.h>
#include <apt-pkg/pkgrecords.h>
#include <apt-pkg/srcrecords.h>
#include <apt-pkg/version.h>
#include <apt-pkg/tagfile.h>
#include <apt-pkg/algorithms.h>
#include <apt-pkg/sptr.h>
+#include <apt-pkg/pkgsystem.h>
+#include <apt-pkg/indexfile.h>
+#include <apt-pkg/metaindex.h>
-#include <config.h>
-#include <apti18n.h>
+#include <apt-private/private-list.h>
+#include <apt-private/private-cmndline.h>
+#include <apt-private/private-show.h>
+#include <apt-private/private-cacheset.h>
+#include <cassert>
#include <locale.h>
#include <iostream>
#include <unistd.h>
#include <errno.h>
#include <regex.h>
#include <stdio.h>
-
#include <iomanip>
+#include <algorithm>
+
+#include <apti18n.h>
/*}}}*/
using namespace std;
-// CacheSetHelper saving virtual packages /*{{{*/
-class CacheSetHelperVirtuals: public APT::CacheSetHelper {
-public:
- APT::PackageSet virtualPkgs;
-
- virtual pkgCache::VerIterator canNotFindCandidateVer(pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg) {
- virtualPkgs.insert(Pkg);
- return CacheSetHelper::canNotFindCandidateVer(Cache, Pkg);
- }
-
- virtual pkgCache::VerIterator canNotFindNewestVer(pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg) {
- virtualPkgs.insert(Pkg);
- return CacheSetHelper::canNotFindNewestVer(Cache, Pkg);
- }
-
- virtual APT::VersionSet canNotFindAllVer(pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg) {
- virtualPkgs.insert(Pkg);
- return CacheSetHelper::canNotFindAllVer(Cache, Pkg);
- }
-
- CacheSetHelperVirtuals(bool const &ShowErrors = true, GlobalError::MsgType const &ErrorType = GlobalError::NOTICE) : CacheSetHelper(ShowErrors, ErrorType) {}
-};
- /*}}}*/
// LocalitySort - Sort a version list by package file locality /*{{{*/
// ---------------------------------------------------------------------
/* */
// UnMet - Show unmet dependencies /*{{{*/
// ---------------------------------------------------------------------
/* */
-bool ShowUnMet(pkgCache::VerIterator const &V, bool const &Important)
+bool ShowUnMet(pkgCache::VerIterator const &V, bool const Important)
{
bool Header = false;
for (pkgCache::DepIterator D = V.DependsList(); D.end() == false;)
continue;
// Skip conflicts and replaces
- if (End->Type == pkgCache::Dep::DpkgBreaks ||
- End->Type == pkgCache::Dep::Replaces ||
- End->Type == pkgCache::Dep::Conflicts)
+ if (End.IsNegative() == true)
continue;
// Verify the or group
if (Start == End)
break;
- Start++;
+ ++Start;
}
while (1);
if (Start == End)
break;
cout << " | ";
- Start++;
+ ++Start;
}
while (1);
if (CmdL.FileSize() <= 1)
{
- for (pkgCache::PkgIterator P = CacheFile.GetPkgCache()->PkgBegin(); P.end() == false; P++)
+ for (pkgCache::PkgIterator P = CacheFile.GetPkgCache()->PkgBegin(); P.end() == false; ++P)
for (pkgCache::VerIterator V = P.VersionList(); V.end() == false; ++V)
if (ShowUnMet(V, Important) == false)
return false;
else
{
CacheSetHelperVirtuals helper(true, GlobalError::NOTICE);
- APT::VersionSet verset = APT::VersionSet::FromCommandLine(CacheFile, CmdL.FileList + 1,
- APT::VersionSet::CANDIDATE, helper);
- for (APT::VersionSet::iterator V = verset.begin(); V != verset.end(); ++V)
+ APT::VersionList verset = APT::VersionList::FromCommandLine(CacheFile, CmdL.FileList + 1,
+ APT::VersionList::CANDIDATE, helper);
+ for (APT::VersionList::iterator V = verset.begin(); V != verset.end(); ++V)
if (ShowUnMet(V, Important) == false)
return false;
}
{
pkgCacheFile CacheFile;
APT::CacheSetHelper helper(true, GlobalError::NOTICE);
- APT::PackageSet pkgset = APT::PackageSet::FromCommandLine(CacheFile, CmdL.FileList + 1, helper);
+ APT::PackageList pkgset = APT::PackageList::FromCommandLine(CacheFile, CmdL.FileList + 1, helper);
- for (APT::PackageSet::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
+ for (APT::PackageList::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
{
cout << "Package: " << Pkg.FullName(true) << endl;
cout << "Versions: " << endl;
- for (pkgCache::VerIterator Cur = Pkg.VersionList(); Cur.end() != true; Cur++)
+ for (pkgCache::VerIterator Cur = Pkg.VersionList(); Cur.end() != true; ++Cur)
{
cout << Cur.VerStr();
- for (pkgCache::VerFileIterator Vf = Cur.FileList(); Vf.end() == false; Vf++)
+ for (pkgCache::VerFileIterator Vf = Cur.FileList(); Vf.end() == false; ++Vf)
cout << " (" << Vf.File().FileName() << ")";
cout << endl;
- for (pkgCache::DescIterator D = Cur.DescriptionList(); D.end() == false; D++)
+ for (pkgCache::DescIterator D = Cur.DescriptionList(); D.end() == false; ++D)
{
cout << " Description Language: " << D.LanguageCode() << endl
<< " File: " << D.FileList().File().FileName() << endl
cout << endl;
cout << "Reverse Depends: " << endl;
- for (pkgCache::DepIterator D = Pkg.RevDependsList(); D.end() != true; D++)
+ for (pkgCache::DepIterator D = Pkg.RevDependsList(); D.end() != true; ++D)
{
cout << " " << D.ParentPkg().FullName(true) << ',' << D.TargetPkg().FullName(true);
if (D->Version != 0)
}
cout << "Dependencies: " << endl;
- for (pkgCache::VerIterator Cur = Pkg.VersionList(); Cur.end() != true; Cur++)
+ for (pkgCache::VerIterator Cur = Pkg.VersionList(); Cur.end() != true; ++Cur)
{
cout << Cur.VerStr() << " - ";
- for (pkgCache::DepIterator Dep = Cur.DependsList(); Dep.end() != true; Dep++)
+ for (pkgCache::DepIterator Dep = Cur.DependsList(); Dep.end() != true; ++Dep)
cout << Dep.TargetPkg().FullName(true) << " (" << (int)Dep->CompareOp << " " << DeNull(Dep.TargetVer()) << ") ";
cout << endl;
}
cout << "Provides: " << endl;
- for (pkgCache::VerIterator Cur = Pkg.VersionList(); Cur.end() != true; Cur++)
+ for (pkgCache::VerIterator Cur = Pkg.VersionList(); Cur.end() != true; ++Cur)
{
cout << Cur.VerStr() << " - ";
- for (pkgCache::PrvIterator Prv = Cur.ProvidesList(); Prv.end() != true; Prv++)
+ for (pkgCache::PrvIterator Prv = Cur.ProvidesList(); Prv.end() != true; ++Prv)
cout << Prv.ParentPkg().FullName(true) << " ";
cout << endl;
}
cout << "Reverse Provides: " << endl;
- for (pkgCache::PrvIterator Prv = Pkg.ProvidesList(); Prv.end() != true; Prv++)
+ for (pkgCache::PrvIterator Prv = Pkg.ProvidesList(); Prv.end() != true; ++Prv)
cout << Prv.OwnerPkg().FullName(true) << " " << Prv.OwnerVer().VerStr() << endl;
}
int DVirt = 0;
int Missing = 0;
pkgCache::PkgIterator I = Cache->PkgBegin();
- for (;I.end() != true; I++)
+ for (;I.end() != true; ++I)
{
if (I->VersionList != 0 && I->ProvidesList == 0)
{
cout << _("Total globbed strings: ") << Count << " (" << SizeToStr(Size) << ')' << endl;
unsigned long DepVerSize = 0;
- for (pkgCache::PkgIterator P = Cache->PkgBegin(); P.end() == false; P++)
+ for (pkgCache::PkgIterator P = Cache->PkgBegin(); P.end() == false; ++P)
{
- for (pkgCache::VerIterator V = P.VersionList(); V.end() == false; V++)
+ for (pkgCache::VerIterator V = P.VersionList(); V.end() == false; ++V)
{
- for (pkgCache::DepIterator D = V.DependsList(); D.end() == false; D++)
+ for (pkgCache::DepIterator D = V.DependsList(); D.end() == false; ++D)
{
if (D->Version != 0)
DepVerSize += strlen(D.TargetVer()) + 1;
if (unlikely(Cache == NULL))
return false;
- cout << "Using Versioning System: " << Cache->VS->Label << endl;
+ std::cout << "Using Versioning System: " << Cache->VS->Label << std::endl;
- for (pkgCache::PkgIterator P = Cache->PkgBegin(); P.end() == false; P++)
+ for (pkgCache::PkgIterator P = Cache->PkgBegin(); P.end() == false; ++P)
{
- cout << "Package: " << P.FullName(true) << endl;
- for (pkgCache::VerIterator V = P.VersionList(); V.end() == false; V++)
+ std::cout << "Package: " << P.FullName(true) << std::endl;
+ for (pkgCache::VerIterator V = P.VersionList(); V.end() == false; ++V)
{
- cout << " Version: " << V.VerStr() << endl;
- cout << " File: " << V.FileList().File().FileName() << endl;
- for (pkgCache::DepIterator D = V.DependsList(); D.end() == false; D++)
- cout << " Depends: " << D.TargetPkg().FullName(true) << ' ' <<
- DeNull(D.TargetVer()) << endl;
- for (pkgCache::DescIterator D = V.DescriptionList(); D.end() == false; D++)
+ std::cout << " Version: " << V.VerStr() << std::endl;
+ std::cout << " File: " << V.FileList().File().FileName() << std::endl;
+ for (pkgCache::DepIterator D = V.DependsList(); D.end() == false; ++D)
+ std::cout << " Depends: " << D.TargetPkg().FullName(true) << ' ' <<
+ DeNull(D.TargetVer()) << std::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;
+ std::cout << " Description Language: " << D.LanguageCode() << std::endl
+ << " File: " << D.FileList().File().FileName() << std::endl
+ << " MD5: " << D.md5() << std::endl;
}
}
}
- for (pkgCache::PkgFileIterator F = Cache->FileBegin(); F.end() == false; F++)
+ for (pkgCache::PkgFileIterator F = Cache->FileBegin(); F.end() == false; ++F)
{
- cout << "File: " << F.FileName() << endl;
- cout << " Type: " << F.IndexType() << endl;
- cout << " Size: " << F->Size << endl;
- cout << " ID: " << F->ID << endl;
- cout << " Flags: " << F->Flags << endl;
- cout << " Time: " << TimeRFC1123(F->mtime) << endl;
- cout << " Archive: " << DeNull(F.Archive()) << endl;
- cout << " Component: " << DeNull(F.Component()) << endl;
- cout << " Version: " << DeNull(F.Version()) << endl;
- cout << " Origin: " << DeNull(F.Origin()) << endl;
- cout << " Site: " << DeNull(F.Site()) << endl;
- cout << " Label: " << DeNull(F.Label()) << endl;
- cout << " Architecture: " << DeNull(F.Architecture()) << endl;
+ std::cout << "File: " << F.FileName() << std::endl;
+ std::cout << " Type: " << F.IndexType() << std::endl;
+ std::cout << " Size: " << F->Size << std::endl;
+ std::cout << " ID: " << F->ID << std::endl;
+ std::cout << " Flags: " << F->Flags << std::endl;
+ std::cout << " Time: " << TimeRFC1123(F->mtime) << std::endl;
+ std::cout << " Archive: " << DeNull(F.Archive()) << std::endl;
+ std::cout << " Component: " << DeNull(F.Component()) << std::endl;
+ std::cout << " Version: " << DeNull(F.Version()) << std::endl;
+ std::cout << " Origin: " << DeNull(F.Origin()) << std::endl;
+ std::cout << " Site: " << DeNull(F.Site()) << std::endl;
+ std::cout << " Label: " << DeNull(F.Label()) << std::endl;
+ std::cout << " Architecture: " << DeNull(F.Architecture()) << std::endl;
}
return true;
memset(VFList,0,sizeof(*VFList)*Count);
// Map versions that we want to write out onto the VerList array.
- for (pkgCache::PkgIterator P = Cache->PkgBegin(); P.end() == false; P++)
+ for (pkgCache::PkgIterator P = Cache->PkgBegin(); P.end() == false; ++P)
{
if (P->VersionList == 0)
continue;
}
pkgCache::VerFileIterator VF = V.FileList();
- for (; VF.end() == false ; VF++)
+ for (; VF.end() == false ; ++VF)
if ((VF.File()->Flags & pkgCache::Flag::NotSource) == 0)
break;
handling works OK. */
if (VF.end() == true)
{
- for (pkgCache::VerIterator Cur = P.VersionList(); Cur.end() != true; Cur++)
+ for (pkgCache::VerIterator Cur = P.VersionList(); Cur.end() != true; ++Cur)
{
- for (VF = Cur.FileList(); VF.end() == false; VF++)
+ for (VF = Cur.FileList(); VF.end() == false; ++VF)
{
if ((VF.File()->Flags & pkgCache::Flag::NotSource) == 0)
{
return false;
CacheSetHelperVirtuals helper(false);
- APT::VersionSet verset = APT::VersionSet::FromCommandLine(CacheFile, CmdL.FileList + 1, APT::VersionSet::CANDIDATE, helper);
+ APT::VersionList verset = APT::VersionList::FromCommandLine(CacheFile, CmdL.FileList + 1, APT::VersionList::CANDIDATE, helper);
if (verset.empty() == true && helper.virtualPkgs.empty() == true)
return _error->Error(_("No packages found"));
std::vector<bool> Shown(Cache->Head().PackageCount);
bool const Installed = _config->FindB("APT::Cache::Installed", false);
bool const Important = _config->FindB("APT::Cache::Important", false);
bool const ShowDepType = _config->FindB("APT::Cache::ShowDependencyType", RevDepends == false);
+ bool const ShowVersion = _config->FindB("APT::Cache::ShowVersion", false);
bool const ShowPreDepends = _config->FindB("APT::Cache::ShowPre-Depends", true);
bool const ShowDepends = _config->FindB("APT::Cache::ShowDepends", true);
bool const ShowRecommends = _config->FindB("APT::Cache::ShowRecommends", Important == false);
if (RevDepends == true)
cout << "Reverse Depends:" << endl;
for (pkgCache::DepIterator D = RevDepends ? Pkg.RevDependsList() : Ver.DependsList();
- D.end() == false; D++)
+ D.end() == false; ++D)
{
switch (D->Type) {
case pkgCache::Dep::PreDepends: if (!ShowPreDepends) continue; break;
case pkgCache::Dep::Depends: if (!ShowDepends) continue; break;
case pkgCache::Dep::Recommends: if (!ShowRecommends) continue; break;
case pkgCache::Dep::Suggests: if (!ShowSuggests) continue; break;
- case pkgCache::Dep::Replaces: if (!ShowReplaces) continue; break;
- case pkgCache::Dep::Conflicts: if (!ShowConflicts) continue; break;
+ case pkgCache::Dep::Replaces: if (!ShowReplaces) continue; break; case pkgCache::Dep::Conflicts: if (!ShowConflicts) continue; break;
case pkgCache::Dep::DpkgBreaks: if (!ShowBreaks) continue; break;
case pkgCache::Dep::Enhances: if (!ShowEnhances) continue; break;
}
if (ShowDepType == true)
cout << D.DepType() << ": ";
if (Trg->VersionList == 0)
- cout << "<" << Trg.FullName(true) << ">" << endl;
+ cout << "<" << Trg.FullName(true) << ">";
else
- cout << Trg.FullName(true) << endl;
-
+ cout << Trg.FullName(true);
+ if (ShowVersion == true && D->Version != 0)
+ cout << " (" << pkgCache::CompTypeDeb(D->CompareOp) << ' ' << D.TargetVer() << ')';
+ cout << std::endl;
+
if (Recurse == true && Shown[Trg->ID] == false)
{
Shown[Trg->ID] = true;
memset(Flags,0,sizeof(*Flags)*Cache->Head().PackageCount);
// Map the shapes
- for (pkgCache::PkgIterator Pkg = Cache->PkgBegin(); Pkg.end() == false; Pkg++)
+ for (pkgCache::PkgIterator Pkg = Cache->PkgBegin(); Pkg.end() == false; ++Pkg)
{
if (Pkg->VersionList == 0)
{
while (Act == true)
{
Act = false;
- for (pkgCache::PkgIterator Pkg = Cache->PkgBegin(); Pkg.end() == false; Pkg++)
+ for (pkgCache::PkgIterator Pkg = Cache->PkgBegin(); Pkg.end() == false; ++Pkg)
{
// See we need to show this package
if (Show[Pkg->ID] == None || Show[Pkg->ID] >= DoneNR)
continue;
pkgCache::VerIterator Ver = Pkg.VersionList();
- for (pkgCache::DepIterator D = Ver.DependsList(); D.end() == false; D++)
+ for (pkgCache::DepIterator D = Ver.DependsList(); D.end() == false; ++D)
{
// See if anything can meet this dep
// Walk along the actual package providing versions
bool Hit = false;
pkgCache::PkgIterator DPkg = D.TargetPkg();
for (pkgCache::VerIterator I = DPkg.VersionList();
- I.end() == false && Hit == false; I++)
+ I.end() == false && Hit == false; ++I)
{
if (Cache->VS->CheckDep(I.VerStr(),D->CompareOp,D.TargetVer()) == true)
Hit = true;
// Follow all provides
for (pkgCache::PrvIterator I = DPkg.ProvidesList();
- I.end() == false && Hit == false; I++)
+ I.end() == false && Hit == false; ++I)
{
if (Cache->VS->CheckDep(I.ProvideVersion(),D->CompareOp,D.TargetVer()) == false)
Hit = true;
{
/* If a conflicts does not meet anything in the database
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 (Hit == false && D.IsNegative() == true)
{
if (Show[D.TargetPkg()->ID] == None &&
Show[D.TargetPkg()->ID] != ToShow)
/* Draw the box colours after the fact since we can not tell what colour
they should be until everything is finished drawing */
- for (pkgCache::PkgIterator Pkg = Cache->PkgBegin(); Pkg.end() == false; Pkg++)
+ for (pkgCache::PkgIterator Pkg = Cache->PkgBegin(); Pkg.end() == false; ++Pkg)
{
if (Show[Pkg->ID] < DoneNR)
continue;
memset(Flags,0,sizeof(*Flags)*Cache->Head().PackageCount);
// Map the shapes
- for (pkgCache::PkgIterator Pkg = Cache->PkgBegin(); Pkg.end() == false; Pkg++)
+ for (pkgCache::PkgIterator Pkg = Cache->PkgBegin(); Pkg.end() == false; ++Pkg)
{
if (Pkg->VersionList == 0)
{
while (Act == true)
{
Act = false;
- for (pkgCache::PkgIterator Pkg = Cache->PkgBegin(); Pkg.end() == false; Pkg++)
+ for (pkgCache::PkgIterator Pkg = Cache->PkgBegin(); Pkg.end() == false; ++Pkg)
{
// See we need to show this package
if (Show[Pkg->ID] == None || Show[Pkg->ID] >= DoneNR)
continue;
pkgCache::VerIterator Ver = Pkg.VersionList();
- for (pkgCache::DepIterator D = Ver.DependsList(); D.end() == false; D++)
+ for (pkgCache::DepIterator D = Ver.DependsList(); D.end() == false; ++D)
{
// See if anything can meet this dep
// Walk along the actual package providing versions
bool Hit = false;
pkgCache::PkgIterator DPkg = D.TargetPkg();
for (pkgCache::VerIterator I = DPkg.VersionList();
- I.end() == false && Hit == false; I++)
+ I.end() == false && Hit == false; ++I)
{
if (Cache->VS->CheckDep(I.VerStr(),D->CompareOp,D.TargetVer()) == true)
Hit = true;
// Follow all provides
for (pkgCache::PrvIterator I = DPkg.ProvidesList();
- I.end() == false && Hit == false; I++)
+ I.end() == false && Hit == false; ++I)
{
if (Cache->VS->CheckDep(I.ProvideVersion(),D->CompareOp,D.TargetVer()) == false)
Hit = true;
{
/* If a conflicts does not meet anything in the database
then show the relation but do not recurse */
- if (Hit == false &&
- (D->Type == pkgCache::Dep::Conflicts ||
- D->Type == pkgCache::Dep::Obsoletes))
+ if (Hit == false && D.IsNegative() == true)
{
if (Show[D.TargetPkg()->ID] == None &&
Show[D.TargetPkg()->ID] != ToShow)
{
case pkgCache::Dep::Conflicts:
case pkgCache::Dep::Obsoletes:
+ case pkgCache::Dep::DpkgBreaks:
printf("[color=springgreen];\n");
break;
/* Draw the box colours after the fact since we can not tell what colour
they should be until everything is finished drawing */
- for (pkgCache::PkgIterator Pkg = Cache->PkgBegin(); Pkg.end() == false; Pkg++)
+ for (pkgCache::PkgIterator Pkg = Cache->PkgBegin(); Pkg.end() == false; ++Pkg)
{
if (Show[Pkg->ID] < DoneNR)
continue;
// ---------------------------------------------------------------------
/* This displays the package record from the proper package index file.
It is not used by DumpAvail for performance reasons. */
+
+static unsigned char const* skipDescriptionFields(unsigned char const * DescP)
+{
+ char const * const TagName = "\nDescription";
+ size_t const TagLen = strlen(TagName);
+ while ((DescP = (unsigned char*)strchr((char*)DescP, '\n')) != NULL)
+ {
+ if (DescP[1] == ' ')
+ DescP += 2;
+ else if (strncmp((char*)DescP, TagName, TagLen) == 0)
+ DescP += TagLen;
+ else
+ break;
+ }
+ if (DescP != NULL)
+ ++DescP;
+ return DescP;
+}
bool DisplayRecord(pkgCacheFile &CacheFile, pkgCache::VerIterator V)
{
pkgCache *Cache = CacheFile.GetPkgCache();
// Find an appropriate file
pkgCache::VerFileIterator Vf = V.FileList();
- for (; Vf.end() == false; Vf++)
+ for (; Vf.end() == false; ++Vf)
if ((Vf.File()->Flags & pkgCache::Flag::NotSource) == 0)
break;
if (Vf.end() == true)
return _error->Error(_("Package file %s is out of sync."),I.FileName());
FileFd PkgF;
- if (PkgF.Open(I.FileName(), FileFd::ReadOnlyGzip) == false)
+ if (PkgF.Open(I.FileName(), FileFd::ReadOnly, FileFd::Extension) == false)
return false;
- // Read the record
- unsigned char *Buffer = new unsigned char[Cache->HeaderP->MaxVerFileSize+1];
- Buffer[V.FileList()->Size] = '\n';
- if (PkgF.Seek(V.FileList()->Offset) == false ||
- PkgF.Read(Buffer,V.FileList()->Size) == false)
+ // Read the record (and ensure that it ends with a newline and NUL)
+ unsigned char *Buffer = new unsigned char[Cache->HeaderP->MaxVerFileSize+2];
+ Buffer[Vf->Size] = '\n';
+ Buffer[Vf->Size+1] = '\0';
+ if (PkgF.Seek(Vf->Offset) == false ||
+ PkgF.Read(Buffer,Vf->Size) == false)
{
delete [] Buffer;
return false;
}
// Get a pointer to start of Description field
- const unsigned char *DescP = (unsigned char*)strstr((char*)Buffer, "Description:");
+ const unsigned char *DescP = (unsigned char*)strstr((char*)Buffer, "\nDescription");
+ if (DescP != NULL)
+ ++DescP;
+ else
+ DescP = Buffer + Vf->Size;
// Write all but Description
- if (fwrite(Buffer,1,DescP - Buffer,stdout) < (size_t)(DescP - Buffer))
+ size_t const length = DescP - Buffer;
+ if (length != 0 && FileFd::Write(STDOUT_FILENO, Buffer, length) == false)
{
delete [] Buffer;
return false;
// Show the right description
pkgRecords Recs(*Cache);
pkgCache::DescIterator Desc = V.TranslatedDescription();
- pkgRecords::Parser &P = Recs.Lookup(Desc.FileList());
- cout << "Description" << ( (strcmp(Desc.LanguageCode(),"") != 0) ? "-" : "" ) << Desc.LanguageCode() << ": " << P.LongDesc();
+ if (Desc.end() == false)
+ {
+ pkgRecords::Parser &P = Recs.Lookup(Desc.FileList());
+ cout << "Description" << ( (strcmp(Desc.LanguageCode(),"") != 0) ? "-" : "" ) << Desc.LanguageCode() << ": " << P.LongDesc();
+ cout << std::endl << "Description-md5: " << Desc.md5() << std::endl;
- // Find the first field after the description (if there is any)
- for(DescP++;DescP != &Buffer[V.FileList()->Size];DescP++)
+ // Find the first field after the description (if there is any)
+ DescP = skipDescriptionFields(DescP);
+ }
+ // else we have no translation, so we found a lonely Description-md5 -> don't skip it
+
+ // write the rest of the buffer, but skip mixed in Descriptions* fields
+ while (DescP != NULL)
{
- if(*DescP == '\n' && *(DescP+1) != ' ')
+ const unsigned char * const Start = DescP;
+ const unsigned char *End = (unsigned char*)strstr((char*)DescP, "\nDescription");
+ if (End == NULL)
{
- // 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;
+ End = &Buffer[Vf->Size];
+ DescP = NULL;
+ }
+ else
+ {
+ ++End; // get the newline into the output
+ DescP = skipDescriptionFields(End + strlen("Description"));
+ }
+ size_t const length = End - Start;
+ if (length != 0 && FileFd::Write(STDOUT_FILENO, Start, length) == false)
+ {
+ delete [] Buffer;
+ return false;
}
}
- // write a final newline (after the description)
+
+ // write a final newline after the last field
cout<<endl;
- delete [] Buffer;
+ delete [] Buffer;
return true;
}
/*}}}*/
-
struct ExDescFile
{
pkgCache::DescFile *Df;
- bool NameMatch;
+ map_ptrloc ID;
};
// Search - Perform a search /*{{{*/
return false;
}
- ExDescFile *DFList = new ExDescFile[Cache->HeaderP->GroupCount+1];
- memset(DFList,0,sizeof(*DFList)*Cache->HeaderP->GroupCount+1);
+ size_t const descCount = Cache->HeaderP->GroupCount + 1;
+ ExDescFile *DFList = new ExDescFile[descCount];
+ memset(DFList,0,sizeof(*DFList) * descCount);
+
+ bool PatternMatch[descCount * NumPatterns];
+ memset(PatternMatch,false,sizeof(PatternMatch));
// Map versions that we want to write out onto the VerList array.
for (pkgCache::GrpIterator G = Cache->GrpBegin(); G.end() == false; ++G)
{
- if (DFList[G->ID].NameMatch == true)
- continue;
-
- DFList[G->ID].NameMatch = true;
- for (unsigned I = 0; I != NumPatterns; I++)
+ size_t const PatternOffset = G->ID * NumPatterns;
+ size_t unmatched = 0, matched = 0;
+ for (unsigned I = 0; I < NumPatterns; ++I)
{
- if (regexec(&Patterns[I],G.Name(),0,0,0) == 0)
- continue;
- DFList[G->ID].NameMatch = false;
- break;
+ if (PatternMatch[PatternOffset + I] == true)
+ ++matched;
+ else if (regexec(&Patterns[I],G.Name(),0,0,0) == 0)
+ PatternMatch[PatternOffset + I] = true;
+ else
+ ++unmatched;
}
-
- // Doing names only, drop any that dont match..
- if (NamesOnly == true && DFList[G->ID].NameMatch == false)
+
+ // already dealt with this package?
+ if (matched == NumPatterns)
continue;
-
+
+ // Doing names only, drop any that don't match..
+ if (NamesOnly == true && unmatched == NumPatterns)
+ continue;
+
// Find the proper version to use
pkgCache::PkgIterator P = G.FindPreferredPkg();
if (P.end() == true)
continue;
pkgCache::VerIterator V = Plcy->GetCandidateVer(P);
if (V.end() == false)
- DFList[G->ID].Df = V.TranslatedDescription().FileList();
+ {
+ pkgCache::DescIterator const D = V.TranslatedDescription();
+ //FIXME: packages without a description can't be found
+ if (D.end() == true)
+ continue;
+ DFList[G->ID].Df = D.FileList();
+ DFList[G->ID].ID = G->ID;
+ }
- if (DFList[G->ID].NameMatch == false)
+ if (unmatched == NumPatterns)
continue;
// Include all the packages that provide matching names too
- for (pkgCache::PrvIterator Prv = P.ProvidesList() ; Prv.end() == false; Prv++)
+ for (pkgCache::PrvIterator Prv = P.ProvidesList() ; Prv.end() == false; ++Prv)
{
pkgCache::VerIterator V = Plcy->GetCandidateVer(Prv.OwnerPkg());
if (V.end() == true)
continue;
unsigned long id = Prv.OwnerPkg().Group()->ID;
- DFList[id].Df = V.TranslatedDescription().FileList();
- DFList[id].NameMatch = true;
+ pkgCache::DescIterator const D = V.TranslatedDescription();
+ //FIXME: packages without a description can't be found
+ if (D.end() == true)
+ continue;
+ DFList[id].Df = D.FileList();
+ DFList[id].ID = id;
+
+ size_t const PrvPatternOffset = id * NumPatterns;
+ for (unsigned I = 0; I < NumPatterns; ++I)
+ PatternMatch[PrvPatternOffset + I] = PatternMatch[PatternOffset + I];
}
}
-
+
LocalitySort(&DFList->Df,Cache->HeaderP->GroupCount,sizeof(*DFList));
// Create the text record parser
pkgRecords Recs(*Cache);
// Iterate over all the version records and check them
- for (ExDescFile *J = DFList; J->Df != 0; J++)
+ for (ExDescFile *J = DFList; J->Df != 0; ++J)
{
pkgRecords::Parser &P = Recs.Lookup(pkgCache::DescFileIterator(*Cache,J->Df));
+ size_t const PatternOffset = J->ID * NumPatterns;
- if (J->NameMatch == false && NamesOnly == false)
+ if (NamesOnly == false)
{
string const LongDesc = P.LongDesc();
- J->NameMatch = true;
- for (unsigned I = 0; I != NumPatterns; I++)
+ for (unsigned I = 0; I < NumPatterns; ++I)
{
- if (regexec(&Patterns[I],LongDesc.c_str(),0,0,0) == 0)
+ if (PatternMatch[PatternOffset + I] == true)
continue;
- J->NameMatch = false;
- break;
+ else if (regexec(&Patterns[I],LongDesc.c_str(),0,0,0) == 0)
+ PatternMatch[PatternOffset + I] = true;
}
}
-
- if (J->NameMatch == true)
+
+ bool matchedAll = true;
+ for (unsigned I = 0; I < NumPatterns; ++I)
+ if (PatternMatch[PatternOffset + I] == false)
+ {
+ matchedAll = false;
+ break;
+ }
+
+ if (matchedAll == true)
{
if (ShowFull == true)
{
std::vector<string> packages;
packages.reserve(Cache->HeaderP->PackageCount / 3);
- for (pkgCache::PkgIterator P = Cache->PkgBegin(); P.end() == false; P++)
+ for (pkgCache::PkgIterator P = Cache->PkgBegin(); P.end() == false; ++P)
if ((*DepCache)[P].Flags & pkgCache::Flag::Auto)
packages.push_back(P.Name());
std::sort(packages.begin(), packages.end());
- for (vector<string>::iterator I = packages.begin(); I != packages.end(); I++)
+ for (vector<string>::iterator I = packages.begin(); I != packages.end(); ++I)
cout << *I << "\n";
_error->Notice(_("This command is deprecated. Please use 'apt-mark showauto' instead."));
{
pkgCacheFile CacheFile;
CacheSetHelperVirtuals helper(true, GlobalError::NOTICE);
- APT::VersionSet::Version const select = _config->FindB("APT::Cache::AllVersions", true) ?
- APT::VersionSet::ALL : APT::VersionSet::CANDIDATE;
- APT::VersionSet const verset = APT::VersionSet::FromCommandLine(CacheFile, CmdL.FileList + 1, select, helper);
- for (APT::VersionSet::const_iterator Ver = verset.begin(); Ver != verset.end(); ++Ver)
+ APT::VersionList::Version const select = _config->FindB("APT::Cache::AllVersions", true) ?
+ APT::VersionList::ALL : APT::VersionList::CANDIDATE;
+ APT::VersionList const verset = APT::VersionList::FromCommandLine(CacheFile, CmdL.FileList + 1, select, helper);
+ for (APT::VersionList::const_iterator Ver = verset.begin(); Ver != verset.end(); ++Ver)
if (DisplayRecord(CacheFile, Ver) == false)
return false;
if (CmdL.FileList[1] != 0)
{
- for (;I.end() != true; I++)
+ for (;I.end() != true; ++I)
{
if (All == false && I->FirstPackage == 0)
continue;
}
// Show all pkgs
- for (;I.end() != true; I++)
+ for (;I.end() != true; ++I)
{
if (All == false && I->FirstPackage == 0)
continue;
if (CmdL.FileList[1] == 0)
{
cout << _("Package files:") << endl;
- for (pkgCache::PkgFileIterator F = Cache->FileBegin(); F.end() == false; F++)
+ for (pkgCache::PkgFileIterator F = Cache->FileBegin(); F.end() == false; ++F)
{
// Locate the associated index files so we can derive a description
pkgIndexFile *Indx;
// Show any packages have explicit pins
cout << _("Pinned packages:") << endl;
pkgCache::PkgIterator I = Cache->PkgBegin();
- for (;I.end() != true; I++)
+ for (;I.end() != true; ++I)
{
if (Plcy->GetPriority(I) == 0)
continue;
// Print out detailed information for each package
APT::CacheSetHelper helper(true, GlobalError::NOTICE);
- APT::PackageSet pkgset = APT::PackageSet::FromCommandLine(CacheFile, CmdL.FileList + 1, helper);
- for (APT::PackageSet::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
+ APT::PackageList pkgset = APT::PackageList::FromCommandLine(CacheFile, CmdL.FileList + 1, helper);
+ for (APT::PackageList::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
{
cout << Pkg.FullName(true) << ":" << endl;
// Show the priority tables
cout << _(" Version table:") << endl;
- for (V = Pkg.VersionList(); V.end() == false; V++)
+ for (V = Pkg.VersionList(); V.end() == false; ++V)
{
if (Pkg.CurrentVer() == V)
cout << " *** " << V.VerStr();
else
cout << " " << V.VerStr();
cout << " " << Plcy->GetPriority(Pkg) << endl;
- for (pkgCache::VerFileIterator VF = V.FileList(); VF.end() == false; VF++)
+ for (pkgCache::VerFileIterator VF = V.FileList(); VF.end() == false; ++VF)
{
// Locate the associated index files so we can derive a description
pkgIndexFile *Indx;
for (const char **I = CmdL.FileList + 1; *I != 0; I++)
{
_error->PushToStack();
- APT::PackageSet pkgset = APT::PackageSet::FromString(CacheFile, *I, helper);
- for (APT::PackageSet::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
+ APT::PackageList pkgset = APT::PackageList::FromString(CacheFile, *I, helper);
+ for (APT::PackageList::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
{
- for (pkgCache::VerIterator V = Pkg.VersionList(); V.end() == false; V++)
+ for (pkgCache::VerIterator V = Pkg.VersionList(); V.end() == false; ++V)
{
- for (pkgCache::VerFileIterator VF = V.FileList(); VF.end() == false; VF++)
+ 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)
// }
// Locate the associated index files so we can derive a description
- for (pkgSourceList::const_iterator S = SrcList->begin(); S != SrcList->end(); S++)
+ 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 != Indexes->end(); ++IF)
{
if ((*IF)->FindInCache(*(VF.File().Cache())) == VF.File())
{
/* */
bool ShowHelp(CommandLine &Cmd)
{
- ioprintf(cout,_("%s %s for %s compiled on %s %s\n"),PACKAGE,VERSION,
+ ioprintf(cout,_("%s %s for %s compiled on %s %s\n"),PACKAGE,PACKAGE_VERSION,
COMMON_ARCH,__DATE__,__TIME__);
if (_config->FindB("version") == true)
/*}}}*/
int main(int argc,const char *argv[]) /*{{{*/
{
- CommandLine::Args Args[] = {
- {'h',"help","help",0},
- {'v',"version","version",0},
- {'p',"pkg-cache","Dir::Cache::pkgcache",CommandLine::HasArg},
- {'s',"src-cache","Dir::Cache::srcpkgcache",CommandLine::HasArg},
- {'q',"quiet","quiet",CommandLine::IntLevel},
- {'i',"important","APT::Cache::Important",0},
- {'f',"full","APT::Cache::ShowFull",0},
- {'g',"generate","APT::Cache::Generate",0},
- {'a',"all-versions","APT::Cache::AllVersions",0},
- {'n',"names-only","APT::Cache::NamesOnly",0},
- {0,"all-names","APT::Cache::AllNames",0},
- {0,"recurse","APT::Cache::RecurseDepends",0},
- {'t',"target-release","APT::Default-Release",CommandLine::HasArg},
- {'t',"default-release","APT::Default-Release",CommandLine::HasArg},
- {'c',"config-file",0,CommandLine::ConfigFile},
- {'o',"option",0,CommandLine::ArbItem},
- {0,"installed","APT::Cache::Installed",0},
- {0,"pre-depends","APT::Cache::ShowPreDepends",0},
- {0,"depends","APT::Cache::ShowDepends",0},
- {0,"recommends","APT::Cache::ShowRecommends",0},
- {0,"suggests","APT::Cache::ShowSuggests",0},
- {0,"replaces","APT::Cache::ShowReplaces",0},
- {0,"breaks","APT::Cache::ShowBreaks",0},
- {0,"conflicts","APT::Cache::ShowConflicts",0},
- {0,"enhances","APT::Cache::ShowEnhances",0},
- {0,0,0,0}};
- CommandLine::Dispatch CmdsA[] = {{"help",&ShowHelp},
+ CommandLine::Dispatch Cmds[] = {{"help",&ShowHelp},
{"gencaches",&GenCaches},
{"showsrc",&ShowSrcPackage},
- {0,0}};
- CommandLine::Dispatch CmdsB[] = {{"showpkg",&DumpPackage},
+ {"showpkg",&DumpPackage},
{"stats",&Stats},
{"dump",&Dump},
{"dumpavail",&DumpAvail},
{"madison",&Madison},
{0,0}};
+ std::vector<CommandLine::Args> Args = getCommandArgs("apt-cache", CommandLine::GetCommand(Cmds, argc, argv));
+
// Set up gettext support
setlocale(LC_ALL,"");
textdomain(PACKAGE);
// Parse the command line and initialize the package library
- CommandLine CmdL(Args,_config);
+ CommandLine CmdL(Args.data(),_config);
if (pkgInitConfig(*_config) == false ||
CmdL.Parse(argc,argv) == false ||
pkgInitSystem(*_config,_system) == false)
if (_config->Exists("APT::Cache::Generate") == true)
_config->Set("pkgCacheFile::Generate", _config->FindB("APT::Cache::Generate", true));
- if (CmdL.DispatchArg(CmdsA,false) == false && _error->PendingError() == false)
- CmdL.DispatchArg(CmdsB);
+ // Match the operation
+ CmdL.DispatchArg(Cmds);
// Print any errors or warnings found during parsing
bool const Errors = _error->PendingError();