Skip to content

Commit

Permalink
fix iterating through paths that have spaces in them
Browse files Browse the repository at this point in the history
Fixes #344, #196
  • Loading branch information
mislav committed Mar 31, 2013
1 parent 382db59 commit baf7656
Show file tree
Hide file tree
Showing 8 changed files with 51 additions and 6 deletions.
4 changes: 3 additions & 1 deletion libexec/rbenv-commands
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,11 @@ elif [ "$1" = "--no-sh" ]; then
shift
fi

IFS=: paths=($PATH)

shopt -s nullglob

{ for path in ${PATH//:/$'\n'}; do
{ for path in "${paths[@]}"; do
for command in "${path}/rbenv-"*; do
command="${command##*rbenv-}"
if [ -n "$sh" ]; then
Expand Down
3 changes: 2 additions & 1 deletion libexec/rbenv-exec
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ fi
RBENV_COMMAND_PATH="$(rbenv-which "$RBENV_COMMAND")"
RBENV_BIN_PATH="${RBENV_COMMAND_PATH%/*}"

for script in $(rbenv-hooks exec); do
IFS=$'\n' scripts=(`rbenv-hooks exec`)
for script in "${scripts[@]}"; do
source "$script"

This comment has been minimized.

Copy link
@doitian

doitian Apr 15, 2013

Contributor

Because scripts are sourced, IFS must be set back to default value, otherwise all the scripts have to set IFS explicitly.

This comment has been minimized.

Copy link
@sstephenson

sstephenson Apr 15, 2013

Contributor

The IFS value here only applies during the array assignment. Try it out in your shell:

$ IFS=: hook_paths=(one:two:three)
$ echo $hook_paths
one two three
$ echo $IFS

$

This comment has been minimized.

Copy link
@doitian

This comment has been minimized.

Copy link
@doitian

doitian Apr 15, 2013

Contributor

#379 PR I sent

done

Expand Down
6 changes: 4 additions & 2 deletions libexec/rbenv-hooks
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,11 @@ realpath() {
cd "$cwd"
}

IFS=: hook_paths=($RBENV_HOOK_PATH)

shopt -s nullglob
for path in ${RBENV_HOOK_PATH//:/$'\n'}; do
for script in $path/"$RBENV_COMMAND"/*.bash; do
for path in "${hook_paths[@]}"; do
for script in "$path/$RBENV_COMMAND"/*.bash; do
echo $(realpath $script)
done
done
Expand Down
3 changes: 2 additions & 1 deletion libexec/rbenv-rehash
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,8 @@ make_shims ../versions/*/bin/*
cd "$OLDPWD"

# Allow plugins to register shims.
for script in $(rbenv-hooks rehash); do
IFS=$'\n' scripts=(`rbenv-hooks rehash`)
for script in "${scripts[@]}"; do
source "$script"
done

Expand Down
3 changes: 2 additions & 1 deletion libexec/rbenv-which
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,8 @@ else
RBENV_COMMAND_PATH="${RBENV_ROOT}/versions/${RBENV_VERSION}/bin/${RBENV_COMMAND}"
fi

for script in $(rbenv-hooks which); do
IFS=$'\n' scripts=(`rbenv-hooks which`)
for script in "${scripts[@]}"; do
source "$script"
done

Expand Down
12 changes: 12 additions & 0 deletions test/commands.bats
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,18 @@ load test_helper
assert_line "shell"
}

@test "commands in path with spaces" {
path="${RBENV_TEST_DIR}/my commands"
cmd="${path}/rbenv-sh-hello"
mkdir -p "$path"
touch "$cmd"
chmod +x "$cmd"

PATH="${path}:$PATH" run rbenv-commands --sh
assert_success
assert_line "hello"
}

@test "commands --no-sh" {
run rbenv-commands --no-sh
assert_success
Expand Down
14 changes: 14 additions & 0 deletions test/exec.bats
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#!/usr/bin/env bats

load test_helper

@test "supports hook path with spaces" {
hook_path="${RBENV_TEST_DIR}/custom stuff/rbenv hooks"
mkdir -p "${hook_path}/exec"
echo "export HELLO='from hook'" > "${hook_path}/exec/hello.bash"

export RBENV_VERSION=system
RBENV_HOOK_PATH="$hook_path" run rbenv-exec env
assert_success
assert_line "HELLO=from hook"
}
12 changes: 12 additions & 0 deletions test/hooks.bats
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,18 @@ create_hook() {
assert_line 2 "${RBENV_TEST_DIR}/etc/rbenv_hooks/exec/bueno.bash"
}

@test "supports hook paths with spaces" {
path1="${RBENV_TEST_DIR}/my hooks/rbenv.d"
path2="${RBENV_TEST_DIR}/etc/rbenv hooks"
create_hook "$path1" exec "hello.bash"
create_hook "$path2" exec "ahoy.bash"

RBENV_HOOK_PATH="$path1:$path2" run rbenv-hooks exec
assert_success
assert_line 0 "${RBENV_TEST_DIR}/my hooks/rbenv.d/exec/hello.bash"
assert_line 1 "${RBENV_TEST_DIR}/etc/rbenv hooks/exec/ahoy.bash"
}

@test "resolves relative paths" {
path="${RBENV_TEST_DIR}/rbenv.d"
create_hook "$path" exec "hello.bash"
Expand Down

0 comments on commit baf7656

Please sign in to comment.