Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 36 additions & 2 deletions deprecation_notifier/DeprecationNotifier/DNAppDelegate.m
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,20 @@ @implementation DNAppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
NSString *expectedVersion = NSLocalizedString(@"expectedVersion", @"");
NSString *expectedBuildsStr = NSLocalizedString(@"expectedBuilds", @"");
NSArray *expectedBuilds;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: For large expectedBuilds builds list, a set theoretically has faster lookups.

NSString *buildsKey = @"expectedBuilds";
NSString *builds = NSLocalizedString(buildsKey, @"");
NSSet *expectedBuilds = [NSSet setWithArray:[builds componentsSeparatedByString:@","]];
if (!expectedBuilds.count || [expectedBuilds containsObject:buildsKey]) expectedBuilds = nil;


if ([expectedBuildsStr isEqualToString:@"expectedBuilds"]) {
// Apparently NSLocalizedStringWithDefaultValue will act exactly like NSLocalizedString
// if you attempt to use a default value of nil or empty string. Ugh.
expectedBuildsStr = @"";
} else {
expectedBuilds = [expectedBuildsStr componentsSeparatedByString:@","];
}
NSDictionary *systemVersionDictionary = [NSDictionary dictionaryWithContentsOfFile:
@"/System/Library/CoreServices/SystemVersion.plist"];
NSString *systemVersion = systemVersionDictionary[@"ProductVersion"];
NSString *systemBuild = systemVersionDictionary[@"ProductBuildVersion"];

NSArray *systemVersionArray = [systemVersion componentsSeparatedByString:@"."];
if (systemVersionArray.count == 2) {
Expand All @@ -53,15 +64,38 @@ - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
expectedVersionArray = [expectedVersionArray arrayByAddingObject:@"0"];
}


NSLog(@"Info: System version: %@ %@", systemVersion, systemBuild);
NSLog(@"Info: Expected version: %@ %@", expectedVersion, expectedBuildsStr);
if (systemVersionArray.count < 3 || expectedVersionArray.count < 3) {
NSLog(@"Exiting: Error, unable to properly determine system version or expected version");
[NSApp terminate:nil];
} else if ([expectedVersionArray[0] intValue] < [systemVersionArray[0] intValue]) {
NSLog(@"Exiting: OS is already %@ or greater", expectedVersion);
[NSApp terminate:nil];
} else if (([expectedVersionArray[0] intValue] <= [systemVersionArray[0] intValue]) &&
([expectedVersionArray[1] intValue] < [systemVersionArray[1] intValue])) {
NSLog(@"Exiting: OS is already %@ or greater", expectedVersion);
[NSApp terminate:nil];
} else if (([expectedVersionArray[0] intValue] <= [systemVersionArray[0] intValue]) &&
([expectedVersionArray[1] intValue] <= [systemVersionArray[1] intValue]) &&
([expectedVersionArray[2] intValue] <= [systemVersionArray[2] intValue])) {
([expectedVersionArray[2] intValue] < [systemVersionArray[2] intValue])) {
NSLog(@"Exiting: OS is already %@ or greater", expectedVersion);
[NSApp terminate:nil];
} else if (([expectedVersionArray[0] intValue] == [systemVersionArray[0] intValue]) &&
([expectedVersionArray[1] intValue] == [systemVersionArray[1] intValue]) &&
([expectedVersionArray[2] intValue] == [systemVersionArray[2] intValue])) {
NSLog(@"Checking: OS is equal to %@, checking build version", expectedVersion);
if (expectedBuilds == nil) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use expectedBuilds.count == 0 or !expectedBuilds.count to catch both nil and an empty array

NSLog(@"Exiting: No preferred build, so considered equal to %@", expectedVersion);
[NSApp terminate:nil];
} else {
if ([expectedBuilds containsObject:systemBuild]) {
NSLog(@"Exiting: OS build is one of the expected builds [ %@ ]", expectedBuildsStr);
[NSApp terminate:nil];
} else {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As the last line of the first condition exits, there's no need for the else, might as well remove it and reduce the indentation.

NSLog(@"Checking: OS build not found in expected builds [ %@ ]", expectedBuildsStr);
}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This logic, while correct, is a bit more difficult to read as it's quite repetitive. Could we flip it around?

if ([expectedVersionArray isEqualToArray:systemVersionArray]) {
  NSLog(@"Checking: running OS is equal to %@, checking build version", expectedVersion);
  if (!expectedBuilds.count) {
    NSLog(@"Exiting: No preferred build, so considered equal");
    [NSApp terminate:nil];
  }
  if ([expectedBuilds containsObject:systemBuild]) {
    NSLog(@"Exiting: OS build is one of the expected builds %@", expectedBuilds);
    [NSApp terminate:nil];
  }
  NSLog(@"Checking: OS build not found in expected builds %@", expectedBuilds);
} else if ([systemVersionArray[0] intValue] < [expectedVersionArray[0] intValue] ||
           [systemVersionArray[1] intValue] < [expectedVersionArray[1] intValue] ||
           [systemVersionArray[2] intValue] < [expectedVersionArray[2] intValue]) {
  NSLog(@"Checking: OS build is lower than required");
} else {
  NSLog(@"Exiting: OS build is greater than required");
  [NSapp terminate:nil];
}

}

[[NSUserDefaults standardUserDefaults] synchronize];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.4</string>
<string>1.6</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>LSMinimumSystemVersion</key>
Expand Down