// Download downloads all repo files func (repo *RemoteRepo) Download(d utils.Downloader, db database.Storage, packageRepo *Repository) error { list := NewPackageList() // Download and parse all Release files for _, component := range repo.Components { for _, architecture := range repo.Architectures { packagesReader, packagesFile, err := utils.DownloadTryCompression(d, repo.BinaryURL(component, architecture).String()) if err != nil { return err } defer packagesFile.Close() paras, err := debc.Parse(packagesReader) if err != nil { return err } for _, para := range paras { p := NewPackageFromControlFile(para) list.Add(p) } } } // Save package meta information to DB list.ForEach(func(p *Package) { db.Put(p.Key(), p.Encode()) }) // Download all package files ch := make(chan error, list.Len()) count := 0 list.ForEach(func(p *Package) { poolPath, err := packageRepo.PoolPath(p.Filename) if err == nil { if !p.VerifyFile(poolPath) { d.Download(repo.PackageURL(p.Filename).String(), poolPath, ch) count++ } } }) // Wait for all downloads to finish // TODO: report errors for count > 0 { _ = <-ch count-- } repo.LastDownloadDate = time.Now() repo.packageRefs = NewPackageRefListFromPackageList(list) return nil }
// NewSnapshotCollection loads Snapshots from DB and makes up collection func NewSnapshotCollection(db database.Storage) *SnapshotCollection { result := &SnapshotCollection{ db: db, } blobs := db.FetchByPrefix([]byte("S")) result.list = make([]*Snapshot, 0, len(blobs)) for _, blob := range blobs { s := &Snapshot{} if err := s.Decode(blob); err != nil { log.Printf("Error decoding snapshot: %s\n", err) } else { result.list = append(result.list, s) } } return result }
// NewRemoteRepoCollection loads RemoteRepos from DB and makes up collection func NewRemoteRepoCollection(db database.Storage) *RemoteRepoCollection { result := &RemoteRepoCollection{ db: db, } blobs := db.FetchByPrefix([]byte("R")) result.list = make([]*RemoteRepo, 0, len(blobs)) for _, blob := range blobs { r := &RemoteRepo{} if err := r.Decode(blob); err != nil { log.Printf("Error decoding mirror: %s\n", err) } else { result.list = append(result.list, r) } } return result }
// NewLocalRepoCollection loads LocalRepos from DB and makes up collection func NewLocalRepoCollection(db database.Storage) *LocalRepoCollection { result := &LocalRepoCollection{ RWMutex: &sync.RWMutex{}, db: db, } blobs := db.FetchByPrefix([]byte("L")) result.list = make([]*LocalRepo, 0, len(blobs)) for _, blob := range blobs { r := &LocalRepo{} if err := r.Decode(blob); err != nil { log.Printf("Error decoding repo: %s\n", err) } else { result.list = append(result.list, r) } } return result }