diff --git a/debian/package.go b/debian/package.go index 35c6b0e0..0b61889f 100644 --- a/debian/package.go +++ b/debian/package.go @@ -293,6 +293,20 @@ func (p *Package) DownloadList(packageRepo *Repository) (result [][]string, err return result, nil } +// VerifyFiles verifies that all package files have neen correctly downloaded +func (p *Package) VerifyFiles(packageRepo *Repository) (result bool, err error) { + result = true + + for _, f := range p.Files { + result, err = f.Verify(packageRepo) + if err != nil || !result { + return + } + } + + return +} + // PackageCollection does management of packages in DB type PackageCollection struct { db database.Storage diff --git a/debian/package_test.go b/debian/package_test.go index 2d96ab25..9d4dc113 100644 --- a/debian/package_test.go +++ b/debian/package_test.go @@ -40,10 +40,18 @@ func (s *PackageSuite) TestPackageFileVerify(c *C) { c.Check(err, IsNil) c.Check(result, Equals, false) + result, err = p.VerifyFiles(packageRepo) + c.Check(err, IsNil) + c.Check(result, Equals, false) + p.Files[0].Checksums.Size = 5 result, err = p.Files[0].Verify(packageRepo) c.Check(err, IsNil) c.Check(result, Equals, true) + + result, err = p.VerifyFiles(packageRepo) + c.Check(err, IsNil) + c.Check(result, Equals, true) } func (s *PackageSuite) TestNewFromPara(c *C) { diff --git a/debian/remote.go b/debian/remote.go index d75ff34e..f854b5fe 100644 --- a/debian/remote.go +++ b/debian/remote.go @@ -186,14 +186,21 @@ func (repo *RemoteRepo) Download(d utils.Downloader, packageCollection *PackageC // Download all package files ch := make(chan error, list.Len()) + queued := make(map[string]bool, 1024) count := 0 err = list.ForEach(func(p *Package) error { list, err := p.DownloadList(packageRepo) for _, pair := range list { - d.Download(repo.PackageURL(pair[0]).String(), pair[1], ch) - count++ + key := pair[0] + "-" + pair[1] + _, found := queued[key] + if !found { + d.Download(repo.PackageURL(pair[0]).String(), pair[1], ch) + count++ + } else { + queued[key] = true + } } return err diff --git a/debian/remote_test.go b/debian/remote_test.go index d8574560..70bca780 100644 --- a/debian/remote_test.go +++ b/debian/remote_test.go @@ -144,8 +144,9 @@ func (s *RemoteRepoSuite) TestDownload(c *C) { pkg, err := s.packageCollection.ByKey(s.repo.packageRefs.Refs[0]) c.Assert(err, IsNil) - // poolPath, _ := s.packageRepo.PoolPath(pkg.Filename, pkg.HashMD5) - // c.Check(pkg.VerifyFile(poolPath), Equals, true) + result, err := pkg.VerifyFiles(s.packageRepo) + c.Check(result, Equals, true) + c.Check(err, IsNil) c.Check(pkg.Name, Equals, "amanda-client") }