summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Calavera <[email protected]>2014-07-24 21:03:50 -0700
committerDavid Calavera <[email protected]>2014-07-24 21:03:50 -0700
commit94d207e11cf2b7c3f405191c0525cdf67b4b14f7 (patch)
tree6e8ab1ef3f8026549bce6b5bf26ff46240471d0c
parent691d8f23bad4e6ff850fd0504bc7a8ed1cd656e9 (diff)
Add Repository#RevParseExt.
-rw-r--r--revparse.go22
-rw-r--r--revparse_test.go18
2 files changed, 40 insertions, 0 deletions
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")