diff --git a/go.mod b/go.mod index 4e6fd0fb..507762f9 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( github.com/oklog/run v1.1.0 github.com/patrickmn/go-cache v2.1.0+incompatible github.com/peterbourgon/diskv v2.0.1+incompatible - github.com/peterbourgon/ff/v2 v2.0.1 + github.com/peterbourgon/ff/v3 v3.3.0 github.com/rs/cors v1.8.2 github.com/stretchr/signature v0.0.0-20160104132143-168b2a1e1b56 github.com/stretchr/testify v1.8.0 @@ -36,7 +36,7 @@ require ( moul.io/godev v1.7.0 moul.io/hcfilters v1.3.1 moul.io/pkgman v1.4.3 - moul.io/u v1.24.1-0.20210613090436-cb608187834e + moul.io/u v1.25.1 moul.io/zapconfig v1.4.0 moul.io/zapgorm v1.1.5 ) @@ -69,4 +69,5 @@ require ( google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.28.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + moul.io/climan v1.0.0 // indirect ) diff --git a/go.sum b/go.sum index ae2e351b..13038e37 100644 --- a/go.sum +++ b/go.sum @@ -305,6 +305,8 @@ github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR github.com/peterbourgon/ff/v2 v2.0.1 h1:yee3393t1CZXgy/9osDb0kdhmOaFhG8vH194/QSs/Eg= github.com/peterbourgon/ff/v2 v2.0.1/go.mod h1:wa7ROgc8n/Zgf6Cfua2Oho6T4XbuqYVxCMMlXjGDxEA= github.com/peterbourgon/ff/v3 v3.0.0/go.mod h1:UILIFjRH5a/ar8TjXYLTkIvSvekZqPm5Eb/qbGk6CT0= +github.com/peterbourgon/ff/v3 v3.3.0 h1:PaKe7GW8orVFh8Unb5jNHS+JZBwWUMa2se0HM6/BI24= +github.com/peterbourgon/ff/v3 v3.3.0/go.mod h1:zjJVUhx+twciwfDl0zBcFzl4dW8axCRyXE/eKY9RztQ= github.com/pkg/diff v0.0.0-20200914180035-5b29258ca4f7/go.mod h1:zO8QMzTeZd5cpnIkz/Gn6iK0jDfGicM1nynOkkPIl28= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= @@ -784,6 +786,8 @@ howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM= howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= moul.io/chizap v1.0.3 h1:mliXvvuS5HVo3QP8qPXczWtRM5dQ9UmK3bBVIkZo6ek= moul.io/chizap v1.0.3/go.mod h1:pq4R9kGLwz4XjBc4hodQYuoE7Yc9RUabLBFyyi2uErk= +moul.io/climan v1.0.0 h1:Xc9xnUrLVPK69lnCfVJnCvVtMm4v6Lt2743fnadvpWc= +moul.io/climan v1.0.0/go.mod h1:iT29NKBU5U7cAYxmpt9XXfv3PV1OW+5OKvze553VTwc= moul.io/godev v1.7.0 h1:PgnL7BsCQPPjKwu9V0oxIVm2MyZAHAN2sl0S3+E37U0= moul.io/godev v1.7.0/go.mod h1:5lgSpI1oH7xWpLl2Ew/Nsgk8DiNM6FzN9WV9+lgW8RQ= moul.io/hcfilters v1.3.1 h1:5+/qXU5+uf2f+s9fpwAQC850/3JJ6aLl+ztQAFkLdZ0= @@ -794,6 +798,8 @@ moul.io/u v1.21.0/go.mod h1:4Si+MVxJDNFfkqCOtLS6viqkvfeDGYTwykt2iyQ4MoY= moul.io/u v1.23.0/go.mod h1:ytlQ/zt+Sdk+PFGEx+fpTivoa0ieA5yMo6itRswIWNQ= moul.io/u v1.24.1-0.20210613090436-cb608187834e h1:f/asKkdU5LtgZ13hE6sJdz8oWnZTzvhVmJ+k9ompCBQ= moul.io/u v1.24.1-0.20210613090436-cb608187834e/go.mod h1:ytlQ/zt+Sdk+PFGEx+fpTivoa0ieA5yMo6itRswIWNQ= +moul.io/u v1.25.1 h1:yNbB11OGz2HbBxOPh7lFo2fMgw+j8Af1CbRdacr/+vQ= +moul.io/u v1.25.1/go.mod h1:ggYDXxUjoHpfDsMPD3STqkUZTyA741PZiQhSd+7kRnA= moul.io/zapconfig v1.4.0 h1:J3ND5J3e/qQ++jlpqdSR1EtDNV+iujtvXgLsjy1uyq8= moul.io/zapconfig v1.4.0/go.mod h1:bYTa5j7r82yPmSR6i5CcrPSVoWEbdpN7o9IgndSVby8= moul.io/zapgorm v1.1.5 h1:i7TQYlB5blb8H1NPv3Er3xQgs0lRSIDQW0/dkiIbAa8= diff --git a/go/cmd/yolo/main.go b/go/cmd/yolo/main.go index 6f802726..09525861 100644 --- a/go/cmd/yolo/main.go +++ b/go/cmd/yolo/main.go @@ -3,6 +3,7 @@ package main import ( "context" "flag" + "fmt" "log" "math/rand" "net/http" @@ -13,6 +14,7 @@ import ( "berty.tech/yolo/v2/go/pkg/bintray" "go.uber.org/zap" "golang.org/x/oauth2" + "moul.io/climan" "moul.io/hcfilters" "moul.io/zapconfig" @@ -25,19 +27,34 @@ import ( _ "github.com/jinzhu/gorm/dialects/sqlite" circleci "github.com/jszwedko/go-circleci" "github.com/peterbourgon/diskv" - ff "github.com/peterbourgon/ff/v2" - "github.com/peterbourgon/ff/v2/ffcli" + ff "github.com/peterbourgon/ff/v3" ) -var ( - verbose bool - logFormat string - dbStorePath string - withPreloading bool -) +type globalOptions struct { + verbose bool + logFormat string + dbStorePath string + + server serverOpts +} + +func (g *globalOptions) applyDefaults() { + g.verbose = false + g.logFormat = "console" + g.dbStorePath = ":memory:" +} + +func (g *globalOptions) commonFlagsBuilder(fs *flag.FlagSet) { + fs.BoolVar(&g.verbose, "v", g.verbose, "increase log verbosity") + fs.StringVar(&g.logFormat, "log-format", g.logFormat, strings.Join(zapconfig.AvailablePresets, ", ")) + fs.StringVar(&g.dbStorePath, "db-path", g.dbStorePath, "DB Store path") +} + +var glOpts = &globalOptions{} func main() { - err := yolo(os.Args) + glOpts.applyDefaults() + err := yolo(os.Args[1:]) if err != nil { log.Fatalf("err: %+v", err) os.Exit(1) @@ -49,25 +66,27 @@ func yolo(args []string) error { rootFlagSet := flag.NewFlagSet("yolo", flag.ExitOnError) rand.Seed(time.Now().UnixNano()) rootFlagSet.SetOutput(os.Stderr) - rootFlagSet.BoolVar(&verbose, "v", false, "increase log verbosity") - rootFlagSet.StringVar(&logFormat, "log-format", "console", strings.Join(zapconfig.AvailablePresets, ", ")) - root := &ffcli.Command{ - ShortUsage: `server [flags] `, - FlagSet: rootFlagSet, - Subcommands: []*ffcli.Command{ + root := &climan.Command{ + ShortUsage: `yolo [flags] `, + FlagSetBuilder: glOpts.commonFlagsBuilder, + Subcommands: []*climan.Command{ serverCommand(), dumpObjectsCommand(), infoCommand(), treeCommand(), }, - Options: []ff.Option{ff.WithEnvVarNoPrefix()}, + FFOptions: []ff.Option{ff.WithEnvVarNoPrefix()}, Exec: func(_ context.Context, _ []string) error { return flag.ErrHelp }, } - return root.ParseAndRun(context.Background(), os.Args[1:]) + if err := root.Parse(args); err != nil { + return fmt.Errorf("parse error: %w", err) + } + + return root.Run(context.Background()) } func bintrayClientFromArgs(username, token string, logger *zap.Logger) (*bintray.Client, error) { diff --git a/go/cmd/yolo/server.go b/go/cmd/yolo/server.go index ae9f8678..68e97f42 100644 --- a/go/cmd/yolo/server.go +++ b/go/cmd/yolo/server.go @@ -10,87 +10,89 @@ import ( "berty.tech/yolo/v2/go/pkg/bintray" "berty.tech/yolo/v2/go/pkg/yolosvc" + "moul.io/climan" "github.com/buildkite/go-buildkite/buildkite" "github.com/jszwedko/go-circleci" "github.com/oklog/run" - "github.com/peterbourgon/ff/v2" - "github.com/peterbourgon/ff/v2/ffcli" + "github.com/peterbourgon/ff/v3" "github.com/tevino/abool" ) -func serverCommand() *ffcli.Command { - fs := flag.NewFlagSet("server", flag.ExitOnError) - - var ( - devMode bool - withCache bool - maxBuilds int - buildkiteToken string - githubToken string - githubRepos string - bintrayUsername string - bintrayToken string - artifactsCachePath string - circleciToken string - grpcBind string - httpBind string - corsAllowedOrigins string - requestTimeout time.Duration - shutdownTimeout time.Duration - basicAuth string - authSalt string - httpCachePath string - realm string - once bool - iosPrivkeyPath string - iosProvPath string - iosPrivkeyPass string - ) - - fs.BoolVar(&devMode, "dev-mode", false, "enable insecure helpers") - fs.BoolVar(&withCache, "with-cache", false, "enable API caching") - fs.StringVar(&buildkiteToken, "buildkite-token", "", "BuildKite API Token") - fs.StringVar(&bintrayUsername, "bintray-username", "", "Bintray username") - fs.StringVar(&bintrayToken, "bintray-token", "", "Bintray API Token") - fs.StringVar(&circleciToken, "circleci-token", "", "CircleCI API Token") - fs.StringVar(&githubToken, "github-token", "", "GitHub API Token") - fs.StringVar(&githubRepos, "github-repos", "berty/berty", "GitHub repositories to watch") - fs.StringVar(&dbStorePath, "db-path", ":memory:", "DB Store path") - fs.StringVar(&artifactsCachePath, "artifacts-cache-path", "", "Artifacts caching path") - fs.IntVar(&maxBuilds, "max-builds", 100, "maximum builds to fetch from external services (pagination)") - fs.StringVar(&httpBind, "http-bind", ":8000", "HTTP bind address") - fs.StringVar(&grpcBind, "grpc-bind", ":9000", "gRPC bind address") - fs.StringVar(&corsAllowedOrigins, "cors-allowed-origins", "", "CORS allowed origins (*.domain.tld)") - fs.DurationVar(&requestTimeout, "request-timeout", 5*time.Second, "request timeout") - fs.DurationVar(&shutdownTimeout, "shutdown-timeout", 6*time.Second, "server shutdown timeout") - fs.StringVar(&basicAuth, "basic-auth-password", "", "if set, enables basic authentication") - fs.StringVar(&realm, "realm", "Yolo", "authentication Realm") - fs.StringVar(&authSalt, "auth-salt", "", "salt used to generate authentication tokens at the end of the URLs") - fs.StringVar(&httpCachePath, "http-cache-path", "", "if set, will cache http client requests") - fs.BoolVar(&once, "once", false, "just run workers once") - fs.StringVar(&iosPrivkeyPath, "ios-privkey", "", "iOS signing: path to private key or p12 file (PEM or DER format)") - fs.StringVar(&iosProvPath, "ios-prov", "", "iOS signing: path to mobile provisioning profile") - fs.StringVar(&iosPrivkeyPass, "ios-pass", "", "iOS signing: password for private key or p12 file") - - return &ffcli.Command{ +type serverOpts struct { + devMode bool + withCache bool + maxBuilds int + buildkiteToken string + githubToken string + githubRepos string + bintrayUsername string + bintrayToken string + artifactsCachePath string + circleciToken string + grpcBind string + httpBind string + corsAllowedOrigins string + requestTimeout time.Duration + shutdownTimeout time.Duration + basicAuth string + authSalt string + httpCachePath string + realm string + once bool + iosPrivkeyPath string + iosProvPath string + iosPrivkeyPass string +} + +func (s *serverOpts) configureFlagSet(fs *flag.FlagSet) { + fs.BoolVar(&s.devMode, "dev-mode", false, "enable insecure helpers") + fs.BoolVar(&s.withCache, "with-cache", false, "enable API caching") + fs.StringVar(&s.buildkiteToken, "buildkite-token", "", "BuildKite API Token") + fs.StringVar(&s.bintrayUsername, "bintray-username", "", "Bintray username") + fs.StringVar(&s.bintrayToken, "bintray-token", "", "Bintray API Token") + fs.StringVar(&s.circleciToken, "circleci-token", "", "CircleCI API Token") + fs.StringVar(&s.githubToken, "github-token", "", "GitHub API Token") + fs.StringVar(&s.githubRepos, "github-repos", "berty/berty", "GitHub repositories to watch") + fs.StringVar(&s.artifactsCachePath, "artifacts-cache-path", "", "Artifacts caching path") + fs.IntVar(&s.maxBuilds, "max-builds", 100, "maximum builds to fetch from external services (pagination)") + fs.StringVar(&s.httpBind, "http-bind", ":8000", "HTTP bind address") + fs.StringVar(&s.grpcBind, "grpc-bind", ":9000", "gRPC bind address") + fs.StringVar(&s.corsAllowedOrigins, "cors-allowed-origins", "", "CORS allowed origins (*.domain.tld)") + fs.DurationVar(&s.requestTimeout, "request-timeout", 5*time.Second, "request timeout") + fs.DurationVar(&s.shutdownTimeout, "shutdown-timeout", 6*time.Second, "server shutdown timeout") + fs.StringVar(&s.basicAuth, "basic-auth-password", "", "if set, enables basic authentication") + fs.StringVar(&s.realm, "realm", "Yolo", "authentication realm") + fs.StringVar(&s.authSalt, "auth-salt", "", "salt used to generate authentication tokens at the end of the URLs") + fs.StringVar(&s.httpCachePath, "http-cache-path", "", "if set, will cache http client requests") + fs.BoolVar(&s.once, "once", false, "just run workers once") + fs.StringVar(&s.iosPrivkeyPath, "ios-privkey", "", "iOS signing: path to private key or p12 file (PEM or DER format)") + fs.StringVar(&s.iosProvPath, "ios-prov", "", "iOS signing: path to mobile provisioning profile") + fs.StringVar(&s.iosPrivkeyPass, "ios-pass", "", "iOS signing: password for private key or p12 file") +} + +func serverCommand() *climan.Command { + return &climan.Command{ Name: `server`, ShortHelp: `Start a Yolo Server`, - FlagSet: fs, - Options: []ff.Option{ff.WithEnvVarNoPrefix()}, + FFOptions: []ff.Option{ff.WithEnvVarNoPrefix()}, + FlagSetBuilder: func(fs *flag.FlagSet) { + glOpts.commonFlagsBuilder(fs) + glOpts.server.configureFlagSet(fs) + }, Exec: func(ctx context.Context, _ []string) error { - logger, err := loggerFromArgs(verbose, logFormat) + logger, err := loggerFromArgs(glOpts.verbose, glOpts.logFormat) if err != nil { return err } ctx, cancel := context.WithCancel(ctx) defer cancel() - roundTripper, rtCloser := roundTripperFromArgs(ctx, httpCachePath, logger) + roundTripper, rtCloser := roundTripperFromArgs(ctx, glOpts.server.httpCachePath, logger) defer rtCloser() http.DefaultTransport = roundTripper - db, err := dbFromArgs(dbStorePath, logger) + db, err := dbFromArgs(glOpts.dbStorePath, logger) if err != nil { return err } @@ -103,37 +105,37 @@ func serverCommand() *ffcli.Command { // service conns var bkc *buildkite.Client - if buildkiteToken != "" { - bkc, err = buildkiteClientFromArgs(buildkiteToken) + if glOpts.server.buildkiteToken != "" { + bkc, err = buildkiteClientFromArgs(glOpts.server.buildkiteToken) if err != nil { return err } } var ccc *circleci.Client - if circleciToken != "" { - ccc, err = circleciClientFromArgs(circleciToken) + if glOpts.server.circleciToken != "" { + ccc, err = circleciClientFromArgs(glOpts.server.circleciToken) if err != nil { return err } } var btc *bintray.Client - if bintrayToken != "" && bintrayUsername != "" { - btc, err = bintrayClientFromArgs(bintrayUsername, bintrayToken, logger) + if glOpts.server.bintrayToken != "" && glOpts.server.bintrayUsername != "" { + btc, err = bintrayClientFromArgs(glOpts.server.bintrayUsername, glOpts.server.bintrayToken, logger) if err != nil { return err } } - ghc, err := githubClientFromArgs(githubToken) + ghc, err := githubClientFromArgs(glOpts.server.githubToken) if err != nil { return err } - if devMode { + if glOpts.server.devMode { logger.Warn("--dev-mode: insecure helpers are enabled") } - if artifactsCachePath != "" { - if err := os.MkdirAll(artifactsCachePath, 0o755); err != nil { + if glOpts.server.artifactsCachePath != "" { + if err := os.MkdirAll(glOpts.server.artifactsCachePath, 0o755); err != nil { return err } } @@ -145,12 +147,12 @@ func serverCommand() *ffcli.Command { CircleciClient: ccc, BintrayClient: btc, GithubClient: ghc, - AuthSalt: authSalt, - DevMode: devMode, - ArtifactsCachePath: artifactsCachePath, - IOSPrivkeyPath: iosPrivkeyPath, - IOSProvPath: iosProvPath, - IOSPrivkeyPass: iosPrivkeyPass, + AuthSalt: glOpts.server.authSalt, + DevMode: glOpts.server.devMode, + ArtifactsCachePath: glOpts.server.artifactsCachePath, + IOSPrivkeyPath: glOpts.server.iosPrivkeyPath, + IOSProvPath: glOpts.server.iosProvPath, + IOSPrivkeyPass: glOpts.server.iosPrivkeyPass, }) if err != nil { return err @@ -158,39 +160,39 @@ func serverCommand() *ffcli.Command { // service workers if bkc != nil { - opts := yolosvc.BuildkiteWorkerOpts{Logger: logger, MaxBuilds: maxBuilds, ClearCache: cc, Once: once} + opts := yolosvc.BuildkiteWorkerOpts{Logger: logger, MaxBuilds: glOpts.server.maxBuilds, ClearCache: cc, Once: glOpts.server.once} gr.Add(func() error { return svc.BuildkiteWorker(ctx, opts) }, func(_ error) { cancel() }) } if ccc != nil { - opts := yolosvc.CircleciWorkerOpts{Logger: logger, MaxBuilds: maxBuilds, ClearCache: cc, Once: once} + opts := yolosvc.CircleciWorkerOpts{Logger: logger, MaxBuilds: glOpts.server.maxBuilds, ClearCache: cc, Once: glOpts.server.once} gr.Add(func() error { return svc.CircleciWorker(ctx, opts) }, func(_ error) { cancel() }) } if btc != nil { - opts := yolosvc.BintrayWorkerOpts{Logger: logger, ClearCache: cc, Once: once} + opts := yolosvc.BintrayWorkerOpts{Logger: logger, ClearCache: cc, Once: glOpts.server.once} gr.Add(func() error { return svc.BintrayWorker(ctx, opts) }, func(_ error) { cancel() }) } - if !once { // disable pkgman when running with --once - opts := yolosvc.PkgmanWorkerOpts{Logger: logger, ClearCache: cc, Once: once} + if !glOpts.server.once { // disable pkgman when running with --once + opts := yolosvc.PkgmanWorkerOpts{Logger: logger, ClearCache: cc, Once: glOpts.server.once} gr.Add(func() error { return svc.PkgmanWorker(ctx, opts) }, func(_ error) { cancel() }) } - if githubToken != "" { - opts := yolosvc.GithubWorkerOpts{Logger: logger, MaxBuilds: maxBuilds, ClearCache: cc, Once: once, ReposFilter: githubRepos, Token: githubToken} + if glOpts.server.githubToken != "" { + opts := yolosvc.GithubWorkerOpts{Logger: logger, MaxBuilds: glOpts.server.maxBuilds, ClearCache: cc, Once: glOpts.server.once, ReposFilter: glOpts.server.githubRepos, Token: glOpts.server.githubToken} gr.Add(func() error { return svc.GitHubWorker(ctx, opts) }, func(_ error) { cancel() }) } // server/API server, err := yolosvc.NewServer(ctx, svc, yolosvc.ServerOpts{ Logger: logger, - GRPCBind: grpcBind, - HTTPBind: httpBind, - RequestTimeout: requestTimeout, - ShutdownTimeout: shutdownTimeout, - CORSAllowedOrigins: corsAllowedOrigins, - BasicAuth: basicAuth, - Realm: realm, - AuthSalt: authSalt, - DevMode: devMode, - WithCache: withCache, + GRPCBind: glOpts.server.grpcBind, + HTTPBind: glOpts.server.httpBind, + RequestTimeout: glOpts.server.requestTimeout, + ShutdownTimeout: glOpts.server.shutdownTimeout, + CORSAllowedOrigins: glOpts.server.corsAllowedOrigins, + BasicAuth: glOpts.server.basicAuth, + Realm: glOpts.server.realm, + AuthSalt: glOpts.server.authSalt, + DevMode: glOpts.server.devMode, + WithCache: glOpts.server.withCache, ClearCache: cc, }) if err != nil { diff --git a/go/cmd/yolo/store.go b/go/cmd/yolo/store.go index e84d149a..379004ab 100644 --- a/go/cmd/yolo/store.go +++ b/go/cmd/yolo/store.go @@ -2,37 +2,27 @@ package main import ( "context" - "flag" "fmt" "berty.tech/yolo/v2/go/pkg/yolopb" "berty.tech/yolo/v2/go/pkg/yolosvc" + "moul.io/climan" "moul.io/godev" - "github.com/peterbourgon/ff/v2" - "github.com/peterbourgon/ff/v2/ffcli" + "github.com/peterbourgon/ff/v3" ) -func storeFlagSet() *flag.FlagSet { - fs := flag.NewFlagSet("store", flag.ExitOnError) - - fs.StringVar(&dbStorePath, "db-path", ":memory:", "DB Store path") - fs.BoolVar(&withPreloading, "with-preloading", false, "with auto DB preloading") - - return fs -} - -func dumpObjectsCommand() *ffcli.Command { - return &ffcli.Command{ - Name: `dump-objects`, - FlagSet: storeFlagSet(), - Options: []ff.Option{ff.WithEnvVarNoPrefix()}, +func dumpObjectsCommand() *climan.Command { + return &climan.Command{ + Name: `dump-objects`, + FlagSetBuilder: glOpts.commonFlagsBuilder, + FFOptions: []ff.Option{ff.WithEnvVarNoPrefix()}, Exec: func(_ context.Context, _ []string) error { - logger, err := loggerFromArgs(verbose, logFormat) + logger, err := loggerFromArgs(glOpts.verbose, glOpts.logFormat) if err != nil { return err } - db, err := dbFromArgs(dbStorePath, logger) + db, err := dbFromArgs(glOpts.dbStorePath, logger) if err != nil { return err } @@ -61,17 +51,17 @@ func dumpObjectsCommand() *ffcli.Command { } } -func treeCommand() *ffcli.Command { - return &ffcli.Command{ - Name: `tree`, - FlagSet: storeFlagSet(), - Options: []ff.Option{ff.WithEnvVarNoPrefix()}, +func treeCommand() *climan.Command { + return &climan.Command{ + Name: `tree`, + FlagSetBuilder: glOpts.commonFlagsBuilder, + FFOptions: []ff.Option{ff.WithEnvVarNoPrefix()}, Exec: func(ctx context.Context, _ []string) error { - logger, err := loggerFromArgs(verbose, logFormat) + logger, err := loggerFromArgs(glOpts.verbose, glOpts.logFormat) if err != nil { return err } - db, err := dbFromArgs(dbStorePath, logger) + db, err := dbFromArgs(glOpts.dbStorePath, logger) if err != nil { return err } @@ -99,17 +89,17 @@ func treeCommand() *ffcli.Command { } } -func infoCommand() *ffcli.Command { - return &ffcli.Command{ - Name: `info`, - FlagSet: storeFlagSet(), - Options: []ff.Option{ff.WithEnvVarNoPrefix()}, +func infoCommand() *climan.Command { + return &climan.Command{ + Name: `info`, + FlagSetBuilder: glOpts.commonFlagsBuilder, + FFOptions: []ff.Option{ff.WithEnvVarNoPrefix()}, Exec: func(_ context.Context, _ []string) error { - logger, err := loggerFromArgs(verbose, logFormat) + logger, err := loggerFromArgs(glOpts.verbose, glOpts.logFormat) if err != nil { return err } - db, err := dbFromArgs(dbStorePath, logger) + db, err := dbFromArgs(glOpts.dbStorePath, logger) if err != nil { return err } diff --git a/go/pkg/yolosvc/service.go b/go/pkg/yolosvc/service.go index 39838485..5b8fb9da 100644 --- a/go/pkg/yolosvc/service.go +++ b/go/pkg/yolosvc/service.go @@ -9,13 +9,14 @@ import ( "berty.tech/yolo/v2/go/pkg/bintray" "berty.tech/yolo/v2/go/pkg/yolopb" "berty.tech/yolo/v2/go/pkg/yolostore" + "go.uber.org/zap" + "moul.io/u" + "github.com/buildkite/go-buildkite/buildkite" "github.com/google/go-github/v32/github" "github.com/jinzhu/gorm" "github.com/jszwedko/go-circleci" "github.com/tevino/abool" - "go.uber.org/zap" - "moul.io/u" ) type Service interface { @@ -86,8 +87,8 @@ func NewService(db *gorm.DB, opts ServiceOpts) (Service, error) { devMode: opts.DevMode, clearCache: opts.ClearCache, artifactsCachePath: opts.ArtifactsCachePath, - iosPrivkeyPath: u.MustExpandUser(opts.IOSPrivkeyPath), - iosProvPath: u.MustExpandUser(opts.IOSProvPath), + iosPrivkeyPath: u.MustExpandPath(opts.IOSPrivkeyPath), + iosProvPath: u.MustExpandPath(opts.IOSProvPath), iosPrivkeyPass: opts.IOSPrivkeyPass, artifactsCacheMapMutex: map[string]*sync.Mutex{}, }, nil