From 3565c32d515cf77b100ae6a2c4d9dd95cc6ffe3d Mon Sep 17 00:00:00 2001 From: Phil Ruffwind Date: Fri, 24 Dec 2021 14:38:48 -0800 Subject: [PATCH] Avoid adding duplicates to PATH Without this, each time the env script gets executed it will add a copy of the paths to PATH. This can happen when shells are nested. The "case" trick was inspired by: https://github.com/rust-lang/rustup/blob/184a899f4529f27e23eca537a5979c530ff7fa26/src/cli/self_update/env.sh --- scripts/bootstrap/bootstrap-haskell | 45 +++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/scripts/bootstrap/bootstrap-haskell b/scripts/bootstrap/bootstrap-haskell index 17f33d3..45af506 100755 --- a/scripts/bootstrap/bootstrap-haskell +++ b/scripts/bootstrap/bootstrap-haskell @@ -280,7 +280,20 @@ download_ghcup() { # we may overwrite this in adjust_bashrc cat <<-EOF > "${GHCUP_DIR}"/env || die "Failed to create env file" - export PATH="\$HOME/.cabal/bin:${GHCUP_BIN}:\$PATH" + case ":\$PATH:" in + *:"${GHCUP_BIN}":*) + ;; + *) + export PATH="${GHCUP_BIN}:\$PATH" + ;; + esac + case ":\$PATH:" in + *:"\$HOME/.cabal/bin":*) + ;; + *) + export PATH="\$HOME/.cabal/bin:\$PATH" + ;; + esac EOF # shellcheck disable=SC1090 @@ -368,12 +381,38 @@ adjust_bashrc() { case $1 in 1) cat <<-EOF > "${GHCUP_DIR}"/env || die "Failed to create env file" - export PATH="\$HOME/.cabal/bin:${GHCUP_BIN}:\$PATH" + case ":\$PATH:" in + *:"${GHCUP_BIN}":*) + ;; + *) + export PATH="${GHCUP_BIN}:\$PATH" + ;; + esac + case ":\$PATH:" in + *:"\$HOME/.cabal/bin":*) + ;; + *) + export PATH="\$HOME/.cabal/bin:\$PATH" + ;; + esac EOF ;; 2) cat <<-EOF > "${GHCUP_DIR}"/env || die "Failed to create env file" - export PATH="\$PATH:\$HOME/.cabal/bin:${GHCUP_BIN}" + case ":\$PATH:" in + *:"\$HOME/.cabal/bin":*) + ;; + *) + export PATH="\$PATH:\$HOME/.cabal/bin" + ;; + esac + case ":\$PATH:" in + *:"${GHCUP_BIN}":*) + ;; + *) + export PATH="\$PATH:${GHCUP_BIN}" + ;; + esac EOF ;; *) ;;