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 { if coid == nil { return nil } 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) }