Skip to content

Commit

Permalink
cmd/shellenv.sh: make brew shellenv idempotent
Browse files Browse the repository at this point in the history
  • Loading branch information
XuehaiPan committed Jul 29, 2021
1 parent 689c1fd commit 569672e
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 11 deletions.
48 changes: 37 additions & 11 deletions Library/Homebrew/cmd/shellenv.sh
Original file line number Diff line number Diff line change
Expand Up @@ -9,30 +9,56 @@
# HOMEBREW_REPOSITORY is set by bin/brew
# shellcheck disable=SC2154
homebrew-shellenv() {
# Unordered subset check
# Usage: contains SEP VARNAME [ENTRY ...]
# Examples:
# - contains ':' VAR aa bb cc # unordered subset check
# - contains ':' VAR aa:bb:cc # ordered substring check (not subsequence)
contains() {
local SEP="$1"; shift
local VAR="$1"; shift
local ENTRY

for ENTRY in "$@"
do
[[ "${SEP}${!VAR}${SEP}" != *"${SEP}${ENTRY}${SEP}"* ]] && return 1
done
return 0
}

case "$(/bin/ps -p "${PPID}" -c -o comm=)" in
fish|-fish)
fish | -fish)
echo "set -gx HOMEBREW_PREFIX \"${HOMEBREW_PREFIX}\";"
echo "set -gx HOMEBREW_CELLAR \"${HOMEBREW_CELLAR}\";"
echo "set -gx HOMEBREW_REPOSITORY \"${HOMEBREW_REPOSITORY}\";"
echo "set -q PATH; or set PATH ''; set -gx PATH \"${HOMEBREW_PREFIX}/bin\" \"${HOMEBREW_PREFIX}/sbin\" \$PATH;"
echo "set -q MANPATH; or set MANPATH ''; set -gx MANPATH \"${HOMEBREW_PREFIX}/share/man\" \$MANPATH;"
echo "set -q INFOPATH; or set INFOPATH ''; set -gx INFOPATH \"${HOMEBREW_PREFIX}/share/info\" \$INFOPATH;"
! contains ':' HOMEBREW_ENV_BACKUP_PATH "${HOMEBREW_PREFIX}/bin" "${HOMEBREW_PREFIX}/sbin" &&
echo "set -q PATH; or set PATH ''; set -gx PATH \"${HOMEBREW_PREFIX}/bin\" \"${HOMEBREW_PREFIX}/sbin\" \$PATH;"
! contains ':' HOMEBREW_ENV_BACKUP_MANPATH "${HOMEBREW_PREFIX}/share/man" &&
echo "set -q MANPATH; or set MANPATH ''; set -gx MANPATH \"${HOMEBREW_PREFIX}/share/man\" \$MANPATH;"
! contains ':' HOMEBREW_ENV_BACKUP_INFOPATH "${HOMEBREW_PREFIX}/share/info" &&
echo "set -q INFOPATH; or set INFOPATH ''; set -gx INFOPATH \"${HOMEBREW_PREFIX}/share/info\" \$INFOPATH;"
;;
csh|-csh|tcsh|-tcsh)
csh | -csh | tcsh | -tcsh)
echo "setenv HOMEBREW_PREFIX ${HOMEBREW_PREFIX};"
echo "setenv HOMEBREW_CELLAR ${HOMEBREW_CELLAR};"
echo "setenv HOMEBREW_REPOSITORY ${HOMEBREW_REPOSITORY};"
echo "setenv PATH ${HOMEBREW_PREFIX}/bin:${HOMEBREW_PREFIX}/sbin:\$PATH;"
echo "setenv MANPATH ${HOMEBREW_PREFIX}/share/man\`[ \${?MANPATH} == 1 ] && echo \":\${MANPATH}\"\`:;"
echo "setenv INFOPATH ${HOMEBREW_PREFIX}/share/info\`[ \${?INFOPATH} == 1 ] && echo \":\${INFOPATH}\"\`;"
! contains ':' HOMEBREW_ENV_BACKUP_PATH "${HOMEBREW_PREFIX}/bin" "${HOMEBREW_PREFIX}/sbin" &&
echo "setenv PATH ${HOMEBREW_PREFIX}/bin:${HOMEBREW_PREFIX}/sbin:\$PATH;"
! contains ':' HOMEBREW_ENV_BACKUP_MANPATH "${HOMEBREW_PREFIX}/share/man" &&
echo "setenv MANPATH ${HOMEBREW_PREFIX}/share/man\`[ \${?MANPATH} == 1 ] && echo \":\${MANPATH}\"\`:;"
! contains ':' HOMEBREW_ENV_BACKUP_INFOPATH "${HOMEBREW_PREFIX}/share/info" &&
echo "setenv INFOPATH ${HOMEBREW_PREFIX}/share/info\`[ \${?INFOPATH} == 1 ] && echo \":\${INFOPATH}\"\`;"
;;
*)
echo "export HOMEBREW_PREFIX=\"${HOMEBREW_PREFIX}\";"
echo "export HOMEBREW_CELLAR=\"${HOMEBREW_CELLAR}\";"
echo "export HOMEBREW_REPOSITORY=\"${HOMEBREW_REPOSITORY}\";"
echo "export PATH=\"${HOMEBREW_PREFIX}/bin:${HOMEBREW_PREFIX}/sbin\${PATH+:\$PATH}\";"
echo "export MANPATH=\"${HOMEBREW_PREFIX}/share/man\${MANPATH+:\$MANPATH}:\";"
echo "export INFOPATH=\"${HOMEBREW_PREFIX}/share/info:\${INFOPATH:-}\";"
! contains ':' HOMEBREW_ENV_BACKUP_PATH "${HOMEBREW_PREFIX}/bin" "${HOMEBREW_PREFIX}/sbin" &&
echo "export PATH=\"${HOMEBREW_PREFIX}/bin:${HOMEBREW_PREFIX}/sbin\${PATH+:\$PATH}\";"
! contains ':' HOMEBREW_ENV_BACKUP_MANPATH "${HOMEBREW_PREFIX}/share/man" &&
echo "export MANPATH=\"${HOMEBREW_PREFIX}/share/man\${MANPATH+:\$MANPATH}:\";"
! contains ':' HOMEBREW_ENV_BACKUP_INFOPATH "${HOMEBREW_PREFIX}/share/info" &&
echo "export INFOPATH=\"${HOMEBREW_PREFIX}/share/info:\${INFOPATH:-}\";"
;;
esac
}
8 changes: 8 additions & 0 deletions bin/brew
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,14 @@ then
export CI="1"
fi

# Backup specific variables for shellenv.
for VAR in PATH MANPATH INFOPATH FPATH; do
# Skip if variable value is empty.
[[ -z "${!VAR}" ]] && continue

eval "HOMEBREW_ENV_BACKUP_${VAR}=\"${!VAR}\""
done

# set from user environment
# shellcheck disable=SC2154
if [[ -z "${HOMEBREW_NO_ENV_FILTERING}" ]]
Expand Down

0 comments on commit 569672e

Please sign in to comment.