mirror of
https://github.com/kennethreitz-archive/gitx.git
synced 2026-06-05 15:30:18 +00:00
17f50e3f7e
Allows creating repositories from the command line, Applescript, or the scripting bridge. These are basic commands, if you need to use commandline options then use git itself.
217 lines
6.1 KiB
Objective-C
217 lines
6.1 KiB
Objective-C
//
|
|
// PBCloneRepositoryPanel.m
|
|
// GitX
|
|
//
|
|
// Created by Nathan Kinsinger on 2/7/10.
|
|
// Copyright 2010 Nathan Kinsinger. All rights reserved.
|
|
//
|
|
|
|
#import "PBCloneRepositoryPanel.h"
|
|
#import "PBRemoteProgressSheet.h"
|
|
#import "PBRepositoryDocumentController.h"
|
|
#import "PBGitDefaults.h"
|
|
|
|
|
|
|
|
@implementation PBCloneRepositoryPanel
|
|
|
|
|
|
@synthesize repositoryURL;
|
|
@synthesize destinationPath;
|
|
@synthesize errorMessage;
|
|
@synthesize repositoryAccessoryView;
|
|
|
|
@synthesize isBare;
|
|
|
|
|
|
|
|
#pragma mark -
|
|
#pragma mark PBCloneRepositoryPanel
|
|
|
|
+ (id) panel
|
|
{
|
|
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
|
|
{
|
|
[self window];
|
|
[self.errorMessage setStringValue:@""];
|
|
path = [PBGitDefaults recentCloneDestination];
|
|
if (path)
|
|
[self.destinationPath setStringValue:path];
|
|
|
|
browseRepositoryPanel = [NSOpenPanel openPanel];
|
|
[browseRepositoryPanel setTitle:@"Browse for git repository"];
|
|
[browseRepositoryPanel setMessage:@"Select a folder with a git repository"];
|
|
[browseRepositoryPanel setPrompt:@"Select"];
|
|
[browseRepositoryPanel setCanChooseFiles:NO];
|
|
[browseRepositoryPanel setCanChooseDirectories:YES];
|
|
[browseRepositoryPanel setAllowsMultipleSelection:NO];
|
|
[browseRepositoryPanel setCanCreateDirectories:NO];
|
|
[browseRepositoryPanel setAccessoryView:repositoryAccessoryView];
|
|
|
|
browseDestinationPanel = [NSOpenPanel openPanel];
|
|
[browseDestinationPanel setTitle:@"Browse clone destination"];
|
|
[browseDestinationPanel setMessage:@"Select a folder to clone the git repository into"];
|
|
[browseDestinationPanel setPrompt:@"Select"];
|
|
[browseDestinationPanel setCanChooseFiles:NO];
|
|
[browseDestinationPanel setCanChooseDirectories:YES];
|
|
[browseDestinationPanel setAllowsMultipleSelection:NO];
|
|
[browseDestinationPanel setCanCreateDirectories:YES];
|
|
}
|
|
|
|
|
|
- (void)showMessageSheet:(NSString *)messageText infoText:(NSString *)infoText
|
|
{
|
|
NSAlert *alert = [NSAlert alertWithMessageText:messageText
|
|
defaultButton:nil alternateButton:nil otherButton:nil
|
|
informativeTextWithFormat:infoText];
|
|
|
|
[alert beginSheetModalForWindow:[self window]
|
|
modalDelegate:self
|
|
didEndSelector:@selector(messageSheetDidEnd:returnCode:contextInfo:)
|
|
contextInfo:NULL];
|
|
}
|
|
|
|
|
|
- (void)showErrorSheet:(NSError *)error
|
|
{
|
|
[[NSAlert alertWithError:error] beginSheetModalForWindow:[self window]
|
|
modalDelegate:self
|
|
didEndSelector:@selector(errorSheetDidEnd:returnCode:contextInfo:)
|
|
contextInfo:NULL];
|
|
}
|
|
|
|
|
|
|
|
#pragma mark IBActions
|
|
|
|
- (IBAction) closeCloneRepositoryPanel:(id)sender
|
|
{
|
|
[self close];
|
|
}
|
|
|
|
|
|
- (IBAction) clone:(id)sender
|
|
{
|
|
[self.errorMessage setStringValue:@""];
|
|
|
|
NSString *url = [self.repositoryURL stringValue];
|
|
if ([url isEqualToString:@""]) {
|
|
[self.errorMessage setStringValue:@"Repository URL is required"];
|
|
return;
|
|
}
|
|
|
|
path = [self.destinationPath stringValue];
|
|
if ([path isEqualToString:@""]) {
|
|
[self.errorMessage setStringValue:@"Destination path is required"];
|
|
return;
|
|
}
|
|
|
|
NSMutableArray *arguments = [NSMutableArray arrayWithObjects:@"clone", @"--", url, path, nil];
|
|
if (isBare)
|
|
[arguments insertObject:@"--bare" atIndex:1];
|
|
|
|
NSString *description = [NSString stringWithFormat:@"Cloning repository at: %@", url];
|
|
NSString *title = @"Cloning Repository";
|
|
[PBRemoteProgressSheet beginRemoteProgressSheetForArguments:arguments title:title description:description inDir:nil windowController:self];
|
|
}
|
|
|
|
|
|
- (IBAction) browseRepository:(id)sender
|
|
{
|
|
[browseRepositoryPanel beginSheetForDirectory:nil file:nil types:nil
|
|
modalForWindow:[self window]
|
|
modalDelegate:self
|
|
didEndSelector:@selector(browseRepositorySheetDidEnd:returnCode:contextInfo:)
|
|
contextInfo:NULL];
|
|
}
|
|
|
|
|
|
- (IBAction) showHideHiddenFiles:(id)sender
|
|
{
|
|
// This uses undocumented OpenPanel features to show hidden files (required for 10.5 support)
|
|
NSNumber *showHidden = [NSNumber numberWithBool:[sender state] == NSOnState];
|
|
[[browseRepositoryPanel valueForKey:@"_navView"] setValue:showHidden forKey:@"showsHiddenFiles"];
|
|
}
|
|
|
|
|
|
- (IBAction) browseDestination:(id)sender
|
|
{
|
|
[browseDestinationPanel beginSheetForDirectory:nil file:nil types:nil
|
|
modalForWindow:[self window]
|
|
modalDelegate:self
|
|
didEndSelector:@selector(browseDestinationSheetDidEnd:returnCode:contextInfo:)
|
|
contextInfo:NULL];
|
|
}
|
|
|
|
|
|
|
|
#pragma mark Callbacks
|
|
|
|
- (void) browseRepositorySheetDidEnd:(NSOpenPanel *)sheet returnCode:(NSInteger)code contextInfo:(void *)info
|
|
{
|
|
[sheet orderOut:self];
|
|
|
|
if (code == NSOKButton) {
|
|
NSURL *url = [[sheet URLs] lastObject];
|
|
[self.repositoryURL setStringValue:[url path]];
|
|
}
|
|
}
|
|
|
|
|
|
- (void) browseDestinationSheetDidEnd:(NSOpenPanel *)sheet returnCode:(NSInteger)code contextInfo:(void *)info
|
|
{
|
|
[sheet orderOut:self];
|
|
|
|
if (code == NSOKButton) {
|
|
NSURL *url = [[sheet URLs] lastObject];
|
|
[self.destinationPath setStringValue:[url path]];
|
|
}
|
|
}
|
|
|
|
|
|
- (void) messageSheetDidEnd:(NSOpenPanel *)sheet returnCode:(NSInteger)code contextInfo:(void *)info
|
|
{
|
|
NSURL *documentURL = [NSURL fileURLWithPath:path];
|
|
|
|
NSError *error = nil;
|
|
id document = [[PBRepositoryDocumentController sharedDocumentController] openDocumentWithContentsOfURL:documentURL display:YES error:&error];
|
|
if (!document && error)
|
|
[self showErrorSheet:error];
|
|
else {
|
|
[self close];
|
|
|
|
NSString *containingPath = [path stringByDeletingLastPathComponent];
|
|
[PBGitDefaults setRecentCloneDestination:containingPath];
|
|
[self.destinationPath setStringValue:containingPath];
|
|
[self.repositoryURL setStringValue:@""];
|
|
}
|
|
}
|
|
|
|
|
|
- (void) errorSheetDidEnd:(NSOpenPanel *)sheet returnCode:(NSInteger)code contextInfo:(void *)info
|
|
{
|
|
[self close];
|
|
}
|
|
|
|
|
|
@end
|