From 903e999cdcb55894fdfeb874dcc63f4f1012020b Mon Sep 17 00:00:00 2001 From: Andrey Smirnov Date: Fri, 13 Mar 2015 21:23:22 +0300 Subject: [PATCH] Refactor checksum parsing out of package parsing code. #71 --- deb/package.go | 62 +++++++----------------------------------- deb/package_files.go | 65 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 52 deletions(-) diff --git a/deb/package.go b/deb/package.go index 8dddda0c..ba0d6956 100644 --- a/deb/package.go +++ b/deb/package.go @@ -114,62 +114,20 @@ func NewSourcePackageFromControlFile(input Stanza) (*Package, error) { delete(input, "Version") delete(input, "Architecture") + var err error + files := make(PackageFiles, 0, 3) - - 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 }) + files, err = files.ParseSumFields(input) if err != nil { return nil, err } - err = parseSums("Checksums-Sha1", func(sum *utils.ChecksumInfo, data string) { sum.SHA1 = data }) - if err != nil { - return nil, err - } - err = parseSums("Checksums-Sha256", func(sum *utils.ChecksumInfo, data string) { sum.SHA256 = data }) - if err != nil { - return nil, err + + delete(input, "Files") + delete(input, "Checksums-Sha1") + delete(input, "Checksums-Sha256") + + for i := range files { + files[i].downloadPath = input["Directory"] } result.UpdateFiles(files) diff --git a/deb/package_files.go b/deb/package_files.go index 31a37cbe..489b67b1 100644 --- a/deb/package_files.go +++ b/deb/package_files.go @@ -2,12 +2,15 @@ package deb import ( "encoding/binary" + "fmt" "github.com/smira/aptly/aptly" "github.com/smira/aptly/utils" "hash/fnv" "os" "path/filepath" "sort" + "strconv" + "strings" ) // 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 { 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 +}