summary refs log tree commit diff stats
path: root/internal/builder/builder.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/builder/builder.go')
-rw-r--r--internal/builder/builder.go37
1 files changed, 36 insertions, 1 deletions
diff --git a/internal/builder/builder.go b/internal/builder/builder.go
index 90df0f1..7b12315 100644
--- a/internal/builder/builder.go
+++ b/internal/builder/builder.go
@@ -2,6 +2,9 @@ package builder
 
 import (
 	"fmt"
+	"io"
+	"io/fs"
+	"os"
 	"path"
 	"path/filepath"
 	"slices"
@@ -34,6 +37,38 @@ func joinSourcePath(src string) func(string) string {
 	}
 }
 
+func copyRecursive(storage storage.Writer, src string) error {
+	return filepath.WalkDir(src, func(path string, d fs.DirEntry, err error) error {
+		if err != nil {
+			return err
+		}
+		rel, err := filepath.Rel(src, path)
+		if err != nil {
+			return err
+		}
+		if d.IsDir() {
+			return storage.Mkdirp(rel)
+		}
+
+		sf, err := os.Open(path)
+		if err != nil {
+			return err
+		}
+		defer sf.Close()
+		df, err := storage.OpenFileAndVariants(rel)
+		if err != nil {
+			return err
+		}
+		defer df.Close()
+		if _, err := io.Copy(df, sf); err != nil {
+			return err
+		}
+
+		return nil
+	})
+
+}
+
 func build(ioConfig *IOConfig, config *config.Config, log *log.Logger) (*Result, error) {
 	storage := files.NewWriter(ioConfig.Destination, log, &files.Options{
 		Compress: !ioConfig.Development,
@@ -46,7 +81,7 @@ func build(ioConfig *IOConfig, config *config.Config, log *log.Logger) (*Result,
 		Hashes: make([]string, 0),
 	}
 
-	err := storage.CopyRecursive(joinSource("static"))
+	err := copyRecursive(storage, joinSource("static"))
 	if err != nil {
 		return nil, errors.WithMessage(err, "could not copy static files")
 	}