github.com/sotirispl/buffalo@v0.11.1/generators/newapp/new.go (about)

     1  package newapp
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"os/exec"
     7  	"path/filepath"
     8  	"strings"
     9  
    10  	"github.com/gobuffalo/buffalo/generators"
    11  	"github.com/gobuffalo/buffalo/generators/assets/standard"
    12  	"github.com/gobuffalo/buffalo/generators/assets/webpack"
    13  	"github.com/gobuffalo/buffalo/generators/docker"
    14  	"github.com/gobuffalo/buffalo/generators/refresh"
    15  	"github.com/gobuffalo/buffalo/generators/soda"
    16  	"github.com/gobuffalo/envy"
    17  	"github.com/gobuffalo/makr"
    18  	"github.com/gobuffalo/packr"
    19  	"github.com/pkg/errors"
    20  )
    21  
    22  // Run returns a generator to create a new application
    23  func (a Generator) Run(root string, data makr.Data) error {
    24  	g := makr.New()
    25  
    26  	if a.AsAPI {
    27  		defer os.RemoveAll(filepath.Join(a.Root, "templates"))
    28  		defer os.RemoveAll(filepath.Join(a.Root, "locales"))
    29  		defer os.RemoveAll(filepath.Join(a.Root, "public"))
    30  	}
    31  	if a.Force {
    32  		os.RemoveAll(a.Root)
    33  	}
    34  
    35  	g.Add(makr.NewCommand(makr.GoGet("golang.org/x/tools/cmd/goimports", "-u")))
    36  	if a.WithDep {
    37  		g.Add(makr.NewCommand(makr.GoGet("github.com/golang/dep/cmd/dep", "-u")))
    38  	}
    39  
    40  	files, err := generators.FindByBox(packr.NewBox("../newapp/templates"))
    41  	if err != nil {
    42  		return errors.WithStack(err)
    43  	}
    44  
    45  	for _, f := range files {
    46  		if !a.AsAPI {
    47  			g.Add(makr.NewFile(f.WritePath, f.Body))
    48  			continue
    49  		}
    50  
    51  		if strings.Contains(f.WritePath, "locales") || strings.Contains(f.WritePath, "templates") || strings.Contains(f.WritePath, "public") {
    52  			continue
    53  		}
    54  
    55  		g.Add(makr.NewFile(f.WritePath, f.Body))
    56  	}
    57  
    58  	data["name"] = a.Name
    59  	if err := refresh.Run(root, data); err != nil {
    60  		return errors.WithStack(err)
    61  	}
    62  
    63  	a.setupCI(g, data)
    64  
    65  	if err := a.setupWebpack(root, data); err != nil {
    66  		return errors.WithStack(err)
    67  	}
    68  
    69  	if err := a.setupPop(root, data); err != nil {
    70  		return errors.WithStack(err)
    71  	}
    72  
    73  	if err := a.setupDocker(root, data); err != nil {
    74  		return errors.WithStack(err)
    75  	}
    76  
    77  	g.Add(makr.NewCommand(a.goGet()))
    78  
    79  	g.Add(makr.Func{
    80  		Runner: func(root string, data makr.Data) error {
    81  			g.Fmt(root)
    82  			return nil
    83  		},
    84  	})
    85  
    86  	a.setupVCS(g)
    87  
    88  	data["opts"] = a
    89  	return g.Run(root, data)
    90  }
    91  
    92  func (a Generator) setupVCS(g *makr.Generator) {
    93  	if a.VCS != "git" && a.VCS != "bzr" {
    94  		return
    95  	}
    96  	// Execute git or bzr case (same CLI API)
    97  	if _, err := exec.LookPath(a.VCS); err != nil {
    98  		return
    99  	}
   100  
   101  	// Create .gitignore or .bzrignore
   102  	g.Add(makr.NewFile(fmt.Sprintf(".%signore", a.VCS), nVCSIgnore))
   103  	g.Add(makr.NewCommand(exec.Command(a.VCS, "init")))
   104  	args := []string{"add", "."}
   105  	if a.VCS == "bzr" {
   106  		// Ensure Bazaar is as quiet as Git
   107  		args = append(args, "-q")
   108  	}
   109  	g.Add(makr.NewCommand(exec.Command(a.VCS, args...)))
   110  	g.Add(makr.NewCommand(exec.Command(a.VCS, "commit", "-q", "-m", "Initial Commit")))
   111  }
   112  
   113  func (a Generator) setupDocker(root string, data makr.Data) error {
   114  	if a.Docker == "none" {
   115  		return nil
   116  	}
   117  
   118  	o := docker.New()
   119  	o.App = a.App
   120  	o.Version = a.Version
   121  	if err := o.Run(root, data); err != nil {
   122  		return errors.WithStack(err)
   123  	}
   124  
   125  	return nil
   126  }
   127  
   128  func (a Generator) setupPop(root string, data makr.Data) error {
   129  	if !a.WithPop {
   130  		return nil
   131  	}
   132  
   133  	sg := soda.New()
   134  	sg.App = a.App
   135  	sg.Dialect = a.DBType
   136  	data["appPath"] = a.Root
   137  	data["name"] = a.Name.File()
   138  
   139  	if err := sg.Run(root, data); err != nil {
   140  		return errors.WithStack(err)
   141  	}
   142  
   143  	return nil
   144  }
   145  
   146  func (a Generator) setupWebpack(root string, data makr.Data) error {
   147  	if a.AsAPI {
   148  		return nil
   149  	}
   150  
   151  	if a.WithWebpack {
   152  		w := webpack.New()
   153  		w.App = a.App
   154  		w.Bootstrap = a.Bootstrap
   155  		if err := w.Run(root, data); err != nil {
   156  			return errors.WithStack(err)
   157  		}
   158  
   159  		return nil
   160  	}
   161  
   162  	if err := standard.Run(root, data); err != nil {
   163  		return errors.WithStack(err)
   164  	}
   165  
   166  	return nil
   167  }
   168  
   169  func (a Generator) setupCI(g *makr.Generator, data makr.Data) {
   170  
   171  	switch a.CIProvider {
   172  	case "travis":
   173  		g.Add(makr.NewFile(".travis.yml", nTravis))
   174  	case "gitlab-ci":
   175  		if a.WithPop {
   176  			if a.DBType == "postgres" {
   177  				data["testDbUrl"] = "postgres://postgres:postgres@postgres:5432/" + a.Name.File() + "_test?sslmode=disable"
   178  			} else if a.DBType == "mysql" {
   179  				data["testDbUrl"] = "mysql://root:root@(mysql:3306)/" + a.Name.File() + "_test"
   180  			} else {
   181  				data["testDbUrl"] = ""
   182  			}
   183  			g.Add(makr.NewFile(".gitlab-ci.yml", nGitlabCi))
   184  			break
   185  		}
   186  
   187  		g.Add(makr.NewFile(".gitlab-ci.yml", nGitlabCiNoPop))
   188  	}
   189  }
   190  
   191  func (a Generator) goGet() *exec.Cmd {
   192  	cd, _ := os.Getwd()
   193  	defer os.Chdir(cd)
   194  	os.Chdir(a.Root)
   195  	if a.WithDep {
   196  		if _, err := exec.LookPath("dep"); err == nil {
   197  			return exec.Command("dep", "init")
   198  		}
   199  	}
   200  	appArgs := []string{"get", "-t"}
   201  	if a.Verbose {
   202  		appArgs = append(appArgs, "-v")
   203  	}
   204  	appArgs = append(appArgs, "./...")
   205  	return exec.Command(envy.Get("GO_BIN", "go"), appArgs...)
   206  }
   207  
   208  const nTravis = `language: go
   209  
   210  go:
   211    - 1.8.x
   212  
   213  env:
   214    - GO_ENV=test
   215  
   216  {{ if eq .opts.DBType "postgres" -}}
   217  services:
   218    - postgresql
   219  {{- end }}
   220  
   221  before_script:
   222  {{- if eq .opts.DBType "postgres" }}
   223    - psql -c 'create database {{.opts.Name.File}}_test;' -U postgres
   224  {{- end }}
   225    - mkdir -p $TRAVIS_BUILD_DIR/public/assets
   226  
   227  go_import_path: {{.opts.PackagePkg}}
   228  
   229  install:
   230    - go get github.com/gobuffalo/buffalo/buffalo
   231  {{- if .opts.WithDep }}
   232    - go get github.com/golang/dep/cmd/dep
   233    - dep ensure
   234  {{- else }}
   235    - go get $(go list ./... | grep -v /vendor/)
   236  {{- end }}
   237  
   238  script: buffalo test
   239  `
   240  
   241  const nGitlabCi = `before_script:
   242    - ln -s /builds /go/src/$(echo "{{.opts.PackagePkg}}" | cut -d "/" -f1)
   243    - cd /go/src/{{.opts.PackagePkg}}
   244    - mkdir -p public/assets
   245    - go get -u github.com/gobuffalo/buffalo/buffalo
   246  {{- if .opts.WithDep }}
   247    - go get github.com/golang/dep/cmd/dep
   248    - dep ensure
   249  {{- else }}
   250    - go get -t -v ./...
   251  {{- end }}
   252    - export PATH="$PATH:$GOPATH/bin"
   253  
   254  stages:
   255    - test
   256  
   257  .test-vars: &test-vars
   258    variables:
   259      GO_ENV: "test"
   260  {{- if eq .opts.DBType "postgres" }}
   261      POSTGRES_DB: "{{.opts.Name.File}}_test"
   262  {{- else if eq .opts.DBType "mysql" }}
   263      MYSQL_DATABASE: "{{.opts.Name.File}}_test"
   264      MYSQL_ROOT_PASSWORD: "root"
   265  {{- end }}
   266      TEST_DATABASE_URL: "{{.testDbUrl}}"
   267  
   268  # Golang version choice helper
   269  .use-golang-image: &use-golang-latest
   270    image: golang:latest
   271  
   272  .use-golang-image: &use-golang-1-8
   273    image: golang:1.8
   274  
   275  test:latest:
   276    <<: *use-golang-latest
   277    <<: *test-vars
   278    stage: test
   279    services:
   280  {{- if eq .opts.DBType "mysql" }}
   281      - mysql:latest
   282  {{- else if eq .opts.DBType "postgres" }}
   283      - postgres:latest
   284  {{- end }}
   285    script:
   286      - buffalo test
   287  
   288  test:1.8:
   289    <<: *use-golang-1-8
   290    <<: *test-vars
   291    stage: test
   292    services:
   293  {{- if eq .opts.DBType "mysql" }}
   294      - mysql:latest
   295  {{- else if eq .opts.DBType "postgres" }}
   296      - postgres:latest
   297  {{- end }}
   298    script:
   299      - buffalo test
   300  `
   301  
   302  const nGitlabCiNoPop = `before_script:
   303    - ln -s /builds /go/src/$(echo "{{.opts.PackagePkg}}" | cut -d "/" -f1)
   304    - cd /go/src/{{.opts.PackagePkg}}
   305    - mkdir -p public/assets
   306    - go get -u github.com/gobuffalo/buffalo/buffalo
   307  {{- if .opts.WithDep }}
   308    - go get github.com/golang/dep/cmd/dep
   309    - dep ensure
   310  {{- else }}
   311    - go get -t -v ./...
   312  {{- end }}
   313    - export PATH="$PATH:$GOPATH/bin"
   314  
   315  stages:
   316    - test
   317  
   318  .test-vars: &test-vars
   319    variables:
   320      GO_ENV: "test"
   321  
   322  # Golang version choice helper
   323  .use-golang-image: &use-golang-latest
   324    image: golang:latest
   325  
   326  .use-golang-image: &use-golang-1-8
   327    image: golang:1.8
   328  
   329  test:latest:
   330    <<: *use-golang-latest
   331    <<: *test-vars
   332    stage: test
   333    script:
   334      - buffalo test
   335  
   336  test:1.8:
   337    <<: *use-golang-1-8
   338    <<: *test-vars
   339    stage: test
   340    script:
   341      - buffalo test
   342  `
   343  
   344  const nVCSIgnore = `vendor/
   345  **/*.log
   346  **/*.sqlite
   347  .idea/
   348  bin/
   349  tmp/
   350  node_modules/
   351  .sass-cache/
   352  *-packr.go
   353  public/assets/
   354  {{ .opts.Name.File }}
   355  .vscode/
   356  .grifter/
   357  .env
   358  `