Skip to content

Commit f4655e2

Browse files
authored
Add option to prepend or append shims directory to PATH (#417)
- Added functionality to allow shims directory to be added to the beginning or end of the PATH. - Updated ENVIRONMENT_VARIABLES.md to include the new environment variables and their behavior. Co-authored-by: y-shinji <[email protected]>
1 parent 6d10fe6 commit f4655e2

File tree

3 files changed

+167
-91
lines changed

3 files changed

+167
-91
lines changed

ENVIRONMENT_VARIABLES.md

+2
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,5 @@ name | default | description
1717
`GOENV_GOMOD_VERSION_ENABLE` | | if `GOENV_GOMOD_VERSION_ENABLE` is set to 1, it will try to use the project's `go.mod` file to get the version.
1818
`GOENV_AUTO_INSTALL` | | if `GOENV_AUTO_INSTALL` is set to 1, it will automatically run install if no command arguments specified (just run `goenv`!)
1919
`GOENV_AUTO_INSTALL_FLAGS` | | (Note: only works if `GOENV_AUTO_INSTALL` is set to 1) Appends flags to the auto install command (see `goenv install --help` for all available flags)
20+
`GOENV_RC_FILE` | `$HOME/.goenvrc` | If `GOENV_RC_FILE` is set, it will be modified accordingly.
21+
`GOENV_PATH_ORDER` | | If `GOENV_PATH_ORDER` is set to `front`, `$GOENV_ROOT/shims` will be prepended to the existing `PATH`.Set `GOENV_PATH_ORDER` to a configuration file named by `GOENV_RC_FILE`(e.g. `~/.goenvrc`), for example `GOENV_PATH_ORDER=front` in `~/.goenvrc`.

libexec/goenv-init

+34-12
Original file line numberDiff line numberDiff line change
@@ -87,20 +87,42 @@ mkdir -p "${GOENV_ROOT}/"{shims,versions}
8787

8888
case "$shell" in
8989
fish )
90-
echo "set -gx GOENV_SHELL $shell"
91-
echo "set -gx GOENV_ROOT $GOENV_ROOT"
92-
93-
echo 'if not contains $GOENV_ROOT/shims $PATH'
94-
echo ' set -gx PATH $PATH $GOENV_ROOT/shims'
95-
echo 'end'
90+
cat <<EOL
91+
set -gx GOENV_SHELL ${shell}
92+
set -gx GOENV_ROOT ${GOENV_ROOT}
93+
if test -z \$GOENV_RC_FILE
94+
set GOENV_RC_FILE \$HOME/.goenvrc
95+
end
96+
if test -e \$GOENV_RC_FILE
97+
source \$GOENV_RC_FILE
98+
end
99+
if not contains \$GOENV_ROOT/shims \$PATH
100+
if test "\$GOENV_PATH_ORDER" = "front"
101+
set -gx PATH \$GOENV_ROOT/shims \$PATH
102+
else
103+
set -gx PATH \$PATH \$GOENV_ROOT/shims
104+
end
105+
end
106+
EOL
96107
;;
97108
* )
98-
echo "export GOENV_SHELL=$shell"
99-
echo "export GOENV_ROOT=$GOENV_ROOT"
100-
101-
echo 'if [ "${PATH#*$GOENV_ROOT/shims}" = "${PATH}" ]; then'
102-
echo ' export PATH="$PATH:$GOENV_ROOT/shims"'
103-
echo 'fi'
109+
cat <<EOL
110+
export GOENV_SHELL=${shell}
111+
export GOENV_ROOT=${GOENV_ROOT}
112+
if [ -z \${GOENV_RC_FILE} ]; then
113+
GOENV_RC_FILE=\${HOME}/.goenvrc
114+
fi
115+
if [ -e \${GOENV_RC_FILE} ]; then
116+
source \${GOENV_RC_FILE}
117+
fi
118+
if [ "\${PATH#*\$GOENV_ROOT/shims}" = "\${PATH}" ]; then
119+
if [ "\${GOENV_PATH_ORDER}" = "front" ] ; then
120+
export PATH="\${GOENV_ROOT}/shims:\${PATH}"
121+
else
122+
export PATH="\${PATH}:\${GOENV_ROOT}/shims"
123+
fi
124+
fi
125+
EOL
104126
;;
105127
esac
106128

