From 46253f721b11cd7f25e29729803a6d3b165e0ffb Mon Sep 17 00:00:00 2001 From: Mark Bates Date: Tue, 24 Dec 2019 09:30:09 -0500 Subject: [PATCH] reverts v0.5.x fixes #36 (#37) --- Makefile | 4 +- depgen/ensure.go | 29 +++++++++ depgen/init.go | 28 ++++++++ depgen/init_test.go | 63 ++++++++++++++++++ depgen/install.go | 22 +++++++ depgen/install_test.go | 42 ++++++++++++ depgen/update.go | 28 ++++++++ depgen/version.go | 4 ++ example_test.go | 94 --------------------------- genny/new/new_test.go | 64 +++++++++--------- genny/new/options.go | 9 +-- genny/new/options_test.go | 2 +- gitgen/version.go | 4 ++ go.mod | 7 +- go.sum | 8 +-- gogen/get.go | 24 +++++++ gogen/get_test.go | 28 ++++++++ gogen/gomods/gomods.go | 28 ++++++++ gogen/gomods/gomods_test.go | 1 + gogen/gomods/init.go | 62 ++++++++++++++++++ gogen/gomods/init_test.go | 125 ++++++++++++++++++++++++++++++++++++ gogen/gomods/tidy.go | 25 ++++++++ gogen/package.go | 21 ++++++ gogen/package_test.go | 39 +++++++++++ gogen/version.go | 4 ++ helpers.go | 6 ++ version.go | 2 +- 27 files changed, 631 insertions(+), 142 deletions(-) create mode 100644 depgen/ensure.go create mode 100644 depgen/init.go create mode 100644 depgen/init_test.go create mode 100644 depgen/install.go create mode 100644 depgen/install_test.go create mode 100644 depgen/update.go create mode 100644 depgen/version.go create mode 100644 gitgen/version.go create mode 100644 gogen/get.go create mode 100644 gogen/get_test.go create mode 100644 gogen/gomods/gomods.go create mode 100644 gogen/gomods/gomods_test.go create mode 100644 gogen/gomods/init.go create mode 100644 gogen/gomods/init_test.go create mode 100644 gogen/gomods/tidy.go create mode 100644 gogen/package.go create mode 100644 gogen/package_test.go create mode 100644 gogen/version.go diff --git a/Makefile b/Makefile index 3e6f485..f4a4cf7 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,8 @@ TAGS ?= "" +GO_BIN ?= "go" install: packr - cd ./genny && go install -tags ${TAGS} -v . + go install -tags ${TAGS} -v ./genny make tidy tidy: @@ -16,6 +17,5 @@ test: packr make tidy packr: - go get github.com/gobuffalo/packr/v2/packr2 packr2 make tidy diff --git a/depgen/ensure.go b/depgen/ensure.go new file mode 100644 index 0000000..71d0cf3 --- /dev/null +++ b/depgen/ensure.go @@ -0,0 +1,29 @@ +package depgen + +import ( + "os/exec" + + "github.com/gobuffalo/genny" +) + +func Ensure(verbose bool) (*genny.Generator, error) { + g := genny.New() + + var args []string + if verbose { + args = append(args, "-v") + } + + id, err := InstallDep(args...) + if err != nil { + return g, err + } + g.Merge(id) + + cmd := exec.Command("dep", "ensure") + if verbose { + cmd.Args = append(cmd.Args, args...) + } + g.Command(cmd) + return g, nil +} diff --git a/depgen/init.go b/depgen/init.go new file mode 100644 index 0000000..4ea7391 --- /dev/null +++ b/depgen/init.go @@ -0,0 +1,28 @@ +package depgen + +import ( + "os/exec" + + "github.com/gobuffalo/genny" +) + +func Init(path string, verbose bool) (*genny.Generator, error) { + g := genny.New() + var args []string + if verbose { + args = append(args, "-v") + } + + id, err := InstallDep(args...) + if err != nil { + return g, err + } + g.Merge(id) + + cmd := exec.Command("dep", "init") + if verbose { + cmd.Args = append(cmd.Args, args...) + } + g.Command(cmd) + return g, nil +} diff --git a/depgen/init_test.go b/depgen/init_test.go new file mode 100644 index 0000000..721844c --- /dev/null +++ b/depgen/init_test.go @@ -0,0 +1,63 @@ +package depgen + +import ( + "os" + "os/exec" + "strings" + "testing" + + "github.com/gobuffalo/genny" + "github.com/gobuffalo/genny/gentest" + "github.com/stretchr/testify/require" +) + +func Test_Init_WithDep(t *testing.T) { + r := require.New(t) + + run := gentest.NewRunner() + run.LookPathFn = func(s string) (string, error) { + if s == "dep" { + return "dep", nil + } + return exec.LookPath(s) + } + + err := run.WithNew(Init("", false)) + r.NoError(err) + + r.NoError(run.Run()) + + res := run.Results() + + r.Len(res.Commands, 1) + + c := res.Commands[0] + r.Equal("dep init", strings.Join(c.Args, " ")) +} + +func Test_Init_WithoutDep(t *testing.T) { + r := require.New(t) + + run := gentest.NewRunner() + run.LookPathFn = func(s string) (string, error) { + if s == "dep" { + return "", os.ErrNotExist + } + return exec.LookPath(s) + } + + err := run.WithNew(Init("", false)) + r.NoError(err) + + r.NoError(run.Run()) + + res := run.Results() + + r.Len(res.Commands, 2) + + c := res.Commands[0] + r.Equal(genny.GoBin()+" get github.com/golang/dep/cmd/dep", strings.Join(c.Args, " ")) + + c = res.Commands[1] + r.Equal("dep init", strings.Join(c.Args, " ")) +} diff --git a/depgen/install.go b/depgen/install.go new file mode 100644 index 0000000..877ae16 --- /dev/null +++ b/depgen/install.go @@ -0,0 +1,22 @@ +package depgen + +import ( + "os/exec" + + "github.com/gobuffalo/genny" +) + +func InstallDep(args ...string) (*genny.Generator, error) { + g := genny.New() + g.RunFn(func(r *genny.Runner) error { + if _, err := r.LookPath("dep"); err == nil { + return nil + } + + args = append([]string{"get"}, args...) + args = append(args, "github.com/golang/dep/cmd/dep") + c := exec.Command(genny.GoBin(), args...) + return r.Exec(c) + }) + return g, nil +} diff --git a/depgen/install_test.go b/depgen/install_test.go new file mode 100644 index 0000000..48682ce --- /dev/null +++ b/depgen/install_test.go @@ -0,0 +1,42 @@ +package depgen + +import ( + "errors" + "testing" + + "github.com/gobuffalo/envy" + "github.com/gobuffalo/genny/gentest" + "github.com/stretchr/testify/require" +) + +func Test_InstallDep_NotInstalled(t *testing.T) { + envy.Set("GO_BIN", "go") + r := require.New(t) + + run := gentest.NewRunner() + run.LookPathFn = func(s string) (string, error) { + return s, errors.New("couldn't find dep") + } + run.WithNew(InstallDep()) + r.NoError(run.Run()) + + res := run.Results() + + cmds := []string{"go get github.com/golang/dep/cmd/dep"} + r.Len(res.Commands, len(cmds)) +} + +func Test_InstallDep_Installed(t *testing.T) { + envy.Set("GO_BIN", "go") + r := require.New(t) + + run := gentest.NewRunner() + run.LookPathFn = func(s string) (string, error) { + return s, nil + } + run.WithNew(InstallDep()) + r.NoError(run.Run()) + + res := run.Results() + r.Len(res.Commands, 0) +} diff --git a/depgen/update.go b/depgen/update.go new file mode 100644 index 0000000..b3e1c0d --- /dev/null +++ b/depgen/update.go @@ -0,0 +1,28 @@ +package depgen + +import ( + "os/exec" + + "github.com/gobuffalo/genny" +) + +func Update(verbose bool) (*genny.Generator, error) { + g := genny.New() + var args []string + if verbose { + args = append(args, "-v") + } + + id, err := InstallDep(args...) + if err != nil { + return g, err + } + g.Merge(id) + + cmd := exec.Command("dep", "ensure") + args = append(args, "-update") + if verbose { + cmd.Args = append(cmd.Args, args...) + } + return g, nil +} diff --git a/depgen/version.go b/depgen/version.go new file mode 100644 index 0000000..d25173a --- /dev/null +++ b/depgen/version.go @@ -0,0 +1,4 @@ +package depgen + +// Version of depgen +const Version = "v0.2.0" diff --git a/example_test.go b/example_test.go index 92c41f1..32bd16d 100644 --- a/example_test.go +++ b/example_test.go @@ -1,95 +1 @@ package genny_test - -// // exampleLogger just cleans up variable log content -// // such as GOPATH, step names, etc.... -// // without this Go Example tests won't work. -// func exampleLogger(l *gentest.Logger) genny.Logger { -// l.CloseFn = func() error { -// s := l.Stream.String() -// c := build.Default -// for _, src := range c.SrcDirs() { -// s = strings.Replace(s, src, "/go/src", -1) -// } -// s = strings.Replace(s, "\\", "/", -1) -// -// for i, line := range strings.Split(s, "\n") { -// if strings.Contains(line, "Step:") { -// s = strings.Replace(s, line, fmt.Sprintf("[DEBU] Step: %d", i+1), 1) -// } -// } -// fmt.Print(s) -// return nil -// } -// return l -// } -// -// func ExampleGenerator_withCommand() { -// // create a new `*genny.Generator` -// g := genny.New() -// -// g.Command(exec.Command("go", "version")) -// -// // create a new `*genny.Runner` -// r := genny.NewRunner(context.Background()) -// -// // add a new logger to clean and dump output -// // for the example tests -// r.Logger = exampleLogger(gentest.NewLogger()) -// -// // add the generator to the `*genny.Runner`. -// r.With(g) -// -// // run the runner -// if err := r.Run(); err != nil { -// log.Fatal(err) -// } -// // Output: -// // [DEBU] Step: 1 -// // [DEBU] Chdir: /go/src/github.com/gobuffalo/genny -// // [DEBU] Exec: go version -// } -// -// func ExampleGenerator_withFile() { -// // create a new `*genny.Generator` -// g := genny.New() -// -// // add a file named `index.html` that has a body of `Hello\n` -// // to the generator -// g.File(genny.NewFileS("index.html", "Hello\n")) -// -// // create a new `*genny.Runner` -// r := genny.NewRunner(context.Background()) -// -// // add a new logger to clean and dump output -// // for the example tests -// r.Logger = exampleLogger(gentest.NewLogger()) -// -// // add the generator to the `*genny.Runner`. -// r.With(g) -// -// // run the runner -// if err := r.Run(); err != nil { -// log.Fatal(err) -// } -// // Output: -// // [DEBU] Step: 1 -// // [DEBU] Chdir: /go/src/github.com/gobuffalo/genny -// // [DEBU] File: /go/src/github.com/gobuffalo/genny/index.html -// } -// -// func ExampleRunner() { -// // create a new `*genny.Runner` -// r := genny.NewRunner(context.Background()) -// -// // add a new logger to clean and dump output -// // for the example tests -// r.Logger = exampleLogger(gentest.NewLogger()) -// -// // add the generator(s) to the `*genny.Runner`. -// // r.With(g) -// -// // run the runner -// if err := r.Run(); err != nil { -// log.Fatal(err) -// } -// } diff --git a/genny/new/new_test.go b/genny/new/new_test.go index 8581b19..3585ae7 100644 --- a/genny/new/new_test.go +++ b/genny/new/new_test.go @@ -5,50 +5,54 @@ import ( "testing" "github.com/gobuffalo/genny" + "github.com/gobuffalo/genny/gogen/gomods" "github.com/stretchr/testify/require" ) func Test_New(t *testing.T) { r := require.New(t) - g, err := New(&Options{ - Name: "Foo", - Prefix: "bar", - }) - r.NoError(err) + gomods.Disable(func() error { + g, err := New(&Options{ + Name: "Foo", + Prefix: "bar", + }) + r.NoError(err) - run := genny.DryRunner(context.Background()) - run.With(g) + run := genny.DryRunner(context.Background()) + run.With(g) - r.NoError(run.Run()) + r.NoError(run.Run()) - res := run.Results() + res := run.Results() - r.Len(res.Commands, 0) - r.Len(res.Files, 5) + r.Len(res.Commands, 0) + r.Len(res.Files, 5) - f := res.Files[0] - r.Equal("bar/foo/foo.go", f.Name()) - body := f.String() - r.Contains(body, "package foo") - r.Contains(body, "../foo/templates") + f := res.Files[0] + r.Equal("bar/foo/foo.go", f.Name()) + body := f.String() + r.Contains(body, "package foo") + r.Contains(body, "../foo/templates") - f = res.Files[1] - r.Equal("bar/foo/foo_test.go", f.Name()) - body = f.String() - r.Contains(body, "package foo") + f = res.Files[1] + r.Equal("bar/foo/foo_test.go", f.Name()) + body = f.String() + r.Contains(body, "package foo") - f = res.Files[2] - r.Equal("bar/foo/options.go", f.Name()) - body = f.String() - r.Contains(body, "package foo") + f = res.Files[2] + r.Equal("bar/foo/options.go", f.Name()) + body = f.String() + r.Contains(body, "package foo") - f = res.Files[3] - r.Equal("bar/foo/options_test.go", f.Name()) - body = f.String() - r.Contains(body, "package foo") + f = res.Files[3] + r.Equal("bar/foo/options_test.go", f.Name()) + body = f.String() + r.Contains(body, "package foo") - f = res.Files[4] - r.Equal("bar/foo/templates/example.txt", f.Name()) + f = res.Files[4] + r.Equal("bar/foo/templates/example.txt", f.Name()) + return nil + }) } diff --git a/genny/new/options.go b/genny/new/options.go index 03174b4..f5ba889 100644 --- a/genny/new/options.go +++ b/genny/new/options.go @@ -3,8 +3,6 @@ package new import ( "errors" "path" - - "github.com/gobuffalo/here" ) type Options struct { @@ -18,13 +16,8 @@ func (opts *Options) Validate() error { if len(opts.Name) == 0 { return errors.New("you must provide a Name") } - if len(opts.BoxName) == 0 { - info, err := here.Current() - if err != nil { - return err - } - opts.BoxName = path.Join(info.ImportPath, opts.Prefix, opts.Name, "templates") + opts.BoxName = path.Join(opts.Prefix, opts.Name, "templates") } return nil } diff --git a/genny/new/options_test.go b/genny/new/options_test.go index 43fcce3..6e120dc 100644 --- a/genny/new/options_test.go +++ b/genny/new/options_test.go @@ -15,5 +15,5 @@ func Test_Options(t *testing.T) { opts.Name = "foo" r.NoError(opts.Validate()) - r.Equal("github.com/gobuffalo/genny/genny/new/foo/templates", opts.BoxName) + r.Equal("foo/templates", opts.BoxName) } diff --git a/gitgen/version.go b/gitgen/version.go new file mode 100644 index 0000000..0bcca25 --- /dev/null +++ b/gitgen/version.go @@ -0,0 +1,4 @@ +package gitgen + +// Version of gitgen +const Version = "v0.0.1" diff --git a/go.mod b/go.mod index 65faf63..8345736 100644 --- a/go.mod +++ b/go.mod @@ -3,13 +3,16 @@ module github.com/gobuffalo/genny go 1.13 require ( + github.com/gobuffalo/envy v1.8.1 + github.com/gobuffalo/flect v0.2.0 github.com/gobuffalo/helpers v0.5.0 // indirect + github.com/gobuffalo/here v0.6.0 github.com/gobuffalo/logger v1.0.3 github.com/gobuffalo/packd v0.3.0 github.com/gobuffalo/packr/v2 v2.7.1 github.com/gobuffalo/plush v3.8.3+incompatible github.com/sirupsen/logrus v1.4.2 + github.com/spf13/cobra v0.0.5 github.com/stretchr/testify v1.4.0 - golang.org/x/tools v0.0.0-20191223211602-7bd96bd5972d - gopkg.in/yaml.v2 v2.2.7 // indirect + golang.org/x/tools v0.0.0-20191224055732-dd894d0a8a40 ) diff --git a/go.sum b/go.sum index 3eaee8a..11a4bfc 100644 --- a/go.sum +++ b/go.sum @@ -21,6 +21,8 @@ github.com/gobuffalo/github_flavored_markdown v1.1.0 h1:8Zzj4fTRl/OP2R7sGerzSf6g github.com/gobuffalo/github_flavored_markdown v1.1.0/go.mod h1:TSpTKWcRTI0+v7W3x8dkSKMLJSUpuVitlptCkpeY8ic= github.com/gobuffalo/helpers v0.5.0 h1:w8SeLFxS4RL/QqwdGfYAVgdavqB2zaBaHjxUbT7z5/c= github.com/gobuffalo/helpers v0.5.0/go.mod h1:stpgxJ2C7T99NLyAxGUnYMM2zAtBk5NKQR0SIbd05j4= +github.com/gobuffalo/here v0.6.0 h1:hYrd0a6gDmWxBM4TnrGw8mQg24iSVoIkHEk7FodQcBI= +github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= github.com/gobuffalo/logger v1.0.1/go.mod h1:2zbswyIUa45I+c+FLXuWl9zSWEiVuthsk8ze5s8JvPs= github.com/gobuffalo/logger v1.0.3 h1:YaXOTHNPCvkqqA7w05A4v0k2tCdpr+sgFlgINbQ6gqc= github.com/gobuffalo/logger v1.0.3/go.mod h1:SoeejUwldiS7ZsyCBphOGURmWdwUFXs0J7TCjEhjKxM= @@ -129,8 +131,8 @@ golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20191004055002-72853e10c5a3/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191223211602-7bd96bd5972d h1:DEucfRGACbF/jTEctiYaE79hwO8XgucXOwH4k1AdNNs= -golang.org/x/tools v0.0.0-20191223211602-7bd96bd5972d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191224055732-dd894d0a8a40 h1:UyP2XDSgSc8ldYCxAK735zQxeH3Gd81sK7Iy7AoaVxk= +golang.org/x/tools v0.0.0-20191224055732-dd894d0a8a40/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -141,9 +143,7 @@ gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo= gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/gogen/get.go b/gogen/get.go new file mode 100644 index 0000000..536bebe --- /dev/null +++ b/gogen/get.go @@ -0,0 +1,24 @@ +package gogen + +import ( + "os/exec" + + "github.com/gobuffalo/genny" + "github.com/gobuffalo/genny/gogen/gomods" +) + +func Get(pkg string, args ...string) *exec.Cmd { + args = append([]string{"get"}, args...) + args = append(args, pkg) + cmd := exec.Command(genny.GoBin(), args...) + return cmd +} + +func Install(pkg string, args ...string) genny.RunFn { + return func(r *genny.Runner) error { + return gomods.Disable(func() error { + cmd := Get(pkg, args...) + return r.Exec(cmd) + }) + } +} diff --git a/gogen/get_test.go b/gogen/get_test.go new file mode 100644 index 0000000..1994939 --- /dev/null +++ b/gogen/get_test.go @@ -0,0 +1,28 @@ +package gogen + +import ( + "context" + "strings" + "testing" + + "github.com/gobuffalo/genny" + "github.com/stretchr/testify/require" +) + +func Test_Get(t *testing.T) { + r := require.New(t) + + run := genny.DryRunner(context.Background()) + + get := Get("github.com/gobuffalo/buffalo", "-v", "-u") + r.NoError(run.Exec(get)) + + res := run.Results() + r.Len(res.Commands, 1) + + c := res.Commands[0] + r.Equal(genny.GoBin()+" get -v -u github.com/gobuffalo/buffalo", strings.Join(c.Args, " ")) + + r.Len(res.Files, 0) + +} diff --git a/gogen/gomods/gomods.go b/gogen/gomods/gomods.go new file mode 100644 index 0000000..52b18c1 --- /dev/null +++ b/gogen/gomods/gomods.go @@ -0,0 +1,28 @@ +package gomods + +import ( + "errors" + + "github.com/gobuffalo/envy" + "github.com/gobuffalo/genny/internal/takeon/github.com/markbates/safe" +) + +const ENV = "GO111MODULE" + +var ErrModsOff = errors.New("go mods are turned off") + +func Force(b bool) { +} + +func On() bool { + return true +} + +func Disable(fn func() error) error { + oe := envy.Get(ENV, "off") + envy.MustSet(ENV, "off") + + err := safe.RunE(fn) + envy.MustSet(ENV, oe) + return err +} diff --git a/gogen/gomods/gomods_test.go b/gogen/gomods/gomods_test.go new file mode 100644 index 0000000..01a53fa --- /dev/null +++ b/gogen/gomods/gomods_test.go @@ -0,0 +1 @@ +package gomods diff --git a/gogen/gomods/init.go b/gogen/gomods/init.go new file mode 100644 index 0000000..5f3a0b8 --- /dev/null +++ b/gogen/gomods/init.go @@ -0,0 +1,62 @@ +package gomods + +import ( + "os" + "os/exec" + "path" + "strings" + + "github.com/gobuffalo/genny" + "github.com/gobuffalo/here" +) + +func New(name string, path string) (*genny.Group, error) { + g := &genny.Group{} + + init, err := Init(name, path) + if err != nil { + return g, err + } + g.Add(init) + + tidy, err := Tidy(path, false) + if err != nil { + return g, err + } + g.Add(tidy) + return g, nil +} + +func Init(name string, root string) (*genny.Generator, error) { + if len(root) == 0 || root == "." { + pwd, err := os.Getwd() + if err != nil { + return nil, err + } + root = pwd + } + + if len(name) == 0 { + name = path.Base(root) + if info, err := here.Dir(root); err == nil { + name = info.ImportPath + } + } + + name = strings.Replace(name, "\\", "/", -1) + name = strings.TrimPrefix(name, "/") + + g := genny.New() + g.StepName = "go:mod:init:" + name + g.RunFn(func(r *genny.Runner) error { + return r.Chdir(root, func() error { + args := []string{"mod", "init"} + if len(name) > 0 { + args = append(args, name) + } + cmd := exec.Command(genny.GoBin(), args...) + return r.Exec(cmd) + }) + }) + return g, nil +} diff --git a/gogen/gomods/init_test.go b/gogen/gomods/init_test.go new file mode 100644 index 0000000..5d0dcbd --- /dev/null +++ b/gogen/gomods/init_test.go @@ -0,0 +1,125 @@ +package gomods + +import ( + "fmt" + "testing" + + "github.com/gobuffalo/envy" + "github.com/gobuffalo/genny" + "github.com/gobuffalo/genny/gentest" + "github.com/stretchr/testify/require" +) + +func Test_New(t *testing.T) { + + table := []struct { + name string + root string + mod string + err bool + }{ + {name: "coke", root: "", mod: "coke"}, + {name: "github.com/markbates/coke", root: "", mod: "github.com/markbates/coke"}, + {name: "", root: "", mod: "github.com/gobuffalo/genny/gogen/gomods"}, + {name: "", root: "../", mod: "github.com/gobuffalo/genny/gogen"}, + } + + for _, tt := range table { + t.Run(fmt.Sprintf("%s/%s/%s", tt.name, tt.root, tt.mod), func(st *testing.T) { + r := require.New(st) + + run := gentest.NewRunner() + + gg, err := New(tt.name, tt.root) + r.NoError(err) + run.WithGroup(gg) + + err = run.Run() + if tt.err { + r.Error(err) + return + } + + r.NoError(err) + + res := run.Results() + r.Len(res.Files, 0) + r.Len(res.Commands, 2) + + c := res.Commands[0] + args := []string{genny.GoBin(), "mod", "init"} + if len(tt.mod) > 0 { + args = append(args, tt.mod) + } + r.Equal(args, c.Args) + + c = res.Commands[1] + r.Equal([]string{genny.GoBin(), "mod", "tidy"}, c.Args) + + }) + } + + envy.Temp(func() { + // envy.MustSet(ENV, "on") + // + // type ts struct { + // name string + // path string + // mod string + // } + // table := []ts{ + // {"", "", "github.com/gobuffalo/genny/gogen/gomods"}, + // {"coke", "", "coke"}, + // {"github.com\\gobuffalo\\coke", "", "github.com/gobuffalo/coke"}, + // {"", "github.com\\gobuffalo\\coke", "github.com/gobuffalo/coke"}, + // } + // + // c := build.Default + // + // for _, src := range c.SrcDirs() { + // table = append(table, ts{ + // name: "coke", + // path: src, + // mod: "coke", + // }) + // table = append(table, ts{ + // name: "coke", + // path: strings.ToLower(src), + // mod: "coke", + // }) + // table = append(table, ts{ + // name: "", + // path: filepath.Join(src, "github.com", "gobuffalo", "coke"), + // mod: "github.com/gobuffalo/coke", + // }) + // } + // + // for _, tt := range table { + // t.Run(tt.name+tt.path+tt.mod, func(st *testing.T) { + // r := require.New(st) + // + // run := gentest.NewRunner() + // + // gg, err := New(tt.name, tt.path) + // r.NoError(err) + // run.WithGroup(gg) + // + // r.NoError(run.Run()) + // res := run.Results() + // r.Len(res.Files, 0) + // r.Len(res.Commands, 2) + // + // c := res.Commands[0] + // args := []string{genny.GoBin(), "mod", "init"} + // if len(tt.mod) > 0 { + // args = append(args, tt.mod) + // } + // r.Equal(args, c.Args) + // + // c = res.Commands[1] + // r.Equal([]string{genny.GoBin(), "mod", "tidy"}, c.Args) + // }) + // } + // + }) +} diff --git a/gogen/gomods/tidy.go b/gogen/gomods/tidy.go new file mode 100644 index 0000000..b6c901f --- /dev/null +++ b/gogen/gomods/tidy.go @@ -0,0 +1,25 @@ +package gomods + +import ( + "os/exec" + + "github.com/gobuffalo/genny" +) + +func Tidy(path string, verbose bool) (*genny.Generator, error) { + g := genny.New() + g.StepName = "go:mod:tidy:" + path + g.RunFn(func(r *genny.Runner) error { + if !On() { + return nil + } + return r.Chdir(path, func() error { + cmd := exec.Command(genny.GoBin(), "mod", "tidy") + if verbose { + cmd.Args = append(cmd.Args, "-v") + } + return r.Exec(cmd) + }) + }) + return g, nil +} diff --git a/gogen/package.go b/gogen/package.go new file mode 100644 index 0000000..1225832 --- /dev/null +++ b/gogen/package.go @@ -0,0 +1,21 @@ +package gogen + +import ( + "path/filepath" + + "errors" + + "github.com/gobuffalo/genny" +) + +func PackageName(f genny.File) (string, error) { + pkg := filepath.Base(filepath.Dir(f.Name())) + pf, err := ParseFile(f) + if err == nil { + pkg = pf.Ast.Name.String() + } + if len(pkg) == 0 || pkg == "." { + return "", errors.New("could not determine package") + } + return pkg, nil +} diff --git a/gogen/package_test.go b/gogen/package_test.go new file mode 100644 index 0000000..4898a2c --- /dev/null +++ b/gogen/package_test.go @@ -0,0 +1,39 @@ +package gogen + +import ( + "strings" + "testing" + + "github.com/gobuffalo/genny" + "github.com/stretchr/testify/require" +) + +func Test_PackageName(t *testing.T) { + table := []struct { + pass bool + name string + body string + pkg string + }{ + {true, "version.go", "package foo\n", "foo"}, + {true, "foo/version.go", "package foo\n", "foo"}, + {true, "foo/version.go", "", "foo"}, + {false, "", "", ""}, + } + + for _, tt := range table { + t.Run(tt.name+"|"+tt.body, func(st *testing.T) { + r := require.New(st) + f := genny.NewFile(tt.name, strings.NewReader(tt.body)) + + pkg, err := PackageName(f) + if tt.pass { + r.NoError(err) + } else { + r.Error(err) + } + r.Equal(tt.pkg, pkg) + }) + } + +} diff --git a/gogen/version.go b/gogen/version.go new file mode 100644 index 0000000..cb160b4 --- /dev/null +++ b/gogen/version.go @@ -0,0 +1,4 @@ +package gogen + +// Version of gogen +const Version = "v0.2.0" diff --git a/helpers.go b/helpers.go index 2aae6b8..67d0c59 100644 --- a/helpers.go +++ b/helpers.go @@ -3,6 +3,8 @@ package genny import ( "path/filepath" "strings" + + "github.com/gobuffalo/envy" ) func exts(f File) []string { @@ -46,3 +48,7 @@ func StripExt(f File, ext string) File { name = strings.Replace(name, ext, "", -1) return NewFile(name, f) } + +func GoBin() string { + return envy.Get("GO_BIN", "go") +} diff --git a/version.go b/version.go index 52eecae..4e1f966 100644 --- a/version.go +++ b/version.go @@ -1,3 +1,3 @@ package genny -const Version = "v0.4.1" +var Version = ""