// fetchAndStore reads the contents of path and stores them into a, returning // the digest of the contents. The path to digest mapping is cached so that // repeated uses of the same file will avoid redundant work. func (e *Extractor) fetchAndStore(ctx context.Context, path string, a *indexpack.Archive) (string, error) { if digest, ok := e.fmap[path]; ok { return digest, nil } data, err := vfs.ReadFile(ctx, path) if err != nil { // If there's an alternative installation path, and this is a path that // could potentially be there, try that. if i := strings.Index(path, "/pkg/"); i >= 0 && e.AltInstallPath != "" { alt := e.AltInstallPath + path[i:] data, err = vfs.ReadFile(ctx, alt) // fall through to the recheck below } } if err != nil { return "", err } name, err := a.WriteFile(ctx, data) if err != nil { return "", err } digest := strings.TrimSuffix(name, filepath.Ext(name)) if e.fmap == nil { e.fmap = map[string]string{path: digest} } return digest, err }
func packIndex(ctx context.Context, pack *indexpack.Archive, idx *kindex.Compilation) error { for _, data := range idx.Files { if path, err := pack.WriteFile(ctx, data.Content); err != nil { return fmt.Errorf("error writing file %v: %v", data.Info, err) } else if !*quiet { log.Println("Wrote file to", path) } } path, err := pack.WriteUnit(ctx, formatKey, idx.Proto) if err != nil { return fmt.Errorf("error writing compilation unit: %v", err) } fmt.Println(strings.TrimSuffix(path, ".unit")) return nil }