@@ -4,23 +4,81 @@ import (
44 "fmt"
55 "net/url"
66 "os"
7- "path/filepath"
87 "strings"
8+ "text/template"
99
1010 log "github.com/Sirupsen/logrus"
1111
1212 "github.com/codegangsta/cli"
1313 "github.com/docker/machine/utils"
1414)
1515
16+ const (
17+ envTmpl = `{{ .Prefix }}DOCKER_TLS_VERIFY{{ .Delimiter }}{{ .DockerTLSVerify }}{{ .Suffix }}{{ .Prefix }}DOCKER_HOST{{ .Delimiter }}{{ .DockerHost }}{{ .Suffix }}{{ .Prefix }}DOCKER_CERT_PATH{{ .Delimiter }}{{ .DockerCertPath }}{{ .Suffix }}{{ .UsageHint }}`
18+ )
19+
20+ type ShellConfig struct {
21+ Prefix string
22+ Delimiter string
23+ Suffix string
24+ DockerCertPath string
25+ DockerHost string
26+ DockerTLSVerify string
27+ UsageHint string
28+ }
29+
1630func cmdEnv (c * cli.Context ) {
17- userShell := filepath .Base (os .Getenv ("SHELL" ))
31+ userShell := c .String ("shell" )
32+ if userShell == "" {
33+ shell , err := detectShell ()
34+ if err != nil {
35+ log .Fatal (err )
36+ }
37+ userShell = shell
38+ }
39+
40+ t := template .New ("envConfig" )
41+
42+ usageHint := generateUsageHint (c .App .Name , c .Args ().First (), userShell )
43+
44+ shellCfg := ShellConfig {
45+ DockerCertPath : "" ,
46+ DockerHost : "" ,
47+ DockerTLSVerify : "" ,
48+ }
49+
50+ // unset vars
1851 if c .Bool ("unset" ) {
1952 switch userShell {
2053 case "fish" :
21- fmt .Printf ("set -e DOCKER_TLS_VERIFY;\n set -e DOCKER_CERT_PATH;\n set -e DOCKER_HOST;\n " )
54+ shellCfg .Prefix = "set -e "
55+ shellCfg .Delimiter = ""
56+ shellCfg .Suffix = ";\n "
57+ case "powershell" :
58+ shellCfg .Prefix = "Remove-Item Env:\\ \\ "
59+ shellCfg .Delimiter = ""
60+ shellCfg .Suffix = "\n "
61+ case "cmd" :
62+ // since there is no way to unset vars in cmd just reset to empty
63+ shellCfg .DockerCertPath = ""
64+ shellCfg .DockerHost = ""
65+ shellCfg .DockerTLSVerify = ""
66+ shellCfg .Prefix = "set "
67+ shellCfg .Delimiter = "="
68+ shellCfg .Suffix = "\n "
2269 default :
23- fmt .Println ("unset DOCKER_TLS_VERIFY DOCKER_CERT_PATH DOCKER_HOST" )
70+ shellCfg .Prefix = "unset "
71+ shellCfg .Delimiter = " "
72+ shellCfg .Suffix = "\n "
73+ }
74+
75+ tmpl , err := t .Parse (envTmpl )
76+ if err != nil {
77+ log .Fatal (err )
78+ }
79+
80+ if err := tmpl .Execute (os .Stdout , shellCfg ); err != nil {
81+ log .Fatal (err )
2482 }
2583 return
2684 }
@@ -31,7 +89,7 @@ func cmdEnv(c *cli.Context) {
3189 }
3290
3391 if cfg .machineUrl == "" {
34- log .Fatalf ("%s is not running. Please start this with docker-machine start %s" , cfg .machineName , cfg .machineName )
92+ log .Fatalf ("%s is not running. Please start this with %s start %s" , cfg .machineName , c . App . Name , cfg .machineName )
3593 }
3694
3795 dockerHost := cfg .machineUrl
@@ -83,32 +141,64 @@ func cmdEnv(c *cli.Context) {
83141 }
84142 }
85143
86- usageHint := generateUsageHint (c .Args ().First (), userShell )
144+ shellCfg = ShellConfig {
145+ DockerCertPath : cfg .machineDir ,
146+ DockerHost : dockerHost ,
147+ DockerTLSVerify : "1" ,
148+ UsageHint : usageHint ,
149+ }
87150
88151 switch userShell {
89152 case "fish" :
90- fmt .Printf ("set -x DOCKER_TLS_VERIFY 1;\n set -x DOCKER_CERT_PATH %q;\n set -x DOCKER_HOST %s;\n \n %s\n " ,
91- cfg .machineDir , dockerHost , usageHint )
153+ shellCfg .Prefix = "set -x "
154+ shellCfg .Suffix = "\" ;\n "
155+ shellCfg .Delimiter = " \" "
156+ case "powershell" :
157+ shellCfg .Prefix = "$Env:"
158+ shellCfg .Suffix = "\" \n "
159+ shellCfg .Delimiter = " = \" "
160+ case "cmd" :
161+ shellCfg .Prefix = "set "
162+ shellCfg .Suffix = "\n "
163+ shellCfg .Delimiter = "="
92164 default :
93- fmt .Printf ("export DOCKER_TLS_VERIFY=1\n export DOCKER_CERT_PATH=%q\n export DOCKER_HOST=%s\n \n %s\n " ,
94- cfg .machineDir , dockerHost , usageHint )
165+ shellCfg .Prefix = "export "
166+ shellCfg .Suffix = "\" \n "
167+ shellCfg .Delimiter = "=\" "
168+ }
169+
170+ tmpl , err := t .Parse (envTmpl )
171+ if err != nil {
172+ log .Fatal (err )
173+ }
174+
175+ if err := tmpl .Execute (os .Stdout , shellCfg ); err != nil {
176+ log .Fatal (err )
95177 }
96178}
97179
98- func generateUsageHint (machineName string , userShell string ) string {
180+ func generateUsageHint (appName , machineName , userShell string ) string {
99181 cmd := ""
100182 switch userShell {
101183 case "fish" :
102184 if machineName != "" {
103- cmd = fmt .Sprintf ("eval (docker-machine env %s)" , machineName )
185+ cmd = fmt .Sprintf ("eval (%s env %s)" , appName , machineName )
186+ } else {
187+ cmd = fmt .Sprintf ("eval (%s env)" , appName )
188+ }
189+ case "powershell" :
190+ if machineName != "" {
191+ cmd = fmt .Sprintf ("%s env --shell=powershell %s | Invoke-Expression" , appName , machineName )
104192 } else {
105- cmd = "eval (docker-machine env)"
193+ cmd = fmt . Sprintf ( "%s env --shell=powershell | Invoke-Expression" , appName )
106194 }
195+ case "cmd" :
196+ cmd = "copy and paste the above values into your command prompt"
107197 default :
108198 if machineName != "" {
109- cmd = fmt .Sprintf ("eval \" $(docker-machine env %s)\" " , machineName )
199+ cmd = fmt .Sprintf ("eval \" $(%s env %s)\" " , appName , machineName )
110200 } else {
111- cmd = "eval \" $(docker-machine env)\" "
201+ cmd = fmt . Sprintf ( "eval \" $(%s env)\" " , appName )
112202 }
113203 }
114204
0 commit comments