"hash"
"hash/crc32"
"io"
+ "io/fs"
"strings"
"unicode/utf8"
)
w.compressors[method] = comp
}
+// AddFS adds the files from fs.FS to the archive.
+// It walks the directory tree starting at the root of the filesystem
+// adding each file to the zip using deflate while maintaining the directory structure.
+func (w *Writer) AddFS(fsys fs.FS) error {
+ return fs.WalkDir(fsys, ".", func(name string, d fs.DirEntry, err error) error {
+ if err != nil {
+ return err
+ }
+ if d.IsDir() {
+ return nil
+ }
+ info, err := d.Info()
+ if err != nil {
+ return err
+ }
+ h, err := FileInfoHeader(info)
+ if err != nil {
+ return err
+ }
+ h.Name = name
+ h.Method = Deflate
+ fw, err := w.CreateHeader(h)
+ if err != nil {
+ return err
+ }
+ f, err := fsys.Open(name)
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+ _, err = io.Copy(fw, f)
+ return err
+ })
+}
+
func (w *Writer) compressor(method uint16) Compressor {
comp := w.compressors[method]
if comp == nil {
"os"
"strings"
"testing"
+ "testing/fstest"
"time"
)
}
})
}
+
+func writeTestsToFS(tests []WriteTest) fs.FS {
+ fsys := fstest.MapFS{}
+ for _, wt := range tests {
+ fsys[wt.Name] = &fstest.MapFile{
+ Data: wt.Data,
+ Mode: wt.Mode,
+ }
+ }
+ return fsys
+}
+
+func TestWriterAddFS(t *testing.T) {
+ buf := new(bytes.Buffer)
+ w := NewWriter(buf)
+ tests := []WriteTest{
+ {
+ Name: "file.go",
+ Data: []byte("hello"),
+ Mode: 0644,
+ },
+ {
+ Name: "subfolder/another.go",
+ Data: []byte("world"),
+ Mode: 0644,
+ },
+ }
+ err := w.AddFS(writeTestsToFS(tests))
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if err := w.Close(); err != nil {
+ t.Fatal(err)
+ }
+
+ // read it back
+ r, err := NewReader(bytes.NewReader(buf.Bytes()), int64(buf.Len()))
+ if err != nil {
+ t.Fatal(err)
+ }
+ for i, wt := range tests {
+ testReadFile(t, r.File[i], &wt)
+ }
+}