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