115 lines
2.1 KiB
Go
115 lines
2.1 KiB
Go
package git
|
|
|
|
/*
|
|
#include <git2.h>
|
|
#include <git2/errors.h>
|
|
|
|
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
|
|
}
|