github.com/JarrahG/buffalocli@v0.0.0-20230801092127-b85bfd5d395a/internal/genny/fix/docker.go (about)

     1  package fix
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"html/template"
     7  
     8  	"github.com/JarrahG/buffalocli/internal/genny/docker"
     9  	"github.com/gobuffalo/genny/v2"
    10  )
    11  
    12  func FixDocker(opts *Options) genny.RunFn {
    13  	return func(r *genny.Runner) error {
    14  		if !opts.App.WithDocker {
    15  			return nil
    16  		}
    17  
    18  		fmt.Println("~~~ Checking Dockerfile ~~~")
    19  
    20  		templates, err := docker.Templates()
    21  		if err != nil {
    22  			return err
    23  		}
    24  
    25  		tmpl, err := template.New("Dockerfile").ParseFS(templates, "Dockerfile.tmpl")
    26  		if err != nil {
    27  			return err
    28  		}
    29  
    30  		dockerOpts := &docker.Options{
    31  			App: opts.App,
    32  		}
    33  		if err := dockerOpts.Validate(); err != nil {
    34  			return err
    35  		}
    36  
    37  		bb := &bytes.Buffer{}
    38  		if err := tmpl.ExecuteTemplate(bb, "Dockerfile.tmpl", map[string]interface{}{
    39  			"opts": dockerOpts,
    40  		}); err != nil {
    41  			return err
    42  		}
    43  
    44  		f, err := r.FindFile("Dockerfile")
    45  		if err != nil {
    46  			return nil
    47  		}
    48  
    49  		if string(f.String()) == bb.String() {
    50  			return nil
    51  		}
    52  
    53  		if !opts.YesToAll && !ask("Your Dockerfile is different from the latest Buffalo template.\nWould you like to replace yours with the latest template?") {
    54  			fmt.Println("\tSkipping Dockerfile")
    55  			return nil
    56  		}
    57  
    58  		if _, err := f.Write(bb.Bytes()); err != nil {
    59  			return err
    60  		}
    61  		return r.File(f)
    62  	}
    63  }