From 9234cce0648fc96bc26bff9a708d22f3e3bb739e Mon Sep 17 00:00:00 2001 From: joshaber Date: Fri, 3 Jul 2015 15:02:32 -0400 Subject: [PATCH 1/5] Make writing the ignore rule more explicit. --- ObjectiveGit/GTSubmodule.h | 14 +++++++++++--- ObjectiveGit/GTSubmodule.m | 14 +++++++++----- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/ObjectiveGit/GTSubmodule.h b/ObjectiveGit/GTSubmodule.h index 81d2e0a25..1f8cf305e 100644 --- a/ObjectiveGit/GTSubmodule.h +++ b/ObjectiveGit/GTSubmodule.h @@ -60,9 +60,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, strong, readonly) GTRepository *parentRepository; /// The current ignore rule for this submodule. -/// -/// Setting this property will only update the rule in memory, not on disk. -@property (nonatomic, assign) GTSubmoduleIgnoreRule ignoreRule; +@property (nonatomic, readonly, assign) GTSubmoduleIgnoreRule ignoreRule; /// The OID that the submodule is pinned to in the parent repository's index. /// @@ -111,6 +109,16 @@ NS_ASSUME_NONNULL_BEGIN /// Returns whether reloading succeeded. - (BOOL)reload:(NSError **)error; +/// Write a new ignore rule to disk and get the resulting submodule. The +/// receiver will not have the new ignore rule. To update the receiver, call +/// `-reload:`. +/// +/// ignoreRule - The ignore rule. +/// error - The error if one occurred. +/// +/// Returns the updated submodule or nil if an error occurred. +- (GTSubmodule *)submoduleByUpdatingIgnoreRule:(GTSubmoduleIgnoreRule)ignoreRule error:(NSError **)error; + /// Synchronizes the submodule repository's configuration files with the settings /// from the parent repository. /// diff --git a/ObjectiveGit/GTSubmodule.m b/ObjectiveGit/GTSubmodule.m index b6b8c5eee..0e989d586 100644 --- a/ObjectiveGit/GTSubmodule.m +++ b/ObjectiveGit/GTSubmodule.m @@ -25,12 +25,16 @@ - (GTSubmoduleIgnoreRule)ignoreRule { return (GTSubmoduleIgnoreRule)git_submodule_ignore(self.git_submodule); } -- (void)setIgnoreRule:(GTSubmoduleIgnoreRule)ignoreRule { - git_submodule_set_ignore(self.parentRepository.git_repository, git_submodule_name(self.git_submodule), (git_submodule_ignore_t)ignoreRule); +- (GTSubmodule *)submoduleByUpdatingIgnoreRule:(GTSubmoduleIgnoreRule)ignoreRule error:(NSError **)error { + int result = git_submodule_set_ignore(self.parentRepository.git_repository, git_submodule_name(self.git_submodule), (git_submodule_ignore_t)ignoreRule); + if (result != GIT_OK) { + if (error != NULL) { + *error = [NSError git_errorFor:result description:@"Couldn't set submodule ignore rule."]; + } + return nil; + } - // The docs for `git_submodule_set_ignore` note "This does not affect any - // currently-loaded instances." So we need to reload. - git_submodule_reload(self.git_submodule, 0); + return [self.parentRepository submoduleWithName:self.name error:error]; } - (GTOID *)indexOID { From 93c63731055f1c8b4e9da43d5e334d20a5307b24 Mon Sep 17 00:00:00 2001 From: joshaber Date: Fri, 3 Jul 2015 15:02:51 -0400 Subject: [PATCH 2/5] Added a version of status which accepts an ignore rule. --- ObjectiveGit/GTSubmodule.h | 12 +++++++++--- ObjectiveGit/GTSubmodule.m | 8 ++++++-- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/ObjectiveGit/GTSubmodule.h b/ObjectiveGit/GTSubmodule.h index 1f8cf305e..8bef68b34 100644 --- a/ObjectiveGit/GTSubmodule.h +++ b/ObjectiveGit/GTSubmodule.h @@ -132,11 +132,17 @@ NS_ASSUME_NONNULL_BEGIN /// Returns the opened repository, or nil if an error occurs. - (nullable GTRepository *)submoduleRepository:(NSError **)error; -/// Determines the status for the submodule. -/// -/// Returns the status, or `GTSubmoduleStatusUnknown` if an error occurs. +/// Calls `-statusWithIgnoreRule:error:` with the submodule's ignore rule. - (GTSubmoduleStatus)status:(NSError **)error; +/// Determine the status for the submodule using the given ignore rule. +/// +/// ignoreRule - The ignore rule to use in calculating status. +/// error - The error if one occurred. +/// +/// Returns the status or `GTSubmoduleStatusUnknown` if an error occurred. +- (GTSubmoduleStatus)statusWithIgnoreRule:(GTSubmoduleIgnoreRule)ignoreRule error:(NSError **)error; + /// Initializes the submodule by copying its information into the parent /// repository's `.git/config` file. This is equivalent to `git submodule init` /// on the command line. diff --git a/ObjectiveGit/GTSubmodule.m b/ObjectiveGit/GTSubmodule.m index 0e989d586..ea59fc304 100644 --- a/ObjectiveGit/GTSubmodule.m +++ b/ObjectiveGit/GTSubmodule.m @@ -102,9 +102,9 @@ - (instancetype)initWithGitSubmodule:(git_submodule *)submodule parentRepository #pragma mark Inspection -- (GTSubmoduleStatus)status:(NSError **)error { +- (GTSubmoduleStatus)statusWithIgnoreRule:(GTSubmoduleIgnoreRule)ignoreRule error:(NSError **)error { unsigned status; - int gitError = git_submodule_status(&status, self.parentRepository.git_repository, git_submodule_name(self.git_submodule), git_submodule_ignore(self.git_submodule)); + int gitError = git_submodule_status(&status, self.parentRepository.git_repository, git_submodule_name(self.git_submodule), (git_submodule_ignore_t)ignoreRule); if (gitError != GIT_OK) { if (error != NULL) *error = [NSError git_errorFor:gitError description:@"Failed to get submodule %@ status.", self.name]; return GTSubmoduleStatusUnknown; @@ -113,6 +113,10 @@ - (GTSubmoduleStatus)status:(NSError **)error { return status; } +- (GTSubmoduleStatus)status:(NSError **)error { + return [self statusWithIgnoreRule:self.ignoreRule error:error]; +} + #pragma mark Manipulation - (BOOL)reload:(NSError **)error { From f37d97e1d460903329f00cf7fe40def2a752d0b8 Mon Sep 17 00:00:00 2001 From: joshaber Date: Fri, 3 Jul 2015 15:02:57 -0400 Subject: [PATCH 3/5] Update tests. --- ObjectiveGitTests/GTSubmoduleSpec.m | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/ObjectiveGitTests/GTSubmoduleSpec.m b/ObjectiveGitTests/GTSubmoduleSpec.m index 8b27192b7..098d6cbca 100644 --- a/ObjectiveGitTests/GTSubmoduleSpec.m +++ b/ObjectiveGitTests/GTSubmoduleSpec.m @@ -93,6 +93,15 @@ expect(@(success)).to(beTruthy()); }); +it(@"should update the ignore rule", ^{ + GTSubmodule *submodule = [repo submoduleWithName:@"Test_App" error:NULL]; + expect(submodule).notTo(beNil()); + expect(@(submodule.ignoreRule)).to(equal(@(GTSubmoduleIgnoreNone))); + + submodule = [submodule submoduleByUpdatingIgnoreRule:GTSubmoduleIgnoreAll error:NULL]; + expect(@(submodule.ignoreRule)).to(equal(@(GTSubmoduleIgnoreAll))); +}); + describe(@"clean, checked out submodule", ^{ __block GTSubmodule *submodule; @@ -204,13 +213,11 @@ }); it(@"should honor the ignore rule", ^{ - submodule.ignoreRule = GTSubmoduleIgnoreDirty; - GTSubmoduleStatus expectedStatus = GTSubmoduleStatusExistsInHEAD | GTSubmoduleStatusExistsInIndex | GTSubmoduleStatusExistsInConfig | GTSubmoduleStatusExistsInWorkingDirectory | GTSubmoduleStatusModifiedInIndex | GTSubmoduleStatusModifiedInWorkingDirectory; - expect(@([submodule status:NULL])).to(equal(@(expectedStatus))); + expect(@([submodule statusWithIgnoreRule:GTSubmoduleIgnoreDirty error:NULL])).to(equal(@(expectedStatus))); }); it(@"should open a repository" ,^{ From fc544f97cc5af1f05e89cdbaa89eef36ce658036 Mon Sep 17 00:00:00 2001 From: joshaber Date: Fri, 3 Jul 2015 15:04:20 -0400 Subject: [PATCH 4/5] Show that it doesn't modify the receiver. --- ObjectiveGitTests/GTSubmoduleSpec.m | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ObjectiveGitTests/GTSubmoduleSpec.m b/ObjectiveGitTests/GTSubmoduleSpec.m index 098d6cbca..1039703ac 100644 --- a/ObjectiveGitTests/GTSubmoduleSpec.m +++ b/ObjectiveGitTests/GTSubmoduleSpec.m @@ -98,8 +98,9 @@ expect(submodule).notTo(beNil()); expect(@(submodule.ignoreRule)).to(equal(@(GTSubmoduleIgnoreNone))); - submodule = [submodule submoduleByUpdatingIgnoreRule:GTSubmoduleIgnoreAll error:NULL]; - expect(@(submodule.ignoreRule)).to(equal(@(GTSubmoduleIgnoreAll))); + GTSubmodule *updatedSubmodule = [submodule submoduleByUpdatingIgnoreRule:GTSubmoduleIgnoreAll error:NULL]; + expect(@(updatedSubmodule.ignoreRule)).to(equal(@(GTSubmoduleIgnoreAll))); + expect(@(submodule.ignoreRule)).to(equal(@(GTSubmoduleIgnoreNone))); }); describe(@"clean, checked out submodule", ^{ From 6d185a47d18f6587e127584f896104745dc564fe Mon Sep 17 00:00:00 2001 From: joshaber Date: Fri, 3 Jul 2015 15:12:14 -0400 Subject: [PATCH 5/5] Totes nullable. --- ObjectiveGit/GTSubmodule.h | 2 +- ObjectiveGit/GTSubmodule.m | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ObjectiveGit/GTSubmodule.h b/ObjectiveGit/GTSubmodule.h index 8bef68b34..4c3bd2d77 100644 --- a/ObjectiveGit/GTSubmodule.h +++ b/ObjectiveGit/GTSubmodule.h @@ -117,7 +117,7 @@ NS_ASSUME_NONNULL_BEGIN /// error - The error if one occurred. /// /// Returns the updated submodule or nil if an error occurred. -- (GTSubmodule *)submoduleByUpdatingIgnoreRule:(GTSubmoduleIgnoreRule)ignoreRule error:(NSError **)error; +- (nullable GTSubmodule *)submoduleByUpdatingIgnoreRule:(GTSubmoduleIgnoreRule)ignoreRule error:(NSError **)error; /// Synchronizes the submodule repository's configuration files with the settings /// from the parent repository. diff --git a/ObjectiveGit/GTSubmodule.m b/ObjectiveGit/GTSubmodule.m index ea59fc304..25346cf45 100644 --- a/ObjectiveGit/GTSubmodule.m +++ b/ObjectiveGit/GTSubmodule.m @@ -139,7 +139,7 @@ - (BOOL)sync:(NSError **)error { return YES; } -- (GTRepository *)submoduleRepository:(NSError **)error { +- (nullable GTRepository *)submoduleRepository:(NSError **)error { git_repository *repo; int gitError = git_submodule_open(&repo, self.git_submodule); if (gitError != GIT_OK) {