From 4f5c747c9961bee9bb82e1b5a46a6ec16b02c609 Mon Sep 17 00:00:00 2001 From: Alex Quick Date: Sun, 16 Jul 2017 19:50:50 -0400 Subject: [PATCH] [config] add config:export --format shell --- plugins/config/src/configenv/configenv.go | 15 +++++++++++++++ plugins/config/src/configenv/configenv_test.go | 1 + plugins/config/src/subcommands/export/export.go | 8 ++++++-- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/plugins/config/src/configenv/configenv.go b/plugins/config/src/configenv/configenv.go index 7300f8e7d..5feef46b7 100644 --- a/plugins/config/src/configenv/configenv.go +++ b/plugins/config/src/configenv/configenv.go @@ -16,12 +16,18 @@ import ( common "github.com/dokku/dokku/plugins/common" ) +//ExportFormat types of possible exports type ExportFormat int const ( + //Exports format: Sourceable exports Exports ExportFormat = iota + //Envfile format: dotenv file Envfile + //DockerArgs format: --env args for docker DockerArgs + //Shell format: env arguments for shell + Shell ) //Env is a representation for global or app environment @@ -35,6 +41,7 @@ func (e *Env) String() string { return e.EnvfileString() } +//Export the Env in the given format func (e *Env) Export(format ExportFormat) string { switch format { case Exports: @@ -43,6 +50,8 @@ func (e *Env) Export(format ExportFormat) string { return e.EnvfileString() case DockerArgs: return e.DockerArgsString() + case Shell: + return e.ShellString() default: common.LogFail(fmt.Sprintf("Unknown export format: %v", format)) return "" @@ -65,6 +74,12 @@ func (e *Env) DockerArgsString() string { return e.stringWithPrefixAndSeparator("--env=", " ", true) } +//ShellString gets the contents of this Env in the form "KEY='value' KEY2='value'" +// for passing the environment in the shell +func (e *Env) ShellString() string { + return e.stringWithPrefixAndSeparator("", " ", true) +} + //StringWithPrefixAndSeparator makes a string of the environment // with the given prefix and separator for each entry func (e *Env) stringWithPrefixAndSeparator(prefix string, separator string, allowNewlines bool) string { diff --git a/plugins/config/src/configenv/configenv_test.go b/plugins/config/src/configenv/configenv_test.go index 9b86ae452..9d423e95e 100644 --- a/plugins/config/src/configenv/configenv_test.go +++ b/plugins/config/src/configenv/configenv_test.go @@ -50,6 +50,7 @@ func TestArrayExport(t *testing.T) { e, _ := NewFromString("BAR='BAZ'\nFOO='b'ar '") Expect(e.EnvfileString()).To(Equal("BAR=\"BAZ\"\nFOO=\"b'ar \"")) Expect(e.DockerArgsString()).To(Equal("--env=BAR='BAZ' --env=FOO='b'\\''ar '")) + Expect(e.ShellString()).To(Equal("BAR='BAZ' FOO='b'\\''ar '")) } func pairs(vars ...string) map[string]string { diff --git a/plugins/config/src/subcommands/export/export.go b/plugins/config/src/subcommands/export/export.go index 24840ebf3..0c9027fbc 100644 --- a/plugins/config/src/subcommands/export/export.go +++ b/plugins/config/src/subcommands/export/export.go @@ -17,7 +17,7 @@ func main() { args := flag.NewFlagSet("config:export", flag.ExitOnError) global := args.Bool("global", false, "--global: use the global environment") merged := args.Bool("merged", false, "--merged: merge app environment and global environment") - format := args.String("format", "exports", "--format: [ exports | envfile | docker-args ] which format to export as)") + format := args.String("format", "exports", "--format: [ exports | envfile | docker-args | shell ] which format to export as)") args.Parse(os.Args[2:]) appName, trailingArgs := config.GetCommonArgs(*global, args.Args()) @@ -27,6 +27,7 @@ func main() { env := config.GetConfig(appName, *merged) exportType := configenv.Exports + suffix := "\n" switch *format { case "exports": exportType = configenv.Exports @@ -34,9 +35,12 @@ func main() { exportType = configenv.Envfile case "docker-args": exportType = configenv.DockerArgs + case "shell": + exportType = configenv.Shell + suffix = " " default: common.LogFail(fmt.Sprintf("Unknown export format: %v", *format)) } exported := env.Export(exportType) - fmt.Println(exported) + fmt.Print(exported + suffix) }