Skip to content

Commit

Permalink
Merge pull request #131 from jfly/more-setup-idempotency
Browse files Browse the repository at this point in the history
Make `asdf direnv setup` more robust
  • Loading branch information
vic authored Apr 1, 2022
2 parents a0ec673 + f613b4f commit e5572ab
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 11 deletions.
46 changes: 39 additions & 7 deletions lib/setup-lib.bash
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,15 @@ function modifying() {
fi
}

function clobbering() {
echo -n "✍ Clobbering $1 " >&2
if echo "$2" >"$1"; then
ok
else
fail
fi
}

function grep_or_add() {
local file content
file="$1"
Expand All @@ -72,6 +81,20 @@ function grep_or_add() {
fi
}

function clobber_if_different() {
local file content
file="$1"
shift
read -d $'\0' -r content
if [ -f "$file" ] && [ "$content" = "$(cat "$file")" ]; then
ok "$file looks fine"
return 0
else
mkdir -p "$(dirname "$file")"
clobbering "$file" "$content"
fi
}

function check_for() {
echo "Checking for $1..." >&2
shift
Expand Down Expand Up @@ -115,21 +138,32 @@ function direnv_shell_integration() {
case "$shell" in
*bash*)
rcfile="$HOME/.bashrc"
cat <<-EOF | grep_or_add "$rcfile"
# shellcheck disable=SC2016
asdf_direnv_rcfile_expr='${XDG_CONFIG_HOME:-$HOME/.config}/asdf-direnv/bashrc'
asdf_direnv_rcfile=$(eval echo "$asdf_direnv_rcfile_expr")
echo "source \"$asdf_direnv_rcfile_expr\"" | grep_or_add "$rcfile"
cat <<-EOF | clobber_if_different "$asdf_direnv_rcfile"
### Do not edit. This was autogenerated by 'asdf direnv setup' ###
export ASDF_DIRENV_BIN="$ASDF_DIRENV_BIN"
eval "\$(\$ASDF_DIRENV_BIN hook bash)"
EOF
;;
*zsh*)
rcfile="$HOME/.zshrc"
cat <<-EOF | grep_or_add "$rcfile"
# shellcheck disable=SC2016
asdf_direnv_rcfile_expr='${XDG_CONFIG_HOME:-$HOME/.config}/asdf-direnv/zshrc'
asdf_direnv_rcfile=$(eval echo "$asdf_direnv_rcfile_expr")
echo "source $asdf_direnv_rcfile_expr" | grep_or_add "$rcfile"
cat <<-EOF | clobber_if_different "$asdf_direnv_rcfile"
### Do not edit. This was autogenerated by 'asdf direnv setup' ###
export ASDF_DIRENV_BIN="$ASDF_DIRENV_BIN"
eval "\$(\$ASDF_DIRENV_BIN hook zsh)"
EOF
;;
*fish*)
rcfile="${XDG_CONFIG_HOME:-$HOME/.config}/fish/conf.d/asdf_direnv.fish"
cat <<-EOF | grep_or_add "$rcfile"
cat <<-EOF | clobber_if_different "$rcfile"
### Do not edit. This was autogenerated by 'asdf direnv setup' ###
set -gx ASDF_DIRENV_BIN "$ASDF_DIRENV_BIN"
\$ASDF_DIRENV_BIN hook fish | source
EOF
Expand All @@ -142,11 +176,9 @@ EOF

function direnv_asdf_integration() {
local rcfile="${XDG_CONFIG_HOME:-$HOME/.config}/direnv/lib/use_asdf.sh"
cat <<-EOF | grep_or_add "$rcfile"
cat <<-EOF | clobber_if_different "$rcfile"
### Do not edit. This was autogenerated by 'asdf direnv setup' ###
source "\$(asdf direnv hook asdf)"
# Uncomment the following line to make direnv silent by default.
# export DIRENV_LOG_FORMAT=""
EOF
}

Expand Down
23 changes: 19 additions & 4 deletions test/setup_command.bats
Original file line number Diff line number Diff line change
Expand Up @@ -13,21 +13,36 @@ teardown() {

@test "setup bash modifies rcfile" {
run asdf direnv setup --shell bash --version system
grep "export ASDF_DIRENV_BIN" "$HOME/.bashrc"
grep -F 'eval "$($ASDF_DIRENV_BIN hook bash)"' "$HOME/.bashrc"
# shellcheck disable=SC2016
grep -F '${XDG_CONFIG_HOME:-$HOME/.config}/asdf-direnv/bashrc' "$HOME/.bashrc"
grep "export ASDF_DIRENV_BIN" "$XDG_CONFIG_HOME/asdf-direnv/bashrc"
# shellcheck disable=SC2016
grep -F 'eval "$($ASDF_DIRENV_BIN hook bash)"' "$XDG_CONFIG_HOME/asdf-direnv/bashrc"
grep "asdf direnv hook asdf" "$XDG_CONFIG_HOME/direnv/lib/use_asdf.sh"
}

@test "setup zsh modifies rcfile" {
run asdf direnv setup --shell zsh --version system
grep "export ASDF_DIRENV_BIN" "$HOME/.zshrc"
grep -F 'eval "$($ASDF_DIRENV_BIN hook zsh)"' "$HOME/.zshrc"
# shellcheck disable=SC2016
grep -F '${XDG_CONFIG_HOME:-$HOME/.config}/asdf-direnv/zshrc' "$HOME/.zshrc"
grep "export ASDF_DIRENV_BIN" "$XDG_CONFIG_HOME/asdf-direnv/zshrc"
# shellcheck disable=SC2016
grep -F 'eval "$($ASDF_DIRENV_BIN hook zsh)"' "$XDG_CONFIG_HOME/asdf-direnv/zshrc"
grep "asdf direnv hook asdf" "$XDG_CONFIG_HOME/direnv/lib/use_asdf.sh"
}

@test "setup fish modifies rcfile" {
run asdf direnv setup --shell fish --version system
grep "set -gx ASDF_DIRENV_BIN" "$XDG_CONFIG_HOME/fish/conf.d/asdf_direnv.fish"
# shellcheck disable=SC2016
grep -F '$ASDF_DIRENV_BIN hook fish' "$XDG_CONFIG_HOME/fish/conf.d/asdf_direnv.fish"
grep "asdf direnv hook asdf" "$XDG_CONFIG_HOME/direnv/lib/use_asdf.sh"
}

@test "can re-run setup" {
run asdf direnv setup --shell zsh --version 2.30.3
grep "export ASDF_DIRENV_BIN=\"$HOME/.asdf/installs/direnv/2.30.3/bin/direnv" "$XDG_CONFIG_HOME/asdf-direnv/zshrc"

run asdf direnv setup --shell zsh --version 2.31.0
grep "export ASDF_DIRENV_BIN=\"$HOME/.asdf/installs/direnv/2.31.0/bin/direnv" "$XDG_CONFIG_HOME/asdf-direnv/zshrc"
}

0 comments on commit e5572ab

Please sign in to comment.