From 1cb0050ef1c123770ea6712f9654c58a5fb0b6be Mon Sep 17 00:00:00 2001 From: Isaac Kearse Date: Sat, 7 Sep 2013 14:15:22 +1200 Subject: [PATCH 1/4] Add options argument to GTRepository cloneFromURL --- Classes/GTRepository.h | 4 ++-- Classes/GTRepository.m | 11 +++++++---- ObjectiveGitTests/GTRepositoryTest.m | 5 +++-- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/Classes/GTRepository.h b/Classes/GTRepository.h index 9b410e646..089f6e722 100644 --- a/Classes/GTRepository.h +++ b/Classes/GTRepository.h @@ -130,14 +130,14 @@ 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 NSDictionary with NSString keys, used for specifying clone options. Possible keys are @"bare" and @"transportFlags" // 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 withCheckout:(BOOL)withCheckout 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..ef1365f35 100644 --- a/Classes/GTRepository.m +++ b/Classes/GTRepository.m @@ -168,12 +168,15 @@ 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 withCheckout:(BOOL)withCheckout 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[@"bare"]; + if (bare != nil) cloneOptions.bare = bare.intValue; + + NSNumber *transportFlags = options[@"transportFlags"]; + if (transportFlags != nil) cloneOptions.transport_flags = transportFlags.intValue; if (withCheckout) { git_checkout_opts checkoutOptions = GIT_CHECKOUT_OPTS_INIT; diff --git a/ObjectiveGitTests/GTRepositoryTest.m b/ObjectiveGitTests/GTRepositoryTest.m index e1bb01a1c..9be315e52 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 withCheckout:YES 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 = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:1] forKey:@"bare"]; 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 withCheckout:YES options:options error:&err transferProgressBlock:transferProgressBlock checkoutProgressBlock:checkoutProgressBlock]; STAssertNotNil(repo, err.localizedDescription); STAssertTrue([repo isBare], @"Bare repo should be bare"); From ca8b65cc5ccededc0ae04de335208f77f47af83e Mon Sep 17 00:00:00 2001 From: Isaac Kearse Date: Sat, 14 Sep 2013 10:23:36 +1200 Subject: [PATCH 2/4] Improve docs and move withCheckout to options dictionary --- Classes/GTRepository.h | 9 +++++++-- Classes/GTRepository.m | 13 ++++++++----- ObjectiveGitTests/GTRepositoryTest.m | 6 +++--- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/Classes/GTRepository.h b/Classes/GTRepository.h index 089f6e722..52765ef38 100644 --- a/Classes/GTRepository.h +++ b/Classes/GTRepository.h @@ -131,13 +131,18 @@ 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. // withCheckout - if NO, don't checkout the remote HEAD -// options - A NSDictionary with NSString keys, used for specifying clone options. Possible keys are @"bare" and @"transportFlags" +// options - A NSDictionary with NSString keys, used for specifying clone options. Possible keys are: +// - @"bare" - BOOL value, if YES, create a bare clone, for example: [NSNumber numberWithBool:YES], defaults to NO +// - @"checkout" - BOOL value, if NO, don't checkout the remote HEAD, for example: [NSNumber numberWithBool:NO], defaults to YES +// - @"transportFlags" - int value, two possible values: +// - GIT_TRANSPORTFLAGS_NONE (0), for example: [NSNumber numberWithInt:GIT_TRANSPORTFLAGS_NONE], this is the default value +// - GIT_TRANSPORTFLAGS_NO_CHECK_CERT (1), for example: [NSNumber numberWithInt:GIT_TRANSPORTFLAGS_NO_CHECK_CERT], if you pass this flag and the connection is secured with SSL/TLS, the authenticity of the server certificate will not be verified // 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 withCheckout:(BOOL)withCheckout options:(NSDictionary *)options 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 ef1365f35..82d91be3b 100644 --- a/Classes/GTRepository.m +++ b/Classes/GTRepository.m @@ -168,15 +168,18 @@ static int transferProgressCallback(const git_transfer_progress *progress, void return 0; } -+ (id)cloneFromURL:(NSURL *)originURL toWorkingDirectory:(NSURL *)workdirURL withCheckout:(BOOL)withCheckout options:(NSDictionary *)options 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; - NSNumber *bare = options[@"bare"]; - if (bare != nil) cloneOptions.bare = bare.intValue; + NSNumber *bare = options[@"bare"]; + cloneOptions.bare = bare == nil ? 0 : bare.boolValue; - NSNumber *transportFlags = options[@"transportFlags"]; - if (transportFlags != nil) cloneOptions.transport_flags = transportFlags.intValue; + NSNumber *transportFlags = options[@"transportFlags"]; + cloneOptions.transport_flags = transportFlags == nil ? 0 : transportFlags.intValue; + + NSNumber *checkout = options[@"checkout"]; + 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 9be315e52..9b0bad82c 100644 --- a/ObjectiveGitTests/GTRepositoryTest.m +++ b/ObjectiveGitTests/GTRepositoryTest.m @@ -147,7 +147,7 @@ - (void)testCanClone { [self removeDirectoryAtURL:workdirURL]; - repo = [GTRepository cloneFromURL:originURL toWorkingDirectory:workdirURL withCheckout:YES options:NULL 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,12 +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 = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:1] forKey:@"bare"]; + NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:@"bare"]; NSError *err; [self removeDirectoryAtURL:workdirURL]; - repo = [GTRepository cloneFromURL:originURL toWorkingDirectory:workdirURL withCheckout:YES options:options 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"); From 6075f7bb14cda196a91b4578a85abde7a201d351 Mon Sep 17 00:00:00 2001 From: Isaac Kearse Date: Sun, 15 Sep 2013 12:04:49 +1200 Subject: [PATCH 3/4] Use shorthand for NSDictonary in repository test --- ObjectiveGitTests/GTRepositoryTest.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ObjectiveGitTests/GTRepositoryTest.m b/ObjectiveGitTests/GTRepositoryTest.m index 9b0bad82c..d9f955964 100644 --- a/ObjectiveGitTests/GTRepositoryTest.m +++ b/ObjectiveGitTests/GTRepositoryTest.m @@ -171,7 +171,7 @@ - (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 = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:@"bare"]; + NSDictionary *options = @{ GTRepositoryCloneOptionsBare: @YES }; NSError *err; [self removeDirectoryAtURL:workdirURL]; From a8839f27f7beaf970d8cc8c7df620d94fc7473dc Mon Sep 17 00:00:00 2001 From: Isaac Kearse Date: Sun, 15 Sep 2013 12:05:51 +1200 Subject: [PATCH 4/4] Convert GTRepository.cloneFromURL option keys into constants --- Classes/GTRepository.h | 27 +++++++++++++++++++++------ Classes/GTRepository.m | 9 ++++++--- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/Classes/GTRepository.h b/Classes/GTRepository.h index 52765ef38..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); @@ -131,12 +150,8 @@ 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. // withCheckout - if NO, don't checkout the remote HEAD -// options - A NSDictionary with NSString keys, used for specifying clone options. Possible keys are: -// - @"bare" - BOOL value, if YES, create a bare clone, for example: [NSNumber numberWithBool:YES], defaults to NO -// - @"checkout" - BOOL value, if NO, don't checkout the remote HEAD, for example: [NSNumber numberWithBool:NO], defaults to YES -// - @"transportFlags" - int value, two possible values: -// - GIT_TRANSPORTFLAGS_NONE (0), for example: [NSNumber numberWithInt:GIT_TRANSPORTFLAGS_NONE], this is the default value -// - GIT_TRANSPORTFLAGS_NO_CHECK_CERT (1), for example: [NSNumber numberWithInt:GIT_TRANSPORTFLAGS_NO_CHECK_CERT], if you pass this flag and the connection is secured with SSL/TLS, the authenticity of the server certificate will not be verified +// 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). diff --git a/Classes/GTRepository.m b/Classes/GTRepository.m index 82d91be3b..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); @@ -172,13 +175,13 @@ + (id)cloneFromURL:(NSURL *)originURL toWorkingDirectory:(NSURL *)workdirURL opt git_clone_options cloneOptions = GIT_CLONE_OPTIONS_INIT; - NSNumber *bare = options[@"bare"]; + NSNumber *bare = options[GTRepositoryCloneOptionsBare]; cloneOptions.bare = bare == nil ? 0 : bare.boolValue; - NSNumber *transportFlags = options[@"transportFlags"]; + NSNumber *transportFlags = options[GTRepositoryCloneOptionsTransportFlags]; cloneOptions.transport_flags = transportFlags == nil ? 0 : transportFlags.intValue; - NSNumber *checkout = options[@"checkout"]; + NSNumber *checkout = options[GTRepositoryCloneOptionsCheckout]; BOOL withCheckout = checkout == nil ? YES : checkout.boolValue; if (withCheckout) {