diff --git a/odb.go b/odb.go index c7c8bd9..fc8fbd4 100644 --- a/odb.go +++ b/odb.go @@ -5,12 +5,13 @@ package git #include extern int _go_git_odb_foreach(git_odb *db, void *payload); +extern void _go_git_odb_backend_free(git_odb_backend *backend); */ import "C" import ( - "unsafe" "reflect" "runtime" + "unsafe" ) type Odb struct { @@ -18,33 +19,33 @@ type Odb struct { } type OdbBackend struct { - ptr *C.git_odb_backend + ptr *C.git_odb_backend } func NewOdb() (odb *Odb, err error) { - odb = new(Odb) + odb = new(Odb) - ret := C.git_odb_new(&odb.ptr) - if ret < 0 { - return nil, LastError() - } + ret := C.git_odb_new(&odb.ptr) + if ret < 0 { + return nil, LastError() + } - runtime.SetFinalizer(odb, (*Odb).Free) - return + runtime.SetFinalizer(odb, (*Odb).Free) + return } func NewOdbBackendFromC(ptr *C.git_odb_backend) (backend *OdbBackend) { - backend = &OdbBackend{ptr} - return + backend = &OdbBackend{ptr} + return } - func (v *Odb) AddBackend(backend *OdbBackend, priority int) (err error) { - ret := C.git_odb_add_backend(v.ptr, backend.ptr, C.int(priority)) - if ret < 0 { - err = LastError() - } - return nil + ret := C.git_odb_add_backend(v.ptr, backend.ptr, C.int(priority)) + if ret < 0 { + backend.Free() + err = LastError() + } + return nil } func (v *Odb) Exists(oid *Oid) bool { @@ -93,9 +94,9 @@ func odbForEachCb(id *C.git_oid, payload unsafe.Pointer) int { select { case ch <- oid: case <-ch: - return -1 + return -1 } - return 0; + return 0 } func (v *Odb) forEachWrap(ch chan *Oid) { @@ -136,6 +137,10 @@ func (v *Odb) NewWriteStream(size int, otype ObjectType) (*OdbWriteStream, error return stream, nil } +func (v *OdbBackend) Free() { + C._go_git_odb_backend_free(v.ptr) +} + type OdbObject struct { ptr *C.git_odb_object } @@ -199,7 +204,7 @@ func (stream *OdbReadStream) Free() { type OdbWriteStream struct { ptr *C.git_odb_stream - Id Oid + Id Oid } // Write writes to the stream diff --git a/wrapper.c b/wrapper.c index 2af3974..6f69a7a 100644 --- a/wrapper.c +++ b/wrapper.c @@ -1,5 +1,6 @@ #include "_cgo_export.h" #include "git2.h" +#include "git2/sys/odb_backend.h" #include "git2/submodule.h" #include "git2/pack.h" @@ -24,4 +25,12 @@ int _go_git_odb_foreach(git_odb *db, void *payload) { return git_odb_foreach(db, (git_odb_foreach_cb)&odbForEachCb, payload); } + +void _go_git_odb_backend_free(git_odb_backend *backend) +{ + if (backend->free) + backend->free(backend); + + return; +} /* EOF */