Skip to content

Commit 460d576

Browse files
committed
Merge pull request #252 from isaac/clone-options
Add options argument to GTRepository cloneFromURL
2 parents 24e36d4 + a8839f2 commit 460d576

File tree

3 files changed

+38
-8
lines changed

3 files changed

+38
-8
lines changed

Classes/GTRepository.h

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,25 @@ typedef enum {
9494
GTCheckoutNotifyAll = GIT_CHECKOUT_NOTIFY_ALL,
9595
} GTCheckoutNotifyFlags;
9696

97+
// Transport flags sent as options to +cloneFromURL... method
98+
typedef enum {
99+
GTTransportFlagsNone = GIT_TRANSPORTFLAGS_NONE,
100+
// If you pass this flag and the connection is secured with SSL/TLS,
101+
// the authenticity of the server certificate will not be verified.
102+
GTTransportFlagsNoCheckCert = GIT_TRANSPORTFLAGS_NO_CHECK_CERT,
103+
} GTTransportFlags;
104+
105+
// An `NSNumber` wrapped `GTTransportFlags`, documented above.
106+
// Default value is `GTTransportFlagsNone`.
107+
extern NSString *const GTRepositoryCloneOptionsTransportFlags;
108+
109+
// An `NSNumber` wrapped `BOOL`, if YES, create a bare clone.
110+
// Default value is `NO`.
111+
extern NSString *const GTRepositoryCloneOptionsBare;
112+
113+
// An `NSNumber` wrapped `BOOL`, if NO, don't checkout the remote HEAD.
114+
// Default value is `YES`.
115+
extern NSString *const GTRepositoryCloneOptionsCheckout;
97116

98117
typedef void (^GTRepositoryStatusBlock)(NSURL *fileURL, GTRepositoryFileStatus status, BOOL *stop);
99118

@@ -130,14 +149,15 @@ typedef void (^GTRepositoryStatusBlock)(NSURL *fileURL, GTRepositoryFileStatus s
130149
//
131150
// originURL - The URL to clone from.
132151
// workdirURL - A URL to the desired working directory on the local machine.
133-
// barely - If YES, create a bare clone
134152
// withCheckout - if NO, don't checkout the remote HEAD
153+
// options - A dictionary containing any of the above options key constants, or
154+
// nil to use the defaults.
135155
// error - A pointer to fill in case of trouble.
136156
// transferProgressBlock - This block is called with network transfer updates.
137157
// checkoutProgressBlock - This block is called with checkout updates (if withCheckout is YES).
138158
//
139159
// returns nil (and fills the error parameter) if an error occurred, or a GTRepository object if successful.
140-
+ (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;
160+
+ (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;
141161

142162
// Helper for getting the sha1 has of a raw object
143163
//

Classes/GTRepository.m

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@
4444
#import "NSString+Git.h"
4545
#import "GTDiffFile.h"
4646

47+
NSString *const GTRepositoryCloneOptionsBare = @"GTRepositoryCloneOptionsBare";
48+
NSString *const GTRepositoryCloneOptionsCheckout = @"GTRepositoryCloneOptionsCheckout";
49+
NSString *const GTRepositoryCloneOptionsTransportFlags = @"GTRepositoryCloneOptionsTransportFlags";
4750

4851
// The type of block passed to -enumerateSubmodulesRecursively:usingBlock:.
4952
typedef void (^GTRepositorySubmoduleEnumerationBlock)(GTSubmodule *submodule, BOOL *stop);
@@ -168,12 +171,18 @@ static int transferProgressCallback(const git_transfer_progress *progress, void
168171
return 0;
169172
}
170173

171-
+ (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 {
174+
+ (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 {
172175

173176
git_clone_options cloneOptions = GIT_CLONE_OPTIONS_INIT;
174-
if (barely) {
175-
cloneOptions.bare = 1;
176-
}
177+
178+
NSNumber *bare = options[GTRepositoryCloneOptionsBare];
179+
cloneOptions.bare = bare == nil ? 0 : bare.boolValue;
180+
181+
NSNumber *transportFlags = options[GTRepositoryCloneOptionsTransportFlags];
182+
cloneOptions.transport_flags = transportFlags == nil ? 0 : transportFlags.intValue;
183+
184+
NSNumber *checkout = options[GTRepositoryCloneOptionsCheckout];
185+
BOOL withCheckout = checkout == nil ? YES : checkout.boolValue;
177186

178187
if (withCheckout) {
179188
git_checkout_opts checkoutOptions = GIT_CHECKOUT_OPTS_INIT;

ObjectiveGitTests/GTRepositoryTest.m

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ - (void)testCanClone {
147147

148148
[self removeDirectoryAtURL:workdirURL];
149149

150-
repo = [GTRepository cloneFromURL:originURL toWorkingDirectory:workdirURL barely:NO withCheckout:YES error:&err transferProgressBlock:transferProgressBlock checkoutProgressBlock:checkoutProgressBlock];
150+
repo = [GTRepository cloneFromURL:originURL toWorkingDirectory:workdirURL options:NULL error:&err transferProgressBlock:transferProgressBlock checkoutProgressBlock:checkoutProgressBlock];
151151

152152
STAssertNotNil(repo, err.localizedDescription);
153153
STAssertFalse([repo isBare], @"Standard repo should not be bare");
@@ -171,11 +171,12 @@ - (void)testCanCloneBarely {
171171
};
172172
NSURL *originURL = [NSURL fileURLWithPath:TEST_REPO_PATH(self.class)]; //[NSURL URLWithString: @"https://github.com/libgit2/TestGitRepository"];
173173
NSURL *workdirURL = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:@"unit_test"]];
174+
NSDictionary *options = @{ GTRepositoryCloneOptionsBare: @YES };
174175
NSError *err;
175176

176177
[self removeDirectoryAtURL:workdirURL];
177178

178-
repo = [GTRepository cloneFromURL:originURL toWorkingDirectory:workdirURL barely:YES withCheckout:YES error:&err transferProgressBlock:transferProgressBlock checkoutProgressBlock:checkoutProgressBlock];
179+
repo = [GTRepository cloneFromURL:originURL toWorkingDirectory:workdirURL options:options error:&err transferProgressBlock:transferProgressBlock checkoutProgressBlock:checkoutProgressBlock];
179180

180181
STAssertNotNil(repo, err.localizedDescription);
181182
STAssertTrue([repo isBare], @"Bare repo should be bare");

0 commit comments

Comments
 (0)