Skip to content

Commit cd4bc74

Browse files
committed
Allow env variables to be set via 'daemon env' command
Finally an easy way to use it with an SSH_AGENT
1 parent 599cae3 commit cd4bc74

File tree

4 files changed

+68
-2
lines changed

4 files changed

+68
-2
lines changed

common/config/v1.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111

1212
type ConfigV1 struct {
1313
Repos []string `json:"repos"`
14+
Envs []string `json:"envs"`
1415
}
1516

1617
func ReadV1() (*ConfigV1, error) {

common/config/v1_test.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,10 @@ func setup(t *testing.T, name string) {
2121
func Test_SimpleWriteReadV1(t *testing.T) {
2222
setup(t, "SimpleWriteRead")
2323

24-
c := &ConfigV1{Repos: []string{"/home/xyz/hello"}}
24+
c := &ConfigV1{
25+
Repos: []string{"/home/xyz/hello"},
26+
Envs: []string{"SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.74ZznY1v1F/Listeners"},
27+
}
2528
err := WriteV1(c)
2629
assert.NilError(t, err)
2730

daemon.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ package main
33
import (
44
"errors"
55
"fmt"
6+
"log"
67
"os"
78
"path/filepath"
9+
"strings"
810

911
"github.com/GitJournal/git-auto-sync/common"
1012
cfg "github.com/GitJournal/git-auto-sync/common/config"
@@ -183,6 +185,62 @@ func daemonRm(ctx *cli.Context) error {
183185
return nil
184186
}
185187

188+
func daemonEnv(ctx *cli.Context) error {
189+
vars := ctx.Args().Slice()
190+
191+
for _, v := range vars {
192+
if !strings.Contains(v, "=") {
193+
log.Fatalln("Env variables must be in the format 'key=value'")
194+
}
195+
}
196+
197+
config, err := cfg.Read()
198+
if err != nil {
199+
return tracerr.Wrap(err)
200+
}
201+
202+
envMap := toEnvMap(config.Envs)
203+
newMap := toEnvMap(vars)
204+
205+
for k, v := range newMap {
206+
envMap[k] = v
207+
}
208+
209+
config.Envs = toEnvStrings(envMap)
210+
err = cfg.Write(config)
211+
if err != nil {
212+
return tracerr.Wrap(err)
213+
}
214+
215+
fmt.Println(strings.Join(config.Envs, "\n"))
216+
217+
return nil
218+
}
219+
186220
func remove(slice []string, s int) []string {
187221
return append(slice[:s], slice[s+1:]...)
188222
}
223+
224+
func toEnvMap(envs []string) map[string]string {
225+
m := map[string]string{}
226+
for _, e := range envs {
227+
parts := strings.Split(e, "=")
228+
if len(parts) > 1 {
229+
m[parts[0]] = strings.Join(parts[1:], "=")
230+
} else {
231+
m[e] = ""
232+
}
233+
}
234+
235+
return m
236+
}
237+
238+
func toEnvStrings(m map[string]string) []string {
239+
vals := []string{}
240+
for k, v := range m {
241+
x := fmt.Sprintf("%s=%s", k, v)
242+
vals = append(vals, x)
243+
}
244+
245+
return vals
246+
}

main.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,13 +141,17 @@ func main() {
141141
Usage: "Add a repo for auto-sync",
142142
Action: daemonAdd,
143143
},
144-
145144
{
146145
Name: "remove",
147146
Aliases: []string{"rm"},
148147
Usage: "Remove a repo from auto-sync",
149148
Action: daemonRm,
150149
},
150+
{
151+
Name: "env",
152+
Usage: "Set an environment variable",
153+
Action: daemonEnv,
154+
},
151155
},
152156
},
153157
},

0 commit comments

Comments
 (0)