package cli import ( "context" "errors" "os" "path/filepath" "go.jolheiser.com/gpm" "go.jolheiser.com/gpm/internal/database" "github.com/urfave/cli/v2" ) func New(version string) *cli.App { app := cli.NewApp() app.Name = "gpm" app.Usage = "Go Package Manager" app.Version = version app.Commands = []*cli.Command{ &Add, &Get, &List, &Remove, &Search, &Server, &Update, } app.Flags = []cli.Flag{ &cli.StringFlag{ Name: "server", Aliases: []string{"s"}, Usage: "gpm server to use", Value: gpm.DefaultServer, EnvVars: []string{"GPM_SERVER"}, Destination: &serverFlag, }, &cli.StringFlag{ Name: "token", Aliases: []string{"t"}, Usage: "gpm auth token to use", DefaultText: "${GPM_TOKEN}", EnvVars: []string{"GPM_TOKEN"}, Destination: &tokenFlag, }, &cli.StringFlag{ Name: "database", Aliases: []string{"d"}, Usage: "path to gpm database for server", Value: dbPath(), DefaultText: "`${USERCONFIG}/gpm.db` or `${BINPATH}/gpm.db`", EnvVars: []string{"GPM_DATABASE"}, Destination: &databaseFlag, }, } return app } func dbPath() string { fn := "gpm.db" home, err := os.UserConfigDir() if err != nil { bin, err := os.Executable() if err != nil { return fn } return filepath.Join(filepath.Dir(bin), fn) } return filepath.Join(home, fn) } func localOrToken(_ *cli.Context) error { if localFlag && tokenFlag == "" { return errors.New("server interaaction requires --token") } return nil } func listPackages() ([]gpm.Package, error) { var pkgs []gpm.Package if localFlag { db, err := database.Load(databaseFlag) if err != nil { return pkgs, err } pkgs, err = db.Packages() if err != nil { return pkgs, err } } else { client := gpm.New(tokenFlag, gpm.WithServer(serverFlag)) info, err := client.Info(context.Background()) if err != nil { return pkgs, err } pkgs = info.Packages } return pkgs, nil }