Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

217 lines (160 sloc) 6.209 kb
//
// 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
Jump to Line
Something went wrong with that request. Please try again.