more strict key parsing

This commit is contained in:
Rick Olson 2014-08-14 14:30:33 -06:00
parent 825cf6d4c5
commit e4b0a211b1
2 changed files with 34 additions and 7 deletions

@ -22,6 +22,8 @@ var (
oid sha256:%s
size %d
`
matcher = []byte("git-media")
pointerKeys = []string{"version", "oid", "size"}
)
type Pointer struct {
@ -116,14 +118,30 @@ func decodeKVData(data []byte) (map[string]string, error) {
scanner := bufio.NewScanner(bytes.NewBuffer(data))
line := 0
numKeys := len(pointerKeys)
for scanner.Scan() {
line += 1
parts := strings.SplitN(scanner.Text(), " ", 2)
if len(parts) < 2 {
return m, fmt.Errorf("Error reading line %d", line)
text := scanner.Text()
if len(text) == 0 {
continue
}
m[parts[0]] = parts[1]
parts := strings.SplitN(text, " ", 2)
key := parts[0]
if numKeys <= line {
return m, fmt.Errorf("Extra line: %s", text)
}
if expected := pointerKeys[line]; key != expected {
return m, fmt.Errorf("Expected key %s, got %s", expected, key)
}
line += 1
if len(parts) < 2 {
return m, fmt.Errorf("Error reading line %d: %s", line, text)
}
m[key] = parts[1]
}
return m, scanner.Err()
@ -138,5 +156,3 @@ func decodeAlpha(data []byte) (*Pointer, error) {
return &Pointer{alpha, string(lines[last]), 0, oidType}, nil
}
var matcher = []byte("git-media")

@ -103,6 +103,17 @@ size=fif`,
`version=http://wat.io/v/2
oid=sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
size=fif`,
// extra key
`version http://git-media.io/v/2
oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
size 12345
wat wat`,
// keys out of order
`version http://git-media.io/v/2
size 12345
oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393`,
}
for _, ex := range examples {