From 94d207e11cf2b7c3f405191c0525cdf67b4b14f7 Mon Sep 17 00:00:00 2001 From: David Calavera Date: Thu, 24 Jul 2014 21:03:50 -0700 Subject: [PATCH] Add Repository#RevParseExt. --- revparse.go | 22 ++++++++++++++++++++++ revparse_test.go | 18 ++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/revparse.go b/revparse.go index 9cd494f..05a75a0 100644 --- a/revparse.go +++ b/revparse.go @@ -75,3 +75,25 @@ func (r *Repository) RevParseSingle(spec string) (Object, error) { return allocObject(obj, r), 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 +} diff --git a/revparse_test.go b/revparse_test.go index df553a0..fc267a3 100644 --- a/revparse_test.go +++ b/revparse_test.go @@ -29,6 +29,24 @@ func TestRevParseSingle(t *testing.T) { checkObject(t, obj, commitId) } +func TestRevParseExt(t *testing.T) { + repo := createTestRepo(t) + defer os.RemoveAll(repo.Workdir()) + + _, treeId := seedTestRepo(t, repo) + + ref, err := repo.CreateReference("refs/heads/master", treeId, true, nil, "") + checkFatal(t, err) + + obj, ref, err := repo.RevParseExt("master") + checkFatal(t, err) + + checkObject(t, obj, treeId) + if ref == nil { + t.Fatalf("bad reference") + } +} + func checkObject(t *testing.T, obj Object, id *Oid) { if obj == nil { t.Fatalf("bad object")