From 612c736ce0ce0488881c03544a148b96c6a8c7be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Tue, 28 Jul 2020 10:43:46 +0300 Subject: [PATCH 01/46] refactor folder structure for main & cli (#57) * refactor folder structure for main & cli * introduced a new package called `interface` as a single bridge to expose Starport's features to possibly multiple targets e.g. cli, grpc, http. * cmd and main packages are moved under `interface/cli/starport`. * `starport` package name for the `main` program is chosen to enable easy, named installations with `go get github.com/tendermint/starport/...` which should produce the binary with `starport` name by default. * simplifed the `Makefile` regarding to other changes. * fix ui and app template paths * change ./scripts/dev as ./scripts/starport * fix typed template path * templates: revert template paths for packr --- Makefile | 2 +- go.mod | 2 +- go.sum | 4 ++-- {cmd => interface/cli/starport/cmd}/add.go | 0 {cmd => interface/cli/starport/cmd}/app.go | 0 {cmd => interface/cli/starport/cmd}/root.go | 0 {cmd => interface/cli/starport/cmd}/serve.go | 2 +- {cmd => interface/cli/starport/cmd}/typed.go | 0 interface/cli/starport/main.go | 7 +++++++ main.go | 7 ------- scripts/dev | 3 --- scripts/starport | 4 ++++ 12 files changed, 16 insertions(+), 15 deletions(-) rename {cmd => interface/cli/starport/cmd}/add.go (100%) rename {cmd => interface/cli/starport/cmd}/app.go (100%) rename {cmd => interface/cli/starport/cmd}/root.go (100%) rename {cmd => interface/cli/starport/cmd}/serve.go (99%) rename {cmd => interface/cli/starport/cmd}/typed.go (100%) create mode 100644 interface/cli/starport/main.go delete mode 100644 main.go delete mode 100755 scripts/dev create mode 100755 scripts/starport diff --git a/Makefile b/Makefile index d8f2ede7e9..ca1b100738 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ mod: build: mod @go get -u github.com/gobuffalo/packr/v2/packr2 @packr2 - @go build -mod=readonly -o build/starport main.go + @go build -mod=readonly -o build/ ./interface/cli/... @packr2 clean @go mod tidy diff --git a/go.mod b/go.mod index 70d6f5fc4d..b501a1c3b7 100644 --- a/go.mod +++ b/go.mod @@ -27,5 +27,5 @@ require ( golang.org/x/mod v0.3.0 golang.org/x/net v0.0.0-20200625001655-4c5254603344 // indirect golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 // indirect - golang.org/x/sys v0.0.0-20200722175500-76b94024e4b6 // indirect + golang.org/x/sys v0.0.0-20200727154430-2d971f7391a4 // indirect ) diff --git a/go.sum b/go.sum index c2c03c1b86..a6a33c5f7a 100644 --- a/go.sum +++ b/go.sum @@ -254,8 +254,8 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200722175500-76b94024e4b6 h1:X9xIZ1YU8bLZA3l6gqDUHSFiD0GFI9S548h6C8nDtOY= -golang.org/x/sys v0.0.0-20200722175500-76b94024e4b6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200727154430-2d971f7391a4 h1:gtF+PUC1CD1a9ocwQHbVNXuTp6RQsAYt6tpi6zjT81Y= +golang.org/x/sys v0.0.0-20200727154430-2d971f7391a4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 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/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/cmd/add.go b/interface/cli/starport/cmd/add.go similarity index 100% rename from cmd/add.go rename to interface/cli/starport/cmd/add.go diff --git a/cmd/app.go b/interface/cli/starport/cmd/app.go similarity index 100% rename from cmd/app.go rename to interface/cli/starport/cmd/app.go diff --git a/cmd/root.go b/interface/cli/starport/cmd/root.go similarity index 100% rename from cmd/root.go rename to interface/cli/starport/cmd/root.go diff --git a/cmd/serve.go b/interface/cli/starport/cmd/serve.go similarity index 99% rename from cmd/serve.go rename to interface/cli/starport/cmd/serve.go index 94f162e0ce..febc07527a 100644 --- a/cmd/serve.go +++ b/interface/cli/starport/cmd/serve.go @@ -105,7 +105,7 @@ func startServe(path string, verbose bool) (*exec.Cmd, *exec.Cmd) { fmt.Printf("šŸ”§ Running dev interface at http://localhost:12345\n\n") } router := mux.NewRouter() - devUI := packr.New("ui/dist", "../ui/dist") + devUI := packr.New("ui/dist", "../../../../ui/dist") router.HandleFunc("/env", func(w http.ResponseWriter, r *http.Request) { env := Env{appName, isCommandAvailable("node")} js, err := json.Marshal(env) diff --git a/cmd/typed.go b/interface/cli/starport/cmd/typed.go similarity index 100% rename from cmd/typed.go rename to interface/cli/starport/cmd/typed.go diff --git a/interface/cli/starport/main.go b/interface/cli/starport/main.go new file mode 100644 index 0000000000..e5ab30e81c --- /dev/null +++ b/interface/cli/starport/main.go @@ -0,0 +1,7 @@ +package main + +import "github.com/tendermint/starport/interface/cli/starport/cmd" + +func main() { + cmd.Execute() +} diff --git a/main.go b/main.go deleted file mode 100644 index d057d52ba5..0000000000 --- a/main.go +++ /dev/null @@ -1,7 +0,0 @@ -package main - -import "github.com/tendermint/starport/cmd" - -func main() { - cmd.Execute() -} diff --git a/scripts/dev b/scripts/dev deleted file mode 100755 index 48da604108..0000000000 --- a/scripts/dev +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -go run main.go "$@" diff --git a/scripts/starport b/scripts/starport new file mode 100755 index 0000000000..16cbe52bee --- /dev/null +++ b/scripts/starport @@ -0,0 +1,4 @@ +#!/bin/bash + +# a development mode entrypoint to Starport cli. +go run ./interface/cli/starport "$@" From ff6a7120ea2b724da712a3b3249da06a4ce68ca0 Mon Sep 17 00:00:00 2001 From: Denis Fadeev Date: Tue, 28 Jul 2020 13:05:54 +0500 Subject: [PATCH 02/46] Cosmos SDK v0.39.0 "Launchpad" (#45) * Update go.mod to Cosmos SDK v0.39.0 * Fix issue with pruning options * Fix acc number and seq fetching --- .../templates/cmd/{{binaryNamePrefix}}d/main.go.plush | 7 +++++-- templates/app/templates/frontend/src/store/index.js | 5 ++++- templates/app/templates/go.mod.plush | 9 +++------ 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/templates/app/templates/cmd/{{binaryNamePrefix}}d/main.go.plush b/templates/app/templates/cmd/{{binaryNamePrefix}}d/main.go.plush index ecb31a8159..a55b9b1966 100644 --- a/templates/app/templates/cmd/{{binaryNamePrefix}}d/main.go.plush +++ b/templates/app/templates/cmd/{{binaryNamePrefix}}d/main.go.plush @@ -79,10 +79,13 @@ func newApp(logger log.Logger, db dbm.DB, traceStore io.Writer) abci.Application if viper.GetBool(server.FlagInterBlockCache) { cache = store.NewCommitKVStoreCacheManager() } - + pruningOpts, err := server.GetPruningOptionsFromFlags() + if err != nil { + panic(err) + } return app.NewInitApp( logger, db, traceStore, true, invCheckPeriod, - baseapp.SetPruning(store.NewPruningOptionsFromString(viper.GetString("pruning"))), + baseapp.SetPruning(pruningOpts), baseapp.SetMinGasPrices(viper.GetString(server.FlagMinGasPrices)), baseapp.SetHaltHeight(viper.GetUint64(server.FlagHaltHeight)), baseapp.SetHaltTime(viper.GetUint64(server.FlagHaltTime)), diff --git a/templates/app/templates/frontend/src/store/index.js b/templates/app/templates/frontend/src/store/index.js index ba9a92f113..bfd24f8be2 100644 --- a/templates/app/templates/frontend/src/store/index.js +++ b/templates/app/templates/frontend/src/store/index.js @@ -83,7 +83,10 @@ export default new Vuex.Store({ commit("accountUpdate", { account }); }, async entitySubmit({ state }, { type, body }) { - const { accountNumber, sequence } = await state.client.getNonce(); + const accountURL = `${API}/auth/accounts/${state.client.senderAddress}`; + const account = (await axios.get(accountURL)).data.result.value; + const accountNumber = account.account_number; + const sequence = account.sequence; const address = state.client.senderAddress; const chain_id = await state.client.getChainId(); const req = { diff --git a/templates/app/templates/go.mod.plush b/templates/app/templates/go.mod.plush index cb0c9534bb..04e1325e7c 100644 --- a/templates/app/templates/go.mod.plush +++ b/templates/app/templates/go.mod.plush @@ -1,22 +1,19 @@ module <%= ModulePath %> -go 1.13 +go 1.14 require ( - github.com/btcsuite/btcd v0.0.0-20190807005414-4063feeff79a // indirect - github.com/cosmos/cosmos-sdk v0.38.4 + github.com/cosmos/cosmos-sdk v0.39.0 github.com/golang/mock v1.4.3 // indirect github.com/google/uuid v1.0.0 github.com/gorilla/mux v1.7.4 github.com/onsi/ginkgo v1.8.0 // indirect github.com/onsi/gomega v1.5.0 // indirect - github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 // indirect github.com/spf13/afero v1.2.2 // indirect github.com/spf13/cobra v1.0.0 github.com/spf13/viper v1.7.0 github.com/tendermint/go-amino v0.15.1 - github.com/tendermint/tendermint v0.33.3 + github.com/tendermint/tendermint v0.33.6 github.com/tendermint/tm-db v0.5.1 golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 // indirect - github.com/google/uuid v1.0.0 ) From 1886ebe4bd0650e0757a80d80979a953c54b8eaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Tue, 28 Jul 2020 11:06:12 +0300 Subject: [PATCH 03/46] interface/cli/starport: made root cmd newable (#58) in order to: * reduce package level globals, * increase configurability of the root command by outside caller where such options can be passed as an argument to `starportcmd.New()`. --- .../starport/{cmd/root.go => analytics.go} | 101 +++--------------- interface/cli/starport/cmd/add.go | 2 +- interface/cli/starport/cmd/app.go | 2 +- interface/cli/starport/cmd/cmd.go | 40 +++++++ interface/cli/starport/cmd/serve.go | 2 +- interface/cli/starport/cmd/typed.go | 2 +- interface/cli/starport/main.go | 41 ++++++- 7 files changed, 99 insertions(+), 91 deletions(-) rename interface/cli/starport/{cmd/root.go => analytics.go} (50%) create mode 100644 interface/cli/starport/cmd/cmd.go diff --git a/interface/cli/starport/cmd/root.go b/interface/cli/starport/analytics.go similarity index 50% rename from interface/cli/starport/cmd/root.go rename to interface/cli/starport/analytics.go index c465f13f67..7eee667da7 100644 --- a/interface/cli/starport/cmd/root.go +++ b/interface/cli/starport/analytics.go @@ -1,16 +1,13 @@ -package cmd +package main import ( - "fmt" "io/ioutil" - "log" "os" "path/filepath" "strings" "github.com/Pallinder/go-randomdata" "github.com/ilgooz/analytics-go" - "github.com/spf13/cobra" "github.com/tendermint/starport/pkg/analyticsutil" ) @@ -25,87 +22,6 @@ var ( starportAnonIdentity = "anon" ) -// rootCmd represents the base command when called without any subcommands -var rootCmd = &cobra.Command{ - Use: "starport", - Short: "A tool for scaffolding out Cosmos applications", -} - -// Execute ... -func Execute() { - defer func() { - if r := recover(); r != nil { - addMetric(Metric{ - Err: fmt.Errorf("%s", r), - }) - analyticsc.Close() - fmt.Println(r) - os.Exit(1) - } - }() - analyticsc = analyticsutil.New(analyticsEndpoint, analyticsKey) - // TODO add version of new installation. - name, hadLogin := prepLoginName() - analyticsc.Login(name, "todo-version") - if !hadLogin { - addMetric(Metric{ - Login: name, - IsInstallation: true, - }) - } - if len(os.Args) > 1 && os.Args[1] == "serve" { - addMetric(Metric{}) - } - err := rootCmd.Execute() - addMetric(Metric{ - Err: err, - }) - analyticsc.Close() - if err != nil { - fmt.Println(err) - os.Exit(1) - } -} - -func init() { - rootCmd.AddCommand(appCmd) - rootCmd.AddCommand(typedCmd) - rootCmd.AddCommand(serveCmd) - rootCmd.AddCommand(addCmd) - serveCmd.Flags().BoolP("verbose", "v", false, "Verbose output") - appCmd.Flags().StringP("denom", "d", "token", "Token denomination") - rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") -} - -func getAppAndModule(path string) (string, string) { - goModFile, err := ioutil.ReadFile(filepath.Join(path, "go.mod")) - if err != nil { - log.Fatal(err) - } - moduleString := strings.Split(string(goModFile), "\n")[0] - modulePath := strings.ReplaceAll(moduleString, "module ", "") - var appName string - if t := strings.Split(modulePath, "/"); len(t) > 0 { - appName = t[len(t)-1] - } - return appName, modulePath -} - -func prepLoginName() (name string, hadLogin bool) { - home, err := os.UserHomeDir() - if err != nil { - return "any", false - } - anonPath := filepath.Join(home, starportDir, starportAnonIdentity) - data, err := ioutil.ReadFile(anonPath) - if len(data) != 0 { - return string(data), true - } - name = randomdata.SillyName() - ioutil.WriteFile(anonPath, []byte(name), 0644) - return name, false -} - type Metric struct { // IsInstallation sets metrics type as an installation metric. IsInstallation bool @@ -149,3 +65,18 @@ func addMetric(m Metric) { Properties: props, }) } + +func prepLoginName() (name string, hadLogin bool) { + home, err := os.UserHomeDir() + if err != nil { + return "any", false + } + anonPath := filepath.Join(home, starportDir, starportAnonIdentity) + data, err := ioutil.ReadFile(anonPath) + if len(data) != 0 { + return string(data), true + } + name = randomdata.SillyName() + ioutil.WriteFile(anonPath, []byte(name), 0644) + return name, false +} diff --git a/interface/cli/starport/cmd/add.go b/interface/cli/starport/cmd/add.go index 314c24a720..2e1e3a08fa 100644 --- a/interface/cli/starport/cmd/add.go +++ b/interface/cli/starport/cmd/add.go @@ -1,4 +1,4 @@ -package cmd +package starportcmd import ( "context" diff --git a/interface/cli/starport/cmd/app.go b/interface/cli/starport/cmd/app.go index 7369dd3ed9..1a5c4ac005 100644 --- a/interface/cli/starport/cmd/app.go +++ b/interface/cli/starport/cmd/app.go @@ -1,4 +1,4 @@ -package cmd +package starportcmd import ( "context" diff --git a/interface/cli/starport/cmd/cmd.go b/interface/cli/starport/cmd/cmd.go new file mode 100644 index 0000000000..f3bbff12a3 --- /dev/null +++ b/interface/cli/starport/cmd/cmd.go @@ -0,0 +1,40 @@ +package starportcmd + +import ( + "io/ioutil" + "log" + "path/filepath" + "strings" + + "github.com/spf13/cobra" +) + +// New creates a new root command for `starport` with its sub commands. +func New() *cobra.Command { + c := &cobra.Command{ + Use: "starport", + Short: "A tool for scaffolding out Cosmos applications", + } + c.AddCommand(appCmd) + c.AddCommand(typedCmd) + c.AddCommand(serveCmd) + c.AddCommand(addCmd) + c.Flags().BoolP("toggle", "t", false, "Help message for toggle") + serveCmd.Flags().BoolP("verbose", "v", false, "Verbose output") + appCmd.Flags().StringP("denom", "d", "token", "Token denomination") + return c +} + +func getAppAndModule(path string) (string, string) { + goModFile, err := ioutil.ReadFile(filepath.Join(path, "go.mod")) + if err != nil { + log.Fatal(err) + } + moduleString := strings.Split(string(goModFile), "\n")[0] + modulePath := strings.ReplaceAll(moduleString, "module ", "") + var appName string + if t := strings.Split(modulePath, "/"); len(t) > 0 { + appName = t[len(t)-1] + } + return appName, modulePath +} diff --git a/interface/cli/starport/cmd/serve.go b/interface/cli/starport/cmd/serve.go index febc07527a..6f386a21bc 100644 --- a/interface/cli/starport/cmd/serve.go +++ b/interface/cli/starport/cmd/serve.go @@ -1,4 +1,4 @@ -package cmd +package starportcmd import ( "encoding/json" diff --git a/interface/cli/starport/cmd/typed.go b/interface/cli/starport/cmd/typed.go index b659a3fc9d..793a3120ee 100644 --- a/interface/cli/starport/cmd/typed.go +++ b/interface/cli/starport/cmd/typed.go @@ -1,4 +1,4 @@ -package cmd +package starportcmd import ( "context" diff --git a/interface/cli/starport/main.go b/interface/cli/starport/main.go index e5ab30e81c..104a770b59 100644 --- a/interface/cli/starport/main.go +++ b/interface/cli/starport/main.go @@ -1,7 +1,44 @@ package main -import "github.com/tendermint/starport/interface/cli/starport/cmd" +import ( + "fmt" + "os" + + starportcmd "github.com/tendermint/starport/interface/cli/starport/cmd" + "github.com/tendermint/starport/pkg/analyticsutil" +) func main() { - cmd.Execute() + defer func() { + if r := recover(); r != nil { + addMetric(Metric{ + Err: fmt.Errorf("%s", r), + }) + analyticsc.Close() + fmt.Println(r) + os.Exit(1) + } + }() + analyticsc = analyticsutil.New(analyticsEndpoint, analyticsKey) + // TODO add version of new installation. + name, hadLogin := prepLoginName() + analyticsc.Login(name, "todo-version") + if !hadLogin { + addMetric(Metric{ + Login: name, + IsInstallation: true, + }) + } + if len(os.Args) > 1 && os.Args[1] == "serve" { + addMetric(Metric{}) + } + err := starportcmd.New().Execute() + addMetric(Metric{ + Err: err, + }) + analyticsc.Close() + if err != nil { + fmt.Println(err) + os.Exit(1) + } } From 066ca0a679a2edcaa493991a494f878ea2fef6b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Tue, 28 Jul 2020 12:14:12 +0300 Subject: [PATCH 04/46] interface/cli/starport/cmd: made serve command newable (#64) * reconstructed organization of serve command. --- interface/cli/starport/cmd/cmd.go | 3 +- interface/cli/starport/cmd/serve.go | 115 ++++++++++++++-------------- 2 files changed, 60 insertions(+), 58 deletions(-) diff --git a/interface/cli/starport/cmd/cmd.go b/interface/cli/starport/cmd/cmd.go index f3bbff12a3..a6205ec6d5 100644 --- a/interface/cli/starport/cmd/cmd.go +++ b/interface/cli/starport/cmd/cmd.go @@ -17,10 +17,9 @@ func New() *cobra.Command { } c.AddCommand(appCmd) c.AddCommand(typedCmd) - c.AddCommand(serveCmd) + c.AddCommand(NewServe()) c.AddCommand(addCmd) c.Flags().BoolP("toggle", "t", false, "Help message for toggle") - serveCmd.Flags().BoolP("verbose", "v", false, "Verbose output") appCmd.Flags().StringP("denom", "d", "token", "Token denomination") return c } diff --git a/interface/cli/starport/cmd/serve.go b/interface/cli/starport/cmd/serve.go index 6f386a21bc..58eb4fba70 100644 --- a/interface/cli/starport/cmd/serve.go +++ b/interface/cli/starport/cmd/serve.go @@ -18,6 +18,65 @@ import ( "github.com/spf13/cobra" ) +var appPath string + +func NewServe() *cobra.Command { + c := &cobra.Command{ + Use: "serve", + Short: "Launches a reloading server", + Args: cobra.ExactArgs(0), + Run: serveHandler, + } + c.Flags().StringVarP(&appPath, "path", "p", "", "path of the app") + c.Flags().BoolP("verbose", "v", false, "Verbose output") + return c +} + +func serveHandler(cmd *cobra.Command, args []string) { + verbose, _ := cmd.Flags().GetBool("verbose") + cmdNpm := gocmd.NewCmd("npm", "run", "dev") + cmdNpm.Dir = filepath.Join(appPath, "frontend") + cmdNpm.Start() + cmdt, cmdr := startServe(appPath, verbose) + c := make(chan os.Signal, 1) + signal.Notify(c, os.Interrupt) + go func() { + <-c + cmdNpm.Stop() + cmdr.Process.Kill() + cmdt.Process.Kill() + os.Exit(0) + }() + w := watcher.New() + w.SetMaxEvents(1) + go func() { + for { + select { + case <-w.Event: + cmdr.Process.Kill() + cmdt.Process.Kill() + cmdt, cmdr = startServe(appPath, verbose) + case err := <-w.Error: + log.Println(err) + case <-w.Closed: + return + } + } + }() + if err := w.AddRecursive(filepath.Join(appPath, "./app")); err != nil { + log.Fatalln(err) + } + if err := w.AddRecursive(filepath.Join(appPath, "./cmd")); err != nil { + log.Fatalln(err) + } + if err := w.AddRecursive(filepath.Join(appPath, "./x")); err != nil { + log.Fatalln(err) + } + if err := w.Start(time.Millisecond * 1000); err != nil { + log.Fatalln(err) + } +} + // Env ... type Env struct { ChainID string `json:"chain_id"` @@ -156,62 +215,6 @@ func startServe(path string, verbose bool) (*exec.Cmd, *exec.Cmd) { return cmdTendermint, cmdREST } -var appPath string - -func init() { - serveCmd.Flags().StringVarP(&appPath, "path", "p", "", "path of the app") -} - -var serveCmd = &cobra.Command{ - Use: "serve", - Short: "Launches a reloading server", - Args: cobra.ExactArgs(0), - Run: func(cmd *cobra.Command, args []string) { - verbose, _ := cmd.Flags().GetBool("verbose") - cmdNpm := gocmd.NewCmd("npm", "run", "dev") - cmdNpm.Dir = filepath.Join(appPath, "frontend") - cmdNpm.Start() - cmdt, cmdr := startServe(appPath, verbose) - c := make(chan os.Signal, 1) - signal.Notify(c, os.Interrupt) - go func() { - <-c - cmdNpm.Stop() - cmdr.Process.Kill() - cmdt.Process.Kill() - os.Exit(0) - }() - w := watcher.New() - w.SetMaxEvents(1) - go func() { - for { - select { - case <-w.Event: - cmdr.Process.Kill() - cmdt.Process.Kill() - cmdt, cmdr = startServe(appPath, verbose) - case err := <-w.Error: - log.Println(err) - case <-w.Closed: - return - } - } - }() - if err := w.AddRecursive(filepath.Join(appPath, "./app")); err != nil { - log.Fatalln(err) - } - if err := w.AddRecursive(filepath.Join(appPath, "./cmd")); err != nil { - log.Fatalln(err) - } - if err := w.AddRecursive(filepath.Join(appPath, "./x")); err != nil { - log.Fatalln(err) - } - if err := w.Start(time.Millisecond * 1000); err != nil { - log.Fatalln(err) - } - }, -} - func isCommandAvailable(name string) bool { _, err := exec.LookPath(name) return err == nil From 486f397a3ba2ff4d2b32db0dd92904b49b1ac8b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Tue, 28 Jul 2020 12:29:54 +0300 Subject: [PATCH 05/46] ci: disable linter for PRs (#67) we are in a refactoring period and it is safe to ignore linter errors at this stage since some related code will be changed. --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 8b0bb974ba..81cae68772 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -3,7 +3,7 @@ name: Lint # This workflow is run on every pull request and push to master # The `golangci` will pass without running if no *.{go, mod, sum} files have been changed. on: - pull_request: + # pull_request: push: branches: - master From 66f37990d9e124eebfd6b4a7164d9f24d730a85c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Tue, 28 Jul 2020 12:30:09 +0300 Subject: [PATCH 06/46] interface/cli/starport/cmd: made app command newable (#65) * reconstructed organization of app command. --- interface/cli/starport/cmd/app.go | 58 ++++++++++++++++++------------- interface/cli/starport/cmd/cmd.go | 3 +- 2 files changed, 34 insertions(+), 27 deletions(-) diff --git a/interface/cli/starport/cmd/app.go b/interface/cli/starport/cmd/app.go index 1a5c4ac005..b2998ba8cd 100644 --- a/interface/cli/starport/cmd/app.go +++ b/interface/cli/starport/cmd/app.go @@ -11,28 +11,37 @@ import ( "github.com/tendermint/starport/templates/app" ) -var appCmd = &cobra.Command{ - Use: "app [github.com/org/repo]", - Short: "Generates an empty application", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - path, err := gomodulepath.Parse(args[0]) - if err != nil { - return err - } - denom, _ := cmd.Flags().GetString("denom") - g, _ := app.New(&app.Options{ - ModulePath: path.RawPath, - AppName: path.Package, - BinaryNamePrefix: path.Root, - Denom: denom, - }) - run := genny.WetRunner(context.Background()) - run.With(g) - pwd, _ := os.Getwd() - run.Root = pwd + "/" + path.Root - run.Run() - message := ` +// NewApp creates new command named `app` to create Cosmos scaffolds customized +// by the user given options. +func NewApp() *cobra.Command { + c := &cobra.Command{ + Use: "app [github.com/org/repo]", + Short: "Generates an empty application", + Args: cobra.ExactArgs(1), + RunE: appHandler, + } + c.Flags().StringP("denom", "d", "token", "Token denomination") + return c +} + +func appHandler(cmd *cobra.Command, args []string) error { + path, err := gomodulepath.Parse(args[0]) + if err != nil { + return err + } + denom, _ := cmd.Flags().GetString("denom") + g, _ := app.New(&app.Options{ + ModulePath: path.RawPath, + AppName: path.Package, + BinaryNamePrefix: path.Root, + Denom: denom, + }) + run := genny.WetRunner(context.Background()) + run.With(g) + pwd, _ := os.Getwd() + run.Root = pwd + "/" + path.Root + run.Run() + message := ` ā­ļø Successfully created a Cosmos app '%[1]v'. šŸ‘‰ Get started with the following commands: @@ -41,7 +50,6 @@ var appCmd = &cobra.Command{ NOTE: add -v flag for advanced use. ` - fmt.Printf(message, path.Root) - return nil - }, + fmt.Printf(message, path.Root) + return nil } diff --git a/interface/cli/starport/cmd/cmd.go b/interface/cli/starport/cmd/cmd.go index a6205ec6d5..77b9bc2bca 100644 --- a/interface/cli/starport/cmd/cmd.go +++ b/interface/cli/starport/cmd/cmd.go @@ -15,12 +15,11 @@ func New() *cobra.Command { Use: "starport", Short: "A tool for scaffolding out Cosmos applications", } - c.AddCommand(appCmd) + c.AddCommand(NewApp()) c.AddCommand(typedCmd) c.AddCommand(NewServe()) c.AddCommand(addCmd) c.Flags().BoolP("toggle", "t", false, "Help message for toggle") - appCmd.Flags().StringP("denom", "d", "token", "Token denomination") return c } From de19cb0f445d0deb2d1957d2575bb71f304184a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Tue, 28 Jul 2020 12:41:38 +0300 Subject: [PATCH 07/46] interface/cli/starport/cmd: made add command newable (#69) * reconstructed organization of add command. solves a part of #56. --- interface/cli/starport/cmd/add.go | 35 ++++++++++++++++++------------- interface/cli/starport/cmd/cmd.go | 2 +- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/interface/cli/starport/cmd/add.go b/interface/cli/starport/cmd/add.go index 2e1e3a08fa..3419017882 100644 --- a/interface/cli/starport/cmd/add.go +++ b/interface/cli/starport/cmd/add.go @@ -8,19 +8,24 @@ import ( "github.com/tendermint/starport/templates/add" ) -var addCmd = &cobra.Command{ - Use: "add [feature]", - Short: "Adds a feature to a project.", - Args: cobra.MinimumNArgs(1), - Run: func(cmd *cobra.Command, args []string) { - appName, _ := getAppAndModule(appPath) - g, _ := add.New(&add.Options{ - Feature: args[0], - AppName: appName, - }) - run := genny.WetRunner(context.Background()) - run.With(g) - run.Run() - // fmt.Printf("\nšŸŽ‰ Created a type `%[1]v`.\n\n", args[0]) - }, +func NewAdd() *cobra.Command { + c := &cobra.Command{ + Use: "add [feature]", + Short: "Adds a feature to a project.", + Args: cobra.MinimumNArgs(1), + Run: addHandler, + } + return c +} + +func addHandler(cmd *cobra.Command, args []string) { + appName, _ := getAppAndModule(appPath) + g, _ := add.New(&add.Options{ + Feature: args[0], + AppName: appName, + }) + run := genny.WetRunner(context.Background()) + run.With(g) + run.Run() + // fmt.Printf("\nšŸŽ‰ Created a type `%[1]v`.\n\n", args[0]) } diff --git a/interface/cli/starport/cmd/cmd.go b/interface/cli/starport/cmd/cmd.go index 77b9bc2bca..90cd6fd9eb 100644 --- a/interface/cli/starport/cmd/cmd.go +++ b/interface/cli/starport/cmd/cmd.go @@ -18,7 +18,7 @@ func New() *cobra.Command { c.AddCommand(NewApp()) c.AddCommand(typedCmd) c.AddCommand(NewServe()) - c.AddCommand(addCmd) + c.AddCommand(NewAdd()) c.Flags().BoolP("toggle", "t", false, "Help message for toggle") return c } From 8a22c59efafdf9a35b521388c3878f92732499b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Tue, 28 Jul 2020 12:44:58 +0300 Subject: [PATCH 08/46] ci: run unit tests for Starport (#68) * ci: run unit tests for Starport resolved #29. * ci: fix unit test --- .github/workflows/test.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .github/workflows/test.yml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000000..e7cff209c2 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,18 @@ +# run unit tests for Starport. +name: Test + +on: + pull_request: + push: + branches: + - master + - develop +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-go@v2 + with: + go-version: '1.14' + - run: go test -v ./... From ef99e37a9402e4ead1fe9dea360332346b008ff9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Tue, 28 Jul 2020 12:54:02 +0300 Subject: [PATCH 09/46] interface/cli/starport/cmd: made type command newable (#70) * interface/cli/starport/cmd: made typed command newable * reconstructed organization of `typed` command. solves a part of #56. * interface/cli/starport/cmd: fix typo on command * interface/cli/starport/cmd: fix typo on command --- interface/cli/starport/cmd/cmd.go | 2 +- interface/cli/starport/cmd/type.go | 55 +++++++++++++++++++++++++++++ interface/cli/starport/cmd/typed.go | 53 --------------------------- 3 files changed, 56 insertions(+), 54 deletions(-) create mode 100644 interface/cli/starport/cmd/type.go delete mode 100644 interface/cli/starport/cmd/typed.go diff --git a/interface/cli/starport/cmd/cmd.go b/interface/cli/starport/cmd/cmd.go index 90cd6fd9eb..07e651520c 100644 --- a/interface/cli/starport/cmd/cmd.go +++ b/interface/cli/starport/cmd/cmd.go @@ -16,7 +16,7 @@ func New() *cobra.Command { Short: "A tool for scaffolding out Cosmos applications", } c.AddCommand(NewApp()) - c.AddCommand(typedCmd) + c.AddCommand(NewType()) c.AddCommand(NewServe()) c.AddCommand(NewAdd()) c.Flags().BoolP("toggle", "t", false, "Help message for toggle") diff --git a/interface/cli/starport/cmd/type.go b/interface/cli/starport/cmd/type.go new file mode 100644 index 0000000000..79de4cd6a6 --- /dev/null +++ b/interface/cli/starport/cmd/type.go @@ -0,0 +1,55 @@ +package starportcmd + +import ( + "context" + "fmt" + "strings" + + "github.com/gobuffalo/genny" + "github.com/spf13/cobra" + "github.com/tendermint/starport/templates/typed" +) + +func NewType() *cobra.Command { + c := &cobra.Command{ + Use: "type [typeName] [field1] [field2] ...", + Short: "Generates CRUD actions for type", + Args: cobra.MinimumNArgs(1), + Run: typeHandler, + } + c.Flags().StringVarP(&appPath, "path", "p", "", "path of the app") + return c +} + +func typeHandler(cmd *cobra.Command, args []string) { + appName, modulePath := getAppAndModule(appPath) + var fields []typed.Field + for _, f := range args[1:] { + fs := strings.Split(f, ":") + name := fs[0] + var datatype string + acceptedTypes := map[string]bool{ + "string": true, + "bool": true, + "int": true, + "float": true, + } + if len(fs) == 2 && acceptedTypes[fs[1]] { + datatype = fs[1] + } else { + datatype = "string" + } + field := typed.Field{Name: name, Datatype: datatype} + fields = append(fields, field) + } + g, _ := typed.New(&typed.Options{ + ModulePath: modulePath, + AppName: appName, + TypeName: args[0], + Fields: fields, + }) + run := genny.WetRunner(context.Background()) + run.With(g) + run.Run() + fmt.Printf("\nšŸŽ‰ Created a type `%[1]v`.\n\n", args[0]) +} diff --git a/interface/cli/starport/cmd/typed.go b/interface/cli/starport/cmd/typed.go deleted file mode 100644 index 793a3120ee..0000000000 --- a/interface/cli/starport/cmd/typed.go +++ /dev/null @@ -1,53 +0,0 @@ -package starportcmd - -import ( - "context" - "fmt" - "strings" - - "github.com/gobuffalo/genny" - "github.com/spf13/cobra" - "github.com/tendermint/starport/templates/typed" -) - -func init() { - typedCmd.Flags().StringVarP(&appPath, "path", "p", "", "path of the app") -} - -var typedCmd = &cobra.Command{ - Use: "type [typeName] [field1] [field2] ...", - Short: "Generates CRUD actions for type", - Args: cobra.MinimumNArgs(1), - Run: func(cmd *cobra.Command, args []string) { - appName, modulePath := getAppAndModule(appPath) - var fields []typed.Field - for _, f := range args[1:] { - fs := strings.Split(f, ":") - name := fs[0] - var datatype string - acceptedTypes := map[string]bool{ - "string": true, - "bool": true, - "int": true, - "float": true, - } - if len(fs) == 2 && acceptedTypes[fs[1]] { - datatype = fs[1] - } else { - datatype = "string" - } - field := typed.Field{Name: name, Datatype: datatype} - fields = append(fields, field) - } - g, _ := typed.New(&typed.Options{ - ModulePath: modulePath, - AppName: appName, - TypeName: args[0], - Fields: fields, - }) - run := genny.WetRunner(context.Background()) - run.With(g) - run.Run() - fmt.Printf("\nšŸŽ‰ Created a type `%[1]v`.\n\n", args[0]) - }, -} From b8165091b52c36738c5af86ce7972c0e86a7e5d9 Mon Sep 17 00:00:00 2001 From: Peng Zhong <172531+nylira@users.noreply.github.com> Date: Tue, 28 Jul 2020 11:00:35 -0400 Subject: [PATCH 10/46] Update readme.md (#75) * Update readme.md The README needs more beginner level content. I added links to Denis' tutorials (we can replace this with a link to tutorials.cosmos.network later), communication channels, and improved organization a bit. * Update readme.md * Replace me with user1 as in init script Co-authored-by: Denis Fadeev --- readme.md | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/readme.md b/readme.md index 765bdb9ffc..6f89282929 100644 --- a/readme.md +++ b/readme.md @@ -4,7 +4,7 @@ Starport is the easiest way to build blockchains. It is a developer-friendly int Overview: https://www.youtube.com/watch?v=rmbPjCGDXek -## Installation +## Install ### NPM ``` @@ -23,9 +23,10 @@ brew install tendermint/tap/starport git clone https://github.com/tendermint/starport && cd starport && make ``` -Requirements: Go 1.14 and Node.js (optional, used to build the welcome screen). +Requirements: Go 1.14 and Node.js (optional but highly recommended, used for the welcome screen and web app scaffolding). -## Creating an application +## Get started +### Create an application This command creates an empty template for a Cosmos SDK application. By default it also includes a module with the same name as the package. To create a new application called `blog`, run: @@ -33,7 +34,7 @@ This command creates an empty template for a Cosmos SDK application. By default starport app github.com/your-github-id/blog ``` -## Running an application +### Run an application ``` starport serve @@ -43,7 +44,7 @@ To start the server, go into you application's directory and run `starport serve Note: depending on your OS and firewall settings, you may have to accept a prompt asking if your application's binary (`blogd` in this case) can accept external connections. -## Creating types +### Create data types ``` starport type [typeName] [field1] [field2:bool] ... @@ -59,4 +60,20 @@ starport type post title body This command generates a type `Post` with two fields: `title` and `body`. -To add a post run `blogcli tx blog create-post "My title" "This is a blog" --from=me`. +To add a post run `blogcli tx blog create-post "My title" "This is a blog" --from=user1`. + +## More tutorials +* [Blog (video) tutorial](https://www.youtube.com/watch?v=rmbPjCGDXek): get started with your first blockchain +* [Poll tutorial](https://www.notion.so/Starport-Poll-406c136cef48435795a5ef02692cd299): build a voting application with a web-based UI +* [Smart contract tutorial](https://www.notion.so/Smart-contracts-with-CosmWasm-c6fbcd584b78437a843e738b922dc108): add smart contracts to your app with CosmWasm: build, upload, instantiate and run a smart contract +* [Blog (from scratch) tutorial](https://www.notion.so/Starport-Blog-f928931b7d4e423992d1a105cd5f5ea2): learn how Starport works by building a blog without scaffolding + +## Questions & comments +For questions and support please join the #starport channel in the [Cosmos Community Discord](https://discord.com/invite/W8trcGV). The issue list of this repo is exclusively for bug reports and feature requests. + +## Stay in touch +Starport is a product built by [Tendermint](https://tendermint.com). Follow us to get the latest updates! + +* [Twitter](https://twitter.com/tendermint_team) +* [Blog](https://medium.com/tendermint) +* [Jobs](https://tendermint.com/careers) From 48645aa7ac1e1f5988de7fb091ee73964bd5ebe2 Mon Sep 17 00:00:00 2001 From: Denis Fadeev Date: Wed, 29 Jul 2020 11:05:06 +0500 Subject: [PATCH 11/46] Add codeowners (#79) --- .github/CODEOWNERS | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000000..0e18051286 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,4 @@ +# CODEOWNERS: https://help.github.com/articles/about-codeowners/ + +# Primary repo maintainers +* @fadeev @ilgooz \ No newline at end of file From 3109d1d2bf358b19c5af7625c705d8b5f52ee95d Mon Sep 17 00:00:00 2001 From: Denis Fadeev Date: Wed, 29 Jul 2020 11:07:25 +0500 Subject: [PATCH 12/46] Updated readme with CosmWasm (#78) --- readme.md | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/readme.md b/readme.md index 6f89282929..c6f081a54b 100644 --- a/readme.md +++ b/readme.md @@ -7,6 +7,7 @@ Overview: https://www.youtube.com/watch?v=rmbPjCGDXek ## Install ### NPM + ``` npm i -g @tendermint/starport ``` @@ -26,6 +27,7 @@ git clone https://github.com/tendermint/starport && cd starport && make Requirements: Go 1.14 and Node.js (optional but highly recommended, used for the welcome screen and web app scaffolding). ## Get started + ### Create an application This command creates an empty template for a Cosmos SDK application. By default it also includes a module with the same name as the package. To create a new application called `blog`, run: @@ -62,18 +64,29 @@ This command generates a type `Post` with two fields: `title` and `body`. To add a post run `blogcli tx blog create-post "My title" "This is a blog" --from=user1`. +### Add smart contract support + +``` +starport add wasm +``` + +Adds smart contracts with [CosmWasm](https://www.cosmwasm.com/). Follow a short [smart contract tutorial](https://www.notion.so/Smart-contracts-with-CosmWasm-c6fbcd584b78437a843e738b922dc108) to get started. + ## More tutorials -* [Blog (video) tutorial](https://www.youtube.com/watch?v=rmbPjCGDXek): get started with your first blockchain -* [Poll tutorial](https://www.notion.so/Starport-Poll-406c136cef48435795a5ef02692cd299): build a voting application with a web-based UI -* [Smart contract tutorial](https://www.notion.so/Smart-contracts-with-CosmWasm-c6fbcd584b78437a843e738b922dc108): add smart contracts to your app with CosmWasm: build, upload, instantiate and run a smart contract -* [Blog (from scratch) tutorial](https://www.notion.so/Starport-Blog-f928931b7d4e423992d1a105cd5f5ea2): learn how Starport works by building a blog without scaffolding + +- [Blog (video) tutorial](https://www.youtube.com/watch?v=rmbPjCGDXek): get started with your first blockchain +- [Poll tutorial](https://www.notion.so/Starport-Poll-406c136cef48435795a5ef02692cd299): build a voting application with a web-based UI +- [Smart contract tutorial](https://www.notion.so/Smart-contracts-with-CosmWasm-c6fbcd584b78437a843e738b922dc108): add smart contracts to your app with CosmWasm: build, upload, instantiate and run a smart contract +- [Blog (from scratch) tutorial](https://www.notion.so/Starport-Blog-f928931b7d4e423992d1a105cd5f5ea2): learn how Starport works by building a blog without scaffolding ## Questions & comments + For questions and support please join the #starport channel in the [Cosmos Community Discord](https://discord.com/invite/W8trcGV). The issue list of this repo is exclusively for bug reports and feature requests. ## Stay in touch + Starport is a product built by [Tendermint](https://tendermint.com). Follow us to get the latest updates! -* [Twitter](https://twitter.com/tendermint_team) -* [Blog](https://medium.com/tendermint) -* [Jobs](https://tendermint.com/careers) +- [Twitter](https://twitter.com/tendermint_team) +- [Blog](https://medium.com/tendermint) +- [Jobs](https://tendermint.com/careers) From 9bd3662a3e7ecc2e30896822fcff0b6f8a6336e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Wed, 29 Jul 2020 12:29:36 +0300 Subject: [PATCH 13/46] interface/cli/starport/cmd: refactor serve command (#72) for short-running command executions. * introduced new `pkg/cmdrunner` pkg. (tests will be added later once we have finized its public APIs) --- go.mod | 4 +- go.sum | 8 +- interface/cli/starport/cmd/serve.go | 135 ++++++++++++++++++---------- pkg/cmdrunner/cmdrunner.go | 102 +++++++++++++++++++++ pkg/cmdrunner/step/step.go | 76 ++++++++++++++++ 5 files changed, 270 insertions(+), 55 deletions(-) create mode 100644 pkg/cmdrunner/cmdrunner.go create mode 100644 pkg/cmdrunner/step/step.go diff --git a/go.mod b/go.mod index b501a1c3b7..96fe8b2190 100644 --- a/go.mod +++ b/go.mod @@ -23,9 +23,9 @@ require ( github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/testify v1.5.1 github.com/xtgo/uuid v0.0.0-20140804021211-a0b114877d4c // indirect - golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899 // indirect + golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de // indirect golang.org/x/mod v0.3.0 golang.org/x/net v0.0.0-20200625001655-4c5254603344 // indirect golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 // indirect - golang.org/x/sys v0.0.0-20200727154430-2d971f7391a4 // indirect + golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1 // indirect ) diff --git a/go.sum b/go.sum index a6a33c5f7a..c4dd98b479 100644 --- a/go.sum +++ b/go.sum @@ -215,8 +215,8 @@ golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/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/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899 h1:DZhuSZLsGlFL4CmhA8BcRA0mnthyA/nZ00AqCUo7vHg= -golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de h1:ikNHVSjEfnvz6sxdSPCaPt572qowuyMDMJLLm3Db3ig= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/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/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= @@ -254,8 +254,8 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200727154430-2d971f7391a4 h1:gtF+PUC1CD1a9ocwQHbVNXuTp6RQsAYt6tpi6zjT81Y= -golang.org/x/sys v0.0.0-20200727154430-2d971f7391a4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1 h1:sIky/MyNRSHTrdxfsiUSS4WIAMvInbeXljJz+jDjeYE= +golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 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/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/interface/cli/starport/cmd/serve.go b/interface/cli/starport/cmd/serve.go index 58eb4fba70..44076783ff 100644 --- a/interface/cli/starport/cmd/serve.go +++ b/interface/cli/starport/cmd/serve.go @@ -1,8 +1,11 @@ package starportcmd import ( + "bytes" + "context" "encoding/json" "fmt" + "io/ioutil" "log" "net/http" "os" @@ -14,8 +17,11 @@ import ( gocmd "github.com/go-cmd/cmd" "github.com/gobuffalo/packr/v2" "github.com/gorilla/mux" + "github.com/pkg/errors" "github.com/radovskyb/watcher" "github.com/spf13/cobra" + "github.com/tendermint/starport/pkg/cmdrunner" + "github.com/tendermint/starport/pkg/cmdrunner/step" ) var appPath string @@ -85,61 +91,92 @@ type Env struct { func startServe(path string, verbose bool) (*exec.Cmd, *exec.Cmd) { appName, _ := getAppAndModule(path) - fmt.Printf("\nšŸ“¦ Installing dependencies...\n") - cmdMod := exec.Command("/bin/sh", "-c", "go mod tidy") - cmdMod.Dir = path - if verbose { - cmdMod.Stdout = os.Stdout - } - if err := cmdMod.Run(); err != nil { - log.Fatal("Error running go mod tidy. Please, check ./go.mod") - } - fmt.Printf("šŸš§ Building the application...\n") - cmdMake := exec.Command("/bin/sh", "-c", "make") - cmdMake.Dir = path - if verbose { - cmdMake.Stdout = os.Stdout - } - if err := cmdMake.Run(); err != nil { - log.Fatal("Error in building the application. Please, check ./Makefile") - } - fmt.Printf("šŸ’« Initializing the chain...\n") - cmdInitPre := exec.Command("make", "init-pre") - cmdInitPre.Dir = path - if err := cmdInitPre.Run(); err != nil { - log.Fatal("Error in initializing the chain. Please, check ./init.sh") - } + + var ( + steps step.Steps + + stdout = ioutil.Discard + stderr = ioutil.Discard + + mnemonic = &bytes.Buffer{} + ) if verbose { - cmdInitPre.Stdout = os.Stdout + stdout = os.Stdout + stderr = os.Stderr } - cmdUserString1 := exec.Command("make", "init-user1", "-s") - cmdUserString1.Dir = path - userString1, err := cmdUserString1.Output() - if err != nil { - log.Fatal(err) + + steps.Add(step.New( + step.Exec("go", "mod", "tidy"), + step.PreExec(func() error { + if !isCommandAvailable("go") { + return errors.New("go must be avaiable in your path") + } + fmt.Println("\nšŸ“¦ Installing dependencies...") + return nil + }), + step.PostExec(func(exitErr error) error { + return errors.Wrap(exitErr, "cannot install go modules") + }), + )) + steps.Add(step.New( + step.Exec("make"), + step.PreExec(func() error { + if !isCommandAvailable("make") { + return errors.New("make must be avaiable in your path") + } + fmt.Println("šŸš§ Building the application...") + return nil + }), + step.PostExec(func(exitErr error) error { + return errors.Wrap(exitErr, "cannot build your app") + }), + )) + steps.Add(step.New( + step.Exec("make", "init-pre"), + step.PreExec(func() error { + fmt.Println("šŸ’« Initializing the chain...") + return nil + }), + step.PostExec(func(exitErr error) error { + return errors.Wrap(exitErr, "cannot initialize the chain") + }), + )) + for _, user := range []string{"user1", "user2"} { + steps.Add(step.New( + step.Exec("make", fmt.Sprintf("init-%s", user), "-s"), + step.PostExec(func(exitErr error) error { + if exitErr != nil { + return errors.Wrapf(exitErr, "cannot create %s account", user) + } + var user struct { + Mnemonic string `json:"mnemonic"` + } + if err := json.Unmarshal(mnemonic.Bytes(), &user); err != nil { + return err + } + mnemonic.Reset() + fmt.Printf("šŸ™‚ Created an account. Password (mnemonic): %[1]v\n", user.Mnemonic) + return nil + }), + step.Stdout(mnemonic), + )) } - var userJSON map[string]interface{} - json.Unmarshal(userString1, &userJSON) - fmt.Printf("šŸ™‚ Created an account. Password (mnemonic): %[1]v\n", userJSON["mnemonic"]) - cmdUserString2 := exec.Command("make", "init-user2", "-s") - cmdUserString2.Dir = path - userString2, err := cmdUserString2.Output() - if err != nil { - log.Fatal(err) + steps.Add(step.New( + step.Exec("make", "init-post"), + )) + + runnerOpts := []cmdrunner.Option{ + cmdrunner.DefaultStdout(stdout), + cmdrunner.DefaultStderr(stderr), + cmdrunner.DefaultWorkdir(path), } - json.Unmarshal(userString2, &userJSON) - fmt.Printf("šŸ™‚ Created an account. Password (mnemonic): %[1]v\n", userJSON["mnemonic"]) - cmdInitPost := exec.Command("make", "init-post") - cmdInitPost.Dir = path - if err := cmdInitPost.Run(); err != nil { + + if err := cmdrunner. + New(runnerOpts...). + Run(context.Background(), steps...); err != nil { log.Fatal(err) } - if verbose { - cmdInitPost.Stdout = os.Stdout - } - if verbose { - cmdInitPost.Stdout = os.Stdout - } + cmdTendermint := exec.Command(fmt.Sprintf("%[1]vd", appName), "start") //nolint:gosec // Subprocess launched with function call as argument or cmd arguments cmdTendermint.Dir = path if verbose { diff --git a/pkg/cmdrunner/cmdrunner.go b/pkg/cmdrunner/cmdrunner.go new file mode 100644 index 0000000000..f830a9b6d5 --- /dev/null +++ b/pkg/cmdrunner/cmdrunner.go @@ -0,0 +1,102 @@ +package cmdrunner + +import ( + "context" + "io" + "os/exec" + + "github.com/tendermint/starport/pkg/cmdrunner/step" +) + +type Runner struct { + stdout io.Writer + stderr io.Writer + workdir string +} + +type Option func(*Runner) + +func DefaultStdout(w io.Writer) Option { + return func(r *Runner) { + r.stdout = w + } +} + +func DefaultStderr(w io.Writer) Option { + return func(r *Runner) { + r.stderr = w + } +} + +func DefaultWorkdir(path string) Option { + return func(r *Runner) { + r.workdir = path + } +} + +func New(options ...Option) *Runner { + r := &Runner{} + for _, o := range options { + o(r) + } + return r +} + +// Run blocks untill all steps are complated their executions. +func (r *Runner) Run(ctx context.Context, steps ...*step.Step) error { + if len(steps) == 0 { + // this is a programmer error so better to panic instead of + // returning an err. + panic("no steps to run") + } + for _, s := range steps { + if err := ctx.Err(); err != nil { + return err + } + if s.PreExec != nil { + if err := s.PreExec(); err != nil { + return err + } + } + execErr := r.runStep(ctx, s) + if s.PostExec != nil { + if err := s.PostExec(execErr); err != nil { + return err + } + } + if execErr != nil { + return execErr + } + } + return nil +} + +func (r *Runner) runStep(ctx context.Context, s *step.Step) error { + if s.Exec.Command == "" { + // this is a programmer error so better to panic instead of + // returning an err. + panic("empty command") + } + c := exec.CommandContext(ctx, s.Exec.Command, s.Exec.Args...) + var ( + stdout = s.Stdout + stderr = s.Stderr + dir = s.Workdir + ) + if stdout == nil { + stdout = r.stdout + } + if stderr == nil { + stderr = r.stderr + } + if dir == "" { + dir = r.workdir + } + c.Stdout = stdout + c.Stderr = stderr + c.Dir = dir + if err := c.Start(); err != nil { + return err + } + return c.Wait() +} diff --git a/pkg/cmdrunner/step/step.go b/pkg/cmdrunner/step/step.go new file mode 100644 index 0000000000..392f61a50f --- /dev/null +++ b/pkg/cmdrunner/step/step.go @@ -0,0 +1,76 @@ +package step + +import "io" + +type Step struct { + Exec Execution + PreExec func() error + PostExec func(error) error + Stdout io.Writer + Stderr io.Writer + Workdir string +} + +type Option func(*Step) + +func New(options ...Option) *Step { + s := &Step{} + for _, o := range options { + o(s) + } + return s +} + +type Execution struct { + Command string + Args []string +} + +func Exec(command string, args ...string) Option { + return func(s *Step) { + s.Exec = Execution{command, args} + } +} + +func PreExec(hook func() error) Option { + return func(s *Step) { + s.PreExec = hook + } +} + +func PostExec(hook func(exitErr error) error) Option { // *os.ExitError + return func(s *Step) { + s.PostExec = hook + } +} + +func Stdout(w io.Writer) Option { + return func(s *Step) { + s.Stdout = w + } +} + +func Stderr(w io.Writer) Option { + return func(s *Step) { + s.Stderr = w + } +} + +func Workdir(path string) Option { + return func(s *Step) { + s.Workdir = path + } +} + +type Steps []*Step + +func (s *Steps) Add(step *Step) { + *s = append(*s, step) +} + +// Parallel enables running a step in parallel with others. +// a parallel step only started if previous non-parallel steps are has +// been complated their execution. +func Parallel() Option { + return func(s *Step) {} +} From 0117cc21e9d1e4772c01406889b5b576ddf89e0d Mon Sep 17 00:00:00 2001 From: Denis Fadeev Date: Wed, 29 Jul 2020 14:32:06 +0500 Subject: [PATCH 14/46] Update to @cosmjs/launchpad (#74) * Update to @cosmjs/launchpad * Use public method getAccounts in frontend store --- .../app/templates/frontend/package-lock.json | 106 +++++++++--------- templates/app/templates/frontend/package.json | 2 +- .../app/templates/frontend/src/store/index.js | 43 ++----- 3 files changed, 63 insertions(+), 88 deletions(-) diff --git a/templates/app/templates/frontend/package-lock.json b/templates/app/templates/frontend/package-lock.json index 19bfb32dee..00f4da4184 100644 --- a/templates/app/templates/frontend/package-lock.json +++ b/templates/app/templates/frontend/package-lock.json @@ -1039,62 +1039,64 @@ "to-fast-properties": "^2.0.0" } }, - "@cosmjs/crypto": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.21.1.tgz", - "integrity": "sha512-coRewG7nduMQ3X7DHtc9PhfomUNhWA8KLEcyHMjDTZxz9nd9Ld9Dqk4aVdybeFcICwG3ZRrMTKCJIKHV3d2WIQ==", - "requires": { - "@cosmjs/encoding": "^0.21.1", - "@cosmjs/math": "^0.21.1", - "@cosmjs/utils": "^0.21.1", - "bip39": "^3.0.2", - "bn.js": "^4.11.8", - "elliptic": "^6.4.0", - "js-sha3": "^0.8.0", - "libsodium-wrappers": "^0.7.6", - "pbkdf2": "^3.0.16", - "ripemd160": "^2.0.2", - "sha.js": "^2.4.11", - "type-tagger": "^1.0.0", - "unorm": "^1.5.0" - } - }, - "@cosmjs/encoding": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.21.1.tgz", - "integrity": "sha512-ZHdEpV5/2NhrEApaw3+1BaeRrLi8b9wsuokrwpXPAicVBe7M95JAX4wWnyc9iKFtB2CoVdhzBOHg9m7gw04cgg==", - "requires": { - "base64-js": "^1.3.0", - "bech32": "^1.1.4", - "readonly-date": "^1.0.0" - } - }, - "@cosmjs/math": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.21.1.tgz", - "integrity": "sha512-FljaeolgDBecDINJ8/nq7/umzbklkS/fwze5dPwCcyaHWcGcNgI42VbNLHAJ1PT16v5TvKB508rYW/iwTmcKsQ==", - "requires": { - "bn.js": "^4.11.8" - } - }, - "@cosmjs/sdk38": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@cosmjs/sdk38/-/sdk38-0.21.1.tgz", - "integrity": "sha512-wVS4JJufDLgfULXqhCWfJcJaH7Vj4o7cu8RLNxpoL0QdaE/NWk+rFu/u03I00+VxfzKLTNRTyzTinRQ2lZ7zwA==", - "requires": { - "@cosmjs/crypto": "^0.21.1", - "@cosmjs/encoding": "^0.21.1", - "@cosmjs/math": "^0.21.1", - "@cosmjs/utils": "^0.21.1", + "@cosmjs/launchpad": { + "version": "0.22.0-alpha.0", + "resolved": "https://registry.npmjs.org/@cosmjs/launchpad/-/launchpad-0.22.0-alpha.0.tgz", + "integrity": "sha512-bSjgsNy2skS8o+t5LjVpQ66Ku9Xodzrwa3DAhX9Q7QenQMbfY0uK1Zmx7Tcj3jAOOvmokQ6Wz/DkmDx1zpt3tw==", + "requires": { + "@cosmjs/crypto": "^0.22.0-alpha.0", + "@cosmjs/encoding": "^0.22.0-alpha.0", + "@cosmjs/math": "^0.22.0-alpha.0", + "@cosmjs/utils": "^0.22.0-alpha.0", "axios": "^0.19.0", "fast-deep-equal": "^3.1.1" + }, + "dependencies": { + "@cosmjs/crypto": { + "version": "0.22.0-alpha.0", + "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.22.0-alpha.0.tgz", + "integrity": "sha512-S77zZoamG9cQGJTMnO+m455nCPcJYzF3dtS33PeUHWbn5vBDInSUd8GmF4b6vc0LQlux6PA9lh6Ok1BMBxor4g==", + "requires": { + "@cosmjs/encoding": "^0.22.0-alpha.0", + "@cosmjs/math": "^0.22.0-alpha.0", + "@cosmjs/utils": "^0.22.0-alpha.0", + "bip39": "^3.0.2", + "bn.js": "^4.11.8", + "elliptic": "^6.4.0", + "js-sha3": "^0.8.0", + "libsodium-wrappers": "^0.7.6", + "pbkdf2": "^3.1.1", + "ripemd160": "^2.0.2", + "sha.js": "^2.4.11", + "type-tagger": "^1.0.0", + "unorm": "^1.5.0" + } + }, + "@cosmjs/encoding": { + "version": "0.22.0-alpha.0", + "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.22.0-alpha.0.tgz", + "integrity": "sha512-8NHesh0EvZr25zbKHsoi6yB/pHYYAp62R8edsAT2LW4z70ku54Nr7iU+8P5WtUhjmTvcEH0xPzgtOELAnDGtuA==", + "requires": { + "base64-js": "^1.3.0", + "bech32": "^1.1.4", + "readonly-date": "^1.0.0" + } + }, + "@cosmjs/math": { + "version": "0.22.0-alpha.0", + "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.22.0-alpha.0.tgz", + "integrity": "sha512-mSnA+8cgE6vvFmbAWQOdVJM9e+sg0auIISCE8R8E25zOS8u0IxWeZftpDtsVqpHrU/+WoKk8QBQeALOi0u1wfw==", + "requires": { + "bn.js": "^4.11.8" + } + }, + "@cosmjs/utils": { + "version": "0.22.0-alpha.0", + "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.22.0-alpha.0.tgz", + "integrity": "sha512-jKJCmLJVEA3Heu8rZ6Bw+8Htip3NSxZQ7j4FC19LHTtjBtI9dX66SE2bUcu6JJVEPUprCYFVfEV8fmFjxgeFkA==" + } } }, - "@cosmjs/utils": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.21.1.tgz", - "integrity": "sha512-WTBPm4IQIf5WQeBqMHa1Uk0mgoGbTKMDTXKpM7lP77G+AEYezsDrFD6OFJstSF7lTvrp1bF/Jbl9d4K6ojzMFQ==" - }, "@hapi/address": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", diff --git a/templates/app/templates/frontend/package.json b/templates/app/templates/frontend/package.json index 7bc6be1dd9..1d2c7dff8e 100644 --- a/templates/app/templates/frontend/package.json +++ b/templates/app/templates/frontend/package.json @@ -8,7 +8,7 @@ "build": "vue-cli-service build" }, "dependencies": { - "@cosmjs/sdk38": "^0.21.1", + "@cosmjs/launchpad": "^0.22.0-alpha.0", "axios": "^0.19.2", "bip39": "^3.0.2", "core-js": "^3.6.5", diff --git a/templates/app/templates/frontend/src/store/index.js b/templates/app/templates/frontend/src/store/index.js index bfd24f8be2..f176750341 100644 --- a/templates/app/templates/frontend/src/store/index.js +++ b/templates/app/templates/frontend/src/store/index.js @@ -2,21 +2,15 @@ import Vue from "vue"; import Vuex from "vuex"; import axios from "axios"; import app from "./app.js"; -import { - Secp256k1Pen, - SigningCosmosClient, - makeSignBytes, -} from "@cosmjs/sdk38"; +import { Secp256k1Wallet, SigningCosmosClient } from "@cosmjs/launchpad"; Vue.use(Vuex); -const RPC = "https://localhost:26657"; const API = "http://localhost:8080"; export default new Vuex.Store({ state: { app, - wallet: {}, account: {}, chain_id: "", data: {}, @@ -26,9 +20,6 @@ export default new Vuex.Store({ accountUpdate(state, { account }) { state.account = account; }, - walletUpdate(state, { wallet }) { - state.wallet = wallet; - }, chainIdSet(state, { chain_id }) { state.chain_id = chain_id; }, @@ -54,15 +45,14 @@ export default new Vuex.Store({ }, async accountSignIn({ commit }, { mnemonic }) { return new Promise(async (resolve, reject) => { - const wallet = await Secp256k1Pen.fromMnemonic(mnemonic); - const address = wallet.address("cosmos"); + const wallet = await Secp256k1Wallet.fromMnemonic(mnemonic); + const [{ address }] = await wallet.getAccounts(); const url = `${API}/auth/accounts/${address}`; const acc = (await axios.get(url)).data; if (acc.result.value.address === address) { const account = acc.result.value; const client = new SigningCosmosClient(API, address, wallet); commit("accountUpdate", { account }); - commit("walletUpdate", { wallet }); commit("clientUpdate", { client }); resolve(account); } else { @@ -83,30 +73,13 @@ export default new Vuex.Store({ commit("accountUpdate", { account }); }, async entitySubmit({ state }, { type, body }) { - const accountURL = `${API}/auth/accounts/${state.client.senderAddress}`; - const account = (await axios.get(accountURL)).data.result.value; - const accountNumber = account.account_number; - const sequence = account.sequence; - const address = state.client.senderAddress; - const chain_id = await state.client.getChainId(); - const req = { - base_req: { chain_id, from: address }, - creator: address, - ...body, - }; + const { chain_id } = state; + const creator = state.client.senderAddress; + const base_req = { chain_id, from: creator }; + const req = { base_req, creator, ...body }; const { data } = await axios.post(`${API}/${chain_id}/${type}`, req); const { msg, fee, memo } = data.value; - const signBytes = makeSignBytes( - msg, - fee, - chain_id, - memo, - `${accountNumber}`, - `${sequence}` - ); - const signatures = [await state.wallet.sign(signBytes)]; - const signedTx = { msg: msg, fee, memo, signatures }; - return await state.client.postTx(signedTx); + return await state.client.signAndPost(msg, fee, memo); }, }, }); From f37853ad84d3c29cbdd2dc60e8cc5a4755c577e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Orkun=20K=C3=BCl=C3=A7e?= Date: Wed, 29 Jul 2020 15:37:32 +0300 Subject: [PATCH 15/46] Update CosmWasm docs link (#83) --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index c6f081a54b..198de543c3 100644 --- a/readme.md +++ b/readme.md @@ -70,7 +70,7 @@ To add a post run `blogcli tx blog create-post "My title" "This is a blog" --fro starport add wasm ``` -Adds smart contracts with [CosmWasm](https://www.cosmwasm.com/). Follow a short [smart contract tutorial](https://www.notion.so/Smart-contracts-with-CosmWasm-c6fbcd584b78437a843e738b922dc108) to get started. +Adds smart contracts with [CosmWasm](https://docs.cosmwasm.com). Follow a short [smart contract tutorial](https://www.notion.so/Smart-contracts-with-CosmWasm-c6fbcd584b78437a843e738b922dc108) to get started. ## More tutorials From 22efb657896871aed857d6ed295ea53796c7de68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Thu, 30 Jul 2020 09:38:52 +0300 Subject: [PATCH 16/46] starport/cmd: use cmdrunner to start cli servers (#82) * starport/cmd: use cmdrunner to start cli servers * some refactoring related to `pkg/cmdrunner` and `starport/cmd`. * starport/cmd: run cli servers and dev server in parallel * trig ci --- go.mod | 2 +- interface/cli/starport/cmd/serve.go | 103 ++++++++++++++++------------ pkg/cmdrunner/cmdrunner.go | 51 +++++++++----- pkg/cmdrunner/step/step.go | 20 +++--- 4 files changed, 107 insertions(+), 69 deletions(-) diff --git a/go.mod b/go.mod index 96fe8b2190..3a0ca4050f 100644 --- a/go.mod +++ b/go.mod @@ -26,6 +26,6 @@ require ( golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de // indirect golang.org/x/mod v0.3.0 golang.org/x/net v0.0.0-20200625001655-4c5254603344 // indirect - golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 // indirect + golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1 // indirect ) diff --git a/interface/cli/starport/cmd/serve.go b/interface/cli/starport/cmd/serve.go index 44076783ff..4c915b69ce 100644 --- a/interface/cli/starport/cmd/serve.go +++ b/interface/cli/starport/cmd/serve.go @@ -43,14 +43,15 @@ func serveHandler(cmd *cobra.Command, args []string) { cmdNpm := gocmd.NewCmd("npm", "run", "dev") cmdNpm.Dir = filepath.Join(appPath, "frontend") cmdNpm.Start() - cmdt, cmdr := startServe(appPath, verbose) + cancel := startServe(appPath, verbose) + appName, _ := getAppAndModule(appPath) + go runDevServer(appName, verbose) c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt) go func() { <-c cmdNpm.Stop() - cmdr.Process.Kill() - cmdt.Process.Kill() + cancel() os.Exit(0) }() w := watcher.New() @@ -59,9 +60,8 @@ func serveHandler(cmd *cobra.Command, args []string) { for { select { case <-w.Event: - cmdr.Process.Kill() - cmdt.Process.Kill() - cmdt, cmdr = startServe(appPath, verbose) + cancel() + cancel = startServe(appPath, verbose) case err := <-w.Error: log.Println(err) case <-w.Closed: @@ -89,7 +89,7 @@ type Env struct { NodeJS bool `json:"node_js"` } -func startServe(path string, verbose bool) (*exec.Cmd, *exec.Cmd) { +func startServe(path string, verbose bool) context.CancelFunc { appName, _ := getAppAndModule(path) var ( @@ -152,7 +152,7 @@ func startServe(path string, verbose bool) (*exec.Cmd, *exec.Cmd) { Mnemonic string `json:"mnemonic"` } if err := json.Unmarshal(mnemonic.Bytes(), &user); err != nil { - return err + return errors.Wrap(err, "cannot decode mnemonic") } mnemonic.Reset() fmt.Printf("šŸ™‚ Created an account. Password (mnemonic): %[1]v\n", user.Mnemonic) @@ -165,40 +165,65 @@ func startServe(path string, verbose bool) (*exec.Cmd, *exec.Cmd) { step.Exec("make", "init-post"), )) - runnerOpts := []cmdrunner.Option{ - cmdrunner.DefaultStdout(stdout), - cmdrunner.DefaultStderr(stderr), - cmdrunner.DefaultWorkdir(path), - } - if err := cmdrunner. - New(runnerOpts...). + New(cmdrunner.DefaultStdout(stdout), + cmdrunner.DefaultStderr(stderr), + cmdrunner.DefaultWorkdir(path)). Run(context.Background(), steps...); err != nil { log.Fatal(err) } - cmdTendermint := exec.Command(fmt.Sprintf("%[1]vd", appName), "start") //nolint:gosec // Subprocess launched with function call as argument or cmd arguments - cmdTendermint.Dir = path - if verbose { - fmt.Printf("šŸŒ Running a server at http://localhost:26657 (Tendermint)\n") - cmdTendermint.Stdout = os.Stdout - } else { - fmt.Printf("šŸŒ Running a Cosmos '%[1]v' app with Tendermint.\n", appName) - } - if err := cmdTendermint.Start(); err != nil { - log.Fatal(fmt.Sprintf("Error in running %[1]vd start", appName), err) - } - cmdREST := exec.Command(fmt.Sprintf("%[1]vcli", appName), "rest-server") //nolint:gosec // Subprocess launched with function call as argument or cmd arguments - cmdREST.Dir = path - if verbose { - fmt.Printf("šŸŒ Running a server at http://localhost:1317 (LCD)\n") - cmdREST.Stdout = os.Stdout - } - if err := cmdREST.Start(); err != nil { - log.Fatal(fmt.Sprintf("Error in running %[1]vcli rest-server", appName)) - } + var servers step.Steps + servers.Add(step.New( + step.Exec(fmt.Sprintf("%[1]vd", appName), "start"), //nolint:gosec // Subprocess launched with function call as argument or cmd arguments + step.InExec(func() error { + if verbose { + fmt.Println("šŸŒ Running a server at http://localhost:26657 (Tendermint)") + } else { + fmt.Printf("šŸŒ Running a Cosmos '%[1]v' app with Tendermint.\n", appName) + } + return nil + }), + step.PostExec(func(exitErr error) error { + return errors.Wrapf(exitErr, "cannot run %[1]vd start", appName) + }), + )) + servers.Add(step.New( + step.Exec(fmt.Sprintf("%[1]vcli", appName), "rest-server"), //nolint:gosec // Subprocess launched with function call as argument or cmd arguments + step.InExec(func() error { + if verbose { + fmt.Println("šŸŒ Running a server at http://localhost:1317 (LCD)") + } + return nil + }), + step.PostExec(func(exitErr error) error { + return errors.Wrapf(exitErr, "cannot run %[1]vcli rest-server", appName) + }), + )) + + serverRunner := cmdrunner.New( + cmdrunner.RunParallel(), + cmdrunner.DefaultStdout(stdout), + cmdrunner.DefaultStderr(stderr), + cmdrunner.DefaultWorkdir(path), + ) + + ctx, cancel := context.WithCancel(context.Background()) + go func() { + if err := serverRunner.Run(ctx, servers...); err != nil { + if _, ok := errors.Cause(err).(*exec.ExitError); !ok { + log.Fatal(err) + } + } + }() + return cancel +} + +func runDevServer(appName string, verbose bool) error { if verbose { fmt.Printf("šŸ”§ Running dev interface at http://localhost:12345\n\n") + } else { + fmt.Printf("\nšŸš€ Get started: http://localhost:12345/\n\n") } router := mux.NewRouter() devUI := packr.New("ui/dist", "../../../../ui/dist") @@ -243,13 +268,7 @@ func startServe(path string, verbose bool) (*exec.Cmd, *exec.Cmd) { } }) router.PathPrefix("/").Handler(http.FileServer(devUI)) - go func() { - http.ListenAndServe(":12345", router) - }() - if !verbose { - fmt.Printf("\nšŸš€ Get started: http://localhost:12345/\n\n") - } - return cmdTendermint, cmdREST + return http.ListenAndServe(":12345", router) } func isCommandAvailable(name string) bool { diff --git a/pkg/cmdrunner/cmdrunner.go b/pkg/cmdrunner/cmdrunner.go index f830a9b6d5..80c6003ed2 100644 --- a/pkg/cmdrunner/cmdrunner.go +++ b/pkg/cmdrunner/cmdrunner.go @@ -6,12 +6,14 @@ import ( "os/exec" "github.com/tendermint/starport/pkg/cmdrunner/step" + "golang.org/x/sync/errgroup" ) type Runner struct { - stdout io.Writer - stderr io.Writer - workdir string + stdout io.Writer + stderr io.Writer + workdir string + runParallel bool } type Option func(*Runner) @@ -34,6 +36,12 @@ func DefaultWorkdir(path string) Option { } } +func RunParallel() Option { + return func(r *Runner) { + r.runParallel = true + } +} + func New(options ...Option) *Runner { r := &Runner{} for _, o := range options { @@ -49,35 +57,44 @@ func (r *Runner) Run(ctx context.Context, steps ...*step.Step) error { // returning an err. panic("no steps to run") } + g, ctx := errgroup.WithContext(ctx) for _, s := range steps { if err := ctx.Err(); err != nil { return err } - if s.PreExec != nil { - if err := s.PreExec(); err != nil { + if err := s.PreExec(); err != nil { + return err + } + c := r.newCommand(ctx, s) + startErr := c.Start() + if startErr != nil { + if err := s.PostExec(startErr); err != nil { return err } + continue } - execErr := r.runStep(ctx, s) - if s.PostExec != nil { - if err := s.PostExec(execErr); err != nil { + if err := s.InExec(); err != nil { + return err + } + if r.runParallel { + g.Go(func() error { + return s.PostExec(c.Wait()) + }) + } else { + if err := s.PostExec(c.Wait()); err != nil { return err } } - if execErr != nil { - return execErr - } } - return nil + return g.Wait() } -func (r *Runner) runStep(ctx context.Context, s *step.Step) error { +func (r *Runner) newCommand(ctx context.Context, s *step.Step) *exec.Cmd { if s.Exec.Command == "" { // this is a programmer error so better to panic instead of // returning an err. panic("empty command") } - c := exec.CommandContext(ctx, s.Exec.Command, s.Exec.Args...) var ( stdout = s.Stdout stderr = s.Stderr @@ -92,11 +109,9 @@ func (r *Runner) runStep(ctx context.Context, s *step.Step) error { if dir == "" { dir = r.workdir } + c := exec.CommandContext(ctx, s.Exec.Command, s.Exec.Args...) c.Stdout = stdout c.Stderr = stderr c.Dir = dir - if err := c.Start(); err != nil { - return err - } - return c.Wait() + return c } diff --git a/pkg/cmdrunner/step/step.go b/pkg/cmdrunner/step/step.go index 392f61a50f..b8292fae8c 100644 --- a/pkg/cmdrunner/step/step.go +++ b/pkg/cmdrunner/step/step.go @@ -5,6 +5,7 @@ import "io" type Step struct { Exec Execution PreExec func() error + InExec func() error PostExec func(error) error Stdout io.Writer Stderr io.Writer @@ -14,7 +15,11 @@ type Step struct { type Option func(*Step) func New(options ...Option) *Step { - s := &Step{} + s := &Step{ + PreExec: func() error { return nil }, + InExec: func() error { return nil }, + PostExec: func(exitErr error) error { return exitErr }, + } for _, o := range options { o(s) } @@ -38,6 +43,12 @@ func PreExec(hook func() error) Option { } } +func InExec(hook func() error) Option { + return func(s *Step) { + s.InExec = hook + } +} + func PostExec(hook func(exitErr error) error) Option { // *os.ExitError return func(s *Step) { s.PostExec = hook @@ -67,10 +78,3 @@ type Steps []*Step func (s *Steps) Add(step *Step) { *s = append(*s, step) } - -// Parallel enables running a step in parallel with others. -// a parallel step only started if previous non-parallel steps are has -// been complated their execution. -func Parallel() Option { - return func(s *Step) {} -} From e1dffea1e6c85a13281f28c43640689f92828723 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Thu, 30 Jul 2020 10:21:52 +0300 Subject: [PATCH 17/46] cli/starport/cmd: use context for cancellation (#86) and more simplifications on serve. --- go.mod | 1 - go.sum | 4 -- interface/cli/starport/cmd/serve.go | 94 ++++++++++++++++------------- 3 files changed, 51 insertions(+), 48 deletions(-) diff --git a/go.mod b/go.mod index 3a0ca4050f..ff0dd6c005 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,6 @@ go 1.14 require ( github.com/Pallinder/go-randomdata v1.2.0 github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 // indirect - github.com/go-cmd/cmd v1.2.0 github.com/gobuffalo/envy v1.9.0 // indirect github.com/gobuffalo/genny v0.6.0 github.com/gobuffalo/packr/v2 v2.8.0 diff --git a/go.sum b/go.sum index c4dd98b479..7f7792ab7e 100644 --- a/go.sum +++ b/go.sum @@ -30,14 +30,10 @@ github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga 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-cmd/cmd v1.2.0 h1:Aohz0ZG0nQbvT4z55Mh+fdegX48GSAXL3cSsbYxRfvI= -github.com/go-cmd/cmd v1.2.0/go.mod h1:XgKkd0L6sv9WcYV0FS8RfG1RJCSTVHTsLeAD2pTgHt0= 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-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-test/deep v1.0.5 h1:AKODKU3pDH1RzZzm6YZu77YWtEAq6uh1rLIAQlay2qc= -github.com/go-test/deep v1.0.5/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= 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/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w= diff --git a/interface/cli/starport/cmd/serve.go b/interface/cli/starport/cmd/serve.go index 4c915b69ce..87ab865541 100644 --- a/interface/cli/starport/cmd/serve.go +++ b/interface/cli/starport/cmd/serve.go @@ -14,7 +14,6 @@ import ( "path/filepath" "time" - gocmd "github.com/go-cmd/cmd" "github.com/gobuffalo/packr/v2" "github.com/gorilla/mux" "github.com/pkg/errors" @@ -31,56 +30,75 @@ func NewServe() *cobra.Command { Use: "serve", Short: "Launches a reloading server", Args: cobra.ExactArgs(0), - Run: serveHandler, + RunE: serveHandler, } c.Flags().StringVarP(&appPath, "path", "p", "", "path of the app") c.Flags().BoolP("verbose", "v", false, "Verbose output") return c } -func serveHandler(cmd *cobra.Command, args []string) { +func serveHandler(cmd *cobra.Command, args []string) error { verbose, _ := cmd.Flags().GetBool("verbose") - cmdNpm := gocmd.NewCmd("npm", "run", "dev") - cmdNpm.Dir = filepath.Join(appPath, "frontend") - cmdNpm.Start() - cancel := startServe(appPath, verbose) appName, _ := getAppAndModule(appPath) - go runDevServer(appName, verbose) - c := make(chan os.Signal, 1) - signal.Notify(c, os.Interrupt) + app := App{ + Name: appName, + Path: appPath, + } + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + quit := make(chan os.Signal, 1) + signal.Notify(quit, os.Interrupt) go func() { - <-c - cmdNpm.Stop() + <-quit cancel() - os.Exit(0) }() + + err := Serve(ctx, app, verbose) + if err == context.Canceled { + return nil + } + return err +} + +type App struct { + Name string + Path string +} + +func Serve(ctx context.Context, app App, verbose bool) error { + cmdNpm := exec.CommandContext(ctx, "npm", "run", "dev") + cmdNpm.Dir = filepath.Join(app.Path, "frontend") + cmdNpm.Start() + serveCtx, cancel := context.WithCancel(ctx) + startServe(serveCtx, app, verbose) // TODO handle error + go runDevServer(app.Name, verbose) w := watcher.New() w.SetMaxEvents(1) go func() { for { select { + case <-ctx.Done(): + w.Close() case <-w.Event: cancel() - cancel = startServe(appPath, verbose) + serveCtx, cancel = context.WithCancel(ctx) + startServe(serveCtx, app, verbose) // TODO handle error case err := <-w.Error: log.Println(err) - case <-w.Closed: - return } } }() - if err := w.AddRecursive(filepath.Join(appPath, "./app")); err != nil { - log.Fatalln(err) - } - if err := w.AddRecursive(filepath.Join(appPath, "./cmd")); err != nil { + if err := w.AddRecursive(filepath.Join(app.Path, "./app")); err != nil { log.Fatalln(err) } - if err := w.AddRecursive(filepath.Join(appPath, "./x")); err != nil { + if err := w.AddRecursive(filepath.Join(app.Path, "./cmd")); err != nil { log.Fatalln(err) } - if err := w.Start(time.Millisecond * 1000); err != nil { + if err := w.AddRecursive(filepath.Join(app.Path, "./x")); err != nil { log.Fatalln(err) } + return w.Start(time.Millisecond * 1000) } // Env ... @@ -89,9 +107,7 @@ type Env struct { NodeJS bool `json:"node_js"` } -func startServe(path string, verbose bool) context.CancelFunc { - appName, _ := getAppAndModule(path) - +func startServe(ctx context.Context, app App, verbose bool) error { var ( steps step.Steps @@ -168,28 +184,28 @@ func startServe(path string, verbose bool) context.CancelFunc { if err := cmdrunner. New(cmdrunner.DefaultStdout(stdout), cmdrunner.DefaultStderr(stderr), - cmdrunner.DefaultWorkdir(path)). - Run(context.Background(), steps...); err != nil { + cmdrunner.DefaultWorkdir(app.Path)). + Run(ctx, steps...); err != nil { log.Fatal(err) } var servers step.Steps servers.Add(step.New( - step.Exec(fmt.Sprintf("%[1]vd", appName), "start"), //nolint:gosec // Subprocess launched with function call as argument or cmd arguments + step.Exec(fmt.Sprintf("%[1]vd", app.Name), "start"), //nolint:gosec // Subprocess launched with function call as argument or cmd arguments step.InExec(func() error { if verbose { fmt.Println("šŸŒ Running a server at http://localhost:26657 (Tendermint)") } else { - fmt.Printf("šŸŒ Running a Cosmos '%[1]v' app with Tendermint.\n", appName) + fmt.Printf("šŸŒ Running a Cosmos '%[1]v' app with Tendermint.\n", app.Name) } return nil }), step.PostExec(func(exitErr error) error { - return errors.Wrapf(exitErr, "cannot run %[1]vd start", appName) + return errors.Wrapf(exitErr, "cannot run %[1]vd start", app.Name) }), )) servers.Add(step.New( - step.Exec(fmt.Sprintf("%[1]vcli", appName), "rest-server"), //nolint:gosec // Subprocess launched with function call as argument or cmd arguments + step.Exec(fmt.Sprintf("%[1]vcli", app.Name), "rest-server"), //nolint:gosec // Subprocess launched with function call as argument or cmd arguments step.InExec(func() error { if verbose { fmt.Println("šŸŒ Running a server at http://localhost:1317 (LCD)") @@ -197,7 +213,7 @@ func startServe(path string, verbose bool) context.CancelFunc { return nil }), step.PostExec(func(exitErr error) error { - return errors.Wrapf(exitErr, "cannot run %[1]vcli rest-server", appName) + return errors.Wrapf(exitErr, "cannot run %[1]vcli rest-server", app.Name) }), )) @@ -205,18 +221,10 @@ func startServe(path string, verbose bool) context.CancelFunc { cmdrunner.RunParallel(), cmdrunner.DefaultStdout(stdout), cmdrunner.DefaultStderr(stderr), - cmdrunner.DefaultWorkdir(path), + cmdrunner.DefaultWorkdir(app.Path), ) - - ctx, cancel := context.WithCancel(context.Background()) - go func() { - if err := serverRunner.Run(ctx, servers...); err != nil { - if _, ok := errors.Cause(err).(*exec.ExitError); !ok { - log.Fatal(err) - } - } - }() - return cancel + go serverRunner.Run(ctx, servers...) // TODO handle err + return nil } func runDevServer(appName string, verbose bool) error { From 7f3cd33b0d6c3a0fedbc023bc3511dfadd85befb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Thu, 30 Jul 2020 10:36:27 +0300 Subject: [PATCH 18/46] services/serve: move serve logic from starport/cmd (#87) to the new services/serve package. --- go.mod | 1 + go.sum | 4 + interface/cli/starport/cmd/serve.go | 243 +-------------------------- services/serve/serve.go | 245 ++++++++++++++++++++++++++++ 4 files changed, 253 insertions(+), 240 deletions(-) create mode 100644 services/serve/serve.go diff --git a/go.mod b/go.mod index ff0dd6c005..9b241ceaa7 100644 --- a/go.mod +++ b/go.mod @@ -27,4 +27,5 @@ require ( golang.org/x/net v0.0.0-20200625001655-4c5254603344 // indirect golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1 // indirect + golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7 // indirect ) diff --git a/go.sum b/go.sum index 7f7792ab7e..3720094c38 100644 --- a/go.sum +++ b/go.sum @@ -54,6 +54,7 @@ github.com/gobuffalo/logger v1.0.3/go.mod h1:SoeejUwldiS7ZsyCBphOGURmWdwUFXs0J7T 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 v1.30.1 h1:hu1fuVR3fXEZR7rXNW3h8rqSML8EVAf6KNm0NKO/wKg= 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= @@ -200,6 +201,7 @@ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xtgo/uuid v0.0.0-20140804021211-a0b114877d4c h1:3lbZUMbMiGUW/LMkfsEABsc5zNT9+b1CvsJx47JzJ8g= github.com/xtgo/uuid v0.0.0-20140804021211-a0b114877d4c/go.mod h1:UrdRz5enIKZ63MEE3IF9l2/ebyx59GyGgPi+tICQdmM= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= 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= @@ -263,6 +265,8 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191224055732-dd894d0a8a40/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200308013534-11ec41452d41 h1:9Di9iYgOt9ThCipBxChBVhgNipDoE5mxO84rQV7D0FE= golang.org/x/tools v0.0.0-20200308013534-11ec41452d41/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7 h1:LHW24ah7B+uV/OePwNP0p/t889F3QSyLvY8Sg/bK0SY= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= 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= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= diff --git a/interface/cli/starport/cmd/serve.go b/interface/cli/starport/cmd/serve.go index 87ab865541..d94e6c51d0 100644 --- a/interface/cli/starport/cmd/serve.go +++ b/interface/cli/starport/cmd/serve.go @@ -1,26 +1,12 @@ package starportcmd import ( - "bytes" "context" - "encoding/json" - "fmt" - "io/ioutil" - "log" - "net/http" "os" - "os/exec" "os/signal" - "path/filepath" - "time" - "github.com/gobuffalo/packr/v2" - "github.com/gorilla/mux" - "github.com/pkg/errors" - "github.com/radovskyb/watcher" "github.com/spf13/cobra" - "github.com/tendermint/starport/pkg/cmdrunner" - "github.com/tendermint/starport/pkg/cmdrunner/step" + starportserve "github.com/tendermint/starport/services/serve" ) var appPath string @@ -40,7 +26,7 @@ func NewServe() *cobra.Command { func serveHandler(cmd *cobra.Command, args []string) error { verbose, _ := cmd.Flags().GetBool("verbose") appName, _ := getAppAndModule(appPath) - app := App{ + app := starportserve.App{ Name: appName, Path: appPath, } @@ -54,232 +40,9 @@ func serveHandler(cmd *cobra.Command, args []string) error { cancel() }() - err := Serve(ctx, app, verbose) + err := starportserve.Serve(ctx, app, verbose) if err == context.Canceled { return nil } return err } - -type App struct { - Name string - Path string -} - -func Serve(ctx context.Context, app App, verbose bool) error { - cmdNpm := exec.CommandContext(ctx, "npm", "run", "dev") - cmdNpm.Dir = filepath.Join(app.Path, "frontend") - cmdNpm.Start() - serveCtx, cancel := context.WithCancel(ctx) - startServe(serveCtx, app, verbose) // TODO handle error - go runDevServer(app.Name, verbose) - w := watcher.New() - w.SetMaxEvents(1) - go func() { - for { - select { - case <-ctx.Done(): - w.Close() - case <-w.Event: - cancel() - serveCtx, cancel = context.WithCancel(ctx) - startServe(serveCtx, app, verbose) // TODO handle error - case err := <-w.Error: - log.Println(err) - } - } - }() - if err := w.AddRecursive(filepath.Join(app.Path, "./app")); err != nil { - log.Fatalln(err) - } - if err := w.AddRecursive(filepath.Join(app.Path, "./cmd")); err != nil { - log.Fatalln(err) - } - if err := w.AddRecursive(filepath.Join(app.Path, "./x")); err != nil { - log.Fatalln(err) - } - return w.Start(time.Millisecond * 1000) -} - -// Env ... -type Env struct { - ChainID string `json:"chain_id"` - NodeJS bool `json:"node_js"` -} - -func startServe(ctx context.Context, app App, verbose bool) error { - var ( - steps step.Steps - - stdout = ioutil.Discard - stderr = ioutil.Discard - - mnemonic = &bytes.Buffer{} - ) - if verbose { - stdout = os.Stdout - stderr = os.Stderr - } - - steps.Add(step.New( - step.Exec("go", "mod", "tidy"), - step.PreExec(func() error { - if !isCommandAvailable("go") { - return errors.New("go must be avaiable in your path") - } - fmt.Println("\nšŸ“¦ Installing dependencies...") - return nil - }), - step.PostExec(func(exitErr error) error { - return errors.Wrap(exitErr, "cannot install go modules") - }), - )) - steps.Add(step.New( - step.Exec("make"), - step.PreExec(func() error { - if !isCommandAvailable("make") { - return errors.New("make must be avaiable in your path") - } - fmt.Println("šŸš§ Building the application...") - return nil - }), - step.PostExec(func(exitErr error) error { - return errors.Wrap(exitErr, "cannot build your app") - }), - )) - steps.Add(step.New( - step.Exec("make", "init-pre"), - step.PreExec(func() error { - fmt.Println("šŸ’« Initializing the chain...") - return nil - }), - step.PostExec(func(exitErr error) error { - return errors.Wrap(exitErr, "cannot initialize the chain") - }), - )) - for _, user := range []string{"user1", "user2"} { - steps.Add(step.New( - step.Exec("make", fmt.Sprintf("init-%s", user), "-s"), - step.PostExec(func(exitErr error) error { - if exitErr != nil { - return errors.Wrapf(exitErr, "cannot create %s account", user) - } - var user struct { - Mnemonic string `json:"mnemonic"` - } - if err := json.Unmarshal(mnemonic.Bytes(), &user); err != nil { - return errors.Wrap(err, "cannot decode mnemonic") - } - mnemonic.Reset() - fmt.Printf("šŸ™‚ Created an account. Password (mnemonic): %[1]v\n", user.Mnemonic) - return nil - }), - step.Stdout(mnemonic), - )) - } - steps.Add(step.New( - step.Exec("make", "init-post"), - )) - - if err := cmdrunner. - New(cmdrunner.DefaultStdout(stdout), - cmdrunner.DefaultStderr(stderr), - cmdrunner.DefaultWorkdir(app.Path)). - Run(ctx, steps...); err != nil { - log.Fatal(err) - } - - var servers step.Steps - servers.Add(step.New( - step.Exec(fmt.Sprintf("%[1]vd", app.Name), "start"), //nolint:gosec // Subprocess launched with function call as argument or cmd arguments - step.InExec(func() error { - if verbose { - fmt.Println("šŸŒ Running a server at http://localhost:26657 (Tendermint)") - } else { - fmt.Printf("šŸŒ Running a Cosmos '%[1]v' app with Tendermint.\n", app.Name) - } - return nil - }), - step.PostExec(func(exitErr error) error { - return errors.Wrapf(exitErr, "cannot run %[1]vd start", app.Name) - }), - )) - servers.Add(step.New( - step.Exec(fmt.Sprintf("%[1]vcli", app.Name), "rest-server"), //nolint:gosec // Subprocess launched with function call as argument or cmd arguments - step.InExec(func() error { - if verbose { - fmt.Println("šŸŒ Running a server at http://localhost:1317 (LCD)") - } - return nil - }), - step.PostExec(func(exitErr error) error { - return errors.Wrapf(exitErr, "cannot run %[1]vcli rest-server", app.Name) - }), - )) - - serverRunner := cmdrunner.New( - cmdrunner.RunParallel(), - cmdrunner.DefaultStdout(stdout), - cmdrunner.DefaultStderr(stderr), - cmdrunner.DefaultWorkdir(app.Path), - ) - go serverRunner.Run(ctx, servers...) // TODO handle err - return nil -} - -func runDevServer(appName string, verbose bool) error { - if verbose { - fmt.Printf("šŸ”§ Running dev interface at http://localhost:12345\n\n") - } else { - fmt.Printf("\nšŸš€ Get started: http://localhost:12345/\n\n") - } - router := mux.NewRouter() - devUI := packr.New("ui/dist", "../../../../ui/dist") - router.HandleFunc("/env", func(w http.ResponseWriter, r *http.Request) { - env := Env{appName, isCommandAvailable("node")} - js, err := json.Marshal(env) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - w.Header().Set("Content-Type", "application/json") - w.Write(js) - }) - router.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) { - res, err := http.Get("http://localhost:1317/node_info") - if err != nil || res.StatusCode != 200 { - w.WriteHeader(http.StatusInternalServerError) - w.Write([]byte("500 error")) - } else if res.StatusCode == 200 { - w.WriteHeader(http.StatusOK) - w.Write([]byte("200 ok")) - } - }) - router.HandleFunc("/rpc", func(w http.ResponseWriter, r *http.Request) { - res, err := http.Get("http://localhost:26657") - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - } else if res.StatusCode == 200 { - w.WriteHeader(http.StatusOK) - } else { - w.WriteHeader(http.StatusInternalServerError) - } - }) - router.HandleFunc("/frontend", func(w http.ResponseWriter, r *http.Request) { - res, err := http.Get("http://localhost:8080") - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - } else if res.StatusCode == 200 { - w.WriteHeader(http.StatusOK) - } else { - w.WriteHeader(http.StatusInternalServerError) - } - }) - router.PathPrefix("/").Handler(http.FileServer(devUI)) - return http.ListenAndServe(":12345", router) -} - -func isCommandAvailable(name string) bool { - _, err := exec.LookPath(name) - return err == nil -} diff --git a/services/serve/serve.go b/services/serve/serve.go new file mode 100644 index 0000000000..f22a9bdd16 --- /dev/null +++ b/services/serve/serve.go @@ -0,0 +1,245 @@ +package starportserve + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "io/ioutil" + "log" + "net/http" + "os" + "os/exec" + "path/filepath" + "time" + + "github.com/gobuffalo/packr/v2" + "github.com/gorilla/mux" + "github.com/pkg/errors" + "github.com/radovskyb/watcher" + "github.com/tendermint/starport/pkg/cmdrunner" + "github.com/tendermint/starport/pkg/cmdrunner/step" +) + +type App struct { + Name string + Path string +} + +func Serve(ctx context.Context, app App, verbose bool) error { + cmdNpm := exec.CommandContext(ctx, "npm", "run", "dev") + cmdNpm.Dir = filepath.Join(app.Path, "frontend") + cmdNpm.Start() + serveCtx, cancel := context.WithCancel(ctx) + startServe(serveCtx, app, verbose) // TODO handle error + go runDevServer(app.Name, verbose) + w := watcher.New() + w.SetMaxEvents(1) + go func() { + for { + select { + case <-ctx.Done(): + w.Close() + case <-w.Event: + cancel() + serveCtx, cancel = context.WithCancel(ctx) + startServe(serveCtx, app, verbose) // TODO handle error + case err := <-w.Error: + log.Println(err) + } + } + }() + if err := w.AddRecursive(filepath.Join(app.Path, "./app")); err != nil { + log.Fatalln(err) + } + if err := w.AddRecursive(filepath.Join(app.Path, "./cmd")); err != nil { + log.Fatalln(err) + } + if err := w.AddRecursive(filepath.Join(app.Path, "./x")); err != nil { + log.Fatalln(err) + } + return w.Start(time.Millisecond * 1000) +} + +// Env ... +type Env struct { + ChainID string `json:"chain_id"` + NodeJS bool `json:"node_js"` +} + +func startServe(ctx context.Context, app App, verbose bool) error { + var ( + steps step.Steps + + stdout = ioutil.Discard + stderr = ioutil.Discard + + mnemonic = &bytes.Buffer{} + ) + if verbose { + stdout = os.Stdout + stderr = os.Stderr + } + + steps.Add(step.New( + step.Exec("go", "mod", "tidy"), + step.PreExec(func() error { + if !isCommandAvailable("go") { + return errors.New("go must be avaiable in your path") + } + fmt.Println("\nšŸ“¦ Installing dependencies...") + return nil + }), + step.PostExec(func(exitErr error) error { + return errors.Wrap(exitErr, "cannot install go modules") + }), + )) + steps.Add(step.New( + step.Exec("make"), + step.PreExec(func() error { + if !isCommandAvailable("make") { + return errors.New("make must be avaiable in your path") + } + fmt.Println("šŸš§ Building the application...") + return nil + }), + step.PostExec(func(exitErr error) error { + return errors.Wrap(exitErr, "cannot build your app") + }), + )) + steps.Add(step.New( + step.Exec("make", "init-pre"), + step.PreExec(func() error { + fmt.Println("šŸ’« Initializing the chain...") + return nil + }), + step.PostExec(func(exitErr error) error { + return errors.Wrap(exitErr, "cannot initialize the chain") + }), + )) + for _, user := range []string{"user1", "user2"} { + steps.Add(step.New( + step.Exec("make", fmt.Sprintf("init-%s", user), "-s"), + step.PostExec(func(exitErr error) error { + if exitErr != nil { + return errors.Wrapf(exitErr, "cannot create %s account", user) + } + var user struct { + Mnemonic string `json:"mnemonic"` + } + if err := json.Unmarshal(mnemonic.Bytes(), &user); err != nil { + return errors.Wrap(err, "cannot decode mnemonic") + } + mnemonic.Reset() + fmt.Printf("šŸ™‚ Created an account. Password (mnemonic): %[1]v\n", user.Mnemonic) + return nil + }), + step.Stdout(mnemonic), + )) + } + steps.Add(step.New( + step.Exec("make", "init-post"), + )) + + if err := cmdrunner. + New(cmdrunner.DefaultStdout(stdout), + cmdrunner.DefaultStderr(stderr), + cmdrunner.DefaultWorkdir(app.Path)). + Run(ctx, steps...); err != nil { + log.Fatal(err) + } + + var servers step.Steps + servers.Add(step.New( + step.Exec(fmt.Sprintf("%[1]vd", app.Name), "start"), //nolint:gosec // Subprocess launched with function call as argument or cmd arguments + step.InExec(func() error { + if verbose { + fmt.Println("šŸŒ Running a server at http://localhost:26657 (Tendermint)") + } else { + fmt.Printf("šŸŒ Running a Cosmos '%[1]v' app with Tendermint.\n", app.Name) + } + return nil + }), + step.PostExec(func(exitErr error) error { + return errors.Wrapf(exitErr, "cannot run %[1]vd start", app.Name) + }), + )) + servers.Add(step.New( + step.Exec(fmt.Sprintf("%[1]vcli", app.Name), "rest-server"), //nolint:gosec // Subprocess launched with function call as argument or cmd arguments + step.InExec(func() error { + if verbose { + fmt.Println("šŸŒ Running a server at http://localhost:1317 (LCD)") + } + return nil + }), + step.PostExec(func(exitErr error) error { + return errors.Wrapf(exitErr, "cannot run %[1]vcli rest-server", app.Name) + }), + )) + + serverRunner := cmdrunner.New( + cmdrunner.RunParallel(), + cmdrunner.DefaultStdout(stdout), + cmdrunner.DefaultStderr(stderr), + cmdrunner.DefaultWorkdir(app.Path), + ) + go serverRunner.Run(ctx, servers...) // TODO handle err + return nil +} + +func runDevServer(appName string, verbose bool) error { + if verbose { + fmt.Printf("šŸ”§ Running dev interface at http://localhost:12345\n\n") + } else { + fmt.Printf("\nšŸš€ Get started: http://localhost:12345/\n\n") + } + router := mux.NewRouter() + devUI := packr.New("ui/dist", "../../ui/dist") + router.HandleFunc("/env", func(w http.ResponseWriter, r *http.Request) { + env := Env{appName, isCommandAvailable("node")} + js, err := json.Marshal(env) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Header().Set("Content-Type", "application/json") + w.Write(js) + }) + router.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) { + res, err := http.Get("http://localhost:1317/node_info") + if err != nil || res.StatusCode != 200 { + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte("500 error")) + } else if res.StatusCode == 200 { + w.WriteHeader(http.StatusOK) + w.Write([]byte("200 ok")) + } + }) + router.HandleFunc("/rpc", func(w http.ResponseWriter, r *http.Request) { + res, err := http.Get("http://localhost:26657") + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + } else if res.StatusCode == 200 { + w.WriteHeader(http.StatusOK) + } else { + w.WriteHeader(http.StatusInternalServerError) + } + }) + router.HandleFunc("/frontend", func(w http.ResponseWriter, r *http.Request) { + res, err := http.Get("http://localhost:8080") + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + } else if res.StatusCode == 200 { + w.WriteHeader(http.StatusOK) + } else { + w.WriteHeader(http.StatusInternalServerError) + } + }) + router.PathPrefix("/").Handler(http.FileServer(devUI)) + return http.ListenAndServe(":12345", router) +} + +func isCommandAvailable(name string) bool { + _, err := exec.LookPath(name) + return err == nil +} From ff574cb1fc42ba11f0ebfd2819b4eaef7b2b87a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Thu, 30 Jul 2020 10:44:51 +0300 Subject: [PATCH 19/46] reorganize project structure (#89) resolves #88. --- Makefile | 6 +++--- go.mod | 1 - go.sum | 4 ---- scripts/starport | 2 +- .../interface}/cli/starport/analytics.go | 2 +- .../interface}/cli/starport/cmd/add.go | 2 +- .../interface}/cli/starport/cmd/app.go | 4 ++-- .../interface}/cli/starport/cmd/cmd.go | 0 .../interface}/cli/starport/cmd/serve.go | 2 +- .../interface}/cli/starport/cmd/type.go | 2 +- .../interface}/cli/starport/main.go | 4 ++-- {pkg => starport/pkg}/analyticsutil/analytics.go | 0 {pkg => starport/pkg}/cmdrunner/cmdrunner.go | 2 +- {pkg => starport/pkg}/cmdrunner/step/step.go | 0 {pkg => starport/pkg}/gomodulepath/gomodulepath.go | 0 .../pkg}/gomodulepath/gomodulepath_test.go | 0 {services => starport/services}/serve/serve.go | 4 ++-- {templates => starport/templates}/add/new.go | 0 {templates => starport/templates}/add/options.go | 0 {templates => starport/templates}/app/new.go | 0 {templates => starport/templates}/app/options.go | 0 .../templates}/app/templates/.gitignore | 0 .../templates}/app/templates/Makefile.plush | 0 .../templates}/app/templates/app/app.go.plush | 0 .../templates}/app/templates/app/export.go.plush | 0 .../cmd/{{binaryNamePrefix}}cli/main.go.plush | 0 .../cmd/{{binaryNamePrefix}}d/genaccounts.go.plush | 0 .../cmd/{{binaryNamePrefix}}d/main.go.plush | 0 .../app/templates/frontend/.browserslistrc | 0 .../templates}/app/templates/frontend/.gitignore | 0 .../app/templates/frontend/README.md.plush | 0 .../app/templates/frontend/babel.config.js | 0 .../app/templates/frontend/package-lock.json | 0 .../templates}/app/templates/frontend/package.json | 0 .../app/templates/frontend/public/favicon.ico | Bin .../app/templates/frontend/public/index.html | 0 .../templates}/app/templates/frontend/src/App.vue | 0 .../templates/frontend/src/components/AppButton.vue | 0 .../templates/frontend/src/components/AppInput.vue | 0 .../templates/frontend/src/components/AppLayout.vue | 0 .../frontend/src/components/AppRadioItem.vue | 0 .../templates/frontend/src/components/AppText.vue | 0 .../frontend/src/components/IconRefresh.vue | 0 .../templates/frontend/src/components/IconUser.vue | 0 .../templates/frontend/src/components/TypeItem.vue | 0 .../templates/frontend/src/components/TypeList.vue | 0 .../templates/frontend/src/components/Wallet.vue | 0 .../templates}/app/templates/frontend/src/main.js | 0 .../app/templates/frontend/src/router/index.js | 0 .../app/templates/frontend/src/store/app.js | 0 .../app/templates/frontend/src/store/index.js | 0 .../templates/frontend/src/views/Index.vue.plush | 0 .../templates}/app/templates/frontend/vue.config.js | 0 .../templates}/app/templates/go.mod.plush | 0 .../app/templates/x/{{appName}}/abci.go.plush | 0 .../app/templates/x/{{appName}}/alias.go.plush | 0 .../x/{{appName}}/client/cli/query.go.plush | 0 .../templates/x/{{appName}}/client/cli/tx.go.plush | 0 .../x/{{appName}}/client/rest/rest.go.plush | 0 .../app/templates/x/{{appName}}/genesis.go.plush | 0 .../app/templates/x/{{appName}}/handler.go.plush | 0 .../templates/x/{{appName}}/keeper/keeper.go.plush | 0 .../templates/x/{{appName}}/keeper/params.go.plush | 0 .../templates/x/{{appName}}/keeper/querier.go.plush | 0 .../app/templates/x/{{appName}}/module.go.plush | 0 .../templates/x/{{appName}}/spec/README.md.plush | 0 .../templates/x/{{appName}}/types/codec.go.plush | 0 .../templates/x/{{appName}}/types/errors.go.plush | 0 .../templates/x/{{appName}}/types/events.go.plush | 0 .../x/{{appName}}/types/expected_keepers.go.plush | 0 .../templates/x/{{appName}}/types/genesis.go.plush | 0 .../app/templates/x/{{appName}}/types/key.go.plush | 0 .../app/templates/x/{{appName}}/types/msg.go.plush | 0 .../templates/x/{{appName}}/types/params.go.plush | 0 .../templates/x/{{appName}}/types/querier.go.plush | 0 .../templates/x/{{appName}}/types/types.go.plush | 0 {templates => starport/templates}/typed/new.go | 0 {templates => starport/templates}/typed/options.go | 0 .../client/cli/query{{TypeName}}.go.plush | 0 .../{{appName}}/client/cli/tx{{TypeName}}.go.plush | 0 .../client/rest/query{{TypeName}}.go.plush | 0 .../{{appName}}/client/rest/tx{{TypeName}}.go.plush | 0 .../handlerMsgCreate{{TypeName}}.go.plush | 0 .../x/{{appName}}/keeper/{{typeName}}.go.plush | 0 .../types/MsgCreate{{TypeName}}.go.plush | 0 .../x/{{appName}}/types/Type{{TypeName}}.go.plush | 0 {ui => starport/ui}/.browserslistrc | 0 {ui => starport/ui}/.gitignore | 0 {ui => starport/ui}/README.md | 0 {ui => starport/ui}/babel.config.js | 0 {ui => starport/ui}/package-lock.json | 0 {ui => starport/ui}/package.json | 0 {ui => starport/ui}/public/favicon.ico | Bin {ui => starport/ui}/public/index.html | 0 {ui => starport/ui}/src/App.vue | 0 {ui => starport/ui}/src/components/Layout.vue | 0 .../ui}/src/components/LogoCosmosSdk.vue | 0 .../ui}/src/components/LogoSpaceship.vue | 0 .../ui}/src/components/LogoTendermint.vue | 0 {ui => starport/ui}/src/components/Navbar.vue | 0 .../ui}/src/components/TerminalWindow.vue | 0 {ui => starport/ui}/src/main.js | 0 {ui => starport/ui}/src/router/index.js | 0 {ui => starport/ui}/src/views/Start.vue | 0 104 files changed, 15 insertions(+), 20 deletions(-) rename {interface => starport/interface}/cli/starport/analytics.go (96%) rename {interface => starport/interface}/cli/starport/cmd/add.go (91%) rename {interface => starport/interface}/cli/starport/cmd/app.go (90%) rename {interface => starport/interface}/cli/starport/cmd/cmd.go (100%) rename {interface => starport/interface}/cli/starport/cmd/serve.go (92%) rename {interface => starport/interface}/cli/starport/cmd/type.go (95%) rename {interface => starport/interface}/cli/starport/main.go (83%) rename {pkg => starport/pkg}/analyticsutil/analytics.go (100%) rename {pkg => starport/pkg}/cmdrunner/cmdrunner.go (97%) rename {pkg => starport/pkg}/cmdrunner/step/step.go (100%) rename {pkg => starport/pkg}/gomodulepath/gomodulepath.go (100%) rename {pkg => starport/pkg}/gomodulepath/gomodulepath_test.go (100%) rename {services => starport/services}/serve/serve.go (98%) rename {templates => starport/templates}/add/new.go (100%) rename {templates => starport/templates}/add/options.go (100%) rename {templates => starport/templates}/app/new.go (100%) rename {templates => starport/templates}/app/options.go (100%) rename {templates => starport/templates}/app/templates/.gitignore (100%) rename {templates => starport/templates}/app/templates/Makefile.plush (100%) rename {templates => starport/templates}/app/templates/app/app.go.plush (100%) rename {templates => starport/templates}/app/templates/app/export.go.plush (100%) rename {templates => starport/templates}/app/templates/cmd/{{binaryNamePrefix}}cli/main.go.plush (100%) rename {templates => starport/templates}/app/templates/cmd/{{binaryNamePrefix}}d/genaccounts.go.plush (100%) rename {templates => starport/templates}/app/templates/cmd/{{binaryNamePrefix}}d/main.go.plush (100%) rename {templates => starport/templates}/app/templates/frontend/.browserslistrc (100%) rename {templates => starport/templates}/app/templates/frontend/.gitignore (100%) rename {templates => starport/templates}/app/templates/frontend/README.md.plush (100%) rename {templates => starport/templates}/app/templates/frontend/babel.config.js (100%) rename {templates => starport/templates}/app/templates/frontend/package-lock.json (100%) rename {templates => starport/templates}/app/templates/frontend/package.json (100%) rename {templates => starport/templates}/app/templates/frontend/public/favicon.ico (100%) rename {templates => starport/templates}/app/templates/frontend/public/index.html (100%) rename {templates => starport/templates}/app/templates/frontend/src/App.vue (100%) rename {templates => starport/templates}/app/templates/frontend/src/components/AppButton.vue (100%) rename {templates => starport/templates}/app/templates/frontend/src/components/AppInput.vue (100%) rename {templates => starport/templates}/app/templates/frontend/src/components/AppLayout.vue (100%) rename {templates => starport/templates}/app/templates/frontend/src/components/AppRadioItem.vue (100%) rename {templates => starport/templates}/app/templates/frontend/src/components/AppText.vue (100%) rename {templates => starport/templates}/app/templates/frontend/src/components/IconRefresh.vue (100%) rename {templates => starport/templates}/app/templates/frontend/src/components/IconUser.vue (100%) rename {templates => starport/templates}/app/templates/frontend/src/components/TypeItem.vue (100%) rename {templates => starport/templates}/app/templates/frontend/src/components/TypeList.vue (100%) rename {templates => starport/templates}/app/templates/frontend/src/components/Wallet.vue (100%) rename {templates => starport/templates}/app/templates/frontend/src/main.js (100%) rename {templates => starport/templates}/app/templates/frontend/src/router/index.js (100%) rename {templates => starport/templates}/app/templates/frontend/src/store/app.js (100%) rename {templates => starport/templates}/app/templates/frontend/src/store/index.js (100%) rename {templates => starport/templates}/app/templates/frontend/src/views/Index.vue.plush (100%) rename {templates => starport/templates}/app/templates/frontend/vue.config.js (100%) rename {templates => starport/templates}/app/templates/go.mod.plush (100%) rename {templates => starport/templates}/app/templates/x/{{appName}}/abci.go.plush (100%) rename {templates => starport/templates}/app/templates/x/{{appName}}/alias.go.plush (100%) rename {templates => starport/templates}/app/templates/x/{{appName}}/client/cli/query.go.plush (100%) rename {templates => starport/templates}/app/templates/x/{{appName}}/client/cli/tx.go.plush (100%) rename {templates => starport/templates}/app/templates/x/{{appName}}/client/rest/rest.go.plush (100%) rename {templates => starport/templates}/app/templates/x/{{appName}}/genesis.go.plush (100%) rename {templates => starport/templates}/app/templates/x/{{appName}}/handler.go.plush (100%) rename {templates => starport/templates}/app/templates/x/{{appName}}/keeper/keeper.go.plush (100%) rename {templates => starport/templates}/app/templates/x/{{appName}}/keeper/params.go.plush (100%) rename {templates => starport/templates}/app/templates/x/{{appName}}/keeper/querier.go.plush (100%) rename {templates => starport/templates}/app/templates/x/{{appName}}/module.go.plush (100%) rename {templates => starport/templates}/app/templates/x/{{appName}}/spec/README.md.plush (100%) rename {templates => starport/templates}/app/templates/x/{{appName}}/types/codec.go.plush (100%) rename {templates => starport/templates}/app/templates/x/{{appName}}/types/errors.go.plush (100%) rename {templates => starport/templates}/app/templates/x/{{appName}}/types/events.go.plush (100%) rename {templates => starport/templates}/app/templates/x/{{appName}}/types/expected_keepers.go.plush (100%) rename {templates => starport/templates}/app/templates/x/{{appName}}/types/genesis.go.plush (100%) rename {templates => starport/templates}/app/templates/x/{{appName}}/types/key.go.plush (100%) rename {templates => starport/templates}/app/templates/x/{{appName}}/types/msg.go.plush (100%) rename {templates => starport/templates}/app/templates/x/{{appName}}/types/params.go.plush (100%) rename {templates => starport/templates}/app/templates/x/{{appName}}/types/querier.go.plush (100%) rename {templates => starport/templates}/app/templates/x/{{appName}}/types/types.go.plush (100%) rename {templates => starport/templates}/typed/new.go (100%) rename {templates => starport/templates}/typed/options.go (100%) rename {templates => starport/templates}/typed/templates/x/{{appName}}/client/cli/query{{TypeName}}.go.plush (100%) rename {templates => starport/templates}/typed/templates/x/{{appName}}/client/cli/tx{{TypeName}}.go.plush (100%) rename {templates => starport/templates}/typed/templates/x/{{appName}}/client/rest/query{{TypeName}}.go.plush (100%) rename {templates => starport/templates}/typed/templates/x/{{appName}}/client/rest/tx{{TypeName}}.go.plush (100%) rename {templates => starport/templates}/typed/templates/x/{{appName}}/handlerMsgCreate{{TypeName}}.go.plush (100%) rename {templates => starport/templates}/typed/templates/x/{{appName}}/keeper/{{typeName}}.go.plush (100%) rename {templates => starport/templates}/typed/templates/x/{{appName}}/types/MsgCreate{{TypeName}}.go.plush (100%) rename {templates => starport/templates}/typed/templates/x/{{appName}}/types/Type{{TypeName}}.go.plush (100%) rename {ui => starport/ui}/.browserslistrc (100%) rename {ui => starport/ui}/.gitignore (100%) rename {ui => starport/ui}/README.md (100%) rename {ui => starport/ui}/babel.config.js (100%) rename {ui => starport/ui}/package-lock.json (100%) rename {ui => starport/ui}/package.json (100%) rename {ui => starport/ui}/public/favicon.ico (100%) rename {ui => starport/ui}/public/index.html (100%) rename {ui => starport/ui}/src/App.vue (100%) rename {ui => starport/ui}/src/components/Layout.vue (100%) rename {ui => starport/ui}/src/components/LogoCosmosSdk.vue (100%) rename {ui => starport/ui}/src/components/LogoSpaceship.vue (100%) rename {ui => starport/ui}/src/components/LogoTendermint.vue (100%) rename {ui => starport/ui}/src/components/Navbar.vue (100%) rename {ui => starport/ui}/src/components/TerminalWindow.vue (100%) rename {ui => starport/ui}/src/main.js (100%) rename {ui => starport/ui}/src/router/index.js (100%) rename {ui => starport/ui}/src/views/Start.vue (100%) diff --git a/Makefile b/Makefile index ca1b100738..a9af1d88c8 100644 --- a/Makefile +++ b/Makefile @@ -6,13 +6,13 @@ mod: build: mod @go get -u github.com/gobuffalo/packr/v2/packr2 @packr2 - @go build -mod=readonly -o build/ ./interface/cli/... + @go build -mod=readonly -o build/ ./starport/interface/cli/... @packr2 clean @go mod tidy ui: - @rm -rf ui/dist - -@which npm 1>/dev/null && cd ui && npm install 1>/dev/null && npm run build 1>/dev/null + @rm -rf starport/ui/dist + -@which npm 1>/dev/null && cd starport/ui && npm install 1>/dev/null && npm run build 1>/dev/null install: ui build @go install -mod=readonly ./... diff --git a/go.mod b/go.mod index 9b241ceaa7..ff0dd6c005 100644 --- a/go.mod +++ b/go.mod @@ -27,5 +27,4 @@ require ( golang.org/x/net v0.0.0-20200625001655-4c5254603344 // indirect golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1 // indirect - golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7 // indirect ) diff --git a/go.sum b/go.sum index 3720094c38..7f7792ab7e 100644 --- a/go.sum +++ b/go.sum @@ -54,7 +54,6 @@ github.com/gobuffalo/logger v1.0.3/go.mod h1:SoeejUwldiS7ZsyCBphOGURmWdwUFXs0J7T 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 v1.30.1 h1:hu1fuVR3fXEZR7rXNW3h8rqSML8EVAf6KNm0NKO/wKg= 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= @@ -201,7 +200,6 @@ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xtgo/uuid v0.0.0-20140804021211-a0b114877d4c h1:3lbZUMbMiGUW/LMkfsEABsc5zNT9+b1CvsJx47JzJ8g= github.com/xtgo/uuid v0.0.0-20140804021211-a0b114877d4c/go.mod h1:UrdRz5enIKZ63MEE3IF9l2/ebyx59GyGgPi+tICQdmM= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= 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= @@ -265,8 +263,6 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191224055732-dd894d0a8a40/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200308013534-11ec41452d41 h1:9Di9iYgOt9ThCipBxChBVhgNipDoE5mxO84rQV7D0FE= golang.org/x/tools v0.0.0-20200308013534-11ec41452d41/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7 h1:LHW24ah7B+uV/OePwNP0p/t889F3QSyLvY8Sg/bK0SY= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= 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= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= diff --git a/scripts/starport b/scripts/starport index 16cbe52bee..4e82a7a8b4 100755 --- a/scripts/starport +++ b/scripts/starport @@ -1,4 +1,4 @@ #!/bin/bash # a development mode entrypoint to Starport cli. -go run ./interface/cli/starport "$@" +go run ./starport/interface/cli/starport "$@" diff --git a/interface/cli/starport/analytics.go b/starport/interface/cli/starport/analytics.go similarity index 96% rename from interface/cli/starport/analytics.go rename to starport/interface/cli/starport/analytics.go index 7eee667da7..ed515c5a7a 100644 --- a/interface/cli/starport/analytics.go +++ b/starport/interface/cli/starport/analytics.go @@ -8,7 +8,7 @@ import ( "github.com/Pallinder/go-randomdata" "github.com/ilgooz/analytics-go" - "github.com/tendermint/starport/pkg/analyticsutil" + "github.com/tendermint/starport/starport/pkg/analyticsutil" ) const ( diff --git a/interface/cli/starport/cmd/add.go b/starport/interface/cli/starport/cmd/add.go similarity index 91% rename from interface/cli/starport/cmd/add.go rename to starport/interface/cli/starport/cmd/add.go index 3419017882..6c0bd2239f 100644 --- a/interface/cli/starport/cmd/add.go +++ b/starport/interface/cli/starport/cmd/add.go @@ -5,7 +5,7 @@ import ( "github.com/gobuffalo/genny" "github.com/spf13/cobra" - "github.com/tendermint/starport/templates/add" + "github.com/tendermint/starport/starport/templates/add" ) func NewAdd() *cobra.Command { diff --git a/interface/cli/starport/cmd/app.go b/starport/interface/cli/starport/cmd/app.go similarity index 90% rename from interface/cli/starport/cmd/app.go rename to starport/interface/cli/starport/cmd/app.go index b2998ba8cd..320b73211f 100644 --- a/interface/cli/starport/cmd/app.go +++ b/starport/interface/cli/starport/cmd/app.go @@ -7,8 +7,8 @@ import ( "github.com/gobuffalo/genny" "github.com/spf13/cobra" - "github.com/tendermint/starport/pkg/gomodulepath" - "github.com/tendermint/starport/templates/app" + "github.com/tendermint/starport/starport/pkg/gomodulepath" + "github.com/tendermint/starport/starport/templates/app" ) // NewApp creates new command named `app` to create Cosmos scaffolds customized diff --git a/interface/cli/starport/cmd/cmd.go b/starport/interface/cli/starport/cmd/cmd.go similarity index 100% rename from interface/cli/starport/cmd/cmd.go rename to starport/interface/cli/starport/cmd/cmd.go diff --git a/interface/cli/starport/cmd/serve.go b/starport/interface/cli/starport/cmd/serve.go similarity index 92% rename from interface/cli/starport/cmd/serve.go rename to starport/interface/cli/starport/cmd/serve.go index d94e6c51d0..a13763284b 100644 --- a/interface/cli/starport/cmd/serve.go +++ b/starport/interface/cli/starport/cmd/serve.go @@ -6,7 +6,7 @@ import ( "os/signal" "github.com/spf13/cobra" - starportserve "github.com/tendermint/starport/services/serve" + starportserve "github.com/tendermint/starport/starport/services/serve" ) var appPath string diff --git a/interface/cli/starport/cmd/type.go b/starport/interface/cli/starport/cmd/type.go similarity index 95% rename from interface/cli/starport/cmd/type.go rename to starport/interface/cli/starport/cmd/type.go index 79de4cd6a6..a943c5f613 100644 --- a/interface/cli/starport/cmd/type.go +++ b/starport/interface/cli/starport/cmd/type.go @@ -7,7 +7,7 @@ import ( "github.com/gobuffalo/genny" "github.com/spf13/cobra" - "github.com/tendermint/starport/templates/typed" + "github.com/tendermint/starport/starport/templates/typed" ) func NewType() *cobra.Command { diff --git a/interface/cli/starport/main.go b/starport/interface/cli/starport/main.go similarity index 83% rename from interface/cli/starport/main.go rename to starport/interface/cli/starport/main.go index 104a770b59..5714e45b3a 100644 --- a/interface/cli/starport/main.go +++ b/starport/interface/cli/starport/main.go @@ -4,8 +4,8 @@ import ( "fmt" "os" - starportcmd "github.com/tendermint/starport/interface/cli/starport/cmd" - "github.com/tendermint/starport/pkg/analyticsutil" + starportcmd "github.com/tendermint/starport/starport/interface/cli/starport/cmd" + "github.com/tendermint/starport/starport/pkg/analyticsutil" ) func main() { diff --git a/pkg/analyticsutil/analytics.go b/starport/pkg/analyticsutil/analytics.go similarity index 100% rename from pkg/analyticsutil/analytics.go rename to starport/pkg/analyticsutil/analytics.go diff --git a/pkg/cmdrunner/cmdrunner.go b/starport/pkg/cmdrunner/cmdrunner.go similarity index 97% rename from pkg/cmdrunner/cmdrunner.go rename to starport/pkg/cmdrunner/cmdrunner.go index 80c6003ed2..17cb2046bc 100644 --- a/pkg/cmdrunner/cmdrunner.go +++ b/starport/pkg/cmdrunner/cmdrunner.go @@ -5,7 +5,7 @@ import ( "io" "os/exec" - "github.com/tendermint/starport/pkg/cmdrunner/step" + "github.com/tendermint/starport/starport/pkg/cmdrunner/step" "golang.org/x/sync/errgroup" ) diff --git a/pkg/cmdrunner/step/step.go b/starport/pkg/cmdrunner/step/step.go similarity index 100% rename from pkg/cmdrunner/step/step.go rename to starport/pkg/cmdrunner/step/step.go diff --git a/pkg/gomodulepath/gomodulepath.go b/starport/pkg/gomodulepath/gomodulepath.go similarity index 100% rename from pkg/gomodulepath/gomodulepath.go rename to starport/pkg/gomodulepath/gomodulepath.go diff --git a/pkg/gomodulepath/gomodulepath_test.go b/starport/pkg/gomodulepath/gomodulepath_test.go similarity index 100% rename from pkg/gomodulepath/gomodulepath_test.go rename to starport/pkg/gomodulepath/gomodulepath_test.go diff --git a/services/serve/serve.go b/starport/services/serve/serve.go similarity index 98% rename from services/serve/serve.go rename to starport/services/serve/serve.go index f22a9bdd16..210e1c7396 100644 --- a/services/serve/serve.go +++ b/starport/services/serve/serve.go @@ -17,8 +17,8 @@ import ( "github.com/gorilla/mux" "github.com/pkg/errors" "github.com/radovskyb/watcher" - "github.com/tendermint/starport/pkg/cmdrunner" - "github.com/tendermint/starport/pkg/cmdrunner/step" + "github.com/tendermint/starport/starport/pkg/cmdrunner" + "github.com/tendermint/starport/starport/pkg/cmdrunner/step" ) type App struct { diff --git a/templates/add/new.go b/starport/templates/add/new.go similarity index 100% rename from templates/add/new.go rename to starport/templates/add/new.go diff --git a/templates/add/options.go b/starport/templates/add/options.go similarity index 100% rename from templates/add/options.go rename to starport/templates/add/options.go diff --git a/templates/app/new.go b/starport/templates/app/new.go similarity index 100% rename from templates/app/new.go rename to starport/templates/app/new.go diff --git a/templates/app/options.go b/starport/templates/app/options.go similarity index 100% rename from templates/app/options.go rename to starport/templates/app/options.go diff --git a/templates/app/templates/.gitignore b/starport/templates/app/templates/.gitignore similarity index 100% rename from templates/app/templates/.gitignore rename to starport/templates/app/templates/.gitignore diff --git a/templates/app/templates/Makefile.plush b/starport/templates/app/templates/Makefile.plush similarity index 100% rename from templates/app/templates/Makefile.plush rename to starport/templates/app/templates/Makefile.plush diff --git a/templates/app/templates/app/app.go.plush b/starport/templates/app/templates/app/app.go.plush similarity index 100% rename from templates/app/templates/app/app.go.plush rename to starport/templates/app/templates/app/app.go.plush diff --git a/templates/app/templates/app/export.go.plush b/starport/templates/app/templates/app/export.go.plush similarity index 100% rename from templates/app/templates/app/export.go.plush rename to starport/templates/app/templates/app/export.go.plush diff --git a/templates/app/templates/cmd/{{binaryNamePrefix}}cli/main.go.plush b/starport/templates/app/templates/cmd/{{binaryNamePrefix}}cli/main.go.plush similarity index 100% rename from templates/app/templates/cmd/{{binaryNamePrefix}}cli/main.go.plush rename to starport/templates/app/templates/cmd/{{binaryNamePrefix}}cli/main.go.plush diff --git a/templates/app/templates/cmd/{{binaryNamePrefix}}d/genaccounts.go.plush b/starport/templates/app/templates/cmd/{{binaryNamePrefix}}d/genaccounts.go.plush similarity index 100% rename from templates/app/templates/cmd/{{binaryNamePrefix}}d/genaccounts.go.plush rename to starport/templates/app/templates/cmd/{{binaryNamePrefix}}d/genaccounts.go.plush diff --git a/templates/app/templates/cmd/{{binaryNamePrefix}}d/main.go.plush b/starport/templates/app/templates/cmd/{{binaryNamePrefix}}d/main.go.plush similarity index 100% rename from templates/app/templates/cmd/{{binaryNamePrefix}}d/main.go.plush rename to starport/templates/app/templates/cmd/{{binaryNamePrefix}}d/main.go.plush diff --git a/templates/app/templates/frontend/.browserslistrc b/starport/templates/app/templates/frontend/.browserslistrc similarity index 100% rename from templates/app/templates/frontend/.browserslistrc rename to starport/templates/app/templates/frontend/.browserslistrc diff --git a/templates/app/templates/frontend/.gitignore b/starport/templates/app/templates/frontend/.gitignore similarity index 100% rename from templates/app/templates/frontend/.gitignore rename to starport/templates/app/templates/frontend/.gitignore diff --git a/templates/app/templates/frontend/README.md.plush b/starport/templates/app/templates/frontend/README.md.plush similarity index 100% rename from templates/app/templates/frontend/README.md.plush rename to starport/templates/app/templates/frontend/README.md.plush diff --git a/templates/app/templates/frontend/babel.config.js b/starport/templates/app/templates/frontend/babel.config.js similarity index 100% rename from templates/app/templates/frontend/babel.config.js rename to starport/templates/app/templates/frontend/babel.config.js diff --git a/templates/app/templates/frontend/package-lock.json b/starport/templates/app/templates/frontend/package-lock.json similarity index 100% rename from templates/app/templates/frontend/package-lock.json rename to starport/templates/app/templates/frontend/package-lock.json diff --git a/templates/app/templates/frontend/package.json b/starport/templates/app/templates/frontend/package.json similarity index 100% rename from templates/app/templates/frontend/package.json rename to starport/templates/app/templates/frontend/package.json diff --git a/templates/app/templates/frontend/public/favicon.ico b/starport/templates/app/templates/frontend/public/favicon.ico similarity index 100% rename from templates/app/templates/frontend/public/favicon.ico rename to starport/templates/app/templates/frontend/public/favicon.ico diff --git a/templates/app/templates/frontend/public/index.html b/starport/templates/app/templates/frontend/public/index.html similarity index 100% rename from templates/app/templates/frontend/public/index.html rename to starport/templates/app/templates/frontend/public/index.html diff --git a/templates/app/templates/frontend/src/App.vue b/starport/templates/app/templates/frontend/src/App.vue similarity index 100% rename from templates/app/templates/frontend/src/App.vue rename to starport/templates/app/templates/frontend/src/App.vue diff --git a/templates/app/templates/frontend/src/components/AppButton.vue b/starport/templates/app/templates/frontend/src/components/AppButton.vue similarity index 100% rename from templates/app/templates/frontend/src/components/AppButton.vue rename to starport/templates/app/templates/frontend/src/components/AppButton.vue diff --git a/templates/app/templates/frontend/src/components/AppInput.vue b/starport/templates/app/templates/frontend/src/components/AppInput.vue similarity index 100% rename from templates/app/templates/frontend/src/components/AppInput.vue rename to starport/templates/app/templates/frontend/src/components/AppInput.vue diff --git a/templates/app/templates/frontend/src/components/AppLayout.vue b/starport/templates/app/templates/frontend/src/components/AppLayout.vue similarity index 100% rename from templates/app/templates/frontend/src/components/AppLayout.vue rename to starport/templates/app/templates/frontend/src/components/AppLayout.vue diff --git a/templates/app/templates/frontend/src/components/AppRadioItem.vue b/starport/templates/app/templates/frontend/src/components/AppRadioItem.vue similarity index 100% rename from templates/app/templates/frontend/src/components/AppRadioItem.vue rename to starport/templates/app/templates/frontend/src/components/AppRadioItem.vue diff --git a/templates/app/templates/frontend/src/components/AppText.vue b/starport/templates/app/templates/frontend/src/components/AppText.vue similarity index 100% rename from templates/app/templates/frontend/src/components/AppText.vue rename to starport/templates/app/templates/frontend/src/components/AppText.vue diff --git a/templates/app/templates/frontend/src/components/IconRefresh.vue b/starport/templates/app/templates/frontend/src/components/IconRefresh.vue similarity index 100% rename from templates/app/templates/frontend/src/components/IconRefresh.vue rename to starport/templates/app/templates/frontend/src/components/IconRefresh.vue diff --git a/templates/app/templates/frontend/src/components/IconUser.vue b/starport/templates/app/templates/frontend/src/components/IconUser.vue similarity index 100% rename from templates/app/templates/frontend/src/components/IconUser.vue rename to starport/templates/app/templates/frontend/src/components/IconUser.vue diff --git a/templates/app/templates/frontend/src/components/TypeItem.vue b/starport/templates/app/templates/frontend/src/components/TypeItem.vue similarity index 100% rename from templates/app/templates/frontend/src/components/TypeItem.vue rename to starport/templates/app/templates/frontend/src/components/TypeItem.vue diff --git a/templates/app/templates/frontend/src/components/TypeList.vue b/starport/templates/app/templates/frontend/src/components/TypeList.vue similarity index 100% rename from templates/app/templates/frontend/src/components/TypeList.vue rename to starport/templates/app/templates/frontend/src/components/TypeList.vue diff --git a/templates/app/templates/frontend/src/components/Wallet.vue b/starport/templates/app/templates/frontend/src/components/Wallet.vue similarity index 100% rename from templates/app/templates/frontend/src/components/Wallet.vue rename to starport/templates/app/templates/frontend/src/components/Wallet.vue diff --git a/templates/app/templates/frontend/src/main.js b/starport/templates/app/templates/frontend/src/main.js similarity index 100% rename from templates/app/templates/frontend/src/main.js rename to starport/templates/app/templates/frontend/src/main.js diff --git a/templates/app/templates/frontend/src/router/index.js b/starport/templates/app/templates/frontend/src/router/index.js similarity index 100% rename from templates/app/templates/frontend/src/router/index.js rename to starport/templates/app/templates/frontend/src/router/index.js diff --git a/templates/app/templates/frontend/src/store/app.js b/starport/templates/app/templates/frontend/src/store/app.js similarity index 100% rename from templates/app/templates/frontend/src/store/app.js rename to starport/templates/app/templates/frontend/src/store/app.js diff --git a/templates/app/templates/frontend/src/store/index.js b/starport/templates/app/templates/frontend/src/store/index.js similarity index 100% rename from templates/app/templates/frontend/src/store/index.js rename to starport/templates/app/templates/frontend/src/store/index.js diff --git a/templates/app/templates/frontend/src/views/Index.vue.plush b/starport/templates/app/templates/frontend/src/views/Index.vue.plush similarity index 100% rename from templates/app/templates/frontend/src/views/Index.vue.plush rename to starport/templates/app/templates/frontend/src/views/Index.vue.plush diff --git a/templates/app/templates/frontend/vue.config.js b/starport/templates/app/templates/frontend/vue.config.js similarity index 100% rename from templates/app/templates/frontend/vue.config.js rename to starport/templates/app/templates/frontend/vue.config.js diff --git a/templates/app/templates/go.mod.plush b/starport/templates/app/templates/go.mod.plush similarity index 100% rename from templates/app/templates/go.mod.plush rename to starport/templates/app/templates/go.mod.plush diff --git a/templates/app/templates/x/{{appName}}/abci.go.plush b/starport/templates/app/templates/x/{{appName}}/abci.go.plush similarity index 100% rename from templates/app/templates/x/{{appName}}/abci.go.plush rename to starport/templates/app/templates/x/{{appName}}/abci.go.plush diff --git a/templates/app/templates/x/{{appName}}/alias.go.plush b/starport/templates/app/templates/x/{{appName}}/alias.go.plush similarity index 100% rename from templates/app/templates/x/{{appName}}/alias.go.plush rename to starport/templates/app/templates/x/{{appName}}/alias.go.plush diff --git a/templates/app/templates/x/{{appName}}/client/cli/query.go.plush b/starport/templates/app/templates/x/{{appName}}/client/cli/query.go.plush similarity index 100% rename from templates/app/templates/x/{{appName}}/client/cli/query.go.plush rename to starport/templates/app/templates/x/{{appName}}/client/cli/query.go.plush diff --git a/templates/app/templates/x/{{appName}}/client/cli/tx.go.plush b/starport/templates/app/templates/x/{{appName}}/client/cli/tx.go.plush similarity index 100% rename from templates/app/templates/x/{{appName}}/client/cli/tx.go.plush rename to starport/templates/app/templates/x/{{appName}}/client/cli/tx.go.plush diff --git a/templates/app/templates/x/{{appName}}/client/rest/rest.go.plush b/starport/templates/app/templates/x/{{appName}}/client/rest/rest.go.plush similarity index 100% rename from templates/app/templates/x/{{appName}}/client/rest/rest.go.plush rename to starport/templates/app/templates/x/{{appName}}/client/rest/rest.go.plush diff --git a/templates/app/templates/x/{{appName}}/genesis.go.plush b/starport/templates/app/templates/x/{{appName}}/genesis.go.plush similarity index 100% rename from templates/app/templates/x/{{appName}}/genesis.go.plush rename to starport/templates/app/templates/x/{{appName}}/genesis.go.plush diff --git a/templates/app/templates/x/{{appName}}/handler.go.plush b/starport/templates/app/templates/x/{{appName}}/handler.go.plush similarity index 100% rename from templates/app/templates/x/{{appName}}/handler.go.plush rename to starport/templates/app/templates/x/{{appName}}/handler.go.plush diff --git a/templates/app/templates/x/{{appName}}/keeper/keeper.go.plush b/starport/templates/app/templates/x/{{appName}}/keeper/keeper.go.plush similarity index 100% rename from templates/app/templates/x/{{appName}}/keeper/keeper.go.plush rename to starport/templates/app/templates/x/{{appName}}/keeper/keeper.go.plush diff --git a/templates/app/templates/x/{{appName}}/keeper/params.go.plush b/starport/templates/app/templates/x/{{appName}}/keeper/params.go.plush similarity index 100% rename from templates/app/templates/x/{{appName}}/keeper/params.go.plush rename to starport/templates/app/templates/x/{{appName}}/keeper/params.go.plush diff --git a/templates/app/templates/x/{{appName}}/keeper/querier.go.plush b/starport/templates/app/templates/x/{{appName}}/keeper/querier.go.plush similarity index 100% rename from templates/app/templates/x/{{appName}}/keeper/querier.go.plush rename to starport/templates/app/templates/x/{{appName}}/keeper/querier.go.plush diff --git a/templates/app/templates/x/{{appName}}/module.go.plush b/starport/templates/app/templates/x/{{appName}}/module.go.plush similarity index 100% rename from templates/app/templates/x/{{appName}}/module.go.plush rename to starport/templates/app/templates/x/{{appName}}/module.go.plush diff --git a/templates/app/templates/x/{{appName}}/spec/README.md.plush b/starport/templates/app/templates/x/{{appName}}/spec/README.md.plush similarity index 100% rename from templates/app/templates/x/{{appName}}/spec/README.md.plush rename to starport/templates/app/templates/x/{{appName}}/spec/README.md.plush diff --git a/templates/app/templates/x/{{appName}}/types/codec.go.plush b/starport/templates/app/templates/x/{{appName}}/types/codec.go.plush similarity index 100% rename from templates/app/templates/x/{{appName}}/types/codec.go.plush rename to starport/templates/app/templates/x/{{appName}}/types/codec.go.plush diff --git a/templates/app/templates/x/{{appName}}/types/errors.go.plush b/starport/templates/app/templates/x/{{appName}}/types/errors.go.plush similarity index 100% rename from templates/app/templates/x/{{appName}}/types/errors.go.plush rename to starport/templates/app/templates/x/{{appName}}/types/errors.go.plush diff --git a/templates/app/templates/x/{{appName}}/types/events.go.plush b/starport/templates/app/templates/x/{{appName}}/types/events.go.plush similarity index 100% rename from templates/app/templates/x/{{appName}}/types/events.go.plush rename to starport/templates/app/templates/x/{{appName}}/types/events.go.plush diff --git a/templates/app/templates/x/{{appName}}/types/expected_keepers.go.plush b/starport/templates/app/templates/x/{{appName}}/types/expected_keepers.go.plush similarity index 100% rename from templates/app/templates/x/{{appName}}/types/expected_keepers.go.plush rename to starport/templates/app/templates/x/{{appName}}/types/expected_keepers.go.plush diff --git a/templates/app/templates/x/{{appName}}/types/genesis.go.plush b/starport/templates/app/templates/x/{{appName}}/types/genesis.go.plush similarity index 100% rename from templates/app/templates/x/{{appName}}/types/genesis.go.plush rename to starport/templates/app/templates/x/{{appName}}/types/genesis.go.plush diff --git a/templates/app/templates/x/{{appName}}/types/key.go.plush b/starport/templates/app/templates/x/{{appName}}/types/key.go.plush similarity index 100% rename from templates/app/templates/x/{{appName}}/types/key.go.plush rename to starport/templates/app/templates/x/{{appName}}/types/key.go.plush diff --git a/templates/app/templates/x/{{appName}}/types/msg.go.plush b/starport/templates/app/templates/x/{{appName}}/types/msg.go.plush similarity index 100% rename from templates/app/templates/x/{{appName}}/types/msg.go.plush rename to starport/templates/app/templates/x/{{appName}}/types/msg.go.plush diff --git a/templates/app/templates/x/{{appName}}/types/params.go.plush b/starport/templates/app/templates/x/{{appName}}/types/params.go.plush similarity index 100% rename from templates/app/templates/x/{{appName}}/types/params.go.plush rename to starport/templates/app/templates/x/{{appName}}/types/params.go.plush diff --git a/templates/app/templates/x/{{appName}}/types/querier.go.plush b/starport/templates/app/templates/x/{{appName}}/types/querier.go.plush similarity index 100% rename from templates/app/templates/x/{{appName}}/types/querier.go.plush rename to starport/templates/app/templates/x/{{appName}}/types/querier.go.plush diff --git a/templates/app/templates/x/{{appName}}/types/types.go.plush b/starport/templates/app/templates/x/{{appName}}/types/types.go.plush similarity index 100% rename from templates/app/templates/x/{{appName}}/types/types.go.plush rename to starport/templates/app/templates/x/{{appName}}/types/types.go.plush diff --git a/templates/typed/new.go b/starport/templates/typed/new.go similarity index 100% rename from templates/typed/new.go rename to starport/templates/typed/new.go diff --git a/templates/typed/options.go b/starport/templates/typed/options.go similarity index 100% rename from templates/typed/options.go rename to starport/templates/typed/options.go diff --git a/templates/typed/templates/x/{{appName}}/client/cli/query{{TypeName}}.go.plush b/starport/templates/typed/templates/x/{{appName}}/client/cli/query{{TypeName}}.go.plush similarity index 100% rename from templates/typed/templates/x/{{appName}}/client/cli/query{{TypeName}}.go.plush rename to starport/templates/typed/templates/x/{{appName}}/client/cli/query{{TypeName}}.go.plush diff --git a/templates/typed/templates/x/{{appName}}/client/cli/tx{{TypeName}}.go.plush b/starport/templates/typed/templates/x/{{appName}}/client/cli/tx{{TypeName}}.go.plush similarity index 100% rename from templates/typed/templates/x/{{appName}}/client/cli/tx{{TypeName}}.go.plush rename to starport/templates/typed/templates/x/{{appName}}/client/cli/tx{{TypeName}}.go.plush diff --git a/templates/typed/templates/x/{{appName}}/client/rest/query{{TypeName}}.go.plush b/starport/templates/typed/templates/x/{{appName}}/client/rest/query{{TypeName}}.go.plush similarity index 100% rename from templates/typed/templates/x/{{appName}}/client/rest/query{{TypeName}}.go.plush rename to starport/templates/typed/templates/x/{{appName}}/client/rest/query{{TypeName}}.go.plush diff --git a/templates/typed/templates/x/{{appName}}/client/rest/tx{{TypeName}}.go.plush b/starport/templates/typed/templates/x/{{appName}}/client/rest/tx{{TypeName}}.go.plush similarity index 100% rename from templates/typed/templates/x/{{appName}}/client/rest/tx{{TypeName}}.go.plush rename to starport/templates/typed/templates/x/{{appName}}/client/rest/tx{{TypeName}}.go.plush diff --git a/templates/typed/templates/x/{{appName}}/handlerMsgCreate{{TypeName}}.go.plush b/starport/templates/typed/templates/x/{{appName}}/handlerMsgCreate{{TypeName}}.go.plush similarity index 100% rename from templates/typed/templates/x/{{appName}}/handlerMsgCreate{{TypeName}}.go.plush rename to starport/templates/typed/templates/x/{{appName}}/handlerMsgCreate{{TypeName}}.go.plush diff --git a/templates/typed/templates/x/{{appName}}/keeper/{{typeName}}.go.plush b/starport/templates/typed/templates/x/{{appName}}/keeper/{{typeName}}.go.plush similarity index 100% rename from templates/typed/templates/x/{{appName}}/keeper/{{typeName}}.go.plush rename to starport/templates/typed/templates/x/{{appName}}/keeper/{{typeName}}.go.plush diff --git a/templates/typed/templates/x/{{appName}}/types/MsgCreate{{TypeName}}.go.plush b/starport/templates/typed/templates/x/{{appName}}/types/MsgCreate{{TypeName}}.go.plush similarity index 100% rename from templates/typed/templates/x/{{appName}}/types/MsgCreate{{TypeName}}.go.plush rename to starport/templates/typed/templates/x/{{appName}}/types/MsgCreate{{TypeName}}.go.plush diff --git a/templates/typed/templates/x/{{appName}}/types/Type{{TypeName}}.go.plush b/starport/templates/typed/templates/x/{{appName}}/types/Type{{TypeName}}.go.plush similarity index 100% rename from templates/typed/templates/x/{{appName}}/types/Type{{TypeName}}.go.plush rename to starport/templates/typed/templates/x/{{appName}}/types/Type{{TypeName}}.go.plush diff --git a/ui/.browserslistrc b/starport/ui/.browserslistrc similarity index 100% rename from ui/.browserslistrc rename to starport/ui/.browserslistrc diff --git a/ui/.gitignore b/starport/ui/.gitignore similarity index 100% rename from ui/.gitignore rename to starport/ui/.gitignore diff --git a/ui/README.md b/starport/ui/README.md similarity index 100% rename from ui/README.md rename to starport/ui/README.md diff --git a/ui/babel.config.js b/starport/ui/babel.config.js similarity index 100% rename from ui/babel.config.js rename to starport/ui/babel.config.js diff --git a/ui/package-lock.json b/starport/ui/package-lock.json similarity index 100% rename from ui/package-lock.json rename to starport/ui/package-lock.json diff --git a/ui/package.json b/starport/ui/package.json similarity index 100% rename from ui/package.json rename to starport/ui/package.json diff --git a/ui/public/favicon.ico b/starport/ui/public/favicon.ico similarity index 100% rename from ui/public/favicon.ico rename to starport/ui/public/favicon.ico diff --git a/ui/public/index.html b/starport/ui/public/index.html similarity index 100% rename from ui/public/index.html rename to starport/ui/public/index.html diff --git a/ui/src/App.vue b/starport/ui/src/App.vue similarity index 100% rename from ui/src/App.vue rename to starport/ui/src/App.vue diff --git a/ui/src/components/Layout.vue b/starport/ui/src/components/Layout.vue similarity index 100% rename from ui/src/components/Layout.vue rename to starport/ui/src/components/Layout.vue diff --git a/ui/src/components/LogoCosmosSdk.vue b/starport/ui/src/components/LogoCosmosSdk.vue similarity index 100% rename from ui/src/components/LogoCosmosSdk.vue rename to starport/ui/src/components/LogoCosmosSdk.vue diff --git a/ui/src/components/LogoSpaceship.vue b/starport/ui/src/components/LogoSpaceship.vue similarity index 100% rename from ui/src/components/LogoSpaceship.vue rename to starport/ui/src/components/LogoSpaceship.vue diff --git a/ui/src/components/LogoTendermint.vue b/starport/ui/src/components/LogoTendermint.vue similarity index 100% rename from ui/src/components/LogoTendermint.vue rename to starport/ui/src/components/LogoTendermint.vue diff --git a/ui/src/components/Navbar.vue b/starport/ui/src/components/Navbar.vue similarity index 100% rename from ui/src/components/Navbar.vue rename to starport/ui/src/components/Navbar.vue diff --git a/ui/src/components/TerminalWindow.vue b/starport/ui/src/components/TerminalWindow.vue similarity index 100% rename from ui/src/components/TerminalWindow.vue rename to starport/ui/src/components/TerminalWindow.vue diff --git a/ui/src/main.js b/starport/ui/src/main.js similarity index 100% rename from ui/src/main.js rename to starport/ui/src/main.js diff --git a/ui/src/router/index.js b/starport/ui/src/router/index.js similarity index 100% rename from ui/src/router/index.js rename to starport/ui/src/router/index.js diff --git a/ui/src/views/Start.vue b/starport/ui/src/views/Start.vue similarity index 100% rename from ui/src/views/Start.vue rename to starport/ui/src/views/Start.vue From 45c95f520da1b982641000ce43f8f24310448eac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Thu, 30 Jul 2020 12:14:26 +0300 Subject: [PATCH 20/46] services/serve: split dev handler (#90) as a starting point to refactor development server. --- starport/services/serve/dev.go | 57 ++++++++++++++++++++++++++++++++ starport/services/serve/serve.go | 51 ++-------------------------- 2 files changed, 60 insertions(+), 48 deletions(-) create mode 100644 starport/services/serve/dev.go diff --git a/starport/services/serve/dev.go b/starport/services/serve/dev.go new file mode 100644 index 0000000000..01d497510f --- /dev/null +++ b/starport/services/serve/dev.go @@ -0,0 +1,57 @@ +package starportserve + +import ( + "encoding/json" + "net/http" + + "github.com/gobuffalo/packr/v2" + "github.com/gorilla/mux" +) + +// newDevHandler creates a new development server handler. +func newDevHandler(app App) http.Handler { + router := mux.NewRouter() + devUI := packr.New("ui/dist", "../../ui/dist") + router.HandleFunc("/env", func(w http.ResponseWriter, r *http.Request) { + env := Env{app.Name, isCommandAvailable("node")} + js, err := json.Marshal(env) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Header().Set("Content-Type", "application/json") + w.Write(js) + }) + router.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) { + res, err := http.Get("http://localhost:1317/node_info") + if err != nil || res.StatusCode != 200 { + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte("500 error")) + } else if res.StatusCode == 200 { + w.WriteHeader(http.StatusOK) + w.Write([]byte("200 ok")) + } + }) + router.HandleFunc("/rpc", func(w http.ResponseWriter, r *http.Request) { + res, err := http.Get("http://localhost:26657") + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + } else if res.StatusCode == 200 { + w.WriteHeader(http.StatusOK) + } else { + w.WriteHeader(http.StatusInternalServerError) + } + }) + router.HandleFunc("/frontend", func(w http.ResponseWriter, r *http.Request) { + res, err := http.Get("http://localhost:8080") + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + } else if res.StatusCode == 200 { + w.WriteHeader(http.StatusOK) + } else { + w.WriteHeader(http.StatusInternalServerError) + } + }) + router.PathPrefix("/").Handler(http.FileServer(devUI)) + return router +} diff --git a/starport/services/serve/serve.go b/starport/services/serve/serve.go index 210e1c7396..d251aa82ee 100644 --- a/starport/services/serve/serve.go +++ b/starport/services/serve/serve.go @@ -13,8 +13,6 @@ import ( "path/filepath" "time" - "github.com/gobuffalo/packr/v2" - "github.com/gorilla/mux" "github.com/pkg/errors" "github.com/radovskyb/watcher" "github.com/tendermint/starport/starport/pkg/cmdrunner" @@ -32,7 +30,7 @@ func Serve(ctx context.Context, app App, verbose bool) error { cmdNpm.Start() serveCtx, cancel := context.WithCancel(ctx) startServe(serveCtx, app, verbose) // TODO handle error - go runDevServer(app.Name, verbose) + go runDevServer(app, verbose) w := watcher.New() w.SetMaxEvents(1) go func() { @@ -187,56 +185,13 @@ func startServe(ctx context.Context, app App, verbose bool) error { return nil } -func runDevServer(appName string, verbose bool) error { +func runDevServer(app App, verbose bool) error { if verbose { fmt.Printf("šŸ”§ Running dev interface at http://localhost:12345\n\n") } else { fmt.Printf("\nšŸš€ Get started: http://localhost:12345/\n\n") } - router := mux.NewRouter() - devUI := packr.New("ui/dist", "../../ui/dist") - router.HandleFunc("/env", func(w http.ResponseWriter, r *http.Request) { - env := Env{appName, isCommandAvailable("node")} - js, err := json.Marshal(env) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - w.Header().Set("Content-Type", "application/json") - w.Write(js) - }) - router.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) { - res, err := http.Get("http://localhost:1317/node_info") - if err != nil || res.StatusCode != 200 { - w.WriteHeader(http.StatusInternalServerError) - w.Write([]byte("500 error")) - } else if res.StatusCode == 200 { - w.WriteHeader(http.StatusOK) - w.Write([]byte("200 ok")) - } - }) - router.HandleFunc("/rpc", func(w http.ResponseWriter, r *http.Request) { - res, err := http.Get("http://localhost:26657") - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - } else if res.StatusCode == 200 { - w.WriteHeader(http.StatusOK) - } else { - w.WriteHeader(http.StatusInternalServerError) - } - }) - router.HandleFunc("/frontend", func(w http.ResponseWriter, r *http.Request) { - res, err := http.Get("http://localhost:8080") - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - } else if res.StatusCode == 200 { - w.WriteHeader(http.StatusOK) - } else { - w.WriteHeader(http.StatusInternalServerError) - } - }) - router.PathPrefix("/").Handler(http.FileServer(devUI)) - return http.ListenAndServe(":12345", router) + return http.ListenAndServe(":12345", newDevHandler(app)) } func isCommandAvailable(name string) bool { From 175adcbfe9be64b19542d14ec7681aeacf17dcf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Thu, 30 Jul 2020 15:12:05 +0300 Subject: [PATCH 21/46] services/serve: refactor dev server handler (#91) * services/serve: refactor dev server handler * updated frontend bindings. * added new `pkg/xhttp` helper. * added new `pkg/httpstatuschecker` helper. * services/serve: simplify server status check and add concurrent checks. * services/serve: rework def of dev server's /status enpoint --- .../httpstatuschecker/httpstatuschecker.go | 56 ++++++++ .../httpstatuschecker_test.go | 39 +++++ starport/pkg/xhttp/response.go | 41 ++++++ starport/pkg/xhttp/response_test.go | 34 +++++ starport/services/serve/dev.go | 133 ++++++++++++------ starport/services/serve/serve.go | 14 +- starport/ui/src/views/Start.vue | 37 +++-- 7 files changed, 284 insertions(+), 70 deletions(-) create mode 100644 starport/pkg/httpstatuschecker/httpstatuschecker.go create mode 100644 starport/pkg/httpstatuschecker/httpstatuschecker_test.go create mode 100644 starport/pkg/xhttp/response.go create mode 100644 starport/pkg/xhttp/response_test.go diff --git a/starport/pkg/httpstatuschecker/httpstatuschecker.go b/starport/pkg/httpstatuschecker/httpstatuschecker.go new file mode 100644 index 0000000000..6cdb4e72e2 --- /dev/null +++ b/starport/pkg/httpstatuschecker/httpstatuschecker.go @@ -0,0 +1,56 @@ +// httpstatuschecker is a tool check health of http pages. +package httpstatuschecker + +import ( + "net/http" +) + +type checker struct { + c *http.Client + addr string + method string +} + +// Option used to customize checker. +type Option func(*checker) + +// Client configures http client. +func Client(c *http.Client) Option { + return func(cr *checker) { + cr.c = c + } +} + +// Client configures http method. +func Method(name string) Option { + return func(cr *checker) { + cr.method = name + } +} + +// Check checks if given http addr is alive by applying options. +func Check(addr string, options ...Option) (isAvailable bool, err error) { + cr := &checker{ + c: http.DefaultClient, + addr: addr, + method: http.MethodGet, + } + for _, o := range options { + o(cr) + } + return cr.check() +} + +func (c *checker) check() (bool, error) { + req, err := http.NewRequest(c.method, c.addr, nil) + if err != nil { + return false, err + } + res, err := c.c.Do(req) + if err != nil { + return false, nil + } + defer res.Body.Close() + isOKStatus := res.StatusCode >= http.StatusOK && res.StatusCode < http.StatusMultipleChoices + return isOKStatus, nil +} diff --git a/starport/pkg/httpstatuschecker/httpstatuschecker_test.go b/starport/pkg/httpstatuschecker/httpstatuschecker_test.go new file mode 100644 index 0000000000..29254fe0bd --- /dev/null +++ b/starport/pkg/httpstatuschecker/httpstatuschecker_test.go @@ -0,0 +1,39 @@ +package httpstatuschecker + +import ( + "net/http" + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestCheckStatus(t *testing.T) { + cases := []struct { + name string + returnedStatus int + isAvaiable bool + }{ + {"200 OK", 200, true}, + {"202 Accepted ", 202, true}, + {"404 Not Found", 404, false}, + } + for _, tt := range cases { + t.Run(tt.name, func(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(tt.returnedStatus) + })) + defer ts.Close() + + isAvailable, err := Check(ts.URL) + require.NoError(t, err) + require.Equal(t, tt.isAvaiable, isAvailable) + }) + } +} + +func TestCheckServerUnreachable(t *testing.T) { + isAvailable, err := Check("http://localhost:63257") + require.NoError(t, err) + require.False(t, isAvailable) +} diff --git a/starport/pkg/xhttp/response.go b/starport/pkg/xhttp/response.go new file mode 100644 index 0000000000..d1c56a5a68 --- /dev/null +++ b/starport/pkg/xhttp/response.go @@ -0,0 +1,41 @@ +package xhttp + +import ( + "encoding/json" + "errors" + "net/http" +) + +// ResponseJSON writes a JSON response to w by using status as http status and data +// as payload. +func ResponseJSON(w http.ResponseWriter, status int, data interface{}) error { + bdata, err := json.Marshal(data) + if err != nil { + status = http.StatusInternalServerError + bdata, _ = json.Marshal(NewErrorResponse(errors.New(http.StatusText(status)))) + } + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(status) + w.Write(bdata) + return err +} + +// ErrorResponseBody is the skeleton for error messages that should be sent to +// client. +type ErrorResponseBody struct { + Error ErrorResponse `json:"error"` +} + +// ErrorResponse holds the error message. +type ErrorResponse struct { + Message string `json:"message"` +} + +// NewErrorResponse creates a new http error response from err. +func NewErrorResponse(err error) ErrorResponseBody { + return ErrorResponseBody{ + Error: ErrorResponse{ + Message: err.Error(), + }, + } +} diff --git a/starport/pkg/xhttp/response_test.go b/starport/pkg/xhttp/response_test.go new file mode 100644 index 0000000000..36c574bc57 --- /dev/null +++ b/starport/pkg/xhttp/response_test.go @@ -0,0 +1,34 @@ +package xhttp + +import ( + "encoding/json" + "errors" + "io/ioutil" + "net/http" + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestResponseJSON(t *testing.T) { + w := httptest.NewRecorder() + data := map[string]interface{}{"a": 1} + require.NoError(t, ResponseJSON(w, http.StatusCreated, data)) + resp := w.Result() + + require.Equal(t, http.StatusCreated, resp.StatusCode) + require.Equal(t, "application/json", resp.Header.Get("Content-Type")) + + body, _ := ioutil.ReadAll(resp.Body) + dataJSON, _ := json.Marshal(data) + require.Equal(t, dataJSON, body) +} + +func TestNewErrorResponse(t *testing.T) { + require.Equal(t, ErrorResponseBody{ + Error: ErrorResponse{ + Message: "error!", + }, + }, NewErrorResponse(errors.New("error!"))) +} diff --git a/starport/services/serve/dev.go b/starport/services/serve/dev.go index 01d497510f..9a880e4e4f 100644 --- a/starport/services/serve/dev.go +++ b/starport/services/serve/dev.go @@ -1,57 +1,106 @@ package starportserve import ( - "encoding/json" "net/http" "github.com/gobuffalo/packr/v2" "github.com/gorilla/mux" + "github.com/tendermint/starport/starport/pkg/httpstatuschecker" + "github.com/tendermint/starport/starport/pkg/xhttp" + "golang.org/x/sync/errgroup" ) -// newDevHandler creates a new development server handler. -func newDevHandler(app App) http.Handler { +const ( + appNodeInfoEndpoint = "/node_info" +) + +// serviceStatusResponse holds the status of development environment and http services +// needed for development. +type statusResponse struct { + Status serviceStatus `json:"status"` + Env env `json:"env"` +} + +// serviceStatus holds the availibity status of http services. +type serviceStatus struct { + IsConsensusEngineAlive bool `json:"is_consensus_engine_alive"` + IsMyAppBackendAlive bool `json:"is_my_app_backend_alive"` + IsMyAppFrontendAlive bool `json:"is_my_app_frontend_alive"` +} + +// env holds info about development environment. +type env struct { + ChainID string `json:"chain_id"` + NodeJS bool `json:"node_js"` +} + +// development handler builder. +type development struct { + app App + conf Config +} + +// Config used to configure development handler. +type Config struct { + EngineAddr string + AppBackendAddr string + AppFrontendAddr string + DevFrontendAssetsPath string +} + +// newDevHandler creates a new development server handler for app by given conf. +func newDevHandler(app App, conf Config) http.Handler { + dev := &development{app, conf} router := mux.NewRouter() - devUI := packr.New("ui/dist", "../../ui/dist") - router.HandleFunc("/env", func(w http.ResponseWriter, r *http.Request) { - env := Env{app.Name, isCommandAvailable("node")} - js, err := json.Marshal(env) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) + router.Handle("/status", dev.statusHandler()).Methods(http.MethodGet) + router.PathPrefix("/").Handler(dev.devAssetsHandler()).Methods(http.MethodGet) + return router +} + +func (d *development) devAssetsHandler() http.Handler { + return http.FileServer(packr.New("ui/dist", d.conf.DevFrontendAssetsPath)) +} + +func (d *development) statusHandler() http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + var ( + engineStatus, + appBackendStatus, + appFrontendStatus bool + ) + g := &errgroup.Group{} + g.Go(func() (err error) { + engineStatus, err = httpstatuschecker.Check(d.conf.EngineAddr) + return + }) + g.Go(func() (err error) { + appBackendStatus, err = httpstatuschecker.Check(d.conf.AppBackendAddr + appNodeInfoEndpoint) + return + }) + g.Go(func() (err error) { + appFrontendStatus, err = httpstatuschecker.Check(d.conf.AppFrontendAddr) + return + }) + if err := g.Wait(); err != nil { + xhttp.ResponseJSON(w, http.StatusInternalServerError, xhttp.NewErrorResponse(err)) return } - w.Header().Set("Content-Type", "application/json") - w.Write(js) - }) - router.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) { - res, err := http.Get("http://localhost:1317/node_info") - if err != nil || res.StatusCode != 200 { - w.WriteHeader(http.StatusInternalServerError) - w.Write([]byte("500 error")) - } else if res.StatusCode == 200 { - w.WriteHeader(http.StatusOK) - w.Write([]byte("200 ok")) - } - }) - router.HandleFunc("/rpc", func(w http.ResponseWriter, r *http.Request) { - res, err := http.Get("http://localhost:26657") - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - } else if res.StatusCode == 200 { - w.WriteHeader(http.StatusOK) - } else { - w.WriteHeader(http.StatusInternalServerError) - } - }) - router.HandleFunc("/frontend", func(w http.ResponseWriter, r *http.Request) { - res, err := http.Get("http://localhost:8080") - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - } else if res.StatusCode == 200 { - w.WriteHeader(http.StatusOK) - } else { - w.WriteHeader(http.StatusInternalServerError) + + resp := statusResponse{ + Env: d.env(), + Status: serviceStatus{ + IsConsensusEngineAlive: engineStatus, + IsMyAppBackendAlive: appBackendStatus, + IsMyAppFrontendAlive: appFrontendStatus, + }, } + xhttp.ResponseJSON(w, http.StatusOK, resp) }) - router.PathPrefix("/").Handler(http.FileServer(devUI)) - return router +} + +func (d *development) env() env { + return env{ + d.app.Name, + isCommandAvailable("node"), + } } diff --git a/starport/services/serve/serve.go b/starport/services/serve/serve.go index d251aa82ee..c94eb47cd7 100644 --- a/starport/services/serve/serve.go +++ b/starport/services/serve/serve.go @@ -59,12 +59,6 @@ func Serve(ctx context.Context, app App, verbose bool) error { return w.Start(time.Millisecond * 1000) } -// Env ... -type Env struct { - ChainID string `json:"chain_id"` - NodeJS bool `json:"node_js"` -} - func startServe(ctx context.Context, app App, verbose bool) error { var ( steps step.Steps @@ -191,7 +185,13 @@ func runDevServer(app App, verbose bool) error { } else { fmt.Printf("\nšŸš€ Get started: http://localhost:12345/\n\n") } - return http.ListenAndServe(":12345", newDevHandler(app)) + conf := Config{ + EngineAddr: "http://localhost:26657", + AppBackendAddr: "http://localhost:1317", + AppFrontendAddr: "http://localhost:8080", + DevFrontendAssetsPath: "../../ui/dist", + } // TODO get vals from const + return http.ListenAndServe(":12345", newDevHandler(app, conf)) } func isCommandAvailable(name string) bool { diff --git a/starport/ui/src/views/Start.vue b/starport/ui/src/views/Start.vue index 3eb369a310..4c6fadad01 100644 --- a/starport/ui/src/views/Start.vue +++ b/starport/ui/src/views/Start.vue @@ -227,34 +227,29 @@ export default { }; }, methods: { - async areServersRunning() { + async setStatusState() { try { - await axios.get("/api"); - this.running.api = true; + const { data } = await axios.get("/status"); + const { status, env } = data; + this.running = { + rpc: status.is_consensus_engine_alive, + api: status.is_my_app_backend_alive, + frontend: status.is_my_app_frontend_alive, + }; + this.env = env; } catch { - this.running.api = false; - } - try { - await axios.get("/rpc"); - this.running.rpc = true; - } catch { - this.running.rpc = false; - } - try { - await axios.get("/frontend"); - this.running.frontend = true; - } catch { - this.running.frontend = false; + this.running = { + rpc: false, + api: false, + frontend: false, + }; } } }, async created() { - this.timer = setInterval(async () => { - this.areServersRunning(); - }, 1000); - axios.get("/api/node_info"); + this.timer = setInterval(this.setStatusState.bind(this), 1000); try { - this.env = (await axios.get("/env")).data; + await this.setStatusState(); } catch { console.log("Can't fetch /env"); } From 09c00a5f1336923f30c835def12528ddb201691d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Fri, 31 Jul 2020 10:56:24 +0300 Subject: [PATCH 22/46] pkg/xexec: added IsCommandAvailable (#94) --- starport/pkg/xexec/command.go | 9 +++++++++ starport/services/serve/dev.go | 3 ++- starport/services/serve/serve.go | 10 +++------- 3 files changed, 14 insertions(+), 8 deletions(-) create mode 100644 starport/pkg/xexec/command.go diff --git a/starport/pkg/xexec/command.go b/starport/pkg/xexec/command.go new file mode 100644 index 0000000000..eb311a8adb --- /dev/null +++ b/starport/pkg/xexec/command.go @@ -0,0 +1,9 @@ +package xexec + +import "os/exec" + +// IsCommandAvailable checks if command is avaiable on user's path. +func IsCommandAvailable(name string) bool { + _, err := exec.LookPath(name) + return err == nil +} diff --git a/starport/services/serve/dev.go b/starport/services/serve/dev.go index 9a880e4e4f..5bc2394a66 100644 --- a/starport/services/serve/dev.go +++ b/starport/services/serve/dev.go @@ -6,6 +6,7 @@ import ( "github.com/gobuffalo/packr/v2" "github.com/gorilla/mux" "github.com/tendermint/starport/starport/pkg/httpstatuschecker" + "github.com/tendermint/starport/starport/pkg/xexec" "github.com/tendermint/starport/starport/pkg/xhttp" "golang.org/x/sync/errgroup" ) @@ -101,6 +102,6 @@ func (d *development) statusHandler() http.Handler { func (d *development) env() env { return env{ d.app.Name, - isCommandAvailable("node"), + xexec.IsCommandAvailable("node"), } } diff --git a/starport/services/serve/serve.go b/starport/services/serve/serve.go index c94eb47cd7..135b66cc66 100644 --- a/starport/services/serve/serve.go +++ b/starport/services/serve/serve.go @@ -17,6 +17,7 @@ import ( "github.com/radovskyb/watcher" "github.com/tendermint/starport/starport/pkg/cmdrunner" "github.com/tendermint/starport/starport/pkg/cmdrunner/step" + "github.com/tendermint/starport/starport/pkg/xexec" ) type App struct { @@ -76,7 +77,7 @@ func startServe(ctx context.Context, app App, verbose bool) error { steps.Add(step.New( step.Exec("go", "mod", "tidy"), step.PreExec(func() error { - if !isCommandAvailable("go") { + if !xexec.IsCommandAvailable("go") { return errors.New("go must be avaiable in your path") } fmt.Println("\nšŸ“¦ Installing dependencies...") @@ -89,7 +90,7 @@ func startServe(ctx context.Context, app App, verbose bool) error { steps.Add(step.New( step.Exec("make"), step.PreExec(func() error { - if !isCommandAvailable("make") { + if !xexec.IsCommandAvailable("make") { return errors.New("make must be avaiable in your path") } fmt.Println("šŸš§ Building the application...") @@ -193,8 +194,3 @@ func runDevServer(app App, verbose bool) error { } // TODO get vals from const return http.ListenAndServe(":12345", newDevHandler(app, conf)) } - -func isCommandAvailable(name string) bool { - _, err := exec.LookPath(name) - return err == nil -} From d5ae4b78b345c1e8847018a0c5eff71aaaaa7b0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Fri, 31 Jul 2020 11:38:07 +0300 Subject: [PATCH 23/46] pkg/fswatcher: added and refactored its callers (#95) * services/serve now uses pkg/fswatcher to watch for changes on user's app. --- starport/pkg/fswatcher/fswatcher.go | 93 +++++++++++++++++++++++++++++ starport/services/serve/serve.go | 39 ++++-------- 2 files changed, 105 insertions(+), 27 deletions(-) create mode 100644 starport/pkg/fswatcher/fswatcher.go diff --git a/starport/pkg/fswatcher/fswatcher.go b/starport/pkg/fswatcher/fswatcher.go new file mode 100644 index 0000000000..452613af48 --- /dev/null +++ b/starport/pkg/fswatcher/fswatcher.go @@ -0,0 +1,93 @@ +// Package fswatcher provides functionalities to watch changes on the +// filesystem. +package fswatcher + +import ( + "context" + "path/filepath" + "sync" + "time" + + wt "github.com/radovskyb/watcher" +) + +type watcher struct { + wt *wt.Watcher + workdir string + onChange func() + interval time.Duration + ctx context.Context + done *sync.WaitGroup +} + +// Option used to configure watcher. +type Option func(*watcher) + +// Workdir to set as a root to paths needs to be watched. +func Workdir(path string) Option { + return func(w *watcher) { + w.workdir = path + } +} + +// OnChange sets a hook that executed on every change on filesystem. +func OnChange(hook func()) Option { + return func(w *watcher) { + w.onChange = hook + } +} + +// PollingInterval overwrites default polling interval to check filesystem changes. +func PollingInterval(d time.Duration) Option { + return func(w *watcher) { + w.interval = d + } +} + +// Watch starts watching changes on the paths. options are used to configure the +// behaviour of watch operation. +func Watch(ctx context.Context, paths []string, options ...Option) error { + wt := wt.New() + wt.SetMaxEvents(1) + w := &watcher{ + wt: wt, + onChange: func() {}, + interval: time.Millisecond * 300, + done: &sync.WaitGroup{}, + ctx: ctx, + } + for _, o := range options { + o(w) + } + w.addPaths(paths...) + w.done.Add(1) + go w.listen() + if err := w.wt.Start(w.interval); err != nil { + return err + } + w.done.Wait() + return nil +} + +func (w *watcher) listen() { + defer w.done.Done() + for { + select { + case <-w.wt.Event: + w.onChange() + case <-w.wt.Closed: + return + case <-w.ctx.Done(): + w.wt.Close() + } + } +} + +func (w *watcher) addPaths(paths ...string) error { + for _, path := range paths { + if err := w.wt.AddRecursive(filepath.Join(w.workdir, path)); err != nil { + return err + } + } + return nil +} diff --git a/starport/services/serve/serve.go b/starport/services/serve/serve.go index 135b66cc66..6d5f22afe4 100644 --- a/starport/services/serve/serve.go +++ b/starport/services/serve/serve.go @@ -11,12 +11,11 @@ import ( "os" "os/exec" "path/filepath" - "time" "github.com/pkg/errors" - "github.com/radovskyb/watcher" "github.com/tendermint/starport/starport/pkg/cmdrunner" "github.com/tendermint/starport/starport/pkg/cmdrunner/step" + "github.com/tendermint/starport/starport/pkg/fswatcher" "github.com/tendermint/starport/starport/pkg/xexec" ) @@ -32,32 +31,18 @@ func Serve(ctx context.Context, app App, verbose bool) error { serveCtx, cancel := context.WithCancel(ctx) startServe(serveCtx, app, verbose) // TODO handle error go runDevServer(app, verbose) - w := watcher.New() - w.SetMaxEvents(1) - go func() { - for { - select { - case <-ctx.Done(): - w.Close() - case <-w.Event: - cancel() - serveCtx, cancel = context.WithCancel(ctx) - startServe(serveCtx, app, verbose) // TODO handle error - case err := <-w.Error: - log.Println(err) - } - } - }() - if err := w.AddRecursive(filepath.Join(app.Path, "./app")); err != nil { - log.Fatalln(err) - } - if err := w.AddRecursive(filepath.Join(app.Path, "./cmd")); err != nil { - log.Fatalln(err) - } - if err := w.AddRecursive(filepath.Join(app.Path, "./x")); err != nil { - log.Fatalln(err) + + changeHook := func() { + cancel() + serveCtx, cancel = context.WithCancel(ctx) + startServe(serveCtx, app, verbose) // TODO handle error } - return w.Start(time.Millisecond * 1000) + return fswatcher.Watch( + ctx, + []string{"app", "cmd", "x"}, + fswatcher.Workdir(app.Path), + fswatcher.OnChange(changeHook), + ) } func startServe(ctx context.Context, app App, verbose bool) error { From 495fa168ef979a4894f495860c415a757e98d233 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Fri, 31 Jul 2020 11:46:55 +0300 Subject: [PATCH 24/46] services/serve: use cmdrunner to run npm dev for user's frontend (#98) --- starport/services/serve/serve.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/starport/services/serve/serve.go b/starport/services/serve/serve.go index 6d5f22afe4..f2c04d3dce 100644 --- a/starport/services/serve/serve.go +++ b/starport/services/serve/serve.go @@ -9,7 +9,6 @@ import ( "log" "net/http" "os" - "os/exec" "path/filepath" "github.com/pkg/errors" @@ -25,9 +24,13 @@ type App struct { } func Serve(ctx context.Context, app App, verbose bool) error { - cmdNpm := exec.CommandContext(ctx, "npm", "run", "dev") - cmdNpm.Dir = filepath.Join(app.Path, "frontend") - cmdNpm.Start() + go cmdrunner. + New(). + Run(ctx, step.New( + step.Exec("npm", "run", "dev"), + step.Workdir(filepath.Join(app.Path, "frontend")), + )) + serveCtx, cancel := context.WithCancel(ctx) startServe(serveCtx, app, verbose) // TODO handle error go runDevServer(app, verbose) From 4b28d182a290441620ff6be3fdbf223f280ee05b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Fri, 31 Jul 2020 13:32:57 +0300 Subject: [PATCH 25/46] services/serve: general refactoring, simplify code (#99) --- starport/services/serve/serve.go | 106 ++++++++++++++++++------------- 1 file changed, 62 insertions(+), 44 deletions(-) diff --git a/starport/services/serve/serve.go b/starport/services/serve/serve.go index f2c04d3dce..397aecd97f 100644 --- a/starport/services/serve/serve.go +++ b/starport/services/serve/serve.go @@ -23,22 +23,30 @@ type App struct { Path string } +type starportServe struct { + ctx context.Context + app App + verbose bool +} + +// Serve serves user apps. func Serve(ctx context.Context, app App, verbose bool) error { - go cmdrunner. - New(). - Run(ctx, step.New( - step.Exec("npm", "run", "dev"), - step.Workdir(filepath.Join(app.Path, "frontend")), - )) + s := &starportServe{ + ctx: ctx, + app: app, + verbose: verbose, + } serveCtx, cancel := context.WithCancel(ctx) - startServe(serveCtx, app, verbose) // TODO handle error - go runDevServer(app, verbose) + s.serve(serveCtx) // TODO handle error + + go s.watchAppFrontend() + go s.runDevServer() changeHook := func() { cancel() serveCtx, cancel = context.WithCancel(ctx) - startServe(serveCtx, app, verbose) // TODO handle error + s.serve(serveCtx) // TODO handle error } return fswatcher.Watch( ctx, @@ -48,20 +56,35 @@ func Serve(ctx context.Context, app App, verbose bool) error { ) } -func startServe(ctx context.Context, app App, verbose bool) error { +func (s *starportServe) serve(ctx context.Context) error { var ( - steps step.Steps - stdout = ioutil.Discard stderr = ioutil.Discard - - mnemonic = &bytes.Buffer{} ) - if verbose { + if s.verbose { stdout = os.Stdout stderr = os.Stderr } + opts := []cmdrunner.Option{ + cmdrunner.DefaultStdout(stdout), + cmdrunner.DefaultStderr(stderr), + cmdrunner.DefaultWorkdir(s.app.Path), + } + + if err := cmdrunner. + New(opts...). + Run(ctx, s.buildSteps()...); err != nil { + log.Fatal(err) + } + + go cmdrunner. + New(append(opts, cmdrunner.RunParallel())...). + Run(ctx, s.serverSteps()...) // TODO handle err + return nil +} +func (s *starportServe) buildSteps() (steps step.Steps) { + mnemonic := &bytes.Buffer{} steps.Add(step.New( step.Exec("go", "mod", "tidy"), step.PreExec(func() error { @@ -121,55 +144,50 @@ func startServe(ctx context.Context, app App, verbose bool) error { steps.Add(step.New( step.Exec("make", "init-post"), )) + return +} - if err := cmdrunner. - New(cmdrunner.DefaultStdout(stdout), - cmdrunner.DefaultStderr(stderr), - cmdrunner.DefaultWorkdir(app.Path)). - Run(ctx, steps...); err != nil { - log.Fatal(err) - } - - var servers step.Steps - servers.Add(step.New( - step.Exec(fmt.Sprintf("%[1]vd", app.Name), "start"), //nolint:gosec // Subprocess launched with function call as argument or cmd arguments +func (s *starportServe) serverSteps() (steps step.Steps) { + steps.Add(step.New( + step.Exec(fmt.Sprintf("%[1]vd", s.app.Name), "start"), step.InExec(func() error { - if verbose { + if s.verbose { fmt.Println("šŸŒ Running a server at http://localhost:26657 (Tendermint)") } else { - fmt.Printf("šŸŒ Running a Cosmos '%[1]v' app with Tendermint.\n", app.Name) + fmt.Printf("šŸŒ Running a Cosmos '%[1]v' app with Tendermint.\n", s.app.Name) } return nil }), step.PostExec(func(exitErr error) error { - return errors.Wrapf(exitErr, "cannot run %[1]vd start", app.Name) + return errors.Wrapf(exitErr, "cannot run %[1]vd start", s.app.Name) }), )) - servers.Add(step.New( - step.Exec(fmt.Sprintf("%[1]vcli", app.Name), "rest-server"), //nolint:gosec // Subprocess launched with function call as argument or cmd arguments + steps.Add(step.New( + step.Exec(fmt.Sprintf("%[1]vcli", s.app.Name), "rest-server"), step.InExec(func() error { - if verbose { + if s.verbose { fmt.Println("šŸŒ Running a server at http://localhost:1317 (LCD)") } return nil }), step.PostExec(func(exitErr error) error { - return errors.Wrapf(exitErr, "cannot run %[1]vcli rest-server", app.Name) + return errors.Wrapf(exitErr, "cannot run %[1]vcli rest-server", s.app.Name) }), )) + return +} - serverRunner := cmdrunner.New( - cmdrunner.RunParallel(), - cmdrunner.DefaultStdout(stdout), - cmdrunner.DefaultStderr(stderr), - cmdrunner.DefaultWorkdir(app.Path), - ) - go serverRunner.Run(ctx, servers...) // TODO handle err - return nil +func (s *starportServe) watchAppFrontend() { + cmdrunner. + New(). + Run(s.ctx, step.New( + step.Exec("npm", "run", "dev"), + step.Workdir(filepath.Join(s.app.Path, "frontend")), + )) } -func runDevServer(app App, verbose bool) error { - if verbose { +func (s *starportServe) runDevServer() error { + if s.verbose { fmt.Printf("šŸ”§ Running dev interface at http://localhost:12345\n\n") } else { fmt.Printf("\nšŸš€ Get started: http://localhost:12345/\n\n") @@ -180,5 +198,5 @@ func runDevServer(app App, verbose bool) error { AppFrontendAddr: "http://localhost:8080", DevFrontendAssetsPath: "../../ui/dist", } // TODO get vals from const - return http.ListenAndServe(":12345", newDevHandler(app, conf)) + return http.ListenAndServe(":12345", newDevHandler(s.app, conf)) } From d809264fd5462c99853720b6869446f1e5519808 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Fri, 31 Jul 2020 21:44:54 +0300 Subject: [PATCH 26/46] services/serve: stabilize serve (#102) * add graceful shutdown to dev server * handle all async errors * exclude hidden files from watch list * stabilize cancelation for serve and other async tasks --- go.mod | 2 +- go.sum | 4 +- starport/interface/cli/starport/cmd/serve.go | 2 + starport/pkg/fswatcher/fswatcher.go | 21 ++-- starport/services/serve/serve.go | 104 ++++++++++++++----- 5 files changed, 98 insertions(+), 35 deletions(-) diff --git a/go.mod b/go.mod index ff0dd6c005..6f676a9928 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/karrick/godirwalk v1.15.6 // indirect github.com/pkg/errors v0.8.1 github.com/radovskyb/watcher v1.0.7 - github.com/rogpeppe/go-internal v1.6.0 // indirect + github.com/rogpeppe/go-internal v1.6.1 // indirect github.com/segmentio/backo-go v0.0.0-20200129164019-23eae7c10bd3 // indirect github.com/sirupsen/logrus v1.6.0 // indirect github.com/spf13/cobra v1.0.0 diff --git a/go.sum b/go.sum index 7f7792ab7e..1b910b2260 100644 --- a/go.sum +++ b/go.sum @@ -153,8 +153,8 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.3.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.4.0/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.6.0 h1:IZRgg4sfrDH7nsAD1Y/Nwj+GzIfEwpJSLjCaNC3SbsI= -github.com/rogpeppe/go-internal v1.6.0/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= 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/segmentio/backo-go v0.0.0-20200129164019-23eae7c10bd3 h1:ZuhckGJ10ulaKkdvJtiAqsLTiPrLaXSdnVgXJKJkTxE= diff --git a/starport/interface/cli/starport/cmd/serve.go b/starport/interface/cli/starport/cmd/serve.go index a13763284b..d8e000b606 100644 --- a/starport/interface/cli/starport/cmd/serve.go +++ b/starport/interface/cli/starport/cmd/serve.go @@ -2,6 +2,7 @@ package starportcmd import ( "context" + "fmt" "os" "os/signal" @@ -42,6 +43,7 @@ func serveHandler(cmd *cobra.Command, args []string) error { err := starportserve.Serve(ctx, app, verbose) if err == context.Canceled { + fmt.Println("aborted") return nil } return err diff --git a/starport/pkg/fswatcher/fswatcher.go b/starport/pkg/fswatcher/fswatcher.go index 452613af48..be73194909 100644 --- a/starport/pkg/fswatcher/fswatcher.go +++ b/starport/pkg/fswatcher/fswatcher.go @@ -12,12 +12,13 @@ import ( ) type watcher struct { - wt *wt.Watcher - workdir string - onChange func() - interval time.Duration - ctx context.Context - done *sync.WaitGroup + wt *wt.Watcher + workdir string + ignoreHidden bool + onChange func() + interval time.Duration + ctx context.Context + done *sync.WaitGroup } // Option used to configure watcher. @@ -44,6 +45,13 @@ func PollingInterval(d time.Duration) Option { } } +// IgnoreHidden ignores hidden(dot) files. +func IgnoreHidden() Option { + return func(w *watcher) { + w.ignoreHidden = true + } +} + // Watch starts watching changes on the paths. options are used to configure the // behaviour of watch operation. func Watch(ctx context.Context, paths []string, options ...Option) error { @@ -59,6 +67,7 @@ func Watch(ctx context.Context, paths []string, options ...Option) error { for _, o := range options { o(w) } + w.wt.IgnoreHiddenFiles(w.ignoreHidden) w.addPaths(paths...) w.done.Add(1) go w.listen() diff --git a/starport/services/serve/serve.go b/starport/services/serve/serve.go index 397aecd97f..8cacbbb071 100644 --- a/starport/services/serve/serve.go +++ b/starport/services/serve/serve.go @@ -6,16 +6,26 @@ import ( "encoding/json" "fmt" "io/ioutil" - "log" "net/http" "os" + "os/exec" "path/filepath" + "time" "github.com/pkg/errors" "github.com/tendermint/starport/starport/pkg/cmdrunner" "github.com/tendermint/starport/starport/pkg/cmdrunner/step" "github.com/tendermint/starport/starport/pkg/fswatcher" "github.com/tendermint/starport/starport/pkg/xexec" + "golang.org/x/sync/errgroup" +) + +var ( + appBackendWatchPaths = []string{ + "app", + "cmd", + "x", + } ) type App struct { @@ -24,7 +34,6 @@ type App struct { } type starportServe struct { - ctx context.Context app App verbose bool } @@ -32,28 +41,52 @@ type starportServe struct { // Serve serves user apps. func Serve(ctx context.Context, app App, verbose bool) error { s := &starportServe{ - ctx: ctx, app: app, verbose: verbose, } - serveCtx, cancel := context.WithCancel(ctx) - s.serve(serveCtx) // TODO handle error - - go s.watchAppFrontend() - go s.runDevServer() + g, ctx := errgroup.WithContext(ctx) + g.Go(func() error { + return s.watchAppFrontend(ctx) + }) + g.Go(func() error { + return s.runDevServer(ctx) + }) - changeHook := func() { - cancel() - serveCtx, cancel = context.WithCancel(ctx) - s.serve(serveCtx) // TODO handle error - } - return fswatcher.Watch( - ctx, - []string{"app", "cmd", "x"}, - fswatcher.Workdir(app.Path), - fswatcher.OnChange(changeHook), + var ( + serveCtx context.Context + serveCancel context.CancelFunc + serveErr = make(chan error, 1) ) + serve := func() { + if serveCancel != nil { + serveCancel() + } + serveCtx, serveCancel = context.WithCancel(ctx) + if err := s.serve(serveCtx); err != nil && err != context.Canceled { + serveErr <- err + } + } + go serve() + + g.Go(func() error { + select { + case err := <-serveErr: + return err + case <-ctx.Done(): + return ctx.Err() + } + }) + g.Go(func() error { + return fswatcher.Watch( + ctx, + appBackendWatchPaths, + fswatcher.Workdir(app.Path), + fswatcher.OnChange(serve), + fswatcher.IgnoreHidden(), + ) + }) + return g.Wait() } func (s *starportServe) serve(ctx context.Context) error { @@ -74,12 +107,17 @@ func (s *starportServe) serve(ctx context.Context) error { if err := cmdrunner. New(opts...). Run(ctx, s.buildSteps()...); err != nil { - log.Fatal(err) + return err } - go cmdrunner. + if err := cmdrunner. New(append(opts, cmdrunner.RunParallel())...). - Run(ctx, s.serverSteps()...) // TODO handle err + Run(ctx, s.serverSteps()...); err != nil { + if _, ok := errors.Cause(err).(*exec.ExitError); ok { + return nil + } + return err + } return nil } @@ -177,16 +215,16 @@ func (s *starportServe) serverSteps() (steps step.Steps) { return } -func (s *starportServe) watchAppFrontend() { - cmdrunner. +func (s *starportServe) watchAppFrontend(ctx context.Context) error { + return cmdrunner. New(). - Run(s.ctx, step.New( + Run(ctx, step.New( step.Exec("npm", "run", "dev"), step.Workdir(filepath.Join(s.app.Path, "frontend")), )) } -func (s *starportServe) runDevServer() error { +func (s *starportServe) runDevServer(ctx context.Context) error { if s.verbose { fmt.Printf("šŸ”§ Running dev interface at http://localhost:12345\n\n") } else { @@ -198,5 +236,19 @@ func (s *starportServe) runDevServer() error { AppFrontendAddr: "http://localhost:8080", DevFrontendAssetsPath: "../../ui/dist", } // TODO get vals from const - return http.ListenAndServe(":12345", newDevHandler(s.app, conf)) + sv := &http.Server{ + Addr: ":12345", + Handler: newDevHandler(s.app, conf), + } + go func() { + <-ctx.Done() + shutdownCtx, cancel := context.WithTimeout(context.Background(), time.Second*5) + defer cancel() + sv.Shutdown(shutdownCtx) + }() + err := sv.ListenAndServe() + if err == http.ErrServerClosed { + return nil + } + return err } From 96a66f4d760e3ebd07c0d336e3d51fa29d595c74 Mon Sep 17 00:00:00 2001 From: Giancarlos Salas Date: Sat, 1 Aug 2020 01:28:11 -0500 Subject: [PATCH 27/46] Create build directory (#103) --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index a9af1d88c8..1d8079946c 100644 --- a/Makefile +++ b/Makefile @@ -6,6 +6,7 @@ mod: build: mod @go get -u github.com/gobuffalo/packr/v2/packr2 @packr2 + @mkdir -p build/ @go build -mod=readonly -o build/ ./starport/interface/cli/... @packr2 clean @go mod tidy From 0f85afdf99ff5eabbbaddf75d2765622f80ff1e1 Mon Sep 17 00:00:00 2001 From: Denis Fadeev Date: Mon, 3 Aug 2020 10:52:26 +0500 Subject: [PATCH 28/46] Added custom bech32 address prefixes (#104) * Add custom prefix support * Replace --prefix with --address-prefix * Fix custom denom in init --- go.mod | 2 +- go.sum | 4 ++-- starport/interface/cli/starport/cmd/app.go | 3 +++ starport/templates/app/new.go | 1 + starport/templates/app/options.go | 1 + .../templates/app/templates/Makefile.plush | 4 ++-- .../app/templates/app/prefix.go.plush | 22 +++++++++++++++++++ .../cmd/{{binaryNamePrefix}}cli/main.go.plush | 8 +------ .../cmd/{{binaryNamePrefix}}d/main.go.plush | 6 +---- .../src/store/{index.js => index.js.plush} | 5 +++-- 10 files changed, 37 insertions(+), 19 deletions(-) create mode 100644 starport/templates/app/templates/app/prefix.go.plush rename starport/templates/app/templates/frontend/src/store/{index.js => index.js.plush} (93%) diff --git a/go.mod b/go.mod index 6f676a9928..c42728b48b 100644 --- a/go.mod +++ b/go.mod @@ -26,5 +26,5 @@ require ( golang.org/x/mod v0.3.0 golang.org/x/net v0.0.0-20200625001655-4c5254603344 // indirect golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 - golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1 // indirect + golang.org/x/sys v0.0.0-20200802091954-4b90ce9b60b3 // indirect ) diff --git a/go.sum b/go.sum index 1b910b2260..b5bd152a88 100644 --- a/go.sum +++ b/go.sum @@ -250,8 +250,8 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1 h1:sIky/MyNRSHTrdxfsiUSS4WIAMvInbeXljJz+jDjeYE= -golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200802091954-4b90ce9b60b3 h1:qDJKu1y/1SjhWac4BQZjLljqvqiWUhjmDMnonmVGDAU= +golang.org/x/sys v0.0.0-20200802091954-4b90ce9b60b3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 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/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/starport/interface/cli/starport/cmd/app.go b/starport/interface/cli/starport/cmd/app.go index 320b73211f..ad7228977f 100644 --- a/starport/interface/cli/starport/cmd/app.go +++ b/starport/interface/cli/starport/cmd/app.go @@ -21,6 +21,7 @@ func NewApp() *cobra.Command { RunE: appHandler, } c.Flags().StringP("denom", "d", "token", "Token denomination") + c.Flags().String("address-prefix", "cosmos", "Address prefix") return c } @@ -30,11 +31,13 @@ func appHandler(cmd *cobra.Command, args []string) error { return err } denom, _ := cmd.Flags().GetString("denom") + addressPrefix, _ := cmd.Flags().GetString("address-prefix") g, _ := app.New(&app.Options{ ModulePath: path.RawPath, AppName: path.Package, BinaryNamePrefix: path.Root, Denom: denom, + AddressPrefix: addressPrefix, }) run := genny.WetRunner(context.Background()) run.With(g) diff --git a/starport/templates/app/new.go b/starport/templates/app/new.go index ae01d8cdcc..714968c53c 100644 --- a/starport/templates/app/new.go +++ b/starport/templates/app/new.go @@ -20,6 +20,7 @@ func New(opts *Options) (*genny.Generator, error) { ctx.Set("AppName", opts.AppName) ctx.Set("BinaryNamePrefix", opts.BinaryNamePrefix) ctx.Set("Denom", opts.Denom) + ctx.Set("AddressPrefix", opts.AddressPrefix) ctx.Set("title", strings.Title) g.Transformer(plushgen.Transformer(ctx)) diff --git a/starport/templates/app/options.go b/starport/templates/app/options.go index f77a46f11c..5d354edcd6 100644 --- a/starport/templates/app/options.go +++ b/starport/templates/app/options.go @@ -6,6 +6,7 @@ type Options struct { BinaryNamePrefix string ModulePath string Denom string + AddressPrefix string } // Validate that options are usuable diff --git a/starport/templates/app/templates/Makefile.plush b/starport/templates/app/templates/Makefile.plush index d64bbba5b2..efedea8dcc 100644 --- a/starport/templates/app/templates/Makefile.plush +++ b/starport/templates/app/templates/Makefile.plush @@ -34,8 +34,8 @@ init-user2: <%= BinaryNamePrefix %>cli keys add user2 --output json 2>&1 init-post: - <%= BinaryNamePrefix %>d add-genesis-account $$(<%= BinaryNamePrefix %>cli keys show user1 -a) 1000token,100000000stake - <%= BinaryNamePrefix %>d add-genesis-account $$(<%= BinaryNamePrefix %>cli keys show user2 -a) 500token + <%= BinaryNamePrefix %>d add-genesis-account $$(<%= BinaryNamePrefix %>cli keys show user1 -a) 1000<%= Denom %>,100000000stake + <%= BinaryNamePrefix %>d add-genesis-account $$(<%= BinaryNamePrefix %>cli keys show user2 -a) 500<%= Denom %> <%= BinaryNamePrefix %>cli config chain-id <%= AppName %> <%= BinaryNamePrefix %>cli config output json <%= BinaryNamePrefix %>cli config indent true diff --git a/starport/templates/app/templates/app/prefix.go.plush b/starport/templates/app/templates/app/prefix.go.plush new file mode 100644 index 0000000000..2343555434 --- /dev/null +++ b/starport/templates/app/templates/app/prefix.go.plush @@ -0,0 +1,22 @@ +package app + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" +) + +var ( + AccountAddressPrefix = "<%= AddressPrefix %>" + AccountPubKeyPrefix = "<%= AddressPrefix %>pub" + ValidatorAddressPrefix = "<%= AddressPrefix %>valoper" + ValidatorPubKeyPrefix = "<%= AddressPrefix %>valoperpub" + ConsNodeAddressPrefix = "<%= AddressPrefix %>valcons" + ConsNodePubKeyPrefix = "<%= AddressPrefix %>valconspub" +) + +func SetConfig() { + config := sdk.GetConfig() + config.SetBech32PrefixForAccount(AccountAddressPrefix, AccountPubKeyPrefix) + config.SetBech32PrefixForValidator(ValidatorAddressPrefix, ValidatorPubKeyPrefix) + config.SetBech32PrefixForConsensusNode(ConsNodeAddressPrefix, ConsNodePubKeyPrefix) + config.Seal() +} diff --git a/starport/templates/app/templates/cmd/{{binaryNamePrefix}}cli/main.go.plush b/starport/templates/app/templates/cmd/{{binaryNamePrefix}}cli/main.go.plush index b688861acc..d233de519f 100644 --- a/starport/templates/app/templates/cmd/{{binaryNamePrefix}}cli/main.go.plush +++ b/starport/templates/app/templates/cmd/{{binaryNamePrefix}}cli/main.go.plush @@ -10,7 +10,6 @@ import ( "github.com/cosmos/cosmos-sdk/client/keys" "github.com/cosmos/cosmos-sdk/client/lcd" "github.com/cosmos/cosmos-sdk/client/rpc" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/version" "github.com/cosmos/cosmos-sdk/x/auth" authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" @@ -35,12 +34,7 @@ func main() { // Instantiate the codec for the command line application cdc := app.MakeCodec() - // Read in the configuration file for the sdk - config := sdk.GetConfig() - config.SetBech32PrefixForAccount(sdk.Bech32PrefixAccAddr, sdk.Bech32PrefixAccPub) - config.SetBech32PrefixForValidator(sdk.Bech32PrefixValAddr, sdk.Bech32PrefixValPub) - config.SetBech32PrefixForConsensusNode(sdk.Bech32PrefixConsAddr, sdk.Bech32PrefixConsPub) - config.Seal() + app.SetConfig() // TODO: setup keybase, viper object, etc. to be passed into // the below functions and eliminate global vars, like we do diff --git a/starport/templates/app/templates/cmd/{{binaryNamePrefix}}d/main.go.plush b/starport/templates/app/templates/cmd/{{binaryNamePrefix}}d/main.go.plush index a55b9b1966..6935450eee 100644 --- a/starport/templates/app/templates/cmd/{{binaryNamePrefix}}d/main.go.plush +++ b/starport/templates/app/templates/cmd/{{binaryNamePrefix}}d/main.go.plush @@ -33,11 +33,7 @@ var invCheckPeriod uint func main() { cdc := app.MakeCodec() - config := sdk.GetConfig() - config.SetBech32PrefixForAccount(sdk.Bech32PrefixAccAddr, sdk.Bech32PrefixAccPub) - config.SetBech32PrefixForValidator(sdk.Bech32PrefixValAddr, sdk.Bech32PrefixValPub) - config.SetBech32PrefixForConsensusNode(sdk.Bech32PrefixConsAddr, sdk.Bech32PrefixConsPub) - config.Seal() + app.SetConfig() ctx := server.NewDefaultContext() cobra.EnableCommandSorting = false diff --git a/starport/templates/app/templates/frontend/src/store/index.js b/starport/templates/app/templates/frontend/src/store/index.js.plush similarity index 93% rename from starport/templates/app/templates/frontend/src/store/index.js rename to starport/templates/app/templates/frontend/src/store/index.js.plush index f176750341..3a79c63195 100644 --- a/starport/templates/app/templates/frontend/src/store/index.js +++ b/starport/templates/app/templates/frontend/src/store/index.js.plush @@ -2,11 +2,12 @@ import Vue from "vue"; import Vuex from "vuex"; import axios from "axios"; import app from "./app.js"; -import { Secp256k1Wallet, SigningCosmosClient } from "@cosmjs/launchpad"; +import { Secp256k1Wallet, SigningCosmosClient, makeCosmoshubPath } from "@cosmjs/launchpad"; Vue.use(Vuex); const API = "http://localhost:8080"; +const ADDRESS_PREFIX = "<%= AddressPrefix %>" export default new Vuex.Store({ state: { @@ -45,7 +46,7 @@ export default new Vuex.Store({ }, async accountSignIn({ commit }, { mnemonic }) { return new Promise(async (resolve, reject) => { - const wallet = await Secp256k1Wallet.fromMnemonic(mnemonic); + const wallet = await Secp256k1Wallet.fromMnemonic(mnemonic, makeCosmoshubPath(0), ADDRESS_PREFIX); const [{ address }] = await wallet.getAccounts(); const url = `${API}/auth/accounts/${address}`; const acc = (await axios.get(url)).data; From eb72e4353e9b6d036295e84cbc49757cc7304e8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Tue, 4 Aug 2020 12:46:10 +0300 Subject: [PATCH 29/46] services/serve: drop using make (#110) to init/config user's app. instead execute command via Go or programatically as possible. * Windows is now supported but not stable yet. --- go.mod | 3 +- go.sum | 56 ++++++++- starport/pkg/xos/rm.go | 14 +++ starport/services/serve/serve.go | 113 +++++++++++++++--- .../templates/app/templates/Makefile.plush | 4 +- 5 files changed, 165 insertions(+), 25 deletions(-) create mode 100644 starport/pkg/xos/rm.go diff --git a/go.mod b/go.mod index c42728b48b..01fda90b17 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ go 1.14 require ( github.com/Pallinder/go-randomdata v1.2.0 github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 // indirect + github.com/go-git/go-git/v5 v5.1.0 github.com/gobuffalo/envy v1.9.0 // indirect github.com/gobuffalo/genny v0.6.0 github.com/gobuffalo/packr/v2 v2.8.0 @@ -26,5 +27,5 @@ require ( golang.org/x/mod v0.3.0 golang.org/x/net v0.0.0-20200625001655-4c5254603344 // indirect golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 - golang.org/x/sys v0.0.0-20200802091954-4b90ce9b60b3 // indirect + golang.org/x/sys v0.0.0-20200803210538-64077c9b5642 // indirect ) diff --git a/go.sum b/go.sum index b5bd152a88..e562acdc9d 100644 --- a/go.sum +++ b/go.sum @@ -3,9 +3,15 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/Pallinder/go-randomdata v1.2.0 h1:DZ41wBchNRb/0GfsePLiSwb0PHZmT67XY00lCDlaYPg= github.com/Pallinder/go-randomdata v1.2.0/go.mod h1:yHmJgulpD2Nfrm0cR9tI/+oAgRqCQQixsA8HyRZfV9Y= +github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= +github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= 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/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= 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/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= @@ -20,16 +26,31 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7 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.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= 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/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= +github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= 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/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= +github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= +github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= +github.com/go-git/go-billy/v5 v5.0.0 h1:7NQHvd9FVid8VL4qVUMm8XifBK+2xCoZ2lSk0agRrHM= +github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-git-fixtures/v4 v4.0.1 h1:q+IFMfLx200Q3scvt2hN79JsEzy4AmBTp/pqnefH+Bc= +github.com/go-git/go-git-fixtures/v4 v4.0.1/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw= +github.com/go-git/go-git/v5 v5.1.0 h1:HxJn9g/E7eYvKW3Fm7Jt4ee8LXfPOm/H1cdDu8vEssk= +github.com/go-git/go-git/v5 v5.1.0/go.mod h1:ZKfuPUoY1ZqIG4QG9BDBh3G4gLM5zvPuSJAozQrZuyM= 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= @@ -79,6 +100,8 @@ 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/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= @@ -90,8 +113,13 @@ github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ilgooz/analytics-go v3.1.1-0.20200723195510-acde4190c655+incompatible h1:SfuTYNfWUpPmAkZUnL9/MlLQb89H7gmjpzMPYDgqSO4= github.com/ilgooz/analytics-go v3.1.1-0.20200723195510-acde4190c655+incompatible/go.mod h1:36xDpOWfOEZLx5a4Qra2Ntu7by75m/qwZZx9/YrPrtY= +github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg= +github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= 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= @@ -99,6 +127,8 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V github.com/karrick/godirwalk v1.15.3/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= github.com/karrick/godirwalk v1.15.6 h1:Yf2mmR8TJy+8Fa0SuQVto5SYap6IF7lNVX4Jdl8G1qA= github.com/karrick/godirwalk v1.15.6/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= +github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY= +github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= 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= @@ -111,6 +141,8 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= 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= @@ -121,9 +153,12 @@ github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kN github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= 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= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= 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/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= 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.10.3 h1:OoxbjfXVZyod1fmWYhI7SEyaD8B00ynP3T+D5GiyHOY= @@ -163,6 +198,8 @@ github.com/serenize/snaker v0.0.0-20171204205717-a683aaf2d516 h1:ofR1ZdrNSkiWcMs 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/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.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= @@ -196,6 +233,8 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 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/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70= +github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= 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/xtgo/uuid v0.0.0-20140804021211-a0b114877d4c h1:3lbZUMbMiGUW/LMkfsEABsc5zNT9+b1CvsJx47JzJ8g= @@ -206,10 +245,12 @@ go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/ 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-20190219172222-a4c6cb3142f2/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-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191122220453-ac88ee75c92c/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de h1:ikNHVSjEfnvz6sxdSPCaPt572qowuyMDMJLLm3Db3ig= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -229,6 +270,7 @@ golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200625001655-4c5254603344 h1:vGXIOMxbNfDTk/aXCmfdLgkrSV+Z2tcbze+pEc3v5W4= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -246,16 +288,21 @@ golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5h 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-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200802091954-4b90ce9b60b3 h1:qDJKu1y/1SjhWac4BQZjLljqvqiWUhjmDMnonmVGDAU= -golang.org/x/sys v0.0.0-20200802091954-4b90ce9b60b3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642 h1:B6caxRw+hozq68X2MY7jEpZh/cr4/aHLv9xU8Kkadrw= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 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/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-20191004055002-72853e10c5a3/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -275,12 +322,17 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks 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= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 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/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/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= 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= diff --git a/starport/pkg/xos/rm.go b/starport/pkg/xos/rm.go new file mode 100644 index 0000000000..993e3456be --- /dev/null +++ b/starport/pkg/xos/rm.go @@ -0,0 +1,14 @@ +package xos + +import ( + "os" + "path/filepath" +) + +func RemoveAllUnderHome(path string) error { + home, err := os.UserHomeDir() + if err != nil { + return err + } + return os.RemoveAll(filepath.Join(home, path)) +} diff --git a/starport/services/serve/serve.go b/starport/services/serve/serve.go index 8cacbbb071..94472b1bd6 100644 --- a/starport/services/serve/serve.go +++ b/starport/services/serve/serve.go @@ -10,13 +10,17 @@ import ( "os" "os/exec" "path/filepath" + "strings" "time" + "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/plumbing" "github.com/pkg/errors" "github.com/tendermint/starport/starport/pkg/cmdrunner" "github.com/tendermint/starport/starport/pkg/cmdrunner/step" "github.com/tendermint/starport/starport/pkg/fswatcher" "github.com/tendermint/starport/starport/pkg/xexec" + "github.com/tendermint/starport/starport/pkg/xos" "golang.org/x/sync/errgroup" ) @@ -33,8 +37,14 @@ type App struct { Path string } +type version struct { + tag string + hash string +} + type starportServe struct { app App + version version verbose bool } @@ -44,6 +54,11 @@ func Serve(ctx context.Context, app App, verbose bool) error { app: app, verbose: verbose, } + v, err := s.appVersion() + if err != nil && err != git.ErrRepositoryNotExists { + return err + } + s.version = v g, ctx := errgroup.WithContext(ctx) g.Go(func() error { @@ -122,7 +137,25 @@ func (s *starportServe) serve(ctx context.Context) error { } func (s *starportServe) buildSteps() (steps step.Steps) { - mnemonic := &bytes.Buffer{} + ldflags := fmt.Sprintf(`'-X github.com/cosmos/cosmos-sdk/version.Name=NewApp + -X github.com/cosmos/cosmos-sdk/version.ServerName=%sd + -X github.com/cosmos/cosmos-sdk/version.ClientName=%scli + -X github.com/cosmos/cosmos-sdk/version.Version=%s + -X github.com/cosmos/cosmos-sdk/version.Commit=%s'`, s.app.Name, s.app.Name, s.version.tag, s.version.hash) + var ( + // no-dash app name. + ndapp = strings.ReplaceAll(s.app.Name, "-", "") + ndappd = ndapp + "d" + ndappcli = ndapp + "cli" + + appd = s.app.Name + "d" + appcli = s.app.Name + "cli" + ) + var ( + user1Key = &bytes.Buffer{} + user2Key = &bytes.Buffer{} + mnemonic = &bytes.Buffer{} + ) steps.Add(step.New( step.Exec("go", "mod", "tidy"), step.PreExec(func() error { @@ -136,32 +169,25 @@ func (s *starportServe) buildSteps() (steps step.Steps) { return errors.Wrap(exitErr, "cannot install go modules") }), )) + steps.Add(step.New(step.Exec("go", "mod", "verify"))) + cwd, _ := os.Getwd() + steps.Add(step.New(step.Exec("go", "install", "-mod", "readonly", "-ldflags", ldflags, filepath.Join(cwd, "cmd", appd)))) + steps.Add(step.New(step.Exec("go", "install", "-mod", "readonly", "-ldflags", ldflags, filepath.Join(cwd, "cmd", appcli)))) steps.Add(step.New( - step.Exec("make"), + step.Exec(appd, "init", "mynode", "--chain-id", ndapp), step.PreExec(func() error { - if !xexec.IsCommandAvailable("make") { - return errors.New("make must be avaiable in your path") - } - fmt.Println("šŸš§ Building the application...") - return nil - }), - step.PostExec(func(exitErr error) error { - return errors.Wrap(exitErr, "cannot build your app") + return xos.RemoveAllUnderHome(fmt.Sprintf(".%s", ndappd)) }), )) steps.Add(step.New( - step.Exec("make", "init-pre"), + step.Exec(appcli, "config", "keyring-backend", "test"), step.PreExec(func() error { - fmt.Println("šŸ’« Initializing the chain...") - return nil - }), - step.PostExec(func(exitErr error) error { - return errors.Wrap(exitErr, "cannot initialize the chain") + return xos.RemoveAllUnderHome(fmt.Sprintf(".%s", ndappcli)) }), )) for _, user := range []string{"user1", "user2"} { steps.Add(step.New( - step.Exec("make", fmt.Sprintf("init-%s", user), "-s"), + step.Exec(appcli, "keys", "add", user, "--output", "json"), step.PostExec(func(exitErr error) error { if exitErr != nil { return errors.Wrapf(exitErr, "cannot create %s account", user) @@ -169,6 +195,7 @@ func (s *starportServe) buildSteps() (steps step.Steps) { var user struct { Mnemonic string `json:"mnemonic"` } + fmt.Println(string(mnemonic.Bytes())) if err := json.Unmarshal(mnemonic.Bytes(), &user); err != nil { return errors.Wrap(err, "cannot decode mnemonic") } @@ -176,12 +203,43 @@ func (s *starportServe) buildSteps() (steps step.Steps) { fmt.Printf("šŸ™‚ Created an account. Password (mnemonic): %[1]v\n", user.Mnemonic) return nil }), - step.Stdout(mnemonic), + step.Stderr(mnemonic), // TODO why mnemonic comes from stderr? )) } steps.Add(step.New( - step.Exec("make", "init-post"), + step.Exec(appcli, "keys", "show", "user1", "-a"), + step.PostExec(func(err error) error { + if err != nil { + return err + } + // TODO dynamic denom + return cmdrunner. + New(). + Run(context.Background(), step.New( + step.Exec(appd, "add-genesis-account", strings.TrimSpace(user1Key.String()), "1000token,100000000stake"))) + }), + step.Stdout(user1Key), + )) + steps.Add(step.New( + step.Exec(appcli, "keys", "show", "user2", "-a"), + step.PostExec(func(err error) error { + if err != nil { + return err + } + // TODO dynamic denom + return cmdrunner. + New(). + Run(context.Background(), step.New( + step.Exec(appd, "add-genesis-account", strings.TrimSpace(user2Key.String()), "500token"))) + }), + step.Stdout(user2Key), )) + steps.Add(step.New(step.Exec(appcli, "config", "chain-id", ndapp))) + steps.Add(step.New(step.Exec(appcli, "config", "output", "json"))) + steps.Add(step.New(step.Exec(appcli, "config", "indent", "true"))) + steps.Add(step.New(step.Exec(appcli, "config", "trust-node", "true"))) + steps.Add(step.New(step.Exec(appd, "gentx", "--name", "user1", "--keyring-backend", "test"))) + steps.Add(step.New(step.Exec(appd, "collect-gentxs"))) return } @@ -252,3 +310,20 @@ func (s *starportServe) runDevServer(ctx context.Context) error { } return err } + +func (s *starportServe) appVersion() (v version, err error) { + repo, err := git.PlainOpen(s.app.Path) + if err != nil { + return version{}, err + } + iter, err := repo.Tags() + if err != nil { + return version{}, err + } + err = iter.ForEach(func(ref *plumbing.Reference) error { + v.tag = strings.TrimPrefix(ref.Name().Short(), "v") + v.hash = ref.Hash().String() + return nil + }) + return +} diff --git a/starport/templates/app/templates/Makefile.plush b/starport/templates/app/templates/Makefile.plush index efedea8dcc..3f6a61b142 100644 --- a/starport/templates/app/templates/Makefile.plush +++ b/starport/templates/app/templates/Makefile.plush @@ -1,5 +1,3 @@ -PACKAGES=$(shell go list ./... | grep -v '/simulation') - VERSION := $(shell echo $(shell git describe --tags) | sed 's/^v//') COMMIT := $(shell git log -1 --format='%H') @@ -43,4 +41,4 @@ init-post: <%= BinaryNamePrefix %>d gentx --name user1 --keyring-backend test <%= BinaryNamePrefix %>d collect-gentxs -init: init-pre init-user1 init-user2 init-post \ No newline at end of file +init: init-pre init-user1 init-user2 init-post From 384ca3f7f4eb9b9667fe1c2963feb81deb1f8d8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Tue, 4 Aug 2020 17:15:12 +0300 Subject: [PATCH 30/46] services/serve: simplify concurrency (#111) * services/serve: simplify concurrency * cleanup. * fix git version retrieval. * fix app backend watch --- starport/services/serve/serve.go | 88 +++++++++++++++++--------------- 1 file changed, 46 insertions(+), 42 deletions(-) diff --git a/starport/services/serve/serve.go b/starport/services/serve/serve.go index 94472b1bd6..2d801dc55d 100644 --- a/starport/services/serve/serve.go +++ b/starport/services/serve/serve.go @@ -14,7 +14,6 @@ import ( "time" "github.com/go-git/go-git/v5" - "github.com/go-git/go-git/v5/plumbing" "github.com/pkg/errors" "github.com/tendermint/starport/starport/pkg/cmdrunner" "github.com/tendermint/starport/starport/pkg/cmdrunner/step" @@ -43,16 +42,19 @@ type version struct { } type starportServe struct { - app App - version version - verbose bool + app App + version version + verbose bool + serveCancel context.CancelFunc + serveRefresher chan struct{} } // Serve serves user apps. func Serve(ctx context.Context, app App, verbose bool) error { s := &starportServe{ - app: app, - verbose: verbose, + app: app, + verbose: verbose, + serveRefresher: make(chan struct{}, 1), } v, err := s.appVersion() if err != nil && err != git.ErrRepositoryNotExists { @@ -67,43 +69,45 @@ func Serve(ctx context.Context, app App, verbose bool) error { g.Go(func() error { return s.runDevServer(ctx) }) - - var ( - serveCtx context.Context - serveCancel context.CancelFunc - serveErr = make(chan error, 1) - ) - serve := func() { - if serveCancel != nil { - serveCancel() - } - serveCtx, serveCancel = context.WithCancel(ctx) - if err := s.serve(serveCtx); err != nil && err != context.Canceled { - serveErr <- err - } - } - go serve() - g.Go(func() error { - select { - case err := <-serveErr: - return err - case <-ctx.Done(): - return ctx.Err() + s.refreshServe() + for { + select { + case <-ctx.Done(): + return ctx.Err() + + case <-s.serveRefresher: + var serveCtx context.Context + serveCtx, s.serveCancel = context.WithCancel(ctx) + if err := s.serve(serveCtx); err != nil && err != context.Canceled { + return err + } + } } }) g.Go(func() error { - return fswatcher.Watch( - ctx, - appBackendWatchPaths, - fswatcher.Workdir(app.Path), - fswatcher.OnChange(serve), - fswatcher.IgnoreHidden(), - ) + return s.watchAppBackend(ctx) }) return g.Wait() } +func (s *starportServe) refreshServe() { + if s.serveCancel != nil { + s.serveCancel() + } + s.serveRefresher <- struct{}{} +} + +func (s *starportServe) watchAppBackend(ctx context.Context) error { + return fswatcher.Watch( + ctx, + appBackendWatchPaths, + fswatcher.Workdir(s.app.Path), + fswatcher.OnChange(s.refreshServe), + fswatcher.IgnoreHidden(), + ) +} + func (s *starportServe) serve(ctx context.Context) error { var ( stdout = ioutil.Discard @@ -195,7 +199,6 @@ func (s *starportServe) buildSteps() (steps step.Steps) { var user struct { Mnemonic string `json:"mnemonic"` } - fmt.Println(string(mnemonic.Bytes())) if err := json.Unmarshal(mnemonic.Bytes(), &user); err != nil { return errors.Wrap(err, "cannot decode mnemonic") } @@ -320,10 +323,11 @@ func (s *starportServe) appVersion() (v version, err error) { if err != nil { return version{}, err } - err = iter.ForEach(func(ref *plumbing.Reference) error { - v.tag = strings.TrimPrefix(ref.Name().Short(), "v") - v.hash = ref.Hash().String() - return nil - }) - return + ref, err := iter.Next() + if err != nil { + return version{}, err + } + v.tag = strings.TrimPrefix(ref.Name().Short(), "v") + v.hash = ref.Hash().String() + return v, nil } From de178c21095f7c47f97bd7c2af8fc5297b4a6731 Mon Sep 17 00:00:00 2001 From: Denis Fadeev Date: Tue, 4 Aug 2020 22:10:51 +0500 Subject: [PATCH 31/46] Add Contributing section --- readme.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/readme.md b/readme.md index 198de543c3..c478023512 100644 --- a/readme.md +++ b/readme.md @@ -83,6 +83,10 @@ Adds smart contracts with [CosmWasm](https://docs.cosmwasm.com). Follow a short For questions and support please join the #starport channel in the [Cosmos Community Discord](https://discord.com/invite/W8trcGV). The issue list of this repo is exclusively for bug reports and feature requests. +# Contributing + +`develop` contains the latest version. Please branch of from `develop` and create a PR. + ## Stay in touch Starport is a product built by [Tendermint](https://tendermint.com). Follow us to get the latest updates! From 45260fc3532b0e51bb17a1905718c2b384512eec Mon Sep 17 00:00:00 2001 From: Denis Fadeev Date: Tue, 4 Aug 2020 22:11:31 +0500 Subject: [PATCH 32/46] Make Contributing heading h2 instead of h1 --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index c478023512..75f1c9ae5d 100644 --- a/readme.md +++ b/readme.md @@ -83,7 +83,7 @@ Adds smart contracts with [CosmWasm](https://docs.cosmwasm.com). Follow a short For questions and support please join the #starport channel in the [Cosmos Community Discord](https://discord.com/invite/W8trcGV). The issue list of this repo is exclusively for bug reports and feature requests. -# Contributing +## Contributing `develop` contains the latest version. Please branch of from `develop` and create a PR. From fa7113efdbb0f5c00226611fa766b077c1f947c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Wed, 5 Aug 2020 11:06:31 +0300 Subject: [PATCH 33/46] services/serve: move dev server log to the end (#115) --- starport/services/serve/serve.go | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/starport/services/serve/serve.go b/starport/services/serve/serve.go index 2d801dc55d..c23985c86c 100644 --- a/starport/services/serve/serve.go +++ b/starport/services/serve/serve.go @@ -11,6 +11,7 @@ import ( "os/exec" "path/filepath" "strings" + "sync" "time" "github.com/go-git/go-git/v5" @@ -247,9 +248,16 @@ func (s *starportServe) buildSteps() (steps step.Steps) { } func (s *starportServe) serverSteps() (steps step.Steps) { + var wg sync.WaitGroup + wg.Add(2) + go func() { + wg.Wait() + fmt.Printf("\nšŸš€ Get started: http://localhost:12345/\n\n") + }() steps.Add(step.New( step.Exec(fmt.Sprintf("%[1]vd", s.app.Name), "start"), step.InExec(func() error { + defer wg.Done() if s.verbose { fmt.Println("šŸŒ Running a server at http://localhost:26657 (Tendermint)") } else { @@ -264,6 +272,7 @@ func (s *starportServe) serverSteps() (steps step.Steps) { steps.Add(step.New( step.Exec(fmt.Sprintf("%[1]vcli", s.app.Name), "rest-server"), step.InExec(func() error { + defer wg.Done() if s.verbose { fmt.Println("šŸŒ Running a server at http://localhost:1317 (LCD)") } @@ -286,11 +295,6 @@ func (s *starportServe) watchAppFrontend(ctx context.Context) error { } func (s *starportServe) runDevServer(ctx context.Context) error { - if s.verbose { - fmt.Printf("šŸ”§ Running dev interface at http://localhost:12345\n\n") - } else { - fmt.Printf("\nšŸš€ Get started: http://localhost:12345/\n\n") - } conf := Config{ EngineAddr: "http://localhost:26657", AppBackendAddr: "http://localhost:1317", From 0892f47841bda2cab09892cbb49296df68b16322 Mon Sep 17 00:00:00 2001 From: Denis Fadeev Date: Wed, 5 Aug 2020 13:50:22 +0500 Subject: [PATCH 34/46] Added fix to add wasm cmd (fix #114) (#116) --- starport/templates/add/new.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/starport/templates/add/new.go b/starport/templates/add/new.go index 375ed177f9..cb5b3b3de3 100644 --- a/starport/templates/add/new.go +++ b/starport/templates/add/new.go @@ -71,7 +71,7 @@ func appModify(opts *Options) genny.RunFn { } wasmConfig := wasmWrap.Wasm supportedFeatures := "staking" - app.wasmKeeper = wasm.NewKeeper(app.cdc, keys[wasm.StoreKey], app.accountKeeper, app.bankKeeper, app.stakingKeeper, wasmRouter, wasmDir, wasmConfig, supportedFeatures, nil, nil) ` + app.wasmKeeper = wasm.NewKeeper(app.cdc, keys[wasm.StoreKey], app.subspaces[wasm.ModuleName], app.accountKeeper, app.bankKeeper, app.stakingKeeper, wasmRouter, wasmDir, wasmConfig, supportedFeatures, nil, nil)` content = strings.Replace(content, placeholder4, template4, 1) template5 := `%[1]v From a05773dd5da50e65344686cdd613cfcd2a9b9bf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Wed, 5 Aug 2020 12:30:12 +0300 Subject: [PATCH 35/46] services/serve: introduce config.yml (#118) * services/serve: introduce config.yml for now it only supports account creation with the format below: ```yml accounts: - name: me coins: ["1000token", "100000000stake"] - name: you coins: ["5000token"] ``` * Makefile in the user app's is removed in favor of adding config.yml. * some util packages added under pkg/ needed for this feature. solves a part of #106, #41. * fix tests --- go.mod | 3 +- go.sum | 26 ++++++- starport/interface/cli/starport/cmd/serve.go | 16 ++++- starport/pkg/xos/file.go | 14 ++++ starport/services/serve/conf/config.go | 42 ++++++++++++ starport/services/serve/conf/config_test.go | 33 +++++++++ starport/services/serve/serve.go | 68 ++++++++----------- .../templates/app/templates/Makefile.plush | 44 ------------ starport/templates/app/templates/config.yml | 5 ++ 9 files changed, 163 insertions(+), 88 deletions(-) create mode 100644 starport/pkg/xos/file.go create mode 100644 starport/services/serve/conf/config.go create mode 100644 starport/services/serve/conf/config_test.go delete mode 100644 starport/templates/app/templates/Makefile.plush create mode 100644 starport/templates/app/templates/config.yml diff --git a/go.mod b/go.mod index 01fda90b17..68f8df04d4 100644 --- a/go.mod +++ b/go.mod @@ -11,6 +11,7 @@ require ( github.com/gobuffalo/packr/v2 v2.8.0 github.com/gobuffalo/plush v3.8.3+incompatible github.com/gobuffalo/plushgen v0.1.2 + github.com/goccy/go-yaml v1.8.0 github.com/gorilla/mux v1.7.4 github.com/ilgooz/analytics-go v3.1.1-0.20200723195510-acde4190c655+incompatible github.com/karrick/godirwalk v1.15.6 // indirect @@ -27,5 +28,5 @@ require ( golang.org/x/mod v0.3.0 golang.org/x/net v0.0.0-20200625001655-4c5254603344 // indirect golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 - golang.org/x/sys v0.0.0-20200803210538-64077c9b5642 // indirect + golang.org/x/sys v0.0.0-20200805065543-0cf7623e9dbd // indirect ) diff --git a/go.sum b/go.sum index e562acdc9d..bf66383571 100644 --- a/go.sum +++ b/go.sum @@ -34,6 +34,8 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= +github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= @@ -54,6 +56,10 @@ github.com/go-git/go-git/v5 v5.1.0/go.mod h1:ZKfuPUoY1ZqIG4QG9BDBh3G4gLM5zvPuSJA 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-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= 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= @@ -88,6 +94,8 @@ github.com/gobuffalo/uuid v2.0.5+incompatible h1:c5uWRuEnYggYCrT9AJm0U2v1QTG7OVD 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/goccy/go-yaml v1.8.0 h1:WCe9sBiI0oZb6EC6f3kq3dv0+aEiNdstT7b4xxq4MJQ= +github.com/goccy/go-yaml v1.8.0/go.mod h1:wS4gNoLalDSJxo/SpngzPQ2BN4uuZVLCmbM4S3vd4+Y= 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= @@ -143,6 +151,8 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= 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= @@ -150,6 +160,11 @@ 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/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.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10 h1:qxFzApOv4WsAL965uUPIsXzAKCZxN2p9UqdhFS4ZW10= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= 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= @@ -289,13 +304,16 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h 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-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642 h1:B6caxRw+hozq68X2MY7jEpZh/cr4/aHLv9xU8Kkadrw= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200805065543-0cf7623e9dbd h1:wefLe/3g5tC0FcXw3NneLA5tHgbyouyZlfcSjNfOdgk= +golang.org/x/sys v0.0.0-20200805065543-0cf7623e9dbd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 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/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= @@ -328,6 +346,10 @@ gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8 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/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v9 v9.30.0 h1:Wk0Z37oBmKj9/n+tPyBHZmeL19LaCoK3Qq48VwYENss= +gopkg.in/go-playground/validator.v9 v9.30.0/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= 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= diff --git a/starport/interface/cli/starport/cmd/serve.go b/starport/interface/cli/starport/cmd/serve.go index d8e000b606..04403b00bf 100644 --- a/starport/interface/cli/starport/cmd/serve.go +++ b/starport/interface/cli/starport/cmd/serve.go @@ -6,8 +6,11 @@ import ( "os" "os/signal" + "github.com/pkg/errors" "github.com/spf13/cobra" + "github.com/tendermint/starport/starport/pkg/xos" starportserve "github.com/tendermint/starport/starport/services/serve" + starportconf "github.com/tendermint/starport/starport/services/serve/conf" ) var appPath string @@ -31,6 +34,17 @@ func serveHandler(cmd *cobra.Command, args []string) error { Name: appName, Path: appPath, } + + confFile, err := xos.OpenFirst(starportconf.FileNames...) + if err != nil { + return errors.Wrap(err, "config file cannot be found") + } + defer confFile.Close() + conf, err := starportconf.Parse(confFile) + if err != nil { + return errors.Wrap(err, "config file is not valid") + } + ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -41,7 +55,7 @@ func serveHandler(cmd *cobra.Command, args []string) error { cancel() }() - err := starportserve.Serve(ctx, app, verbose) + err = starportserve.Serve(ctx, app, conf, verbose) if err == context.Canceled { fmt.Println("aborted") return nil diff --git a/starport/pkg/xos/file.go b/starport/pkg/xos/file.go new file mode 100644 index 0000000000..d6a5d4fae6 --- /dev/null +++ b/starport/pkg/xos/file.go @@ -0,0 +1,14 @@ +package xos + +import "os" + +// OpenFirst finds and opens the first found file within names. +func OpenFirst(names ...string) (file *os.File, err error) { + for _, name := range names { + file, err = os.Open(name) + if err == nil { + break + } + } + return file, err +} diff --git a/starport/services/serve/conf/config.go b/starport/services/serve/conf/config.go new file mode 100644 index 0000000000..54bdf1b078 --- /dev/null +++ b/starport/services/serve/conf/config.go @@ -0,0 +1,42 @@ +package starportconf + +import ( + "io" + + "github.com/goccy/go-yaml" + "github.com/pkg/errors" +) + +var ( + // FileNames holds a list of appropriate names for the config file. + FileNames = []string{"config.yml", "config.yaml"} +) + +// Config is the user given configuration to do additional setup +// during serve. +type Config struct { + Accounts []Account `yaml:"accounts"` +} + +// Account holds the options related to setting up Cosmos wallets. +type Account struct { + Name string `yaml:"name"` + Coins []string `yaml:"coins"` +} + +// Parse parses config.yml into UserConfig. +func Parse(r io.Reader) (Config, error) { + var conf Config + if err := yaml.NewDecoder(r).Decode(&conf); err != nil { + return conf, err + } + return conf, validate(conf) +} + +// validate validates user config. +func validate(conf Config) error { + if len(conf.Accounts) == 0 { + errors.New("at least 1 account is needed") + } + return nil +} diff --git a/starport/services/serve/conf/config_test.go b/starport/services/serve/conf/config_test.go new file mode 100644 index 0000000000..e6d81f4f90 --- /dev/null +++ b/starport/services/serve/conf/config_test.go @@ -0,0 +1,33 @@ +package starportconf + +import ( + "strings" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestParse(t *testing.T) { + confyml := ` +accounts: + - name: me + coins: ["1000token", "100000000stake"] + - name: you + coins: ["5000token"] +` + + conf, err := Parse(strings.NewReader(confyml)) + require.NoError(t, err) + require.Equal(t, Config{ + Accounts: []Account{ + { + Name: "me", + Coins: []string{"1000token", "100000000stake"}, + }, + { + Name: "you", + Coins: []string{"5000token"}, + }, + }, + }, conf) +} diff --git a/starport/services/serve/serve.go b/starport/services/serve/serve.go index c23985c86c..b6d8076f33 100644 --- a/starport/services/serve/serve.go +++ b/starport/services/serve/serve.go @@ -21,6 +21,7 @@ import ( "github.com/tendermint/starport/starport/pkg/fswatcher" "github.com/tendermint/starport/starport/pkg/xexec" "github.com/tendermint/starport/starport/pkg/xos" + starportconf "github.com/tendermint/starport/starport/services/serve/conf" "golang.org/x/sync/errgroup" ) @@ -44,6 +45,7 @@ type version struct { type starportServe struct { app App + conf starportconf.Config version version verbose bool serveCancel context.CancelFunc @@ -51,9 +53,10 @@ type starportServe struct { } // Serve serves user apps. -func Serve(ctx context.Context, app App, verbose bool) error { +func Serve(ctx context.Context, app App, conf starportconf.Config, verbose bool) error { s := &starportServe{ app: app, + conf: conf, verbose: verbose, serveRefresher: make(chan struct{}, 1), } @@ -156,11 +159,6 @@ func (s *starportServe) buildSteps() (steps step.Steps) { appd = s.app.Name + "d" appcli = s.app.Name + "cli" ) - var ( - user1Key = &bytes.Buffer{} - user2Key = &bytes.Buffer{} - mnemonic = &bytes.Buffer{} - ) steps.Add(step.New( step.Exec("go", "mod", "tidy"), step.PreExec(func() error { @@ -190,59 +188,49 @@ func (s *starportServe) buildSteps() (steps step.Steps) { return xos.RemoveAllUnderHome(fmt.Sprintf(".%s", ndappcli)) }), )) - for _, user := range []string{"user1", "user2"} { + for _, account := range s.conf.Accounts { + account := account + var ( + key = &bytes.Buffer{} + mnemonic = &bytes.Buffer{} + ) steps.Add(step.New( - step.Exec(appcli, "keys", "add", user, "--output", "json"), + step.Exec(appcli, "keys", "add", account.Name, "--output", "json"), step.PostExec(func(exitErr error) error { if exitErr != nil { - return errors.Wrapf(exitErr, "cannot create %s account", user) + return errors.Wrapf(exitErr, "cannot create %s account", account.Name) } var user struct { Mnemonic string `json:"mnemonic"` } - if err := json.Unmarshal(mnemonic.Bytes(), &user); err != nil { + if err := json.NewDecoder(mnemonic).Decode(&user); err != nil { return errors.Wrap(err, "cannot decode mnemonic") } - mnemonic.Reset() fmt.Printf("šŸ™‚ Created an account. Password (mnemonic): %[1]v\n", user.Mnemonic) return nil }), step.Stderr(mnemonic), // TODO why mnemonic comes from stderr? )) + steps.Add(step.New( + step.Exec(appcli, "keys", "show", account.Name, "-a"), + step.PostExec(func(err error) error { + if err != nil { + return err + } + coins := strings.Join(account.Coins, ",") + return cmdrunner. + New(). + Run(context.Background(), step.New( + step.Exec(appd, "add-genesis-account", strings.TrimSpace(key.String()), coins))) + }), + step.Stdout(key), + )) } - steps.Add(step.New( - step.Exec(appcli, "keys", "show", "user1", "-a"), - step.PostExec(func(err error) error { - if err != nil { - return err - } - // TODO dynamic denom - return cmdrunner. - New(). - Run(context.Background(), step.New( - step.Exec(appd, "add-genesis-account", strings.TrimSpace(user1Key.String()), "1000token,100000000stake"))) - }), - step.Stdout(user1Key), - )) - steps.Add(step.New( - step.Exec(appcli, "keys", "show", "user2", "-a"), - step.PostExec(func(err error) error { - if err != nil { - return err - } - // TODO dynamic denom - return cmdrunner. - New(). - Run(context.Background(), step.New( - step.Exec(appd, "add-genesis-account", strings.TrimSpace(user2Key.String()), "500token"))) - }), - step.Stdout(user2Key), - )) steps.Add(step.New(step.Exec(appcli, "config", "chain-id", ndapp))) steps.Add(step.New(step.Exec(appcli, "config", "output", "json"))) steps.Add(step.New(step.Exec(appcli, "config", "indent", "true"))) steps.Add(step.New(step.Exec(appcli, "config", "trust-node", "true"))) - steps.Add(step.New(step.Exec(appd, "gentx", "--name", "user1", "--keyring-backend", "test"))) + steps.Add(step.New(step.Exec(appd, "gentx", "--name", s.conf.Accounts[0].Name, "--keyring-backend", "test"))) steps.Add(step.New(step.Exec(appd, "collect-gentxs"))) return } diff --git a/starport/templates/app/templates/Makefile.plush b/starport/templates/app/templates/Makefile.plush deleted file mode 100644 index 3f6a61b142..0000000000 --- a/starport/templates/app/templates/Makefile.plush +++ /dev/null @@ -1,44 +0,0 @@ -VERSION := $(shell echo $(shell git describe --tags) | sed 's/^v//') -COMMIT := $(shell git log -1 --format='%H') - -ldflags = -X github.com/cosmos/cosmos-sdk/version.Name=NewApp \ - -X github.com/cosmos/cosmos-sdk/version.ServerName=<%= BinaryNamePrefix %>d \ - -X github.com/cosmos/cosmos-sdk/version.ClientName=<%= BinaryNamePrefix %>cli \ - -X github.com/cosmos/cosmos-sdk/version.Version=$(VERSION) \ - -X github.com/cosmos/cosmos-sdk/version.Commit=$(COMMIT) - -BUILD_FLAGS := -ldflags '$(ldflags)' - -all: install - -install: go.sum - go install -mod=readonly $(BUILD_FLAGS) ./cmd/<%= BinaryNamePrefix %>d - go install -mod=readonly $(BUILD_FLAGS) ./cmd/<%= BinaryNamePrefix %>cli - -go.sum: go.mod - @echo "--> Ensure dependencies have not been modified" - GO111MODULE=on go mod verify - -init-pre: - rm -rf ~/.<%= AppName %>cli - rm -rf ~/.<%= AppName %>d - <%= BinaryNamePrefix %>d init mynode --chain-id <%= AppName %> - <%= BinaryNamePrefix %>cli config keyring-backend test - -init-user1: - <%= BinaryNamePrefix %>cli keys add user1 --output json 2>&1 - -init-user2: - <%= BinaryNamePrefix %>cli keys add user2 --output json 2>&1 - -init-post: - <%= BinaryNamePrefix %>d add-genesis-account $$(<%= BinaryNamePrefix %>cli keys show user1 -a) 1000<%= Denom %>,100000000stake - <%= BinaryNamePrefix %>d add-genesis-account $$(<%= BinaryNamePrefix %>cli keys show user2 -a) 500<%= Denom %> - <%= BinaryNamePrefix %>cli config chain-id <%= AppName %> - <%= BinaryNamePrefix %>cli config output json - <%= BinaryNamePrefix %>cli config indent true - <%= BinaryNamePrefix %>cli config trust-node true - <%= BinaryNamePrefix %>d gentx --name user1 --keyring-backend test - <%= BinaryNamePrefix %>d collect-gentxs - -init: init-pre init-user1 init-user2 init-post diff --git a/starport/templates/app/templates/config.yml b/starport/templates/app/templates/config.yml new file mode 100644 index 0000000000..17c8052bf0 --- /dev/null +++ b/starport/templates/app/templates/config.yml @@ -0,0 +1,5 @@ +accounts: + - name: user1 + coins: ["1000token", "100000000stake"] + - name: user2 + coins: ["500token"] From 9c4cdb15fbed54c00963dcf2c76bed298ed7ba09 Mon Sep 17 00:00:00 2001 From: loloicci Date: Wed, 5 Aug 2020 18:30:33 +0900 Subject: [PATCH 36/46] fix typo in x/appName/types/key.go.plush (querierer -> querier) (#117) --- .../templates/app/templates/x/{{appName}}/types/key.go.plush | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/starport/templates/app/templates/x/{{appName}}/types/key.go.plush b/starport/templates/app/templates/x/{{appName}}/types/key.go.plush index 57345dde7d..6675c5ad32 100644 --- a/starport/templates/app/templates/x/{{appName}}/types/key.go.plush +++ b/starport/templates/app/templates/x/{{appName}}/types/key.go.plush @@ -10,6 +10,6 @@ const ( // RouterKey to be used for routing msgs RouterKey = ModuleName - // QuerierRoute to be used for querierer msgs + // QuerierRoute to be used for querier msgs QuerierRoute = ModuleName ) From 8aad26fcab427f67ab3db8c1ff47ede993566ac6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Wed, 5 Aug 2020 16:03:23 +0300 Subject: [PATCH 37/46] services/serve: wait for a fix on build error (#119) * services/serve: wait for a fix on build error instead of aborting the serve on an error related to building the app's backend, wait for a fix and try to rebuild. resolves #107. * improve logs * extend the scope of build error handling * improve logs --- go.mod | 1 + go.sum | 2 ++ starport/services/serve/serve.go | 60 +++++++++++++++++++++++++++----- 3 files changed, 55 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 68f8df04d4..b927ae04c9 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,7 @@ require ( github.com/gobuffalo/plush v3.8.3+incompatible github.com/gobuffalo/plushgen v0.1.2 github.com/goccy/go-yaml v1.8.0 + github.com/gookit/color v1.2.7 github.com/gorilla/mux v1.7.4 github.com/ilgooz/analytics-go v3.1.1-0.20200723195510-acde4190c655+incompatible github.com/karrick/godirwalk v1.15.6 // indirect diff --git a/go.sum b/go.sum index bf66383571..847a7a48ba 100644 --- a/go.sum +++ b/go.sum @@ -110,6 +110,8 @@ github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/gookit/color v1.2.7 h1:4qePMNWZhrmbfYJDix+J4V2l0iVW+6jQGjicELlN14E= +github.com/gookit/color v1.2.7/go.mod h1:AhIE+pS6D4Ql0SQWbBeXPHw7gY0/sjHoA4s/n1KB7xg= github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= diff --git a/starport/services/serve/serve.go b/starport/services/serve/serve.go index b6d8076f33..2a03730998 100644 --- a/starport/services/serve/serve.go +++ b/starport/services/serve/serve.go @@ -15,6 +15,7 @@ import ( "time" "github.com/go-git/go-git/v5" + "github.com/gookit/color" "github.com/pkg/errors" "github.com/tendermint/starport/starport/pkg/cmdrunner" "github.com/tendermint/starport/starport/pkg/cmdrunner/step" @@ -31,6 +32,9 @@ var ( "cmd", "x", } + + errorColor = color.Red.Render + infoColor = color.Yellow.Render ) type App struct { @@ -83,9 +87,16 @@ func Serve(ctx context.Context, app App, conf starportconf.Config, verbose bool) case <-s.serveRefresher: var serveCtx context.Context serveCtx, s.serveCancel = context.WithCancel(ctx) - if err := s.serve(serveCtx); err != nil && err != context.Canceled { - return err + err := s.serve(serveCtx) + if err == nil || err == context.Canceled { + continue + } + if _, ok := err.(*CannotBuildAppError); ok { + fmt.Fprintf(os.Stderr, "%s\n", errorColor(err.Error())) + fmt.Printf("%s\n", infoColor("waiting for a fix before retrying...")) + continue } + return err } } }) @@ -158,7 +169,15 @@ func (s *starportServe) buildSteps() (steps step.Steps) { appd = s.app.Name + "d" appcli = s.app.Name + "cli" + + buildErr = &bytes.Buffer{} ) + captureBuildErr := func(exitErr error) error { + if exitErr != nil { + return &CannotBuildAppError{Log: buildErr.String()} + } + return nil + } steps.Add(step.New( step.Exec("go", "mod", "tidy"), step.PreExec(func() error { @@ -168,14 +187,31 @@ func (s *starportServe) buildSteps() (steps step.Steps) { fmt.Println("\nšŸ“¦ Installing dependencies...") return nil }), - step.PostExec(func(exitErr error) error { - return errors.Wrap(exitErr, "cannot install go modules") - }), + step.PostExec(captureBuildErr), + step.Stderr(buildErr), )) - steps.Add(step.New(step.Exec("go", "mod", "verify"))) + steps.Add(step.New( + step.Exec("go", "mod", "verify"), + step.PostExec(captureBuildErr), + step.Stderr(buildErr), + )) + cwd, _ := os.Getwd() - steps.Add(step.New(step.Exec("go", "install", "-mod", "readonly", "-ldflags", ldflags, filepath.Join(cwd, "cmd", appd)))) - steps.Add(step.New(step.Exec("go", "install", "-mod", "readonly", "-ldflags", ldflags, filepath.Join(cwd, "cmd", appcli)))) + + steps.Add(step.New( + step.Exec("go", "install", "-mod", "readonly", "-ldflags", ldflags, filepath.Join(cwd, "cmd", appd)), + step.PreExec(func() error { + fmt.Println("šŸ› ļø Building the app...") + return nil + }), + step.PostExec(captureBuildErr), + step.Stderr(buildErr), + )) + steps.Add(step.New( + step.Exec("go", "install", "-mod", "readonly", "-ldflags", ldflags, filepath.Join(cwd, "cmd", appcli)), + step.PostExec(captureBuildErr), + step.Stderr(buildErr), + )) steps.Add(step.New( step.Exec(appd, "init", "mynode", "--chain-id", ndapp), step.PreExec(func() error { @@ -323,3 +359,11 @@ func (s *starportServe) appVersion() (v version, err error) { v.hash = ref.Hash().String() return v, nil } + +type CannotBuildAppError struct { + Log string +} + +func (e *CannotBuildAppError) Error() string { + return fmt.Sprintf("cannot build app:\n\n\t%s", e.Log) +} From c880dd8289db9cdc057c1bc5c6baebcd56833d09 Mon Sep 17 00:00:00 2001 From: Marko Date: Thu, 6 Aug 2020 07:36:36 +0200 Subject: [PATCH 38/46] fix typo in spec (#120) --- .../app/templates/x/{{appName}}/spec/README.md.plush | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/starport/templates/app/templates/x/{{appName}}/spec/README.md.plush b/starport/templates/app/templates/x/{{appName}}/spec/README.md.plush index c1a6805be6..307ee83e42 100644 --- a/starport/templates/app/templates/x/{{appName}}/spec/README.md.plush +++ b/starport/templates/app/templates/x/{{appName}}/spec/README.md.plush @@ -12,7 +12,7 @@ 2. **[State](02_state.md)** 3. **[Messages](03_messages.md)** 4. **[Begin-Block](04_begin_block.md)** -5. **[End-Block](06_end_bloc.md)** -6. **[05_hooks](06_hooks.md)** +5. **[End-Block](05_end_block.md)** +6. **[Hooks](06_hooks.md)** 7. **[Events](07_events.md)** 8. **[Parameters](08_params.md)** From 7ebed3f2e04b3599208966ab9a796bfc6dde203d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Thu, 6 Aug 2020 10:27:56 +0300 Subject: [PATCH 39/46] services/serve: simplify err checks (#122) --- go.mod | 4 ++-- go.sum | 6 ++++-- starport/services/serve/serve.go | 33 +++++++++++++++++--------------- 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/go.mod b/go.mod index b927ae04c9..f0e28a62b9 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/gorilla/mux v1.7.4 github.com/ilgooz/analytics-go v3.1.1-0.20200723195510-acde4190c655+incompatible github.com/karrick/godirwalk v1.15.6 // indirect - github.com/pkg/errors v0.8.1 + github.com/pkg/errors v0.9.1 github.com/radovskyb/watcher v1.0.7 github.com/rogpeppe/go-internal v1.6.1 // indirect github.com/segmentio/backo-go v0.0.0-20200129164019-23eae7c10bd3 // indirect @@ -29,5 +29,5 @@ require ( golang.org/x/mod v0.3.0 golang.org/x/net v0.0.0-20200625001655-4c5254603344 // indirect golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 - golang.org/x/sys v0.0.0-20200805065543-0cf7623e9dbd // indirect + golang.org/x/sys v0.0.0-20200806060901-a37d78b92225 // indirect ) diff --git a/go.sum b/go.sum index 847a7a48ba..9e8af8c7ca 100644 --- a/go.sum +++ b/go.sum @@ -186,6 +186,8 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +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= @@ -314,8 +316,8 @@ golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200805065543-0cf7623e9dbd h1:wefLe/3g5tC0FcXw3NneLA5tHgbyouyZlfcSjNfOdgk= -golang.org/x/sys v0.0.0-20200805065543-0cf7623e9dbd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200806060901-a37d78b92225 h1:a5kp7Ohh+lqGCGHUBQdPwGHTJXKNhVVWp34F+ncDC9M= +golang.org/x/sys v0.0.0-20200806060901-a37d78b92225/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 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/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= diff --git a/starport/services/serve/serve.go b/starport/services/serve/serve.go index 2a03730998..8a0c9f9da9 100644 --- a/starport/services/serve/serve.go +++ b/starport/services/serve/serve.go @@ -85,18 +85,21 @@ func Serve(ctx context.Context, app App, conf starportconf.Config, verbose bool) return ctx.Err() case <-s.serveRefresher: - var serveCtx context.Context + var ( + serveCtx context.Context + buildErr *CannotBuildAppError + ) serveCtx, s.serveCancel = context.WithCancel(ctx) err := s.serve(serveCtx) - if err == nil || err == context.Canceled { - continue - } - if _, ok := err.(*CannotBuildAppError); ok { + switch { + case err == nil: + case errors.Is(err, context.Canceled): + case errors.As(err, &buildErr): fmt.Fprintf(os.Stderr, "%s\n", errorColor(err.Error())) fmt.Printf("%s\n", infoColor("waiting for a fix before retrying...")) - continue + default: + return err } - return err } } }) @@ -144,15 +147,15 @@ func (s *starportServe) serve(ctx context.Context) error { return err } - if err := cmdrunner. + err := cmdrunner. New(append(opts, cmdrunner.RunParallel())...). - Run(ctx, s.serverSteps()...); err != nil { - if _, ok := errors.Cause(err).(*exec.ExitError); ok { - return nil - } - return err + Run(ctx, s.serverSteps()...) + + var exitErr *exec.ExitError + if errors.As(err, &exitErr) { + return nil } - return nil + return err } func (s *starportServe) buildSteps() (steps step.Steps) { @@ -336,7 +339,7 @@ func (s *starportServe) runDevServer(ctx context.Context) error { sv.Shutdown(shutdownCtx) }() err := sv.ListenAndServe() - if err == http.ErrServerClosed { + if errors.Is(err, http.ErrServerClosed) { return nil } return err From 20b59515b020b47168404ee65199e68ee62bd733 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Thu, 6 Aug 2020 11:38:59 +0300 Subject: [PATCH 40/46] services/serve: omit build error on cancellation (#123) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * services/serve: omit build error on cancellation previously when user just started to `serve` during the process of building the user's app; and if there is a cancelation made by sending a ^C signal during that period, `serve` was thinking that app failed to build and printing an empty build error log before aborting the serving process. this commit fixes that. before: ``` šŸ“¦ Installing dependencies... ^Ccannot build app: waiting for a fix before retrying... aborted ``` after: ``` šŸ“¦ Installing dependencies... ^Caborted ``` * open commented out code --- starport/pkg/cmdrunner/cmdrunner.go | 18 +++++++++++++++--- starport/services/serve/serve.go | 15 +++++---------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/starport/pkg/cmdrunner/cmdrunner.go b/starport/pkg/cmdrunner/cmdrunner.go index 17cb2046bc..6f8c9ca42e 100644 --- a/starport/pkg/cmdrunner/cmdrunner.go +++ b/starport/pkg/cmdrunner/cmdrunner.go @@ -65,10 +65,22 @@ func (r *Runner) Run(ctx context.Context, steps ...*step.Step) error { if err := s.PreExec(); err != nil { return err } + runPostExec := func(processErr error) error { + // if context is canceled, then we can ignore exit error of the + // process because it should be exited because of the cancellation. + var err error + ctxErr := ctx.Err() + if ctxErr != nil { + err = ctxErr + } else { + err = processErr + } + return s.PostExec(err) + } c := r.newCommand(ctx, s) startErr := c.Start() if startErr != nil { - if err := s.PostExec(startErr); err != nil { + if err := runPostExec(startErr); err != nil { return err } continue @@ -78,10 +90,10 @@ func (r *Runner) Run(ctx context.Context, steps ...*step.Step) error { } if r.runParallel { g.Go(func() error { - return s.PostExec(c.Wait()) + return runPostExec(c.Wait()) }) } else { - if err := s.PostExec(c.Wait()); err != nil { + if err := runPostExec(c.Wait()); err != nil { return err } } diff --git a/starport/services/serve/serve.go b/starport/services/serve/serve.go index 8a0c9f9da9..3c08324bcf 100644 --- a/starport/services/serve/serve.go +++ b/starport/services/serve/serve.go @@ -147,15 +147,9 @@ func (s *starportServe) serve(ctx context.Context) error { return err } - err := cmdrunner. + return cmdrunner. New(append(opts, cmdrunner.RunParallel())...). Run(ctx, s.serverSteps()...) - - var exitErr *exec.ExitError - if errors.As(err, &exitErr) { - return nil - } - return err } func (s *starportServe) buildSteps() (steps step.Steps) { @@ -175,11 +169,12 @@ func (s *starportServe) buildSteps() (steps step.Steps) { buildErr = &bytes.Buffer{} ) - captureBuildErr := func(exitErr error) error { - if exitErr != nil { + captureBuildErr := func(err error) error { + var exitErr *exec.ExitError + if errors.As(err, &exitErr) { return &CannotBuildAppError{Log: buildErr.String()} } - return nil + return err } steps.Add(step.New( step.Exec("go", "mod", "tidy"), From b1e52c53b57e746a6ee410e8c8c3c95b0b5ae955 Mon Sep 17 00:00:00 2001 From: Marko Date: Thu, 6 Aug 2020 13:32:53 +0200 Subject: [PATCH 41/46] update starport to 0.39 (#113) * update starport to 0.39 * make it work * Update starport/templates/app/templates/cmd/{{binaryNamePrefix}}d/main.go.plush Co-authored-by: Denis Fadeev * Removed alias from TYPE template Co-authored-by: Denis Fadeev --- .../templates/app/templates/app/app.go.plush | 12 +++--- .../app/templates/x/{{appName}}/abci.go.plush | 5 ++- .../templates/x/{{appName}}/alias.go.plush | 40 ------------------- .../templates/x/{{appName}}/genesis.go.plush | 8 ++-- .../templates/x/{{appName}}/handler.go.plush | 6 ++- .../templates/x/{{appName}}/module.go.plush | 34 ++++++++-------- starport/templates/typed/new.go | 24 +---------- .../handlerMsgCreate{{TypeName}}.go.plush | 3 +- 8 files changed, 40 insertions(+), 92 deletions(-) delete mode 100644 starport/templates/app/templates/x/{{appName}}/alias.go.plush diff --git a/starport/templates/app/templates/app/app.go.plush b/starport/templates/app/templates/app/app.go.plush index 3bb0534740..baab7d7a9c 100644 --- a/starport/templates/app/templates/app/app.go.plush +++ b/starport/templates/app/templates/app/app.go.plush @@ -23,6 +23,8 @@ import ( "github.com/cosmos/cosmos-sdk/x/staking" "github.com/cosmos/cosmos-sdk/x/supply" "<%= ModulePath + "/x/" + AppName %>" + <%= AppName %>keeper "<%= ModulePath %>/x/<%= AppName %>/keeper" + <%= AppName %>types "<%= ModulePath %>/x/<%= AppName %>/types" // this line is used by starport scaffolding ) @@ -75,7 +77,7 @@ type NewApp struct { stakingKeeper staking.Keeper supplyKeeper supply.Keeper paramsKeeper params.Keeper - <%= AppName %>Keeper <%= AppName %>.Keeper + <%= AppName %>Keeper <%= AppName %>keeper.Keeper // this line is used by starport scaffolding # 3 mm *module.Manager @@ -100,7 +102,7 @@ func NewInitApp( staking.StoreKey, supply.StoreKey, params.StoreKey, - <%= AppName %>.StoreKey, + <%= AppName %>types.StoreKey, // this line is used by starport scaffolding # 5 ) @@ -152,10 +154,10 @@ func NewInitApp( staking.NewMultiStakingHooks(), ) - app.<%= AppName %>Keeper = <%= AppName %>.NewKeeper( + app.<%= AppName %>Keeper = <%= AppName %>keeper.NewKeeper( app.bankKeeper, app.cdc, - keys[<%= AppName %>.StoreKey], + keys[<%= AppName %>types.StoreKey], ) // this line is used by starport scaffolding # 4 @@ -176,7 +178,7 @@ func NewInitApp( staking.ModuleName, auth.ModuleName, bank.ModuleName, - <%= AppName %>.ModuleName, + <%= AppName %>types.ModuleName, supply.ModuleName, genutil.ModuleName, // this line is used by starport scaffolding # 7 diff --git a/starport/templates/app/templates/x/{{appName}}/abci.go.plush b/starport/templates/app/templates/x/{{appName}}/abci.go.plush index 0b66e9662a..3f60dbd6d9 100644 --- a/starport/templates/app/templates/x/{{appName}}/abci.go.plush +++ b/starport/templates/app/templates/x/{{appName}}/abci.go.plush @@ -3,16 +3,17 @@ package <%= AppName %> import ( sdk "github.com/cosmos/cosmos-sdk/types" abci "github.com/tendermint/tendermint/abci/types" + "<%= ModulePath %>/x/<%= AppName %>/keeper" // abci "github.com/tendermint/tendermint/abci/types" ) // BeginBlocker check for infraction evidence or downtime of validators // on every begin block -func BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock, k Keeper) { +func BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock, k keeper.Keeper) { // TODO: fill out if your application requires beginblock, if not you can delete this function } // EndBlocker called every block, process inflation, update validator set. -func EndBlocker(ctx sdk.Context, k Keeper) { +func EndBlocker(ctx sdk.Context, k keeper.Keeper) { // TODO: fill out if your application requires endblock, if not you can delete this function } diff --git a/starport/templates/app/templates/x/{{appName}}/alias.go.plush b/starport/templates/app/templates/x/{{appName}}/alias.go.plush deleted file mode 100644 index ac3043d07d..0000000000 --- a/starport/templates/app/templates/x/{{appName}}/alias.go.plush +++ /dev/null @@ -1,40 +0,0 @@ -package <%= AppName %> - -import ( - "<%= ModulePath %>/x/<%= AppName %>/keeper" - "<%= ModulePath %>/x/<%= AppName %>/types" -) - -const ( - // TODO: define constants that you would like exposed from your module - - ModuleName = types.ModuleName - RouterKey = types.RouterKey - StoreKey = types.StoreKey - DefaultParamspace = types.DefaultParamspace - // QueryParams = types.QueryParams - QuerierRoute = types.QuerierRoute -) - -var ( - // functions aliases - NewKeeper = keeper.NewKeeper - NewQuerier = keeper.NewQuerier - RegisterCodec = types.RegisterCodec - NewGenesisState = types.NewGenesisState - DefaultGenesisState = types.DefaultGenesisState - ValidateGenesis = types.ValidateGenesis - // TODO: Fill out function aliases - - // variable aliases - ModuleCdc = types.ModuleCdc - // TODO: Fill out variable aliases -) - -type ( - Keeper = keeper.Keeper - GenesisState = types.GenesisState - Params = types.Params - - // TODO: Fill out module types -) diff --git a/starport/templates/app/templates/x/{{appName}}/genesis.go.plush b/starport/templates/app/templates/x/{{appName}}/genesis.go.plush index 03e04e6aba..a9ba5c64ed 100644 --- a/starport/templates/app/templates/x/{{appName}}/genesis.go.plush +++ b/starport/templates/app/templates/x/{{appName}}/genesis.go.plush @@ -2,19 +2,21 @@ package <%= AppName %> import ( sdk "github.com/cosmos/cosmos-sdk/types" + "<%= ModulePath %>/x/<%= AppName %>/keeper" + "<%= ModulePath %>/x/<%= AppName %>/types" // abci "github.com/tendermint/tendermint/abci/types" ) // InitGenesis initialize default parameters // and the keeper's address to pubkey map -func InitGenesis(ctx sdk.Context, k Keeper /* TODO: Define what keepers the module needs */, data GenesisState) { +func InitGenesis(ctx sdk.Context, k keeper.Keeper /* TODO: Define what keepers the module needs */, data types.GenesisState) { // TODO: Define logic for when you would like to initalize a new genesis } // ExportGenesis writes the current store values // to a genesis file, which can be imported again // with InitGenesis -func ExportGenesis(ctx sdk.Context, k Keeper) (data GenesisState) { +func ExportGenesis(ctx sdk.Context, k keeper.Keeper) (data types.GenesisState) { // TODO: Define logic for exporting state - return NewGenesisState() + return types.NewGenesisState() } diff --git a/starport/templates/app/templates/x/{{appName}}/handler.go.plush b/starport/templates/app/templates/x/{{appName}}/handler.go.plush index 2668b355c3..08d1ae9ee8 100644 --- a/starport/templates/app/templates/x/{{appName}}/handler.go.plush +++ b/starport/templates/app/templates/x/{{appName}}/handler.go.plush @@ -4,17 +4,19 @@ import ( "fmt" sdk "github.com/cosmos/cosmos-sdk/types" + "<%= ModulePath %>/x/<%= AppName %>/keeper" + "<%= ModulePath %>/x/<%= AppName %>/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" ) // NewHandler ... -func NewHandler(k Keeper) sdk.Handler { +func NewHandler(k keeper.Keeper) sdk.Handler { return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { ctx = ctx.WithEventManager(sdk.NewEventManager()) switch msg := msg.(type) { // this line is used by starport scaffolding default: - errMsg := fmt.Sprintf("unrecognized %s message type: %T", ModuleName, msg) + errMsg := fmt.Sprintf("unrecognized %s message type: %T", types.ModuleName, msg) return nil, sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, errMsg) } } diff --git a/starport/templates/app/templates/x/{{appName}}/module.go.plush b/starport/templates/app/templates/x/{{appName}}/module.go.plush index 252d82ccde..6939ae5b98 100644 --- a/starport/templates/app/templates/x/{{appName}}/module.go.plush +++ b/starport/templates/app/templates/x/{{appName}}/module.go.plush @@ -15,6 +15,8 @@ import ( "github.com/cosmos/cosmos-sdk/x/bank" "<%= ModulePath %>/x/<%= AppName %>/client/cli" "<%= ModulePath %>/x/<%= AppName %>/client/rest" + "<%= ModulePath %>/x/<%= AppName %>/keeper" + "<%= ModulePath %>/x/<%= AppName %>/types" ) // Type check to ensure the interface is properly implemented @@ -28,28 +30,28 @@ type AppModuleBasic struct{} // Name returns the <%= AppName %> module's name. func (AppModuleBasic) Name() string { - return ModuleName + return types.ModuleName } // RegisterCodec registers the <%= AppName %> module's types for the given codec. func (AppModuleBasic) RegisterCodec(cdc *codec.Codec) { - RegisterCodec(cdc) + types.RegisterCodec(cdc) } // DefaultGenesis returns default genesis state as raw bytes for the <%= AppName %> // module. func (AppModuleBasic) DefaultGenesis() json.RawMessage { - return ModuleCdc.MustMarshalJSON(DefaultGenesisState()) + return types.ModuleCdc.MustMarshalJSON(types.DefaultGenesisState()) } // ValidateGenesis performs genesis state validation for the <%= AppName %> module. func (AppModuleBasic) ValidateGenesis(bz json.RawMessage) error { - var data GenesisState - err := ModuleCdc.UnmarshalJSON(bz, &data) + var data types.GenesisState + err := types.ModuleCdc.UnmarshalJSON(bz, &data) if err != nil { return err } - return ValidateGenesis(data) + return types.ValidateGenesis(data) } // RegisterRESTRoutes registers the REST routes for the <%= AppName %> module. @@ -64,7 +66,7 @@ func (AppModuleBasic) GetTxCmd(cdc *codec.Codec) *cobra.Command { // GetQueryCmd returns no root query command for the <%= AppName %> module. func (AppModuleBasic) GetQueryCmd(cdc *codec.Codec) *cobra.Command { - return cli.GetQueryCmd(StoreKey, cdc) + return cli.GetQueryCmd(types.StoreKey, cdc) } //____________________________________________________________________________ @@ -73,14 +75,14 @@ func (AppModuleBasic) GetQueryCmd(cdc *codec.Codec) *cobra.Command { type AppModule struct { AppModuleBasic - keeper Keeper + keeper keeper.Keeper coinKeeper bank.Keeper // TODO: Add keepers that your application depends on } // NewAppModule creates a new AppModule object -func NewAppModule(k Keeper, bankKeeper bank.Keeper) AppModule { +func NewAppModule(k keeper.Keeper, bankKeeper bank.Keeper) AppModule { return AppModule{ AppModuleBasic: AppModuleBasic{}, keeper: k, @@ -91,7 +93,7 @@ func NewAppModule(k Keeper, bankKeeper bank.Keeper) AppModule { // Name returns the <%= AppName %> module's name. func (AppModule) Name() string { - return ModuleName + return types.ModuleName } // RegisterInvariants registers the <%= AppName %> module invariants. @@ -99,7 +101,7 @@ func (am AppModule) RegisterInvariants(_ sdk.InvariantRegistry) {} // Route returns the message routing key for the <%= AppName %> module. func (AppModule) Route() string { - return RouterKey + return types.RouterKey } // NewHandler returns an sdk.Handler for the <%= AppName %> module. @@ -109,19 +111,19 @@ func (am AppModule) NewHandler() sdk.Handler { // QuerierRoute returns the <%= AppName %> module's querier route name. func (AppModule) QuerierRoute() string { - return QuerierRoute + return types.QuerierRoute } // NewQuerierHandler returns the <%= AppName %> module sdk.Querier. func (am AppModule) NewQuerierHandler() sdk.Querier { - return NewQuerier(am.keeper) + return keeper.NewQuerier(am.keeper) } // InitGenesis performs genesis initialization for the <%= AppName %> module. It returns // no validator updates. func (am AppModule) InitGenesis(ctx sdk.Context, data json.RawMessage) []abci.ValidatorUpdate { - var genesisState GenesisState - ModuleCdc.MustUnmarshalJSON(data, &genesisState) + var genesisState types.GenesisState + types.ModuleCdc.MustUnmarshalJSON(data, &genesisState) InitGenesis(ctx, am.keeper, genesisState) return []abci.ValidatorUpdate{} } @@ -130,7 +132,7 @@ func (am AppModule) InitGenesis(ctx sdk.Context, data json.RawMessage) []abci.Va // module. func (am AppModule) ExportGenesis(ctx sdk.Context) json.RawMessage { gs := ExportGenesis(ctx, am.keeper) - return ModuleCdc.MustMarshalJSON(gs) + return types.ModuleCdc.MustMarshalJSON(gs) } // BeginBlock returns the begin blocker for the <%= AppName %> module. diff --git a/starport/templates/typed/new.go b/starport/templates/typed/new.go index de22115804..ec69c68c94 100644 --- a/starport/templates/typed/new.go +++ b/starport/templates/typed/new.go @@ -14,7 +14,6 @@ import ( func New(opts *Options) (*genny.Generator, error) { g := genny.New() g.RunFn(handlerModify(opts)) - g.RunFn(aliasModify(opts)) g.RunFn(typesKeyModify(opts)) g.RunFn((typesCodecModify(opts))) g.RunFn((clientCliTxModify(opts))) @@ -60,7 +59,7 @@ func handlerModify(opts *Options) genny.RunFn { return err } template := `%[1]v - case MsgCreate%[2]v: + case types.MsgCreate%[2]v: return handleMsgCreate%[2]v(ctx, k, msg)` replacement := fmt.Sprintf(template, placeholder, strings.Title(opts.TypeName)) content := strings.Replace(f.String(), placeholder, replacement, 1) @@ -69,27 +68,6 @@ func handlerModify(opts *Options) genny.RunFn { } } -func aliasModify(opts *Options) genny.RunFn { - return func(r *genny.Runner) error { - path := fmt.Sprintf("x/%s/alias.go", opts.AppName) - f, err := r.Disk.Find(path) - if err != nil { - return err - } - content := f.String() + fmt.Sprintf(` -var ( - NewMsgCreate%[1]v = types.NewMsgCreate%[1]v -) - -type ( - MsgCreate%[1]v = types.MsgCreate%[1]v -) - `, strings.Title(opts.TypeName)) - newFile := genny.NewFileS(path, content) - return r.File(newFile) - } -} - func typesKeyModify(opts *Options) genny.RunFn { return func(r *genny.Runner) error { path := fmt.Sprintf("x/%s/types/key.go", opts.AppName) diff --git a/starport/templates/typed/templates/x/{{appName}}/handlerMsgCreate{{TypeName}}.go.plush b/starport/templates/typed/templates/x/{{appName}}/handlerMsgCreate{{TypeName}}.go.plush index 9d16a45f31..dd3adf672f 100644 --- a/starport/templates/typed/templates/x/{{appName}}/handlerMsgCreate{{TypeName}}.go.plush +++ b/starport/templates/typed/templates/x/{{appName}}/handlerMsgCreate{{TypeName}}.go.plush @@ -3,9 +3,10 @@ package <%= AppName %> import ( sdk "github.com/cosmos/cosmos-sdk/types" "<%= ModulePath %>/x/<%= AppName %>/types" + "<%= ModulePath %>/x/<%= AppName %>/keeper" ) -func handleMsgCreate<%= title(TypeName) %>(ctx sdk.Context, k Keeper, msg MsgCreate<%= title(TypeName) %>) (*sdk.Result, error) { +func handleMsgCreate<%= title(TypeName) %>(ctx sdk.Context, k keeper.Keeper, msg types.MsgCreate<%= title(TypeName) %>) (*sdk.Result, error) { var <%= TypeName %> = types.<%= title(TypeName) %>{ Creator: msg.Creator, ID: msg.ID,<%= for (field) in Fields { %> From 4e5380cedb687a3ab682dc84174fed18da6b07ff Mon Sep 17 00:00:00 2001 From: Denis Fadeev Date: Fri, 7 Aug 2020 10:58:23 +0500 Subject: [PATCH 42/46] Added readme close #80 (#127) --- .../templates/app/templates/readme.md.plush | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 starport/templates/app/templates/readme.md.plush diff --git a/starport/templates/app/templates/readme.md.plush b/starport/templates/app/templates/readme.md.plush new file mode 100644 index 0000000000..4bce9589a0 --- /dev/null +++ b/starport/templates/app/templates/readme.md.plush @@ -0,0 +1,31 @@ +# <%= AppName %> + +**<%= AppName %>** is a blockchain application built using Cosmos SDK and Tendermint and generated with [Starport](https://github.com/tendermint/starport). + +## Get started + +``` +starport serve +``` + +`serve` command installs dependencies, initializes and runs the application. + +## Configure + +Initialization parameters of your app are stored in `config.yml`. + +### `accounts` + +A list of user accounts created during genesis of your application. + +| Key | Required | Type | Description | +| ----- | -------- | --------------- | ------------------------------------------------- | +| name | Y | String | Local name of the key pair | +| coins | Y | List of Strings | Initial coins with denominations (e.g. "100coin") | + +## Learn more + +- [Starport](https://github.com/tendermint/starport) +- [Cosmos SDK documentation](https://docs.cosmos.network) +- [Cosmos Tutorials](https://tutorials.cosmos.network) +- [Channel on Discord](https://discord.gg/W8trcGV) \ No newline at end of file From 4fcbaaee34b9eb16cdc5bd96440ab3cce590da0f Mon Sep 17 00:00:00 2001 From: Denis Fadeev Date: Fri, 7 Aug 2020 12:03:31 +0500 Subject: [PATCH 43/46] Added config to readme and go.sum to template (#131) --- readme.md | 14 + starport/templates/app/templates/go.sum | 693 ++++++++++++++++++++++++ 2 files changed, 707 insertions(+) create mode 100644 starport/templates/app/templates/go.sum diff --git a/readme.md b/readme.md index 75f1c9ae5d..2b2e299786 100644 --- a/readme.md +++ b/readme.md @@ -64,6 +64,20 @@ This command generates a type `Post` with two fields: `title` and `body`. To add a post run `blogcli tx blog create-post "My title" "This is a blog" --from=user1`. + +### Configure + +Initialization parameters of your app are stored in `config.yml`. + +#### `accounts` + +A list of user accounts created during genesis of your application. + +| Key | Required | Type | Description | +| ----- | -------- | --------------- | ------------------------------------------------- | +| name | Y | String | Local name of the key pair | +| coins | Y | List of Strings | Initial coins with denominations (e.g. "100coin") | + ### Add smart contract support ``` diff --git a/starport/templates/app/templates/go.sum b/starport/templates/app/templates/go.sum new file mode 100644 index 0000000000..49b1ec21b2 --- /dev/null +++ b/starport/templates/app/templates/go.sum @@ -0,0 +1,693 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/99designs/keyring v1.1.3 h1:mEV3iyZWjkxQ7R8ia8GcG97vCX5zQQ7n4o8R2BylwQY= +github.com/99designs/keyring v1.1.3/go.mod h1:657DQuMrBZRtuL/voxVyiyb6zpMehlm5vLB9Qwrv904= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg= +github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/Workiva/go-datastructures v1.0.52 h1:PLSK6pwn8mYdaoaCZEMsXBpBotr4HHn9abU0yMQt0NI= +github.com/Workiva/go-datastructures v1.0.52/go.mod h1:Z+F2Rca0qCsVYDS8z7bAGm8f3UkzuWYS/oBZz5a7VVA= +github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/bartekn/go-bip39 v0.0.0-20171116152956-a05967ea095d h1:1aAija9gr0Hyv4KfQcRcwlmFIrhkDmIj2dz5bkg/s/8= +github.com/bartekn/go-bip39 v0.0.0-20171116152956-a05967ea095d/go.mod h1:icNx/6QdFblhsEjZehARqbNumymUT/ydwlLojFdv7Sk= +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/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/btcsuite/btcd v0.0.0-20190115013929-ed77733ec07d/go.mod h1:d3C0AkH6BRcvO8T0UEPu53cnw4IbV63x1bEjildYhO0= +github.com/btcsuite/btcd v0.20.1-beta h1:Ik4hyJqN8Jfyv3S4AGBOmyouMsYE3EdYODkMbQjwPGw= +github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= +github.com/btcsuite/btcutil v0.0.0-20180706230648-ab6388e0c60a/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/btcutil v1.0.2 h1:9iZ1Terx9fMIOtq1VrwdqfsATL9MC2l8ZrUY6YZ2uts= +github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts= +github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= +github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= +github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= +github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +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/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cosmos/cosmos-sdk v0.39.0 h1:lWZQLFxLYQ4ydD01cDZF7tRF8IN2xclDmoNPIJ5Kw44= +github.com/cosmos/cosmos-sdk v0.39.0/go.mod h1:3iKiqnQ48T0UG4IDw9EM8utQSwItutLUkmGkRSWpS5U= +github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d h1:49RLWk1j44Xu4fjHb6JFYmeUnDORVwHNkDxaQ0ctCVU= +github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= +github.com/cosmos/ledger-cosmos-go v0.11.1 h1:9JIYsGnXP613pb2vPjFeMMjBI5lEDsEaF6oYorTy6J4= +github.com/cosmos/ledger-cosmos-go v0.11.1/go.mod h1:J8//BsAGTo3OC/vDLjMRFLW6q0WAaXvHnVc7ZmE8iUY= +github.com/cosmos/ledger-go v0.9.2 h1:Nnao/dLwaVTk1Q5U9THldpUMMXU94BOTWPddSmVB6pI= +github.com/cosmos/ledger-go v0.9.2/go.mod h1:oZJ2hHAZROdlHiwTg4t7kP+GKIIkBT+o6c9QWFanOyI= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +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/danieljoos/wincred v1.0.2 h1:zf4bhty2iLuwgjgpraD2E9UbvO+fe54XXGJbOwe23fU= +github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U= +github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +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/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dvsekhvalnov/jose2go v0.0.0-20180829124132-7f401d37b68a h1:mq+R6XEM6lJX5VlLyZIrUSP8tSuJp82xTK89hvBwJbU= +github.com/dvsekhvalnov/jose2go v0.0.0-20180829124132-7f401d37b68a/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51 h1:0JZ+dUmQeA8IIVUMzysrX4/AKuQwWhV2dYQuPZdvdSQ= +github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= +github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= +github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= +github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870 h1:E2s37DuLxFhQDg5gKsWoLBOB0n+ZW8s599zru8FJ2/Y= +github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= +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-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0 h1:dXFJfIHVvUcpSgDOV+Ne6t7jXri8Tfv2uOLHUZ2XNuo= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +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-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1-0.20190508161146-9fa652df1129/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.3 h1:GV+pQPG/EUUbkh47niozDcADz6go/dUwhVzdUQHIVRw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0 h1:oOuy+ugB+P/kBdUnG5QaMXSIyJ1q38wWSojYCb3z5VQ= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= +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/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.0.0 h1:b4Gk+7WdP/d3HZH8EJsZpvV7EtDOgaZLtnaNGIu1adA= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= +github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/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/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= +github.com/gtank/merlin v0.1.1-0.20191105220539-8318aed1a79f/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= +github.com/gtank/merlin v0.1.1 h1:eQ90iG7K9pOhtereWsmyRJ6RAwcP4tHTDBHXNg+u5is= +github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= +github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uMzcc= +github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIvY4OmlYW69o= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +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/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= +github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d h1:Z+RDyXzjKE0i2sTjZ/b1uxiGtPhFy34Ou/Tk0qwN0kM= +github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d/go.mod h1:JJNrCn9otv/2QP4D7SMJBgaleKpOf66PnW6F5WGNRIc= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/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/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= +github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +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-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643 h1:hLDRPB66XQT/8+wG9WsDpiCvZf1yKO7sz7scAjSlBa0= +github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= +github.com/minio/highwayhash v1.0.0 h1:iMSDhgUILCr0TNm8LWlSjF8N0ZIj2qbO8WHp6Q/J2BA= +github.com/minio/highwayhash v1.0.0/go.mod h1:xQboMTeM9nY9v/LlAOxFctujiv5+Aq2hR5dxBpaMbdc= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.6.0 h1:aetoXYr0Tv7xRU/V4B4IZJ2QcbtMUFoNb3ORp7TzIK4= +github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +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/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.5.1 h1:bdHYieyGlH+6OLEk2YQha8THib30KP0/yD0YH9m6xcA= +github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rakyll/statik v0.1.6 h1:uICcfUXpgqtw2VopbIncslhAmE5hwc4g20TEyEENBNs= +github.com/rakyll/statik v0.1.6/go.mod h1:OEi9wJV/fMUAGx1eNjq75DKDsJVuEv1U0oYdX6GX8Zs= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 h1:MkV+77GLUNo5oJ0jf870itWm3D0Sjh7+Za9gazKc5LQ= +github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +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.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa/go.mod h1:oJyF+mSPHbB5mVY2iO9KV3pTt/QbIkGaO8gQ2WrDbP4= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.1/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +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.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +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.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.6.3/go.mod h1:jUMtyi0/lB5yZH/FjyGAoH7IMNrIhlBf6pXZmbMDvzw= +github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +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 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d h1:gZZadD8H+fF+n9CmNhYL1Y0dJB+kLOmKd7FbPJLeGHs= +github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d/go.mod h1:9OrXJhf154huy1nPWmuSrkgjPUtUNhA+Zmy+6AESzuA= +github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzHWCjJB1zZfXPIAaDpzXIEJ0eS6B5Ok= +github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= +github.com/tendermint/btcd v0.1.1 h1:0VcxPfflS2zZ3RiOAHkBiFUcPvbtRj5O7zHmcJWHV7s= +github.com/tendermint/btcd v0.1.1/go.mod h1:DC6/m53jtQzr/NFmMNEu0rxf18/ktVoVtMrnDD5pN+U= +github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 h1:hqAk8riJvK4RMWx1aInLzndwxKalgi5rTqgfXxOxbEI= +github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15/go.mod h1:z4YtwM70uOnk8h0pjJYlj3zdYwi9l03By6iAIF5j/Pk= +github.com/tendermint/go-amino v0.14.1/go.mod h1:i/UKE5Uocn+argJJBb12qTZsCDBcAYMbR92AaJVmKso= +github.com/tendermint/go-amino v0.15.1 h1:D2uk35eT4iTsvJd9jWIetzthE5C0/k2QmMFkCN+4JgQ= +github.com/tendermint/go-amino v0.15.1/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= +github.com/tendermint/iavl v0.14.0 h1:Jkff+IFrXxRWtH9Jn/ga/2cxNnzMTv58xEKgCJsKUBg= +github.com/tendermint/iavl v0.14.0/go.mod h1:QmfViflFiXzxKLQE4tAUuWQHq+RSuQFxablW5oJZ6sE= +github.com/tendermint/tendermint v0.33.5/go.mod h1:0yUs9eIuuDq07nQql9BmI30FtYGcEC60Tu5JzB5IezM= +github.com/tendermint/tendermint v0.33.6 h1:W4UOsXY4ROJZ3TLLGVVv71VXD4WK2gJRb3gzeced+mg= +github.com/tendermint/tendermint v0.33.6/go.mod h1:0yUs9eIuuDq07nQql9BmI30FtYGcEC60Tu5JzB5IezM= +github.com/tendermint/tm-db v0.5.1 h1:H9HDq8UEA7Eeg13kdYckkgwwkQLBnJGgX4PgLJRhieY= +github.com/tendermint/tm-db v0.5.1/go.mod h1:g92zWjHpCYlEvQXvy9M168Su8V1IBEeawpXVVBaK4f4= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +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/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +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/zondax/hid v0.9.0 h1:eiT3P6vNxAEVxXMw66eZUAAnU2zD33JBkfG/EnfAKl8= +github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +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/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/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-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200406173513-056763e48d71/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200429183012-4b2356b1ed79 h1:IaQbIIB2X/Mp/DKctl6ROxz1KyMlKp4uyvL6+kQ7C88= +golang.org/x/crypto v0.0.0-20200429183012-4b2356b1ed79/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +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-20181201002055-351d144fa1fc/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-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/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= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 h1:eDrdRpKgkcCqKZQwyZRyeFZgfqt37SL7Kv3tok06cKE= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +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-20190227155943-e225da77a7e6/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/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +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-20181026203630-95b1ffbd15a5/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-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190130150945-aca44879d564/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-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/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-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/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-20180828015842-6cd1fcedba52/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-20181030221726-6c7e314b6563/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-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/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-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/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= +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/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +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/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a h1:Ob5/580gVHBJZgXnff1cZDbG+xLtMVE5mDRTe+nIsX4= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.28.1/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.30.0 h1:M5a8xTlYTxwMn5ZFkwhRabsygDY5G8TYLyQDBxJNAxE= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0 h1:qdOKuR/EIArgaWNjetjgTzgVTAZ+S/WXVrq9HW9zimw= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +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/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +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/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +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/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +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= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= From 9c311df99fccabaa4aa00bcf5034ac5ba36194f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Fri, 7 Aug 2020 10:58:33 +0300 Subject: [PATCH 44/46] services/serve: add prefixes to verbose logs (#129) * services/serve: add prefixes to verbose logs * added new pkg/lineprefixer. * added new pkg/prefixgen. * added options builder to pkg/cmdrunner/step. * cosmetics. * fix tests & add missing file * add STARPORT prefix to native logs * add buildLog log type. * reorganize verbose logs. * fix linter * fix verbose logs --- go.mod | 2 +- go.sum | 4 +- starport/pkg/cmdrunner/step/step.go | 11 + starport/pkg/lineprefixer/lineprefixer.go | 47 +++ .../pkg/lineprefixer/lineprefixer_test.go | 27 ++ starport/pkg/prefixgen/prefixgen.go | 88 +++++ starport/pkg/prefixgen/prefixgen_test.go | 23 ++ starport/services/serve/log.go | 75 ++++ starport/services/serve/serve.go | 346 ++++++++++++------ 9 files changed, 505 insertions(+), 118 deletions(-) create mode 100644 starport/pkg/lineprefixer/lineprefixer.go create mode 100644 starport/pkg/lineprefixer/lineprefixer_test.go create mode 100644 starport/pkg/prefixgen/prefixgen.go create mode 100644 starport/pkg/prefixgen/prefixgen_test.go create mode 100644 starport/services/serve/log.go diff --git a/go.mod b/go.mod index f0e28a62b9..bc13e91bf7 100644 --- a/go.mod +++ b/go.mod @@ -29,5 +29,5 @@ require ( golang.org/x/mod v0.3.0 golang.org/x/net v0.0.0-20200625001655-4c5254603344 // indirect golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 - golang.org/x/sys v0.0.0-20200806060901-a37d78b92225 // indirect + golang.org/x/sys v0.0.0-20200806125547-5acd03effb82 // indirect ) diff --git a/go.sum b/go.sum index 9e8af8c7ca..3f95c3ba8a 100644 --- a/go.sum +++ b/go.sum @@ -316,8 +316,8 @@ golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200806060901-a37d78b92225 h1:a5kp7Ohh+lqGCGHUBQdPwGHTJXKNhVVWp34F+ncDC9M= -golang.org/x/sys v0.0.0-20200806060901-a37d78b92225/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200806125547-5acd03effb82 h1:6cBnXxYO+CiRVrChvCosSv7magqTPbyAgz1M8iOv5wM= +golang.org/x/sys v0.0.0-20200806125547-5acd03effb82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 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/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= diff --git a/starport/pkg/cmdrunner/step/step.go b/starport/pkg/cmdrunner/step/step.go index b8292fae8c..0067fb6205 100644 --- a/starport/pkg/cmdrunner/step/step.go +++ b/starport/pkg/cmdrunner/step/step.go @@ -14,6 +14,17 @@ type Step struct { type Option func(*Step) +type Options []Option + +func NewOptions() Options { + return Options{} +} + +func (o Options) Add(options ...Option) Options { + o = append(o, options...) + return o +} + func New(options ...Option) *Step { s := &Step{ PreExec: func() error { return nil }, diff --git a/starport/pkg/lineprefixer/lineprefixer.go b/starport/pkg/lineprefixer/lineprefixer.go new file mode 100644 index 0000000000..22a75a61fa --- /dev/null +++ b/starport/pkg/lineprefixer/lineprefixer.go @@ -0,0 +1,47 @@ +// Package lineprefixer is a helpers to add prefixes to new lines. +package lineprefixer + +import ( + "bytes" + "io" +) + +// Writer is a prefixed line writer. +type Writer struct { + prefix []byte + w io.Writer + shouldPrefix bool +} + +// NewWriter returns a new Writer that adds prefixes to each line +// written. It then writes prefixed data stream into w. +func NewWriter(w io.Writer, prefix string) *Writer { + return &Writer{ + w: w, + prefix: []byte(prefix), + shouldPrefix: true, + } +} + +// Write implements io.Writer. +func (p *Writer) Write(b []byte) (n int, err error) { + var ( + blen = len(b) + lastChar = b[blen-1] + newLine = byte('\n') + snewLine = []byte{newLine} + replaceCount = bytes.Count(b, snewLine) + ) + if lastChar == newLine { + replaceCount-- + } + b = bytes.Replace(b, snewLine, append(snewLine, p.prefix...), replaceCount) + if p.shouldPrefix { + b = append(p.prefix, b...) + } + p.shouldPrefix = lastChar == newLine + if _, err := p.w.Write(b); err != nil { + return 0, err + } + return blen, nil +} diff --git a/starport/pkg/lineprefixer/lineprefixer_test.go b/starport/pkg/lineprefixer/lineprefixer_test.go new file mode 100644 index 0000000000..655b537e61 --- /dev/null +++ b/starport/pkg/lineprefixer/lineprefixer_test.go @@ -0,0 +1,27 @@ +package lineprefixer + +import ( + "bytes" + "io" + "strings" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestWriter(t *testing.T) { + logs := `hello, +this +is +Starport!` + buf := bytes.Buffer{} + w := NewWriter(&buf, "[TENDERMINT] ") + _, err := io.Copy(w, strings.NewReader(logs)) + require.NoError(t, err) + require.Equal(t, `[TENDERMINT] hello, +[TENDERMINT] this +[TENDERMINT] is +[TENDERMINT] Starport!`, + buf.String(), + ) +} diff --git a/starport/pkg/prefixgen/prefixgen.go b/starport/pkg/prefixgen/prefixgen.go new file mode 100644 index 0000000000..09e9d0e001 --- /dev/null +++ b/starport/pkg/prefixgen/prefixgen.go @@ -0,0 +1,88 @@ +// Package prefixgen is a prefix generation helper for log messages +// and any other kind. +package prefixgen + +import ( + "fmt" + "strings" + + "github.com/gookit/color" +) + +// Prefixer generates prefixes. +type Prefixer struct { + format string + color uint8 + left, right string + convertUppercase bool +} + +// Option configures Prefixer. +type Option func(p *Prefixer) + +// Color sets color to the prefix. +func Color(color uint8) Option { + return func(p *Prefixer) { + p.color = color + } +} + +// SquareBrackets adds square brackets to the prefix. +func SquareBrackets() Option { + return func(p *Prefixer) { + p.left = "[" + p.right = "]" + } +} + +// SpaceRight adds rights space to the prefix. +func SpaceRight() Option { + return func(p *Prefixer) { + p.right += " " + } +} + +// Uppercase formats the prefix to uppercase. +func Uppercase() Option { + return func(p *Prefixer) { + p.convertUppercase = true + } +} + +// Common holds some common prefix options and extends those +// options by given options. +func Common(options ...Option) []Option { + return append([]Option{ + SquareBrackets(), + SpaceRight(), + Uppercase(), + }, options...) +} + +// New creates a new Prefixer with format and options. +// Format is an fmt.Sprintf() like format to dynamically create prefix texts +// as needed. +func New(format string, options ...Option) *Prefixer { + p := &Prefixer{ + format: format, + } + for _, o := range options { + o(p) + } + return p +} + +// Gen generates a new prefix by applying s to format given during New(). +func (p *Prefixer) Gen(s ...interface{}) string { + format := p.format + format = p.left + format + format = format + p.right + prefix := fmt.Sprintf(format, s...) + if p.convertUppercase { + prefix = strings.ToUpper(prefix) + } + if p.color != 0 { + return color.C256(p.color).Sprint(prefix) + } + return prefix +} diff --git a/starport/pkg/prefixgen/prefixgen_test.go b/starport/pkg/prefixgen/prefixgen_test.go new file mode 100644 index 0000000000..17168aa5db --- /dev/null +++ b/starport/pkg/prefixgen/prefixgen_test.go @@ -0,0 +1,23 @@ +package prefixgen + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestGen(t *testing.T) { + cases := []struct { + expected string + given string + }{ + {"[TENDERMINT] ", New("Tendermint", Common()...).Gen()}, + {"Tendermint", New("Tendermint").Gen()}, + {"appd", New("%sd").Gen("app")}, + } + for _, tt := range cases { + t.Run(tt.expected, func(t *testing.T) { + require.Equal(t, tt.expected, tt.given) + }) + } +} diff --git a/starport/services/serve/log.go b/starport/services/serve/log.go new file mode 100644 index 0000000000..ba80a25f89 --- /dev/null +++ b/starport/services/serve/log.go @@ -0,0 +1,75 @@ +package starportserve + +import ( + "io" + "os" + "strings" + + "github.com/tendermint/starport/starport/pkg/cmdrunner/step" + "github.com/tendermint/starport/starport/pkg/lineprefixer" + "github.com/tendermint/starport/starport/pkg/prefixgen" +) + +// prefixes holds prefix configuration for logs messages. +var prefixes = map[logType]struct { + Name string + Color uint8 +}{ + logStarport: {"starport", 202}, + logBuild: {"build", 203}, + logAppd: {"%sd", 204}, + logAppcli: {"%scli", 205}, +} + +// logType represents the different types of logs. +type logType int + +const ( + logStarport logType = iota + logBuild + logAppd + logAppcli +) + +// std returns the cmdrunner steps to configure stdout and stderr to output logs by logType. +func (s *starportServe) stdSteps(logType logType) []step.Option { + std := s.stdLog(logType) + return []step.Option{ + step.Stdout(std.out), + step.Stderr(std.err), + } +} + +type std struct { + out, err io.Writer +} + +// std returns the stdout and stderr to output logs by logType. +func (s *starportServe) stdLog(logType logType) std { + prefixed := func(w io.Writer) *lineprefixer.Writer { + var ( + prefix = prefixes[logType] + prefixStr string + options = prefixgen.Common(prefixgen.Color(prefix.Color)) + gen = prefixgen.New(prefix.Name, options...) + ) + if strings.Count(prefix.Name, "%s") > 0 { + prefixStr = gen.Gen(s.app.Name) + } else { + prefixStr = gen.Gen() + } + return lineprefixer.NewWriter(w, prefixStr) + } + var ( + stdout io.Writer = prefixed(s.stdout) + stderr io.Writer = prefixed(s.stderr) + ) + if logType == logStarport && !s.verbose { + stdout = os.Stdout + stderr = os.Stderr + } + return std{ + out: stdout, + err: stderr, + } +} diff --git a/starport/services/serve/serve.go b/starport/services/serve/serve.go index 3c08324bcf..ca8aba443d 100644 --- a/starport/services/serve/serve.go +++ b/starport/services/serve/serve.go @@ -5,6 +5,7 @@ import ( "context" "encoding/json" "fmt" + "io" "io/ioutil" "net/http" "os" @@ -54,6 +55,7 @@ type starportServe struct { verbose bool serveCancel context.CancelFunc serveRefresher chan struct{} + stdout, stderr io.Writer } // Serve serves user apps. @@ -63,12 +65,18 @@ func Serve(ctx context.Context, app App, conf starportconf.Config, verbose bool) conf: conf, verbose: verbose, serveRefresher: make(chan struct{}, 1), + stdout: ioutil.Discard, + stderr: ioutil.Discard, } - v, err := s.appVersion() + var err error + s.version, err = s.appVersion() if err != nil && err != git.ErrRepositoryNotExists { return err } - s.version = v + if verbose { + s.stdout = os.Stdout + s.stderr = os.Stderr + } g, ctx := errgroup.WithContext(ctx) g.Go(func() error { @@ -95,8 +103,8 @@ func Serve(ctx context.Context, app App, conf starportconf.Config, verbose bool) case err == nil: case errors.Is(err, context.Canceled): case errors.As(err, &buildErr): - fmt.Fprintf(os.Stderr, "%s\n", errorColor(err.Error())) - fmt.Printf("%s\n", infoColor("waiting for a fix before retrying...")) + fmt.Fprintf(s.stdLog(logStarport).err, "%s\n", errorColor(err.Error())) + fmt.Fprintf(s.stdLog(logStarport).out, "%s\n", infoColor("waiting for a fix before retrying...")) default: return err } @@ -127,26 +135,14 @@ func (s *starportServe) watchAppBackend(ctx context.Context) error { } func (s *starportServe) serve(ctx context.Context) error { - var ( - stdout = ioutil.Discard - stderr = ioutil.Discard - ) - if s.verbose { - stdout = os.Stdout - stderr = os.Stderr - } opts := []cmdrunner.Option{ - cmdrunner.DefaultStdout(stdout), - cmdrunner.DefaultStderr(stderr), cmdrunner.DefaultWorkdir(s.app.Path), } - if err := cmdrunner. New(opts...). Run(ctx, s.buildSteps()...); err != nil { return err } - return cmdrunner. New(append(opts, cmdrunner.RunParallel())...). Run(ctx, s.serverSteps()...) @@ -176,51 +172,99 @@ func (s *starportServe) buildSteps() (steps step.Steps) { } return err } - steps.Add(step.New( - step.Exec("go", "mod", "tidy"), - step.PreExec(func() error { - if !xexec.IsCommandAvailable("go") { - return errors.New("go must be avaiable in your path") - } - fmt.Println("\nšŸ“¦ Installing dependencies...") - return nil - }), - step.PostExec(captureBuildErr), - step.Stderr(buildErr), + steps.Add(step.New(step.NewOptions(). + Add( + step.Exec( + "go", + "mod", + "tidy", + ), + step.PreExec(func() error { + if !xexec.IsCommandAvailable("go") { + return errors.New("go must be avaiable in your path") + } + fmt.Fprintln(s.stdLog(logStarport).out, "\nšŸ“¦ Installing dependencies...") + return nil + }), + step.PostExec(captureBuildErr), + ). + Add(s.stdSteps(logStarport)...). + Add(step.Stderr(buildErr))..., )) - steps.Add(step.New( - step.Exec("go", "mod", "verify"), - step.PostExec(captureBuildErr), - step.Stderr(buildErr), + steps.Add(step.New(step.NewOptions(). + Add( + step.Exec( + "go", + "mod", + "verify", + ), + step.PostExec(captureBuildErr), + ). + Add(s.stdSteps(logBuild)...). + Add(step.Stderr(buildErr))..., )) cwd, _ := os.Getwd() - steps.Add(step.New( - step.Exec("go", "install", "-mod", "readonly", "-ldflags", ldflags, filepath.Join(cwd, "cmd", appd)), - step.PreExec(func() error { - fmt.Println("šŸ› ļø Building the app...") - return nil - }), - step.PostExec(captureBuildErr), - step.Stderr(buildErr), + steps.Add(step.New(step.NewOptions(). + Add( + step.Exec( + "go", + "install", + "-mod", "readonly", + "-ldflags", ldflags, + filepath.Join(cwd, "cmd", appd), + ), + step.PreExec(func() error { + fmt.Fprintln(s.stdLog(logStarport).out, "šŸ› ļø Building the app...") + return nil + }), + step.PostExec(captureBuildErr), + ). + Add(s.stdSteps(logStarport)...). + Add(step.Stderr(buildErr))..., )) - steps.Add(step.New( - step.Exec("go", "install", "-mod", "readonly", "-ldflags", ldflags, filepath.Join(cwd, "cmd", appcli)), - step.PostExec(captureBuildErr), - step.Stderr(buildErr), + steps.Add(step.New(step.NewOptions(). + Add( + step.Exec( + "go", + "install", + "-mod", "readonly", + "-ldflags", ldflags, + filepath.Join(cwd, "cmd", appcli), + ), + step.PostExec(captureBuildErr), + ). + Add(s.stdSteps(logStarport)...). + Add(step.Stderr(buildErr))..., )) - steps.Add(step.New( - step.Exec(appd, "init", "mynode", "--chain-id", ndapp), - step.PreExec(func() error { - return xos.RemoveAllUnderHome(fmt.Sprintf(".%s", ndappd)) - }), + steps.Add(step.New(step.NewOptions(). + Add( + step.Exec( + appd, + "init", + "mynode", + "--chain-id", ndapp, + ), + step.PreExec(func() error { + return xos.RemoveAllUnderHome(fmt.Sprintf(".%s", ndappd)) + }), + ). + Add(s.stdSteps(logAppd)...)..., )) - steps.Add(step.New( - step.Exec(appcli, "config", "keyring-backend", "test"), - step.PreExec(func() error { - return xos.RemoveAllUnderHome(fmt.Sprintf(".%s", ndappcli)) - }), + steps.Add(step.New(step.NewOptions(). + Add( + step.Exec( + appcli, + "config", + "keyring-backend", + "test", + ), + step.PreExec(func() error { + return xos.RemoveAllUnderHome(fmt.Sprintf(".%s", ndappcli)) + }), + ). + Add(s.stdSteps(logAppd)...)..., )) for _, account := range s.conf.Accounts { account := account @@ -228,44 +272,116 @@ func (s *starportServe) buildSteps() (steps step.Steps) { key = &bytes.Buffer{} mnemonic = &bytes.Buffer{} ) - steps.Add(step.New( - step.Exec(appcli, "keys", "add", account.Name, "--output", "json"), - step.PostExec(func(exitErr error) error { - if exitErr != nil { - return errors.Wrapf(exitErr, "cannot create %s account", account.Name) - } - var user struct { - Mnemonic string `json:"mnemonic"` - } - if err := json.NewDecoder(mnemonic).Decode(&user); err != nil { - return errors.Wrap(err, "cannot decode mnemonic") - } - fmt.Printf("šŸ™‚ Created an account. Password (mnemonic): %[1]v\n", user.Mnemonic) - return nil - }), - step.Stderr(mnemonic), // TODO why mnemonic comes from stderr? + steps.Add(step.New(step.NewOptions(). + Add( + step.Exec( + appcli, + "keys", + "add", + account.Name, + "--output", "json", + ), + step.PostExec(func(exitErr error) error { + if exitErr != nil { + return errors.Wrapf(exitErr, "cannot create %s account", account.Name) + } + var user struct { + Mnemonic string `json:"mnemonic"` + } + if err := json.NewDecoder(mnemonic).Decode(&user); err != nil { + return errors.Wrap(err, "cannot decode mnemonic") + } + fmt.Fprintf(s.stdLog(logStarport).out, "šŸ™‚ Created an account. Password (mnemonic): %[1]v\n", user.Mnemonic) + return nil + }), + ). + Add(s.stdSteps(logAppcli)...). + Add(step.Stderr(mnemonic))..., // TODO why mnemonic comes from stderr? )) - steps.Add(step.New( - step.Exec(appcli, "keys", "show", account.Name, "-a"), - step.PostExec(func(err error) error { - if err != nil { - return err - } - coins := strings.Join(account.Coins, ",") - return cmdrunner. - New(). - Run(context.Background(), step.New( - step.Exec(appd, "add-genesis-account", strings.TrimSpace(key.String()), coins))) - }), - step.Stdout(key), + steps.Add(step.New(step.NewOptions(). + Add( + step.Exec( + appcli, + "keys", + "show", + account.Name, + "-a", + ), + step.PostExec(func(err error) error { + if err != nil { + return err + } + coins := strings.Join(account.Coins, ",") + key := strings.TrimSpace(key.String()) + return cmdrunner. + New(). + Run(context.Background(), step.New(step.NewOptions(). + Add(step.Exec( + appd, + "add-genesis-account", + key, + coins, + )). + Add(s.stdSteps(logAppd)...)..., + )) + }), + ). + Add(s.stdSteps(logAppcli)...). + Add(step.Stdout(key))..., )) } - steps.Add(step.New(step.Exec(appcli, "config", "chain-id", ndapp))) - steps.Add(step.New(step.Exec(appcli, "config", "output", "json"))) - steps.Add(step.New(step.Exec(appcli, "config", "indent", "true"))) - steps.Add(step.New(step.Exec(appcli, "config", "trust-node", "true"))) - steps.Add(step.New(step.Exec(appd, "gentx", "--name", s.conf.Accounts[0].Name, "--keyring-backend", "test"))) - steps.Add(step.New(step.Exec(appd, "collect-gentxs"))) + steps.Add(step.New(step.NewOptions(). + Add(step.Exec( + appcli, + "config", + "chain-id", + ndapp, + )). + Add(s.stdSteps(logAppcli)...)..., + )) + steps.Add(step.New(step.NewOptions(). + Add(step.Exec( + appcli, + "config", + "output", + "json", + )). + Add(s.stdSteps(logAppcli)...)..., + )) + steps.Add(step.New(step.NewOptions(). + Add(step.Exec( + appcli, + "config", + "indent", + "true", + )). + Add(s.stdSteps(logAppcli)...)..., + )) + steps.Add(step.New(step.NewOptions(). + Add(step.Exec( + appcli, + "config", + "trust-node", + "true", + )). + Add(s.stdSteps(logAppcli)...)..., + )) + steps.Add(step.New(step.NewOptions(). + Add(step.Exec( + appd, + "gentx", + "--name", s.conf.Accounts[0].Name, + "--keyring-backend", "test", + )). + Add(s.stdSteps(logAppd)...)..., + )) + steps.Add(step.New(step.NewOptions(). + Add(step.Exec( + appd, + "collect-gentxs", + )). + Add(s.stdSteps(logAppd)...)..., + )) return } @@ -274,35 +390,35 @@ func (s *starportServe) serverSteps() (steps step.Steps) { wg.Add(2) go func() { wg.Wait() - fmt.Printf("\nšŸš€ Get started: http://localhost:12345/\n\n") + fmt.Fprintf(s.stdLog(logStarport).out, "\nšŸš€ Get started: http://localhost:12345/\n\n") }() - steps.Add(step.New( - step.Exec(fmt.Sprintf("%[1]vd", s.app.Name), "start"), - step.InExec(func() error { - defer wg.Done() - if s.verbose { - fmt.Println("šŸŒ Running a server at http://localhost:26657 (Tendermint)") - } else { - fmt.Printf("šŸŒ Running a Cosmos '%[1]v' app with Tendermint.\n", s.app.Name) - } - return nil - }), - step.PostExec(func(exitErr error) error { - return errors.Wrapf(exitErr, "cannot run %[1]vd start", s.app.Name) - }), + steps.Add(step.New(step.NewOptions(). + Add( + step.Exec(fmt.Sprintf("%[1]vd", s.app.Name), "start"), + step.InExec(func() error { + defer wg.Done() + fmt.Fprintf(s.stdLog(logStarport).out, "šŸŒ Running a Cosmos '%[1]v' app with Tendermint at http://localhost:26657.\n", s.app.Name) + return nil + }), + step.PostExec(func(exitErr error) error { + return errors.Wrapf(exitErr, "cannot run %[1]vd start", s.app.Name) + }), + ). + Add(s.stdSteps(logAppd)...)..., )) - steps.Add(step.New( - step.Exec(fmt.Sprintf("%[1]vcli", s.app.Name), "rest-server"), - step.InExec(func() error { - defer wg.Done() - if s.verbose { - fmt.Println("šŸŒ Running a server at http://localhost:1317 (LCD)") - } - return nil - }), - step.PostExec(func(exitErr error) error { - return errors.Wrapf(exitErr, "cannot run %[1]vcli rest-server", s.app.Name) - }), + steps.Add(step.New(step.NewOptions(). + Add( + step.Exec(fmt.Sprintf("%[1]vcli", s.app.Name), "rest-server"), + step.InExec(func() error { + defer wg.Done() + fmt.Fprintln(s.stdLog(logStarport).out, "šŸŒ Running a server at http://localhost:1317 (LCD)") + return nil + }), + step.PostExec(func(exitErr error) error { + return errors.Wrapf(exitErr, "cannot run %[1]vcli rest-server", s.app.Name) + }), + ). + Add(s.stdSteps(logAppcli)...)..., )) return } From 1e0415483ee50bae6600f4e2364fd456a8382ccc Mon Sep 17 00:00:00 2001 From: Denis Fadeev Date: Fri, 7 Aug 2020 15:08:25 +0500 Subject: [PATCH 45/46] Added simple config.yml in the readme --- readme.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/readme.md b/readme.md index 2b2e299786..8e15983102 100644 --- a/readme.md +++ b/readme.md @@ -44,6 +44,8 @@ starport serve To start the server, go into you application's directory and run `starport serve`. This commands installs dependencies, builds and initializes the app and runs both Tendermint RPC server (by default on `localhost:26657`) as well as LCD (by default on `localhost:1317`) with hot reloading enabled. +`starport serve` uses `config.yml` to initialize your application, make sure you have it in your project directory (see [Configure](#configure)). + Note: depending on your OS and firewall settings, you may have to accept a prompt asking if your application's binary (`blogd` in this case) can accept external connections. ### Create data types @@ -69,6 +71,16 @@ To add a post run `blogcli tx blog create-post "My title" "This is a blog" --fro Initialization parameters of your app are stored in `config.yml`. +The simple configuration file includes a list of accounts and their initial coins: + +``` +accounts: + - name: me + coins: ["1000token", "100000000stake"] + - name: you + coins: ["500token"] +``` + #### `accounts` A list of user accounts created during genesis of your application. From 0866e63548fcbbbee319d079a730c65acd15e73a Mon Sep 17 00:00:00 2001 From: Denis Fadeev Date: Fri, 7 Aug 2020 15:10:51 +0500 Subject: [PATCH 46/46] Replace Notion links with tutorials.cosmos.network --- readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index 8e15983102..ee0c20e6b1 100644 --- a/readme.md +++ b/readme.md @@ -101,9 +101,9 @@ Adds smart contracts with [CosmWasm](https://docs.cosmwasm.com). Follow a short ## More tutorials - [Blog (video) tutorial](https://www.youtube.com/watch?v=rmbPjCGDXek): get started with your first blockchain -- [Poll tutorial](https://www.notion.so/Starport-Poll-406c136cef48435795a5ef02692cd299): build a voting application with a web-based UI +- [Poll tutorial](https://tutorials.cosmos.network/starport-polling-app/): build a voting application with a web-based UI - [Smart contract tutorial](https://www.notion.so/Smart-contracts-with-CosmWasm-c6fbcd584b78437a843e738b922dc108): add smart contracts to your app with CosmWasm: build, upload, instantiate and run a smart contract -- [Blog (from scratch) tutorial](https://www.notion.so/Starport-Blog-f928931b7d4e423992d1a105cd5f5ea2): learn how Starport works by building a blog without scaffolding +- [Blog (from scratch) tutorial](https://tutorials.cosmos.network/starport-blog/01-index.html): learn how Starport works by building a blog without scaffolding ## Questions & comments