diff --git a/Alcatraz/Helpers/ATZGit.h b/Alcatraz/Helpers/ATZGit.h index 48c281f..f8c33a8 100644 --- a/Alcatraz/Helpers/ATZGit.h +++ b/Alcatraz/Helpers/ATZGit.h @@ -22,7 +22,6 @@ #import -static NSString *const GIT = @"/usr/bin/git"; static NSString *const IGNORE_PUSH_CONFIG = @"-c push.default=matching"; static NSString *const CLONE = @"clone"; static NSString *const FETCH = @"fetch"; diff --git a/Alcatraz/Helpers/ATZGit.m b/Alcatraz/Helpers/ATZGit.m index 8633f43..75d0d8f 100644 --- a/Alcatraz/Helpers/ATZGit.m +++ b/Alcatraz/Helpers/ATZGit.m @@ -48,22 +48,37 @@ + (NSString *)parseRevisionFromDictionary:(NSDictionary *)dict { } + (BOOL)areCommandLineToolsAvailable { - BOOL areAvailable = YES; - @try { - [NSTask launchedTaskWithLaunchPath:@"/usr/bin/git" arguments:@[@"--version"]]; - } - @catch (NSException *exception) { - areAvailable = NO; - } - return areAvailable; + return [self gitExecutablePath] != nil; +} + ++ (NSString *)gitExecutablePath { + static dispatch_once_t onceToken; + static NSString *gitPath; + dispatch_once(&onceToken, ^{ + NSArray *gitPathOptions = @[ + @"/usr/bin/git", + @"/usr/local/bin/git" + ]; + for (NSString *path in gitPathOptions) { + @try { + [NSTask launchedTaskWithLaunchPath:path arguments:@[@"--version"]]; + } + @catch (NSException *exception) { + continue; + } + gitPath = path; + break; + } + }); + return gitPath; } #pragma mark - Private + (void)clone:(NSString *)remotePath to:(NSString *)localPath completion:(void (^)(NSString *, NSError *))completion { ATZShell *shell = [ATZShell new]; - - [shell executeCommand:GIT withArguments:@[CLONE, remotePath, localPath, IGNORE_PUSH_CONFIG] + + [shell executeCommand:[self gitExecutablePath] withArguments:@[CLONE, remotePath, localPath, IGNORE_PUSH_CONFIG] completion:^(NSString *output, NSError *error) { NSLog(@"Git Clone output: %@", output); @@ -89,7 +104,7 @@ + (void)updateLocalProject:(NSString *)localPath revision:(NSString *)revision + (void)fetch:(NSString *)localPath completion:(void (^)(NSString *, NSError *))completion { ATZShell *shell = [ATZShell new]; - [shell executeCommand:GIT withArguments:@[FETCH, ORIGIN] inWorkingDirectory:localPath + [shell executeCommand:[self gitExecutablePath] withArguments:@[FETCH, ORIGIN] inWorkingDirectory:localPath completion:^(NSString *output, NSError *error) { NSLog(@"Git fetch output: %@", output); @@ -102,8 +117,8 @@ + (void)resetHard:(NSString *)localPath revision:(NSString *)revision ATZShell *shell = [ATZShell new]; NSArray *resetArguments = @[RESET, HARD, revision ?: ORIGIN_MASTER]; - - [shell executeCommand:GIT withArguments:resetArguments inWorkingDirectory:localPath + + [shell executeCommand:[self gitExecutablePath] withArguments:resetArguments inWorkingDirectory:localPath completion:^(NSString *output, NSError *error) { NSLog(@"Git reset output: %@", output);