mirror of
https://github.com/aptly-dev/aptly.git
synced 2026-04-19 19:28:22 +00:00
Refactoring: Filename now contains only base path, any order of files is accepted.
This commit is contained in:
77
debian/package.go
vendored
77
debian/package.go
vendored
@@ -15,8 +15,12 @@ import (
|
||||
|
||||
// PackageFile is a single file entry in package
|
||||
type PackageFile struct {
|
||||
Filename string
|
||||
// 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
|
||||
@@ -36,6 +40,11 @@ func (f *PackageFile) Verify(packagePool aptly.PackagePool) (bool, error) {
|
||||
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)
|
||||
}
|
||||
|
||||
// Package is single instance of Debian package
|
||||
type Package struct {
|
||||
// Is this source package
|
||||
@@ -96,7 +105,8 @@ func NewPackageFromControlFile(input Stanza) *Package {
|
||||
filesize, _ := strconv.ParseInt(input["Size"], 10, 64)
|
||||
|
||||
result.Files = append(result.Files, PackageFile{
|
||||
Filename: input["Filename"],
|
||||
Filename: filepath.Base(input["Filename"]),
|
||||
downloadPath: filepath.Dir(input["Filename"]),
|
||||
Checksums: utils.ChecksumInfo{
|
||||
Size: filesize,
|
||||
MD5: strings.TrimSpace(input["MD5sum"]),
|
||||
@@ -153,7 +163,7 @@ func NewSourcePackageFromControlFile(input Stanza) (*Package, error) {
|
||||
return fmt.Errorf("unable to parse size: %s", err)
|
||||
}
|
||||
|
||||
filename := filepath.Join(input["Directory"], parts[2])
|
||||
filename := filepath.Base(parts[2])
|
||||
|
||||
found := false
|
||||
pos := 0
|
||||
@@ -166,7 +176,7 @@ func NewSourcePackageFromControlFile(input Stanza) (*Package, error) {
|
||||
}
|
||||
|
||||
if !found {
|
||||
result.Files = append(result.Files, PackageFile{Filename: filename})
|
||||
result.Files = append(result.Files, PackageFile{Filename: filename, downloadPath: input["Directory"]})
|
||||
pos = len(result.Files) - 1
|
||||
}
|
||||
|
||||
@@ -222,7 +232,16 @@ func (p *Package) Encode() []byte {
|
||||
// Decode decodes msgpack representation into Package
|
||||
func (p *Package) Decode(input []byte) error {
|
||||
decoder := codec.NewDecoderBytes(input, &codec.MsgpackHandle{})
|
||||
return decoder.Decode(p)
|
||||
err := decoder.Decode(p)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for i := range p.Files {
|
||||
p.Files[i].Filename = filepath.Base(p.Files[i].Filename)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// String creates readable representation
|
||||
@@ -290,15 +309,14 @@ func (p *Package) Stanza() (result Stanza) {
|
||||
md5, sha1, sha256 := make([]string, 0), make([]string, 0), make([]string, 0)
|
||||
|
||||
for _, f := range p.Files {
|
||||
base := filepath.Base(f.Filename)
|
||||
if f.Checksums.MD5 != "" {
|
||||
md5 = append(md5, fmt.Sprintf(" %s %d %s\n", f.Checksums.MD5, f.Checksums.Size, base))
|
||||
md5 = append(md5, fmt.Sprintf(" %s %d %s\n", f.Checksums.MD5, f.Checksums.Size, f.Filename))
|
||||
}
|
||||
if f.Checksums.SHA1 != "" {
|
||||
sha1 = append(sha1, fmt.Sprintf(" %s %d %s\n", f.Checksums.SHA1, f.Checksums.Size, base))
|
||||
sha1 = append(sha1, fmt.Sprintf(" %s %d %s\n", f.Checksums.SHA1, f.Checksums.Size, f.Filename))
|
||||
}
|
||||
if f.Checksums.SHA256 != "" {
|
||||
sha256 = append(sha256, fmt.Sprintf(" %s %d %s\n", f.Checksums.SHA256, f.Checksums.Size, base))
|
||||
sha256 = append(sha256, fmt.Sprintf(" %s %d %s\n", f.Checksums.SHA256, f.Checksums.Size, f.Filename))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -306,7 +324,7 @@ func (p *Package) Stanza() (result Stanza) {
|
||||
result["Checksums-Sha1"] = strings.Join(sha1, "")
|
||||
result["Checksums-Sha256"] = strings.Join(sha256, "")
|
||||
} else {
|
||||
result["Filename"] = p.Files[0].Filename
|
||||
result["Filename"] = p.Files[0].DownloadURL()
|
||||
if p.Files[0].Checksums.MD5 != "" {
|
||||
result["MD5sum"] = p.Files[0].Checksums.MD5
|
||||
}
|
||||
@@ -350,8 +368,20 @@ func (p *Package) Equals(p2 *Package) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
for i, f := range p.Files {
|
||||
if p2.Files[i] != f {
|
||||
for _, f := range p.Files {
|
||||
found := false
|
||||
for _, f2 := range p2.Files {
|
||||
if f2.Filename == f.Filename {
|
||||
found = true
|
||||
if f.Checksums != f2.Checksums {
|
||||
return false
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
if !found {
|
||||
return false
|
||||
}
|
||||
}
|
||||
@@ -382,10 +412,11 @@ func (p *Package) LinkFromPool(publishedStorage aptly.PublishedStorage, packageP
|
||||
return err
|
||||
}
|
||||
|
||||
dir := filepath.Dir(relPath)
|
||||
if p.IsSource {
|
||||
p.Extra["Directory"] = filepath.Dir(relPath)
|
||||
p.Extra["Directory"] = dir
|
||||
} else {
|
||||
p.Files[i].Filename = relPath
|
||||
p.Files[i].downloadPath = dir
|
||||
}
|
||||
}
|
||||
|
||||
@@ -438,7 +469,7 @@ func (p *Package) DownloadList(packagePool aptly.PackagePool) (result []PackageD
|
||||
}
|
||||
|
||||
if !verified {
|
||||
result = append(result, PackageDownloadTask{RepoURI: f.Filename, DestinationPath: poolPath, Checksums: f.Checksums})
|
||||
result = append(result, PackageDownloadTask{RepoURI: f.DownloadURL(), DestinationPath: poolPath, Checksums: f.Checksums})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -516,8 +547,20 @@ func (collection *PackageCollection) Update(p *Package) error {
|
||||
return fmt.Errorf("unable to save: %s, conflict with existing packge", p)
|
||||
}
|
||||
|
||||
for i, f := range p.Files {
|
||||
if existing.Files[i] != f {
|
||||
for _, f := range p.Files {
|
||||
found := false
|
||||
for _, f2 := range existing.Files {
|
||||
if f2.Filename == f.Filename {
|
||||
found = true
|
||||
if f.Checksums != f2.Checksums {
|
||||
return fmt.Errorf("unable to save: %s, conflict with existing packge", p)
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
if !found {
|
||||
return fmt.Errorf("unable to save: %s, conflict with existing packge", p)
|
||||
}
|
||||
}
|
||||
|
||||
37
debian/package_test.go
vendored
37
debian/package_test.go
vendored
@@ -59,6 +59,14 @@ func (s *PackageSuite) TestPackageFileVerify(c *C) {
|
||||
c.Check(result, Equals, true)
|
||||
}
|
||||
|
||||
func (s *PackageSuite) TestPackageFileDownloadURL(c *C) {
|
||||
p := NewPackageFromControlFile(s.stanza)
|
||||
|
||||
c.Check(p.Files[0].Filename, Equals, "alien-arena-common_7.40-2_i386.deb")
|
||||
c.Check(p.Files[0].downloadPath, Equals, "pool/contrib/a/alien-arena")
|
||||
c.Check(p.Files[0].DownloadURL(), Equals, "pool/contrib/a/alien-arena/alien-arena-common_7.40-2_i386.deb")
|
||||
}
|
||||
|
||||
func (s *PackageSuite) TestNewFromPara(c *C) {
|
||||
p := NewPackageFromControlFile(s.stanza)
|
||||
|
||||
@@ -68,7 +76,8 @@ func (s *PackageSuite) TestNewFromPara(c *C) {
|
||||
c.Check(p.Architecture, Equals, "i386")
|
||||
c.Check(p.Provides, DeepEquals, []string(nil))
|
||||
c.Check(p.Files, HasLen, 1)
|
||||
c.Check(p.Files[0].Filename, Equals, "pool/contrib/a/alien-arena/alien-arena-common_7.40-2_i386.deb")
|
||||
c.Check(p.Files[0].Filename, Equals, "alien-arena-common_7.40-2_i386.deb")
|
||||
c.Check(p.Files[0].downloadPath, Equals, "pool/contrib/a/alien-arena")
|
||||
c.Check(p.Files[0].Checksums.Size, Equals, int64(187518))
|
||||
c.Check(p.Files[0].Checksums.MD5, Equals, "1e8cba92c41420aa7baa8a5718d67122")
|
||||
c.Check(p.Depends, DeepEquals, []string{"libc6 (>= 2.7)", "alien-arena-data (>= 7.40)"})
|
||||
@@ -88,19 +97,22 @@ func (s *PackageSuite) TestNewSourceFromPara(c *C) {
|
||||
c.Check(p.BuildDependsInDep, DeepEquals, []string{"default-jdk-doc", "junit (>= 3.8.1)", "libannotation-indexer-java (>= 1.3)", "libannotation-indexer-java-doc", "libasm3-java", "libmaven-install-plugin-java", "libmaven-javadoc-plugin-java", "libmaven-scm-java", "libmaven2-core-java", "libmaven2-core-java-doc", "libmetainf-services-java", "libmetainf-services-java-doc", "libmaven-plugin-tools-java (>= 2.8)"})
|
||||
c.Check(p.Files, HasLen, 3)
|
||||
|
||||
c.Check(p.Files[0].Filename, Equals, "pool/main/a/access-modifier-checker/access-modifier-checker_1.0-4.dsc")
|
||||
c.Check(p.Files[0].Filename, Equals, "access-modifier-checker_1.0-4.dsc")
|
||||
c.Check(p.Files[0].downloadPath, Equals, "pool/main/a/access-modifier-checker")
|
||||
c.Check(p.Files[0].Checksums.Size, Equals, int64(3))
|
||||
c.Check(p.Files[0].Checksums.MD5, Equals, "900150983cd24fb0d6963f7d28e17f72")
|
||||
c.Check(p.Files[0].Checksums.SHA1, Equals, "a9993e364706816aba3e25717850c26c9cd0d89d")
|
||||
c.Check(p.Files[0].Checksums.SHA256, Equals, "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad")
|
||||
|
||||
c.Check(p.Files[1].Filename, Equals, "pool/main/a/access-modifier-checker/access-modifier-checker_1.0.orig.tar.gz")
|
||||
c.Check(p.Files[1].Filename, Equals, "access-modifier-checker_1.0.orig.tar.gz")
|
||||
c.Check(p.Files[0].downloadPath, Equals, "pool/main/a/access-modifier-checker")
|
||||
c.Check(p.Files[1].Checksums.Size, Equals, int64(4))
|
||||
c.Check(p.Files[1].Checksums.MD5, Equals, "e2fc714c4727ee9395f324cd2e7f331f")
|
||||
c.Check(p.Files[1].Checksums.SHA1, Equals, "81fe8bfe87576c3ecb22426f8e57847382917acf")
|
||||
c.Check(p.Files[1].Checksums.SHA256, Equals, "88d4266fd4e6338d13b845fcf289579d209c897823b9217da3e161936f031589")
|
||||
|
||||
c.Check(p.Files[2].Filename, Equals, "pool/main/a/access-modifier-checker/access-modifier-checker_1.0-4.debian.tar.gz")
|
||||
c.Check(p.Files[2].Filename, Equals, "access-modifier-checker_1.0-4.debian.tar.gz")
|
||||
c.Check(p.Files[0].downloadPath, Equals, "pool/main/a/access-modifier-checker")
|
||||
|
||||
c.Check(p.Depends, IsNil)
|
||||
}
|
||||
@@ -124,6 +136,10 @@ func (s *PackageSuite) TestKey(c *C) {
|
||||
|
||||
func (s *PackageSuite) TestEncodeDecode(c *C) {
|
||||
p := NewPackageFromControlFile(s.stanza)
|
||||
|
||||
// downloadPath would be lost in encode/decode cycle, that's OK
|
||||
p.Files[0].downloadPath = ""
|
||||
|
||||
encoded := p.Encode()
|
||||
p2 := &Package{}
|
||||
err := p2.Decode(encoded)
|
||||
@@ -166,6 +182,16 @@ func (s *PackageSuite) TestEquals(c *C) {
|
||||
so2, _ := NewSourcePackageFromControlFile(s.sourceStanza.Copy())
|
||||
|
||||
c.Check(so.Equals(so2), Equals, true)
|
||||
|
||||
so2.Files[2], so2.Files[1] = so2.Files[1], so2.Files[2]
|
||||
c.Check(so.Equals(so2), Equals, true)
|
||||
|
||||
so2.Files[2].Checksums.MD5 = "abcde"
|
||||
c.Check(so.Equals(so2), Equals, false)
|
||||
|
||||
so2, _ = NewSourcePackageFromControlFile(s.sourceStanza.Copy())
|
||||
so2.Files[1].Filename = "other.deb"
|
||||
c.Check(so.Equals(so2), Equals, false)
|
||||
}
|
||||
|
||||
func (s *PackageSuite) TestMatchesArchitecture(c *C) {
|
||||
@@ -241,7 +267,8 @@ func (s *PackageSuite) TestLinkFromPool(c *C) {
|
||||
|
||||
err = p.LinkFromPool(publishedStorage, packagePool, "", "non-free")
|
||||
c.Check(err, IsNil)
|
||||
c.Check(p.Files[0].Filename, Equals, "pool/non-free/a/alien-arena/alien-arena-common_7.40-2_i386.deb")
|
||||
c.Check(p.Files[0].Filename, Equals, "alien-arena-common_7.40-2_i386.deb")
|
||||
c.Check(p.Files[0].downloadPath, Equals, "pool/non-free/a/alien-arena")
|
||||
|
||||
p.IsSource = true
|
||||
err = p.LinkFromPool(publishedStorage, packagePool, "", "non-free")
|
||||
|
||||
Reference in New Issue
Block a user