Skip to content

Instantly share code, notes, and snippets.

@imjasonh
Created January 13, 2021 15:25
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save imjasonh/d2b90e9d929ddf0dbfa25f35bb73687e to your computer and use it in GitHub Desktop.
Save imjasonh/d2b90e9d929ddf0dbfa25f35bb73687e to your computer and use it in GitHub Desktop.
Trying to plug a tar.Reader into fs.FS
package main
import (
"archive/tar"
"errors"
"io"
"io/fs"
"log"
"os"
"path/filepath"
)
func main() {
fn := os.Args[1]
f, err := os.Open(fn)
if err != nil {
log.Fatal(err)
}
tr := tar.NewReader(f)
if err := fs.WalkDir(FSFromTar(tr), "cmd/", func(path string, _ fs.DirEntry, err error) error {
if err != nil {
return err
}
log.Println(path)
return nil
}); err != nil {
log.Fatal(err)
}
}
func FSFromTar(tr *tar.Reader) fs.FS { return &fss{tr} }
type fss struct{ tr *tar.Reader }
func (f *fss) Open(n string) (fs.File, error) {
n = filepath.Clean(n)
for {
h, err := f.tr.Next()
if err == io.EOF {
return nil, errors.New("file not found")
}
if err != nil {
return nil, err
}
if filepath.Clean(h.Name) == n {
return file{h, f.tr}, nil
}
}
}
type file struct {
h *tar.Header
r io.Reader
}
func (f file) Stat() (fs.FileInfo, error) {
return f.h.FileInfo(), nil
}
func (f file) Read(b []byte) (int, error) {
return f.r.Read(b)
}
func (f file) Close() error {
return nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment