|
@@ -17,6 +17,7 @@
|
|
|
#include <cassert>
|
|
#include <cassert>
|
|
|
#include <apt-pkg/pkgcachegen.h>
|
|
#include <apt-pkg/pkgcachegen.h>
|
|
|
#include <apt-pkg/cachefile.h>
|
|
#include <apt-pkg/cachefile.h>
|
|
|
|
|
+#include <apt-pkg/cacheset.h>
|
|
|
#include <apt-pkg/init.h>
|
|
#include <apt-pkg/init.h>
|
|
|
#include <apt-pkg/progress.h>
|
|
#include <apt-pkg/progress.h>
|
|
|
#include <apt-pkg/sourcelist.h>
|
|
#include <apt-pkg/sourcelist.h>
|
|
@@ -30,8 +31,6 @@
|
|
|
#include <apt-pkg/algorithms.h>
|
|
#include <apt-pkg/algorithms.h>
|
|
|
#include <apt-pkg/sptr.h>
|
|
#include <apt-pkg/sptr.h>
|
|
|
|
|
|
|
|
-#include "cacheset.h"
|
|
|
|
|
-
|
|
|
|
|
#include <config.h>
|
|
#include <config.h>
|
|
|
#include <apti18n.h>
|
|
#include <apti18n.h>
|
|
|
|
|
|
|
@@ -552,72 +551,98 @@ bool DumpAvail(CommandLine &Cmd)
|
|
|
return !_error->PendingError();
|
|
return !_error->PendingError();
|
|
|
}
|
|
}
|
|
|
/*}}}*/
|
|
/*}}}*/
|
|
|
-// Depends - Print out a dependency tree /*{{{*/
|
|
|
|
|
-// ---------------------------------------------------------------------
|
|
|
|
|
-/* */
|
|
|
|
|
-bool Depends(CommandLine &CmdL)
|
|
|
|
|
|
|
+// ShowDepends - Helper for printing out a dependency tree /*{{{*/
|
|
|
|
|
+class CacheSetHelperDepends: public APT::CacheSetHelper {
|
|
|
|
|
+public:
|
|
|
|
|
+ APT::PackageSet virtualPkgs;
|
|
|
|
|
+
|
|
|
|
|
+ virtual pkgCache::VerIterator canNotFindCandidateVer(pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg) {
|
|
|
|
|
+ virtualPkgs.insert(Pkg);
|
|
|
|
|
+ return pkgCache::VerIterator(Cache, 0);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ virtual pkgCache::VerIterator canNotFindNewestVer(pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg) {
|
|
|
|
|
+ virtualPkgs.insert(Pkg);
|
|
|
|
|
+ return pkgCache::VerIterator(Cache, 0);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ CacheSetHelperDepends() : CacheSetHelper(false) {}
|
|
|
|
|
+};
|
|
|
|
|
+bool ShowDepends(CommandLine &CmdL, bool const RevDepends)
|
|
|
{
|
|
{
|
|
|
pkgCacheFile CacheFile;
|
|
pkgCacheFile CacheFile;
|
|
|
pkgCache *Cache = CacheFile.GetPkgCache();
|
|
pkgCache *Cache = CacheFile.GetPkgCache();
|
|
|
if (unlikely(Cache == NULL))
|
|
if (unlikely(Cache == NULL))
|
|
|
return false;
|
|
return false;
|
|
|
|
|
|
|
|
- SPtrArray<unsigned> Colours = new unsigned[Cache->Head().PackageCount];
|
|
|
|
|
- memset(Colours,0,sizeof(*Colours)*Cache->Head().PackageCount);
|
|
|
|
|
-
|
|
|
|
|
- APT::PackageSet pkgset = APT::PackageSet::FromCommandLine(CacheFile, CmdL.FileList + 1);
|
|
|
|
|
- for (APT::PackageSet::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
|
|
|
|
|
- Colours[Pkg->ID] = 1;
|
|
|
|
|
-
|
|
|
|
|
- bool Recurse = _config->FindB("APT::Cache::RecurseDepends",false);
|
|
|
|
|
- bool Installed = _config->FindB("APT::Cache::Installed",false);
|
|
|
|
|
- bool Important = _config->FindB("APT::Cache::Important",false);
|
|
|
|
|
- bool DidSomething;
|
|
|
|
|
- do
|
|
|
|
|
|
|
+ CacheSetHelperDepends helper;
|
|
|
|
|
+ APT::VersionSet verset = APT::VersionSet::FromCommandLine(CacheFile, CmdL.FileList + 1, APT::VersionSet::CANDIDATE, helper);
|
|
|
|
|
+ if (verset.empty() == true && helper.virtualPkgs.empty() == true)
|
|
|
|
|
+ return false;
|
|
|
|
|
+ std::vector<bool> Shown(Cache->Head().PackageCount);
|
|
|
|
|
+
|
|
|
|
|
+ bool const Recurse = _config->FindB("APT::Cache::RecurseDepends", false);
|
|
|
|
|
+ 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 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);
|
|
|
|
|
+ bool const ShowSuggests = _config->FindB("APT::Cache::ShowSuggests", Important == false);
|
|
|
|
|
+ bool const ShowReplaces = _config->FindB("APT::Cache::ShowReplaces", Important == false);
|
|
|
|
|
+ bool const ShowConflicts = _config->FindB("APT::Cache::ShowConflicts", Important == false);
|
|
|
|
|
+ bool const ShowBreaks = _config->FindB("APT::Cache::ShowBreaks", Important == false);
|
|
|
|
|
+ bool const ShowEnhances = _config->FindB("APT::Cache::ShowEnhances", Important == false);
|
|
|
|
|
+ bool const ShowOnlyFirstOr = _config->FindB("APT::Cache::ShowOnlyFirstOr", false);
|
|
|
|
|
+
|
|
|
|
|
+ while (verset.empty() != true)
|
|
|
{
|
|
{
|
|
|
- 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.FullName(true) << '>' << endl;
|
|
|
|
|
- continue;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
|
|
+ pkgCache::VerIterator Ver = *verset.begin();
|
|
|
|
|
+ verset.erase(verset.begin());
|
|
|
|
|
+ pkgCache::PkgIterator Pkg = Ver.ParentPkg();
|
|
|
|
|
+ Shown[Pkg->ID] = true;
|
|
|
|
|
+
|
|
|
cout << Pkg.FullName(true) << endl;
|
|
cout << Pkg.FullName(true) << endl;
|
|
|
-
|
|
|
|
|
- for (pkgCache::DepIterator D = Ver.DependsList(); D.end() == false; D++)
|
|
|
|
|
|
|
+
|
|
|
|
|
+ if (RevDepends == true)
|
|
|
|
|
+ cout << "Reverse Depends:" << endl;
|
|
|
|
|
+ for (pkgCache::DepIterator D = RevDepends ? Pkg.RevDependsList() : Ver.DependsList();
|
|
|
|
|
+ D.end() == false; D++)
|
|
|
{
|
|
{
|
|
|
- // Important deps only
|
|
|
|
|
- if (Important == true)
|
|
|
|
|
- if (D->Type != pkgCache::Dep::PreDepends &&
|
|
|
|
|
- D->Type != pkgCache::Dep::Depends)
|
|
|
|
|
- continue;
|
|
|
|
|
-
|
|
|
|
|
- pkgCache::PkgIterator Trg = D.TargetPkg();
|
|
|
|
|
|
|
+ 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::DpkgBreaks: if (!ShowBreaks) continue; break;
|
|
|
|
|
+ case pkgCache::Dep::Enhances: if (!ShowEnhances) continue; break;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ pkgCache::PkgIterator Trg = RevDepends ? D.ParentPkg() : D.TargetPkg();
|
|
|
|
|
|
|
|
if((Installed && Trg->CurrentVer != 0) || !Installed)
|
|
if((Installed && Trg->CurrentVer != 0) || !Installed)
|
|
|
{
|
|
{
|
|
|
|
|
|
|
|
- if ((D->CompareOp & pkgCache::Dep::Or) == pkgCache::Dep::Or)
|
|
|
|
|
|
|
+ if ((D->CompareOp & pkgCache::Dep::Or) == pkgCache::Dep::Or && ShowOnlyFirstOr == false)
|
|
|
cout << " |";
|
|
cout << " |";
|
|
|
else
|
|
else
|
|
|
cout << " ";
|
|
cout << " ";
|
|
|
|
|
|
|
|
// Show the package
|
|
// Show the package
|
|
|
|
|
+ if (ShowDepType == true)
|
|
|
|
|
+ cout << D.DepType() << ": ";
|
|
|
if (Trg->VersionList == 0)
|
|
if (Trg->VersionList == 0)
|
|
|
- cout << D.DepType() << ": <" << Trg.FullName(true) << ">" << endl;
|
|
|
|
|
|
|
+ cout << "<" << Trg.FullName(true) << ">" << endl;
|
|
|
else
|
|
else
|
|
|
- cout << D.DepType() << ": " << Trg.FullName(true) << endl;
|
|
|
|
|
|
|
+ cout << Trg.FullName(true) << endl;
|
|
|
|
|
|
|
|
- if (Recurse == true)
|
|
|
|
|
- Colours[D.TargetPkg()->ID]++;
|
|
|
|
|
|
|
+ if (Recurse == true && Shown[Trg->ID] == false)
|
|
|
|
|
+ {
|
|
|
|
|
+ Shown[Trg->ID] = true;
|
|
|
|
|
+ verset.insert(APT::VersionSet::FromPackage(CacheFile, Trg, APT::VersionSet::CANDIDATE, helper));
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -631,101 +656,40 @@ bool Depends(CommandLine &CmdL)
|
|
|
V->ParentPkg == D->Package)
|
|
V->ParentPkg == D->Package)
|
|
|
continue;
|
|
continue;
|
|
|
cout << " " << V.ParentPkg().FullName(true) << endl;
|
|
cout << " " << V.ParentPkg().FullName(true) << endl;
|
|
|
-
|
|
|
|
|
- if (Recurse == true)
|
|
|
|
|
- Colours[D.ParentPkg()->ID]++;
|
|
|
|
|
|
|
+
|
|
|
|
|
+ if (Recurse == true && Shown[V.ParentPkg()->ID] == false)
|
|
|
|
|
+ {
|
|
|
|
|
+ Shown[V.ParentPkg()->ID] = true;
|
|
|
|
|
+ verset.insert(APT::VersionSet::FromPackage(CacheFile, V.ParentPkg(), APT::VersionSet::CANDIDATE, helper));
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ if (ShowOnlyFirstOr == true)
|
|
|
|
|
+ while ((D->CompareOp & pkgCache::Dep::Or) == pkgCache::Dep::Or) ++D;
|
|
|
}
|
|
}
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- while (DidSomething == true);
|
|
|
|
|
-
|
|
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ for (APT::PackageSet::const_iterator Pkg = helper.virtualPkgs.begin();
|
|
|
|
|
+ Pkg != helper.virtualPkgs.end(); ++Pkg)
|
|
|
|
|
+ cout << '<' << Pkg.FullName(true) << '>' << endl;
|
|
|
|
|
+
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
/*}}}*/
|
|
/*}}}*/
|
|
|
-// RDepends - Print out a reverse dependency tree - mbc /*{{{*/
|
|
|
|
|
|
|
+// Depends - Print out a dependency tree /*{{{*/
|
|
|
|
|
+// ---------------------------------------------------------------------
|
|
|
|
|
+/* */
|
|
|
|
|
+bool Depends(CommandLine &CmdL)
|
|
|
|
|
+{
|
|
|
|
|
+ return ShowDepends(CmdL, false);
|
|
|
|
|
+}
|
|
|
|
|
+ /*}}}*/
|
|
|
|
|
+// RDepends - Print out a reverse dependency tree /*{{{*/
|
|
|
// ---------------------------------------------------------------------
|
|
// ---------------------------------------------------------------------
|
|
|
/* */
|
|
/* */
|
|
|
bool RDepends(CommandLine &CmdL)
|
|
bool RDepends(CommandLine &CmdL)
|
|
|
{
|
|
{
|
|
|
- pkgCacheFile CacheFile;
|
|
|
|
|
- pkgCache *Cache = CacheFile.GetPkgCache();
|
|
|
|
|
- if (unlikely(Cache == NULL))
|
|
|
|
|
- return false;
|
|
|
|
|
-
|
|
|
|
|
- SPtrArray<unsigned> Colours = new unsigned[Cache->Head().PackageCount];
|
|
|
|
|
- memset(Colours,0,sizeof(*Colours)*Cache->Head().PackageCount);
|
|
|
|
|
-
|
|
|
|
|
- APT::PackageSet pkgset = APT::PackageSet::FromCommandLine(CacheFile, CmdL.FileList + 1);
|
|
|
|
|
- for (APT::PackageSet::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
|
|
|
|
|
- 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.FullName(true) << '>' << endl;
|
|
|
|
|
- continue;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- cout << Pkg.FullName(true) << 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.FullName(true) << ">" << endl;
|
|
|
|
|
- else
|
|
|
|
|
- cout << Trg.FullName(true) << endl;
|
|
|
|
|
-
|
|
|
|
|
- if (Recurse == true)
|
|
|
|
|
- Colours[D.ParentPkg()->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().FullName(true) << endl;
|
|
|
|
|
-
|
|
|
|
|
- if (Recurse == true)
|
|
|
|
|
- Colours[D.ParentPkg()->ID]++;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- while (DidSomething == true);
|
|
|
|
|
-
|
|
|
|
|
- return true;
|
|
|
|
|
|
|
+ return ShowDepends(CmdL, true);
|
|
|
}
|
|
}
|
|
|
/*}}}*/
|
|
/*}}}*/
|
|
|
// xvcg - Generate a graph for xvcg /*{{{*/
|
|
// xvcg - Generate a graph for xvcg /*{{{*/
|
|
@@ -1820,6 +1784,14 @@ int main(int argc,const char *argv[]) /*{{{*/
|
|
|
{'c',"config-file",0,CommandLine::ConfigFile},
|
|
{'c',"config-file",0,CommandLine::ConfigFile},
|
|
|
{'o',"option",0,CommandLine::ArbItem},
|
|
{'o',"option",0,CommandLine::ArbItem},
|
|
|
{0,"installed","APT::Cache::Installed",0},
|
|
{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}};
|
|
{0,0,0,0}};
|
|
|
CommandLine::Dispatch CmdsA[] = {{"help",&ShowHelp},
|
|
CommandLine::Dispatch CmdsA[] = {{"help",&ShowHelp},
|
|
|
{"add",&DoAdd},
|
|
{"add",&DoAdd},
|