mirror of
https://github.com/aptly-dev/aptly.git
synced 2026-05-06 22:18:28 +00:00
Refactor checksum parsing out of package parsing code. #71
This commit is contained in:
+10
-52
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user