From b1d50b70ea8c4be9c19fe91768d6653736660c4c Mon Sep 17 00:00:00 2001 From: Vicent Marti Date: Tue, 5 Mar 2013 20:53:04 +0100 Subject: Initial commit --- git.go | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 git.go (limited to 'git.go') diff --git a/git.go b/git.go new file mode 100644 index 0000000..84716e3 --- /dev/null +++ b/git.go @@ -0,0 +1,92 @@ +package git + +/* +#cgo pkg-config: libgit2 +#include +#include +*/ +import "C" +import ( + "unsafe" +) + +const ( + ITEROVER = C.GIT_ITEROVER + EEXISTS = C.GIT_EEXISTS + ENOTFOUND = C.GIT_ENOTFOUND +) + +func init() { + C.git_threads_init() +} + +// Oid +type Oid struct { + bytes [20]byte +} + +func newOidFromC(coid *C.git_oid) *Oid { + oid := new(Oid) + copy(oid.bytes[0:20], C.GoBytes(unsafe.Pointer(coid), 20)) + return oid +} + +func NewOid(b []byte) *Oid { + oid := new(Oid) + copy(oid.bytes[0:20], b[0:20]) + return oid +} + +func (oid *Oid) toC() *C.git_oid { + return (*C.git_oid)(unsafe.Pointer(&oid.bytes)) +} + +func NewOidFromString(s string) (*Oid, error) { + o := new(Oid) + cs := C.CString(s) + defer C.free(unsafe.Pointer(cs)) + + if C.git_oid_fromstr(o.toC(), cs) < 0 { + return nil, LastError() + } + + return o, nil +} + +func (oid *Oid) String() string { + buf := make([]byte, 40) + C.git_oid_fmt((*C.char)(unsafe.Pointer(&buf[0])), oid.toC()) + return string(buf) +} + +func (oid *Oid) Bytes() []byte { + return oid.bytes[0:] +} + +type GitError struct { + Message string + Code int +} + +func (e GitError) Error() string{ + return e.Message +} + +func LastError() error { + err := C.giterr_last() + return &GitError{C.GoString(err.message), int(err.klass)} +} + +func cbool(b bool) C.int { + if (b) { + return C.int(1) + } + return C.int(0) +} + +func ucbool(b bool) C.uint { + if (b) { + return C.uint(1) + } + return C.uint(0) +} -- cgit v1.2.3