mirror of
https://github.com/gosticks/SwiftGit2.git
synced 2025-10-16 11:55:34 +00:00
refactor the repository diff to rely on flatmaps to propogate errors
This commit is contained in:
parent
d7154e6f40
commit
8bb6e30ff4
2
Carthage/Checkouts/Result
vendored
2
Carthage/Checkouts/Result
vendored
@ -1 +1 @@
|
|||||||
Subproject commit 2af7c146071c8d8fb3953f19924ecebf15c88ea7
|
Subproject commit c8446185238659a2b27c0261f64ff1254291d07d
|
||||||
@ -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)
|
||||||
}
|
|
||||||
|
|
||||||
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!)
|
|
||||||
}
|
}
|
||||||
|
.flatMap { baseTree in
|
||||||
return self.processDiffDeltas(diffResult.value!)
|
guard !commit.parents.isEmpty else {
|
||||||
} else {
|
// Initial commit in a repository
|
||||||
// Possible Merge Commit, merge diffs of base with each parent
|
return self.diff(withOldTree: nil, andNewTree: baseTree)
|
||||||
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!)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let parentTree = self.tree(from: parentCommit.value!)
|
var mergeDiff: Result<OpaquePointer?, NSError> = .success(nil)
|
||||||
guard parentTree.error == nil else {
|
for parent in commit.parents {
|
||||||
return Result.failure(parentTree.error!)
|
mergeDiff = mergeDiff
|
||||||
}
|
.flatMap { mergeDiff in
|
||||||
|
return self
|
||||||
let diffResult = self.diff(withOldTree: parentTree.value!, andNewTree: baseTree.value!)
|
.parentCommit(from: parent)
|
||||||
guard diffResult.error == nil else {
|
.flatMap { commit in
|
||||||
return Result.failure(diffResult.error!)
|
return self.tree(from: commit)
|
||||||
}
|
}
|
||||||
|
.flatMap { tree in
|
||||||
if mergeDiff == nil {
|
return self.diff(withOldTree: tree, andNewTree: baseTree)
|
||||||
mergeDiff = diffResult.value
|
}
|
||||||
} else {
|
.flatMap { diff in
|
||||||
let mergeResult = git_diff_merge(mergeDiff, diffResult.value)
|
guard let mergeDiff = mergeDiff else { return .success(diff) }
|
||||||
guard mergeResult == GIT_OK.rawValue else {
|
let mergeResult = git_diff_merge(mergeDiff, diff)
|
||||||
return Result.failure(NSError(gitError: mergeResult, pointOfFailure: "git_diff_merge"))
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user