Merge pull request #376 from ankurmittal/short-hash

Add support for getting short object Id
diff --git a/object.go b/object.go
index 1981980..b365a3f 100644
--- a/object.go
+++ b/object.go
@@ -49,6 +49,20 @@
 	return newOidFromC(C.git_object_id(o.ptr))
 }
 
+func (o *Object) ShortId() (string, error) {
+	resultBuf := C.git_buf{}
+
+	runtime.LockOSThread()
+	defer runtime.UnlockOSThread()
+
+	ecode := C.git_object_short_id(&resultBuf, o.ptr)
+	if ecode < 0 {
+		return "", MakeGitError(ecode)
+	}
+	defer C.git_buf_free(&resultBuf)
+	return C.GoString(resultBuf.ptr), nil
+}
+
 func (o *Object) Type() ObjectType {
 	return ObjectType(C.git_object_type(o.ptr))
 }
diff --git a/object_test.go b/object_test.go
index cb262de..1b188a8 100644
--- a/object_test.go
+++ b/object_test.go
@@ -1,6 +1,7 @@
 package git
 
 import (
+	"strings"
 	"testing"
 )
 
@@ -105,6 +106,32 @@
 	checkOwner(t, repo, tree.Object)
 }
 
+func checkShortId(t *testing.T, Id, shortId string) {
+	if len(shortId) < 7 || len(shortId) >= len(Id) {
+		t.Fatal("bad shortId lenght %s", len(shortId))
+	}
+
+	if !strings.HasPrefix(Id, shortId) {
+		t.Fatalf("bad shortId, should be prefix of %s, but is %s\n", Id, shortId)
+	}
+}
+
+func TestObjectShortId(t *testing.T) {
+	t.Parallel()
+	repo := createTestRepo(t)
+	defer cleanupTestRepo(t, repo)
+
+	commitId, _ := seedTestRepo(t, repo)
+
+	commit, err := repo.LookupCommit(commitId)
+	checkFatal(t, err)
+
+	shortId, err := commit.ShortId()
+	checkFatal(t, err)
+
+	checkShortId(t, commitId.String(), shortId)
+}
+
 func TestObjectPeel(t *testing.T) {
 	t.Parallel()
 	repo := createTestRepo(t)