-// Depends - Print out a dependency tree /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-bool Depends(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 Important = _config->FindB("APT::Cache::Important",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;
-
- for (pkgCache::DepIterator D = 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();
-
- if((Installed && Trg->CurrentVer != 0) || !Installed)
- {
-
- if ((D->CompareOp & pkgCache::Dep::Or) == pkgCache::Dep::Or)
- cout << " |";
- else
- cout << " ";
-
- // 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();
- 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;
-}
- /*}}}*/