Files
gitx/Model/PBGitSubmodule.m
2011-04-05 11:39:01 -07:00

131 lines
3.5 KiB
Objective-C

//
// PBGitSubmodule.m
// GitX
//
// Created by Tomasz Krasnyk on 10-11-07.
// Copyright 2010 __MyCompanyName__. All rights reserved.
//
#import "PBGitSubmodule.h"
@interface PBGitSubmodule()
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSString *path;
@property (nonatomic, retain) NSString *checkedOutCommit;
@end
@implementation PBGitSubmodule
@synthesize name;
@synthesize path;
@synthesize checkedOutCommit;
@synthesize submoduleState;
@synthesize submodules;
- (NSMutableArray *) submodules {
if (!submodules) {
submodules = [[NSMutableArray alloc] init];
}
return submodules;
}
- (id) initWithRawSubmoduleStatusString:(NSString *) submoduleStatusString {
NSParameterAssert([submoduleStatusString length] > 0);
if ((self = [super init])) {
unichar status = [submoduleStatusString characterAtIndex:0];
submoduleState = [PBGitSubmodule submoduleStateFromCharacter:status];
if (submoduleState == PBGitSubmoduleStateFailed) {
DLog(@"Submodule status failed:\n %@", submoduleStatusString);
return nil;
}
NSScanner *scanner = [NSScanner scannerWithString:[submoduleStatusString substringFromIndex:1]];
NSString *sha1 = nil;
NSString *fullPath = nil;
NSString *coName = nil;
BOOL shouldContinue = [scanner scanUpToString:@" " intoString:&sha1];
if (shouldContinue) {
shouldContinue = [scanner scanUpToString:@"(" intoString:&fullPath];
}
if (shouldContinue) {
shouldContinue = [scanner scanString:@"(" intoString:NULL];
}
if (shouldContinue) {
[scanner scanUpToString:@")" intoString:&coName];
}
self.path = [fullPath stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
coName = [coName stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
self.checkedOutCommit = [coName length] > 0 ? coName : nil;
self.name = [self.path lastPathComponent];
}
return self;
}
- (void) dealloc {
[submodules release];
[name release];
[path release];
[checkedOutCommit release];
[super dealloc];
}
- (void) addSubmodule:(PBGitSubmodule *) submodule {
[self.submodules addObject:submodule];
}
#pragma mark -
#pragma mark Presentable
- (NSImage *) icon {
return [PBGitSubmodule imageForSubmoduleState:self.submoduleState];
}
- (NSString *) displayDescription {
NSMutableString *result = [[NSMutableString alloc] initWithString:self.name];
if (self.checkedOutCommit) {
[result appendFormat:@" (%@)", self.checkedOutCommit];
}
return [result autorelease];
}
- (NSString *) popupDescription {
return [self description];
}
#pragma mark -
#pragma mark Private
+ (NSImage *) imageForSubmoduleState:(PBGitSubmoduleState) state {
NSString *imageName = nil;
if (state == PBGitSubmoduleStateMatchingIndex) {
imageName = @"submodule-matching-index.png";
} else if (state == PBGitSubmoduleStateNotInitialized) {
imageName = @"submodule-empty.png";
} else if (state == PBGitSubmoduleStateDoesNotMatchIndex) {
imageName = @"submodule-notmatching-index.png";
}
return [NSImage imageNamed:imageName];
}
+ (PBGitSubmoduleState) submoduleStateFromCharacter:(unichar) character {
PBGitSubmoduleState state = PBGitSubmoduleStateMatchingIndex;
if (character == '-') {
state = PBGitSubmoduleStateNotInitialized;
} else if (character == '+') {
state = PBGitSubmoduleStateDoesNotMatchIndex;
} else if (character != ' ') {
return PBGitSubmoduleStateFailed;
}
return state;
}
- (NSString *) description {
return [NSString stringWithFormat:@"[SUBMODULE] %@(%@) %@", self.name, self.path, self.checkedOutCommit];
}
@end