github.com/gobuffalo/buffalo-cli/v2@v2.0.0-alpha.15.0.20200919213536-a7350c8e6799/cli/internal/plugins/webpack/build/archive.go (about)

     1  package build
     2  
     3  import (
     4  	"archive/zip"
     5  	"context"
     6  	"io"
     7  	"os"
     8  	"path/filepath"
     9  	"strings"
    10  
    11  	"github.com/gobuffalo/plugins"
    12  )
    13  
    14  func (a *Builder) archive(ctx context.Context, root string, args []string) error {
    15  	if !a.extract {
    16  		return nil
    17  	}
    18  
    19  	outputDir := a.extractTo
    20  	if len(a.extractTo) == 0 {
    21  		outputDir = "bin"
    22  	}
    23  	outputDir = filepath.Join(root, outputDir)
    24  	os.MkdirAll(outputDir, 0755)
    25  
    26  	target := filepath.Join(outputDir, "webpack.zip")
    27  	source := filepath.Join(root, "public", "webpack")
    28  
    29  	f, err := os.Create(target)
    30  	if err != nil {
    31  		return plugins.Wrap(a, err)
    32  	}
    33  	defer f.Close()
    34  
    35  	archive := zip.NewWriter(f)
    36  	defer archive.Close()
    37  	err = filepath.Walk(source, func(path string, info os.FileInfo, err error) error {
    38  		if err != nil {
    39  			return err
    40  		}
    41  		header, err := zip.FileInfoHeader(info)
    42  		if err != nil {
    43  			return err
    44  		}
    45  
    46  		header.Name = strings.TrimPrefix(path, source)
    47  		header.Name = strings.TrimPrefix(header.Name, string(filepath.Separator))
    48  
    49  		if info.IsDir() {
    50  			header.Name += "/"
    51  		} else {
    52  			header.Method = zip.Deflate
    53  		}
    54  
    55  		writer, err := archive.CreateHeader(header)
    56  		if err != nil {
    57  			return err
    58  		}
    59  
    60  		if info.IsDir() {
    61  			return nil
    62  		}
    63  
    64  		file, err := os.Open(path)
    65  		if err != nil {
    66  			return err
    67  		}
    68  		defer file.Close()
    69  
    70  		_, err = io.Copy(writer, file)
    71  		if err != nil {
    72  			return err
    73  		}
    74  		return nil
    75  	})
    76  
    77  	return plugins.Wrap(a, err)
    78  }