+ pkgCache::PkgIterator iterator([package iterator]);
+ NSString *name([package id]);
+
+ if ([package broken]) {
+ NSMutableArray *reasons([NSMutableArray arrayWithCapacity:4]);
+
+ [issues_ addObject:[NSDictionary dictionaryWithObjectsAndKeys:
+ name, @"package",
+ reasons, @"reasons",
+ nil]];
+
+ pkgCache::VerIterator ver(cache[iterator].InstVerIter(cache));
+ if (ver.end())
+ continue;
+
+ for (pkgCache::DepIterator dep(ver.DependsList()); !dep.end(); ) {
+ pkgCache::DepIterator start;
+ pkgCache::DepIterator end;
+ dep.GlobOr(start, end); // ++dep
+
+ if (!cache->IsImportantDep(end))
+ continue;
+ if ((cache[end] & pkgDepCache::DepGInstall) != 0)
+ continue;
+
+ _forever {
+ NSString *reason, *installed((NSString *) [WebUndefined undefined]);
+
+ pkgCache::PkgIterator target(start.TargetPkg());
+ if (target->ProvidesList != 0)
+ reason = @"missing";
+ else {
+ pkgCache::VerIterator ver(cache[target].InstVerIter(cache));
+ if (!ver.end()) {
+ reason = @"installed";
+ installed = [NSString stringWithUTF8String:ver.VerStr()];
+ } else if (!cache[target].CandidateVerIter(cache).end())
+ reason = @"uninstalled";
+ else if (target->ProvidesList == 0)
+ reason = @"uninstallable";
+ else
+ reason = @"virtual";
+ }
+
+ NSDictionary *version(start.TargetVer() == 0 ? [NSNull null] : [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSString stringWithUTF8String:start.CompType()], @"operator",
+ [NSString stringWithUTF8String:start.TargetVer()], @"value",
+ nil]);
+
+ [reasons addObject:[NSDictionary dictionaryWithObjectsAndKeys:
+ [NSString stringWithUTF8String:start.DepType()], @"relation",
+ [NSString stringWithUTF8String:start.TargetPkg().Name()], @"package",
+ version, @"version",
+ reason, @"reason",
+ installed, @"installed",
+ nil]];
+
+ // yes, seriously. (wtf?)
+ if (start == end)
+ break;
+ ++start;
+ }
+ }
+ }
+