direnvrc (2023B)
1 # direnv/direnvrc 2 # ----------------------------------------------------------------------------- 3 # direnv helpers for loading secrets from Skate. 4 # 5 # In your project's .envrc: 6 # use_secrets dev GITHUB_TOKEN AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY 7 # 8 # Resolution order (per variable): 9 # 1) repo.<repo-slug>.<env> (only if inside a git repo) 10 # 2) global.<env> 11 # 12 # If a variable is missing, direnv will fail the load (safe default). 13 # ----------------------------------------------------------------------------- 14 15 _secrets_repo_slug() { 16 local top remote slug 17 18 top="$(git -C "$PWD" rev-parse --show-toplevel 2>/dev/null)" || return 1 19 remote="$(git -C "$top" remote get-url origin 2>/dev/null || echo "$top")" 20 21 # normalize + trim 22 remote="${remote%.git}" 23 remote="${remote#git@}" 24 remote="${remote#https://}" 25 remote="${remote#http://}" 26 remote="${remote/:/\/}" # ssh form host:owner/repo -> host/owner/repo 27 28 slug="${remote//\//_}" # slashes -> underscores 29 slug="$(printf '%s' "$slug" | tr -c 'A-Za-z0-9_.-' '_' )" 30 31 # remove any trailing underscores that can come from hidden chars/newlines 32 slug="${slug%%_}" 33 # Finally, change all double underscores to single underscores 34 slug="${slug//__/_}" 35 36 printf '%s\n' "$slug" 37 } 38 39 use_secrets() { 40 local env="${1:-dev}" 41 shift || true 42 43 command -v skate >/dev/null 2>&1 || { log_error "Missing: skate"; return 1; } 44 45 local global_db="global.${env}" 46 local repo_db="" 47 48 if git -C "$PWD" rev-parse --is-inside-work-tree >/dev/null 2>&1; then 49 local slug 50 slug="$(_secrets_repo_slug 2>/dev/null)" && repo_db="repo.${slug}.${env}" 51 fi 52 53 local var val 54 for var in "$@"; do 55 if [ -n "$repo_db" ] && val="$(skate get "${var}@${repo_db}" 2>/dev/null)"; then 56 export "$var=$val" 57 continue 58 fi 59 if val="$(skate get "${var}@${global_db}" 2>/dev/null)"; then 60 export "$var=$val" 61 continue 62 fi 63 log_error "Missing secret: ${var} (looked in ${repo_db:-<no-repo-db>} then ${global_db})" 64 return 1 65 done 66 } 67