Skip to content

Commit 773ac24

Browse files
committed
Expose git_odb_read_header as Odb.ReadHeader.
This function is much faster for discovering sizes for a given OID.
1 parent 2e17c3d commit 773ac24

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

odb.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,21 @@ func (v *Odb) AddBackend(backend *OdbBackend, priority int) (err error) {
5454
return nil
5555
}
5656

57+
func (v *Odb) ReadHeader(oid *Oid) (uint64, ObjectType, error) {
58+
runtime.LockOSThread()
59+
defer runtime.UnlockOSThread()
60+
61+
var sz C.size_t
62+
var cotype C.git_otype
63+
64+
ret := C.git_odb_read_header(&sz, &cotype, v.ptr, oid.toC())
65+
if ret < 0 {
66+
return 0, C.GIT_OBJ_BAD, MakeGitError(ret)
67+
}
68+
69+
return uint64(sz), ObjectType(cotype), nil
70+
}
71+
5772
func (v *Odb) Exists(oid *Oid) bool {
5873
ret := C.git_odb_exists(v.ptr, oid.toC())
5974
return ret != 0

odb_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,34 @@ import (
66
"testing"
77
)
88

9+
func TestOdbReadHeader(t *testing.T) {
10+
repo := createTestRepo(t)
11+
defer cleanupTestRepo(t, repo)
12+
13+
_, _ = seedTestRepo(t, repo)
14+
odb, err := repo.Odb()
15+
if err != nil {
16+
t.Fatalf("Odb: %v", err)
17+
}
18+
data := []byte("hello")
19+
id, err := odb.Write(data, ObjectBlob)
20+
if err != nil {
21+
t.Fatalf("odb.Write: %v", err)
22+
}
23+
24+
sz, typ, err := odb.ReadHeader(id)
25+
if err != nil {
26+
t.Fatalf("ReadHeader: %v", err)
27+
}
28+
29+
if sz != uint64(len(data)) {
30+
t.Errorf("ReadHeader got size %d, want %d", sz, len(data))
31+
}
32+
if typ != ObjectBlob {
33+
t.Errorf("ReadHeader got object type %s", typ)
34+
}
35+
}
36+
937
func TestOdbStream(t *testing.T) {
1038
repo := createTestRepo(t)
1139
defer cleanupTestRepo(t, repo)

0 commit comments

Comments
 (0)