From 3003e5e190bb566a978062a63247d250ec5c1c28 Mon Sep 17 00:00:00 2001 From: David Calavera Date: Thu, 24 Jul 2014 15:37:59 -0700 Subject: [PATCH] Add Repository#RevParse. --- revparse.go | 54 ++++++++++++++++++++++++++++++++++++++++++++++++ revparse_test.go | 1 + 2 files changed, 55 insertions(+) create mode 100644 revparse.go create mode 100644 revparse_test.go diff --git a/revparse.go b/revparse.go new file mode 100644 index 0000000..f78867f --- /dev/null +++ b/revparse.go @@ -0,0 +1,54 @@ +package git + +/* +#include +#include + +extern void _go_git_revspec_free(git_revspec *revspec); +*/ +import "C" +import ( + "runtime" + "unsafe" +) + +type RevSpec struct { + ptr *C.git_revspec + From Object + To Object + repo *Repository +} + +func newRevSpecFrom(ptr *C.git_revspec, repo *Repository) *RevSpec { + rev := &RevSpec{ + ptr: ptr, + From: allocObject(ptr.from, repo), + To: allocObject(ptr.to, repo), + repo: repo, + } + runtime.SetFinalizer(rev, (*RevSpec).Free) + + return rev +} + +func (r *RevSpec) Free() { + runtime.SetFinalizer(r, nil) + r.From.Free() + r.To.Free() +} + +func (r *Repository) RevParse(spec string) (*RevSpec, error) { + cspec := C.CString(spec) + defer C.free(unsafe.Pointer(cspec)) + var ptr *C.git_revspec + + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + ecode := C.git_revparse(ptr, r.ptr, cspec) + if ecode < 0 { + return nil, MakeGitError(ecode) + } + + return newRevSpecFrom(ptr, r), nil +} diff --git a/revparse_test.go b/revparse_test.go new file mode 100644 index 0000000..cd99cdb --- /dev/null +++ b/revparse_test.go @@ -0,0 +1 @@ +package git