diff --git a/fixtures/envs/.env1 b/fixtures/envs/.env1 new file mode 100644 index 0000000..7be8251 --- /dev/null +++ b/fixtures/envs/.env1 @@ -0,0 +1 @@ +env1=present diff --git a/fixtures/envs/.env2 b/fixtures/envs/.env2 new file mode 100644 index 0000000..8f6a088 --- /dev/null +++ b/fixtures/envs/.env2 @@ -0,0 +1 @@ +env2=present diff --git a/start.go b/start.go index 63ebba3..80021d0 100644 --- a/start.go +++ b/start.go @@ -14,9 +14,21 @@ import ( const shutdownGraceTime = 3 * time.Second +type envFiles []string + +func (e *envFiles) String() string { + return fmt.Sprintf("%s", *e) +} + +func (e *envFiles) Set(value string) error { + *e = append(*e, fullPath(value)) + return nil +} + var flagPort int var flagConcurrency string var flagRestart bool +var envs envFiles var cmdStart = &Command{ Run: runStart, @@ -35,7 +47,7 @@ Examples: func init() { cmdStart.Flag.StringVar(&flagProcfile, "f", "Procfile", "procfile") - cmdStart.Flag.StringVar(&flagEnv, "e", "", "env") + cmdStart.Flag.Var(&envs, "e", "env") cmdStart.Flag.IntVar(&flagPort, "p", 5000, "port") cmdStart.Flag.StringVar(&flagConcurrency, "c", "", "concurrency") cmdStart.Flag.BoolVar(&flagRestart, "r", false, "restart") @@ -179,20 +191,46 @@ func (f *Forego) startProcess(idx, procNum int, proc ProcfileEntry, env Env, of }() } -func runStart(cmd *Command, args []string) { +func fullPath(file string) string { root := filepath.Dir(flagProcfile) + return filepath.Join(root, file) +} - if flagEnv == "" { - flagEnv = filepath.Join(root, ".env") +func parseEnvironment(files []string) (Env, error) { + if len(files) == 0 { + env, err := ReadEnv(fullPath(".env")) + if err != nil { + return nil, err + } else { + return env, nil + } } + // Handle multiple environment files + env := make(Env) + for _, file := range files { + tmpEnv, err := ReadEnv(file) + + if err != nil { + return nil, err + } + + // Merge the file I just read into the env. + for k, v := range tmpEnv { + env[k] = v + } + } + return env, nil +} + +func runStart(cmd *Command, args []string) { pf, err := ReadProcfile(flagProcfile) handleError(err) - env, err := ReadEnv(flagEnv) + concurrency, err := parseConcurrency(flagConcurrency) handleError(err) - concurrency, err := parseConcurrency(flagConcurrency) + env, err := parseEnvironment(envs) handleError(err) of := NewOutletFactory() diff --git a/start_test.go b/start_test.go index 0808dd2..560465b 100644 --- a/start_test.go +++ b/start_test.go @@ -106,3 +106,20 @@ func TestParseConcurrencyFlagNoValue(t *testing.T) { } } + +func TestMultipleEnvironmentFiles(t *testing.T) { + envs := []string{"fixtures/envs/.env1", "fixtures/envs/.env2"} + env, err := parseEnvironment(envs) + + if err != nil { + t.Fatalf("Could not read environments: %s", err) + } + + if env["env1"] == "" { + t.Fatalf("$env1 should be present and is not") + } + + if env["env2"] == "" { + t.Fatalf("$env2 should be present and is not") + } +}