diff --git a/Classes/GTRepository.h b/Classes/GTRepository.h index 9b410e646..79dcb592a 100644 --- a/Classes/GTRepository.h +++ b/Classes/GTRepository.h @@ -94,6 +94,25 @@ typedef enum { GTCheckoutNotifyAll = GIT_CHECKOUT_NOTIFY_ALL, } GTCheckoutNotifyFlags; +// Transport flags sent as options to +cloneFromURL... method +typedef enum { + GTTransportFlagsNone = GIT_TRANSPORTFLAGS_NONE, + // If you pass this flag and the connection is secured with SSL/TLS, + // the authenticity of the server certificate will not be verified. + GTTransportFlagsNoCheckCert = GIT_TRANSPORTFLAGS_NO_CHECK_CERT, +} GTTransportFlags; + +// An `NSNumber` wrapped `GTTransportFlags`, documented above. +// Default value is `GTTransportFlagsNone`. +extern NSString *const GTRepositoryCloneOptionsTransportFlags; + +// An `NSNumber` wrapped `BOOL`, if YES, create a bare clone. +// Default value is `NO`. +extern NSString *const GTRepositoryCloneOptionsBare; + +// An `NSNumber` wrapped `BOOL`, if NO, don't checkout the remote HEAD. +// Default value is `YES`. +extern NSString *const GTRepositoryCloneOptionsCheckout; typedef void (^GTRepositoryStatusBlock)(NSURL *fileURL, GTRepositoryFileStatus status, BOOL *stop); @@ -130,14 +149,15 @@ typedef void (^GTRepositoryStatusBlock)(NSURL *fileURL, GTRepositoryFileStatus s // // originURL - The URL to clone from. // workdirURL - A URL to the desired working directory on the local machine. -// barely - If YES, create a bare clone // withCheckout - if NO, don't checkout the remote HEAD +// options - A dictionary containing any of the above options key constants, or +// nil to use the defaults. // error - A pointer to fill in case of trouble. // transferProgressBlock - This block is called with network transfer updates. // checkoutProgressBlock - This block is called with checkout updates (if withCheckout is YES). // // returns nil (and fills the error parameter) if an error occurred, or a GTRepository object if successful. -+ (id)cloneFromURL:(NSURL *)originURL toWorkingDirectory:(NSURL *)workdirURL barely:(BOOL)barely withCheckout:(BOOL)withCheckout error:(NSError **)error transferProgressBlock:(void (^)(const git_transfer_progress *))transferProgressBlock checkoutProgressBlock:(void (^)(NSString *path, NSUInteger completedSteps, NSUInteger totalSteps))checkoutProgressBlock; ++ (id)cloneFromURL:(NSURL *)originURL toWorkingDirectory:(NSURL *)workdirURL options:(NSDictionary *)options error:(NSError **)error transferProgressBlock:(void (^)(const git_transfer_progress *))transferProgressBlock checkoutProgressBlock:(void (^)(NSString *path, NSUInteger completedSteps, NSUInteger totalSteps))checkoutProgressBlock; // Helper for getting the sha1 has of a raw object // diff --git a/Classes/GTRepository.m b/Classes/GTRepository.m index c38cd0847..056d38675 100644 --- a/Classes/GTRepository.m +++ b/Classes/GTRepository.m @@ -44,6 +44,9 @@ #import "NSString+Git.h" #import "GTDiffFile.h" +NSString *const GTRepositoryCloneOptionsBare = @"GTRepositoryCloneOptionsBare"; +NSString *const GTRepositoryCloneOptionsCheckout = @"GTRepositoryCloneOptionsCheckout"; +NSString *const GTRepositoryCloneOptionsTransportFlags = @"GTRepositoryCloneOptionsTransportFlags"; // The type of block passed to -enumerateSubmodulesRecursively:usingBlock:. typedef void (^GTRepositorySubmoduleEnumerationBlock)(GTSubmodule *submodule, BOOL *stop); @@ -168,12 +171,18 @@ static int transferProgressCallback(const git_transfer_progress *progress, void return 0; } -+ (id)cloneFromURL:(NSURL *)originURL toWorkingDirectory:(NSURL *)workdirURL barely:(BOOL)barely withCheckout:(BOOL)withCheckout error:(NSError **)error transferProgressBlock:(void (^)(const git_transfer_progress *))transferProgressBlock checkoutProgressBlock:(void (^)(NSString *path, NSUInteger completedSteps, NSUInteger totalSteps))checkoutProgressBlock { ++ (id)cloneFromURL:(NSURL *)originURL toWorkingDirectory:(NSURL *)workdirURL options:(NSDictionary *)options error:(NSError **)error transferProgressBlock:(void (^)(const git_transfer_progress *))transferProgressBlock checkoutProgressBlock:(void (^)(NSString *path, NSUInteger completedSteps, NSUInteger totalSteps))checkoutProgressBlock { git_clone_options cloneOptions = GIT_CLONE_OPTIONS_INIT; - if (barely) { - cloneOptions.bare = 1; - } + + NSNumber *bare = options[GTRepositoryCloneOptionsBare]; + cloneOptions.bare = bare == nil ? 0 : bare.boolValue; + + NSNumber *transportFlags = options[GTRepositoryCloneOptionsTransportFlags]; + cloneOptions.transport_flags = transportFlags == nil ? 0 : transportFlags.intValue; + + NSNumber *checkout = options[GTRepositoryCloneOptionsCheckout]; + BOOL withCheckout = checkout == nil ? YES : checkout.boolValue; if (withCheckout) { git_checkout_opts checkoutOptions = GIT_CHECKOUT_OPTS_INIT; diff --git a/ObjectiveGitTests/GTRepositoryTest.m b/ObjectiveGitTests/GTRepositoryTest.m index e1bb01a1c..d9f955964 100644 --- a/ObjectiveGitTests/GTRepositoryTest.m +++ b/ObjectiveGitTests/GTRepositoryTest.m @@ -147,7 +147,7 @@ - (void)testCanClone { [self removeDirectoryAtURL:workdirURL]; - repo = [GTRepository cloneFromURL:originURL toWorkingDirectory:workdirURL barely:NO withCheckout:YES error:&err transferProgressBlock:transferProgressBlock checkoutProgressBlock:checkoutProgressBlock]; + repo = [GTRepository cloneFromURL:originURL toWorkingDirectory:workdirURL options:NULL error:&err transferProgressBlock:transferProgressBlock checkoutProgressBlock:checkoutProgressBlock]; STAssertNotNil(repo, err.localizedDescription); STAssertFalse([repo isBare], @"Standard repo should not be bare"); @@ -171,11 +171,12 @@ - (void)testCanCloneBarely { }; NSURL *originURL = [NSURL fileURLWithPath:TEST_REPO_PATH(self.class)]; //[NSURL URLWithString: @"https://github.com/libgit2/TestGitRepository"]; NSURL *workdirURL = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:@"unit_test"]]; + NSDictionary *options = @{ GTRepositoryCloneOptionsBare: @YES }; NSError *err; [self removeDirectoryAtURL:workdirURL]; - repo = [GTRepository cloneFromURL:originURL toWorkingDirectory:workdirURL barely:YES withCheckout:YES error:&err transferProgressBlock:transferProgressBlock checkoutProgressBlock:checkoutProgressBlock]; + repo = [GTRepository cloneFromURL:originURL toWorkingDirectory:workdirURL options:options error:&err transferProgressBlock:transferProgressBlock checkoutProgressBlock:checkoutProgressBlock]; STAssertNotNil(repo, err.localizedDescription); STAssertTrue([repo isBare], @"Bare repo should be bare");