mirror of
https://github.com/gosticks/SwiftGit2.git
synced 2025-10-16 11:55:34 +00:00
Add Remotes
This commit is contained in:
parent
e40e19a3fc
commit
4a0b5cd838
@ -7,6 +7,7 @@
|
|||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
|
BE0991F71A578FB1007D4E6A /* Mantle.zip in Resources */ = {isa = PBXBuildFile; fileRef = BE0991F61A578FB1007D4E6A /* Mantle.zip */; };
|
||||||
BE14AA321A15AA510015B439 /* LlamaKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BE14AA311A15AA510015B439 /* LlamaKit.framework */; };
|
BE14AA321A15AA510015B439 /* LlamaKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BE14AA311A15AA510015B439 /* LlamaKit.framework */; };
|
||||||
BE14AA501A1974010015B439 /* SwiftGit2.m in Sources */ = {isa = PBXBuildFile; fileRef = BE14AA4F1A1974010015B439 /* SwiftGit2.m */; };
|
BE14AA501A1974010015B439 /* SwiftGit2.m in Sources */ = {isa = PBXBuildFile; fileRef = BE14AA4F1A1974010015B439 /* SwiftGit2.m */; };
|
||||||
BE14AA551A1984550015B439 /* Fixtures.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE14AA541A1984550015B439 /* Fixtures.swift */; };
|
BE14AA551A1984550015B439 /* Fixtures.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE14AA541A1984550015B439 /* Fixtures.swift */; };
|
||||||
@ -66,6 +67,7 @@
|
|||||||
/* End PBXCopyFilesBuildPhase section */
|
/* End PBXCopyFilesBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
|
BE0991F61A578FB1007D4E6A /* Mantle.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = Mantle.zip; sourceTree = "<group>"; };
|
||||||
BE14AA311A15AA510015B439 /* LlamaKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = LlamaKit.framework; path = External/LlamaKit/build/Debug/LlamaKit.framework; sourceTree = "<group>"; };
|
BE14AA311A15AA510015B439 /* LlamaKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = LlamaKit.framework; path = External/LlamaKit/build/Debug/LlamaKit.framework; sourceTree = "<group>"; };
|
||||||
BE14AA4F1A1974010015B439 /* SwiftGit2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SwiftGit2.m; sourceTree = "<group>"; };
|
BE14AA4F1A1974010015B439 /* SwiftGit2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SwiftGit2.m; sourceTree = "<group>"; };
|
||||||
BE14AA541A1984550015B439 /* Fixtures.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Fixtures.swift; sourceTree = "<group>"; };
|
BE14AA541A1984550015B439 /* Fixtures.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Fixtures.swift; sourceTree = "<group>"; };
|
||||||
@ -143,6 +145,7 @@
|
|||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
BE14AA541A1984550015B439 /* Fixtures.swift */,
|
BE14AA541A1984550015B439 /* Fixtures.swift */,
|
||||||
|
BE0991F61A578FB1007D4E6A /* Mantle.zip */,
|
||||||
BE14AA561A198C6E0015B439 /* simple-repository.zip */,
|
BE14AA561A198C6E0015B439 /* simple-repository.zip */,
|
||||||
);
|
);
|
||||||
path = Fixtures;
|
path = Fixtures;
|
||||||
@ -426,6 +429,7 @@
|
|||||||
isa = PBXResourcesBuildPhase;
|
isa = PBXResourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
BE0991F71A578FB1007D4E6A /* Mantle.zip in Resources */,
|
||||||
BE14AA571A198C6E0015B439 /* simple-repository.zip in Resources */,
|
BE14AA571A198C6E0015B439 /* simple-repository.zip in Resources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
|||||||
@ -6,3 +6,29 @@
|
|||||||
// Copyright (c) 2015 GitHub, Inc. All rights reserved.
|
// Copyright (c) 2015 GitHub, Inc. All rights reserved.
|
||||||
//
|
//
|
||||||
|
|
||||||
|
/// A remote in a git repository.
|
||||||
|
public struct Remote {
|
||||||
|
/// The name of the remote.
|
||||||
|
public let name: String
|
||||||
|
|
||||||
|
/// The URL of the remote.
|
||||||
|
///
|
||||||
|
/// This may be an SSH URL, which isn't representable using `NSURL`.
|
||||||
|
public let URL: String
|
||||||
|
|
||||||
|
/// Create an instance with a libgit2 `git_remote`.
|
||||||
|
public init(_ pointer: COpaquePointer) {
|
||||||
|
name = String.fromCString(git_remote_name(pointer))!
|
||||||
|
URL = String.fromCString(git_remote_url(pointer))!
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension Remote: Hashable {
|
||||||
|
public var hashValue: Int {
|
||||||
|
return name.hashValue ^ URL.hashValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public func == (lhs: Remote, rhs: Remote) -> Bool {
|
||||||
|
return lhs.name == rhs.name && lhs.URL == rhs.URL
|
||||||
|
}
|
||||||
|
|||||||
@ -146,4 +146,55 @@ final public class Repository {
|
|||||||
return treeWithOID(oid).map { $0 as ObjectType }
|
return treeWithOID(oid).map { $0 as ObjectType }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: - Remote Lookups
|
||||||
|
|
||||||
|
/// Loads all the remotes in the repository.
|
||||||
|
///
|
||||||
|
/// Returns an array of remotes, or an error.
|
||||||
|
public func allRemotes() -> Result<[Remote]> {
|
||||||
|
let pointer = UnsafeMutablePointer<git_strarray>.alloc(1)
|
||||||
|
let repository = self.pointer
|
||||||
|
let result = git_remote_list(pointer, repository)
|
||||||
|
|
||||||
|
if result != GIT_OK.value {
|
||||||
|
pointer.dealloc(1)
|
||||||
|
return failure()
|
||||||
|
}
|
||||||
|
|
||||||
|
let strarray = pointer.memory
|
||||||
|
let remotes: [Result<Remote>] = map(0..<strarray.count) {
|
||||||
|
let idx = Int($0)
|
||||||
|
let name = String.fromCString(strarray.strings[idx])!
|
||||||
|
return self.remoteWithName(name)
|
||||||
|
}
|
||||||
|
pointer.dealloc(1)
|
||||||
|
|
||||||
|
let error = remotes.reduce(nil) { $0 == nil ? $0 : $1.error() }
|
||||||
|
if let error = error {
|
||||||
|
return failure(error)
|
||||||
|
}
|
||||||
|
return success(remotes.map { $0.value()! })
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Load a remote from the repository.
|
||||||
|
///
|
||||||
|
/// name - The name of the remote.
|
||||||
|
///
|
||||||
|
/// Returns the remote if it exists, or an error.
|
||||||
|
public func remoteWithName(name: String) -> Result<Remote> {
|
||||||
|
let pointer = UnsafeMutablePointer<COpaquePointer>.alloc(1)
|
||||||
|
let repository = self.pointer
|
||||||
|
let result = git_remote_lookup(pointer, repository, name.cStringUsingEncoding(NSUTF8StringEncoding)!)
|
||||||
|
|
||||||
|
if result != GIT_OK.value {
|
||||||
|
pointer.dealloc(1)
|
||||||
|
return failure()
|
||||||
|
}
|
||||||
|
|
||||||
|
let value = Remote(pointer.memory)
|
||||||
|
git_remote_free(pointer.memory)
|
||||||
|
pointer.dealloc(1)
|
||||||
|
return success(value)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -67,4 +67,8 @@ final class Fixtures {
|
|||||||
class var simpleRepository: Repository {
|
class var simpleRepository: Repository {
|
||||||
return Fixtures.sharedInstance.repositoryWithName("simple-repository")
|
return Fixtures.sharedInstance.repositoryWithName("simple-repository")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class var mantleRepository: Repository {
|
||||||
|
return Fixtures.sharedInstance.repositoryWithName("Mantle")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
SwiftGit2Tests/Fixtures/Mantle.zip
Normal file
BIN
SwiftGit2Tests/Fixtures/Mantle.zip
Normal file
Binary file not shown.
@ -10,3 +10,54 @@ import LlamaKit
|
|||||||
import SwiftGit2
|
import SwiftGit2
|
||||||
import Nimble
|
import Nimble
|
||||||
import Quick
|
import Quick
|
||||||
|
|
||||||
|
func with_git_remote<T>(repository: Repository, name: String, f: COpaquePointer -> T) -> T {
|
||||||
|
let repository = repository.pointer
|
||||||
|
|
||||||
|
let pointer = UnsafeMutablePointer<COpaquePointer>.alloc(1)
|
||||||
|
git_remote_lookup(pointer, repository, name.cStringUsingEncoding(NSUTF8StringEncoding)!)
|
||||||
|
let result = f(pointer.memory)
|
||||||
|
git_object_free(pointer.memory)
|
||||||
|
pointer.dealloc(1)
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
class RemoteSpec: QuickSpec {
|
||||||
|
override func spec() {
|
||||||
|
describe("init(pointer:)") {
|
||||||
|
it("should initialize its properties") {
|
||||||
|
let repo = Fixtures.mantleRepository
|
||||||
|
let remote = with_git_remote(repo, "upstream") { Remote($0) }
|
||||||
|
|
||||||
|
expect(remote.name).to(equal("upstream"))
|
||||||
|
expect(remote.URL).to(equal("git@github.com:Mantle/Mantle.git"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
describe("==") {
|
||||||
|
it("should be true with equal objects") {
|
||||||
|
let repo = Fixtures.mantleRepository
|
||||||
|
let remote1 = with_git_remote(repo, "upstream") { Remote($0) }
|
||||||
|
let remote2 = remote1
|
||||||
|
expect(remote1).to(equal(remote2))
|
||||||
|
}
|
||||||
|
|
||||||
|
it("should be false with unequal objcets") {
|
||||||
|
let repo = Fixtures.mantleRepository
|
||||||
|
let origin = with_git_remote(repo, "origin") { Remote($0) }
|
||||||
|
let upstream = with_git_remote(repo, "upstream") { Remote($0) }
|
||||||
|
expect(origin).notTo(equal(upstream))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
describe("hashValue") {
|
||||||
|
it("should be equal with equal objcets") {
|
||||||
|
let repo = Fixtures.mantleRepository
|
||||||
|
let remote1 = with_git_remote(repo, "upstream") { Remote($0) }
|
||||||
|
let remote2 = remote1
|
||||||
|
expect(remote1.hashValue).to(equal(remote2.hashValue))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -222,5 +222,35 @@ class RepositorySpec: QuickSpec {
|
|||||||
expect(result).to(equal(tag))
|
expect(result).to(equal(tag))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
describe("-allRemotes()") {
|
||||||
|
it("should return an empty list if there are no remotes") {
|
||||||
|
let repo = Fixtures.simpleRepository
|
||||||
|
let result = repo.allRemotes()
|
||||||
|
expect(result.value()).to(equal([]))
|
||||||
|
}
|
||||||
|
|
||||||
|
it("should return all the remotes") {
|
||||||
|
let repo = Fixtures.mantleRepository
|
||||||
|
let remotes = repo.allRemotes().value()
|
||||||
|
let names = remotes?.map { $0.name }
|
||||||
|
expect(remotes?.count).to(equal(2))
|
||||||
|
expect(names).to(contain("origin", "upstream"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
describe("-remoteWithName()") {
|
||||||
|
it("should return the remote if it exists") {
|
||||||
|
let repo = Fixtures.mantleRepository
|
||||||
|
let result = repo.remoteWithName("upstream")
|
||||||
|
expect(result.value()?.name).to(equal("upstream"))
|
||||||
|
}
|
||||||
|
|
||||||
|
it("should error if the remote doesn't exist") {
|
||||||
|
let repo = Fixtures.simpleRepository
|
||||||
|
let result = repo.remoteWithName("nonexistent")
|
||||||
|
expect(result.error()).notTo(beNil())
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user