mirror of
https://github.com/aptly-dev/aptly.git
synced 2026-01-12 03:21:33 +00:00
79 lines
1.8 KiB
Go
79 lines
1.8 KiB
Go
package debian
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"github.com/smira/aptly/aptly"
|
|
"github.com/smira/aptly/utils"
|
|
"hash/fnv"
|
|
"os"
|
|
"path/filepath"
|
|
"sort"
|
|
)
|
|
|
|
// PackageFile is a single file entry in package
|
|
type PackageFile struct {
|
|
// Filename is name of file for the package (without directory)
|
|
Filename string
|
|
// Hashes for the file
|
|
Checksums utils.ChecksumInfo
|
|
// Temporary field used while downloading, stored relative path on the mirror
|
|
downloadPath string
|
|
}
|
|
|
|
// Verify that package file is present and correct
|
|
func (f *PackageFile) Verify(packagePool aptly.PackagePool) (bool, error) {
|
|
poolPath, err := packagePool.Path(f.Filename, f.Checksums.MD5)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
|
|
st, err := os.Stat(poolPath)
|
|
if err != nil {
|
|
return false, nil
|
|
}
|
|
|
|
// verify size
|
|
// TODO: verify checksum if configured
|
|
return st.Size() == f.Checksums.Size, nil
|
|
}
|
|
|
|
// DownloadURL return relative URL to package download location
|
|
func (f *PackageFile) DownloadURL() string {
|
|
return filepath.Join(f.downloadPath, f.Filename)
|
|
}
|
|
|
|
// PackageFiles is collection of package files
|
|
type PackageFiles []PackageFile
|
|
|
|
// Hash compute hash of all file items, sorting them first
|
|
func (files PackageFiles) Hash() uint64 {
|
|
sort.Sort(files)
|
|
|
|
h := fnv.New64a()
|
|
|
|
for _, f := range files {
|
|
h.Write([]byte(f.Filename))
|
|
binary.Write(h, binary.BigEndian, f.Checksums.Size)
|
|
h.Write([]byte(f.Checksums.MD5))
|
|
h.Write([]byte(f.Checksums.SHA1))
|
|
h.Write([]byte(f.Checksums.SHA256))
|
|
}
|
|
|
|
return h.Sum64()
|
|
}
|
|
|
|
// Len returns number of files
|
|
func (files PackageFiles) Len() int {
|
|
return len(files)
|
|
}
|
|
|
|
// Swap swaps elements
|
|
func (files PackageFiles) Swap(i, j int) {
|
|
files[i], files[j] = files[j], files[i]
|
|
}
|
|
|
|
// Less compares by filename
|
|
func (files PackageFiles) Less(i, j int) bool {
|
|
return files[i].Filename < files[j].Filename
|
|
}
|