summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Martín Nieto <[email protected]>2019-01-03 16:22:15 +0100
committerGitHub <[email protected]>2019-01-03 16:22:15 +0100
commitfc1230ba16d8f2af3c5e74c4c5b84970f33f1b19 (patch)
tree1f37e8d052327ae0b1a78689899e3c59b4c015f2
parente319b9427fec099fcc8986d49a61f66ae1133e0f (diff)
parentbdca40d27558337f2aa84856b0dd8c6b1b6bb5c8 (diff)
Merge pull request #447 from walkenzoy/master
git2go: small fixes to odb module
-rw-r--r--odb.go26
-rw-r--r--odb_test.go31
2 files changed, 42 insertions, 15 deletions
diff --git a/odb.go b/odb.go
index fd27363..7ae108a 100644
--- a/odb.go
+++ b/odb.go
@@ -81,15 +81,19 @@ func (v *Odb) Exists(oid *Oid) bool {
func (v *Odb) Write(data []byte, otype ObjectType) (oid *Oid, err error) {
oid = new(Oid)
- var cptr unsafe.Pointer
- if len(data) > 0 {
- cptr = unsafe.Pointer(&data[0])
- }
runtime.LockOSThread()
defer runtime.UnlockOSThread()
- ret := C.git_odb_write(oid.toC(), v.ptr, cptr, C.size_t(len(data)), C.git_otype(otype))
+ var size C.size_t
+ if len(data) > 0 {
+ size = C.size_t(len(data))
+ } else {
+ data = []byte{0}
+ size = C.size_t(0)
+ }
+
+ ret := C.git_odb_write(oid.toC(), v.ptr, unsafe.Pointer(&data[0]), size, C.git_otype(otype))
runtime.KeepAlive(v)
if ret < 0 {
return nil, MakeGitError(ret)
@@ -165,13 +169,19 @@ func (v *Odb) ForEach(callback OdbForEachCallback) error {
// Hash determines the object-ID (sha1) of a data buffer.
func (v *Odb) Hash(data []byte, otype ObjectType) (oid *Oid, err error) {
oid = new(Oid)
- header := (*reflect.SliceHeader)(unsafe.Pointer(&data))
- ptr := unsafe.Pointer(header.Data)
runtime.LockOSThread()
defer runtime.UnlockOSThread()
- ret := C.git_odb_hash(oid.toC(), ptr, C.size_t(header.Len), C.git_otype(otype))
+ var size C.size_t
+ if len(data) > 0 {
+ size = C.size_t(len(data))
+ } else {
+ data = []byte{0}
+ size = C.size_t(0)
+ }
+
+ ret := C.git_odb_hash(oid.toC(), unsafe.Pointer(&data[0]), size, C.git_otype(otype))
runtime.KeepAlive(data)
if ret < 0 {
return nil, MakeGitError(ret)
diff --git a/odb_test.go b/odb_test.go
index 090bdf6..46acdba 100644
--- a/odb_test.go
+++ b/odb_test.go
@@ -1,13 +1,14 @@
package git
import (
+ "bytes"
"errors"
"io"
"io/ioutil"
"testing"
)
-func TestOdbReadHeader(t *testing.T) {
+func TestOdbRead(t *testing.T) {
t.Parallel()
repo := createTestRepo(t)
defer cleanupTestRepo(t, repo)
@@ -34,6 +35,20 @@ func TestOdbReadHeader(t *testing.T) {
if typ != ObjectBlob {
t.Errorf("ReadHeader got object type %s", typ)
}
+
+ obj, err := odb.Read(id)
+ if err != nil {
+ t.Fatalf("Read: %v", err)
+ }
+ if !bytes.Equal(obj.Data(), data) {
+ t.Errorf("Read got wrong data")
+ }
+ if sz := obj.Len(); sz != uint64(len(data)) {
+ t.Errorf("Read got size %d, want %d", sz, len(data))
+ }
+ if typ := obj.Type(); typ != ObjectBlob {
+ t.Errorf("Read got object type %s", typ)
+ }
}
func TestOdbStream(t *testing.T) {
@@ -90,14 +105,16 @@ committer John Doe <[email protected]> 1390682018 +0000
Initial commit.`
- oid, error := odb.Hash([]byte(str), ObjectCommit)
- checkFatal(t, error)
+ for _, data := range [][]byte{[]byte(str), doublePointerBytes()} {
+ oid, error := odb.Hash(data, ObjectCommit)
+ checkFatal(t, error)
- coid, error := odb.Write([]byte(str), ObjectCommit)
- checkFatal(t, error)
+ coid, error := odb.Write(data, ObjectCommit)
+ checkFatal(t, error)
- if oid.Cmp(coid) != 0 {
- t.Fatal("Hash and write Oids are different")
+ if oid.Cmp(coid) != 0 {
+ t.Fatal("Hash and write Oids are different")
+ }
}
}