I don't know why this method returns a blank string:
- (NSString *)installedGitLocation {
    NSString *launchPath = @"/usr/bin/which";
    // Set up the task
    NSTask *task = [[NSTask alloc] init];
    [task setLaunchPath:launchPath];
    NSArray *args = [NSArray arrayWithObject:@"git"];
    [task setArguments:args];
    // Set the output pipe.
    NSPipe *outPipe = [[NSPipe alloc] init];
    [task setStandardOutput:outPipe];
    [task launch];
    NSData *data = [[outPipe fileHandleForReading] readDataToEndOfFile];
    NSString *path = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
    return path;
}
If instead of passing @"git" as the argument, I pass @"which" I get /usr/bin/which returned as expected. So at least the principle works.
from the terminal
$ which which
$ /usr/bin/which
$
$ which git
$ /usr/local/git/bin/git
So it works there.
The only thing I can think of is that which isn't searching through all the paths in my environment.
This is driving me crazy! Does anyone have any ideas?
EDIT: It looks like this is about setting up either NSTask or the user's shell (e.g., ~/.bashrc) so that the correct environment ($PATH) is seen by NSTask.