Use COpaquePointer directly

This commit is contained in:
Matt Diephouse 2015-03-09 17:32:48 -04:00
parent 7ee768f37f
commit 66ba594070
5 changed files with 35 additions and 50 deletions

View File

@ -107,15 +107,13 @@ public struct Branch: ReferenceType {
var oid: OID var oid: OID
if git_reference_type(pointer).value == GIT_REF_SYMBOLIC.value { if git_reference_type(pointer).value == GIT_REF_SYMBOLIC.value {
let resolved = UnsafeMutablePointer<COpaquePointer>.alloc(1) var resolved: COpaquePointer = nil
let success = git_reference_resolve(resolved, pointer) let success = git_reference_resolve(&resolved, pointer)
if success != GIT_OK.value { if success != GIT_OK.value {
resolved.dealloc(1)
return nil return nil
} }
oid = OID(git_reference_target(resolved.memory).memory) oid = OID(git_reference_target(resolved).memory)
git_reference_free(resolved.memory) git_reference_free(resolved)
resolved.dealloc(1)
} else { } else {
oid = OID(git_reference_target(pointer).memory) oid = OID(git_reference_target(pointer).memory)
} }
@ -184,15 +182,14 @@ public enum TagReference: ReferenceType {
let repo = git_reference_owner(pointer) let repo = git_reference_owner(pointer)
var oid = git_reference_target(pointer).memory var oid = git_reference_target(pointer).memory
let pointer = UnsafeMutablePointer<COpaquePointer>.alloc(1) var pointer: COpaquePointer = nil
let result = git_object_lookup(pointer, repo, &oid, GIT_OBJ_TAG) let result = git_object_lookup(&pointer, repo, &oid, GIT_OBJ_TAG)
if result == GIT_OK.value { if result == GIT_OK.value {
self = .Annotated(name, Tag(pointer.memory)) self = .Annotated(name, Tag(pointer))
} else { } else {
self = .Lightweight(name, OID(oid)) self = .Lightweight(name, OID(oid))
} }
git_object_free(pointer.memory) git_object_free(pointer)
pointer.dealloc(1)
} }
} }

View File

