package git /* #include extern void _go_git_revspec_free(git_revspec *revspec); */ import "C" import ( "runtime" "unsafe" ) type RevparseFlag int const ( RevparseSingle RevparseFlag = C.GIT_REVPARSE_SINGLE RevparseRange RevparseFlag = C.GIT_REVPARSE_RANGE RevparseMergeBase RevparseFlag = C.GIT_REVPARSE_MERGE_BASE ) type Revspec struct { to *Object from *Object flags RevparseFlag } func (rs *Revspec) To() *Object { return rs.to } func (rs *Revspec) From() *Object { return rs.from } func (rs *Revspec) Flags() RevparseFlag { return rs.flags } func newRevspecFromC(ptr *C.git_revspec, repo *Repository) *Revspec { var to *Object var from *Object if ptr.to != nil { to = allocObject(ptr.to, repo) } if ptr.from != nil { from = allocObject(ptr.from, repo) } return &Revspec{ to: to, from: from, flags: RevparseFlag(ptr.flags), } } func (r *Repository) Revparse(spec string) (*Revspec, error) { cspec := C.CString(spec) defer C.free(unsafe.Pointer(cspec)) var crevspec C.git_revspec runtime.LockOSThread() defer runtime.UnlockOSThread() ecode := C.git_revparse(&crevspec, r.ptr, cspec) if ecode != 0 { return nil, MakeGitError(ecode) } return newRevspecFromC(&crevspec, r), nil } func (v *Repository) RevparseSingle(spec string) (*Object, error) { cspec := C.CString(spec) defer C.free(unsafe.Pointer(cspec)) var ptr *C.git_object runtime.LockOSThread() defer runtime.UnlockOSThread() ecode := C.git_revparse_single(&ptr, v.ptr, cspec) if ecode < 0 { return nil, MakeGitError(ecode) } return allocObject(ptr, v), nil } func (r *Repository) RevparseExt(spec string) (*Object, *Reference, error) { cspec := C.CString(spec) defer C.free(unsafe.Pointer(cspec)) var obj *C.git_object var ref *C.git_reference runtime.LockOSThread() defer runtime.UnlockOSThread() ecode := C.git_revparse_ext(&obj, &ref, r.ptr, cspec) if ecode != 0 { return nil, nil, MakeGitError(ecode) } if ref == nil { return allocObject(obj, r), nil, nil } return allocObject(obj, r), newReferenceFromC(ref, r), nil }