Skip to content

Commit 7839638

Browse files
committed
gitbase: implement encode and decode for commitFileIndexKey
Signed-off-by: Miguel Molina <[email protected]>
1 parent a8b9c07 commit 7839638

File tree

3 files changed

+99
-4
lines changed

3 files changed

+99
-4
lines changed

commit_files.go

Lines changed: 67 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package gitbase
22

33
import (
4+
"bytes"
45
"io"
56

67
"github.com/sirupsen/logrus"
@@ -291,6 +292,71 @@ type commitFileIndexKey struct {
291292
Commit string
292293
}
293294

295+
func (k *commitFileIndexKey) encode() ([]byte, error) {
296+
var buf bytes.Buffer
297+
writeString(&buf, k.Repository)
298+
if err := writeHash(&buf, k.Packfile); err != nil {
299+
return nil, err
300+
}
301+
302+
if err := writeHash(&buf, k.Hash); err != nil {
303+
return nil, err
304+
}
305+
306+
writeInt64(&buf, k.Offset)
307+
writeString(&buf, k.Name)
308+
writeInt64(&buf, k.Mode)
309+
310+
if err := writeHash(&buf, k.Tree); err != nil {
311+
return nil, err
312+
}
313+
314+
if err := writeHash(&buf, k.Commit); err != nil {
315+
return nil, err
316+
}
317+
318+
return buf.Bytes(), nil
319+
}
320+
321+
func (k *commitFileIndexKey) decode(data []byte) error {
322+
var buf = bytes.NewBuffer(data)
323+
var err error
324+
325+
if k.Repository, err = readString(buf); err != nil {
326+
return err
327+
}
328+
329+
if k.Packfile, err = readHash(buf); err != nil {
330+
return err
331+
}
332+
333+
if k.Hash, err = readHash(buf); err != nil {
334+
return err
335+
}
336+
337+
if k.Offset, err = readInt64(buf); err != nil {
338+
return err
339+
}
340+
341+
if k.Name, err = readString(buf); err != nil {
342+
return err
343+
}
344+
345+
if k.Mode, err = readInt64(buf); err != nil {
346+
return err
347+
}
348+
349+
if k.Tree, err = readHash(buf); err != nil {
350+
return err
351+
}
352+
353+
if k.Commit, err = readHash(buf); err != nil {
354+
return err
355+
}
356+
357+
return nil
358+
}
359+
294360
type commitFilesKeyValueIter struct {
295361
pool *RepositoryPool
296362
repo *Repository
@@ -369,7 +435,7 @@ func (i *commitFilesKeyValueIter) Next() ([]interface{}, []byte, error) {
369435
return nil, nil, err
370436
}
371437

372-
key, err := encodeIndexKey(commitFileIndexKey{
438+
key, err := encodeIndexKey(&commitFileIndexKey{
373439
Repository: i.repo.ID,
374440
Packfile: packfile.String(),
375441
Hash: f.Blob.Hash.String(),

commit_files_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"testing"
66

77
"github.com/stretchr/testify/require"
8+
"gopkg.in/src-d/go-git.v4/plumbing"
89
"gopkg.in/src-d/go-mysql-server.v0/sql"
910
"gopkg.in/src-d/go-mysql-server.v0/sql/expression"
1011
)
@@ -78,3 +79,26 @@ func TestCommitFilesIndex(t *testing.T) {
7879
)},
7980
)
8081
}
82+
83+
func TestEncodeCommitFileIndexKey(t *testing.T) {
84+
require := require.New(t)
85+
86+
k := commitFileIndexKey{
87+
Repository: "repo1",
88+
Packfile: plumbing.ZeroHash.String(),
89+
Offset: 1234,
90+
Hash: plumbing.ZeroHash.String(),
91+
Name: "foo/bar.md",
92+
Mode: 5,
93+
Tree: plumbing.ZeroHash.String(),
94+
Commit: plumbing.ZeroHash.String(),
95+
}
96+
97+
data, err := k.encode()
98+
require.NoError(err)
99+
100+
var k2 commitFileIndexKey
101+
require.NoError(k2.decode(data))
102+
103+
require.Equal(k, k2)
104+
}

index.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package gitbase
22

33
import (
44
"bytes"
5+
"crypto/sha1"
56
"encoding/binary"
67
"fmt"
78
"io"
@@ -218,6 +219,7 @@ func writeInt64(buf *bytes.Buffer, n int64) {
218219
if n < 0 {
219220
ux = ^ux
220221
}
222+
221223
var bs = make([]byte, 8)
222224
binary.LittleEndian.PutUint64(bs, ux)
223225
buf.Write(bs)
@@ -229,19 +231,22 @@ func writeString(buf *bytes.Buffer, s string) {
229231
buf.Write(bs)
230232
}
231233

232-
var errInvalidHashSize = errors.NewKind("invalid hash size: %d, expecting 40 bytes")
234+
var (
235+
hashSize = 2 * sha1.Size
236+
errInvalidHashSize = errors.NewKind("invalid hash size: %d, expecting 40 bytes")
237+
)
233238

234239
func writeHash(buf *bytes.Buffer, s string) error {
235240
bs := []byte(s)
236-
if len(bs) != 40 {
241+
if len(bs) != hashSize {
237242
return errInvalidHashSize.New(len(bs))
238243
}
239244
buf.Write(bs)
240245
return nil
241246
}
242247

243248
func readHash(buf *bytes.Buffer) (string, error) {
244-
bs := make([]byte, 40)
249+
bs := make([]byte, hashSize)
245250
n, err := io.ReadFull(buf, bs)
246251
if err != nil {
247252
return "", fmt.Errorf("can't read hash, only read %d: %s", n, err)

0 commit comments

Comments
 (0)