Refactor checksum parsing out of package parsing code. #71

This commit is contained in:
Andrey Smirnov
2015-03-13 21:23:22 +03:00
parent 69eff97b34
commit 903e999cdc
2 changed files with 75 additions and 52 deletions
+10 -52
View File
@@ -114,62 +114,20 @@ func NewSourcePackageFromControlFile(input Stanza) (*Package, error) {
delete(input, "Version") delete(input, "Version")
delete(input, "Architecture") delete(input, "Architecture")
var err error
files := make(PackageFiles, 0, 3) files := make(PackageFiles, 0, 3)
files, err = files.ParseSumFields(input)
parseSums := func(field string, setter func(sum *utils.ChecksumInfo, data string)) error {
for _, line := range strings.Split(input[field], "\n") {
line = strings.TrimSpace(line)
if line == "" {
continue
}
parts := strings.Fields(line)
if len(parts) < 3 {
return fmt.Errorf("unparseable hash sum line: %#v", line)
}
size, err := strconv.ParseInt(parts[1], 10, 64)
if err != nil {
return fmt.Errorf("unable to parse size: %s", err)
}
filename := filepath.Base(parts[len(parts)-1])
found := false
pos := 0
for i, file := range files {
if file.Filename == filename {
found = true
pos = i
break
}
}
if !found {
files = append(files, PackageFile{Filename: filename, downloadPath: input["Directory"]})
pos = len(files) - 1
}
files[pos].Checksums.Size = size
setter(&files[pos].Checksums, parts[0])
}
delete(input, field)
return nil
}
err := parseSums("Files", func(sum *utils.ChecksumInfo, data string) { sum.MD5 = data })
if err != nil { if err != nil {
return nil, err return nil, err
} }
err = parseSums("Checksums-Sha1", func(sum *utils.ChecksumInfo, data string) { sum.SHA1 = data })
if err != nil { delete(input, "Files")
return nil, err delete(input, "Checksums-Sha1")
} delete(input, "Checksums-Sha256")
err = parseSums("Checksums-Sha256", func(sum *utils.ChecksumInfo, data string) { sum.SHA256 = data })
if err != nil { for i := range files {
return nil, err files[i].downloadPath = input["Directory"]
} }
result.UpdateFiles(files) result.UpdateFiles(files)
+65
View File
@@ -2,12 +2,15 @@ package deb
import ( import (
"encoding/binary" "encoding/binary"
"fmt"
"github.com/smira/aptly/aptly" "github.com/smira/aptly/aptly"
"github.com/smira/aptly/utils" "github.com/smira/aptly/utils"
"hash/fnv" "hash/fnv"
"os" "os"
"path/filepath" "path/filepath"
"sort" "sort"
"strconv"
"strings"
) )
// PackageFile is a single file entry in package // PackageFile is a single file entry in package
@@ -76,3 +79,65 @@ func (files PackageFiles) Swap(i, j int) {
func (files PackageFiles) Less(i, j int) bool { func (files PackageFiles) Less(i, j int) bool {
return files[i].Filename < files[j].Filename return files[i].Filename < files[j].Filename
} }
func (files PackageFiles) parseSumField(input string, setter func(sum *utils.ChecksumInfo, data string)) (PackageFiles, error) {
for _, line := range strings.Split(input, "\n") {
line = strings.TrimSpace(line)
if line == "" {
continue
}
parts := strings.Fields(line)
if len(parts) < 3 {
return nil, fmt.Errorf("unparseable hash sum line: %#v", line)
}
size, err := strconv.ParseInt(parts[1], 10, 64)
if err != nil {
return nil, fmt.Errorf("unable to parse size: %s", err)
}
filename := filepath.Base(parts[len(parts)-1])
found := false
pos := 0
for i, file := range files {
if file.Filename == filename {
found = true
pos = i
break
}
}
if !found {
files = append(files, PackageFile{Filename: filename})
pos = len(files) - 1
}
files[pos].Checksums.Size = size
setter(&files[pos].Checksums, parts[0])
}
return files, nil
}
// ParseSumFields populates PackageFiles by parsing stanza checksums fields
func (files PackageFiles) ParseSumFields(stanza Stanza) (PackageFiles, error) {
var err error
files, err = files.parseSumField(stanza["Files"], func(sum *utils.ChecksumInfo, data string) { sum.MD5 = data })
if err != nil {
return nil, err
}
files, err = files.parseSumField(stanza["Checksums-Sha1"], func(sum *utils.ChecksumInfo, data string) { sum.SHA1 = data })
if err != nil {
return nil, err
}
files, err = files.parseSumField(stanza["Checksums-Sha256"], func(sum *utils.ChecksumInfo, data string) { sum.SHA256 = data })
if err != nil {
return nil, err
}
return files, nil
}