Skip to content

Commit ed7e21a

Browse files
committedFeb 27, 2017
Fix conflicts from #459
# Conflicts: # ObjectiveGit/GTRepository.h # ObjectiveGit/GTRepository.m
2 parents 279568a + d59731d commit ed7e21a

19 files changed

+341
-156
lines changed
 

‎External/libgit2

Submodule libgit2 updated 536 files

‎ObjectiveGit/GTCheckoutOptions.h

+103
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
//
2+
// GTCheckoutOptions.h
3+
// ObjectiveGitFramework
4+
//
5+
// Created by Etienne on 10/04/2015.
6+
// Copyright (c) 2015 GitHub, Inc. All rights reserved.
7+
//
8+
9+
#import <Foundation/Foundation.h>
10+
#import "git2/checkout.h"
11+
12+
@class GTDiffFile;
13+
14+
NS_ASSUME_NONNULL_BEGIN
15+
16+
/// Checkout strategies used by the various -checkout... methods
17+
/// See git_checkout_strategy_t
18+
typedef NS_OPTIONS(NSInteger, GTCheckoutStrategyType) {
19+
GTCheckoutStrategyNone = GIT_CHECKOUT_NONE,
20+
GTCheckoutStrategySafe = GIT_CHECKOUT_SAFE,
21+
GTCheckoutStrategyForce = GIT_CHECKOUT_FORCE,
22+
GTCheckoutStrategyRecreateMissing = GIT_CHECKOUT_RECREATE_MISSING,
23+
GTCheckoutStrategyAllowConflicts = GIT_CHECKOUT_ALLOW_CONFLICTS,
24+
GTCheckoutStrategyRemoveUntracked = GIT_CHECKOUT_REMOVE_UNTRACKED,
25+
GTCheckoutStrategyRemoveIgnored = GIT_CHECKOUT_REMOVE_IGNORED,
26+
GTCheckoutStrategyUpdateOnly = GIT_CHECKOUT_UPDATE_ONLY,
27+
GTCheckoutStrategyDontUpdateIndex = GIT_CHECKOUT_DONT_UPDATE_INDEX,
28+
GTCheckoutStrategyNoRefresh = GIT_CHECKOUT_NO_REFRESH,
29+
GTCheckoutStrategySkipUnmerged = GIT_CHECKOUT_SKIP_UNMERGED,
30+
GTCheckoutStrategyUseOurs = GIT_CHECKOUT_USE_OURS,
31+
GTCheckoutStrategyUseTheirs = GIT_CHECKOUT_USE_THEIRS,
32+
GTCheckoutStrategyDisablePathspecMatch = GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH,
33+
GTCheckoutStrategySkipLockedDirectories = GIT_CHECKOUT_SKIP_LOCKED_DIRECTORIES,
34+
GTCheckoutStrategyDoNotOverwriteIgnored = GIT_CHECKOUT_DONT_OVERWRITE_IGNORED,
35+
GTCheckoutStrategyConflictStyleMerge = GIT_CHECKOUT_CONFLICT_STYLE_MERGE,
36+
GTCheckoutStrategyCoflictStyleDiff3 = GIT_CHECKOUT_CONFLICT_STYLE_DIFF3,
37+
GTCheckoutStrategyDoNotRemoveExisting = GIT_CHECKOUT_DONT_REMOVE_EXISTING,
38+
GTCheckoutStrategyDoNotWriteIndex = GIT_CHECKOUT_DONT_WRITE_INDEX,
39+
};
40+
41+
/// Checkout notification flags used by the various -checkout... methods
42+
/// See git_checkout_notify_t
43+
typedef NS_OPTIONS(NSInteger, GTCheckoutNotifyFlags) {
44+
GTCheckoutNotifyNone = GIT_CHECKOUT_NOTIFY_NONE,
45+
GTCheckoutNotifyConflict = GIT_CHECKOUT_NOTIFY_CONFLICT,
46+
GTCheckoutNotifyDirty = GIT_CHECKOUT_NOTIFY_DIRTY,
47+
GTCheckoutNotifyUpdated = GIT_CHECKOUT_NOTIFY_UPDATED,
48+
GTCheckoutNotifyUntracked = GIT_CHECKOUT_NOTIFY_UNTRACKED,
49+
GTCheckoutNotifyIgnored = GIT_CHECKOUT_NOTIFY_IGNORED,
50+
51+
GTCheckoutNotifyAll = GIT_CHECKOUT_NOTIFY_ALL,
52+
};
53+
54+
@interface GTCheckoutOptions : NSObject
55+
56+
/// Create a checkout options object.
57+
///
58+
/// Since there are many places where we can checkout data, this object allow us
59+
/// to centralize all the various behaviors that checkout allow.
60+
///
61+
/// @param strategy The checkout strategy to use.
62+
/// @param notifyFlags The checkout events that will be notified via `notifyBlock`.
63+
/// @param progressBlock A block that will be called for each checkout step.
64+
/// @param notifyBlock A block that will be called for each event, @see `notifyFlags`.
65+
///
66+
/// @return A newly-initialized GTCheckoutOptions object.
67+
+ (instancetype)checkoutOptionsWithStrategy:(GTCheckoutStrategyType)strategy notifyFlags:(GTCheckoutNotifyFlags)notifyFlags progressBlock:(nullable void (^)(NSString *path, NSUInteger completedSteps, NSUInteger totalSteps))progressBlock notifyBlock:(nullable int (^)(GTCheckoutNotifyFlags why, NSString *path, GTDiffFile *baseline, GTDiffFile *target, GTDiffFile *workdir))notifyBlock;
68+
69+
/// Create a checkout options object.
70+
/// @see +checkoutOptionsWithStrategy:notifyFlags:progressBlock:notifyBlock:
71+
+ (instancetype)checkoutOptionsWithStrategy:(GTCheckoutStrategyType)strategy notifyFlags:(GTCheckoutNotifyFlags)notifyFlags notifyBlock:(int (^)(GTCheckoutNotifyFlags why, NSString *path, GTDiffFile *baseline, GTDiffFile *target, GTDiffFile *workdir))notifyBlock;
72+
73+
/// Create a checkout options object.
74+
/// @see +checkoutOptionsWithStrategy:notifyFlags:progressBlock:notifyBlock:
75+
+ (instancetype)checkoutOptionsWithStrategy:(GTCheckoutStrategyType)strategy progressBlock:(void (^)(NSString *path, NSUInteger completedSteps, NSUInteger totalSteps))progressBlock;
76+
77+
/// Create a checkout options object.
78+
/// @see +checkoutOptionsWithStrategy:notifyFlags:progressBlock:notifyBlock:
79+
+ (instancetype)checkoutOptionsWithStrategy:(GTCheckoutStrategyType)strategy;
80+
81+
/// Get the underlying git_checkout_options struct.
82+
///
83+
/// @return <#return value description#>
84+
- (git_checkout_options *)git_checkoutOptions NS_RETURNS_INNER_POINTER;
85+
86+
/// The checkout strategy to use.
87+
@property (assign) GTCheckoutStrategyType strategy;
88+
89+
/// The checkout progress block that was passed in.
90+
@property (copy) void (^progressBlock)(NSString *path, NSUInteger completedSteps, NSUInteger totalSteps);
91+
92+
/// The notification flags currently enabled.
93+
@property (assign) GTCheckoutNotifyFlags notifyFlags;
94+
95+
/// The checkout notification block that was passed in.
96+
@property (copy) int (^notifyBlock)(GTCheckoutNotifyFlags why, NSString *path, GTDiffFile *baseline, GTDiffFile *target, GTDiffFile *workdir);
97+
98+
/// An array of strings used to restrict what will be checked out.
99+
@property (copy) NSArray <NSString *> *pathSpecs;
100+
101+
@end
102+
103+
NS_ASSUME_NONNULL_END

‎ObjectiveGit/GTCheckoutOptions.m

