From ca54fbd5f7a8a9a6886ad48f048914971f005c12 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Wed, 9 Jan 2013 14:39:51 +0000 Subject: [PATCH 01/11] Add a pathspec options key const. --- Classes/GTDiff.h | 9 +++++++++ Classes/GTDiff.m | 1 + 2 files changed, 10 insertions(+) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index 01b5defd7..e69c5f751 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -46,6 +46,15 @@ extern NSString *const GTDiffOptionsNewPrefixKey; // Defaults to 512MB. extern NSString *const GTDiffOptionsMaxSizeKey; +// An `NSArray` of `NSString`s representing either a local path or fnmatch +// pattern. +// +// The diff will only contain the files or patterns included in this options +// array. +// +// Defaults to including all files. +extern NSString *const GTDiffOptionsPathSpecArrayKey; + // Enum for use as documented in the options dictionary with the // `GTDiffOptionsFlagsKey` key. // diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index a37c43343..97c7f6308 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -20,6 +20,7 @@ NSString *const GTDiffOptionsOldPrefixKey = @"GTDiffOptionsOldPrefixKey"; NSString *const GTDiffOptionsNewPrefixKey = @"GTDiffOptionsNewPrefixKey"; NSString *const GTDiffOptionsMaxSizeKey = @"GTDiffOptionsMaxSizeKey"; +NSString *const GTDiffOptionsPathSpecArrayKey = @"GTDiffOptionsPathSpecArrayKey"; NSString *const GTDiffFindOptionsFlagsKey = @"GTDiffFindOptionsFlagsKey"; NSString *const GTDiffFindOptionsRenameThresholdKey = @"GTDiffFindOptionsRenameThresholdKey"; From 722279b1ee4e50aec587dfeb9e6ae9820666c141 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Wed, 9 Jan 2013 16:07:39 +0000 Subject: [PATCH 02/11] Implement setting a pathspec in the options. --- Classes/GTDiff.m | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index 97c7f6308..3a6cf8694 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -55,6 +55,17 @@ + (BOOL)optionsStructFromDictionary:(NSDictionary *)dictionary optionsStruct:(gi NSNumber *maxSizeNumber = dictionary[GTDiffOptionsMaxSizeKey]; if (maxSizeNumber != nil) newOptions->max_size = (uint16_t)maxSizeNumber.unsignedIntegerValue; + NSArray *pathSpec = dictionary[GTDiffOptionsPathSpecArrayKey]; + if (pathSpec != nil) { + char *cStrings[pathSpec.count]; + for (NSUInteger idx = 0; idx < pathSpec.count; idx ++) { + cStrings[idx] = (char *)[pathSpec[idx] cStringUsingEncoding:NSUTF8StringEncoding]; + } + + git_strarray optionsPathSpec = {.strings = cStrings, .count = pathSpec.count}; + newOptions->pathspec = optionsPathSpec; + } + return YES; } From ce56fb3ed98dfbe7483a9a5644ef0548bd24dc90 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Wed, 9 Jan 2013 16:17:45 +0000 Subject: [PATCH 03/11] Add a test for restricting to a pathspec. --- ObjectiveGitTests/GTDiffSpec.m | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ObjectiveGitTests/GTDiffSpec.m b/ObjectiveGitTests/GTDiffSpec.m index 3f797d6ab..e3de5bbd4 100644 --- a/ObjectiveGitTests/GTDiffSpec.m +++ b/ObjectiveGitTests/GTDiffSpec.m @@ -171,6 +171,12 @@ *stop = YES; }]; }); + + it(@"should correctly limit itself to a given pathspec", ^{ + NSDictionary *options = @{ GTDiffOptionsPathSpecArrayKey: @[ @"ladflbahjgdf" ] }; + setupDiffFromCommitSHAsAndOptions(@"be0f001ff517a00b5b8e3c29ee6561e70f994e17", @"fe89ea0a8e70961b8a6344d9660c326d3f2eb0fe", options); + expect(diff.deltaCount).to.equal(0); + }); }); SpecEnd From 11d92197dda0569f0b2a0d7c95a7eb6a07320230 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Wed, 9 Jan 2013 18:04:54 +0000 Subject: [PATCH 04/11] Add a (failing) test for the pathspec. Make sure we aren't just filtering out everything. --- ObjectiveGitTests/GTDiffSpec.m | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ObjectiveGitTests/GTDiffSpec.m b/ObjectiveGitTests/GTDiffSpec.m index e3de5bbd4..b5cd7b45f 100644 --- a/ObjectiveGitTests/GTDiffSpec.m +++ b/ObjectiveGitTests/GTDiffSpec.m @@ -176,6 +176,10 @@ NSDictionary *options = @{ GTDiffOptionsPathSpecArrayKey: @[ @"ladflbahjgdf" ] }; setupDiffFromCommitSHAsAndOptions(@"be0f001ff517a00b5b8e3c29ee6561e70f994e17", @"fe89ea0a8e70961b8a6344d9660c326d3f2eb0fe", options); expect(diff.deltaCount).to.equal(0); + + options = @{ GTDiffOptionsPathSpecArrayKey: @[ @"TestAppWindowController.h" ] }; + setupDiffFromCommitSHAsAndOptions(@"be0f001ff517a00b5b8e3c29ee6561e70f994e17", @"fe89ea0a8e70961b8a6344d9660c326d3f2eb0fe", options); + expect(diff.deltaCount).to.equal(1); }); }); From 138a7616237388513d911fc889c8067eba84dc3a Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Wed, 9 Jan 2013 22:48:38 +0000 Subject: [PATCH 05/11] Heap a bitch. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TURNS OUT the stack gets popped when exiting scopeā€¦ WHO KNEW?! --- Classes/GTDiff.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index 3a6cf8694..e9a064e13 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -57,7 +57,7 @@ + (BOOL)optionsStructFromDictionary:(NSDictionary *)dictionary optionsStruct:(gi NSArray *pathSpec = dictionary[GTDiffOptionsPathSpecArrayKey]; if (pathSpec != nil) { - char *cStrings[pathSpec.count]; + char **cStrings = malloc(sizeof(*cStrings) * pathSpec.count); for (NSUInteger idx = 0; idx < pathSpec.count; idx ++) { cStrings[idx] = (char *)[pathSpec[idx] cStringUsingEncoding:NSUTF8StringEncoding]; } From 688729fc4229faaa310d8e547f8d38fc071461ce Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Thu, 10 Jan 2013 20:39:53 +0000 Subject: [PATCH 06/11] Free the pathspec strings array. --- Classes/GTDiff.m | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index e9a064e13..eded93123 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -69,6 +69,10 @@ + (BOOL)optionsStructFromDictionary:(NSDictionary *)dictionary optionsStruct:(gi return YES; } ++ (void)freeOptionsStruct:(git_diff_options *)options { + free(options->pathspec.strings); +} + + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree options:(NSDictionary *)options error:(NSError **)error { NSParameterAssert([oldTree.repository isEqualTo:newTree.repository]); @@ -76,6 +80,7 @@ + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree options: BOOL optionsStructCreated = [self optionsStructFromDictionary:options optionsStruct:&optionsStruct]; git_diff_list *diffList; int returnValue = git_diff_tree_to_tree(&diffList, oldTree.repository.git_repository, oldTree.git_tree, newTree.git_tree, (optionsStructCreated ? &optionsStruct : NULL)); + [self freeOptionsStruct:&optionsStruct]; if (returnValue != GIT_OK) { if (error != NULL) *error = [NSError git_errorFor:returnValue withAdditionalDescription:@"Failed to create diff."]; return nil; @@ -92,6 +97,7 @@ + (GTDiff *)diffIndexFromTree:(GTTree *)tree options:(NSDictionary *)options err BOOL optionsStructCreated = [self optionsStructFromDictionary:options optionsStruct:&optionsStruct]; git_diff_list *diffList; int returnValue = git_diff_tree_to_index(&diffList, tree.repository.git_repository, tree.git_tree, NULL, (optionsStructCreated ? &optionsStruct : NULL)); + [self freeOptionsStruct:&optionsStruct]; if (returnValue != GIT_OK) { if (error != NULL) *error = [NSError git_errorFor:returnValue withAdditionalDescription:@"Failed to create diff."]; return nil; @@ -108,6 +114,7 @@ + (GTDiff *)diffIndexToWorkingDirectoryInRepository:(GTRepository *)repository o BOOL optionsStructCreated = [self optionsStructFromDictionary:options optionsStruct:&optionsStruct]; git_diff_list *diffList; int returnValue = git_diff_index_to_workdir(&diffList, repository.git_repository, NULL, (optionsStructCreated ? &optionsStruct : NULL)); + [self freeOptionsStruct:&optionsStruct]; if (returnValue != GIT_OK) { if (error != NULL) *error = [NSError git_errorFor:returnValue withAdditionalDescription:@"Failed to create diff."]; return nil; @@ -124,6 +131,7 @@ + (GTDiff *)diffWorkingDirectoryFromTree:(GTTree *)tree options:(NSDictionary *) BOOL optionsStructCreated = [self optionsStructFromDictionary:options optionsStruct:&optionsStruct]; git_diff_list *diffList; int returnValue = git_diff_tree_to_workdir(&diffList, tree.repository.git_repository, tree.git_tree, (optionsStructCreated ? &optionsStruct : NULL)); + [self freeOptionsStruct:&optionsStruct]; if (returnValue != GIT_OK) { if (error != NULL) *error = [NSError git_errorFor:returnValue withAdditionalDescription:@"Failed to create diff."]; return nil; From edc3bbb28938fa8c72989f15b5ea11f97e5729c3 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Thu, 10 Jan 2013 20:42:56 +0000 Subject: [PATCH 07/11] Document fnmatch patterns a bit better. --- Classes/GTDiff.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index e69c5f751..8145ba288 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -46,8 +46,10 @@ extern NSString *const GTDiffOptionsNewPrefixKey; // Defaults to 512MB. extern NSString *const GTDiffOptionsMaxSizeKey; -// An `NSArray` of `NSString`s representing either a local path or fnmatch -// pattern. +// An `NSArray` of `NSStrings`s to limit the diff to specific paths inside the +// repository. The entries in the array represent either single paths or +// filename patterns with wildcard matching a la standard shell glob (see +// http://linux.die.net/man/7/glob for wildcard matching rules). // // The diff will only contain the files or patterns included in this options // array. From 00c27b06b703ea3c2d8a5192c1230bbdf7cc310f Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Thu, 10 Jan 2013 21:43:34 +0000 Subject: [PATCH 08/11] Just create the options struct on the heap in the first place. --- Classes/GTDiff.m | 57 +++++++++++++++++++++++------------------------- 1 file changed, 27 insertions(+), 30 deletions(-) diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index eded93123..5f08472f1 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -31,29 +31,31 @@ @implementation GTDiff -+ (BOOL)optionsStructFromDictionary:(NSDictionary *)dictionary optionsStruct:(git_diff_options *)newOptions { - if (dictionary == nil || dictionary.count < 1) return NO; ++ (git_diff_options *)optionsStructFromDictionary:(NSDictionary *)dictionary { + if (dictionary == nil || dictionary.count < 1) return nil; + + git_diff_options newOptions = GIT_DIFF_OPTIONS_INIT; NSNumber *flagsNumber = dictionary[GTDiffOptionsFlagsKey]; - if (flagsNumber != nil) newOptions->flags = (uint32_t)flagsNumber.unsignedIntegerValue; + if (flagsNumber != nil) newOptions.flags = (uint32_t)flagsNumber.unsignedIntegerValue; NSNumber *contextLinesNumber = dictionary[GTDiffOptionsContextLinesKey]; - if (contextLinesNumber != nil) newOptions->context_lines = (uint16_t)contextLinesNumber.unsignedIntegerValue; + if (contextLinesNumber != nil) newOptions.context_lines = (uint16_t)contextLinesNumber.unsignedIntegerValue; NSNumber *interHunkLinesNumber = dictionary[GTDiffOptionsInterHunkLinesKey]; - if (interHunkLinesNumber != nil) newOptions->interhunk_lines = (uint16_t)interHunkLinesNumber.unsignedIntegerValue; + if (interHunkLinesNumber != nil) newOptions.interhunk_lines = (uint16_t)interHunkLinesNumber.unsignedIntegerValue; // We cast to char* below to work around a current bug in libgit2, which is // fixed in https://github.com/libgit2/libgit2/pull/1118 NSString *oldPrefix = dictionary[GTDiffOptionsOldPrefixKey]; - if (oldPrefix != nil) newOptions->old_prefix = (char *)oldPrefix.UTF8String; + if (oldPrefix != nil) newOptions.old_prefix = (char *)oldPrefix.UTF8String; NSString *newPrefix = dictionary[GTDiffOptionsNewPrefixKey]; - if (newPrefix != nil) newOptions->new_prefix = (char *)newPrefix.UTF8String; + if (newPrefix != nil) newOptions.new_prefix = (char *)newPrefix.UTF8String; NSNumber *maxSizeNumber = dictionary[GTDiffOptionsMaxSizeKey]; - if (maxSizeNumber != nil) newOptions->max_size = (uint16_t)maxSizeNumber.unsignedIntegerValue; + if (maxSizeNumber != nil) newOptions.max_size = (uint16_t)maxSizeNumber.unsignedIntegerValue; NSArray *pathSpec = dictionary[GTDiffOptionsPathSpecArrayKey]; if (pathSpec != nil) { @@ -63,24 +65,22 @@ + (BOOL)optionsStructFromDictionary:(NSDictionary *)dictionary optionsStruct:(gi } git_strarray optionsPathSpec = {.strings = cStrings, .count = pathSpec.count}; - newOptions->pathspec = optionsPathSpec; + newOptions.pathspec = optionsPathSpec; } - return YES; -} - -+ (void)freeOptionsStruct:(git_diff_options *)options { - free(options->pathspec.strings); + git_diff_options *returnOptions = malloc(sizeof(*returnOptions)); + memcpy(returnOptions, &newOptions, sizeof(*returnOptions)); + + return returnOptions; } + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree options:(NSDictionary *)options error:(NSError **)error { NSParameterAssert([oldTree.repository isEqualTo:newTree.repository]); - git_diff_options optionsStruct = GIT_DIFF_OPTIONS_INIT; - BOOL optionsStructCreated = [self optionsStructFromDictionary:options optionsStruct:&optionsStruct]; + git_diff_options *optionsStruct = [self optionsStructFromDictionary:options]; git_diff_list *diffList; - int returnValue = git_diff_tree_to_tree(&diffList, oldTree.repository.git_repository, oldTree.git_tree, newTree.git_tree, (optionsStructCreated ? &optionsStruct : NULL)); - [self freeOptionsStruct:&optionsStruct]; + int returnValue = git_diff_tree_to_tree(&diffList, oldTree.repository.git_repository, oldTree.git_tree, newTree.git_tree, optionsStruct); + free(optionsStruct); if (returnValue != GIT_OK) { if (error != NULL) *error = [NSError git_errorFor:returnValue withAdditionalDescription:@"Failed to create diff."]; return nil; @@ -93,11 +93,10 @@ + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree options: + (GTDiff *)diffIndexFromTree:(GTTree *)tree options:(NSDictionary *)options error:(NSError **)error { NSParameterAssert(tree != nil); - git_diff_options optionsStruct = GIT_DIFF_OPTIONS_INIT; - BOOL optionsStructCreated = [self optionsStructFromDictionary:options optionsStruct:&optionsStruct]; + git_diff_options *optionsStruct = [self optionsStructFromDictionary:options]; git_diff_list *diffList; - int returnValue = git_diff_tree_to_index(&diffList, tree.repository.git_repository, tree.git_tree, NULL, (optionsStructCreated ? &optionsStruct : NULL)); - [self freeOptionsStruct:&optionsStruct]; + int returnValue = git_diff_tree_to_index(&diffList, tree.repository.git_repository, tree.git_tree, NULL, optionsStruct); + free(optionsStruct); if (returnValue != GIT_OK) { if (error != NULL) *error = [NSError git_errorFor:returnValue withAdditionalDescription:@"Failed to create diff."]; return nil; @@ -110,11 +109,10 @@ + (GTDiff *)diffIndexFromTree:(GTTree *)tree options:(NSDictionary *)options err + (GTDiff *)diffIndexToWorkingDirectoryInRepository:(GTRepository *)repository options:(NSDictionary *)options error:(NSError **)error { NSParameterAssert(repository != nil); - git_diff_options optionsStruct = GIT_DIFF_OPTIONS_INIT; - BOOL optionsStructCreated = [self optionsStructFromDictionary:options optionsStruct:&optionsStruct]; + git_diff_options *optionsStruct = [self optionsStructFromDictionary:options]; git_diff_list *diffList; - int returnValue = git_diff_index_to_workdir(&diffList, repository.git_repository, NULL, (optionsStructCreated ? &optionsStruct : NULL)); - [self freeOptionsStruct:&optionsStruct]; + int returnValue = git_diff_index_to_workdir(&diffList, repository.git_repository, NULL, optionsStruct); + free(optionsStruct); if (returnValue != GIT_OK) { if (error != NULL) *error = [NSError git_errorFor:returnValue withAdditionalDescription:@"Failed to create diff."]; return nil; @@ -127,11 +125,10 @@ + (GTDiff *)diffIndexToWorkingDirectoryInRepository:(GTRepository *)repository o + (GTDiff *)diffWorkingDirectoryFromTree:(GTTree *)tree options:(NSDictionary *)options error:(NSError **)error { NSParameterAssert(tree != nil); - git_diff_options optionsStruct = GIT_DIFF_OPTIONS_INIT; - BOOL optionsStructCreated = [self optionsStructFromDictionary:options optionsStruct:&optionsStruct]; + git_diff_options *optionsStruct = [self optionsStructFromDictionary:options]; git_diff_list *diffList; - int returnValue = git_diff_tree_to_workdir(&diffList, tree.repository.git_repository, tree.git_tree, (optionsStructCreated ? &optionsStruct : NULL)); - [self freeOptionsStruct:&optionsStruct]; + int returnValue = git_diff_tree_to_workdir(&diffList, tree.repository.git_repository, tree.git_tree, optionsStruct); + free(optionsStruct); if (returnValue != GIT_OK) { if (error != NULL) *error = [NSError git_errorFor:returnValue withAdditionalDescription:@"Failed to create diff."]; return nil; From 587e9415a547cad1c6a23f90d64f7020913e7d0c Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 11 Jan 2013 11:28:24 +0000 Subject: [PATCH 09/11] Free up the pathspec array as well as the options struct. --- Classes/GTDiff.m | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index 5f08472f1..1430cfc93 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -74,13 +74,19 @@ + (git_diff_options *)optionsStructFromDictionary:(NSDictionary *)dictionary { return returnOptions; } ++ (void)freeOptionsStruct:(git_diff_options *)options { + if (options == NULL) return; + free(options->pathspec.strings); + free(options); +} + + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree options:(NSDictionary *)options error:(NSError **)error { NSParameterAssert([oldTree.repository isEqualTo:newTree.repository]); git_diff_options *optionsStruct = [self optionsStructFromDictionary:options]; git_diff_list *diffList; int returnValue = git_diff_tree_to_tree(&diffList, oldTree.repository.git_repository, oldTree.git_tree, newTree.git_tree, optionsStruct); - free(optionsStruct); + [self freeOptionsStruct:optionsStruct]; if (returnValue != GIT_OK) { if (error != NULL) *error = [NSError git_errorFor:returnValue withAdditionalDescription:@"Failed to create diff."]; return nil; @@ -96,7 +102,7 @@ + (GTDiff *)diffIndexFromTree:(GTTree *)tree options:(NSDictionary *)options err git_diff_options *optionsStruct = [self optionsStructFromDictionary:options]; git_diff_list *diffList; int returnValue = git_diff_tree_to_index(&diffList, tree.repository.git_repository, tree.git_tree, NULL, optionsStruct); - free(optionsStruct); + [self freeOptionsStruct:optionsStruct]; if (returnValue != GIT_OK) { if (error != NULL) *error = [NSError git_errorFor:returnValue withAdditionalDescription:@"Failed to create diff."]; return nil; @@ -112,7 +118,7 @@ + (GTDiff *)diffIndexToWorkingDirectoryInRepository:(GTRepository *)repository o git_diff_options *optionsStruct = [self optionsStructFromDictionary:options]; git_diff_list *diffList; int returnValue = git_diff_index_to_workdir(&diffList, repository.git_repository, NULL, optionsStruct); - free(optionsStruct); + [self freeOptionsStruct:optionsStruct]; if (returnValue != GIT_OK) { if (error != NULL) *error = [NSError git_errorFor:returnValue withAdditionalDescription:@"Failed to create diff."]; return nil; @@ -128,7 +134,7 @@ + (GTDiff *)diffWorkingDirectoryFromTree:(GTTree *)tree options:(NSDictionary *) git_diff_options *optionsStruct = [self optionsStructFromDictionary:options]; git_diff_list *diffList; int returnValue = git_diff_tree_to_workdir(&diffList, tree.repository.git_repository, tree.git_tree, optionsStruct); - free(optionsStruct); + [self freeOptionsStruct:optionsStruct]; if (returnValue != GIT_OK) { if (error != NULL) *error = [NSError git_errorFor:returnValue withAdditionalDescription:@"Failed to create diff."]; return nil; From c52f7c0bbc7ce57b06866e0ffe7de7d10d54043d Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 11 Jan 2013 12:56:10 +0000 Subject: [PATCH 10/11] Add a test against untracked files. --- ObjectiveGitTests/GTDiffSpec.m | 12 ++++++++++++ ObjectiveGitTests/fixtures/Fixtures.zip | Bin 1593793 -> 1612588 bytes 2 files changed, 12 insertions(+) diff --git a/ObjectiveGitTests/GTDiffSpec.m b/ObjectiveGitTests/GTDiffSpec.m index f44a9c393..a2899ac92 100644 --- a/ObjectiveGitTests/GTDiffSpec.m +++ b/ObjectiveGitTests/GTDiffSpec.m @@ -208,6 +208,18 @@ *stop = YES; }]; }); + + it(@"should correctly find untracked files if asked", ^{ + diff = [GTDiff diffIndexToWorkingDirectoryInRepository:repository options:@{ GTDiffOptionsFlagsKey: @(GTDiffOptionsFlagsIncludeUntracked) } error:NULL]; + __block BOOL foundImage = NO; + [diff enumerateDeltasUsingBlock:^(GTDiffDelta *delta, BOOL *stop) { + if (![delta.newFile.path isEqualToString:@"UntrackedImage.png"]) return; + foundImage = YES; + *stop = YES; + }]; + + expect(foundImage).to.beTruthy(); + }); }); SpecEnd diff --git a/ObjectiveGitTests/fixtures/Fixtures.zip b/ObjectiveGitTests/fixtures/Fixtures.zip index a27d3f41a542e9b907d87359299e8286c0ef1d05..892acaec2a2c026ac4cb4687d456b935ca40638c 100644 GIT binary patch delta 26722 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 Date: Fri, 11 Jan 2013 20:19:45 +0000 Subject: [PATCH 11/11] ++libgit2 --- Classes/GTRepository.m | 12 ++---------- libgit2 | 2 +- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/Classes/GTRepository.m b/Classes/GTRepository.m index 7a23400b8..36d5efbb5 100644 --- a/Classes/GTRepository.m +++ b/Classes/GTRepository.m @@ -172,24 +172,16 @@ + (id)cloneFromURL:(NSURL *)originURL toWorkingDirectory:(NSURL *)workdirURL bar checkoutOptions.checkout_strategy = GIT_CHECKOUT_SAFE; checkoutOptions.progress_cb = checkoutProgressCallback; checkoutOptions.progress_payload = (__bridge void *)checkoutProgressBlock; - cloneOptions.checkout_opts = &checkoutOptions; + cloneOptions.checkout_opts = checkoutOptions; } cloneOptions.fetch_progress_cb = transferProgressCallback; cloneOptions.fetch_progress_payload = (__bridge void *)transferProgressBlock; - git_remote *remote; const char *remoteURL = originURL.absoluteString.UTF8String; - int gitError = git_remote_new(&remote, NULL, "origin", remoteURL, GIT_REMOTE_DEFAULT_FETCH); - if (gitError != GIT_OK) { - if (error != NULL) *error = [NSError git_errorFor:gitError withAdditionalDescription:@"Failed to create remote to clone repository."]; - return nil; - } - const char *workingDirectoryPath = workdirURL.path.UTF8String; git_repository *repository; - gitError = git_clone(&repository, remote, workingDirectoryPath, &cloneOptions); - git_remote_free(remote); + int gitError = git_clone(&repository, remoteURL, workingDirectoryPath, &cloneOptions); if (gitError < GIT_OK) { if (error != NULL) *error = [NSError git_errorFor:gitError withAdditionalDescription:@"Failed to clone repository."]; return nil; diff --git a/libgit2 b/libgit2 index e62171e2f..160e4fb79 160000 --- a/libgit2 +++ b/libgit2 @@ -1 +1 @@ -Subproject commit e62171e2fc1b101512a7e86f6d990a38b78ed12b +Subproject commit 160e4fb792b070e14c7094893e390c53d788648c