diff options
| author | David Calavera <[email protected]> | 2014-07-24 15:37:59 -0700 |
|---|---|---|
| committer | David Calavera <[email protected]> | 2014-07-24 15:37:59 -0700 |
| commit | 3003e5e190bb566a978062a63247d250ec5c1c28 (patch) | |
| tree | e58173d48f3946a984e1e42fdfedd4183f830e4a | |
| parent | 213a1bc8765c93d4718cc3cdf5b08bbc969442c6 (diff) | |
Add Repository#RevParse.
| -rw-r--r-- | revparse.go | 54 | ||||
| -rw-r--r-- | revparse_test.go | 1 |
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 |
