Files
gitx/Controller/PBSubmoduleController.m
T
2011-03-10 16:04:45 -08:00

134 lines
4.1 KiB
Objective-C

//
// PBSubmoduleController.m
// GitX
//
// Created by Tomasz Krasnyk on 10-11-27.
// Copyright 2010 __MyCompanyName__. All rights reserved.
//
#import "PBSubmoduleController.h"
#import "PBGitRepository.h"
#import "PBOpenDocumentCommand.h"
@interface PBSubmoduleController()
@property (nonatomic, retain) NSArray *submodules;
@end
@implementation PBSubmoduleController
@synthesize submodules;
- (id) initWithRepository:(PBGitRepository *) repo {
if ((self = [super init])){
repository = [repo retain];
}
return self;
}
- (void)dealloc {
[repository release];
[submodules release];
[super dealloc];
}
- (void) reload {
NSArray *arguments = [NSArray arrayWithObjects:@"submodule", @"status", @"--recursive", nil];
NSString *output = [repository outputInWorkdirForArguments:arguments];
NSArray *lines = [output componentsSeparatedByString:@"\n"];
NSMutableArray *loadedSubmodules = [[NSMutableArray alloc] initWithCapacity:[lines count]];
for (NSString *submoduleLine in lines) {
if ([submoduleLine length] == 0)
continue;
PBGitSubmodule *submodule = [[PBGitSubmodule alloc] initWithRawSubmoduleStatusString:submoduleLine];
[loadedSubmodules addObject:submodule];
}
NSMutableArray *groupedSubmodules = [[NSMutableArray alloc] init];
for (PBGitSubmodule *submodule in loadedSubmodules) {
BOOL added = NO;
for (PBGitSubmodule *addedItem in groupedSubmodules) {
if ([[submodule path] hasPrefix:[addedItem path]]) {
[addedItem addSubmodule:submodule];
added = YES;
}
}
if (!added) {
[groupedSubmodules addObject:submodule];
}
}
self.submodules = loadedSubmodules;
}
#pragma mark -
#pragma mark Actions
- (void) addNewSubmodule {
//TODO implement
}
- (void) initializeAllSubmodules {
NSArray *parameters = [NSArray arrayWithObjects:@"submodule", @"init", nil];
PBCommand *initializeSubmodules = [[PBCommand alloc] initWithDisplayName:@"Initialize All Submodules" parameters:parameters repository:repository];
initializeSubmodules.commandTitle = initializeSubmodules.displayName;
initializeSubmodules.commandDescription = @"Initializing submodules";
[initializeSubmodules invoke];
[initializeSubmodules release];
}
- (void) updateAllSubmodules {
NSArray *parameters = [NSArray arrayWithObjects:@"submodule", @"update", nil];
PBCommand *initializeSubmodules = [[PBCommand alloc] initWithDisplayName:@"Update All Submodules" parameters:parameters repository:repository];
initializeSubmodules.commandTitle = initializeSubmodules.displayName;
initializeSubmodules.commandDescription = @"Updating submodules";
[initializeSubmodules invoke];
[initializeSubmodules release];
}
- (NSArray *) menuItems {
NSMutableArray *items = [[NSMutableArray alloc] init];
[items addObject:[[NSMenuItem alloc] initWithTitle:@"Add Submodule..." action:@selector(addNewSubmodule) keyEquivalent:@""]];
[items addObject:[[NSMenuItem alloc] initWithTitle:@"Initialize All Submodules" action:@selector(initializeAllSubmodules) keyEquivalent:@""]];
[items addObject:[[NSMenuItem alloc] initWithTitle:@"Update All Submodules" action:@selector(updateAllSubmodules) keyEquivalent:@""]];
for (NSMenuItem *item in items) {
[item setTarget:self];
}
return items;
}
- (PBCommand *) defaultCommandForSubmodule:(PBGitSubmodule *) submodule {
return [self commandForOpeningSubmodule:submodule];
}
- (PBCommand *) commandForOpeningSubmodule:(PBGitSubmodule *) submodule {
if (!([submodule path] && [submodule submoduleState] != PBGitSubmoduleStateNotInitialized)) {
return nil;
}
NSString *repoPath = [repository workingDirectory];
NSString *path = [repoPath stringByAppendingPathComponent:[submodule path]];
PBOpenDocumentCommand *command = [[PBOpenDocumentCommand alloc] initWithDocumentAbsolutePath:path];
command.commandTitle = command.displayName;
command.commandDescription = @"Opening document";
return [command autorelease];
}
- (BOOL) validateMenuItem:(NSMenuItem *)menuItem {
BOOL shouldBeEnabled = YES;
SEL action = [menuItem action];
if (action == @selector(addNewSubmodule)) {
shouldBeEnabled = NO;
//TODO implementation missing
} else {
shouldBeEnabled = [self.submodules count] > 0;
}
return shouldBeEnabled;
}
@end