From 0d284bdc602a2506cc39b47af134608598d6883e Mon Sep 17 00:00:00 2001 From: Tom Tseng Date: Fri, 21 Jun 2024 17:34:28 -0700 Subject: [PATCH 1/2] autoenv_leave: Only match prefix on path boundaries Suppose we `cd` from `a/b` to `a/bz`. Expected behavior: Invoke `a/b/.env.leave. Actual behavior prior to this commit: No env-leave is invoked. The issue is that we are naively checking for string prefixes in `autoenv_leave` in order to determine whether one directory is an ancestor of another. This commit makes the checking slightly less naive. --- activate.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/activate.sh b/activate.sh index 85b3e26..9bf1c9e 100755 --- a/activate.sh +++ b/activate.sh @@ -295,7 +295,7 @@ autoenv_leave() { _files=$( command -v chdir >/dev/null 2>&1 && chdir "${from_dir}" || builtin cd "${from_dir}" _hadone='' - while [ "$PWD" != "" ] && [[ $to_dir != $PWD* ]]; do + while [ "$PWD" != "" ] && [ "$PWD" != "/" ] && [[ $to_dir/ != $PWD/* ]]; do _file="$PWD/${AUTOENV_ENV_LEAVE_FILENAME}" if [ -f "${_file}" ]; then if [ -z "${_hadone}" ]; then From 52df299f8ef05bf99c428d6aa758fc39be063377 Mon Sep 17 00:00:00 2001 From: Edwin Kofler Date: Sat, 29 Jun 2024 22:09:18 -0700 Subject: [PATCH 2/2] Update patch for POSIX compliance and add test --- activate.sh | 27 +++++++++++++++++---------- tests/test_cd_env_leave.sh | 12 ++++++++++++ 2 files changed, 29 insertions(+), 10 deletions(-) create mode 100644 tests/test_cd_env_leave.sh diff --git a/activate.sh b/activate.sh index 9bf1c9e..4b42d30 100755 --- a/activate.sh +++ b/activate.sh @@ -295,18 +295,25 @@ autoenv_leave() { _files=$( command -v chdir >/dev/null 2>&1 && chdir "${from_dir}" || builtin cd "${from_dir}" _hadone='' - while [ "$PWD" != "" ] && [ "$PWD" != "/" ] && [[ $to_dir/ != $PWD/* ]]; do - _file="$PWD/${AUTOENV_ENV_LEAVE_FILENAME}" - if [ -f "${_file}" ]; then - if [ -z "${_hadone}" ]; then - printf %s "${_file}" - _hadone='1' - else - printf %s " + while [ "$PWD" != "" ] && [ "$PWD" != "/" ]; do + case $to_dir/ in + $PWD/*) + break + ;; + *) + _file="$PWD/${AUTOENV_ENV_LEAVE_FILENAME}" + if [ -f "${_file}" ]; then + if [ -z "${_hadone}" ]; then + printf %s "${_file}" + _hadone='1' + else + printf %s " ${_file}" + fi fi - fi - command -v chdir >/dev/null 2>&1 && chdir "$(pwd)/.." || builtin cd "$PWD/.." + command -v chdir >/dev/null 2>&1 && chdir "$(pwd)/.." || builtin cd "$PWD/.." + ;; + esac done ) diff --git a/tests/test_cd_env_leave.sh b/tests/test_cd_env_leave.sh new file mode 100644 index 0000000..ff07ad9 --- /dev/null +++ b/tests/test_cd_env_leave.sh @@ -0,0 +1,12 @@ +# shellcheck shell=sh + +. "${FUNCTIONS}" +. "${ACTIVATE_SH}" + +# Prepare files/directories +mkdir -pv 'a/b' 'a/bz' +echo 'echo zulu' > 'a/b/.env.leave' + +AUTOENV_ENABLE_LEAVE=1 +cd 'a/b' +patterntest 'echo "Y" | cd ../../a/bz' 'zulu$'