Skip to content
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
17 changes: 9 additions & 8 deletions ObjectiveGit/GTRepository.m
Original file line number Diff line number Diff line change
Expand Up @@ -809,7 +809,7 @@ - (BOOL)moveHEADToCommit:(GTCommit *)commit error:(NSError **)error {
return gitError == GIT_OK;
}

- (BOOL)performCheckoutWithStrategy:(GTCheckoutStrategyType)strategy notifyFlags:(GTCheckoutNotifyFlags)notifyFlags error:(NSError **)error progressBlock:(GTCheckoutProgressBlock)progressBlock notifyBlock:(GTCheckoutNotifyBlock)notifyBlock {
- (BOOL)performCheckout:(GTObject *)target withStrategy:(GTCheckoutStrategyType)strategy notifyFlags:(GTCheckoutNotifyFlags)notifyFlags error:(NSError **)error progressBlock:(GTCheckoutProgressBlock)progressBlock notifyBlock:(GTCheckoutNotifyBlock)notifyBlock {

git_checkout_options checkoutOptions = GIT_CHECKOUT_OPTIONS_INIT;

Expand All @@ -821,7 +821,7 @@ - (BOOL)performCheckoutWithStrategy:(GTCheckoutStrategyType)strategy notifyFlags
checkoutOptions.notify_flags = notifyFlags;
checkoutOptions.notify_payload = (__bridge void *)notifyBlock;

int gitError = git_checkout_head(self.git_repository, &checkoutOptions);
int gitError = git_checkout_tree(self.git_repository, target.git_object, &checkoutOptions);
if (gitError < GIT_OK) {
if (error != NULL) *error = [NSError git_errorFor:gitError description:@"Failed to checkout tree."];
}
Expand All @@ -830,17 +830,18 @@ - (BOOL)performCheckoutWithStrategy:(GTCheckoutStrategyType)strategy notifyFlags
}

- (BOOL)checkoutCommit:(GTCommit *)targetCommit strategy:(GTCheckoutStrategyType)strategy notifyFlags:(GTCheckoutNotifyFlags)notifyFlags error:(NSError **)error progressBlock:(GTCheckoutProgressBlock)progressBlock notifyBlock:(GTCheckoutNotifyBlock)notifyBlock {
BOOL success = [self moveHEADToCommit:targetCommit error:error];
BOOL success = [self performCheckout:targetCommit withStrategy:strategy notifyFlags:notifyFlags error:error progressBlock:progressBlock notifyBlock:notifyBlock];
if (success == NO) return NO;

return [self performCheckoutWithStrategy:strategy notifyFlags:notifyFlags error:error progressBlock:progressBlock notifyBlock:notifyBlock];
return [self moveHEADToCommit:targetCommit error:error];
}

- (BOOL)checkoutReference:(GTReference *)targetReference strategy:(GTCheckoutStrategyType)strategy notifyFlags:(GTCheckoutNotifyFlags)notifyFlags error:(NSError **)error progressBlock:(GTCheckoutProgressBlock)progressBlock notifyBlock:(GTCheckoutNotifyBlock)notifyBlock {
BOOL success = [self moveHEADToReference:targetReference error:error];
GTOID *targetOID = [targetReference targetOID];
GTObject *target = [self lookUpObjectByOID:targetOID error:error];
if (target == nil) return NO;
BOOL success = [self performCheckout:target withStrategy:strategy notifyFlags:notifyFlags error:error progressBlock:progressBlock notifyBlock:notifyBlock];
if (success == NO) return NO;

return [self performCheckoutWithStrategy:strategy notifyFlags:notifyFlags error:error progressBlock:progressBlock notifyBlock:notifyBlock];
return [self moveHEADToReference:targetReference error:error];
}

- (BOOL)checkoutCommit:(GTCommit *)target strategy:(GTCheckoutStrategyType)strategy error:(NSError **)error progressBlock:(GTCheckoutProgressBlock)progressBlock {
Expand Down
56 changes: 56 additions & 0 deletions ObjectiveGitTests/GTRepositorySpec.m
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@

QuickSpecBegin(GTRepositorySpec)

static NSString * const readmeFile = @"README.md";
static NSString * const readme1File = @"README1.txt";


__block GTRepository *repository;

beforeEach(^{
Expand Down Expand Up @@ -376,6 +380,58 @@
});
});

