diff --git a/fixtures/configs/.forego b/fixtures/configs/.forego index 441f75c..c098dd3 100644 --- a/fixtures/configs/.forego +++ b/fixtures/configs/.forego @@ -1,3 +1,4 @@ procfile: Procfile.dev concurrency: foo=2,bar=3 port: 15000 +shutdown_grace_time: 30 diff --git a/start.go b/start.go index 716c36d..672d7eb 100644 --- a/start.go +++ b/start.go @@ -13,17 +13,18 @@ import ( "time" ) -const shutdownGraceTime = 3 * time.Second const defaultPort = 5000 +const defaultShutdownGraceTime = 3 var flagPort int var flagConcurrency string var flagRestart bool +var flagShutdownGraceTime int var envs envFiles var cmdStart = &Command{ Run: runStart, - Usage: "start [process name] [-f procfile] [-e env] [-c concurrency] [-p port] [-r]", + Usage: "start [process name] [-f procfile] [-e env] [-c concurrency] [-p port] [-t timeout] [-r]", Short: "Start the application", Long: ` Start the application specified by a Procfile (defaults to ./Procfile) @@ -33,6 +34,7 @@ Examples: forego start forego start web forego start -f Procfile.test -e .env.test + forego start -t 30 `, } @@ -42,11 +44,12 @@ func init() { cmdStart.Flag.IntVar(&flagPort, "p", defaultPort, "port") cmdStart.Flag.StringVar(&flagConcurrency, "c", "", "concurrency") cmdStart.Flag.BoolVar(&flagRestart, "r", false, "restart") - err := readConfigFile(".forego", &flagProcfile, &flagPort, &flagConcurrency) + cmdStart.Flag.IntVar(&flagShutdownGraceTime, "t", defaultShutdownGraceTime, "shutdown grace time") + err := readConfigFile(".forego", &flagProcfile, &flagPort, &flagConcurrency, &flagShutdownGraceTime) handleError(err) } -func readConfigFile(config_path string, flagProcfile *string, flagPort *int, flagConcurrency *string) error { +func readConfigFile(config_path string, flagProcfile *string, flagPort *int, flagConcurrency *string, flagShutdownGraceTime *int) error { config, err := ReadConfig(config_path) if config["procfile"] != "" { @@ -59,6 +62,11 @@ func readConfigFile(config_path string, flagProcfile *string, flagPort *int, fla } else { *flagPort = defaultPort } + if config["shutdown_grace_time"] != "" { + *flagShutdownGraceTime, err = strconv.Atoi(config["shutdown_grace_time"]) + } else { + *flagShutdownGraceTime = defaultShutdownGraceTime + } *flagConcurrency = config["concurrency"] return err } @@ -237,7 +245,7 @@ func runStart(cmd *Command, args []string) { // When teardown fires, start the grace timer f.teardown.FallHook = func() { go func() { - time.Sleep(shutdownGraceTime) + time.Sleep(time.Duration(flagShutdownGraceTime) * time.Second) of.SystemOutput("Grace time expired") f.teardownNow.Fall() }() diff --git a/start_test.go b/start_test.go index 55518ad..b57ca5f 100644 --- a/start_test.go +++ b/start_test.go @@ -150,7 +150,8 @@ func TestConfigBeOverrideByForegoFile(t *testing.T) { var procfile = "Profile" var port = 5000 var concurrency string = "web=2" - err := readConfigFile("./fixtures/configs/.forego", &procfile, &port, &concurrency) + var gracetime int = 3 + err := readConfigFile("./fixtures/configs/.forego", &procfile, &port, &concurrency, &gracetime) if err != nil { t.Fatalf("Cannot set default values from forego config file") @@ -167,4 +168,8 @@ func TestConfigBeOverrideByForegoFile(t *testing.T) { if concurrency != "foo=2,bar=3" { t.Fatal("concurrency should be 'foo=2,bar=3', got %s", concurrency) } + + if gracetime != 30 { + t.Fatal("gracetime should be 3, got %d", gracetime) + } }