+100
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
//
2+
// GTCheckoutOptions.m
3+
// ObjectiveGitFramework
4+
//
5+
// Created by Etienne on 10/04/2015.
6+
// Copyright (c) 2015 GitHub, Inc. All rights reserved.
7+
//
8+
9+
#import "GTCheckoutOptions.h"
10+
#import "GTDiffFile.h"
11+
#import "NSError+Git.h"
12+
#import "NSArray+StringArray.h"
13+
#import "git2.h"
14+
15+
// The type of block set in progressBlock for progress reporting
16+
typedef void (^GTCheckoutProgressBlock)(NSString *path, NSUInteger completedSteps, NSUInteger totalSteps);
17+
18+
// The type of block set in notifyBlock for notification reporting
19+
typedef int (^GTCheckoutNotifyBlock)(GTCheckoutNotifyFlags why, NSString *path, GTDiffFile * __nullable baseline, GTDiffFile * __nullable target, GTDiffFile * __nullable workdir);
20+
21+
22+
@interface GTCheckoutOptions () {
23+
git_checkout_options _git_checkoutOptions;
24+
}
25+
@end
26+
27+
@implementation GTCheckoutOptions
28+
29+
+ (instancetype)checkoutOptionsWithStrategy:(GTCheckoutStrategyType)strategy notifyFlags:(GTCheckoutNotifyFlags)notifyFlags progressBlock:(nullable GTCheckoutProgressBlock)progressBlock notifyBlock:(nullable GTCheckoutNotifyBlock)notifyBlock {
30+
GTCheckoutOptions *options = [self checkoutOptionsWithStrategy:strategy];
31+
options.notifyFlags = notifyFlags;
32+
options.notifyBlock = notifyBlock;
33+
options.progressBlock = progressBlock;
34+
return options;
35+
}
36+
37+
+ (instancetype)checkoutOptionsWithStrategy:(GTCheckoutStrategyType)strategy progressBlock:(GTCheckoutProgressBlock)progressBlock {
38+
NSParameterAssert(progressBlock != nil);
39+
GTCheckoutOptions *options = [self checkoutOptionsWithStrategy:strategy];
40+
options.progressBlock = progressBlock;
41+
return options;
42+
}
43+
44+
+ (instancetype)checkoutOptionsWithStrategy:(GTCheckoutStrategyType)strategy notifyFlags:(GTCheckoutNotifyFlags)notifyFlags notifyBlock:(GTCheckoutNotifyBlock)notifyBlock {
45+
NSParameterAssert(notifyBlock != nil);
46+
return [self checkoutOptionsWithStrategy:strategy notifyFlags:notifyFlags progressBlock:nil notifyBlock:notifyBlock];
47+
}
48+
49+
+ (instancetype)checkoutOptionsWithStrategy:(GTCheckoutStrategyType)strategy {
50+
GTCheckoutOptions *options = [[self alloc] init];
51+
options.strategy = strategy;
52+
return options;
53+
}
54+
55+
- (instancetype)init {
56+
self = [super init];
57+
if (self == nil) return nil;
58+
59+
_git_checkoutOptions.version = GIT_CHECKOUT_OPTIONS_VERSION;
60+
61+
return self;
62+
}
63+
64+
static void GTCheckoutProgressCallback(const char *path, size_t completedSteps, size_t totalSteps, void *payload) {
65+
if (payload == NULL) return;
66+
void (^block)(NSString *, NSUInteger, NSUInteger) = (__bridge id)payload;
67+
NSString *nsPath = (path != NULL ? @(path) : nil);
68+
block(nsPath, completedSteps, totalSteps);
69+
}
70+
71+
static int GTCheckoutNotifyCallback(git_checkout_notify_t why, const char *path, const git_diff_file *baseline, const git_diff_file *target, const git_diff_file *workdir, void *payload) {
72+
if (payload == NULL) return 0;
73+
GTCheckoutNotifyBlock block = (__bridge id)payload;
74+
NSString *nsPath = (path != NULL ? @(path) : nil);
75+
GTDiffFile *gtBaseline = (baseline != NULL ? [[GTDiffFile alloc] initWithGitDiffFile:*baseline] : nil);
76+
GTDiffFile *gtTarget = (target != NULL ? [[GTDiffFile alloc] initWithGitDiffFile:*target] : nil);
77+
GTDiffFile *gtWorkdir = (workdir != NULL ? [[GTDiffFile alloc] initWithGitDiffFile:*workdir] : nil);
78+
return block((GTCheckoutNotifyFlags)why, nsPath, gtBaseline, gtTarget, gtWorkdir);
79+
}
80+
81+
- (git_checkout_options *)git_checkoutOptions {
82+
_git_checkoutOptions.checkout_strategy = self.strategy;
83+
84+
if (self.progressBlock != nil) {
85+
_git_checkoutOptions.progress_cb = GTCheckoutProgressCallback;
86+
_git_checkoutOptions.progress_payload = (__bridge void *)self.progressBlock;
87+
}
88+
89+
if (self.notifyBlock != nil) {
90+
_git_checkoutOptions.notify_cb = GTCheckoutNotifyCallback;
91+
_git_checkoutOptions.notify_flags = self.notifyFlags;
92+
_git_checkoutOptions.notify_payload = (__bridge void *)self.notifyBlock;
93+
}
94+
95+
_git_checkoutOptions.paths = self.pathSpecs.git_strarray;
96+
97+
return &_git_checkoutOptions;
98+
}
99+
100+
@end

‎ObjectiveGit/GTRepository+Merging.m

+2-3
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,7 @@ - (BOOL)mergeBranchIntoCurrentBranch:(GTBranch *)branch withError:(NSError **)er
107107
// Fast-forward branch
108108
NSString *message = [NSString stringWithFormat:@"merge %@: Fast-forward", branch.name];
109109
GTReference *reference = [localBranch.reference referenceByUpdatingTarget:remoteCommit.SHA message:message error:error];
110-
BOOL checkoutSuccess = [self checkoutReference:reference strategy:GTCheckoutStrategyForce error:error progressBlock:nil];
111-
110+
BOOL checkoutSuccess = [self checkoutReference:reference options:[GTCheckoutOptions checkoutOptionsWithStrategy:GTCheckoutStrategyForce] error:error];
112111
return checkoutSuccess;
113112
} else if (analysis & GTMergeAnalysisNormal) {
114113
// Do normal merge
@@ -164,7 +163,7 @@ - (BOOL)mergeBranchIntoCurrentBranch:(GTBranch *)branch withError:(NSError **)er
164163
return NO;
165164
}
166165

167-
BOOL success = [self checkoutReference:localBranch.reference strategy:GTCheckoutStrategyForce error:error progressBlock:nil];
166+
BOOL success = [self checkoutReference:localBranch.reference options:[GTCheckoutOptions checkoutOptionsWithStrategy:GTCheckoutStrategyForce] error:error];
168167
return success;
169168
}
170169

‎ObjectiveGit/GTRepository+References.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
// Copyright (c) 2015 GitHub, Inc. All rights reserved.
77
//
88

9-
#import "GTrepository.h"
9+
#import "GTRepository.h"
1010

1111
NS_ASSUME_NONNULL_BEGIN
1212

‎ObjectiveGit/GTRepository+RemoteOperations.m

+1-1
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ - (BOOL)pushRefspecs:(NSArray *)refspecs toRemote:(GTRemote *)remote withOptions
270270
remote_callbacks.push_transfer_progress = GTRemotePushTransferProgressCallback;
271271
remote_callbacks.payload = &connectionInfo,
272272