test/goenv-init.bats

+131-79
Original file line numberDiff line numberDiff line change
@@ -135,24 +135,35 @@ OUT
135135

136136
assert_line 0 'export GOENV_SHELL=bash'
137137
assert_line 1 "export GOENV_ROOT=$GOENV_ROOT"
138-
assert_line 2 'if [ "${PATH#*$GOENV_ROOT/shims}" = "${PATH}" ]; then'
139-
assert_line 3 ' export PATH="$PATH:$GOENV_ROOT/shims"'
138+
assert_line 2 'if [ -z ${GOENV_RC_FILE} ]; then'
139+
assert_line 3 ' GOENV_RC_FILE=${HOME}/.goenvrc'
140140
assert_line 4 'fi'
141-
assert_line 5 "source '$BATS_TEST_DIRNAME/../libexec/../completions/goenv.bash'"
142-
assert_line 6 'command goenv rehash 2>/dev/null'
143-
assert_line 7 'goenv() {'
144-
assert_line 8 ' local command'
145-
assert_line 9 ' command="$1"'
146-
assert_line 10 ' if [ "$#" -gt 0 ]; then'
147-
assert_line 11 ' shift'
148-
assert_line 12 ' fi'
149-
assert_line 13 ' case "$command" in'
150-
assert_line 14 ' rehash|shell)'
151-
assert_line 15 ' eval "$(goenv "sh-$command" "$@")";;'
152-
assert_line 16 ' *)'
153-
assert_line 17 ' command goenv "$command" "$@";;'
154-
assert_line 18 ' esac'
155-
assert_line 19 '}'
141+
assert_line 5 'if [ -e ${GOENV_RC_FILE} ]; then'
142+
assert_line 6 ' source ${GOENV_RC_FILE}'
143+
assert_line 7 'fi'
144+
assert_line 8 'if [ "${PATH#*$GOENV_ROOT/shims}" = "${PATH}" ]; then'
145+
assert_line 9 ' if [ "${GOENV_PATH_ORDER}" = "front" ] ; then'
146+
assert_line 10 ' export PATH="${GOENV_ROOT}/shims:${PATH}"'
147+
assert_line 11 ' else'
148+
assert_line 12 ' export PATH="${PATH}:${GOENV_ROOT}/shims"'
149+
assert_line 13 ' fi'
150+
assert_line 14 'fi'
151+
assert_line 15 "source '$BATS_TEST_DIRNAME/../libexec/../completions/goenv.bash'"
152+
assert_line 16 'command goenv rehash 2>/dev/null'
153+
assert_line 17 'goenv() {'
154+
assert_line 18 ' local command'
155+
assert_line 19 ' command="$1"'
156+
assert_line 20 ' if [ "$#" -gt 0 ]; then'
157+
assert_line 21 ' shift'
158+
assert_line 22 ' fi'
159+
assert_line 23 ' case "$command" in'
160+
assert_line 24 ' rehash|shell)'
161+
assert_line 25 ' eval "$(goenv "sh-$command" "$@")";;'
162+
assert_line 26 ' *)'
163+
assert_line 27 ' command goenv "$command" "$@";;'
164+
assert_line 28 ' esac'
165+
assert_line 29 '}'
166+
156167

157168
assert_success
158169
}
@@ -162,24 +173,34 @@ OUT
162173

