diff --git a/src/main/bash/sdkman-init.sh b/src/main/bash/sdkman-init.sh index 3e8cac5a..81ca15b3 100644 --- a/src/main/bash/sdkman-init.sh +++ b/src/main/bash/sdkman-init.sh @@ -128,3 +128,21 @@ for candidate_name in "${SDKMAN_CANDIDATES[@]}"; do done unset candidate_name candidate_dir export PATH + +if [[ "$sdkman_auto_env" == "true" ]]; then + if [[ "$zsh_shell" == "true" ]]; then + function sdkman_auto_env() { + [[ -f ".sdkmanrc" ]] && sdk env + } + + chpwd_functions+=(sdkman_auto_env) + else + function sdkman_auto_env() { + [[ "$SDKMAN_OLD_PWD" != "$PWD" ]] && [[ -f ".sdkmanrc" ]] && sdk env + + export SDKMAN_OLD_PWD="$PWD" + } + + [[ -z "$PROMPT_COMMAND" ]] && PROMPT_COMMAND="sdkman_auto_env" || PROMPT_COMMAND="${PROMPT_COMMAND%\;};sdkman_auto_env" + fi +fi \ No newline at end of file diff --git a/src/test/groovy/sdkman/specs/EnvCommandSpec.groovy b/src/test/groovy/sdkman/specs/EnvCommandSpec.groovy index 00e4fb30..e3c2fbca 100644 --- a/src/test/groovy/sdkman/specs/EnvCommandSpec.groovy +++ b/src/test/groovy/sdkman/specs/EnvCommandSpec.groovy @@ -1,6 +1,7 @@ package sdkman.specs import sdkman.support.SdkmanEnvSpecification +import spock.lang.Unroll import java.nio.file.Paths @@ -91,6 +92,41 @@ class EnvCommandSpec extends SdkmanEnvSpecification { ] } + def "should execute 'sdk env' when entering a directory with an .sdkmanrc"() { + given: + new FileTreeBuilder(candidatesDirectory).with { + "groovy" { + "2.4.1" {} + } + } + + bash = sdkmanBashEnvBuilder + .withVersionCache("x.y.z") + .withOfflineMode(true) + .withConfiguration("sdkman_auto_env", sdkmanAutoEnv) + .build() + + new FileTreeBuilder(bash.workDir).with { + "project" { + ".sdkmanrc"("groovy=2.4.1\n") + } + } + + bash.start() + bash.execute("source $bootstrapScript") + + when: + bash.execute("cd project") + + then: + verifyOutput(bash.output) + + where: + sdkmanAutoEnv | verifyOutput + 'true' | { it.contains("Using groovy version 2.4.1 in this shell") } + 'false' | { !it.contains("Using groovy version 2.4.1 in this shell") } + } + def "should issue an error if .sdkmanrc contains a malformed candidate version"() { given: bash = sdkmanBashEnvBuilder