noita-mapcap/scripts/dist/compress.go

80 lines
1.5 KiB
Go
Raw Normal View History

// Copyright (c) 2022 David Vogel
//
// This software is released under the MIT License.
// https://opensource.org/licenses/MIT
package main
import (
"archive/zip"
"io"
"io/fs"
"log"
"os"
"path/filepath"
"golang.org/x/exp/slices"
)
// addPathToZip adds the given file or directory at srcPath to the zipWriter.
//
// The ignorePaths list is compared to the archive path (archive base path + relative path).
func addPathToZip(zipWriter *zip.Writer, srcPath, archiveBasePath string, ignorePaths []string) error {
return filepath.WalkDir(srcPath, func(path string, d fs.DirEntry, err error) error {
if err != nil {
return err
}
relPath, err := filepath.Rel(srcPath, path)
if err != nil {
return err
}
archivePath := filepath.Join(archiveBasePath, relPath)
// Skip if path is in ignore list.
// This applies to directories or files.
if slices.Contains(ignorePaths, archivePath) {
log.Printf("Skipped %q", archivePath)
if d.IsDir() {
return fs.SkipDir
}
return nil
}
// Ignore directories.
if d.IsDir() {
return nil
}
fileToZip, err := os.Open(path)
if err != nil {
return err
}
defer fileToZip.Close()
info, err := fileToZip.Stat()
if err != nil {
return err
}
header, err := zip.FileInfoHeader(info)
if err != nil {
return err
}
header.Name = filepath.ToSlash(archivePath)
header.Method = zip.Deflate
writer, err := zipWriter.CreateHeader(header)
if err != nil {
return err
}
if _, err = io.Copy(writer, fileToZip); err != nil {
return err
}
return nil
})
}