refactor the repository diff to rely on flatmaps to propogate errors

This commit is contained in:
Jake Van Alstyne 🎩 2017-09-15 19:26:31 -06:00
parent d7154e6f40
commit 8bb6e30ff4
2 changed files with 32 additions and 44 deletions

@ -1 +1 @@
Subproject commit 2af7c146071c8d8fb3953f19924ecebf15c88ea7 Subproject commit c8446185238659a2b27c0261f64ff1254291d07d

View File

@ -541,55 +541,43 @@ final public class Repository {
// MARK: - Diffs // MARK: - Diffs
public func diff(for commit: Commit) -> Result<[Diff.Delta], NSError> { public func diff(for commit: Commit) -> Result<[Diff.Delta], NSError> {
/// Get the Base Tree return self
let baseCommit = self.commit(with: commit.oid) .commit(with: commit.oid)
guard baseCommit.error == nil else { .flatMap { baseCommit in
return Result.failure(baseCommit.error!) return self.tree(from: baseCommit)
} }
.flatMap { baseTree in
let baseTree = self.tree(from: baseCommit.value!) guard !commit.parents.isEmpty else {
guard baseTree.error == nil else {
return Result.failure(baseTree.error!)
}
if commit.parents.isEmpty {
// Initial commit in a repository // Initial commit in a repository
let diffResult = self.diff(withOldTree: nil, andNewTree: baseTree.value) return self.diff(withOldTree: nil, andNewTree: baseTree)
guard diffResult.error == nil else {
return Result.failure(diffResult.error!)
} }
return self.processDiffDeltas(diffResult.value!) var mergeDiff: Result<OpaquePointer?, NSError> = .success(nil)
} else {
// Possible Merge Commit, merge diffs of base with each parent
var mergeDiff: OpaquePointer? = nil
for parent in commit.parents { for parent in commit.parents {
mergeDiff = mergeDiff
let parentCommit = self.parentCommit(from: parent) .flatMap { mergeDiff in
guard parentCommit.error == nil else { return self
return Result.failure(parentCommit.error!) .parentCommit(from: parent)
.flatMap { commit in
return self.tree(from: commit)
} }
.flatMap { tree in
let parentTree = self.tree(from: parentCommit.value!) return self.diff(withOldTree: tree, andNewTree: baseTree)
guard parentTree.error == nil else {
return Result.failure(parentTree.error!)
} }
.flatMap { diff in
let diffResult = self.diff(withOldTree: parentTree.value!, andNewTree: baseTree.value!) guard let mergeDiff = mergeDiff else { return .success(diff) }
guard diffResult.error == nil else { let mergeResult = git_diff_merge(mergeDiff, diff)
return Result.failure(diffResult.error!)
}
if mergeDiff == nil {
mergeDiff = diffResult.value
} else {
let mergeResult = git_diff_merge(mergeDiff, diffResult.value)
guard mergeResult == GIT_OK.rawValue else { guard mergeResult == GIT_OK.rawValue else {
return Result.failure(NSError(gitError: mergeResult, pointOfFailure: "git_diff_merge")) return .failure(NSError(gitError: mergeResult, pointOfFailure: "git_diff_merge"))
}
return .success(mergeDiff)
} }
} }
} }
return self.processDiffDeltas(mergeDiff!) return .success(mergeDiff.value!!)
}
.flatMap { diffResult in
return self.processDiffDeltas(diffResult)
} }
} }