// LinkFromPool links package file from pool to dist's pool location func (p *Package) LinkFromPool(publishedStorage aptly.PublishedStorage, packagePool aptly.PackagePool, prefix string, component string) error { poolDir, err := p.PoolDirectory() if err != nil { return err } for i, f := range p.Files() { sourcePath, err := packagePool.Path(f.Filename, f.Checksums.MD5) if err != nil { return err } relPath := filepath.Join("pool", component, poolDir) publishedDirectory := filepath.Join(prefix, relPath) err = publishedStorage.LinkFromPool(publishedDirectory, packagePool, sourcePath) if err != nil { return err } if p.IsSource { p.Extra()["Directory"] = relPath } else { p.Files()[i].downloadPath = relPath } } return nil }
// LinkFromPool links package file from pool to dist's pool location func (p *Package) LinkFromPool(publishedStorage aptly.PublishedStorage, packagePool aptly.PackagePool, prefix string, component string) error { poolDir, err := p.PoolDirectory() if err != nil { return err } for i, f := range p.Files { sourcePath, err := packagePool.Path(f.Filename, f.Checksums.MD5) if err != nil { return err } relPath, err := publishedStorage.LinkFromPool(prefix, component, poolDir, packagePool, sourcePath) if err != nil { return err } dir := filepath.Dir(relPath) if p.IsSource { p.Extra["Directory"] = dir } else { p.Files[i].downloadPath = dir } } return nil }
// FilepathList returns list of paths to files in package repository func (p *Package) FilepathList(packagePool aptly.PackagePool) ([]string, error) { var err error result := make([]string, len(p.Files())) for i, f := range p.Files() { result[i], err = packagePool.RelativePath(f.Filename, f.Checksums.MD5) if err != nil { return nil, err } } return result, nil }
// Verify that package file is present and correct func (f *PackageFile) Verify(packagePool aptly.PackagePool) (bool, error) { poolPath, err := packagePool.Path(f.Filename, f.Checksums.MD5) if err != nil { return false, err } st, err := os.Stat(poolPath) if err != nil { return false, nil } // verify size // TODO: verify checksum if configured return st.Size() == f.Checksums.Size, nil }
// CalculateContents looks up contents in package file func (p *Package) CalculateContents(packagePool aptly.PackagePool) []string { if p.IsSource { return nil } file := p.Files()[0] path, err := packagePool.Path(file.Filename, file.Checksums.MD5) if err != nil { panic(err) } contents, err := GetContentsFromDeb(path) if err != nil { panic(err) } return contents }
// DownloadList returns list of missing package files for download in format // [[srcpath, dstpath]] func (p *Package) DownloadList(packagePool aptly.PackagePool) (result []PackageDownloadTask, err error) { result = make([]PackageDownloadTask, 0, 1) for _, f := range p.Files() { poolPath, err := packagePool.Path(f.Filename, f.Checksums.MD5) if err != nil { return nil, err } verified, err := f.Verify(packagePool) if err != nil { return nil, err } if !verified { result = append(result, PackageDownloadTask{RepoURI: f.DownloadURL(), DestinationPath: poolPath, Checksums: f.Checksums}) } } return result, nil }
// ImportPackageFiles imports files into local repository func ImportPackageFiles(list *PackageList, packageFiles []string, forceReplace bool, verifier utils.Verifier, pool aptly.PackagePool, collection *PackageCollection, reporter aptly.ResultReporter, restriction PackageQuery) (processedFiles []string, failedFiles []string, err error) { if forceReplace { list.PrepareIndex() } for _, file := range packageFiles { var ( stanza Stanza p *Package ) candidateProcessedFiles := []string{} isSourcePackage := strings.HasSuffix(file, ".dsc") isUdebPackage := strings.HasSuffix(file, ".udeb") if isSourcePackage { stanza, err = GetControlFileFromDsc(file, verifier) if err == nil { stanza["Package"] = stanza["Source"] delete(stanza, "Source") p, err = NewSourcePackageFromControlFile(stanza) } } else { stanza, err = GetControlFileFromDeb(file) if isUdebPackage { p = NewUdebPackageFromControlFile(stanza) } else { p = NewPackageFromControlFile(stanza) } } if err != nil { reporter.Warning("Unable to read file %s: %s", file, err) failedFiles = append(failedFiles, file) continue } if p.Name == "" { reporter.Warning("Empty package name on %s", file) failedFiles = append(failedFiles, file) continue } if p.Version == "" { reporter.Warning("Empty version on %s", file) failedFiles = append(failedFiles, file) continue } if p.Architecture == "" { reporter.Warning("Empty architecture on %s", file) failedFiles = append(failedFiles, file) continue } var checksums utils.ChecksumInfo checksums, err = utils.ChecksumsForFile(file) if err != nil { return nil, nil, err } if isSourcePackage { p.UpdateFiles(append(p.Files(), PackageFile{Filename: filepath.Base(file), Checksums: checksums})) } else { p.UpdateFiles([]PackageFile{{Filename: filepath.Base(file), Checksums: checksums}}) } err = pool.Import(file, checksums.MD5) if err != nil { reporter.Warning("Unable to import file %s into pool: %s", file, err) failedFiles = append(failedFiles, file) continue } candidateProcessedFiles = append(candidateProcessedFiles, file) // go over all files, except for the last one (.dsc/.deb itself) for _, f := range p.Files() { if filepath.Base(f.Filename) == filepath.Base(file) { continue } sourceFile := filepath.Join(filepath.Dir(file), filepath.Base(f.Filename)) err = pool.Import(sourceFile, f.Checksums.MD5) if err != nil { reporter.Warning("Unable to import file %s into pool: %s", sourceFile, err) failedFiles = append(failedFiles, file) break } candidateProcessedFiles = append(candidateProcessedFiles, sourceFile) } if err != nil { // some files haven't been imported continue } if restriction != nil && !restriction.Matches(p) { reporter.Warning("%s has been ignored as it doesn't match restriction", p) failedFiles = append(failedFiles, file) continue } err = collection.Update(p) if err != nil { reporter.Warning("Unable to save package %s: %s", p, err) failedFiles = append(failedFiles, file) continue } if forceReplace { conflictingPackages := list.Search(Dependency{Pkg: p.Name, Version: p.Version, Relation: VersionEqual, Architecture: p.Architecture}, true) for _, cp := range conflictingPackages { reporter.Removed("%s removed due to conflict with package being added", cp) list.Remove(cp) } } err = list.Add(p) if err != nil { reporter.Warning("Unable to add package to repo %s: %s", p, err) failedFiles = append(failedFiles, file) continue } reporter.Added("%s added", p) processedFiles = append(processedFiles, candidateProcessedFiles...) } err = nil return }