diff --git a/SwiftGit2/CommitIterator.swift b/SwiftGit2/CommitIterator.swift index da6b364..88cdeda 100644 --- a/SwiftGit2/CommitIterator.swift +++ b/SwiftGit2/CommitIterator.swift @@ -67,11 +67,11 @@ public class CommitIterator: IteratorProtocol, Sequence { return result } } - + public func makeIterator() -> CommitIterator { return self } - + public private(set) var underestimatedCount: Int = 0 public func map(_ transform: (Result) throws -> T) rethrows -> [T] { var new: [T] = [] @@ -80,7 +80,7 @@ public class CommitIterator: IteratorProtocol, Sequence { } return new } - + public func filter(_ isIncluded: (Result) throws -> Bool) rethrows -> [Result] { var new: [Result] = [] for item in self { @@ -90,53 +90,53 @@ public class CommitIterator: IteratorProtocol, Sequence { } return new } - + public func forEach(_ body: (Result) throws -> Void) rethrows { for item in self { try body(item) } } - + private func notImplemented(functionName: Any) { assert(false, "CommitIterator does not implement \(functionName)") } private init(repo: Repository) { self.repo = repo } - + public func dropFirst(_ n: Int) -> AnySequence { notImplemented(functionName: self.dropFirst) return AnySequence { return CommitIterator(repo: self.repo) } } - + public func dropLast(_ n: Int) -> AnySequence { notImplemented(functionName: self.dropLast) return AnySequence { return CommitIterator(repo: self.repo) } } - + public func drop(while predicate: (Result) throws -> Bool) rethrows -> AnySequence { notImplemented(functionName: self.drop) return AnySequence { return CommitIterator(repo: self.repo) } } - + public func prefix(_ maxLength: Int) -> AnySequence { notImplemented(functionName: "prefix(_ maxLength:") return AnySequence { return CommitIterator(repo: self.repo) } } - + public func prefix(while predicate: (Result) throws -> Bool) rethrows -> AnySequence { notImplemented(functionName: "prefix(with predicate:") return AnySequence { return CommitIterator(repo: self.repo) } } - + public func suffix(_ maxLength: Int) -> AnySequence { notImplemented(functionName: self.suffix) return AnySequence { return CommitIterator(repo: self.repo) } } - + public func split(maxSplits: Int, omittingEmptySubsequences: Bool, whereSeparator isSeparator: (Result) throws -> Bool) rethrows -> [AnySequence] { notImplemented(functionName: self.split) return [AnySequence { return CommitIterator(repo: self.repo) }] } - + } diff --git a/SwiftGit2/References.swift b/SwiftGit2/References.swift index 67389c4..8d88c33 100644 --- a/SwiftGit2/References.swift +++ b/SwiftGit2/References.swift @@ -102,9 +102,9 @@ public struct Branch: ReferenceType { return nil } name = String(validatingUTF8: namePointer!)! - + longName = String(validatingUTF8: git_reference_name(pointer))! - + var oid: OID if git_reference_type(pointer).rawValue == GIT_REF_SYMBOLIC.rawValue { var resolved: OpaquePointer? = nil diff --git a/SwiftGit2/Repository.swift b/SwiftGit2/Repository.swift index 12a0d9c..8b70684 100644 --- a/SwiftGit2/Repository.swift +++ b/SwiftGit2/Repository.swift @@ -528,7 +528,7 @@ final public class Repository { progress: CheckoutProgressBlock? = nil) -> Result<(), NSError> { return setHEAD(reference).flatMap { self.checkout(strategy: strategy, progress: progress) } } - + /// Load all commits in the specified branch in topological & time order descending /// /// :param: branch The branch to get all commits from diff --git a/SwiftGit2Tests/RepositorySpec.swift b/SwiftGit2Tests/RepositorySpec.swift index d31dd6f..682b362 100644 --- a/SwiftGit2Tests/RepositorySpec.swift +++ b/SwiftGit2Tests/RepositorySpec.swift @@ -18,7 +18,7 @@ class RepositorySpec: QuickSpec { let repo = Fixtures.simpleRepository expect(repo.directoryURL).notTo(beNil()) } - + it("should fail if the repo doesn't exist") { let url = URL(fileURLWithPath: "blah") let result = Repository.at(url) @@ -45,68 +45,68 @@ class RepositorySpec: QuickSpec { let remoteRepo = Fixtures.simpleRepository let localURL = self.temporaryURL(forPurpose: "local-clone") let result = Repository.clone(from: remoteRepo.directoryURL!, to: localURL, localClone: true) - + expect(result.error).to(beNil()) - + if case .success(let clonedRepo) = result { expect(clonedRepo.directoryURL).notTo(beNil()) } } - + it("should handle bare clones") { let remoteRepo = Fixtures.simpleRepository let localURL = self.temporaryURL(forPurpose: "bare-clone") let result = Repository.clone(from: remoteRepo.directoryURL!, to: localURL, localClone: true, bare: true) - + expect(result.error).to(beNil()) - + if case .success(let clonedRepo) = result { expect(clonedRepo.directoryURL).to(beNil()) } } - + it("should have set a valid remote url") { let remoteRepo = Fixtures.simpleRepository let localURL = self.temporaryURL(forPurpose: "valid-remote-clone") let cloneResult = Repository.clone(from: remoteRepo.directoryURL!, to: localURL, localClone: true) - + expect(cloneResult.error).to(beNil()) - + if case .success(let clonedRepo) = cloneResult { let remoteResult = clonedRepo.remote(named: "origin") expect(remoteResult.error).to(beNil()) - + if case .success(let remote) = remoteResult { expect(remote.URL).to(equal(remoteRepo.directoryURL?.absoluteString)) } } } - + it("should be able to clone a remote repository") { let remoteRepoURL = URL(string: "https://github.com/libgit2/libgit2.github.com.git") let localURL = self.temporaryURL(forPurpose: "public-remote-clone") let cloneResult = Repository.clone(from: remoteRepoURL!, to: localURL) - + expect(cloneResult.error).to(beNil()) - + if case .success(let clonedRepo) = cloneResult { let remoteResult = clonedRepo.remote(named: "origin") expect(remoteResult.error).to(beNil()) - + if case .success(let remote) = remoteResult { expect(remote.URL).to(equal(remoteRepoURL?.absoluteString)) } } } - + let env = ProcessInfo.processInfo.environment - + if let privateRepo = env["SG2TestPrivateRepo"], let gitUsername = env["SG2TestUsername"], let publicKey = env["SG2TestPublicKey"], let privateKey = env["SG2TestPrivateKey"], let passphrase = env["SG2TestPassphrase"] { - + it("should be able to clone a remote repository requiring credentials") { let remoteRepoURL = URL(string: privateRepo) let localURL = self.temporaryURL(forPurpose: "private-remote-clone") @@ -114,15 +114,15 @@ class RepositorySpec: QuickSpec { publicKey: publicKey, privateKey: privateKey, passphrase: passphrase) - + let cloneResult = Repository.clone(from: remoteRepoURL!, to: localURL, credentials: credentials) - + expect(cloneResult.error).to(beNil()) - + if case .success(let clonedRepo) = cloneResult { let remoteResult = clonedRepo.remote(named: "origin") expect(remoteResult.error).to(beNil()) - + if case .success(let remote) = remoteResult { expect(remote.URL).to(equal(remoteRepoURL?.absoluteString)) } @@ -130,115 +130,115 @@ class RepositorySpec: QuickSpec { } } } - + describe("Repository.blob(_:)") { it("should return the commit if it exists") { let repo = Fixtures.simpleRepository let oid = OID(string: "41078396f5187daed5f673e4a13b185bbad71fba")! - + let result = repo.blob(oid) expect(result.map { $0.oid }.value) == oid } - + it("should error if the blob doesn't exist") { let repo = Fixtures.simpleRepository let oid = OID(string: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")! - + let result = repo.blob(oid) expect(result.error?.domain) == libGit2ErrorDomain } - + it("should error if the oid doesn't point to a blob") { let repo = Fixtures.simpleRepository // This is a tree in the repository let oid = OID(string: "f93e3a1a1525fb5b91020da86e44810c87a2d7bc")! - + let result = repo.blob(oid) expect(result.error).notTo(beNil()) } } - + describe("Repository.commit(_:)") { it("should return the commit if it exists") { let repo = Fixtures.simpleRepository let oid = OID(string: "dc220a3f0c22920dab86d4a8d3a3cb7e69d6205a")! - + let result = repo.commit(oid) expect(result.map { $0.oid }.value) == oid } - + it("should error if the commit doesn't exist") { let repo = Fixtures.simpleRepository let oid = OID(string: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")! - + let result = repo.commit(oid) expect(result.error?.domain) == libGit2ErrorDomain } - + it("should error if the oid doesn't point to a commit") { let repo = Fixtures.simpleRepository // This is a tree in the repository let oid = OID(string: "f93e3a1a1525fb5b91020da86e44810c87a2d7bc")! - + let result = repo.commit(oid) expect(result.error?.domain) == libGit2ErrorDomain } } - + describe("Repository.tag(_:)") { it("should return the tag if it exists") { let repo = Fixtures.simpleRepository let oid = OID(string: "57943b8ee00348180ceeedc960451562750f6d33")! - + let result = repo.tag(oid) expect(result.map { $0.oid }.value) == oid } - + it("should error if the tag doesn't exist") { let repo = Fixtures.simpleRepository let oid = OID(string: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")! - + let result = repo.tag(oid) expect(result.error?.domain) == libGit2ErrorDomain } - + it("should error if the oid doesn't point to a tag") { let repo = Fixtures.simpleRepository // This is a commit in the repository let oid = OID(string: "dc220a3f0c22920dab86d4a8d3a3cb7e69d6205a")! - + let result = repo.tag(oid) expect(result.error?.domain) == libGit2ErrorDomain } } - + describe("Repository.tree(_:)") { it("should return the tree if it exists") { let repo = Fixtures.simpleRepository let oid = OID(string: "f93e3a1a1525fb5b91020da86e44810c87a2d7bc")! - + let result = repo.tree(oid) expect(result.map { $0.oid }.value) == oid } - + it("should error if the tree doesn't exist") { let repo = Fixtures.simpleRepository let oid = OID(string: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")! - + let result = repo.tree(oid) expect(result.error?.domain) == libGit2ErrorDomain } - + it("should error if the oid doesn't point to a tree") { let repo = Fixtures.simpleRepository // This is a commit in the repository let oid = OID(string: "dc220a3f0c22920dab86d4a8d3a3cb7e69d6205a")! - + let result = repo.tree(oid) expect(result.error?.domain) == libGit2ErrorDomain } } - + describe("Repository.object(_:)") { it("should work with a blob") { let repo = Fixtures.simpleRepository @@ -247,7 +247,7 @@ class RepositorySpec: QuickSpec { let result = repo.object(oid) expect(result.map { $0 as! Blob }.value) == blob } - + it("should work with a commit") { let repo = Fixtures.simpleRepository let oid = OID(string: "dc220a3f0c22920dab86d4a8d3a3cb7e69d6205a")! @@ -255,7 +255,7 @@ class RepositorySpec: QuickSpec { let result = repo.object(oid) expect(result.map { $0 as! Commit }.value) == commit } - + it("should work with a tag") { let repo = Fixtures.simpleRepository let oid = OID(string: "57943b8ee00348180ceeedc960451562750f6d33")! @@ -263,7 +263,7 @@ class RepositorySpec: QuickSpec { let result = repo.object(oid) expect(result.map { $0 as! Tag }.value) == tag } - + it("should work with a tree") { let repo = Fixtures.simpleRepository let oid = OID(string: "f93e3a1a1525fb5b91020da86e44810c87a2d7bc")! @@ -271,7 +271,7 @@ class RepositorySpec: QuickSpec { let result = repo.object(oid) expect(result.map { $0 as! Tree }.value) == tree } - + it("should error if there's no object with that oid") { let repo = Fixtures.simpleRepository let oid = OID(string: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")! @@ -279,94 +279,94 @@ class RepositorySpec: QuickSpec { expect(result.error?.domain) == libGit2ErrorDomain } } - + describe("Repository.object(from: PointerTo)") { it("should work with commits") { let repo = Fixtures.simpleRepository let oid = OID(string: "dc220a3f0c22920dab86d4a8d3a3cb7e69d6205a")! - + let pointer = PointerTo(oid) let commit = repo.commit(oid).value! expect(repo.object(from: pointer).value) == commit } - + it("should work with trees") { let repo = Fixtures.simpleRepository let oid = OID(string: "f93e3a1a1525fb5b91020da86e44810c87a2d7bc")! - + let pointer = PointerTo(oid) let tree = repo.tree(oid).value! expect(repo.object(from: pointer).value) == tree } - + it("should work with blobs") { let repo = Fixtures.simpleRepository let oid = OID(string: "41078396f5187daed5f673e4a13b185bbad71fba")! - + let pointer = PointerTo(oid) let blob = repo.blob(oid).value! expect(repo.object(from: pointer).value) == blob } - + it("should work with tags") { let repo = Fixtures.simpleRepository let oid = OID(string: "57943b8ee00348180ceeedc960451562750f6d33")! - + let pointer = PointerTo(oid) let tag = repo.tag(oid).value! expect(repo.object(from: pointer).value) == tag } } - + describe("Repository.object(from: Pointer)") { it("should work with commits") { let repo = Fixtures.simpleRepository let oid = OID(string: "dc220a3f0c22920dab86d4a8d3a3cb7e69d6205a")! - + let pointer = Pointer.commit(oid) let commit = repo.commit(oid).value! let result = repo.object(from: pointer).map { $0 as! Commit } expect(result.value) == commit } - + it("should work with trees") { let repo = Fixtures.simpleRepository let oid = OID(string: "f93e3a1a1525fb5b91020da86e44810c87a2d7bc")! - + let pointer = Pointer.tree(oid) let tree = repo.tree(oid).value! let result = repo.object(from: pointer).map { $0 as! Tree } expect(result.value) == tree } - + it("should work with blobs") { let repo = Fixtures.simpleRepository let oid = OID(string: "41078396f5187daed5f673e4a13b185bbad71fba")! - + let pointer = Pointer.blob(oid) let blob = repo.blob(oid).value! let result = repo.object(from: pointer).map { $0 as! Blob } expect(result.value) == blob } - + it("should work with tags") { let repo = Fixtures.simpleRepository let oid = OID(string: "57943b8ee00348180ceeedc960451562750f6d33")! - + let pointer = Pointer.tag(oid) let tag = repo.tag(oid).value! let result = repo.object(from: pointer).map { $0 as! Tag } expect(result.value) == tag } } - + describe("Repository.allRemotes()") { it("should return an empty list if there are no remotes") { let repo = Fixtures.simpleRepository let result = repo.allRemotes() expect(result.value) == [] } - + it("should return all the remotes") { let repo = Fixtures.mantleRepository let remotes = repo.allRemotes() @@ -375,21 +375,21 @@ class RepositorySpec: QuickSpec { expect(names.value).to(contain("origin", "upstream")) } } - + describe("Repository.remote(named:)") { it("should return the remote if it exists") { let repo = Fixtures.mantleRepository let result = repo.remote(named: "upstream") expect(result.map { $0.name }.value) == "upstream" } - + it("should error if the remote doesn't exist") { let repo = Fixtures.simpleRepository let result = repo.remote(named: "nonexistent") expect(result.error?.domain) == libGit2ErrorDomain } } - + describe("Repository.reference(named:)") { it("should return a local branch if it exists") { let name = "refs/heads/master" @@ -397,33 +397,33 @@ class RepositorySpec: QuickSpec { expect(result.map { $0.longName }.value) == name expect(result.value as? Branch).notTo(beNil()) } - + it("should return a remote branch if it exists") { let name = "refs/remotes/upstream/master" let result = Fixtures.mantleRepository.reference(named: name) expect(result.map { $0.longName }.value) == name expect(result.value as? Branch).notTo(beNil()) } - + it("should return a tag if it exists") { let name = "refs/tags/tag-2" let result = Fixtures.simpleRepository.reference(named: name) expect(result.value?.longName).to(equal(name)) expect(result.value as? TagReference).notTo(beNil()) } - + it("should return the reference if it exists") { let name = "refs/other-ref" let result = Fixtures.simpleRepository.reference(named: name) expect(result.value?.longName).to(equal(name)) } - + it("should error if the reference doesn't exist") { let result = Fixtures.simpleRepository.reference(named: "refs/heads/nonexistent") expect(result.error?.domain) == libGit2ErrorDomain } } - + describe("Repository.localBranches()") { it("should return all the local branches") { let repo = Fixtures.simpleRepository @@ -435,7 +435,7 @@ class RepositorySpec: QuickSpec { expect(repo.localBranches().value).to(equal(expected)) } } - + describe("Repository.remoteBranches()") { it("should return all the remote branches") { let repo = Fixtures.mantleRepository @@ -466,31 +466,31 @@ class RepositorySpec: QuickSpec { expect(actual.map { $0.name }).to(equal(expectedNames)) } } - + describe("Repository.localBranch(named:)") { it("should return the branch if it exists") { let result = Fixtures.simpleRepository.localBranch(named: "master") expect(result.value?.longName).to(equal("refs/heads/master")) } - + it("should error if the branch doesn't exists") { let result = Fixtures.simpleRepository.localBranch(named: "nonexistent") expect(result.error?.domain) == libGit2ErrorDomain } } - + describe("Repository.remoteBranch(named:)") { it("should return the branch if it exists") { let result = Fixtures.mantleRepository.remoteBranch(named: "upstream/master") expect(result.value?.longName).to(equal("refs/remotes/upstream/master")) } - + it("should error if the branch doesn't exists") { let result = Fixtures.simpleRepository.remoteBranch(named: "origin/nonexistent") expect(result.error?.domain) == libGit2ErrorDomain } } - + describe("Repository.allTags()") { it("should return all the tags") { let repo = Fixtures.simpleRepository @@ -501,19 +501,19 @@ class RepositorySpec: QuickSpec { expect(repo.allTags().value).to(equal(expected)) } } - + describe("Repository.tag(named:)") { it("should return the tag if it exists") { let result = Fixtures.simpleRepository.tag(named: "tag-2") expect(result.value?.longName).to(equal("refs/tags/tag-2")) } - + it("should error if the branch doesn't exists") { let result = Fixtures.simpleRepository.tag(named: "nonexistent") expect(result.error?.domain) == libGit2ErrorDomain } } - + describe("Repository.HEAD()") { it("should work when on a branch") { let result = Fixtures.simpleRepository.HEAD() @@ -521,7 +521,7 @@ class RepositorySpec: QuickSpec { expect(result.value?.shortName).to(equal("master")) expect(result.value as? Branch).notTo(beNil()) } - + it("should work when on a detached HEAD") { let result = Fixtures.detachedHeadRepository.HEAD() expect(result.value?.longName).to(equal("HEAD")) @@ -530,87 +530,87 @@ class RepositorySpec: QuickSpec { expect(result.value as? Reference).notTo(beNil()) } } - + describe("Repository.setHEAD(OID)") { it("should set HEAD to the OID") { let repo = Fixtures.simpleRepository let oid = OID(string: "315b3f344221db91ddc54b269f3c9af422da0f2e")! expect(repo.HEAD().value?.shortName).to(equal("master")) - + expect(repo.setHEAD(oid).error).to(beNil()) let HEAD = repo.HEAD().value expect(HEAD?.longName).to(equal("HEAD")) expect(HEAD?.oid).to(equal(oid)) - + expect(repo.setHEAD(repo.localBranch(named: "master").value!).error).to(beNil()) expect(repo.HEAD().value?.shortName).to(equal("master")) } } - + describe("Repository.setHEAD(ReferenceType)") { it("should set HEAD to a branch") { let repo = Fixtures.detachedHeadRepository let oid = repo.HEAD().value!.oid expect(repo.HEAD().value?.longName).to(equal("HEAD")) - + let branch = repo.localBranch(named: "another-branch").value! expect(repo.setHEAD(branch).error).to(beNil()) expect(repo.HEAD().value?.shortName).to(equal(branch.name)) - + expect(repo.setHEAD(oid).error).to(beNil()) expect(repo.HEAD().value?.longName).to(equal("HEAD")) } } - + describe("Repository.checkout()") { // We're not really equipped to test this yet. :( } - + describe("Repository.checkout(OID)") { it("should set HEAD") { let repo = Fixtures.simpleRepository let oid = OID(string: "315b3f344221db91ddc54b269f3c9af422da0f2e")! expect(repo.HEAD().value?.shortName).to(equal("master")) - + expect(repo.checkout(oid, strategy: CheckoutStrategy.None).error).to(beNil()) let HEAD = repo.HEAD().value expect(HEAD?.longName).to(equal("HEAD")) expect(HEAD?.oid).to(equal(oid)) - + expect(repo.checkout(repo.localBranch(named: "master").value!, strategy: CheckoutStrategy.None).error).to(beNil()) expect(repo.HEAD().value?.shortName).to(equal("master")) } - + it("should call block on progress") { let repo = Fixtures.simpleRepository let oid = OID(string: "315b3f344221db91ddc54b269f3c9af422da0f2e")! expect(repo.HEAD().value?.shortName).to(equal("master")) - + expect(repo.checkout(oid, strategy: .None, progress: { (_, completedSteps, totalSteps) -> Void in expect(completedSteps).to(beLessThanOrEqualTo(totalSteps)) }).error).to(beNil()) - + let HEAD = repo.HEAD().value expect(HEAD?.longName).to(equal("HEAD")) expect(HEAD?.oid).to(equal(oid)) } } - + describe("Repository.checkout(ReferenceType)") { it("should set HEAD") { let repo = Fixtures.detachedHeadRepository let oid = repo.HEAD().value!.oid expect(repo.HEAD().value?.longName).to(equal("HEAD")) - + let branch = repo.localBranch(named: "another-branch").value! expect(repo.checkout(branch, strategy: CheckoutStrategy.None).error).to(beNil()) expect(repo.HEAD().value?.shortName).to(equal(branch.name)) - + expect(repo.checkout(oid, strategy: CheckoutStrategy.None).error).to(beNil()) expect(repo.HEAD().value?.longName).to(equal("HEAD")) } } - + describe("Repository.allCommits(in:)") { it("should return all (9) commits") { let repo = Fixtures.simpleRepository @@ -638,7 +638,7 @@ class RepositorySpec: QuickSpec { } } } - + func temporaryURL(forPurpose purpose: String) -> URL { let globallyUniqueString = ProcessInfo.processInfo.globallyUniqueString let path = "\(NSTemporaryDirectory())\(globallyUniqueString)_\(purpose)"