+ // No deps to map out
+ if (Pkg->VersionList == 0 || Show[Pkg->ID] == DoneNR)
+ continue;
+
+ pkgCache::VerIterator Ver = Pkg.VersionList();
+ 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)
+ {
+ 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)
+ {
+ if (Cache->VS->CheckDep(I.ProvideVersion(),D->CompareOp,D.TargetVer()) == false)
+ Hit = true;
+ }
+
+ // Only graph critical deps
+ if (D.IsCritical() == true)
+ {
+ printf("\"%s\" -> \"%s\"",Pkg.FullName(true).c_str(),D.TargetPkg().FullName(true).c_str());
+
+ // Colour the node for recursion
+ if (Show[D.TargetPkg()->ID] <= DoneNR)
+ {
+ /* If a conflicts does not meet anything in the database
+ then show the relation but do not recurse */
+ if (Hit == false && D.IsNegative() == true)
+ {
+ if (Show[D.TargetPkg()->ID] == None &&
+ Show[D.TargetPkg()->ID] != ToShow)
+ Show[D.TargetPkg()->ID] = ToShowNR;
+ }
+ else
+ {
+ if (GivenOnly == true && Show[D.TargetPkg()->ID] != ToShow)
+ Show[D.TargetPkg()->ID] = ToShowNR;
+ else
+ Show[D.TargetPkg()->ID] = ToShow;
+ }
+ }
+
+ // Edge colour
+ switch(D->Type)
+ {
+ case pkgCache::Dep::Conflicts:
+ case pkgCache::Dep::Obsoletes:
+ case pkgCache::Dep::DpkgBreaks:
+ printf("[color=springgreen];\n");
+ break;
+
+ case pkgCache::Dep::PreDepends:
+ printf("[color=blue];\n");
+ break;
+
+ default:
+ printf(";\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)
+ {
+ if (Show[Pkg->ID] < DoneNR)
+ continue;
+
+ // Orange box for early recursion stoppage
+ if (Show[Pkg->ID] == DoneNR)
+ printf("\"%s\" [color=orange,shape=%s];\n",Pkg.FullName(true).c_str(),
+ Shapes[ShapeMap[Pkg->ID]]);
+ else
+ printf("\"%s\" [shape=%s];\n",Pkg.FullName(true).c_str(),
+ Shapes[ShapeMap[Pkg->ID]]);
+ }
+
+ printf("}\n");
+ delete[] Show;
+ delete[] Flags;
+ delete[] ShapeMap;