git/odb: make Tree and WriteTree accessible from ObjectDatabase
This commit is contained in:
parent
15d1ba7d1a
commit
8cfdd20313
@ -32,6 +32,16 @@ func (o *ObjectDatabase) Blob(sha []byte) (*Blob, error) {
|
||||
return &b, nil
|
||||
}
|
||||
|
||||
// Tree returns a *Tree as identified by the SHA given, or an error if one was
|
||||
// encountered.
|
||||
func (o *ObjectDatabase) Tree(sha []byte) (*Tree, error) {
|
||||
var t Tree
|
||||
if err := o.decode(sha, &t); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &t, nil
|
||||
}
|
||||
|
||||
// WriteBlob stores a *Blob on disk and returns the SHA it is uniquely
|
||||
// identified by, or an error if one was encountered.
|
||||
func (o *ObjectDatabase) WriteBlob(b *Blob) ([]byte, error) {
|
||||
@ -48,6 +58,16 @@ func (o *ObjectDatabase) WriteBlob(b *Blob) ([]byte, error) {
|
||||
return sha, nil
|
||||
}
|
||||
|
||||
// WriteTree stores a *Tree on disk and returns the SHA it is uniquely
|
||||
// identified by, or an error if one was encountered.
|
||||
func (o *ObjectDatabase) WriteTree(t *Tree) ([]byte, error) {
|
||||
sha, _, err := o.encode(t)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return sha, nil
|
||||
}
|
||||
|
||||
// encode encodes and saves an object to the storage backend and uses an
|
||||
// in-memory buffer to calculate the object's encoded body.
|
||||
func (d *ObjectDatabase) encode(object Object) (sha []byte, n int, err error) {
|
||||
|
@ -11,6 +11,7 @@ import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestDecodeBlob(t *testing.T) {
|
||||
@ -38,6 +39,39 @@ func TestDecodeBlob(t *testing.T) {
|
||||
assert.Equal(t, contents, string(got))
|
||||
}
|
||||
|
||||
func TestDecodeTree(t *testing.T) {
|
||||
sha := "fcb545d5746547a597811b7441ed8eba307be1ff"
|
||||
hexSha, err := hex.DecodeString(sha)
|
||||
require.Nil(t, err)
|
||||
|
||||
blobSha := "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"
|
||||
hexBlobSha, err := hex.DecodeString(blobSha)
|
||||
require.Nil(t, err)
|
||||
|
||||
var buf bytes.Buffer
|
||||
|
||||
zw := zlib.NewWriter(&buf)
|
||||
fmt.Fprintf(zw, "tree 37\x00")
|
||||
fmt.Fprintf(zw, "100644 hello.txt\x00")
|
||||
zw.Write(hexBlobSha)
|
||||
zw.Close()
|
||||
|
||||
odb := &ObjectDatabase{s: NewMemoryStorer(map[string]io.ReadWriter{
|
||||
sha: &buf,
|
||||
})}
|
||||
|
||||
tree, err := odb.Tree(hexSha)
|
||||
|
||||
assert.Nil(t, err)
|
||||
require.Equal(t, 1, len(tree.Entries))
|
||||
assert.Equal(t, &TreeEntry{
|
||||
Name: "hello.txt",
|
||||
Type: BlobObjectType,
|
||||
Oid: hexBlobSha,
|
||||
Filemode: 0100644,
|
||||
}, tree.Entries[0])
|
||||
}
|
||||
|
||||
func TestWriteBlob(t *testing.T) {
|
||||
fs := NewMemoryStorer(make(map[string]io.ReadWriter))
|
||||
odb := &ObjectDatabase{s: fs}
|
||||
@ -53,3 +87,27 @@ func TestWriteBlob(t *testing.T) {
|
||||
assert.Equal(t, expected, hex.EncodeToString(sha))
|
||||
assert.NotNil(t, fs.fs[hex.EncodeToString(sha)])
|
||||
}
|
||||
|
||||
func TestWriteTree(t *testing.T) {
|
||||
fs := NewMemoryStorer(make(map[string]io.ReadWriter))
|
||||
odb := &ObjectDatabase{s: fs}
|
||||
|
||||
blobSha := "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"
|
||||
hexBlobSha, err := hex.DecodeString(blobSha)
|
||||
require.Nil(t, err)
|
||||
|
||||
sha, err := odb.WriteTree(&Tree{Entries: []*TreeEntry{
|
||||
{
|
||||
Name: "hello.txt",
|
||||
Type: BlobObjectType,
|
||||
Oid: hexBlobSha,
|
||||
Filemode: 0100644,
|
||||
},
|
||||
}})
|
||||
|
||||
expected := "fcb545d5746547a597811b7441ed8eba307be1ff"
|
||||
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, expected, hex.EncodeToString(sha))
|
||||
assert.NotNil(t, fs.fs[hex.EncodeToString(sha)])
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user