From faef971e184d5ce4392daeb5d628ec922ed5638b Mon Sep 17 00:00:00 2001 From: Pieter de Bie Date: Mon, 22 Sep 2008 21:11:53 +0200 Subject: [PATCH] EasyPipe: Add functions to ask for the return value of commands --- PBEasyPipe.h | 5 +++++ PBEasyPipe.m | 48 ++++++++++++++++++++++++++++++++++++++++------- PBGitRepository.h | 2 ++ PBGitRepository.m | 11 +++++++++++ 4 files changed, 59 insertions(+), 7 deletions(-) diff --git a/PBEasyPipe.h b/PBEasyPipe.h index 5c21ed7..4679cf7 100644 --- a/PBEasyPipe.h +++ b/PBEasyPipe.h @@ -18,4 +18,9 @@ + (NSString*) outputForCommand: (NSString*) cmd withArgs: (NSArray*) args; + (NSString*) outputForCommand: (NSString*) cmd withArgs: (NSArray*) args inDir: (NSString*) dir; ++ (NSString*) outputForCommand:(NSString *) cmd + withArgs:(NSArray *) args + inDir:(NSString *) dir + retValue:(int *) ret; + @end diff --git a/PBEasyPipe.m b/PBEasyPipe.m index fc12ba8..1c11647 100644 --- a/PBEasyPipe.m +++ b/PBEasyPipe.m @@ -16,19 +16,24 @@ return [self handleForCommand:cmd withArgs:args inDir:nil]; } -+ (NSFileHandle*) handleForCommand: (NSString*) cmd withArgs: (NSArray*) args inDir: (NSString*) dir ++ (NSTask *) taskForCommand:(NSString *)cmd withArgs:(NSArray *)args inDir:(NSString *)dir { NSTask* task = [[NSTask alloc] init]; task.launchPath = cmd; task.arguments = args; if (dir) task.currentDirectoryPath = dir; + NSLog(@"Starting `cmd %@ %@` in dir %@", cmd, [args componentsJoinedByString:@" "], dir); NSPipe* pipe = [NSPipe pipe]; task.standardOutput = pipe; - - NSFileHandle* handle = [NSFileHandle fileHandleWithStandardOutput]; - handle = [pipe fileHandleForReading]; + return task; +} + ++ (NSFileHandle*) handleForCommand: (NSString*) cmd withArgs: (NSArray*) args inDir: (NSString*) dir +{ + NSTask *task = [self taskForCommand:cmd withArgs:args inDir:dir]; + NSFileHandle* handle = [task.standardOutput fileHandleForReading]; [task launch]; return handle; @@ -36,16 +41,45 @@ -+ (NSString*) outputForCommand: (NSString*) cmd withArgs: (NSArray*) args inDir: (NSString*) dir ++ (NSString*) outputForCommand:(NSString *) cmd + withArgs:(NSArray *) args + inDir:(NSString *) dir + retValue:(int *) ret { - NSFileHandle* handle = [self handleForCommand:cmd withArgs: args inDir: dir]; + NSTask *task = [self taskForCommand:cmd withArgs:args inDir:dir]; + NSFileHandle* handle = [task.standardOutput fileHandleForReading]; + [task launch]; + NSData* data = [handle readDataToEndOfFile]; NSString* string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; + + // Strip trailing newline if ([string hasSuffix:@"\n"]) string = [string substringToIndex:[string length]-1]; - + + [task waitUntilExit]; + if (ret) + *ret = [task terminationStatus]; return string; } + +// We don't use the above function because then we'd have to wait until the program was finished +// with running ++ (NSString*) outputForCommand: (NSString*) cmd withArgs: (NSArray*) args inDir: (NSString*) dir +{ + NSTask *task = [self taskForCommand:cmd withArgs:args inDir:dir]; + NSFileHandle* handle = [task.standardOutput fileHandleForReading]; + [task launch]; + + NSData* data = [handle readDataToEndOfFile]; + NSString* string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; + + // Strip trailing newline + if ([string hasSuffix:@"\n"]) + string = [string substringToIndex:[string length]-1]; + return string; +} + + (NSString*) outputForCommand: (NSString*) cmd withArgs: (NSArray*) args { return [self outputForCommand:cmd withArgs:args inDir:nil]; diff --git a/PBGitRepository.h b/PBGitRepository.h index 53b2f8c..78d0712 100644 --- a/PBGitRepository.h +++ b/PBGitRepository.h @@ -22,7 +22,9 @@ extern NSString* PBGitRepositoryErrorDomain; - (NSFileHandle*) handleForCommand:(NSString*) cmd; - (NSFileHandle*) handleForArguments:(NSArray*) args; - (NSString*) outputForCommand:(NSString*) cmd; +- (NSString*) outputForCommand:(NSString *)str retValue:(int *)ret; - (NSString*) outputForArguments:(NSArray*) args; +- (NSString*) outputForArguments:(NSArray*) args retValue:(int *)ret; - (BOOL) reloadRefs; - (void) addRef:(PBGitRef *)ref fromParameters:(NSArray *)params; diff --git a/PBGitRepository.m b/PBGitRepository.m index e50e342..03633fd 100644 --- a/PBGitRepository.m +++ b/PBGitRepository.m @@ -278,11 +278,22 @@ static NSString* gitPath; return [self outputForArguments: arguments]; } +- (NSString*) outputForCommand:(NSString *)str retValue:(int *)ret; +{ + NSArray* arguments = [str componentsSeparatedByString:@" "]; + return [self outputForArguments: arguments retValue: ret]; +} + - (NSString*) outputForArguments:(NSArray*) arguments { return [PBEasyPipe outputForCommand:gitPath withArgs:arguments inDir: self.fileURL.path]; } +- (NSString*) outputForArguments:(NSArray *)arguments retValue:(int *)ret; +{ + return [PBEasyPipe outputForCommand:gitPath withArgs:arguments inDir: self.fileURL.path retValue: ret]; +} + - (NSString*) parseReference:(NSString *)reference { return [self outputForArguments:[NSArray arrayWithObjects: @"rev-parse", reference, nil]];