273-
gitError = git_remote_connect(remote.git_remote, GIT_DIRECTION_PUSH, &remote_callbacks, NULL);
273+
gitError = git_remote_connect(remote.git_remote, GIT_DIRECTION_PUSH, &remote_callbacks, NULL, NULL);
274274
if (gitError != GIT_OK) {
275275
if (error != NULL) *error = [NSError git_errorFor:gitError description:@"Failed to connect remote"];
276276
return NO;

‎ObjectiveGit/GTRepository+Stashing.h

+12-8
Original file line numberDiff line numberDiff line change
@@ -64,21 +64,25 @@ NS_ASSUME_NONNULL_BEGIN
6464

6565
/// Apply stashed changes.
6666
///
67-
/// index - The index of the stash to apply. 0 is the latest one.
68-
/// flags - The flags to use when applying the stash.
69-
/// error - If not NULL, set to any error that occurred.
67+
/// index - The index of the stash to apply. 0 is the latest one.
68+
/// flags - The flags to use when applying the stash.
69+
/// options - The options to use when checking out (if nil, use the defaults provided by libgit2).
70+
/// error - If not NULL, set to any error that occurred.
71+
/// progressBlock - A block that will be executed on each step of the stash application.
7072
///
7173
/// Returns YES if the requested stash was successfully applied, NO otherwise.
72-
- (BOOL)applyStashAtIndex:(NSUInteger)index flags:(GTRepositoryStashApplyFlag)flags error:(NSError **)error progressBlock:(nullable void (^)(GTRepositoryStashApplyProgress progress, BOOL *stop))progressBlock;
74+
- (BOOL)applyStashAtIndex:(NSUInteger)index flags:(GTRepositoryStashApplyFlag)flags checkoutOptions:(nullable GTCheckoutOptions *)options error:(NSError **)error progressBlock:(nullable void (^)(GTRepositoryStashApplyProgress progress, BOOL *stop))progressBlock;
7375

7476
/// Pop stashed changes.
7577
///
76-
/// index - The index of the stash to apply. 0 is the most recent stash.
77-
/// flags - The flags to use when applying the stash.
78-
/// error - If not NULL, set to any error that occurred.
78+
/// index - The index of the stash to apply. 0 is the most recent stash.
79+
/// flags - The flags to use when applying the stash.
80+
/// options - The options to use when checking out (if nil, use the defaults provided by libgit2).
81+
/// error - If not NULL, set to any error that occurred.
82+
/// progressBlock - A block that will be executed on each step of the stash application.
7983
///
8084
/// Returns YES if the requested stash was successfully applied, NO otherwise.
81-
- (BOOL)popStashAtIndex:(NSUInteger)index flags:(GTRepositoryStashApplyFlag)flags error:(NSError **)error progressBlock:(nullable void (^)(GTRepositoryStashApplyProgress progress, BOOL *stop))progressBlock;
85+
- (BOOL)popStashAtIndex:(NSUInteger)index flags:(GTRepositoryStashApplyFlag)flags checkoutOptions:(nullable GTCheckoutOptions *)options error:(NSError **)error progressBlock:(nullable void (^)(GTRepositoryStashApplyProgress progress, BOOL *stop))progressBlock;
8286

8387
/// Drop a stash from the repository's list of stashes.
8488
///

‎ObjectiveGit/GTRepository+Stashing.m

+12-2
Original file line numberDiff line numberDiff line change
@@ -59,15 +59,20 @@ static int stashApplyProgressCallback(git_stash_apply_progress_t progress, void
5959
return (stop ? GIT_EUSER : 0);
6060
}
6161

62-
- (BOOL)applyStashAtIndex:(NSUInteger)index flags:(GTRepositoryStashApplyFlag)flags error:(NSError **)error progressBlock:(nullable void (^)(GTRepositoryStashApplyProgress progress, BOOL *stop))progressBlock {
62+
- (BOOL)applyStashAtIndex:(NSUInteger)index flags:(GTRepositoryStashApplyFlag)flags checkoutOptions:(GTCheckoutOptions *)options error:(NSError **)error progressBlock:(nullable void (^)(GTRepositoryStashApplyProgress progress, BOOL *stop))progressBlock {
6363
git_stash_apply_options stash_options = GIT_STASH_APPLY_OPTIONS_INIT;
6464

6565
stash_options.flags = (git_stash_apply_flags)flags;
66+
6667
if (progressBlock != nil) {
6768
stash_options.progress_cb = stashApplyProgressCallback;
6869
stash_options.progress_payload = (__bridge void *)progressBlock;
6970
}
7071

72+
if (options != nil) {
73+
stash_options.checkout_options = *options.git_checkoutOptions;
74+
}
75+
7176
int gitError = git_stash_apply(self.git_repository, index, &stash_options);
7277
if (gitError != GIT_OK) {
7378
if (error != NULL) *error = [NSError git_errorFor:gitError description:@"Stash apply failed" failureReason:@"The stash at index %ld couldn't be applied.", (unsigned long)index];
@@ -76,15 +81,20 @@ - (BOOL)applyStashAtIndex:(NSUInteger)index flags:(GTRepositoryStashApplyFlag)fl
7681
return YES;
7782
}
7883

79-
- (BOOL)popStashAtIndex:(NSUInteger)index flags:(GTRepositoryStashApplyFlag)flags error:(NSError **)error progressBlock:(nullable void (^)(GTRepositoryStashApplyProgress progress, BOOL *stop))progressBlock {
84+
- (BOOL)popStashAtIndex:(NSUInteger)index flags:(GTRepositoryStashApplyFlag)flags checkoutOptions:(GTCheckoutOptions *)options error:(NSError **)error progressBlock:(nullable void (^)(GTRepositoryStashApplyProgress progress, BOOL *stop))progressBlock{
8085
git_stash_apply_options stash_options = GIT_STASH_APPLY_OPTIONS_INIT;
8186

8287
stash_options.flags = (git_stash_apply_flags)flags;
88+
8389
if (progressBlock != nil) {
8490
stash_options.progress_cb = stashApplyProgressCallback;
8591
stash_options.progress_payload = (__bridge void *)progressBlock;
8692
}
8793

94+
if (options != nil) {
95+
stash_options.checkout_options = *options.git_checkoutOptions;
96+
}
97+
8898
int gitError = git_stash_pop(self.git_repository, index, &stash_options);
8999
if (gitError != GIT_OK) {
90100
if (error != NULL) *error = [NSError git_errorFor:gitError description:@"Stash pop failed" failureReason:@"The stash at index %ld couldn't be applied.", (unsigned long)index];

‎ObjectiveGit/GTRepository.h

+23-57
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#import "GTObject.h"
3535
#import "GTReference.h"
3636
#import "GTFilterList.h"
37+
#import "GTCheckoutOptions.h"
3738
#import "git2/checkout.h"
3839
#import "git2/repository.h"
3940
#import "git2/transport.h"
@@ -55,35 +56,6 @@
5556

5657
NS_ASSUME_NONNULL_BEGIN
5758

58-
/// Checkout strategies used by the various -checkout... methods
59-
/// See git_checkout_strategy_t
60-
typedef NS_OPTIONS(NSInteger, GTCheckoutStrategyType) {
61-
GTCheckoutStrategyNone = GIT_CHECKOUT_NONE,
62-
GTCheckoutStrategySafe = GIT_CHECKOUT_SAFE,
63-
GTCheckoutStrategyForce = GIT_CHECKOUT_FORCE,
64-
GTCheckoutStrategyAllowConflicts = GIT_CHECKOUT_ALLOW_CONFLICTS,
65-
GTCheckoutStrategyRemoveUntracked = GIT_CHECKOUT_REMOVE_UNTRACKED,
66-
GTCheckoutStrategyRemoveIgnored = GIT_CHECKOUT_REMOVE_IGNORED,
67-
GTCheckoutStrategyUpdateOnly = GIT_CHECKOUT_UPDATE_ONLY,
68-
GTCheckoutStrategyDontUpdateIndex = GIT_CHECKOUT_DONT_UPDATE_INDEX,
69-
GTCheckoutStrategyNoRefresh = GIT_CHECKOUT_NO_REFRESH,
70-
GTCheckoutStrategyDisablePathspecMatch = GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH,
71-
GTCheckoutStrategySkipLockedDirectories = GIT_CHECKOUT_SKIP_LOCKED_DIRECTORIES,
72-
};
73-
74-
/// Checkout notification flags used by the various -checkout... methods
75-
/// See git_checkout_notify_t
76-
typedef NS_OPTIONS(NSInteger, GTCheckoutNotifyFlags) {
77-
GTCheckoutNotifyNone = GIT_CHECKOUT_NOTIFY_NONE,
78-
GTCheckoutNotifyConflict = GIT_CHECKOUT_NOTIFY_CONFLICT,
79-
GTCheckoutNotifyDirty = GIT_CHECKOUT_NOTIFY_DIRTY,
80-
GTCheckoutNotifyUpdated = GIT_CHECKOUT_NOTIFY_UPDATED,
81-
GTCheckoutNotifyUntracked = GIT_CHECKOUT_NOTIFY_UNTRACKED,
82-
GTCheckoutNotifyIgnored = GIT_CHECKOUT_NOTIFY_IGNORED,
83-
84-
GTCheckoutNotifyAll = GIT_CHECKOUT_NOTIFY_ALL,
85-
};
86-
8759
/// Transport flags sent as options to +cloneFromURL... method
8860
typedef NS_OPTIONS(NSInteger, GTTransportFlags) {
8961
GTTransportFlagsNone = GIT_TRANSPORTFLAGS_NONE
@@ -101,6 +73,9 @@ extern NSString * const GTRepositoryCloneOptionsBare;
10173
/// Default value is `YES`.
10274
extern NSString * const GTRepositoryCloneOptionsCheckout;
10375

76+
/// A `GTCheckoutOptions` object describing how to perform the checkout.
77+
extern NSString * const GTRepositoryCloneCheckoutOptions;
78+
10479
/// A `GTCredentialProvider`, that will be used to authenticate against the
10580
/// remote.
10681
extern NSString * const GTRepositoryCloneOptionsCredentialProvider;
@@ -253,7 +228,7 @@ typedef NS_ENUM(NSInteger, GTRepositoryStateType) {
253228
/// options - A dictionary consisting of the options:
254229
/// `GTRepositoryCloneOptionsTransportFlags`,
255230
/// `GTRepositoryCloneOptionsBare`,
256-
/// `GTRepositoryCloneOptionsCheckout`,
231+
/// `GTRepositoryCloneCheckoutOptions`,
257232
/// `GTRepositoryCloneOptionsCredentialProvider`,
258233
/// `GTRepositoryCloneOptionsCloneLocal`,
259234
/// `GTRepositoryCloneOptionsServerCertificateURL`
@@ -265,7 +240,7 @@ typedef NS_ENUM(NSInteger, GTRepositoryStateType) {
265240
/// May be NULL.
266241
///
267242
/// returns nil (and fills the error parameter) if an error occurred, or a GTRepository object if successful.
268-
+ (nullable instancetype)cloneFromURL:(NSURL *)originURL toWorkingDirectory:(NSURL *)workdirURL options:(nullable NSDictionary *)options error:(NSError **)error transferProgressBlock:(nullable void (^)(const git_transfer_progress *, BOOL *stop))transferProgressBlock checkoutProgressBlock:(nullable void (^) (NSString *__nullable path, NSUInteger completedSteps, NSUInteger totalSteps))checkoutProgressBlock;
243+
+ (nullable instancetype)cloneFromURL:(NSURL *)originURL toWorkingDirectory:(NSURL *)workdirURL options:(nullable NSDictionary *)options error:(NSError **)error transferProgressBlock:(nullable void (^)(const git_transfer_progress *, BOOL *stop))transferProgressBlock;
269244

270245
/// Lookup objects in the repo by oid or sha1
271246
- (nullable id)lookUpObjectByOID:(GTOID *)oid objectType:(GTObjectType)type error:(NSError **)error;
@@ -536,48 +511,39 @@ typedef NS_ENUM(NSInteger, GTRepositoryStateType) {
536511
/// Checkout a commit
537512
///
538513
/// targetCommit - The commit to checkout. Must not be nil.
539-
/// strategy - The checkout strategy to use.
540-
/// notifyFlags - Flags that indicate which notifications should cause `notifyBlock`
541-
/// to be called.
514+
/// options - The checkout options to use. Can be nil.
542515
/// error - The error if one occurred. Can be NULL.
543-
/// notifyBlock - The block to call back for notification handling. Can be nil.
544-
/// progressBlock - The block to call back for progress updates. Can be nil.
545516
///
546517
/// Returns YES if operation was successful, NO otherwise
547-
- (BOOL)checkoutCommit:(GTCommit *)targetCommit strategy:(GTCheckoutStrategyType)strategy notifyFlags:(GTCheckoutNotifyFlags)notifyFlags error:(NSError **)error progressBlock:(nullable void (^)(NSString *path, NSUInteger completedSteps, NSUInteger totalSteps))progressBlock notifyBlock:(nullable int (^)(GTCheckoutNotifyFlags why, NSString *path, GTDiffFile *baseline, GTDiffFile *target, GTDiffFile *workdir))notifyBlock;
518+
- (BOOL)checkoutCommit:(GTCommit *)targetCommit options:(nullable GTCheckoutOptions *)options error:(NSError **)error;
548519

549520
/// Checkout a reference
550521
///
551-
/// targetReference - The reference to checkout.
552-
/// strategy - The checkout strategy to use.
553-
/// notifyFlags - Flags that indicate which notifications should cause `notifyBlock`
554-
/// to be called.
555-
/// error - The error if one occurred. Can be NULL.
556-
/// notifyBlock - The block to call back for notification handling. Can be nil.
557-
/// progressBlock - The block to call back for progress updates. Can be nil.
522+
/// targetReference - The reference to checkout. Must not be nil.
523+
/// options - The checkout options to use. Can be nil.
524+
/// error - The error if one occurred. Can be NULL.
558525
///
559526
/// Returns YES if operation was successful, NO otherwise
560-
- (BOOL)checkoutReference:(GTReference *)targetReference strategy:(GTCheckoutStrategyType)strategy notifyFlags:(GTCheckoutNotifyFlags)notifyFlags error:(NSError **)error progressBlock:(nullable void (^)(NSString *path, NSUInteger completedSteps, NSUInteger totalSteps))progressBlock notifyBlock:(nullable int (^)(GTCheckoutNotifyFlags why, NSString *path, GTDiffFile *baseline, GTDiffFile *target, GTDiffFile *workdir))notifyBlock;
527+
- (BOOL)checkoutReference:(GTReference *)targetReference options:(nullable GTCheckoutOptions *)options error:(NSError **)error;
528+
529+
/// Checkout an index
530+
///
531+
/// index - The index to checkout. Must not be nil.
532+
/// options - The checkout options to use. Can be nil.
533+
/// error - The error if one occurred. Can be NULL.
534+
///
535+
/// Returns YES if operation was successful, NO otherwise
536+
- (BOOL)checkoutIndex:(GTIndex *)index options:(nullable GTCheckoutOptions *)options error:(NSError **)error;
561537

562538
/// Checkout a tree
563539
///
564540
/// targetTree - The tree to checkout.
565-
/// strategy - The checkout strategy to use.
566-
/// notifyFlags - Flags that indicate which notifications should cause `notifyBlock`
567-
/// to be called.
541+
/// options - The checkout options to use. Can be nil.
568542
/// error - The error if one occurred. Can be NULL.
569-
/// notifyBlock - The block to call back for notification handling. Can be nil.
570-
/// progressBlock - The block to call back for progress updates. Can be nil.
571543
///
572544
/// Returns YES if operation was successful, NO otherwise
573545
/// Note: this operation will NOT update HEAD to newly checked out tree.
574-
- (BOOL)checkoutTree:(GTTree *)targetTree strategy:(GTCheckoutStrategyType)strategy notifyFlags:(GTCheckoutNotifyFlags)notifyFlags error:(NSError **)error progressBlock:(nullable void (^)(NSString *path, NSUInteger completedSteps, NSUInteger totalSteps))progressBlock notifyBlock:(nullable int (^)(GTCheckoutNotifyFlags why, NSString *path, GTDiffFile *baseline, GTDiffFile *target, GTDiffFile *workdir))notifyBlock;
575-
576-
/// Convenience wrapper for checkoutCommit:strategy:notifyFlags:error:notifyBlock:progressBlock without notifications
577-
- (BOOL)checkoutCommit:(GTCommit *)target strategy:(GTCheckoutStrategyType)strategy error:(NSError **)error progressBlock:(nullable void (^)(NSString *path, NSUInteger completedSteps, NSUInteger totalSteps))progressBlock;
578-
579-
/// Convenience wrapper for checkoutReference:strategy:notifyFlags:error:notifyBlock:progressBlock without notifications
580-
- (BOOL)checkoutReference:(GTReference *)target strategy:(GTCheckoutStrategyType)strategy error:(NSError **)error progressBlock:(nullable void (^)(NSString *path, NSUInteger completedSteps, NSUInteger totalSteps))progressBlock;
546+
- (BOOL)checkoutTree:(GTTree *)targetTree options:(nullable GTCheckoutOptions *)options error:(NSError **)error;
581547

582548
/// Flush the gitattributes cache.
583549
- (void)flushAttributesCache;

‎ObjectiveGit/GTRepository.m

+27-64
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131

3232
#import "GTBlob.h"
3333
#import "GTBranch.h"
34+
#import "GTCheckoutOptions.h"
3435
#import "GTCommit.h"
3536
#import "GTConfiguration+Private.h"
3637
#import "GTConfiguration.h"
@@ -59,7 +60,7 @@
5960
#import "git2.h"
6061

6162
NSString * const GTRepositoryCloneOptionsBare = @"GTRepositoryCloneOptionsBare";
62-
NSString * const GTRepositoryCloneOptionsCheckout = @"GTRepositoryCloneOptionsCheckout";
63+
NSString * const GTRepositoryCloneCheckoutOptions = @"GTRepositoryCloneCheckoutOptions";
6364
NSString * const GTRepositoryCloneOptionsTransportFlags = @"GTRepositoryCloneOptionsTransportFlags";
6465
NSString * const GTRepositoryCloneOptionsCredentialProvider = @"GTRepositoryCloneOptionsCredentialProvider";
6566
NSString * const GTRepositoryCloneOptionsCloneLocal = @"GTRepositoryCloneOptionsCloneLocal";
@@ -212,18 +213,11 @@ - (instancetype)initWithURL:(NSURL *)localFileURL flags:(NSInteger)flags ceiling
212213

213214
typedef void(^GTTransferProgressBlock)(const git_transfer_progress *progress, BOOL *stop);
214215

215-
static void checkoutProgressCallback(const char *path, size_t completedSteps, size_t totalSteps, void *payload) {
216-
if (payload == NULL) return;
217-
void (^block)(NSString *, NSUInteger, NSUInteger) = (__bridge id)payload;
218-
NSString *nsPath = (path != NULL ? [NSString stringWithUTF8String:path] : nil);
219-
block(nsPath, completedSteps, totalSteps);
220-
}
221-
222216
static int transferProgressCallback(const git_transfer_progress *progress, void *payload) {
223217
if (payload == NULL) return 0;
224218
struct GTClonePayload *pld = payload;
225219
if (pld->transferProgressBlock == NULL) return 0;
226-
220+
227221
BOOL stop = NO;
228222
pld->transferProgressBlock(progress, &stop);
229223
return (stop ? GIT_EUSER : 0);
@@ -243,22 +237,20 @@ static int remoteCreate(git_remote **remote, git_repository *repo, const char *n
243237
return GIT_OK;
244238
}
245239

246-
+ (instancetype)cloneFromURL:(NSURL *)originURL toWorkingDirectory:(NSURL *)workdirURL options:(NSDictionary *)options error:(NSError **)error transferProgressBlock:(void (^)(const git_transfer_progress *, BOOL *stop))transferProgressBlock checkoutProgressBlock:(void (^)(NSString *__nullable path, NSUInteger completedSteps, NSUInteger totalSteps))checkoutProgressBlock {
240+
struct GTRemoteCreatePayload {
241+
git_remote_callbacks remoteCallbacks;
242+
};
243+
244+
+ (nullable instancetype)cloneFromURL:(NSURL *)originURL toWorkingDirectory:(NSURL *)workdirURL options:(nullable NSDictionary *)options error:(NSError **)error transferProgressBlock:(nullable void (^)(const git_transfer_progress *, BOOL *stop))transferProgressBlock {
247245

248246
git_clone_options cloneOptions = GIT_CLONE_OPTIONS_INIT;
249247

250248
NSNumber *bare = options[GTRepositoryCloneOptionsBare];
251249
cloneOptions.bare = (bare == nil ? 0 : bare.boolValue);
252250

253-
NSNumber *checkout = options[GTRepositoryCloneOptionsCheckout];
254-
BOOL withCheckout = (checkout == nil ? YES : checkout.boolValue);
255-
256-
if (withCheckout) {
257-
git_checkout_options checkoutOptions = GIT_CHECKOUT_OPTIONS_INIT;
258-
checkoutOptions.checkout_strategy = GIT_CHECKOUT_SAFE;
259-
checkoutOptions.progress_cb = checkoutProgressCallback;
260-
checkoutOptions.progress_payload = (__bridge void *)checkoutProgressBlock;
261-
cloneOptions.checkout_opts = checkoutOptions;
251+
GTCheckoutOptions *checkoutOptions = options[GTRepositoryCloneCheckoutOptions];
252+
if (checkoutOptions != nil) {
253+
cloneOptions.checkout_opts = *(checkoutOptions.git_checkoutOptions);
262254
}
263255

264256
GTCredentialProvider *provider = options[GTRepositoryCloneOptionsCredentialProvider];
@@ -284,7 +276,7 @@ + (instancetype)cloneFromURL:(NSURL *)originURL toWorkingDirectory:(NSURL *)work
284276
if (localClone) {
285277
cloneOptions.local = GIT_CLONE_NO_LOCAL;
286278
}
287-
279+
288280
NSURL *serverCertificateURL = options[GTRepositoryCloneOptionsServerCertificateURL];
289281
if (serverCertificateURL) {
290282
int gitError = git_libgit2_opts(GIT_OPT_SET_SSL_CERT_LOCATIONS, serverCertificateURL.fileSystemRepresentation, NULL);
@@ -310,8 +302,6 @@ + (instancetype)cloneFromURL:(NSURL *)originURL toWorkingDirectory:(NSURL *)work
310302
}
311303

312304
return [[self alloc] initWithGitRepository:repository];
313-
314-
return nil;
315305
}
316306

317307
- (id)lookUpObjectByGitOid:(const git_oid *)oid objectType:(GTObjectType)type error:(NSError **)error {
@@ -795,22 +785,6 @@ - (GTTag *)createTagNamed:(NSString *)tagName target:(GTObject *)theTarget tagge
795785

796786
#pragma mark Checkout
797787

798-
// The type of block passed to -checkout:strategy:progressBlock:notifyBlock:notifyFlags:error: for progress reporting
799-
typedef void (^GTCheckoutProgressBlock)(NSString *path, NSUInteger completedSteps, NSUInteger totalSteps);
800-
801-
// The type of block passed to -checkout:strategy:progressBlock:notifyBlock:notifyFlags:error: for notification reporting
802-
typedef int (^GTCheckoutNotifyBlock)(GTCheckoutNotifyFlags why, NSString *path, GTDiffFile *baseline, GTDiffFile *target, GTDiffFile *workdir);
803-
804-
static int checkoutNotifyCallback(git_checkout_notify_t why, const char *path, const git_diff_file *baseline, const git_diff_file *target, const git_diff_file *workdir, void *payload) {
805-
if (payload == NULL) return 0;
806-
GTCheckoutNotifyBlock block = (__bridge id)payload;
807-
NSString *nsPath = (path != NULL ? @(path) : nil);
808-
GTDiffFile *gtBaseline = (baseline != NULL ? [[GTDiffFile alloc] initWithGitDiffFile:*baseline] : nil);
809-
GTDiffFile *gtTarget = (target != NULL ? [[GTDiffFile alloc] initWithGitDiffFile:*target] : nil);
810-
GTDiffFile *gtWorkdir = (workdir != NULL ? [[GTDiffFile alloc] initWithGitDiffFile:*workdir] : nil);
811-
return block((GTCheckoutNotifyFlags)why, nsPath, gtBaseline, gtTarget, gtWorkdir);
812-
}
813-
814788
- (BOOL)moveHEADToReference:(GTReference *)reference error:(NSError **)error {
815789
NSParameterAssert(reference != nil);
816790

@@ -833,51 +807,40 @@ - (BOOL)moveHEADToCommit:(GTCommit *)commit error:(NSError **)error {
833807
return gitError == GIT_OK;
834808
}
835809

836-
- (BOOL)performCheckout:(GTObject *)target withStrategy:(GTCheckoutStrategyType)strategy notifyFlags:(GTCheckoutNotifyFlags)notifyFlags error:(NSError **)error progressBlock:(GTCheckoutProgressBlock)progressBlock notifyBlock:(GTCheckoutNotifyBlock)notifyBlock {
837-
838-
git_checkout_options checkoutOptions = GIT_CHECKOUT_OPTIONS_INIT;
839-
840-
checkoutOptions.checkout_strategy = strategy;
841-
checkoutOptions.progress_cb = checkoutProgressCallback;
842-
checkoutOptions.progress_payload = (__bridge void *)progressBlock;
843-
844-
checkoutOptions.notify_cb = checkoutNotifyCallback;
845-
checkoutOptions.notify_flags = notifyFlags;
846-
checkoutOptions.notify_payload = (__bridge void *)notifyBlock;
847-
848-
int gitError = git_checkout_tree(self.git_repository, target.git_object, &checkoutOptions);
810+
- (BOOL)performCheckout:(GTObject *)target options:(nullable GTCheckoutOptions *)options error:(NSError **)error {
811+
int gitError = git_checkout_tree(self.git_repository, target.git_object, options.git_checkoutOptions);
849812
if (gitError < GIT_OK) {
850813
if (error != NULL) *error = [NSError git_errorFor:gitError description:@"Failed to checkout tree."];
851814
}
852-
853815
return gitError == GIT_OK;
854816
}
855817

856-
- (BOOL)checkoutCommit:(GTCommit *)targetCommit strategy:(GTCheckoutStrategyType)strategy notifyFlags:(GTCheckoutNotifyFlags)notifyFlags error:(NSError **)error progressBlock:(GTCheckoutProgressBlock)progressBlock notifyBlock:(GTCheckoutNotifyBlock)notifyBlock {
857-
BOOL success = [self performCheckout:targetCommit withStrategy:strategy notifyFlags:notifyFlags error:error progressBlock:progressBlock notifyBlock:notifyBlock];
818+
- (BOOL)checkoutCommit:(GTCommit *)targetCommit options:(GTCheckoutOptions *)options error:(NSError **)error {
819+
BOOL success = [self performCheckout:targetCommit options:options error:error];
858820
if (success == NO) return NO;
859821
return [self moveHEADToCommit:targetCommit error:error];
860822
}
861823

862-
- (BOOL)checkoutReference:(GTReference *)targetReference strategy:(GTCheckoutStrategyType)strategy notifyFlags:(GTCheckoutNotifyFlags)notifyFlags error:(NSError **)error progressBlock:(GTCheckoutProgressBlock)progressBlock notifyBlock:(GTCheckoutNotifyBlock)notifyBlock {
824+
- (BOOL)checkoutReference:(GTReference *)targetReference options:(GTCheckoutOptions *)options error:(NSError **)error {
863825
GTOID *targetOID = [targetReference targetOID];
864826
GTObject *target = [self lookUpObjectByOID:targetOID error:error];
865827
if (target == nil) return NO;
866-
BOOL success = [self performCheckout:target withStrategy:strategy notifyFlags:notifyFlags error:error progressBlock:progressBlock notifyBlock:notifyBlock];
828+
BOOL success = [self performCheckout:target options:options error:error];
867829
if (success == NO) return NO;
868830
return [self moveHEADToReference:targetReference error:error];
869831
}
870832

871-
- (BOOL)checkoutTree:(GTTree *)targetTree strategy:(GTCheckoutStrategyType)strategy notifyFlags:(GTCheckoutNotifyFlags)notifyFlags error:(NSError **)error progressBlock:(GTCheckoutProgressBlock)progressBlock notifyBlock:(GTCheckoutNotifyBlock)notifyBlock {
872-
return [self performCheckout:targetTree withStrategy:strategy notifyFlags:notifyFlags error:error progressBlock:progressBlock notifyBlock:notifyBlock];
833+
- (BOOL)checkoutTree:(GTTree *)targetTree options:(nullable GTCheckoutOptions *)options error:(NSError **)error {
834+
return [self performCheckout:targetTree options:options error:error];
873835
}
874836

875-
- (BOOL)checkoutCommit:(GTCommit *)target strategy:(GTCheckoutStrategyType)strategy error:(NSError **)error progressBlock:(GTCheckoutProgressBlock)progressBlock {
876-
return [self checkoutCommit:target strategy:strategy notifyFlags:GTCheckoutNotifyNone error:error progressBlock:progressBlock notifyBlock:nil];
877-
}
878-
879-
- (BOOL)checkoutReference:(GTReference *)target strategy:(GTCheckoutStrategyType)strategy error:(NSError **)error progressBlock:(GTCheckoutProgressBlock)progressBlock {
880-
return [self checkoutReference:target strategy:strategy notifyFlags:GTCheckoutNotifyNone error:error progressBlock:progressBlock notifyBlock:nil];
837+
- (BOOL)checkoutIndex:(GTIndex *)index options:(GTCheckoutOptions *)options error:(NSError **)error {
838+
int gitError = git_checkout_index(self.git_repository, index.git_index, options.git_checkoutOptions);
839+
if (gitError < GIT_OK) {
840+
if (error != NULL) *error = [NSError git_errorFor:gitError description:@"Failed to checkout index."];
841+
return NO;
842+
}
843+
return YES;
881844
}
882845

883846
- (void)flushAttributesCache {

‎ObjectiveGit/ObjectiveGit.h

+1
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ FOUNDATION_EXPORT const unsigned char ObjectiveGitVersionString[];
7171
#import <ObjectiveGit/GTFilterSource.h>
7272
#import <ObjectiveGit/GTFetchHeadEntry.h>
7373
#import <ObjectiveGit/GTNote.h>
74+
#import <ObjectiveGit/GTCheckoutOptions.h>
7475

7576
#import <ObjectiveGit/GTObjectDatabase.h>
7677
#import <ObjectiveGit/GTOdbObject.h>

‎ObjectiveGitFramework.xcodeproj/project.pbxproj

+12
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,10 @@
9494
4D79C0EE17DF9F4D00997DE4 /* GTCredential.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D79C0EC17DF9F4D00997DE4 /* GTCredential.h */; settings = {ATTRIBUTES = (Public, ); }; };
9595
4D79C0EF17DF9F4D00997DE4 /* GTCredential.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D79C0ED17DF9F4D00997DE4 /* GTCredential.m */; };
9696
4DBA4A3217DA73CE006CD5F5 /* GTRemoteSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 4DBA4A3117DA73CE006CD5F5 /* GTRemoteSpec.m */; };
97+
4DC55AE51AD859AD0032563C /* GTCheckoutOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DC55AE31AD859AD0032563C /* GTCheckoutOptions.h */; settings = {ATTRIBUTES = (Public, ); }; };
98+
4DC55AE61AD859AD0032563C /* GTCheckoutOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DC55AE31AD859AD0032563C /* GTCheckoutOptions.h */; settings = {ATTRIBUTES = (Public, ); }; };
99+
4DC55AE71AD859AD0032563C /* GTCheckoutOptions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4DC55AE41AD859AD0032563C /* GTCheckoutOptions.m */; };
100+
4DC55AE81AD859AD0032563C /* GTCheckoutOptions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4DC55AE41AD859AD0032563C /* GTCheckoutOptions.m */; };
97101
4DFFB15B183AA8D600D1565E /* GTRepository+RemoteOperations.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DFFB159183AA8D600D1565E /* GTRepository+RemoteOperations.h */; settings = {ATTRIBUTES = (Public, ); }; };
98102
4DFFB15C183AA8D600D1565E /* GTRepository+RemoteOperations.m in Sources */ = {isa = PBXBuildFile; fileRef = 4DFFB15A183AA8D600D1565E /* GTRepository+RemoteOperations.m */; };
99103
55C8055013861FE7004DCB0F /* GTObjectDatabase.m in Sources */ = {isa = PBXBuildFile; fileRef = 55C8054D13861F34004DCB0F /* GTObjectDatabase.m */; };
@@ -487,6 +491,8 @@
487491
4D79C0ED17DF9F4D00997DE4 /* GTCredential.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTCredential.m; sourceTree = "<group>"; };
488492
4D79C0F617DFAA7100997DE4 /* GTCredential+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "GTCredential+Private.h"; sourceTree = "<group>"; };
489493
4DBA4A3117DA73CE006CD5F5 /* GTRemoteSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTRemoteSpec.m; sourceTree = "<group>"; };
494+
4DC55AE31AD859AD0032563C /* GTCheckoutOptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTCheckoutOptions.h; sourceTree = "<group>"; };
495+
4DC55AE41AD859AD0032563C /* GTCheckoutOptions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTCheckoutOptions.m; sourceTree = "<group>"; };
490496
4DE864341794A37E00371A65 /* GTRepository+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "GTRepository+Private.h"; sourceTree = "<group>"; };
491497
4DFFB159183AA8D600D1565E /* GTRepository+RemoteOperations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "GTRepository+RemoteOperations.h"; sourceTree = "<group>"; };
492498
4DFFB15A183AA8D600D1565E /* GTRepository+RemoteOperations.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GTRepository+RemoteOperations.m"; sourceTree = "<group>"; };
@@ -959,6 +965,8 @@
959965
88E352FF1982E9160051001F /* GTRepository+Attributes.m */,
960966
6EEB519F199D62B9001D72C0 /* GTFetchHeadEntry.h */,
961967
6EEB51A0199D62B9001D72C0 /* GTFetchHeadEntry.m */,
968+
4DC55AE31AD859AD0032563C /* GTCheckoutOptions.h */,
969+
4DC55AE41AD859AD0032563C /* GTCheckoutOptions.m */,
962970
);
963971
path = ObjectiveGit;
964972
sourceTree = "<group>";
@@ -1077,6 +1085,7 @@
10771085
BDFAF9C3131C1845000508BC /* GTIndex.h in Headers */,
10781086
BDFAF9C9131C1868000508BC /* GTIndexEntry.h in Headers */,
10791087
6EEB51A1199D62B9001D72C0 /* GTFetchHeadEntry.h in Headers */,
1088+
4DC55AE51AD859AD0032563C /* GTCheckoutOptions.h in Headers */,
10801089
BD441E08131ED0C300187010 /* GTReference.h in Headers */,
10811090
88F6D9D91320451F00CC0BA8 /* ObjectiveGit.h in Headers */,
10821091
88B2131C1B20E785005CF2C5 /* GTRepository+References.h in Headers */,
@@ -1160,6 +1169,7 @@
11601169
D01B6F5919F82FA600D411BC /* GTOID.h in Headers */,
11611170
D01B6F6D19F82FB300D411BC /* GTDiffFile.h in Headers */,
11621171
D01B6F2F19F82F8700D411BC /* GTObject.h in Headers */,
1172+
4DC55AE61AD859AD0032563C /* GTCheckoutOptions.h in Headers */,
11631173
D01B6F4B19F82F8700D411BC /* GTConfiguration.h in Headers */,
11641174
D01B6F6719F82FA600D411BC /* GTFetchHeadEntry.h in Headers */,
11651175
D01B6F5F19F82FA600D411BC /* GTFilter.h in Headers */,
@@ -1461,6 +1471,7 @@
14611471
23F39FAE1C86DB1C00849F3C /* GTRepository+Merging.m in Sources */,
14621472
30DCBA6517B45A78009B0EBD /* GTRepository+Status.m in Sources */,
14631473
BD6C235413146E6A00992935 /* GTObject.m in Sources */,
1474+
4DC55AE71AD859AD0032563C /* GTCheckoutOptions.m in Sources */,
14641475
BD6C254613148DD300992935 /* GTSignature.m in Sources */,
14651476
BD6B0412131496B8001909D0 /* GTTree.m in Sources */,
14661477
BD6B0418131496CC001909D0 /* GTTreeEntry.m in Sources */,
@@ -1522,6 +1533,7 @@
15221533
23F39FB01C86E01800849F3C /* GTRepository+Merging.m in Sources */,
15231534
D019778A19F8307600F523DA /* ObjectiveGit.m in Sources */,
15241535
D01B6F3219F82F8700D411BC /* GTCommit.m in Sources */,
1536+
4DC55AE81AD859AD0032563C /* GTCheckoutOptions.m in Sources */,
15251537
D01B6F3819F82F8700D411BC /* GTTree.m in Sources */,
15261538
D01B6F6C19F82FB300D411BC /* GTDiff.m in Sources */,
15271539
884C8A3A19FF4B890017E98D /* EXTScope.m in Sources */,

‎ObjectiveGitTests/GTFilterSpec.m

+1-1
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@
159159
BOOL success = [NSFileManager.defaultManager removeItemAtURL:testFileURL error:NULL];
160160
expect(@(success)).to(beTruthy());
161161

162-
success = [repository checkoutCommit:newCommit strategy:GTCheckoutStrategyForce error:NULL progressBlock:NULL];
162+
success = [repository checkoutCommit:newCommit options:[GTCheckoutOptions checkoutOptionsWithStrategy:GTCheckoutStrategyForce] error:NULL];
163163
expect(@(success)).to(beTruthy());
164164

165165
expect([NSData dataWithContentsOfURL:testFileURL]).to(equal(replacementData));

‎ObjectiveGitTests/GTRemotePushSpec.m

+2-2
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
// Make a bare clone to serve as the remote
4040
remoteRepoURL = [notBareRepo.gitDirectoryURL.URLByDeletingLastPathComponent URLByAppendingPathComponent:@"bare_remote_repo.git"];
4141
NSDictionary *options = @{ GTRepositoryCloneOptionsBare: @1 };
42-
remoteRepo = [GTRepository cloneFromURL:notBareRepo.gitDirectoryURL toWorkingDirectory:remoteRepoURL options:options error:&error transferProgressBlock:NULL checkoutProgressBlock:NULL];
42+
remoteRepo = [GTRepository cloneFromURL:notBareRepo.gitDirectoryURL toWorkingDirectory:remoteRepoURL options:options error:&error transferProgressBlock:NULL];
4343
expect(error).to(beNil());
4444
expect(remoteRepo).notTo(beNil());
4545
expect(@(remoteRepo.isBare)).to(beTruthy()); // that's better
@@ -48,7 +48,7 @@
4848
expect(localRepoURL).notTo(beNil());
4949

5050
// Local clone for testing pushes
51-
localRepo = [GTRepository cloneFromURL:remoteRepoURL toWorkingDirectory:localRepoURL options:nil error:&error transferProgressBlock:NULL checkoutProgressBlock:NULL];
51+
localRepo = [GTRepository cloneFromURL:remoteRepoURL toWorkingDirectory:localRepoURL options:nil error:&error transferProgressBlock:NULL];
5252

5353
expect(error).to(beNil());
5454
expect(localRepo).notTo(beNil());

‎ObjectiveGitTests/GTRemoteSpec.m

+1-1
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@
107107
fetchingRepoURL = [fixturesURL URLByAppendingPathComponent:@"fetchrepo"];
108108

109109
NSError *error = nil;
110-
fetchingRepo = [GTRepository cloneFromURL:repositoryURL toWorkingDirectory:fetchingRepoURL options:nil error:&error transferProgressBlock:nil checkoutProgressBlock:nil];
110+
fetchingRepo = [GTRepository cloneFromURL:repositoryURL toWorkingDirectory:fetchingRepoURL options:nil error:&error transferProgressBlock:nil];
111111
expect(fetchingRepo).notTo(beNil());
112112
expect(error).to(beNil());
113113

‎ObjectiveGitTests/GTRepository+PullSpec.m

+2-2
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
// Make a bare clone to serve as the remote
4141
remoteRepoURL = [notBareRepo.gitDirectoryURL.URLByDeletingLastPathComponent URLByAppendingPathComponent:@"bare_remote_repo.git"];
4242
NSDictionary *options = @{ GTRepositoryCloneOptionsBare: @1 };
43-
remoteRepo = [GTRepository cloneFromURL:notBareRepo.gitDirectoryURL toWorkingDirectory:remoteRepoURL options:options error:&error transferProgressBlock:NULL checkoutProgressBlock:NULL];
43+
remoteRepo = [GTRepository cloneFromURL:notBareRepo.gitDirectoryURL toWorkingDirectory:remoteRepoURL options:options error:&error transferProgressBlock:NULL];
4444
expect(error).to(beNil());
4545
expect(remoteRepo).notTo(beNil());
4646
expect(@(remoteRepo.isBare)).to(beTruthy()); // that's better
@@ -49,7 +49,7 @@
4949
expect(localRepoURL).notTo(beNil());
5050

5151
// Local clone for testing pushes
52-
localRepo = [GTRepository cloneFromURL:remoteRepoURL toWorkingDirectory:localRepoURL options:nil error:&error transferProgressBlock:NULL checkoutProgressBlock:NULL];
52+
localRepo = [GTRepository cloneFromURL:remoteRepoURL toWorkingDirectory:localRepoURL options:nil error:&error transferProgressBlock:NULL];
5353

5454
expect(error).to(beNil());
5555
expect(localRepo).notTo(beNil());

‎ObjectiveGitTests/GTRepositorySpec.m

+36-9
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,14 @@
9595

9696
it(@"should handle normal clones", ^{
9797
NSError *error = nil;
98-
repository = [GTRepository cloneFromURL:originURL toWorkingDirectory:workdirURL options:@{ GTRepositoryCloneOptionsCloneLocal: @YES } error:&error transferProgressBlock:transferProgressBlock checkoutProgressBlock:checkoutProgressBlock];
98+
GTCheckoutOptions *checkoutOptions = [GTCheckoutOptions checkoutOptionsWithStrategy:GTCheckoutStrategySafe];
99+
checkoutOptions.progressBlock = checkoutProgressBlock;
100+
101+
NSDictionary *cloneOptions = @{
102+
GTRepositoryCloneOptionsCloneLocal: @YES,
103+
GTRepositoryCloneCheckoutOptions: checkoutOptions,
104+
};
105+
repository = [GTRepository cloneFromURL:originURL toWorkingDirectory:workdirURL options:cloneOptions error:&error transferProgressBlock:transferProgressBlock];
99106
expect(repository).notTo(beNil());
100107
expect(error).to(beNil());
101108
expect(@(transferProgressCalled)).to(beTruthy());
@@ -112,8 +119,15 @@
112119

113120
it(@"should handle bare clones", ^{
114121
NSError *error = nil;
115-
NSDictionary *options = @{ GTRepositoryCloneOptionsBare: @YES, GTRepositoryCloneOptionsCloneLocal: @YES };
116-
repository = [GTRepository cloneFromURL:originURL toWorkingDirectory:workdirURL options:options error:&error transferProgressBlock:transferProgressBlock checkoutProgressBlock:checkoutProgressBlock];
122+
GTCheckoutOptions *checkoutOptions = [GTCheckoutOptions checkoutOptionsWithStrategy:GTCheckoutStrategySafe];
123+
checkoutOptions.progressBlock = checkoutProgressBlock;
124+
125+
NSDictionary *options = @{
126+
GTRepositoryCloneOptionsBare: @YES,
127+
GTRepositoryCloneOptionsCloneLocal: @YES,
128+
GTRepositoryCloneCheckoutOptions: checkoutOptions,
129+
};
130+
repository = [GTRepository cloneFromURL:originURL toWorkingDirectory:workdirURL options:options error:&error transferProgressBlock:transferProgressBlock];
117131
expect(repository).notTo(beNil());
118132
expect(error).to(beNil());
119133
expect(@(transferProgressCalled)).to(beTruthy());
@@ -130,7 +144,10 @@
130144

131145
it(@"should have set a valid remote URL", ^{
132146
NSError *error = nil;
133-
repository = [GTRepository cloneFromURL:originURL toWorkingDirectory:workdirURL options:nil error:&error transferProgressBlock:transferProgressBlock checkoutProgressBlock:checkoutProgressBlock];
147+
GTCheckoutOptions *checkoutOptions = [GTCheckoutOptions checkoutOptionsWithStrategy:GTCheckoutStrategySafe];
148+
checkoutOptions.progressBlock = checkoutProgressBlock;
149+
150+
repository = [GTRepository cloneFromURL:originURL toWorkingDirectory:workdirURL options:@{ GTRepositoryCloneCheckoutOptions: checkoutOptions } error:&error transferProgressBlock:transferProgressBlock];
134151
expect(repository).notTo(beNil());
135152
expect(error).to(beNil());
136153

@@ -167,7 +184,14 @@
167184
return cred;
168185
}];
169186

170-
repository = [GTRepository cloneFromURL:originURL toWorkingDirectory:workdirURL options:@{GTRepositoryCloneOptionsCredentialProvider: provider} error:&error transferProgressBlock:transferProgressBlock checkoutProgressBlock:checkoutProgressBlock];
187+
GTCheckoutOptions *checkoutOptions = [GTCheckoutOptions checkoutOptionsWithStrategy:GTCheckoutStrategySafe];
188+
checkoutOptions.progressBlock = checkoutProgressBlock;
189+
NSDictionary *cloneOptions = @{
190+
GTRepositoryCloneOptionsCredentialProvider: provider,
191+
GTRepositoryCloneCheckoutOptions: checkoutOptions,
192+
};
193+
194+
repository = [GTRepository cloneFromURL:originURL toWorkingDirectory:workdirURL options:cloneOptions error:&error transferProgressBlock:transferProgressBlock];
171195
expect(repository).notTo(beNil());
172196
expect(error).to(beNil());
173197
expect(@(transferProgressCalled)).to(beTruthy());
@@ -416,7 +440,7 @@
416440
GTReference *ref = [repository lookUpReferenceWithName:@"refs/heads/other-branch" error:&error];
417441
expect(ref).notTo(beNil());
418442
expect(error.localizedDescription).to(beNil());
419-
BOOL result = [repository checkoutReference:ref strategy:GTCheckoutStrategyAllowConflicts error:&error progressBlock:nil];
443+
BOOL result = [repository checkoutReference:ref options:[GTCheckoutOptions checkoutOptionsWithStrategy:GTCheckoutStrategyAllowConflicts] error:&error];
420444
expect(@(result)).to(beTruthy());
421445
expect(error.localizedDescription).to(beNil());
422446
});
@@ -426,7 +450,7 @@
426450
GTCommit *commit = [repository lookUpObjectBySHA:@"1d69f3c0aeaf0d62e25591987b93b8ffc53abd77" objectType:GTObjectTypeCommit error:&error];
427451
expect(commit).notTo(beNil());
428452
expect(error.localizedDescription).to(beNil());
429-
BOOL result = [repository checkoutCommit:commit strategy:GTCheckoutStrategyAllowConflicts error:&error progressBlock:nil];
453+
BOOL result = [repository checkoutCommit:commit options:[GTCheckoutOptions checkoutOptionsWithStrategy:GTCheckoutStrategyAllowConflicts] error:&error];
430454
expect(@(result)).to(beTruthy());
431455
expect(error.localizedDescription).to(beNil());
432456
});
@@ -451,7 +475,8 @@
451475
return 0;
452476
};
453477

454-
BOOL result = [repository checkoutReference:ref strategy:GTCheckoutStrategySafe notifyFlags:GTCheckoutNotifyConflict error:&error progressBlock:nil notifyBlock:notifyBlock];
478+
GTCheckoutOptions *options = [GTCheckoutOptions checkoutOptionsWithStrategy:GTCheckoutStrategySafe notifyFlags:GTCheckoutNotifyConflict notifyBlock:notifyBlock];
479+
BOOL result = [repository checkoutReference:ref options:options error:&error];
455480
expect(@(notifyCount)).to(equal(@(1)));
456481
expect(@(readmeFileConflicted)).to(beTruthy());
457482
expect(@(result)).to(beFalsy());
@@ -476,7 +501,9 @@
476501
return 0;
477502
};
478503

479-
BOOL result = [repository checkoutCommit:commit strategy:GTCheckoutStrategySafe notifyFlags:GTCheckoutNotifyConflict error:&error progressBlock:nil notifyBlock:notifyBlock];
504+
505+
GTCheckoutOptions *options = [GTCheckoutOptions checkoutOptionsWithStrategy:GTCheckoutStrategySafe notifyFlags:GTCheckoutNotifyConflict notifyBlock:notifyBlock];
506+
BOOL result = [repository checkoutCommit:commit options:options error:&error];
480507
expect(@(notifyCount)).to(equal(@(1)));
481508
expect(@(readme1FileConflicted)).to(beTruthy());
482509
expect(@(result)).to(beFalsy());

‎ObjectiveGitTests/GTRepositoryStashingSpec.m

+3-3
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@
129129
expect(error).to(beNil());
130130

131131
__block BOOL progressCalled = NO;
132-
BOOL success = [repository applyStashAtIndex:0 flags:GTRepositoryStashApplyFlagDefault error:&error progressBlock:^void(GTRepositoryStashApplyProgress step, BOOL *stop) {
132+
BOOL success = [repository applyStashAtIndex:0 flags:GTRepositoryStashApplyFlagDefault checkoutOptions:nil error:&error progressBlock:^void(GTRepositoryStashApplyProgress step, BOOL *stop) {
133133
progressCalled = YES;
134134
}];
135135
expect(@(success)).to(beTruthy());
@@ -162,7 +162,7 @@
162162
lastStashIndex = index;
163163
}];
164164

165-
success = [repository applyStashAtIndex:(lastStashIndex + 1) flags:GTRepositoryStashApplyFlagDefault error:&error progressBlock:nil];
165+
success = [repository applyStashAtIndex:(lastStashIndex + 1) flags:GTRepositoryStashApplyFlagDefault checkoutOptions:nil error:&error progressBlock:nil];
166166
expect(@(success)).to(beFalsy());
167167
expect(error).notTo(beNil());
168168
expect(error.domain).to(equal(GTGitErrorDomain));
@@ -186,7 +186,7 @@
186186

187187
expect(@([@"barfoo" writeToURL:[repository.fileURL URLByAppendingPathComponent:@"new-test-file"] atomically:YES encoding:NSUTF8StringEncoding error:NULL])).to(beTruthy());
188188

189-
BOOL success = [repository applyStashAtIndex:0 flags:GTRepositoryStashApplyFlagDefault error:&error progressBlock:nil];
189+
BOOL success = [repository applyStashAtIndex:0 flags:GTRepositoryStashApplyFlagDefault checkoutOptions:nil error:&error progressBlock:nil];
190190
expect(@(success)).to(beFalsy());
191191
expect(error).notTo(beNil());
192192

‎ObjectiveGitTests/GTSubmoduleSpec.m

+1-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@
8686
expect(submoduleRepository).notTo(beNil());
8787

8888
GTCommit *commit = [submoduleRepository lookUpObjectByRevParse:@"HEAD^" error:NULL];
89-
BOOL success = [submoduleRepository checkoutCommit:commit strategy:GTCheckoutStrategyForce error:NULL progressBlock:nil];
89+
BOOL success = [submoduleRepository checkoutCommit:commit options:[GTCheckoutOptions checkoutOptionsWithStrategy:GTCheckoutStrategyForce] error:NULL];
9090
expect(@(success)).to(beTruthy());
9191

9292
success = [submodule addToIndex:NULL];

0 commit comments

Comments
 (0)
Please sign in to comment.