From b1d50b70ea8c4be9c19fe91768d6653736660c4c Mon Sep 17 00:00:00 2001 From: Vicent Marti Date: Tue, 5 Mar 2013 20:53:04 +0100 Subject: Initial commit --- odb.go | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 odb.go (limited to 'odb.go') diff --git a/odb.go b/odb.go new file mode 100644 index 0000000..5688080 --- /dev/null +++ b/odb.go @@ -0,0 +1,71 @@ +package git + +/* +#cgo pkg-config: libgit2 +#include +#include +*/ +import "C" +import ( + "unsafe" + "reflect" + "runtime" +) + +var ( + OBJ_ANY = C.GIT_OBJ_ANY + OBJ_BAD = C.GIT_OBJ_BAD + OBJ_COMMIT = C.GIT_OBJ_COMMIT + OBJ_TREE = C.GIT_OBJ_TREE + OBJ_BLOB = C.GIT_OBJ_BLOB + OBJ_TAG = C.GIT_OBJ_TAG +) + +type Odb struct { + ptr *C.git_odb +} + +func (v *Odb) Exists(oid *Oid) bool { + ret := C.git_odb_exists(v.ptr, oid.toC()) + return ret != 0 +} + +func (v *Odb) Write(data []byte, otype int) (oid *Oid, err error) { + oid = new(Oid) + hdr := (*reflect.SliceHeader)(unsafe.Pointer(&data)) + ret := C.git_odb_write(oid.toC(), v.ptr, unsafe.Pointer(hdr.Data), C.size_t(hdr.Len), C.git_otype(otype)) + + if ret < 0 { + err = LastError() + } + + return +} + +func (v *Odb) Read(oid *Oid) (obj *OdbObject, err error) { + obj = new(OdbObject) + ret := C.git_odb_read(&obj.ptr, v.ptr, oid.toC()) + if ret < 0 { + return nil, LastError() + } + + runtime.SetFinalizer(obj, freeOdbObject) + return +} + +type OdbObject struct { + ptr *C.git_odb_object +} + +func freeOdbObject(obj *OdbObject) { + C.git_odb_object_free(obj.ptr) +} + +func (v *OdbObject) Type() int { + return int(C.git_odb_object_type(v.ptr)) +} + +func (v *OdbObject) Size() int64 { + return int64(C.git_odb_object_size(v.ptr)) +} + -- cgit v1.2.3