dotfiles

My dotfiles and configs
git clone https://git.dasho.dev/dotfiles.git
Log | Files | Refs | README

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