mirror of
https://github.com/kennethreitz-archive/gitx.git
synced 2026-06-05 23:40:18 +00:00
b85a205698
Multiple repositories can now be opened by using the File → Open… menu option. Each document is a PBGitRepository with a PBDetailController controlling the window. PBRepositoryDocumentController is the document controller. When launched, the application will attempt to open a repository with the current directory as its path. If this fails it will display an open panel to allow the user to select one.
143 lines
4.5 KiB
Objective-C
143 lines
4.5 KiB
Objective-C
//
|
|
// PBGitRepository.m
|
|
// GitTest
|
|
//
|
|
// Created by Pieter de Bie on 13-06-08.
|
|
// Copyright 2008 __MyCompanyName__. All rights reserved.
|
|
//
|
|
|
|
#import "PBGitRepository.h"
|
|
#import "PBGitCommit.h"
|
|
#import "PBDetailController.h"
|
|
|
|
#import "NSFileHandleExt.h"
|
|
#import "PBEasyPipe.h"
|
|
|
|
NSString* PBGitRepositoryErrorDomain = @"GitXErrorDomain";
|
|
|
|
@implementation PBGitRepository
|
|
|
|
@synthesize path, revisionList;
|
|
static NSString* gitPath;
|
|
|
|
+ (void) initialize
|
|
{
|
|
// Try to find the path of the Git binary
|
|
char* path = getenv("GIT_PATH");
|
|
if (path != nil) {
|
|
gitPath = [NSString stringWithCString:path];
|
|
return;
|
|
}
|
|
|
|
// No explicit path. Try it with "which"
|
|
gitPath = [PBEasyPipe outputForCommand:@"/usr/bin/which" withArgs:[NSArray arrayWithObject:@"git"]];
|
|
if (gitPath.length > 0)
|
|
return;
|
|
|
|
// Still no path. Let's try some default locations.
|
|
NSArray* locations = [NSArray arrayWithObjects:@"/opt/local/bin/git", @"/sw/bin/git", @"/opt/git/bin/git", nil];
|
|
for (NSString* location in locations) {
|
|
if ([[NSFileManager defaultManager] fileExistsAtPath:location]) {
|
|
gitPath = location;
|
|
return;
|
|
}
|
|
}
|
|
|
|
NSLog(@"Could not find a git binary!");
|
|
}
|
|
|
|
- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError
|
|
{
|
|
if (outError) {
|
|
*outError = [NSError errorWithDomain:PBGitRepositoryErrorDomain
|
|
code:0
|
|
userInfo:[NSDictionary dictionaryWithObject:@"Reading files is not supported." forKey:NSLocalizedFailureReasonErrorKey]];
|
|
}
|
|
return NO;
|
|
}
|
|
|
|
- (BOOL)readFromFileWrapper:(NSFileWrapper *)fileWrapper ofType:(NSString *)typeName error:(NSError **)outError
|
|
{
|
|
self.path = nil;
|
|
|
|
if (![fileWrapper isDirectory]) {
|
|
if (outError) {
|
|
NSDictionary* userInfo = [NSDictionary dictionaryWithObject:[NSString stringWithFormat:@"Reading files is not supported.", [fileWrapper filename]]
|
|
forKey:NSLocalizedRecoverySuggestionErrorKey];
|
|
*outError = [NSError errorWithDomain:PBGitRepositoryErrorDomain code:0 userInfo:userInfo];
|
|
}
|
|
} else {
|
|
NSString* repositoryPath = [[self fileURL] path];
|
|
|
|
if ([repositoryPath hasSuffix:@".git"]) {
|
|
self.path = repositoryPath;
|
|
} else {
|
|
// Use rev-parse to find the .git dir for the repository being opened
|
|
NSString* newPath = [PBEasyPipe outputForCommand:gitPath withArgs:[NSArray arrayWithObjects:@"rev-parse", @"--git-dir", nil] inDir:repositoryPath];
|
|
if ([newPath isEqualToString:@".git"]) {
|
|
self.path = [repositoryPath stringByAppendingPathComponent:@".git"];
|
|
} else if ([newPath length] > 0) {
|
|
self.path = newPath;
|
|
} else if (outError) {
|
|
NSDictionary* userInfo = [NSDictionary dictionaryWithObject:[NSString stringWithFormat:@"%@ does not appear to be a git repository.", [fileWrapper filename]]
|
|
forKey:NSLocalizedRecoverySuggestionErrorKey];
|
|
*outError = [NSError errorWithDomain:PBGitRepositoryErrorDomain code:0 userInfo:userInfo];
|
|
}
|
|
}
|
|
|
|
if (self.path) {
|
|
revisionList = [[PBGitRevList alloc] initWithRepository:self andRevListParameters:[NSArray array]];
|
|
}
|
|
}
|
|
|
|
return self.path != nil;
|
|
}
|
|
|
|
// Overridden to create our custom window controller
|
|
- (void)makeWindowControllers
|
|
{
|
|
PBDetailController* controller = [[PBDetailController alloc] initWithRepository:self];
|
|
[self addWindowController:controller];
|
|
[controller release];
|
|
}
|
|
|
|
+ (PBGitRepository*) repositoryWithPath:(NSString*) path
|
|
{
|
|
PBGitRepository* repo = [[PBGitRepository alloc] initWithPath: path];
|
|
return repo;
|
|
}
|
|
|
|
- (PBGitRepository*) initWithPath: (NSString*) p
|
|
{
|
|
if ([p hasSuffix:@".git"])
|
|
self.path = p;
|
|
else {
|
|
NSString* newPath = [PBEasyPipe outputForCommand:gitPath withArgs:[NSArray arrayWithObjects:@"rev-parse", @"--git-dir", nil] inDir:p];
|
|
if ([newPath isEqualToString:@".git"])
|
|
self.path = [p stringByAppendingPathComponent:@".git"];
|
|
else
|
|
self.path = newPath;
|
|
}
|
|
|
|
NSLog(@"Git path is: %@", self.path);
|
|
revisionList = [[PBGitRevList alloc] initWithRepository:self andRevListParameters:[NSArray array]];
|
|
return self;
|
|
}
|
|
|
|
|
|
- (NSFileHandle*) handleForArguments:(NSArray *)args
|
|
{
|
|
NSString* gitDirArg = [@"--git-dir=" stringByAppendingString:path];
|
|
NSMutableArray* arguments = [NSMutableArray arrayWithObject: gitDirArg];
|
|
[arguments addObjectsFromArray: args];
|
|
return [PBEasyPipe handleForCommand:gitPath withArgs:arguments];
|
|
}
|
|
|
|
- (NSFileHandle*) handleForCommand:(NSString *)cmd
|
|
{
|
|
NSArray* arguments = [cmd componentsSeparatedByString:@" "];
|
|
return [self handleForArguments:arguments];
|
|
}
|
|
|
|
@end
|