summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Calavera <[email protected]>2014-07-24 15:37:59 -0700
committerDavid Calavera <[email protected]>2014-07-24 15:37:59 -0700
commit3003e5e190bb566a978062a63247d250ec5c1c28 (patch)
treee58173d48f3946a984e1e42fdfedd4183f830e4a
parent213a1bc8765c93d4718cc3cdf5b08bbc969442c6 (diff)
Add Repository#RevParse.
-rw-r--r--revparse.go54
-rw-r--r--revparse_test.go1
2 files changed, 55 insertions, 0 deletions
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 <git2.h>
+#include <git2/errors.h>
+
+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