// get a single file from the s3 bucket func (remote *S3Remote) getFile(dst string, key *keyDef) error { fmt.Printf("pulling key %s (%s)\n", key.key, utils.HumanSize(key.s3Key.Size)) srcKey := remote.remoteKey(key.key) from, err := remote.getBucket().GetReader(srcKey) if err != nil { return err } defer from.Close() bufFrom := bufio.NewReader(from) if err := os.MkdirAll(filepath.Dir(dst), 0700); err != nil { return err } to, err := os.Create(dst) if err != nil { return err } // TODO add progress reader progressReaderFrom := utils.NewProgressReader(bufFrom, key.s3Key.Size, os.Stdout) _, err = io.Copy(to, progressReaderFrom) if err != nil { return err } // TODO validate against sum return nil }
func (cli *DogestryCli) processTarEntry(root string, header *tar.Header, tarball io.Reader) error { // only handle files (directories are implicit) if header.Typeflag == tar.TypeReg { fmt.Printf(" tar: processing %s\n", header.Name) // special case - repositories file if filepath.Base(header.Name) == "repositories" { if err := writeRepositories(root, tarball); err != nil { return err } } else { barename := strings.TrimPrefix(header.Name, "./") dest := filepath.Join(root, "images", barename) if err := os.MkdirAll(filepath.Dir(dest), os.ModeDir|0700); err != nil { return err } destFile, err := os.Create(dest) if err != nil { return err } defer destFile.Close() if wrote, err := io.Copy(destFile, tarball); err != nil { return err } else { fmt.Printf(" tar: wrote %s\n", utils.HumanSize(wrote)) } destFile.Close() } } return nil }