func (n *newCmd) run(e *parsecli.Env) error { apps := &parsecli.Apps{} addCmd := &addCmd{MakeDefault: true, apps: apps} if err := apps.Login.AuthUser(e, false); err != nil { return err } var ( app *parsecli.App err error ) nonInteractive := n.parseAppName != "" && n.codeLocation != "" decision, err := n.promptCreateNewApp(e, nonInteractive) if err != nil { return err } isNew := false switch decision { case "new", "n": isNew = true var createRetries int if n.noCode { createRetries = 1 } // we pass retries so that even in non interactive mode we can create an app, // and failure does not print 3 times to the screen app, err = apps.CreateApp(e, n.parseAppName, createRetries) if err != nil { return err } if n.noCode { fmt.Fprintln(e.Out, "Successfully created the app.") return apps.PrintApp(e, app) } case "existing", "e": app, err = addCmd.selectApp(e, n.parseAppName) if err != nil { return err } if n.noCode { fmt.Fprintln(e.Out, "Successfully selected the app.") return apps.PrintApp(e, app) } } projectType, err := herokucmd.PromptCreateWebhooks(e) if err != nil { return err } var appConfig parsecli.AppConfig switch projectType { case "heroku": e.Type = parsecli.HerokuFormat var newHerokuApp bool newHerokuApp, appConfig, err = herokucmd.GetLinkedHerokuAppConfig(app, e) if err != nil { return err } isNew = isNew || newHerokuApp case "parse": e.Type = parsecli.ParseFormat appConfig = parsecmd.GetParseAppConfig(app) } dumpTemplate, err := n.setupSample(e, app.Name, appConfig, isNew, nonInteractive) if err != nil { return err } if err := n.configureSample(addCmd, app.Name, appConfig, nil, e); err != nil { return err } if token := apps.Login.Credentials.Token; token != "" { email, err := apps.Login.AuthToken(e, token) if err != nil { return err } if err := parsecli.SetParserEmail(e, email); err != nil { return err } } if dumpTemplate { fmt.Fprintf(e.Out, n.cloudCodeHelpMessage(e, app)) } return nil }
func main() { // some parts of apps.go are unable to handle // interrupts, this logic ensures we exit on system interrupts interrupt := make(chan os.Signal, 1) signal.Notify(interrupt, os.Interrupt) go func() { <-interrupt os.Exit(1) }() e := parsecli.Env{ Root: os.Getenv("PARSE_ROOT"), Server: os.Getenv("PARSE_SERVER"), ErrorStack: os.Getenv("PARSE_ERROR_STACK") == "1", ParserEmail: os.Getenv("PARSER_EMAIL"), Out: os.Stdout, Err: os.Stderr, In: os.Stdin, Exit: os.Exit, Clock: clock.New(), } if e.Root == "" { cur, err := os.Getwd() if err != nil { fmt.Fprintf(e.Err, "Failed to get current directory:\n%s\n", err) os.Exit(1) } root := parsecli.GetProjectRoot(&e, cur) if parsecli.IsProjectDir(root) { e.Root = root config, err := parsecli.ConfigFromDir(root) if err != nil { fmt.Fprintln(e.Err, err) os.Exit(1) } e.Type = config.GetProjectConfig().Type if e.ParserEmail == "" { e.ParserEmail = config.GetProjectConfig().ParserEmail } } else { e.Type = parsecli.LegacyParseFormat e.Root = parsecli.GetLegacyProjectRoot(&e, cur) } } if e.Type != parsecli.LegacyParseFormat && e.Type != parsecli.ParseFormat && e.Type != parsecli.HerokuFormat { fmt.Fprintf(e.Err, "Unknown project type %d.\n", e.Type) os.Exit(1) } if e.Server == "" { e.Server = parsecli.DefaultBaseURL } apiClient, err := parsecli.NewParseAPIClient(&e) if err != nil { fmt.Fprintln(e.Err, err) os.Exit(1) } e.ParseAPIClient = apiClient if e.Type == parsecli.HerokuFormat { apiClient, err := parsecli.NewHerokuAPIClient(&e) if err != nil { fmt.Fprintln(e.Err, err) os.Exit(1) } e.HerokuAPIClient = apiClient } var ( rootCmd *cobra.Command command []string ) switch e.Type { case parsecli.LegacyParseFormat, parsecli.ParseFormat: command, rootCmd = parseRootCmd(&e) case parsecli.HerokuFormat: command, rootCmd = herokuRootCmd(&e) } if len(command) == 0 || command[0] != "update" { message, err := checkIfSupported(&e, parsecli.Version, command...) if err != nil { fmt.Fprintln(e.Err, err) os.Exit(1) } if message != "" { fmt.Fprintln(e.Err, message) } } if err := rootCmd.Execute(); err != nil { // Error is already printed in Execute() os.Exit(1) } }