From 49048579e861fc02937c97d56a9d9f526d6d36b6 Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Fri, 14 Mar 2008 05:58:45 +0000 Subject: If a dependency is broken, don't install the package. (Also, if a package is Essential, it's pretty much an upgrade.) --- Cydia.mm | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++------- makefile | 3 +++ 2 files changed, 60 insertions(+), 7 deletions(-) diff --git a/Cydia.mm b/Cydia.mm index 53e94b1..0102f34 100644 --- a/Cydia.mm +++ b/Cydia.mm @@ -56,6 +56,10 @@ while (false) @end /* }}} */ +#ifdef SRK_ASPEN +#define UITable UITableView +#endif + /* Reset View (UIView) {{{ */ @interface UIView (CYResetView) - (void) resetViewAnimated:(BOOL)animated; @@ -475,6 +479,7 @@ inline float interpolate(float begin, float end, float fraction) { pkgSourceList *list_; NSMutableDictionary *sources_; + NSMutableArray *packages_; id delegate_; Status status_; @@ -494,6 +499,7 @@ inline float interpolate(float begin, float end, float fraction) { - (pkgRecords *) records; - (pkgProblemResolver *) resolver; - (pkgAcquire &) fetcher; +- (NSArray *) packages; - (void) reloadData; - (void) prepare; @@ -1120,6 +1126,8 @@ NSString *Scour(const char *field, const char *begin, const char *end) { - (NSString *) latest; - (NSString *) installed; - (BOOL) upgradable; +- (BOOL) essential; +- (BOOL) broken; - (NSString *) id; - (NSString *) name; @@ -1264,8 +1272,18 @@ NSString *Scour(const char *field, const char *begin, const char *end) { } - (BOOL) upgradable { - NSString *installed = [self installed]; - return installed != nil && [[self latest] compare:installed] != NSOrderedSame ? YES : NO; + if (NSString *installed = [self installed]) + return [[self latest] compare:installed] != NSOrderedSame ? YES : NO; + else + return [self essential]; +} + +- (BOOL) essential { + return (iterator_->Flags & pkgCache::Flag::Essential) == 0 ? NO : YES; +} + +- (BOOL) broken { + return (*[database_ cache])[iterator_].InstBroken(); } - (NSString *) id { @@ -1908,6 +1926,7 @@ NSString *Scour(const char *field, const char *begin, const char *end) { lock_ = NULL; sources_ = [[NSMutableDictionary dictionaryWithCapacity:16] retain]; + packages_ = [[NSMutableArray arrayWithCapacity:16] retain]; int fds[2]; @@ -1948,6 +1967,10 @@ NSString *Scour(const char *field, const char *begin, const char *end) { return *fetcher_; } +- (NSArray *) packages { + return packages_; +} + - (void) reloadData { _error->Discard(); delete list_; @@ -1982,6 +2005,11 @@ NSString *Scour(const char *field, const char *begin, const char *end) { forKey:[NSNumber numberWithLong:reinterpret_cast(*index)] ]; } + + [packages_ removeAllObjects]; + for (pkgCache::PkgIterator iterator = cache_->PkgBegin(); !iterator.end(); ++iterator) + if (Package *package = [Package packageWithIterator:iterator database:self]) + [packages_ addObject:package]; } - (void) prepare { @@ -3477,10 +3505,7 @@ NSString *Scour(const char *field, const char *begin, const char *end) { now_ = [NSDate date]; - NSMutableArray *packages = [NSMutableArray arrayWithCapacity:count]; - for (pkgCache::PkgIterator iterator = [database_ cache]->PkgBegin(); !iterator.end(); ++iterator) - if (Package *package = [Package packageWithIterator:iterator database:database_]) - [packages addObject:package]; + NSArray *packages = [database_ packages]; [install_ setPackages:packages]; [changes_ setPackages:packages]; @@ -3517,7 +3542,32 @@ NSString *Scour(const char *field, const char *begin, const char *end) { - (void) perform { [database_ prepare]; - confirm_ = [[ConfirmationView alloc] initWithView:underlay_ database:database_ delegate:self]; + + if ([database_ cache]->BrokenCount() == 0) + confirm_ = [[ConfirmationView alloc] initWithView:underlay_ database:database_ delegate:self]; + else { + NSMutableArray *broken = [NSMutableArray arrayWithCapacity:16]; + NSArray *packages = [database_ packages]; + + for (size_t i(0); i != [packages count]; ++i) { + Package *package = [packages objectAtIndex:i]; + if ([package broken]) + [broken addObject:[package name]]; + } + + UIAlertSheet *sheet = [[[UIAlertSheet alloc] + initWithTitle:[NSString stringWithFormat:@"%d Broken Packages", [database_ cache]->BrokenCount()] + buttons:[NSArray arrayWithObjects:@"Okay", nil] + defaultButtonIndex:0 + delegate:self + context:self + ] autorelease]; + + [sheet setBodyText:[NSString stringWithFormat:@"The following packages have unmet dependencies:\n\n%@", [broken componentsJoinedByString:@"\n"]]]; + [sheet popupAlertAnimated:YES]; + + [self reloadData:NO]; + } } - (void) upgrade { diff --git a/makefile b/makefile index 76093ba..365ced3 100644 --- a/makefile +++ b/makefile @@ -9,5 +9,8 @@ test: all exec: exec.mm makefile arm-apple-darwin-g++ -Wall -Werror -o $@ $< -framework Foundation -framework CoreFoundation -lobjc +Cydia-1.2: Cydia.mm *.h makefile + arm-apple-darwin-g++ -fobjc-abi-version=2 -fobjc-call-cxx-cdtors -g3 -O2 -Wall -o $@ $< -framework UIKit -framework IOKit -framework Foundation -framework CoreFoundation -framework CoreGraphics -framework GraphicsServices -lobjc -lapt-pkg -lpcre -fobjc-exceptions -save-temps -F $(Aspen)/System/Library/Frameworks -I $(Aspen)/usr/include -DTARGET_OS_EMBEDDED -DSRK_ASPEN + Cydia: Cydia.mm *.h makefile arm-apple-darwin-g++ -fobjc-call-cxx-cdtors -g3 -O2 -Wall -Werror -o $@ $< -framework UIKit -framework IOKit -framework Foundation -framework CoreFoundation -framework CoreGraphics -framework GraphicsServices -lobjc -lapt-pkg -lpcre -fobjc-exceptions -- cgit v1.2.3