163174
assert_line 0 'export GOENV_SHELL=zsh'
164175
assert_line 1 "export GOENV_ROOT=$GOENV_ROOT"
165-
assert_line 2 'if [ "${PATH#*$GOENV_ROOT/shims}" = "${PATH}" ]; then'
166-
assert_line 3 ' export PATH="$PATH:$GOENV_ROOT/shims"'
176+
assert_line 2 'if [ -z ${GOENV_RC_FILE} ]; then'
177+
assert_line 3 ' GOENV_RC_FILE=${HOME}/.goenvrc'
167178
assert_line 4 'fi'
168-
assert_line 5 "source '$BATS_TEST_DIRNAME/../libexec/../completions/goenv.zsh'"
169-
assert_line 6 'command goenv rehash 2>/dev/null'
170-
assert_line 7 'goenv() {'
171-
assert_line 8 ' local command'
172-
assert_line 9 ' command="$1"'
173-
assert_line 10 ' if [ "$#" -gt 0 ]; then'
174-
assert_line 11 ' shift'
175-
assert_line 12 ' fi'
176-
assert_line 13 ' case "$command" in'
177-
assert_line 14 ' rehash|shell)'
178-
assert_line 15 ' eval "$(goenv "sh-$command" "$@")";;'
179-
assert_line 16 ' *)'
180-
assert_line 17 ' command goenv "$command" "$@";;'
181-
assert_line 18 ' esac'
182-
assert_line 19 '}'
179+
assert_line 5 'if [ -e ${GOENV_RC_FILE} ]; then'
180+
assert_line 6 ' source ${GOENV_RC_FILE}'
181+
assert_line 7 'fi'
182+
assert_line 8 'if [ "${PATH#*$GOENV_ROOT/shims}" = "${PATH}" ]; then'
183+
assert_line 9 ' if [ "${GOENV_PATH_ORDER}" = "front" ] ; then'
184+
assert_line 10 ' export PATH="${GOENV_ROOT}/shims:${PATH}"'
185+
assert_line 11 ' else'
186+
assert_line 12 ' export PATH="${PATH}:${GOENV_ROOT}/shims"'
187+
assert_line 13 ' fi'
188+
assert_line 14 'fi'
189+
assert_line 15 "source '$BATS_TEST_DIRNAME/../libexec/../completions/goenv.zsh'"
190+
assert_line 16 'command goenv rehash 2>/dev/null'
191+
assert_line 17 'goenv() {'
192+
assert_line 18 ' local command'
193+
assert_line 19 ' command="$1"'
194+
assert_line 20 ' if [ "$#" -gt 0 ]; then'
195+
assert_line 21 ' shift'
196+
assert_line 22 ' fi'
197+
assert_line 23 ' case "$command" in'
198+
assert_line 24 ' rehash|shell)'
199+
assert_line 25 ' eval "$(goenv "sh-$command" "$@")";;'
200+
assert_line 26 ' *)'
201+
assert_line 27 ' command goenv "$command" "$@";;'
202+
assert_line 28 ' esac'
203+
assert_line 29 '}'
183204

184205
assert_success
185206
}
@@ -189,21 +210,31 @@ OUT
189210

