diff --git a/GitX.h b/GitX.h index edae903..7825b7f 100644 --- a/GitX.h +++ b/GitX.h @@ -28,6 +28,8 @@ - (void) quit; // Quit the application. - (BOOL) exists:(id)x; // Verify that an object exists. - (void) showDiff:(NSString *)x; // Show the supplied diff output in a GitX window. +- (void) initRepository:(NSURL *)x; // Create a git repository at the given filesystem URL. +- (void) cloneRepository:(NSString *)x to:(NSURL *)to isBare:(BOOL)isBare; // Clone a repository. @end diff --git a/GitX.sdef b/GitX.sdef index a0a0642..db0348d 100644 --- a/GitX.sdef +++ b/GitX.sdef @@ -160,6 +160,18 @@ + + + + + + + + + + + + diff --git a/GitXScriptingConstants.h b/GitXScriptingConstants.h index cba0ce8..7a786a4 100644 --- a/GitXScriptingConstants.h +++ b/GitXScriptingConstants.h @@ -9,4 +9,7 @@ #define kGitXBundleIdentifier @"nl.frim.GitX" -#define kGitXAEKeyArgumentsList 'ARGS' \ No newline at end of file +#define kGitXAEKeyArgumentsList 'ARGS' + +#define kGitXCloneDestinationURLKey @"destinationURL" +#define kGitXCloneIsBareKey @"isBare" \ No newline at end of file diff --git a/NSApplication+GitXScripting.h b/NSApplication+GitXScripting.h index d5cab8c..fafab7e 100644 --- a/NSApplication+GitXScripting.h +++ b/NSApplication+GitXScripting.h @@ -12,5 +12,7 @@ @interface NSApplication (GitXScripting) - (void)showDiffScriptCommand:(NSScriptCommand *)command; +- (void)initRepositoryScriptCommand:(NSScriptCommand *)command; +- (void)cloneRepositoryScriptCommand:(NSScriptCommand *)command; @end diff --git a/NSApplication+GitXScripting.m b/NSApplication+GitXScripting.m index 7c8489c..f3bef65 100644 --- a/NSApplication+GitXScripting.m +++ b/NSApplication+GitXScripting.m @@ -7,7 +7,10 @@ // #import "NSApplication+GitXScripting.h" +#import "GitXScriptingConstants.h" #import "PBDiffWindowController.h" +#import "PBRepositoryDocumentController.h" +#import "PBCloneRepositoryPanel.h" @implementation NSApplication (GitXScripting) @@ -22,4 +25,25 @@ } } +- (void)initRepositoryScriptCommand:(NSScriptCommand *)command +{ + NSURL *repositoryURL = [command directParameter]; + if (repositoryURL) + [[PBRepositoryDocumentController sharedDocumentController] initNewRepositoryAtURL:repositoryURL]; +} + +- (void)cloneRepositoryScriptCommand:(NSScriptCommand *)command +{ + NSString *repository = [command directParameter]; + if (repository) { + NSDictionary *arguments = [command arguments]; + NSURL *destinationURL = [arguments objectForKey:kGitXCloneDestinationURLKey]; + if (destinationURL) { + BOOL isBare = [[arguments objectForKey:kGitXCloneIsBareKey] boolValue]; + + [PBCloneRepositoryPanel beginCloneRepository:repository toURL:destinationURL isBare:isBare]; + } + } +} + @end diff --git a/PBCloneRepositoryPanel.h b/PBCloneRepositoryPanel.h index 7c7d102..8b29551 100644 --- a/PBCloneRepositoryPanel.h +++ b/PBCloneRepositoryPanel.h @@ -23,6 +23,7 @@ } + (id) panel; ++ (void)beginCloneRepository:(NSString *)repository toURL:(NSURL *)targetURL isBare:(BOOL)bare; - (void)showMessageSheet:(NSString *)messageText infoText:(NSString *)infoText; - (void)showErrorSheet:(NSError *)error; @@ -38,4 +39,6 @@ @property (assign) IBOutlet NSTextField *errorMessage; @property (assign) IBOutlet NSView *repositoryAccessoryView; +@property (assign) BOOL isBare; + @end diff --git a/PBCloneRepositoryPanel.m b/PBCloneRepositoryPanel.m index 20baaa2..a2aaa51 100644 --- a/PBCloneRepositoryPanel.m +++ b/PBCloneRepositoryPanel.m @@ -21,6 +21,8 @@ @synthesize errorMessage; @synthesize repositoryAccessoryView; +@synthesize isBare; + #pragma mark - @@ -31,6 +33,21 @@ return [[self alloc] initWithWindowNibName:@"PBCloneRepositoryPanel"]; } ++ (void)beginCloneRepository:(NSString *)repository toURL:(NSURL *)targetURL isBare:(BOOL)bare +{ + if (!repository || [repository isEqualToString:@""] || !targetURL || [[targetURL path] isEqualToString:@""]) + return; + + PBCloneRepositoryPanel *clonePanel = [PBCloneRepositoryPanel panel]; + [clonePanel showWindow:self]; + + [clonePanel.repositoryURL setStringValue:repository]; + [clonePanel.destinationPath setStringValue:[targetURL path]]; + clonePanel.isBare = bare; + + [clonePanel clone:self]; +} + - (void) awakeFromNib { diff --git a/PBRepositoryDocumentController.h b/PBRepositoryDocumentController.h index d0660e2..1bbaab3 100644 --- a/PBRepositoryDocumentController.h +++ b/PBRepositoryDocumentController.h @@ -16,4 +16,5 @@ } - (id) documentForLocation:(NSURL*) url; +- (void)initNewRepositoryAtURL:(NSURL *)url; @end diff --git a/PBRepositoryDocumentController.m b/PBRepositoryDocumentController.m index 83bd887..cfaeac5 100644 --- a/PBRepositoryDocumentController.m +++ b/PBRepositoryDocumentController.m @@ -47,6 +47,16 @@ return document; } +- (void)initNewRepositoryAtURL:(NSURL *)url +{ + int terminationStatus; + NSString *result = [PBEasyPipe outputForCommand:[PBGitBinary path] withArgs:[NSArray arrayWithObjects:@"init", @"-q", nil] inDir:[url path] retValue:&terminationStatus]; + + if (terminationStatus == 0) + [self openDocumentWithContentsOfURL:url display:YES error:NULL]; + else + NSRunAlertPanel(@"Failed to create new Git repository", @"Git returned the following error when trying to create the repository: %@", nil, nil, nil, result); +} - (IBAction)newDocument:(id)sender { @@ -58,16 +68,7 @@ [op setMessage:@"Initialize a repository here:"]; [op setTitle:@"New Repository"]; if ([op runModal] == NSFileHandlingPanelOKButton) - { - NSString *path = [op filename]; - int terminationStatus; - NSString *result = [PBEasyPipe outputForCommand:[PBGitBinary path] withArgs:[NSArray arrayWithObjects:@"init", @"-q", nil] inDir:path inputString:nil retValue:&terminationStatus]; - - if (terminationStatus == 0) - [self openDocumentWithContentsOfURL:[op URL] display:YES error:NULL]; - else - NSRunAlertPanel(@"Failed to create new Git repository", @"Git returned the following error when trying to create the repository: %@", nil, nil, nil, result); - } + [self initNewRepositoryAtURL:[op URL]]; } diff --git a/gitx.m b/gitx.m index 5f17138..ecb9a6f 100644 --- a/gitx.m +++ b/gitx.m @@ -23,6 +23,8 @@ void usage(char const *programName) printf(" or: %s (--all|--local|--branch) [branch/tag]\n", programName); printf(" or: %s \n", programName); printf(" or: %s (--diff)\n", programName); + printf(" or: %s (--init)\n", programName); + printf(" or: %s (--clone [destination])\n", programName); printf("\n"); printf(" -h, --help print this help\n"); printf(" -v, --version prints version info for both GitX and git\n"); @@ -60,6 +62,15 @@ void usage(char const *programName) printf(" shows the diff in a window in GitX\n"); printf(" git diff [options] | gitx\n"); printf(" use gitx to pipe diff output to a GitX window\n"); + printf("\n"); + printf("Creating repositories\n"); + printf(" These commands will create a git repository and then open it up in GitX\n"); + printf("\n"); + printf(" --init creates (or reinitializes) a git repository\n"); + printf(" --clone [destination path]\n"); + printf(" clones the repository (at the specified URL) into the current\n"); + printf(" directory or into the specified path\n"); + printf("\n"); exit(1); } @@ -157,6 +168,37 @@ void handleOpenRepository(NSURL *repositoryURL, NSMutableArray *arguments) } } +void handleInit(NSURL *repositoryURL) +{ + GitXApplication *gitXApp = [SBApplication applicationWithBundleIdentifier:kGitXBundleIdentifier]; + [gitXApp initRepository:repositoryURL]; + + exit(0); +} + +void handleClone(NSURL *repositoryURL, NSMutableArray *arguments) +{ + if ([arguments count]) { + NSString *repository = [arguments objectAtIndex:0]; + + if ([arguments count] > 1) { + NSURL *url = [NSURL fileURLWithPath:[arguments objectAtIndex:1]]; + if (url) + repositoryURL = url; + } + + GitXApplication *gitXApp = [SBApplication applicationWithBundleIdentifier:kGitXBundleIdentifier]; + [gitXApp cloneRepository:repository to:repositoryURL isBare:NO]; + } + else { + printf("Error: --clone needs the URL of the repository to clone.\n"); + exit(2); + } + + + exit(0); +} + #pragma mark - #pragma mark main @@ -228,10 +270,23 @@ int main(int argc, const char** argv) NSMutableArray *arguments = argumentsArray(); NSURL *wdURL = workingDirectoryURL(arguments); - if ([arguments count] > 0 && ([[arguments objectAtIndex:0] isEqualToString:@"--diff"] || - [[arguments objectAtIndex:0] isEqualToString:@"-d"])) { - [arguments removeObjectAtIndex:0]; - handleDiffWithArguments(wdURL, arguments); + if ([arguments count]) { + NSString *firstArgument = [arguments objectAtIndex:0]; + + if ([firstArgument isEqualToString:@"--diff"] || [firstArgument isEqualToString:@"-d"]) { + [arguments removeObjectAtIndex:0]; + handleDiffWithArguments(wdURL, arguments); + } + + if ([firstArgument isEqualToString:@"--init"]) { + [arguments removeObjectAtIndex:0]; + handleInit(wdURL); + } + + if ([firstArgument isEqualToString:@"--clone"]) { + [arguments removeObjectAtIndex:0]; + handleClone(wdURL, arguments); + } } // No commands handled by gitx, open the current dir in GitX with the arguments