dotenv.plugin.zsh 1.65 KB
Newer Older
1
2
3
4
5
6
7
## Settings

# Filename of the dotenv file to look for
: ${ZSH_DOTENV_FILE:=.env}

# Path to the file containing allowed paths
: ${ZSH_DOTENV_ALLOWED_LIST:="${ZSH_CACHE_DIR:-$ZSH/cache}/dotenv-allowed.list"}
8
: ${ZSH_DOTENV_DISALLOWED_LIST:="${ZSH_CACHE_DIR:-$ZSH/cache}/dotenv-disallowed.list"}
9
10
11
12


## Functions

Arthur's avatar
Arthur committed
13
source_env() {
14
  if [[ -f $ZSH_DOTENV_FILE ]]; then
15
16
17
    if [[ "$ZSH_DOTENV_PROMPT" != false ]]; then
      local confirmation dirpath="${PWD:A}"

18
      # make sure there is an (dis-)allowed file
19
      touch "$ZSH_DOTENV_ALLOWED_LIST"
20
21
22
23
24
25
      touch "$ZSH_DOTENV_DISALLOWED_LIST"

      # early return if disallowed
      if grep -q "$dirpath" "$ZSH_DOTENV_DISALLOWED_LIST" &>/dev/null; then
        return;
      fi
26
27
28
29

      # check if current directory's .env file is allowed or ask for confirmation
      if ! grep -q "$dirpath" "$ZSH_DOTENV_ALLOWED_LIST" &>/dev/null; then
        # print same-line prompt and output newline character if necessary
30
        echo -n "dotenv: found '$ZSH_DOTENV_FILE' file. Source it? ([Y]es/[n]o/[a]lways/n[e]ver) "
31
32
33
34
35
36
        read -k 1 confirmation; [[ "$confirmation" != $'\n' ]] && echo

        # check input
        case "$confirmation" in
          [nN]) return ;;
          [aA]) echo "$dirpath" >> "$ZSH_DOTENV_ALLOWED_LIST" ;;
37
          [eE]) echo "$dirpath" >> "$ZSH_DOTENV_DISALLOWED_LIST"; return ;;
38
39
          *) ;; # interpret anything else as a yes
        esac
40
      fi
41
42
    fi

43
    # test .env syntax
44
    zsh -fn $ZSH_DOTENV_FILE || echo "dotenv: error when sourcing '$ZSH_DOTENV_FILE' file" >&2
45

46
47
    setopt localoptions allexport
    source $ZSH_DOTENV_FILE
Arthur's avatar
Arthur committed
48
49
50
51
52
  fi
}

autoload -U add-zsh-hook
add-zsh-hook chpwd source_env
53
54

source_env