-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathbash-env.elv
62 lines (53 loc) · 1.47 KB
/
bash-env.elv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# Bash Environment import for Elvish
use str
fn bash-env { |&shellvars=$nil &fn=[] @path|
if (> (count $path) 1) {
fail "bash-env takes zero (for stdin) or one argument (for path) only"
}
var args = ({
if (not-eq $fn []) {
put --shellfns (str:join , $fn)
}
put (all $path)
} | put [(all)])
var raw-text = (var ok = ?(bash-env-json (all $args) | slurp))
if (not $ok) {
fail $ok
}
var raw = (echo $raw-text | from-json)
# on failure prefer to show the JSON error if possible
if (has-key $raw error) {
fail $raw[error]
}
keys $raw[env] | each {|k|
var v = $raw[env][$k]
if (eq $v $nil) {
unset-env $k
} else {
set-env $k $raw[env][$k]
}
}
# output only if we have shellvars or fn
if (or (not-eq $shellvars $nil) (not-eq $fn [])) {
{
if (not-eq $shellvars $nil) { put [shellvars $raw[shellvars]] }
if (not-eq $fn []) {
# build a map of functions which set the environment accordingly
var functions = (keys $raw[fn] | each {|name|
var named_f = {
for k (keys $raw[fn][$name][env] | put [(all)]) {
var v = $raw[fn][$name][env][$k]
if (eq $v $nil) {
unset-env $k
} else {
set-env $k $v
}
}
}
put [$name $named_f]
} | make-map)
put [fn $functions]
}
} | make-map
}
}