diff --git a/deb/remote.go b/deb/remote.go index ac5a1f53..08fb956a 100644 --- a/deb/remote.go +++ b/deb/remote.go @@ -43,6 +43,10 @@ type RemoteRepo struct { LastDownloadDate time.Time // Checksums for release files ReleaseFiles map[string]utils.ChecksumInfo + // Filter for packages + Filter string + // FilterWithDeps to include dependencies from filter query + FilterWithDeps bool // "Snapshot" of current list of packages packageRefs *PackageRefList // Parsed archived root @@ -320,7 +324,8 @@ ok: } // Download downloads all repo files -func (repo *RemoteRepo) Download(progress aptly.Progress, d aptly.Downloader, collectionFactory *CollectionFactory, packagePool aptly.PackagePool, ignoreMismatch bool) error { +func (repo *RemoteRepo) Download(progress aptly.Progress, d aptly.Downloader, collectionFactory *CollectionFactory, + packagePool aptly.PackagePool, ignoreMismatch bool, dependencyOptions int, filterQuery PackageQuery) error { list := NewPackageList() progress.Printf("Downloading & parsing package files...\n") @@ -393,6 +398,25 @@ func (repo *RemoteRepo) Download(progress aptly.Progress, d aptly.Downloader, co progress.ShutdownBar() } + var err error + + if repo.Filter != "" { + progress.Printf("Applying filter...\n") + + list.PrepareIndex() + + emptyList := NewPackageList() + emptyList.PrepareIndex() + + origPackages := list.Len() + list, err = list.Filter([]PackageQuery{filterQuery}, repo.FilterWithDeps, emptyList, dependencyOptions, repo.Architectures) + if err != nil { + return err + } + + progress.Printf("Packages filtered: %d -> %d.\n", origPackages, list.Len()) + } + progress.Printf("Building download queue...\n") // Build download queue @@ -400,7 +424,7 @@ func (repo *RemoteRepo) Download(progress aptly.Progress, d aptly.Downloader, co count := 0 downloadSize := int64(0) - err := list.ForEach(func(p *Package) error { + err = list.ForEach(func(p *Package) error { list, err2 := p.DownloadList(packagePool) if err2 != nil { return err2 diff --git a/deb/remote_test.go b/deb/remote_test.go index b9bb68ba..206101dc 100644 --- a/deb/remote_test.go +++ b/deb/remote_test.go @@ -251,7 +251,7 @@ func (s *RemoteRepoSuite) TestDownload(c *C) { s.downloader.ExpectResponse("http://mirror.yandex.ru/debian/dists/squeeze/main/binary-i386/Packages", examplePackagesFile) s.downloader.ExpectResponse("http://mirror.yandex.ru/debian/pool/main/a/amanda/amanda-client_3.3.1-3~bpo60+1_amd64.deb", "xyz") - err = s.repo.Download(s.progress, s.downloader, s.collectionFactory, s.packagePool, false) + err = s.repo.Download(s.progress, s.downloader, s.collectionFactory, s.packagePool, false, 0, nil) c.Assert(err, IsNil) c.Assert(s.downloader.Empty(), Equals, true) c.Assert(s.repo.packageRefs, NotNil) @@ -284,7 +284,7 @@ func (s *RemoteRepoSuite) TestDownloadWithSources(c *C) { s.downloader.AnyExpectResponse("http://mirror.yandex.ru/debian/pool/main/a/access-modifier-checker/access-modifier-checker_1.0.orig.tar.gz", "abcd") s.downloader.AnyExpectResponse("http://mirror.yandex.ru/debian/pool/main/a/access-modifier-checker/access-modifier-checker_1.0-4.debian.tar.gz", "abcde") - err = s.repo.Download(s.progress, s.downloader, s.collectionFactory, s.packagePool, false) + err = s.repo.Download(s.progress, s.downloader, s.collectionFactory, s.packagePool, false, 0, nil) c.Assert(err, IsNil) c.Assert(s.downloader.Empty(), Equals, true) c.Assert(s.repo.packageRefs, NotNil) @@ -319,7 +319,7 @@ func (s *RemoteRepoSuite) TestDownloadFlat(c *C) { err := s.flat.Fetch(downloader, nil) c.Assert(err, IsNil) - err = s.flat.Download(s.progress, downloader, s.collectionFactory, s.packagePool, false) + err = s.flat.Download(s.progress, downloader, s.collectionFactory, s.packagePool, false, 0, nil) c.Assert(err, IsNil) c.Assert(downloader.Empty(), Equals, true) c.Assert(s.flat.packageRefs, NotNil) @@ -353,7 +353,7 @@ func (s *RemoteRepoSuite) TestDownloadWithSourcesFlat(c *C) { err := s.flat.Fetch(downloader, nil) c.Assert(err, IsNil) - err = s.flat.Download(s.progress, downloader, s.collectionFactory, s.packagePool, false) + err = s.flat.Download(s.progress, downloader, s.collectionFactory, s.packagePool, false, 0, nil) c.Assert(err, IsNil) c.Assert(downloader.Empty(), Equals, true) c.Assert(s.flat.packageRefs, NotNil)