Refactoring: Filename now contains only base path, any order of files is accepted.

This commit is contained in:
Andrey Smirnov
2014-02-25 14:15:16 +04:00
parent e94bca2733
commit ee62dd34f7
2 changed files with 92 additions and 22 deletions

77
debian/package.go vendored
View File

@@ -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)
}
}

View File

@@ -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")