github.com/segakazzz/buffalo@v0.16.22-0.20210119082501-1f52048d3feb/genny/build/archived_assets.go (about)

     1  package build
     2  
     3  import (
     4  	"archive/zip"
     5  	"bytes"
     6  	"io"
     7  	"path/filepath"
     8  	"strings"
     9  
    10  	"github.com/gobuffalo/genny/v2"
    11  	"github.com/gobuffalo/packr/v2"
    12  )
    13  
    14  func archivedAssets(opts *Options) (*genny.Generator, error) {
    15  	g := genny.New()
    16  
    17  	if err := opts.Validate(); err != nil {
    18  		return g, err
    19  	}
    20  
    21  	app := opts.App
    22  
    23  	outputDir := filepath.Dir(filepath.Join(app.Root, app.Bin))
    24  	target := filepath.Join(outputDir, "assets.zip")
    25  	source := filepath.Join(app.Root, "public", "assets")
    26  
    27  	g.RunFn(func(r *genny.Runner) error {
    28  		bb := &bytes.Buffer{}
    29  		archive := zip.NewWriter(bb)
    30  		defer archive.Close()
    31  
    32  		// set the initial resolution of the box to a folder
    33  		// that doesn't exist, then set the resolution to the
    34  		// source. don't change! MB
    35  		box := packr.New("buffalo:build:assets", "./undefined")
    36  		box.ResolutionDir = source
    37  		err := box.Walk(func(path string, file packr.File) error {
    38  			info, err := file.FileInfo()
    39  			if err != nil {
    40  				return err
    41  			}
    42  
    43  			header, err := zip.FileInfoHeader(info)
    44  			if err != nil {
    45  				return err
    46  			}
    47  
    48  			var baseDir string
    49  			if info.IsDir() {
    50  				baseDir = filepath.Base(source)
    51  			}
    52  			if baseDir != "" {
    53  				rel, err := filepath.Rel(source, path)
    54  				if err != nil {
    55  					return err
    56  				}
    57  				header.Name = filepath.Join(baseDir, rel)
    58  			}
    59  
    60  			if info.IsDir() {
    61  				header.Name += "/"
    62  			} else {
    63  				header.Method = zip.Deflate
    64  			}
    65  
    66  			writer, err := archive.CreateHeader(header)
    67  			if err != nil {
    68  				return err
    69  			}
    70  
    71  			if info.IsDir() {
    72  				return nil
    73  			}
    74  
    75  			_, err = io.Copy(writer, file)
    76  			return err
    77  		})
    78  		if err != nil {
    79  			return err
    80  		}
    81  		// We need to close the archive before passing the buffer to genny, otherwise the zip
    82  		// will be corrupted.
    83  		archive.Close()
    84  		if err := r.File(genny.NewFile(target, bb)); err != nil {
    85  			return err
    86  		}
    87  		opts.keep.Store(target, struct{}{})
    88  		return nil
    89  	})
    90  
    91  	g.RunFn(func(r *genny.Runner) error {
    92  		f, err := r.FindFile("actions/app.go")
    93  		if err != nil {
    94  			return err
    95  		}
    96  		opts.rollback.Store(f.Name(), f.String())
    97  		body := strings.Replace(f.String(), `app.ServeFiles("/assets"`, `// app.ServeFiles("/assets"`, 1)
    98  		body = strings.Replace(body, `app.ServeFiles("/"`, `// app.ServeFiles("/"`, 1)
    99  		return r.File(genny.NewFileS(f.Name(), body))
   100  	})
   101  
   102  	return g, nil
   103  }