split out alpha pointer decoder

This commit is contained in:
Rick Olson 2014-07-24 14:49:47 -06:00
parent f72a2ebb14
commit 5b8924792a
2 changed files with 39 additions and 17 deletions

@ -8,18 +8,23 @@ import (
)
var (
MediaWarning = []byte("# git-media\n")
alpha = "http://git-media.io/v/1"
MediaWarning = []byte("# git-media\n")
alpha = "http://git-media.io/v/1"
latest = "http://git-media.io/v/2"
oidType = "sha256"
alphaHeaderRE = regexp.MustCompile(`\A# (.*git-media|external)`)
linebreak = []byte("\n")
)
type Pointer struct {
Version string
Oid string
Size int64
OidType string
}
func NewPointer(oid string, size int64) *Pointer {
return &Pointer{alpha, oid, size}
return &Pointer{alpha, oid, size, oidType}
}
func Encode(writer io.Writer, pointer *Pointer) (int, error) {
@ -33,25 +38,27 @@ func Encode(writer io.Writer, pointer *Pointer) (int, error) {
}
func Decode(reader io.Reader) (*Pointer, error) {
buf := make([]byte, 100)
buf := make([]byte, 200)
written, err := reader.Read(buf)
if err != nil {
return nil, err
}
lines := bytes.Split(buf[0:written], []byte("\n"))
matched, err := regexp.Match("# (.*git-media|external)", lines[0])
if err != nil {
return nil, err
}
data := bytes.TrimSpace(buf[0:written])
if len(lines) < 2 {
return nil, errors.New("No sha in meta file")
if alphaHeaderRE.Match(data) {
return decodeAlpha(data)
} else {
return nil, errors.New("No INI decoder yet")
}
if matched {
return &Pointer{alpha, string(lines[1]), 0}, nil
}
return nil, errors.New("Could not decode meta file")
}
func decodeAlpha(data []byte) (*Pointer, error) {
lines := bytes.Split(data, linebreak)
last := len(lines) - 1
if last == 0 {
return nil, errors.New("No sha in pointer file")
}
return &Pointer{alpha, string(lines[last]), 0, oidType}, nil
}

@ -2,6 +2,7 @@ package metafile
import (
"bytes"
"github.com/bmizerany/assert"
"testing"
)
@ -32,6 +33,20 @@ func TestEncode(t *testing.T) {
}
}
func TestIniDecode(t *testing.T) {
buf := bytes.NewBufferString(`[git-media]
version="http://git-media.io/v/2"
oid=sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
size=12345
`)
p, err := Decode(buf)
assert.Equal(t, nil, err)
assert.Equal(t, latest, p.Version)
assert.Equal(t, "4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393", p.Oid)
assert.Equal(t, int64(12345), p.Size)
}
func TestAlphaDecode(t *testing.T) {
buf := bytes.NewBufferString("# git-media\nabc\n")
if pointer, _ := Decode(buf); pointer.Oid != "abc" {