190211
assert_line 0 'set -gx GOENV_SHELL fish'
191212
assert_line 1 "set -gx GOENV_ROOT $GOENV_ROOT"
192-
assert_line 2 'if not contains $GOENV_ROOT/shims $PATH'
193-
assert_line 3 ' set -gx PATH $PATH $GOENV_ROOT/shims'
213+
assert_line 2 'if test -z $GOENV_RC_FILE'
214+
assert_line 3 ' set GOENV_RC_FILE $HOME/.goenvrc'
194215
assert_line 4 'end'
195-
assert_line 5 "source '$BATS_TEST_DIRNAME/../libexec/../completions/goenv.fish'"
196-
assert_line 6 'command goenv rehash 2>/dev/null'
197-
assert_line 7 'function goenv'
198-
assert_line 8 ' set command $argv[1]'
199-
assert_line 9 ' set -e argv[1]'
200-
assert_line 10 ' switch "$command"'
201-
assert_line 11 ' case rehash shell'
202-
assert_line 12 ' source (goenv "sh-$command" $argv|psub)'
203-
assert_line 13 " case '*'"
204-
assert_line 14 ' command goenv "$command" $argv'
205-
assert_line 15 ' end'
206-
assert_line 16 'end'
216+
assert_line 5 'if test -e $GOENV_RC_FILE'
217+
assert_line 6 ' source $GOENV_RC_FILE'
218+
assert_line 7 'end'
219+
assert_line 8 'if not contains $GOENV_ROOT/shims $PATH'
220+
assert_line 9 ' if test "$GOENV_PATH_ORDER" = "front"'
221+
assert_line 10 ' set -gx PATH $GOENV_ROOT/shims $PATH'
222+
assert_line 11 ' else'
223+
assert_line 12 ' set -gx PATH $PATH $GOENV_ROOT/shims'
224+
assert_line 13 ' end'
225+
assert_line 14 'end'
226+
assert_line 15 "source '$BATS_TEST_DIRNAME/../libexec/../completions/goenv.fish'"
227+
assert_line 16 'command goenv rehash 2>/dev/null'
228+
assert_line 17 'function goenv'
229+
assert_line 18 ' set command $argv[1]'
230+
assert_line 19 ' set -e argv[1]'
231+
assert_line 20 ' switch "$command"'
232+
assert_line 21 ' case rehash shell'
233+
assert_line 22 ' source (goenv "sh-$command" $argv|psub)'
234+
assert_line 23 " case '*'"
235+
assert_line 24 ' command goenv "$command" $argv'
236+
assert_line 25 ' end'
237+
assert_line 26 'end'
207238

208239
assert_success
209240
}
@@ -213,22 +244,33 @@ OUT
213244

214245
assert_line 0 'export GOENV_SHELL=ksh'
215246
assert_line 1 "export GOENV_ROOT=$GOENV_ROOT"
216-
assert_line 2 'if [ "${PATH#*$GOENV_ROOT/shims}" = "${PATH}" ]; then'
217-
assert_line 3 ' export PATH="$PATH:$GOENV_ROOT/shims"'
247+
assert_line 2 'if [ -z ${GOENV_RC_FILE} ]; then'
248+
assert_line 3 ' GOENV_RC_FILE=${HOME}/.goenvrc'
218249
assert_line 4 'fi'
219-
assert_line 5 'command goenv rehash 2>/dev/null'
220-
assert_line 6 'function goenv {'
221-
assert_line 7 ' typeset command'
222-
assert_line 8 ' command="$1"'
223-
assert_line 9 ' if [ "$#" -gt 0 ]; then'
224-
assert_line 10 ' shift'
225-
assert_line 11 ' fi'
226-
assert_line 12 ' case "$command" in'
227-
assert_line 13 ' rehash|shell)'
228-
assert_line 14 ' eval "$(goenv "sh-$command" "$@")";;'
229-
assert_line 15 ' *)'
230-
assert_line 16 ' command goenv "$command" "$@";;'
231-
assert_line 17 ' esac'
250+
assert_line 5 'if [ -e ${GOENV_RC_FILE} ]; then'
251+
assert_line 6 ' source ${GOENV_RC_FILE}'
252+
assert_line 7 'fi'
253+
assert_line 8 'if [ "${PATH#*$GOENV_ROOT/shims}" = "${PATH}" ]; then'
254+
assert_line 9 ' if [ "${GOENV_PATH_ORDER}" = "front" ] ; then'
255+
assert_line 10 ' export PATH="${GOENV_ROOT}/shims:${PATH}"'
256+
assert_line 11 ' else'
257+
assert_line 12 ' export PATH="${PATH}:${GOENV_ROOT}/shims"'
258+
assert_line 13 ' fi'
259+
assert_line 14 'fi'
260+
assert_line 15 'command goenv rehash 2>/dev/null'
261+
assert_line 16 'function goenv {'
262+
assert_line 17 ' typeset command'
263+
assert_line 18 ' command="$1"'
264+
assert_line 19 ' if [ "$#" -gt 0 ]; then'
265+
assert_line 20 ' shift'
266+
assert_line 21 ' fi'
267+
assert_line 22 ' case "$command" in'
268+
assert_line 23 ' rehash|shell)'
269+
assert_line 24 ' eval "$(goenv "sh-$command" "$@")";;'
270+
assert_line 25 ' *)'
271+
assert_line 26 ' command goenv "$command" "$@";;'
272+
assert_line 27 ' esac'
273+
assert_line 28 '}'
232274

