Skip to content

Add options argument to GTRepository cloneFromURL #252

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Sep 15, 2013
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 22 additions & 2 deletions Classes/GTRepository.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Doc update needed.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, if you could document the magic options keys, that would be wonderful !

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@tiennou - could you please elaborate on what kind of doc update is needed?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My bad, since you mentioned moving one of the blocks in the options dict, seeing it here made me think the doc wasn't updated. ATM it just misses a list of the options keys and what they do.

// 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
//
Expand Down
17 changes: 13 additions & 4 deletions Classes/GTRepository.m
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down
5 changes: 3 additions & 2 deletions ObjectiveGitTests/GTRepositoryTest.m
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand All @@ -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");
Expand Down