#!/bin/bash AL="$HOME/.local/state/cdvenv.allowlist" BL="$HOME/.local/state/cdvenv.blocklist" function _cdvenv { d="$(readlink -f "$1")" if [[ "$d" =~ "${HOME}".* ]]; then if [ -d "$d/venv" ]; then echo "$d/venv" return fi if [ -d "$d/.venv" ]; then echo "$d/.venv" return fi else return fi _cdvenv "$d/.." } function _cdvenvwhitelist { venv="$1" [ -f "$BL" ] && grep "$venv" "$BL" >/dev/null && return 1 [ -f "$AL" ] && grep "$venv" "$AL" >/dev/null && return 0 echo "Virtualenv '$venv' is unknown." while true; do read -r -p "Do you want to allow auto-activation? [yn] " r case "$r" in y | Y) echo "$venv" >> "$AL" return 0 ;; n | N) echo "$venv" >> "$BL" return 1 ;; esac done } function _cdvenvactivate { venv="$1" _cdvenvwhitelist "$venv" || return 1 . "$venv/bin/activate" } function cdvenv { cd "$@" || return $? venv="$(_cdvenv "$PWD")" if [ "$venv" != "" ]; then if [ "$VIRTUAL_ENV" == "" ]; then _cdvenvactivate "$venv" fi if [ "$VIRTUAL_ENV" != "$venv" ]; then deactivate _cdvenvactivate "$venv" fi else if [ "$VIRTUAL_ENV" != "" ]; then deactivate fi fi return 0 } alias cd=cdvenv