233275
assert_success
234276
}
@@ -239,23 +281,33 @@ OUT
239281
# NOTE: This is very likely to be invalid for your specific shell
240282
assert_line 0 'export GOENV_SHELL=magicshell'
241283
assert_line 1 "export GOENV_ROOT=$GOENV_ROOT"
242-
assert_line 2 'if [ "${PATH#*$GOENV_ROOT/shims}" = "${PATH}" ]; then'
243-
assert_line 3 ' export PATH="$PATH:$GOENV_ROOT/shims"'
284+
assert_line 2 'if [ -z ${GOENV_RC_FILE} ]; then'
285+
assert_line 3 ' GOENV_RC_FILE=${HOME}/.goenvrc'
244286
assert_line 4 'fi'
245-
assert_line 5 'command goenv rehash 2>/dev/null'
246-
assert_line 6 'goenv() {'
247-
assert_line 7 ' local command'
248-
assert_line 8 ' command="$1"'
249-
assert_line 9 ' if [ "$#" -gt 0 ]; then'
250-
assert_line 10 ' shift'
251-
assert_line 11 ' fi'
252-
assert_line 12 ' case "$command" in'
253-
assert_line 13 ' rehash|shell)'
254-
assert_line 14 ' eval "$(goenv "sh-$command" "$@")";;'
255-
assert_line 15 ' *)'
256-
assert_line 16 ' command goenv "$command" "$@";;'
257-
assert_line 17 ' esac'
258-
assert_line 18 '}'
287+
assert_line 5 'if [ -e ${GOENV_RC_FILE} ]; then'
288+
assert_line 6 ' source ${GOENV_RC_FILE}'
289+
assert_line 7 'fi'
290+
assert_line 8 'if [ "${PATH#*$GOENV_ROOT/shims}" = "${PATH}" ]; then'
291+
assert_line 9 ' if [ "${GOENV_PATH_ORDER}" = "front" ] ; then'
292+
assert_line 10 ' export PATH="${GOENV_ROOT}/shims:${PATH}"'
293+
assert_line 11 ' else'
294+
assert_line 12 ' export PATH="${PATH}:${GOENV_ROOT}/shims"'
295+
assert_line 13 ' fi'
296+
assert_line 14 'fi'
297+
assert_line 15 'command goenv rehash 2>/dev/null'
298+
assert_line 16 'goenv() {'
299+
assert_line 17 ' local command'
300+
assert_line 18 ' command="$1"'
301+
assert_line 19 ' if [ "$#" -gt 0 ]; then'
302+
assert_line 20 ' shift'
303+
assert_line 21 ' fi'
304+
assert_line 22 ' case "$command" in'
305+
assert_line 23 ' rehash|shell)'
306+
assert_line 24 ' eval "$(goenv "sh-$command" "$@")";;'
307+
assert_line 25 ' *)'
308+
assert_line 26 ' command goenv "$command" "$@";;'
309+
assert_line 27 ' esac'
310+
assert_line 28 '}'
259311

260312
assert_success
261313
}

0 commit comments

Comments
 (0)