Skip to content

Commit f9a9472

Browse files
committed
Fix load and run, add environment variable
* Fix load and run for sh, bash and zsh * Add 2 environment variables with the name of the workspace and the workspace environment
1 parent 6488cf6 commit f9a9472

File tree

2 files changed

+113
-21
lines changed

2 files changed

+113
-21
lines changed

workspace/workspace.go

Lines changed: 48 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ import (
1818
)
1919

2020
const configDir = ".config/wo"
21+
const envVariablePrefix = "WO"
22+
23+
const bash = "bash"
24+
const fish = "fish"
25+
const sh = "sh"
26+
const zsh = "zsh"
2127

2228
type Workspace struct {
2329
Name string
@@ -130,15 +136,23 @@ func (s WorkspaceManager) Edit(name string) error {
130136
}
131137

132138
func (s WorkspaceManager) EditEnv(name string, env string) error {
139+
err := s.createWorkspaceEnvFolder(name)
140+
if err != nil {
141+
return err
142+
}
143+
err = s.createWorkspaceDefaultEnv(name)
144+
if err != nil {
145+
return err
146+
}
133147
return s.edit(s.resolveWorkspaceEnvFile(name, env))
134148
}
135149

136150
func (s WorkspaceManager) Load(name string, env string) error {
137-
return s.execCommand(s.appendLoadStatement(name, env)...)
151+
return s.execCommand(s.appendLoadStatement(name, env, []string{})...)
138152
}
139153

140154
func (s WorkspaceManager) RunFunction(name string, env string, functionAndArgs []string) error {
141-
return s.execCommand(s.appendLoadStatement(name, env, "-c", strings.Join(functionAndArgs, " "))...)
155+
return s.execCommand(s.appendLoadStatement(name, env, functionAndArgs)...)
142156
}
143157

144158
func (s WorkspaceManager) Remove(name string) error {
@@ -149,15 +163,31 @@ func (s WorkspaceManager) Remove(name string) error {
149163
return errors.Join(os.Remove(s.resolveFunctionFile(name)), os.RemoveAll(s.getWorkspaceEnvDir(name)))
150164
}
151165

152-
func (s WorkspaceManager) appendLoadStatement(name string, env string, cmds ...string) []string {
153-
stmts := []string{}
166+
func (s WorkspaceManager) appendLoadStatement(name string, env string, functionAndArgs []string) []string {
167+
data := []string{}
168+
data = append(data, s.createEnvVariableStatement(fmt.Sprintf("%s_NAME", envVariablePrefix), name))
169+
data = append(data, s.createEnvVariableStatement(fmt.Sprintf("%s_ENV", envVariablePrefix), s.resolveEnv(env)))
154170
envFile := s.resolveWorkspaceEnvFile(name, env)
155171
_, eerr := os.Stat(envFile)
156172
if eerr == nil {
157-
stmts = append(stmts, "-C", fmt.Sprintf("source %s", envFile))
173+
data = append(data, fmt.Sprintf("source %s", envFile))
174+
}
175+
data = append(data, fmt.Sprintf("source %s", s.resolveFunctionFile(name)))
176+
stmts := []string{}
177+
switch s.shell {
178+
case bash, sh, zsh:
179+
if len(functionAndArgs) > 0 {
180+
data = append(data, strings.Join(functionAndArgs, " "))
181+
}
182+
stmts = append(stmts, "-c", strings.Join(data, " && "))
183+
case fish:
184+
for _, d := range data {
185+
stmts = append(stmts, "-C", d)
186+
}
187+
if len(functionAndArgs) > 0 {
188+
stmts = append(stmts, "-c", strings.Join(functionAndArgs, " "))
189+
}
158190
}
159-
stmts = append(stmts, "-C", fmt.Sprintf("source %s", s.resolveFunctionFile(name)))
160-
stmts = append(stmts, cmds...)
161191
return stmts
162192
}
163193

@@ -199,7 +229,7 @@ func (s WorkspaceManager) resolveWorkspaceEnvFile(name string, env string) strin
199229
}
200230

201231
func (s WorkspaceManager) getExtension() string {
202-
for _, shell := range []string{"fish", "bash", "zsh", "sh"} {
232+
for _, shell := range []string{fish, bash, zsh, sh} {
203233
if strings.Contains(s.shellBin, shell) {
204234
return shell
205235
}
@@ -236,6 +266,16 @@ func (s WorkspaceManager) getWorkspaceEnvDir(name string) string {
236266
return fmt.Sprintf("%s/%s", s.getEnvDir(), name)
237267
}
238268

269+
func (s WorkspaceManager) createEnvVariableStatement(name string, value string) string {
270+
switch s.shell {
271+
case bash, sh, zsh:
272+
return fmt.Sprintf("export %s=%s", name, value)
273+
case fish:
274+
return fmt.Sprintf("set -x -g %s %s", name, value)
275+
}
276+
return ""
277+
}
278+
239279
func execCommand(shellBin string) func(args ...string) error {
240280
return func(args ...string) error {
241281
command := exec.Command(shellBin, args...)

workspace/workspace_test.go

Lines changed: 65 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -294,24 +294,49 @@ func TestLoad(t *testing.T) {
294294
}
295295
scenarios := []scenario{
296296
{
297-
"Load workspace",
297+
"Load workspace with a bash shell",
298298
"",
299299
func() {
300+
os.Setenv("SHELL", "bash")
301+
},
302+
func(args []string) {
303+
assert.Equal(t, []string{"-c", "export WO_NAME=test && export WO_ENV=default && source " + getHomePath(t) + "/.config/wo/functions/bash/test.bash"}, args)
304+
},
305+
},
306+
{
307+
"Load workspace with a fish shell",
308+
"",
309+
func() {
310+
os.Setenv("SHELL", "fish")
300311
},
301312
func(args []string) {
302-
assert.Equal(t, []string{"-C", "source " + getHomePath(t) + "/.config/wo/functions/bash/test.bash"}, args)
313+
assert.Equal(t, []string{"-C", "set -x -g WO_NAME test", "-C", "set -x -g WO_ENV default", "-C", "source " + getHomePath(t) + "/.config/wo/functions/fish/test.fish"}, args)
303314
},
304315
},
305316
{
306-
"Load workspace with an env defined",
317+
"Load workspace with an env defined and a bash shell",
307318
"prod",
308319
func() {
309320
envPath := getConfigPath(t) + "/envs/bash"
310321
assert.NoError(t, os.MkdirAll(envPath+"/test", 0777))
311322
assert.NoError(t, os.WriteFile(envPath+"/test/prod.bash", []byte{}, 0777))
323+
os.Setenv("SHELL", "bash")
324+
},
325+
func(args []string) {
326+
assert.Equal(t, []string{"-c", "export WO_NAME=test && export WO_ENV=prod && source " + getHomePath(t) + "/.config/wo/envs/bash/test/prod.bash && source " + getHomePath(t) + "/.config/wo/functions/bash/test.bash"}, args)
327+
},
328+
},
329+
{
330+
"Load workspace with an env defined and a fish shell",
331+
"prod",
332+
func() {
333+
envPath := getConfigPath(t) + "/envs/fish"
334+
assert.NoError(t, os.MkdirAll(envPath+"/test", 0777))
335+
assert.NoError(t, os.WriteFile(envPath+"/test/prod.fish", []byte{}, 0777))
336+
os.Setenv("SHELL", "fish")
312337
},
313338
func(args []string) {
314-
assert.Equal(t, []string{"-C", "source " + getHomePath(t) + "/.config/wo/envs/bash/test/prod.bash", "-C", "source " + getHomePath(t) + "/.config/wo/functions/bash/test.bash"}, args)
339+
assert.Equal(t, []string{"-C", "set -x -g WO_NAME test", "-C", "set -x -g WO_ENV prod", "-C", "source " + getHomePath(t) + "/.config/wo/envs/fish/test/prod.fish", "-C", "source " + getHomePath(t) + "/.config/wo/functions/fish/test.fish"}, args)
315340
},
316341
},
317342
}
@@ -320,15 +345,15 @@ func TestLoad(t *testing.T) {
320345
os.RemoveAll(getConfigPath(t))
321346
os.Setenv("VISUAL", "emacs")
322347
os.Setenv("EDITOR", "emacs")
323-
os.Setenv("SHELL", "bash")
348+
os.Unsetenv("SHELL")
349+
s.setup()
324350
w, err := NewWorkspaceManager()
325351
args := []string{}
326352
w.execCommand = func(a ...string) error {
327353
args = a
328354
return nil
329355
}
330356
assert.NoError(t, err)
331-
s.setup()
332357
assert.NoError(t, w.Load("test", s.env))
333358
s.test(args)
334359
})
@@ -345,43 +370,70 @@ func TestRunFunction(t *testing.T) {
345370
}
346371
scenarios := []scenario{
347372
{
348-
"Run function",
373+
"Run a function with a bash shell",
349374
[]string{"run-db"},
350375
"",
351376
func() {
377+
os.Setenv("SHELL", "/bin/bash")
352378
},
353379
func(args []string) {
354-
assert.Equal(t, []string{"-C", "source " + getHomePath(t) + "/.config/wo/functions/bash/test.bash", "-c", "run-db"}, args)
380+
assert.Equal(t, []string{"-c", "export WO_NAME=test && export WO_ENV=default && source " + getHomePath(t) + "/.config/wo/functions/bash/test.bash && run-db"}, args)
355381
},
356382
},
357383
{
358-
"Run a function with an env defined",
359-
[]string{"run-db", "--watch"},
384+
"Run a function with a fish shell",
385+
[]string{"run-db"},
386+
"",
387+
func() {
388+
os.Setenv("SHELL", "/bin/fish")
389+
},
390+
func(args []string) {
391+
assert.Equal(t, []string{"-C", "set -x -g WO_NAME test", "-C", "set -x -g WO_ENV default", "-C", "source " + getHomePath(t) + "/.config/wo/functions/fish/test.fish", "-c", "run-db"}, args)
392+
},
393+
},
394+
{
395+
"Run a function with an env defined and a bash shell",
396+
[]string{"run-db", "watch"},
360397
"prod",
361398
func() {
362399
envPath := getConfigPath(t) + "/envs/bash"
363400
assert.NoError(t, os.MkdirAll(envPath+"/test", 0777))
364401
assert.NoError(t, os.WriteFile(envPath+"/test/prod.bash", []byte{}, 0777))
402+
os.Setenv("SHELL", "/bin/bash")
365403
},
366404
func(args []string) {
367-
assert.Equal(t, []string{"-C", "source " + getHomePath(t) + "/.config/wo/envs/bash/test/prod.bash", "-C", "source " + getHomePath(t) + "/.config/wo/functions/bash/test.bash", "-c", "run-db --watch"}, args)
405+
assert.Equal(t, []string{"-c", "export WO_NAME=test && export WO_ENV=prod && source " + getHomePath(t) + "/.config/wo/envs/bash/test/prod.bash && source " + getHomePath(t) + "/.config/wo/functions/bash/test.bash && run-db watch"}, args)
406+
},
407+
},
408+
{
409+
"Run a function with an env defined and a fish shell",
410+
[]string{"run-db", "watch"},
411+
"prod",
412+
func() {
413+
envPath := getConfigPath(t) + "/envs/fish"
414+
assert.NoError(t, os.MkdirAll(envPath+"/test", 0777))
415+
assert.NoError(t, os.WriteFile(envPath+"/test/prod.fish", []byte{}, 0777))
416+
os.Setenv("SHELL", "/bin/fish")
417+
},
418+
func(args []string) {
419+
assert.Equal(t, []string{"-C", "set -x -g WO_NAME test", "-C", "set -x -g WO_ENV prod", "-C", "source " + getHomePath(t) + "/.config/wo/envs/fish/test/prod.fish", "-C", "source " + getHomePath(t) + "/.config/wo/functions/fish/test.fish", "-c", "run-db watch"}, args)
368420
},
369421
},
370422
}
371423
for _, s := range scenarios {
372424
t.Run(s.name, func(t *testing.T) {
373425
os.RemoveAll(getConfigPath(t))
426+
os.Unsetenv("SHELL")
374427
os.Setenv("VISUAL", "emacs")
375428
os.Setenv("EDITOR", "emacs")
376-
os.Setenv("SHELL", "bash")
429+
s.setup()
377430
w, err := NewWorkspaceManager()
378431
args := []string{}
379432
w.execCommand = func(a ...string) error {
380433
args = a
381434
return nil
382435
}
383436
assert.NoError(t, err)
384-
s.setup()
385437
assert.NoError(t, w.RunFunction("test", s.env, s.functionAndArgs))
386438
s.test(args)
387439
})

0 commit comments

Comments
 (0)