diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 72545394..d4115435 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -1,5 +1,5 @@ name: Tests -on: [push] +on: [push, pull_request] jobs: tests: diff --git a/built/app_test.go b/built/app_test.go index 7c20976b..f9a829fe 100644 --- a/built/app_test.go +++ b/built/app_test.go @@ -4,6 +4,7 @@ import ( "bytes" "context" "fmt" + "os" "strings" "testing" @@ -46,6 +47,34 @@ func Test_App_No_Args(t *testing.T) { r.True(res) } +func Test_App_No_Args_EmptyApp(t *testing.T) { + r := require.New(t) + + app := &App{} + + var args []string + ctx := context.Background() + err := app.Main(ctx, "", args) + r.NoError(err) +} + +func Test_App_Original_Args(t *testing.T) { + r := require.New(t) + + var res bool + app := &App{ + OriginalMain: func() { + res = true + }, + } + + args := []string{"--", "bob"} + ctx := context.Background() + err := app.Main(ctx, "", args) + r.NoError(err) + r.True(res) +} + func Test_App_No_Args_Fallthrough(t *testing.T) { r := require.New(t) @@ -81,6 +110,18 @@ func Test_App_With_Args_Fallthrough(t *testing.T) { r.True(res) } +func Test_App_With_Args_NoFallthrough(t *testing.T) { + r := require.New(t) + + app := &App{} + + ctx := context.Background() + root, err := os.Getwd() + r.NoError(err) + err = app.Main(ctx, root, []string{"lee", "majors"}) + r.NoError(err) +} + func Test_App_Init_Plugins(t *testing.T) { r := require.New(t) diff --git a/cli/buffalo.go b/cli/buffalo.go index 3e990ea5..f28e5004 100644 --- a/cli/buffalo.go +++ b/cli/buffalo.go @@ -40,10 +40,6 @@ type Buffalo struct { func NewFromRoot(root string) (*Buffalo, error) { b := &Buffalo{} - pfn := func() []plugins.Plugin { - return b.Plugins - } - b.Plugins = append(b.Plugins, clifix.Plugins()...) b.Plugins = append(b.Plugins, cmds.Plugins()...) b.Plugins = append(b.Plugins, fizz.Plugins()...) @@ -75,7 +71,7 @@ func NewFromRoot(root string) (*Buffalo, error) { return b.Plugins[i].PluginName() < b.Plugins[j].PluginName() }) - pfn = func() []plugins.Plugin { + pfn := func() []plugins.Plugin { return b.Plugins } diff --git a/cli/buffalo_test.go b/cli/buffalo_test.go index e49efc48..b699f2bd 100644 --- a/cli/buffalo_test.go +++ b/cli/buffalo_test.go @@ -1,12 +1,28 @@ package cli import ( + "io/ioutil" + "os" + "path/filepath" "testing" "github.com/gobuffalo/plugins" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) +func AssertPluginContained(name string, plugins plugins.Plugins) assert.Comparison { + return func() (success bool) { + success = false + for _, p := range plugins { + if p.PluginName() == name { + return true + } + } + return + } +} + func Test_Buffalo_New(t *testing.T) { r := require.New(t) @@ -16,6 +32,38 @@ func Test_Buffalo_New(t *testing.T) { r.NotEmpty(b.Plugins) } +func Test_Buffalo_New_WithFiles(t *testing.T) { + r := require.New(t) + + root, err := os.Getwd() + r.NoError(err) + + //create files + r.NoError(ioutil.WriteFile(filepath.Join(root, "package.json"), []byte(""), 0600)) + r.NoError(ioutil.WriteFile(filepath.Join(root, ".git"), []byte(""), 0600)) + r.NoError(ioutil.WriteFile(filepath.Join(root, ".bzr"), []byte(""), 0600)) + + b, err := New() + r.NoError(err) + r.NotNil(b) + r.NotEmpty(b.Plugins) + + //test for webpack builder include + r.Condition(AssertPluginContained("webpack/builder", b.Plugins)) + + r.NoError(os.Remove("package.json")) + + //test for git builder include + r.Condition(AssertPluginContained("git/versioner", b.Plugins)) + + r.NoError(os.Remove(".git")) + + //test for bzr builder include + r.Condition(AssertPluginContained("bzr", b.Plugins)) + + r.NoError(os.Remove(".bzr")) +} + func Test_Buffalo_SubCommands(t *testing.T) { r := require.New(t) diff --git a/cli/cmds/build/build_test.go b/cli/cmds/build/build_test.go index c0a8c8de..0f803ff0 100644 --- a/cli/cmds/build/build_test.go +++ b/cli/cmds/build/build_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/gobuffalo/here" + "github.com/stretchr/testify/require" ) type background string @@ -31,3 +32,14 @@ func newRef(t *testing.T, root string) here.Info { return info } + +func Test_Plugins(t *testing.T) { + r := require.New(t) + plugs := Plugins() + r.Len(plugs, 2) + for _, p := range plugs { + if p.PluginName() != "main" && p.PluginName() != "build" { + r.FailNow("should only be main and build") + } + } +} diff --git a/cli/cmds/build/cmd_test.go b/cli/cmds/build/cmd_test.go index bca859ee..f0184e64 100644 --- a/cli/cmds/build/cmd_test.go +++ b/cli/cmds/build/cmd_test.go @@ -46,6 +46,8 @@ func Test_Cmd_ScopedPlugins(t *testing.T) { &buildImporter{}, &bladeRunner{}, &packager{}, + &buildTagger{}, + &buildStdouter{}, } bc := &Cmd{ diff --git a/cli/cmds/build/find_test.go b/cli/cmds/build/find_test.go new file mode 100644 index 00000000..152e3aee --- /dev/null +++ b/cli/cmds/build/find_test.go @@ -0,0 +1,111 @@ +package build + +import ( + "testing" + + "github.com/gobuffalo/plugins" + "github.com/stretchr/testify/require" +) + +func Test_FindBuilder(t *testing.T) { + r := require.New(t) + + bb := &buildBuilder{} + plugs := []plugins.Plugin{ + &buildFlagger{}, + bb, + } + + builder := FindBuilder("buildBuilder", plugs) + r.NotNil(builder) + r.Equal(bb.PluginName(), builder.PluginName()) +} + +func Test_FindBuilder_NoBuilder(t *testing.T) { + r := require.New(t) + + plugs := []plugins.Plugin{ + &buildFlagger{}, + &buildImporter{}, + } + + builder := FindBuilder("buildBuilder", plugs) + r.Nil(builder) +} + +func Test_FindBuilder_With_Namer(t *testing.T) { + r := require.New(t) + + bn := &buildNamer{cmdName: "first"} + plugs := []plugins.Plugin{ + &buildFlagger{}, + bn, + } + + expects := []struct { + Term string + IsNil bool + IsNamer bool + }{ + {"first", false, true}, + {"second", true, false}, + {"buildNamer", false, true}, + {"third", true, false}, + {"buildBuilder", true, false}, + } + + for _, e := range expects { + builder := FindBuilder(e.Term, plugs) + if e.IsNil { + r.Nil(builder) + } else { + r.NotNil(builder) + r.Equal(bn.PluginName(), builder.PluginName()) + namer, ok := builder.(Namer) + if e.IsNamer { + r.True(ok) + r.Equal(bn.CmdName(), namer.CmdName()) + } else { + r.False(ok) + } + } + } +} + +func Test_FindBuilder_With_Aliaser(t *testing.T) { + r := require.New(t) + + ba := &buildAliaser{aliases: []string{"first", "second"}} + plugs := []plugins.Plugin{ + &buildFlagger{}, + ba, + } + + expects := []struct { + Term string + IsNil bool + IsAliaser bool + }{ + {"first", false, true}, + {"second", false, true}, + {"buildAliaser", false, true}, + {"third", true, false}, + } + + for _, expect := range expects { + builder := FindBuilder(expect.Term, plugs) + if expect.IsNil { + r.Nil(builder) + } else { + r.NotNil(builder) + r.Equal(ba.PluginName(), builder.PluginName()) + aliaser, ok := builder.(Aliaser) + if expect.IsAliaser { + r.True(ok) + r.Equal(ba.CmdAliases(), aliaser.CmdAliases()) + } else { + r.False(ok) + } + } + } +} diff --git a/cli/cmds/build/gobuild_test.go b/cli/cmds/build/gobuild_test.go index 87a0c632..30f71fd2 100644 --- a/cli/cmds/build/gobuild_test.go +++ b/cli/cmds/build/gobuild_test.go @@ -2,10 +2,12 @@ package build import ( "context" + "errors" "path/filepath" "runtime" "testing" + "github.com/gobuffalo/plugins" "github.com/stretchr/testify/require" ) @@ -129,3 +131,81 @@ func Test_Cmd_GoCmd_LDFlags(t *testing.T) { exp := []string{"go", "build", "-o", n, "-ldflags", "linky"} r.Equal(exp, cmd.Args) } + +func Test_Cmd_GoCmd_BadRoot(t *testing.T) { + r := require.New(t) + + bc := &Cmd{} + + ctx := context.Background() + cmd, err := bc.GoCmd(ctx, "") + r.Error(err) + r.Nil(cmd) +} + +func Test_Cmd_GoCmd_Tagger(t *testing.T) { + r := require.New(t) + + pfn := func() []plugins.Plugin { + return []plugins.Plugin{ + &buildTagger{}, + } + } + + bc := &Cmd{ + pluginsFn: pfn, + } + + ctx := context.Background() + cmd, err := bc.GoCmd(ctx, ".") + r.NoError(err) + r.NotNil(cmd) +} + +func Test_Cmd_GoCmd_TaggerErr(t *testing.T) { + r := require.New(t) + + pfn := func() []plugins.Plugin { + return []plugins.Plugin{ + &buildTagger{err: errors.New("Bad Tagger")}, + } + } + + bc := &Cmd{ + pluginsFn: pfn, + } + + ctx := context.Background() + cmd, err := bc.GoCmd(ctx, ".") + r.Error(err) + r.Nil(cmd) + r.Contains(err.Error(), "Bad Tagger") +} + +func Test_Cmd_GoBuild_Build_Err(t *testing.T) { + r := require.New(t) + + pfn := func() []plugins.Plugin { + return []plugins.Plugin{ + &bladeRunner{err: errors.New("Bad Runner")}, + } + } + + bc := &Cmd{ + pluginsFn: pfn, + } + + ctx := context.Background() + var args []string + err := bc.build(ctx, "", args) + r.Error(err) + if runtime.GOOS == "windows" { + r.Contains(err.Error(), "The system cannot find the path specified") + } else { + r.Contains(err.Error(), "no such file or directory") + } + + err = bc.build(ctx, ".", args) + r.Error(err) + r.Contains(err.Error(), "Bad Runner") +} diff --git a/cli/cmds/build/ifaces_test.go b/cli/cmds/build/ifaces_test.go index fd14faf8..f894fbac 100644 --- a/cli/cmds/build/ifaces_test.go +++ b/cli/cmds/build/ifaces_test.go @@ -3,6 +3,7 @@ package build import ( "context" "flag" + "io" "os/exec" "github.com/spf13/pflag" @@ -64,6 +65,9 @@ func (b *afterBuilder) PluginName() string { } func (b *afterBuilder) AfterBuild(ctx context.Context, root string, args []string, err error) error { + if b.err != nil { + return b.err + } b.args = args b.err = err return err @@ -205,3 +209,121 @@ func (b *bladeRunner) RunBuild(ctx context.Context, cmd *exec.Cmd) error { b.cmd = cmd return b.err } + +var _ Tagger = &buildTagger{} + +type buildTagger struct { + name string + tags []string + err error +} + +func (b *buildTagger) PluginName() string { + if len(b.name) == 0 { + return "buildTagger" + } + return b.name +} + +func (b *buildTagger) BuildTags(ctx context.Context, root string) ([]string, error) { + return b.tags, b.err +} + +var _ Stdouter = &buildStdouter{} + +type buildStdouter struct { + name string + writer io.Writer +} + +func (b *buildStdouter) PluginName() string { + if len(b.name) == 0 { + return "buildStdouter" + } + return b.name +} + +func (b *buildStdouter) Stdout() io.Writer { + return b.writer +} + +var _ Builder = &buildBuilder{} + +type buildBuilder struct { + name string + root string + err error +} + +func (b *buildBuilder) PluginName() string { + if len(b.name) == 0 { + return "buildBuilder" + } + return b.name +} + +func (b *buildBuilder) Build(ctx context.Context, root string, args []string) error { + b.root = root + return b.err +} + +var _ Namer = &buildNamer{} + +type buildNamer struct { + name string + cmdName string + root string + err error +} + +func (b *buildNamer) PluginName() string { + if len(b.name) == 0 { + return "buildNamer" + } + return b.name +} + +func (b *buildNamer) Build(ctx context.Context, root string, args []string) error { + b.root = root + return b.err +} + +func (b *buildNamer) CmdName() string { + return b.cmdName +} + +var _ Aliaser = &buildAliaser{} + +type buildAliaser struct { + name string + aliases []string + root string + err error +} + +func (b *buildAliaser) PluginName() string { + if len(b.name) == 0 { + return "buildAliaser" + } + return b.name +} + +func (b *buildAliaser) Build(ctx context.Context, root string, args []string) error { + b.root = root + return b.err +} + +func (b *buildAliaser) CmdAliases() []string { + return b.aliases +} + +var _ io.Writer = &badWriter{} + +type badWriter struct { + n int + err error +} + +func (bw *badWriter) Write(p []byte) (n int, err error) { + return bw.n, bw.err +} diff --git a/cli/cmds/build/main_file_test.go b/cli/cmds/build/main_file_test.go index bf9f0ce8..cc7327e1 100644 --- a/cli/cmds/build/main_file_test.go +++ b/cli/cmds/build/main_file_test.go @@ -3,11 +3,15 @@ package build import ( "bytes" "context" + "errors" + "io/ioutil" "os" "path" "path/filepath" + "runtime" "testing" + "github.com/gobuffalo/here" "github.com/gobuffalo/plugins" "github.com/stretchr/testify/require" ) @@ -23,11 +27,13 @@ func Test_MainFile_Version(t *testing.T) { r.NoError(err) r.Contains(s, `"time":`) - bc.pluginsFn = func() []plugins.Plugin { + bc.WithPlugins(func() []plugins.Plugin { return plugins.Plugins{ + &buildBuilder{}, &buildVersioner{version: "v1"}, } - } + }) + bc.HidePlugin() s, err = bc.Version(ctx, "") r.NoError(err) @@ -35,6 +41,27 @@ func Test_MainFile_Version(t *testing.T) { r.Contains(s, `"buildVersioner":"v1"`) } +func Test_MainFile_Version_Err(t *testing.T) { + r := require.New(t) + + bc := &MainFile{} + + ctx := context.Background() + + bc.WithPlugins(func() []plugins.Plugin { + return plugins.Plugins{ + &buildBuilder{}, + &buildVersioner{version: ""}, + &buildVersioner{err: errors.New("Bad Version")}, + } + }) + + s, err := bc.Version(ctx, "") + r.Error(err) + r.Contains(err.Error(), "Bad Version") + r.Equal("", s) +} + func Test_MainFile_generateNewMain(t *testing.T) { r := require.New(t) @@ -65,6 +92,20 @@ func Test_MainFile_generateNewMain(t *testing.T) { r.Contains(out, `_ "github.com/markbates/coke/actions"`) r.Contains(out, `appcli.Buffalo`) r.Contains(out, `originalMain`) + + bc = &MainFile{ + pluginsFn: func() []plugins.Plugin { + return plugs + }, + } + err = bc.generateNewMain(ctx, ref, "v1", bb) + r.NoError(err) + + out = bb.String() + r.Contains(out, `appcli "github.com/markbates/coke/cli"`) + r.Contains(out, `_ "github.com/markbates/coke/actions"`) + r.Contains(out, `appcli.Buffalo`) + r.Contains(out, `originalMain`) } func Test_MainFile_generateNewMain_noCli(t *testing.T) { @@ -98,3 +139,289 @@ func Test_MainFile_generateNewMain_noCli(t *testing.T) { r.Contains(out, `originalMain`) r.Contains(out, `cb.Main`) } + +func Test_MainFile_generateNewMain_Errs(t *testing.T) { + r := require.New(t) + + ref := newRef(t, "") + defer os.RemoveAll(filepath.Join(ref.Dir, mainBuildFile)) + + plugs := plugins.Plugins{ + &buildImporter{ + imports: []string{ + path.Join(ref.ImportPath, "actions"), + }, + err: errors.New("Bad Import"), + }, + &buildTagger{}, + } + bc := &MainFile{ + pluginsFn: func() []plugins.Plugin { + return plugs + }, + } + + ctx := context.Background() + bb := &bytes.Buffer{} + + err := bc.generateNewMain(ctx, ref, "v1", bb) + r.Error(err) + r.Contains(err.Error(), "Bad Import") + + plugs = plugins.Plugins{ + &buildImporter{ + imports: []string{ + path.Join(ref.ImportPath, "actions"), + }, + }, + &buildTagger{}, + } + bc = &MainFile{ + pluginsFn: func() []plugins.Plugin { + return plugs + }, + } + + //Bad writer + bw := &badWriter{ + err: errors.New("Bad Writer"), + } + err = bc.generateNewMain(ctx, ref, "v1", bw) + r.Error(err) + r.Contains(err.Error(), "Bad Writer") +} + +func Test_MainFile_BeforeBuild(t *testing.T) { + r := require.New(t) + + root := filepath.Join(".", "coke") + current_root, err := os.Getwd() + r.NoError(err) + + err, ref := setupProject(root, t, beforemaingofile) + defer teardownProject(root, current_root) + r.NoError(err) + + plugs := plugins.Plugins{ + &buildImporter{ + imports: []string{ + path.Join(ref.ImportPath, "actions"), + }, + }, + } + bc := &MainFile{ + pluginsFn: func() []plugins.Plugin { + return plugs + }, + withFallthroughFn: func() bool { return true }, + } + + ctx := context.Background() + var args []string + err = bc.BeforeBuild(ctx, root, args) + r.NoError(err) + + raw, err := ioutil.ReadFile("main.go") + r.NoError(err) + r.Contains(string(raw), "func originalMain()") +} + +func Test_MainFile_BeforeBuild_Err(t *testing.T) { + r := require.New(t) + + plugs := plugins.Plugins{} + bc := &MainFile{ + pluginsFn: func() []plugins.Plugin { + return plugs + }, + withFallthroughFn: func() bool { return true }, + } + + //Test not in the folder with main (i.e. this folder) + ctx := context.Background() + var args []string + err := bc.BeforeBuild(ctx, "", args) + r.Error(err) + r.Contains(err.Error(), "is not a main") + + //Test sending in a plugin with a bad version + root := filepath.Join(".", "coke") + current_root, err := os.Getwd() + r.NoError(err) + + err, _ = setupProject(root, t, beforemaingofile) + defer teardownProject(root, current_root) + r.NoError(err) + + plugs = plugins.Plugins{ + &buildVersioner{err: errors.New("Bad Versioner")}, + } + bc = &MainFile{ + pluginsFn: func() []plugins.Plugin { + return plugs + }, + withFallthroughFn: func() bool { return true }, + } + + err = bc.BeforeBuild(ctx, root, args) + r.Error(err) + r.Contains(err.Error(), "Bad Versioner") + + // Test error in generate + plugs = plugins.Plugins{ + &buildImporter{err: errors.New("Bad Importer")}, + } + bc = &MainFile{ + pluginsFn: func() []plugins.Plugin { + return plugs + }, + withFallthroughFn: func() bool { return true }, + } + + err = bc.BeforeBuild(ctx, root, args) + r.Error(err) + r.Contains(err.Error(), "Bad Importer") +} + +func Test_MainFile_AfterBuild(t *testing.T) { + r := require.New(t) + + root := filepath.Join(".", "coke") + current_root, err := os.Getwd() + r.NoError(err) + + err, _ = setupProject(root, t, aftermaingofile) + defer teardownProject(root, current_root) + r.NoError(err) + + plugs := plugins.Plugins{} + bc := &MainFile{ + pluginsFn: func() []plugins.Plugin { + return plugs + }, + withFallthroughFn: func() bool { return true }, + } + + ctx := context.Background() + var args []string + err = bc.AfterBuild(ctx, ".", args, nil) + r.NoError(err) + + raw, err := ioutil.ReadFile("main.go") + r.NoError(err) + r.Contains(string(raw), "func main()") +} + +func Test_MainFile_AfterBuild_Err(t *testing.T) { + r := require.New(t) + bc := &MainFile{} + + ctx := context.Background() + var args []string + err := bc.AfterBuild(ctx, "random1370498nc19c", args, nil) + r.Error(err) + if runtime.GOOS == "windows" { + r.Contains(err.Error(), "The system cannot find the file specified") + } else { + r.Contains(err.Error(), "no such file or directory") + } +} + +func Test_MainFile_renameMain_err(t *testing.T) { + r := require.New(t) + + root := filepath.Join(".", "coke") + current_root, err := os.Getwd() + r.NoError(err) + + err, _ = setupProject(root, t, aftermaingofile) + defer teardownProject(root, current_root) + r.NoError(err) + + // Shouldn't be able to rename in a read-only file + r.NoError(os.Chmod("main.go", 0444)) + r.NoError(os.Chdir(current_root)) + + bc := &MainFile{} + + info, err := here.Dir(root) + r.NoError(err) + err = bc.renameMain(info, "originalMain", "main") + r.Error(err) + if runtime.GOOS == "windows" { + r.Contains(err.Error(), "Access is denied.") + } else { + r.Contains(err.Error(), "permission denied") + } + + raw, err := ioutil.ReadFile(filepath.Join(root, "main.go")) + r.NoError(err) + r.Contains(string(raw), "func originalMain()") + + // cover when the thing to that would be renamed isn't actually a function + r.NoError(os.Chmod(filepath.Join(root, "main.go"), 0660)) + r.NoError(ioutil.WriteFile(filepath.Join(root, "main.go"), []byte(renamemaingofile), 0660)) + + info, err = here.Dir(root) + r.NoError(err) + err = bc.renameMain(info, "originalMain", "main") + r.NoError(err) + + raw, err = ioutil.ReadFile(filepath.Join(root, "main.go")) + r.NoError(err) + r.Contains(string(raw), "func main()") + +} + +func setupProject(root string, t *testing.T, maincontent string) (error, here.Info) { + if err := os.MkdirAll(root, os.ModeDir|os.ModePerm); err != nil { + return err, here.Info{} + } + if err := os.Chdir(root); err != nil { + return err, here.Info{} + } + + //create files + if err := ioutil.WriteFile("main.go", []byte(maincontent), 0660); err != nil { + return err, here.Info{} + } + if err := ioutil.WriteFile("go.mod", []byte(gomodfile), 0660); err != nil { + return err, here.Info{} + } + return nil, newRef(t, root) +} + +func teardownProject(root, newRoot string) { + os.Chdir(newRoot) + os.RemoveAll(root) +} + +const beforemaingofile = ` +package main + +func main() { + print("go time!") +} +` + +const aftermaingofile = ` +package main + +func originalMain() { + print("go time!") +} +` + +const renamemaingofile = ` +package main + +var originalMain string = "oops" +func main(){ + print(originalMain) +} +` + +const gomodfile = ` +module github.com/markbates/coke + +go 1.13` diff --git a/cli/cmds/build/main_test.go b/cli/cmds/build/main_test.go index 5ab9c816..244154d4 100644 --- a/cli/cmds/build/main_test.go +++ b/cli/cmds/build/main_test.go @@ -32,6 +32,57 @@ func Test_Cmd_Main(t *testing.T) { r.NoError(err) r.NotNil(br.cmd) r.Equal(exp, br.cmd.Args) + + args = []string{"--help"} + err = bc.Main(context.Background(), ".", args) + r.NoError(err) + r.NotNil(br.cmd) + r.Equal(exp, br.cmd.Args) +} + +func Test_Cmd_Main_FlagErr(t *testing.T) { + r := require.New(t) + + bc := &Cmd{} + + bn := filepath.Join("bin", "build") + if runtime.GOOS == "windows" { + bn += ".exe" + } + + br := &bladeRunner{} + bc.WithPlugins(func() []plugins.Plugin { + return []plugins.Plugin{br} + }) + + args := []string{"-help"} + err := bc.Main(context.Background(), ".", args) + r.Error(err) +} + +func Test_Cmd_Main_BadRootErr(t *testing.T) { + r := require.New(t) + + bc := &Cmd{} + + bn := filepath.Join("bin", "build") + if runtime.GOOS == "windows" { + bn += ".exe" + } + + br := &bladeRunner{} + bc.WithPlugins(func() []plugins.Plugin { + return []plugins.Plugin{br} + }) + + args := []string{} + err := bc.Main(context.Background(), "", args) + r.Error(err) + if runtime.GOOS == "windows" { + r.Contains(err.Error(), "The system cannot find the path specified") + } else { + r.Contains(err.Error(), "no such file or directory") + } } func Test_Cmd_Main_SubCommand(t *testing.T) { @@ -141,4 +192,37 @@ func Test_Cmd_Main_AfterBuilders_err(t *testing.T) { err := bc.Main(context.Background(), ".", args) r.Error(err) r.Contains(err.Error(), b.err.Error()) + + b = &beforeBuilder{} + a = &afterBuilder{err: fmt.Errorf("science fiction twin")} + plugs = plugins.Plugins{a, b, &bladeRunner{}} + + bc = &Cmd{ + pluginsFn: func() []plugins.Plugin { + return plugs + }, + } + + err = bc.Main(context.Background(), ".", args) + r.Error(err) + r.Contains(err.Error(), a.err.Error()) +} + +func Test_Cmd_Main_No_AfterBuilders_Err_On_Help(t *testing.T) { + r := require.New(t) + + b := &beforeBuilder{} + a := &afterBuilder{err: fmt.Errorf("science fiction twin")} + plugs := plugins.Plugins{a, b, &bladeRunner{}} + + bc := &Cmd{ + pluginsFn: func() []plugins.Plugin { + return plugs + }, + } + + args := []string{"--help"} + + err := bc.Main(context.Background(), ".", args) + r.NoError(err) } diff --git a/cli/cmds/build/package_test.go b/cli/cmds/build/package_test.go index 0068b8af..8c2b9f30 100644 --- a/cli/cmds/build/package_test.go +++ b/cli/cmds/build/package_test.go @@ -2,6 +2,7 @@ package build import ( "context" + "errors" "testing" "github.com/gobuffalo/plugins" @@ -35,3 +36,55 @@ func Test_Cmd_Package(t *testing.T) { r.Len(pkg.files, 2) r.Equal([]string{"A", "B"}, pkg.files) } + +func Test_Cmd_Package_Err(t *testing.T) { + r := require.New(t) + + //Test error from PackFiler + pkg := &packager{ + files: []string{"A"}, + } + pf := &packFiler{ + files: []string{"B"}, + err: errors.New("Bad PackFiler"), + } + + plugs := plugins.Plugins{ + pkg, + pf, + &bladeRunner{}, + } + + bc := &Cmd{} + bc.WithPlugins(func() []plugins.Plugin { + return plugs + }) + + err := bc.Main(context.Background(), ".", nil) + r.Error(err) + r.Contains(err.Error(), "Bad PackFiler") + + //Test error from Packager + pkg = &packager{ + files: []string{"A"}, + err: errors.New("Bad Packager"), + } + pf = &packFiler{ + files: []string{"B"}, + } + + plugs = plugins.Plugins{ + pkg, + pf, + &bladeRunner{}, + } + + bc = &Cmd{} + bc.WithPlugins(func() []plugins.Plugin { + return plugs + }) + + err = bc.Main(context.Background(), ".", nil) + r.Error(err) + r.Contains(err.Error(), "Bad Packager") +} diff --git a/cli/ifaces_test.go b/cli/ifaces_test.go new file mode 100644 index 00000000..27df29ab --- /dev/null +++ b/cli/ifaces_test.go @@ -0,0 +1,87 @@ +package cli + +import ( + "io" + "testing" + + "github.com/gobuffalo/plugins" + "github.com/stretchr/testify/require" +) + +type TestPlugin struct{} + +func (t TestPlugin) PluginName() string { + return "test/plugin" +} + +func Feeder_Test() []plugins.Plugin { + return []plugins.Plugin{ + TestPlugin{}, + } +} + +type TestNeeder struct { + Testy *testing.T + ExpectedPluginCount int + Error error +} + +func (tn TestNeeder) PluginName() string { + return "test/plugin/needer" +} + +func (tn TestNeeder) WithPlugins(feeder plugins.Feeder) { + r := require.New(tn.Testy) + ps := feeder() + r.Equal(len(ps), tn.ExpectedPluginCount) +} + +func (tn TestNeeder) SetStdin(io.Reader) error { + return tn.Error +} + +func Test_TestNeeder(t *testing.T) { + + tn := TestNeeder{ + Testy: t, + ExpectedPluginCount: 1, + } + + tn.WithPlugins(Feeder_Test) +} + +type TestInNeeder struct { + Error error +} + +func (tin TestInNeeder) PluginName() string { + return "test/plugin/inneeder" +} + +func (tin TestInNeeder) SetStdin(io.Reader) error { + return tin.Error +} + +type TestOutNeeder struct { + Error error +} + +func (ton TestOutNeeder) PluginName() string { + return "test/plugin/outneeder" +} + +func (ton TestOutNeeder) SetStdout(io.Writer) error { + return ton.Error +} + +type TestErrNeeder struct { + Error error +} + +func (ten TestErrNeeder) PluginName() string { + return "test/plugin/errneeder" +} + +func (ten TestErrNeeder) SetStderr(io.Writer) error { + return ten.Error +} diff --git a/cli/internal/plugins/fizz/setup/setup.go b/cli/internal/plugins/fizz/setup/setup.go index 7195fa00..114a4337 100644 --- a/cli/internal/plugins/fizz/setup/setup.go +++ b/cli/internal/plugins/fizz/setup/setup.go @@ -8,7 +8,7 @@ import ( "github.com/gobuffalo/buffalo-cli/v2/cli/internal/plugins/pop/setup" "github.com/gobuffalo/plugins" - "github.com/gobuffalo/pop" + "github.com/gobuffalo/pop/v5" ) var _ plugins.Plugin = &Setup{} diff --git a/cli/main.go b/cli/main.go index b30b2e02..a18d3b3c 100644 --- a/cli/main.go +++ b/cli/main.go @@ -23,18 +23,23 @@ func (b *Buffalo) Main(ctx context.Context, root string, args []string) error { plugs := b.Plugins for _, p := range plugs { - switch t := p.(type) { - case Needer: + if t, ok := p.(Needer); ok { t.WithPlugins(pfn) - case StdinNeeder: + } + + if t, ok := p.(StdinNeeder); ok { if err := t.SetStdin(plugio.Stdin(plugs...)); err != nil { return err } - case StdoutNeeder: + } + + if t, ok := p.(StdoutNeeder); ok { if err := t.SetStdout(plugio.Stdout(plugs...)); err != nil { return err } - case StderrNeeder: + } + + if t, ok := p.(StderrNeeder); ok { if err := t.SetStderr(plugio.Stderr(plugs...)); err != nil { return err } diff --git a/cli/main_test.go b/cli/main_test.go index 12f4103a..ba3fc48a 100644 --- a/cli/main_test.go +++ b/cli/main_test.go @@ -3,6 +3,7 @@ package cli import ( "bytes" "context" + "errors" "testing" "github.com/gobuffalo/plugins" @@ -18,6 +19,13 @@ func Test_Buffalo_Help(t *testing.T) { b := &Buffalo{ Plugins: plugins.Plugins{ plugio.NewOuter(stdout), + TestNeeder{ + Testy: t, + ExpectedPluginCount: 5, + }, + TestOutNeeder{}, + TestInNeeder{}, + TestErrNeeder{}, }, } @@ -31,6 +39,71 @@ func Test_Buffalo_Help(t *testing.T) { r.Contains(stdout.String(), b.Description()) } +func Test_Buffalo_FailingPlugins(t *testing.T) { + r := require.New(t) + + stdout := &bytes.Buffer{} + + //Bad Out + b := &Buffalo{ + Plugins: plugins.Plugins{ + plugio.NewOuter(stdout), + TestNeeder{ + Testy: t, + ExpectedPluginCount: 5, + }, + TestOutNeeder{Error: errors.New("Bad Out")}, + TestInNeeder{}, + TestErrNeeder{}, + }, + } + + ctx := context.Background() + + args := []string{"-h"} + + err := b.Main(ctx, "", args) + r.Error(err) + r.Equal("Bad Out", err.Error()) + + //Bad In + b = &Buffalo{ + Plugins: plugins.Plugins{ + TestInNeeder{Error: errors.New("Bad In")}, + }, + } + + err = b.Main(ctx, "", args) + r.Error(err) + r.Equal("Bad In", err.Error()) + + //Bad Err + b = &Buffalo{ + Plugins: plugins.Plugins{ + TestErrNeeder{Error: errors.New("Bad Err")}, + }, + } + + err = b.Main(ctx, "", args) + r.Error(err) + r.Equal("Bad Err", err.Error()) + + //Bad Combo + b = &Buffalo{ + Plugins: plugins.Plugins{ + TestNeeder{ + Testy: t, + ExpectedPluginCount: 1, + Error: errors.New("Bad Combo"), + }, + }, + } + + err = b.Main(ctx, "", args) + r.Error(err) + r.Equal("Bad Combo", err.Error()) +} + func Test_Buffalo_Main_SubCommand(t *testing.T) { r := require.New(t) @@ -74,3 +147,19 @@ func Test_Buffalo_Main_SubCommand_Alias(t *testing.T) { r.NoError(err) r.Equal(exp, c.args) } + +func Test_Buffalo_WithoutPlugins(t *testing.T) { + r := require.New(t) + + b := &Buffalo{} + + ctx := context.Background() + + args := []string{"sc"} + + exp := []string{"hello"} + args = append(args, exp...) + + err := b.Main(ctx, "", args) + r.NoError(err) +} diff --git a/go.mod b/go.mod index 88672ce3..e63712cb 100644 --- a/go.mod +++ b/go.mod @@ -6,23 +6,27 @@ go 1.13 require ( github.com/gobuffalo/attrs v1.0.0 - github.com/gobuffalo/fizz v1.9.6 + github.com/gobuffalo/envy v1.9.0 // indirect + github.com/gobuffalo/fizz v1.9.8 github.com/gobuffalo/flect v0.2.1 - github.com/gobuffalo/genny/v2 v2.0.5 + github.com/gobuffalo/genny/v2 v2.0.6 github.com/gobuffalo/here v0.6.0 github.com/gobuffalo/meta/v2 v2.0.1 - github.com/gobuffalo/packr/v2 v2.7.1 + github.com/gobuffalo/packr/v2 v2.8.0 github.com/gobuffalo/plugins v0.0.0-20200405155620-289cda9b5190 github.com/gobuffalo/plush v3.8.3+incompatible - github.com/gobuffalo/pop v4.13.1+incompatible - github.com/gobuffalo/pop/v5 v5.0.8 + github.com/gobuffalo/pop/v5 v5.0.11 + github.com/gobuffalo/tags v2.1.7+incompatible // indirect + github.com/karrick/godirwalk v1.15.5 // indirect github.com/markbates/grift v1.5.0 github.com/markbates/pkger v0.14.0 - github.com/markbates/refresh v1.10.0 + github.com/markbates/refresh v1.11.1 github.com/markbates/safe v1.0.1 - github.com/rogpeppe/go-internal v1.5.2 // indirect + github.com/mattn/go-isatty v0.0.12 // indirect github.com/spf13/pflag v1.0.5 - github.com/stretchr/testify v1.4.0 - golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e - golang.org/x/tools v0.0.0-20200214144324-88be01311a71 + github.com/stretchr/testify v1.5.1 + golang.org/x/crypto v0.0.0-20200206161412-a0c6ece9d31a // indirect + golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a + golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5 // indirect + golang.org/x/tools v0.0.0-20200323192200-8849913b6971 ) diff --git a/go.sum b/go.sum index 6b11591a..3f75adba 100644 --- a/go.sum +++ b/go.sum @@ -1,32 +1,45 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/Masterminds/semver/v3 v3.0.3 h1:znjIyLfpXEDQjOIEWh+ehwpTU14UzUPub3c3sm36u14= github.com/Masterminds/semver/v3 v3.0.3/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/cockroach-go v0.0.0-20190925194419-606b3d062051 h1:eApuUG8W2EtBVwxqLlY2wgoqDYOg3WvIHGvW4fUbbow= github.com/cockroachdb/cockroach-go v0.0.0-20190925194419-606b3d062051/go.mod h1:XGLbWH/ujMcbPbhZq52Nv6UrCghb1yGn//133kEsvDk= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= -github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -34,15 +47,14 @@ github.com/gobuffalo/attrs v0.1.0 h1:LY6/rbhPD/hfa+AfviaMXBmZBGb0fGHF12yg7f3dPQA github.com/gobuffalo/attrs v0.1.0/go.mod h1:fmNpaWyHM0tRm8gCZWKx8yY9fvaNLo2PyzBNSrBZ5Hw= github.com/gobuffalo/attrs v1.0.0 h1:aAK8D55L0GNVbVRlaCwvAGE2BcGdEoVoK86vgQpuUZ8= github.com/gobuffalo/attrs v1.0.0/go.mod h1:YWU+sjOr7V05rNzvCoVc5qQTC2IgEz9434TFW5GhNaw= -github.com/gobuffalo/buffalo-cli v0.5.0 h1:Cckvo3tpWLBBTnp1yynqYdnoYCx/L/nAy7VexHoNSEU= github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= github.com/gobuffalo/envy v1.7.1/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w= github.com/gobuffalo/envy v1.8.1 h1:RUr68liRvs0TS1D5qdW3mQv2SjAsu1QWMCx1tG4kDjs= github.com/gobuffalo/envy v1.8.1/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w= -github.com/gobuffalo/fizz v1.9.5 h1:Qh0GkP7MYtJs9RZwBkPJ0CzEXynVowdNfrjg8b+TOxA= -github.com/gobuffalo/fizz v1.9.5/go.mod h1:v9cFl56oXm+hNNayTsIQHnq209bTDUbIM8GYWCJw3TE= -github.com/gobuffalo/fizz v1.9.6 h1:Rx2+kEYOUVbKh9oPPVgDJrMFpA7Inh/DqOQLahNQWl0= -github.com/gobuffalo/fizz v1.9.6/go.mod h1:IhmO5BbvzsODl+lbAahawl6HK5aad6hgvl8G3mLja8E= +github.com/gobuffalo/envy v1.9.0 h1:eZR0DuEgVLfeIb1zIKt3bT4YovIMf9O9LXQeCZLXpqE= +github.com/gobuffalo/envy v1.9.0/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w= +github.com/gobuffalo/fizz v1.9.8 h1:K0uXVQ/hF1NaETpW++bTvK4A+42GCioKzpvdtSfkiRM= +github.com/gobuffalo/fizz v1.9.8/go.mod h1:w1FEn1yKNVCc49KnADGyYGRPH7jFON3ak4Bj1yUudHo= github.com/gobuffalo/flect v0.1.5/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= github.com/gobuffalo/flect v0.2.0 h1:EWCvMGGxOjsgwlWaP+f4+Hh6yrrte7JeFL2S6b+0hdM= github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= @@ -53,6 +65,8 @@ github.com/gobuffalo/genny v0.3.0 h1:eHQpmPmH3ozcAIZ/krOTqQuDy3FxPMmI7pahFrDP3As github.com/gobuffalo/genny v0.3.0/go.mod h1:ywJ2CoXrTZj7rbS8HTbzv7uybnLKlsNSBhEQ+yFI3E8= github.com/gobuffalo/genny/v2 v2.0.5 h1:IH0EHcvwKT0MdASzptvkz/ViYBQELTklq1/l8Ot3Q5E= github.com/gobuffalo/genny/v2 v2.0.5/go.mod h1:kRkJuAw9mdI37AiEYjV4Dl+TgkBDYf8HZVjLkqe5eBg= +github.com/gobuffalo/genny/v2 v2.0.6 h1:5M1Cl4pkS3mIl/X5s27nhq/o/2S8e5cPXmlcGwSDBI4= +github.com/gobuffalo/genny/v2 v2.0.6/go.mod h1:3tUHnhxSOSe1wmx669WaBtIA3OSvtVkwRTvJFsH+d9o= github.com/gobuffalo/github_flavored_markdown v1.0.7/go.mod h1:w93Pd9Lz6LvyQXEG6DktTPHkOtCbr+arAD5mkwMzXLI= github.com/gobuffalo/github_flavored_markdown v1.1.0 h1:8Zzj4fTRl/OP2R7sGerzSf6g2nEJnaBEJe7UAOiEvbQ= github.com/gobuffalo/github_flavored_markdown v1.1.0/go.mod h1:TSpTKWcRTI0+v7W3x8dkSKMLJSUpuVitlptCkpeY8ic= @@ -62,6 +76,8 @@ github.com/gobuffalo/helpers v0.2.2/go.mod h1:xYbzUdCUpVzLwLnqV8HIjT6hmG0Cs7YIBC github.com/gobuffalo/helpers v0.2.4/go.mod h1:NX7v27yxPDOPTgUFYmJ5ow37EbxdoLraucOGvMNawyk= github.com/gobuffalo/helpers v0.6.0 h1:CL1xOSGeKCaKD1IUpo4RfrkDU83kmkMG4H3dXAS7dw0= github.com/gobuffalo/helpers v0.6.0/go.mod h1:pncVrer7x/KRvnL5aJABLAuT/RhKRR9klL6dkUOhyv8= +github.com/gobuffalo/helpers v0.6.1 h1:LLcL4BsiyDQYtMRUUpyFdBFvFXQ6hNYOpwrcYeilVWM= +github.com/gobuffalo/helpers v0.6.1/go.mod h1:wInbDi0vTJKZBviURTLRMFLE4+nF2uRuuL2fnlYo7w4= github.com/gobuffalo/here v0.4.0/go.mod h1:bTNk/uKZgycuB358iR0D32dI9kHBClBGpXjW2HVHkNo= github.com/gobuffalo/here v0.6.0 h1:hYrd0a6gDmWxBM4TnrGw8mQg24iSVoIkHEk7FodQcBI= github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= @@ -75,17 +91,20 @@ github.com/gobuffalo/mapi v1.1.0 h1:VEhxtd2aoPXFqVmliLXGSmqPh541OprxYYZFwgNcjn4= github.com/gobuffalo/mapi v1.1.0/go.mod h1:pqQ1XAqvpy/JYtRwoieNps2yU8MFiMxBUpAm2FBtQ50= github.com/gobuffalo/meta/v2 v2.0.1 h1:piSvox/ht2cWUzYww+QIVsCOYiQff3qjMRrdTt+tXZ0= github.com/gobuffalo/meta/v2 v2.0.1/go.mod h1:fTxXrXZNebL8y6Vn230U1AMyiILSKYuNvepbngpB24w= -github.com/gobuffalo/nulls v0.1.0 h1:pR3SDzXyFcQrzyPreZj+OzNHSxI4DphSOFaQuidxrfw= -github.com/gobuffalo/nulls v0.1.0/go.mod h1:/HRtuDRoVoN5fABk3J6jzZaGEdcIZEMs0qczj71eKZY= +github.com/gobuffalo/nulls v0.2.0 h1:7R0Uec6JlZI02TR29zrs3KFIuUV8Sqe/s/j3yLvs+gc= +github.com/gobuffalo/nulls v0.2.0/go.mod h1:w4q8RoSCEt87Q0K0sRIZWYeIxkxog5mh3eN3C/n+dUc= github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= github.com/gobuffalo/packd v0.2.0/go.mod h1:k2CkHP3bjbqL2GwxwhxUy1DgnlbW644hkLC9iIUvZwY= github.com/gobuffalo/packd v0.3.0 h1:eMwymTkA1uXsqxS0Tpoop3Lc0u3kTfiMBE6nKtQU4g4= github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q= +github.com/gobuffalo/packd v1.0.0 h1:6ERZvJHfe24rfFmA9OaoKBdC7+c9sydrytMg8SdFGBM= +github.com/gobuffalo/packd v1.0.0/go.mod h1:6VTc4htmJRFB7u1m/4LeMTWjFoYrUiBkU9Fdec9hrhI= github.com/gobuffalo/packr/v2 v2.4.0/go.mod h1:ra341gygw9/61nSjAbfwcwh8IrYL4WmR4IsPkPBhQiY= github.com/gobuffalo/packr/v2 v2.5.2/go.mod h1:sgEE1xNZ6G0FNN5xn9pevVu4nywaxHvgup67xisti08= -github.com/gobuffalo/packr/v2 v2.5.3/go.mod h1:sgEE1xNZ6G0FNN5xn9pevVu4nywaxHvgup67xisti08= github.com/gobuffalo/packr/v2 v2.7.1 h1:n3CIW5T17T8v4GGK5sWXLVWJhCz7b5aNLSxW6gYim4o= github.com/gobuffalo/packr/v2 v2.7.1/go.mod h1:qYEvAazPaVxy7Y7KR0W8qYEE+RymX74kETFqjFoFlOc= +github.com/gobuffalo/packr/v2 v2.8.0 h1:IULGd15bQL59ijXLxEvA5wlMxsmx/ZkQv9T282zNVIY= +github.com/gobuffalo/packr/v2 v2.8.0/go.mod h1:PDk2k3vGevNE3SwVyVRgQCCXETC9SaONCNSXT1Q8M1g= github.com/gobuffalo/plugins v0.0.0-20200405155620-289cda9b5190 h1:Pjfz8mHnSeu1uwVDMfH6IIgEmWqjzmDjgdax6LYsM0E= github.com/gobuffalo/plugins v0.0.0-20200405155620-289cda9b5190/go.mod h1:1aWlp/V+4urGPMZLjzWv5YSvMUyegqSTmm2xIYNOdNg= github.com/gobuffalo/plush v3.8.2+incompatible/go.mod h1:rQ4zdtUUyZNqULlc6bqd5scsPfLKfT0+TGMChgduDvI= @@ -96,24 +115,41 @@ github.com/gobuffalo/plush/v4 v4.0.0/go.mod h1:ErFS3UxKqEb8fpFJT7lYErfN/Nw6vHGiD github.com/gobuffalo/plushgen v0.1.2/go.mod h1:3U71v6HWZpVER1nInTXeAwdoRNsRd4W8aeIa1Lyp+Bk= github.com/gobuffalo/pop v4.13.1+incompatible h1:AhbqPxNOBN/DBb2DBaiBqzOXIBQXxEYzngHHJ+ytP4g= github.com/gobuffalo/pop v4.13.1+incompatible/go.mod h1:DwBz3SD5SsHpTZiTubcsFWcVDpJWGsxjVjMPnkiThWg= -github.com/gobuffalo/pop/v5 v5.0.8 h1:nhyIAH4tCtos+Nhqsg95GzDeQiaJ5gCuvbx1SsE4qv8= -github.com/gobuffalo/pop/v5 v5.0.8/go.mod h1:RRoSowwfxkKnCw8C2vr5EnCzs879Jj4fDH5fmwpWcEg= +github.com/gobuffalo/pop/v5 v5.0.11 h1:BzSFbylk6+w2pEj+8yFHPxsShiJvg6ZV8rcAPNVdmtw= +github.com/gobuffalo/pop/v5 v5.0.11/go.mod h1:mZJHJbA3cy2V18abXYuVop2ldEJ8UZ2DK6qOekC5u5g= github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= github.com/gobuffalo/tags v2.1.0+incompatible h1:qQjj3n2RtHxfooqXQ4/A9SsEfZ7/7guv8cp/GdAPa+Y= github.com/gobuffalo/tags v2.1.0+incompatible/go.mod h1:9XmhOkyaB7UzvuY4UoZO4s67q8/xRMVJEaakauVQYeY= +github.com/gobuffalo/tags v2.1.7+incompatible h1:GUxxh34f9SI4U0Pj3ZqvopO9SlzuqSf+g4ZGSPSszt4= +github.com/gobuffalo/tags v2.1.7+incompatible/go.mod h1:9XmhOkyaB7UzvuY4UoZO4s67q8/xRMVJEaakauVQYeY= github.com/gobuffalo/tags/v3 v3.0.2 h1:gxE6c6fA5radwQeg59aPIeYgCG8YA8AZd3Oh6fh5UXA= github.com/gobuffalo/tags/v3 v3.0.2/go.mod h1:ZQeN6TCTiwAFnS0dNcbDtSgZDwNKSpqajvVtt6mlYpA= +github.com/gobuffalo/tags/v3 v3.1.0 h1:mzdCYooN2VsLRr8KIAdEZ1lh1Py7JSMsiEGCGata2AQ= +github.com/gobuffalo/tags/v3 v3.1.0/go.mod h1:ZQeN6TCTiwAFnS0dNcbDtSgZDwNKSpqajvVtt6mlYpA= github.com/gobuffalo/uuid v2.0.5+incompatible h1:c5uWRuEnYggYCrT9AJm0U2v1QTG7OVDAvxhj8tIV5Gc= github.com/gobuffalo/uuid v2.0.5+incompatible/go.mod h1:ErhIzkRhm0FtRuiE/PeORqcw4cVi1RtSpnwYrxuvkfE= github.com/gobuffalo/validate v2.0.3+incompatible h1:6f4JCEz11Zi6iIlexMv7Jz10RBPvgI795AOaubtCwTE= github.com/gobuffalo/validate v2.0.3+incompatible/go.mod h1:N+EtDe0J8252BgfzQUChBgfd6L93m9weay53EWFVsMM= github.com/gobuffalo/validate/v3 v3.0.0 h1:dF7Bg8NMF9Zv8bZvUMXYJXxZdj+eSZ8z/lGM7/jVFUE= github.com/gobuffalo/validate/v3 v3.0.0/go.mod h1:HFpjq+AIiA2RHoQnQVTFKF/ZpUPXwyw82LgyDPxQ9r0= +github.com/gobuffalo/validate/v3 v3.1.0 h1:/QQN920PciCfBs3aywtJTvDTHmBFMKoiwkshUWa/HLQ= +github.com/gobuffalo/validate/v3 v3.1.0/go.mod h1:HFpjq+AIiA2RHoQnQVTFKF/ZpUPXwyw82LgyDPxQ9r0= github.com/gofrs/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE= github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= @@ -124,11 +160,13 @@ github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZb github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0 h1:DUwgMQuuPnS0rhMXenUtZpqZqrR/30NWY+qQvTpSvEs= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= +github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= -github.com/jackc/pgconn v1.2.1 h1:+73KD6pbtv6Dbs6/rqlSRUa8XffPlW6YBd1hyFLpwuA= -github.com/jackc/pgconn v1.2.1/go.mod h1:GgY/Lbj1VonNaVdNUHs9AwWom3yP2eymFQ1C8z9r/Lk= +github.com/jackc/pgconn v1.3.2 h1:9UIGICxEAW70RQDGilGwsCG63NCcm5amjuBQCFzrmsw= +github.com/jackc/pgconn v1.3.2/go.mod h1:LvCquS3HbBKwgl7KbX9KyqEIumJAbm1UMcTvGaIf3bM= github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2 h1:JVX6jT/XfzNqIjye4717ITLaNwV9mWbJx0dLCpcRzdA= @@ -141,8 +179,8 @@ github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.0 h1:FApgMJ/GtaXfI0s8Lvd0kaLaRwMOhs4VH92pwkwQQvU= -github.com/jackc/pgproto3/v2 v2.0.0/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.1 h1:Rdjp4NFjwHnEslx2b66FfCI2S0LhO4itac3hXz6WX9M= +github.com/jackc/pgproto3/v2 v2.0.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= @@ -155,13 +193,21 @@ github.com/jmoiron/sqlx v1.2.0 h1:41Ip0zITnmWNR/vHV+S4m+VoUivnWY5E4OJfLZjCJMA= github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= github.com/karrick/godirwalk v1.10.12/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= +github.com/karrick/godirwalk v1.15.3/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= +github.com/karrick/godirwalk v1.15.5 h1:ErdAEFW/cKxQ5+9Gm/hopxB8ki21/di+vyNb9mHnHrA= +github.com/karrick/godirwalk v1.15.5/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= @@ -178,6 +224,8 @@ github.com/lib/pq v1.3.0 h1:/qkRGz8zljWiDcFvgpwUpwIAPu3r07TDvs3Rws+o/pU= github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/markbates/errx v1.1.0 h1:QDFeR+UP95dO12JgW+tgi2UVfo0V8YBHiUIOaeBPiEI= +github.com/markbates/errx v1.1.0/go.mod h1:PLa46Oex9KNbVDZhKel8v1OT7hD5JZ2eI7AHhA0wswc= github.com/markbates/grift v1.5.0 h1:CZyK0k+8BdhQMgbwzuKMysC12y4tf9H004jAs/FutX4= github.com/markbates/grift v1.5.0/go.mod h1:1ssFm5gSGmzTkhi3Wfh/nqlU74J73TlAjoDMttQbpfY= github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= @@ -185,8 +233,8 @@ github.com/markbates/oncer v1.0.0 h1:E83IaVAHygyndzPimgUYJjbshhDTALZyXxvk9FOlQRY github.com/markbates/oncer v1.0.0/go.mod h1:Z59JA581E9GP6w96jai+TGqafHPW+cPfRxz2aSZ0mcI= github.com/markbates/pkger v0.14.0 h1:z6KCEBkr3zJTkAMz5SJzjA9Izo+Ipb6XXvOIjQEW+PU= github.com/markbates/pkger v0.14.0/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= -github.com/markbates/refresh v1.10.0 h1:xn+ZSDPED3SvQJDnHkX3vLhFkEVKGWBKWkPKiLYGC4Q= -github.com/markbates/refresh v1.10.0/go.mod h1:txAFIPNbphfNCZELWAQ440wIKnmZKRX64TBdKiAMWfg= +github.com/markbates/refresh v1.11.1 h1:DaCu+K4Mx5Z48FRBLDlsxldFETsqe20JgLFDMQuaIfE= +github.com/markbates/refresh v1.11.1/go.mod h1:bqXClKcAcW8FF7N8nNR6Vl9m14+qGSL4MQjsVQJKDUc= github.com/markbates/safe v1.0.1 h1:yjZkbvRM6IzKj9tlu/zMJLS0n/V351OZWRnF3QfaUxI= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= @@ -197,11 +245,12 @@ github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.11 h1:FxPOTFNqGkuDUGi3H/qkUbQO4ZiBa2brKq5r0l8TGeM= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v1.10.0 h1:jbhqpg7tQe4SupckyijYiy0mJJ/pRyHvXf7JdWK860o= -github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v2.0.2+incompatible h1:qzw9c2GNT8UFrgWNDhCTqRqYUSmu/Dav/9Z58LGpk7U= -github.com/mattn/go-sqlite3 v2.0.2+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U= +github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/microcosm-cc/bluemonday v1.0.2 h1:5lPfLTTAvAbtS0VqT+94yOtFnGfUWYyx0+iToC3Os3s= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= @@ -209,6 +258,8 @@ github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.9.0 h1:SZjF721BByVj8QH636/8S2DnX4n0Re3SteMmw3N+tzc= @@ -225,6 +276,16 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= @@ -236,25 +297,36 @@ github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/serenize/snaker v0.0.0-20171204205717-a683aaf2d516 h1:ofR1ZdrNSkiWcMsRrubK9tb2/SlZVWttAfqUjJi6QYc= github.com/serenize/snaker v0.0.0-20171204205717-a683aaf2d516/go.mod h1:Yow6lPLSAXx2ifx470yD/nUe22Dv5vBvxK/UK9UUTVs= github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.5.0 h1:1N5EYkVAPEywqZRJd7cwnRtCb6xJx7NH3T3WUTF980Q= +github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d h1:yKm7XZV6j9Ev6lojP2XaIshpT4ymkqhMeSghO5Ps00E= github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e h1:qpG93cPwA5f7s/ZPBJnGOYQNK/vKsaDaseuKT5Asee8= github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v0.0.6 h1:breEStsVwemnKh2/s6gMvSdMEkwW0sK8vGStnlVBMCs= +github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= @@ -262,6 +334,7 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2 h1:VUFqw5KcqRf7i70GOzW7N+Q7+gxVBkSSqiXB12+JQ4M= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= @@ -269,14 +342,22 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= @@ -287,10 +368,18 @@ golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191122220453-ac88ee75c92c h1:/nJuwDLoL/zrqY6gf57vxC+Pi+pZ8bfhpPkicO5H7W4= golang.org/x/crypto v0.0.0-20191122220453-ac88ee75c92c/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200206161412-a0c6ece9d31a h1:aczoJ0HPNE92XKa7DrIzkNN6esOKO2TBwiiYoKcINhA= +golang.org/x/crypto v0.0.0-20200206161412-a0c6ece9d31a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee h1:WG0RUwxtNT4qqaXX3DPA8zHFNm/D9xaBpxzHt1WcA/E= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -300,12 +389,24 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7 h1:fHDIZ2oxGnUZRN6WgWFCbYBjH9uqVPRCUVUDhs0wnbA= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200219183655-46282727080f/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03iWnKLEWinaScsxF2Vm2o= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -317,10 +418,17 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5 h1:LfCXLvNmTYH9kEmVgqbnsWfruoXZIrh4YBgqVHtDvw0= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190613204242-ed0dc450797f/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= @@ -328,17 +436,26 @@ golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191004055002-72853e10c5a3/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200117220505-0cba7a3a9ee9 h1:KOkk4e2xd5OeCDJGwacvr75ICCbCsShrHiqPEdsA9hg= golang.org/x/tools v0.0.0-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200214144324-88be01311a71 h1:VT2r398mD48D57f1QbzHk9R7OpTL/1UmQ7U2zqmkOuU= -golang.org/x/tools v0.0.0-20200214144324-88be01311a71/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200308013534-11ec41452d41/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200323192200-8849913b6971 h1:7xTjEBkQgB1qdLZddETld2Flxf5D/U848jdOyhu39TE= +golang.org/x/tools v0.0.0-20200323192200-8849913b6971/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898 h1:/atklqdjdhuosWIl6AIbOeHJjicWYPqR9bpxqxYG2pA= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -348,8 +465,10 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= 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.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -357,3 +476,4 @@ gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo= gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=