@ -33,16 +33,14 @@ final public class Repository {
/// ///
/// Returns a `Result` with a `Repository` or an error. /// Returns a `Result` with a `Repository` or an error.
class public func atURL(URL: NSURL) -> Result<Repository, NSError> { class public func atURL(URL: NSURL) -> Result<Repository, NSError> {
let pointer = UnsafeMutablePointer<COpaquePointer>.alloc(1) var pointer: COpaquePointer = nil
let result = git_repository_open(pointer, URL.fileSystemRepresentation) let result = git_repository_open(&pointer, URL.fileSystemRepresentation)
if result != GIT_OK.value { if result != GIT_OK.value {
pointer.dealloc(1)
return failure(libGit2Error(result, libGit2PointOfFailure: "git_repository_open")) return failure(libGit2Error(result, libGit2PointOfFailure: "git_repository_open"))
} }
let repository = Repository(pointer.memory) let repository = Repository(pointer)
pointer.dealloc(1)
return success(repository) return success(repository)
} }
@ -83,19 +81,17 @@ final public class Repository {
/// Returns the result of calling `transform` or an error if the object /// Returns the result of calling `transform` or an error if the object
/// cannot be loaded. /// cannot be loaded.
func withLibgit2Object<T>(oid: OID, type: git_otype, transform: COpaquePointer -> Result<T, NSError>) -> Result<T, NSError> { func withLibgit2Object<T>(oid: OID, type: git_otype, transform: COpaquePointer -> Result<T, NSError>) -> Result<T, NSError> {
let pointer = UnsafeMutablePointer<COpaquePointer>.alloc(1) var pointer: COpaquePointer = nil
let repository = self.pointer let repository = self.pointer
var oid = oid.oid var oid = oid.oid
let result = git_object_lookup(pointer, repository, &oid, type) let result = git_object_lookup(&pointer, repository, &oid, type)
if result != GIT_OK.value { if result != GIT_OK.value {
pointer.dealloc(1)
return failure(libGit2Error(result, libGit2PointOfFailure: "git_object_lookup")) return failure(libGit2Error(result, libGit2PointOfFailure: "git_object_lookup"))
} }
let value = transform(pointer.memory) let value = transform(pointer)
git_object_free(pointer.memory) git_object_free(pointer)
pointer.dealloc(1)
return value return value
} }
@ -230,18 +226,16 @@ final public class Repository {
/// ///
/// Returns the remote if it exists, or an error. /// Returns the remote if it exists, or an error.
public func remoteWithName(name: String) -> Result<Remote, NSError> { public func remoteWithName(name: String) -> Result<Remote, NSError> {
let pointer = UnsafeMutablePointer<COpaquePointer>.alloc(1) var pointer: COpaquePointer = nil
let repository = self.pointer let repository = self.pointer
let result = git_remote_lookup(pointer, repository, name) let result = git_remote_lookup(&pointer, repository, name)
if result != GIT_OK.value { if result != GIT_OK.value {
pointer.dealloc(1)
return failure(libGit2Error(result, libGit2PointOfFailure: "git_remote_lookup")) return failure(libGit2Error(result, libGit2PointOfFailure: "git_remote_lookup"))
} }
let value = Remote(pointer.memory) let value = Remote(pointer)
git_remote_free(pointer.memory) git_remote_free(pointer)
pointer.dealloc(1)
return success(value) return success(value)
} }
@ -282,19 +276,16 @@ final public class Repository {
/// reference is a tag, a `TagReference` will be returned. Otherwise, a /// reference is a tag, a `TagReference` will be returned. Otherwise, a
/// `Reference` will be returned. /// `Reference` will be returned.
public func referenceWithName(name: String) -> Result<ReferenceType, NSError> { public func referenceWithName(name: String) -> Result<ReferenceType, NSError> {
let pointer = UnsafeMutablePointer<COpaquePointer>.alloc(1) var pointer: COpaquePointer = nil
let repository = self.pointer let repository = self.pointer
let result = git_reference_lookup(pointer, repository, name) let result = git_reference_lookup(&pointer, repository, name)
if result != GIT_OK.value { if result != GIT_OK.value {
pointer.dealloc(1)
return failure(libGit2Error(result, libGit2PointOfFailure: "git_reference_lookup")) return failure(libGit2Error(result, libGit2PointOfFailure: "git_reference_lookup"))
} }
let value = referenceWithLibGit2Reference(pointer.memory) let value = referenceWithLibGit2Reference(pointer)
git_reference_free(pointer)
git_reference_free(pointer.memory)
pointer.dealloc(1)
return success(value) return success(value)
} }

View File

@ -15,11 +15,10 @@ func from_git_object<T>(repository: Repository, oid: OID, f: COpaquePointer -> T
let repository = repository.pointer let repository = repository.pointer
var oid = oid.oid var oid = oid.oid
let pointer = UnsafeMutablePointer<COpaquePointer>.alloc(1) var pointer: COpaquePointer = nil
git_object_lookup(pointer, repository, &oid, GIT_OBJ_ANY) git_object_lookup(&pointer, repository, &oid, GIT_OBJ_ANY)
let result = f(pointer.memory) let result = f(pointer)
git_object_free(pointer.memory) git_object_free(pointer)
pointer.dealloc(1)
return result return result
} }

View File

@ -14,11 +14,10 @@ import Quick
func from_git_reference<T>(repository: Repository, name: String, f: COpaquePointer -> T) -> T { func from_git_reference<T>(repository: Repository, name: String, f: COpaquePointer -> T) -> T {
let repository = repository.pointer let repository = repository.pointer
let pointer = UnsafeMutablePointer<COpaquePointer>.alloc(1) var pointer: COpaquePointer = nil
git_reference_lookup(pointer, repository, name) git_reference_lookup(&pointer, repository, name)
let result = f(pointer.memory) let result = f(pointer)
git_object_free(pointer.memory) git_object_free(pointer)
pointer.dealloc(1)
return result return result
} }

View File

@ -14,11 +14,10 @@ import Quick
func with_git_remote<T>(repository: Repository, name: String, f: COpaquePointer -> T) -> T { func with_git_remote<T>(repository: Repository, name: String, f: COpaquePointer -> T) -> T {
let repository = repository.pointer let repository = repository.pointer
let pointer = UnsafeMutablePointer<COpaquePointer>.alloc(1) var pointer: COpaquePointer = nil
git_remote_lookup(pointer, repository, name) git_remote_lookup(&pointer, repository, name)
let result = f(pointer.memory) let result = f(pointer)
git_object_free(pointer.memory) git_object_free(pointer)
pointer.dealloc(1)
return result return result
} }