describe(@"-checkout:strategy:notifyFlags:error:notifyBlock:progressBlock:", ^{
it(@"should fail ref checkout with conflict and notify", ^{
NSError *error = nil;
GTReference *ref = [repository lookUpReferenceWithName:@"refs/heads/other-branch" error:&error];
expect(ref).notTo(beNil());
expect(error.localizedDescription).to(beNil());
BOOL writeResult = [@"Conflicting data in README.md\n" writeToURL:[repository.fileURL URLByAppendingPathComponent:readmeFile] atomically:YES encoding:NSUTF8StringEncoding error:&error];
expect(@(writeResult)).to(beTruthy());
__block NSUInteger notifyCount = 0;
__block BOOL readmeFileConflicted = NO;
int (^notifyBlock)(GTCheckoutNotifyFlags, NSString *, GTDiffFile *, GTDiffFile *, GTDiffFile *);
notifyBlock = ^(GTCheckoutNotifyFlags why, NSString *path, GTDiffFile *baseline, GTDiffFile *target, GTDiffFile *workdir) {
notifyCount++;
if([path isEqualToString:readmeFile] && (why & GTCheckoutNotifyConflict)) {
readmeFileConflicted = YES;
}
return 0;
};

BOOL result = [repository checkoutReference:ref strategy:GTCheckoutStrategySafe notifyFlags:GTCheckoutNotifyConflict error:&error progressBlock:nil notifyBlock:notifyBlock];
expect(@(notifyCount)).to(equal(@(1)));
expect(@(readmeFileConflicted)).to(beTruthy());
expect(@(result)).to(beFalsy());
expect(@(error.code)).to(equal(@(GIT_ECONFLICT)));
});

it(@"should fail commit checkout with conflict and notify", ^{
NSError *error = nil;
GTCommit *commit = [repository lookUpObjectBySHA:@"1d69f3c0aeaf0d62e25591987b93b8ffc53abd77" objectType:GTObjectTypeCommit error:&error];
expect(commit).notTo(beNil());
expect(error.localizedDescription).to(beNil());
BOOL writeResult = [@"Conflicting data in README1.txt\n" writeToURL:[repository.fileURL URLByAppendingPathComponent:readme1File] atomically:YES encoding:NSUTF8StringEncoding error:&error];
expect(@(writeResult)).to(beTruthy());
__block NSUInteger notifyCount = 0;
__block BOOL readme1FileConflicted = NO;
int (^notifyBlock)(GTCheckoutNotifyFlags, NSString *, GTDiffFile *, GTDiffFile *, GTDiffFile *);
notifyBlock = ^(GTCheckoutNotifyFlags why, NSString *path, GTDiffFile *baseline, GTDiffFile *target, GTDiffFile *workdir) {
notifyCount++;
if([path isEqualToString:readme1File] && (why & GTCheckoutNotifyConflict)) {
readme1FileConflicted = YES;
}
return 0;
};

BOOL result = [repository checkoutCommit:commit strategy:GTCheckoutStrategySafe notifyFlags:GTCheckoutNotifyConflict error:&error progressBlock:nil notifyBlock:notifyBlock];
expect(@(notifyCount)).to(equal(@(1)));
expect(@(readme1FileConflicted)).to(beTruthy());
expect(@(result)).to(beFalsy());
expect(@(error.code)).to(equal(@(GIT_ECONFLICT)));
});
});

describe(@"-remoteNamesWithError:", ^{
it(@"allows access to remote names", ^{
NSError *error = nil;
Expand Down