mirror of
https://github.com/python/cpython.git
synced 2025-11-03 15:11:34 +00:00
gh-137450: macOS installer shell path management improvements (#137451)
Separate the installer `Shell profile updater` postinstall script from the `Update Shell Profile.command` to enable more robust error handling.
This commit is contained in:
parent
247dab27fd
commit
781eb1a688
4 changed files with 192 additions and 85 deletions
|
|
@ -1747,7 +1747,7 @@ def main():
|
||||||
fn = os.path.join(folder, "ReadMe.rtf")
|
fn = os.path.join(folder, "ReadMe.rtf")
|
||||||
patchFile("resources/ReadMe.rtf", fn)
|
patchFile("resources/ReadMe.rtf", fn)
|
||||||
fn = os.path.join(folder, "Update Shell Profile.command")
|
fn = os.path.join(folder, "Update Shell Profile.command")
|
||||||
patchScript("scripts/postflight.patch-profile", fn)
|
patchScript("resources/update_shell_profile.command", fn)
|
||||||
fn = os.path.join(folder, "Install Certificates.command")
|
fn = os.path.join(folder, "Install Certificates.command")
|
||||||
patchScript("resources/install_certificates.command", fn)
|
patchScript("resources/install_certificates.command", fn)
|
||||||
os.chmod(folder, STAT_0o755)
|
os.chmod(folder, STAT_0o755)
|
||||||
|
|
|
||||||
116
Mac/BuildScript/resources/update_shell_profile.command
Executable file
116
Mac/BuildScript/resources/update_shell_profile.command
Executable file
|
|
@ -0,0 +1,116 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
echo "This script will update your shell profile when the 'bin' directory"
|
||||||
|
echo "of python is not early enough of the PATH of your shell."
|
||||||
|
echo "These changes will be effective only in shell windows that you open"
|
||||||
|
echo "after running this script."
|
||||||
|
|
||||||
|
PYVER=@PYVER@
|
||||||
|
PYTHON_ROOT="/Library/Frameworks/Python.framework/Versions/@PYVER@"
|
||||||
|
|
||||||
|
if [ `id -ur` = 0 ]; then
|
||||||
|
# Run from the installer, do some trickery to fetch the information
|
||||||
|
# we need.
|
||||||
|
theShell="`finger $USER | grep Shell: | head -1 | awk '{ print $NF }'`"
|
||||||
|
|
||||||
|
else
|
||||||
|
theShell="${SHELL}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Make sure the directory ${PYTHON_ROOT}/bin is on the users PATH.
|
||||||
|
BSH="`basename "${theShell}"`"
|
||||||
|
case "${BSH}" in
|
||||||
|
bash|ksh|sh|*csh|zsh|fish)
|
||||||
|
if [ `id -ur` = 0 ]; then
|
||||||
|
P=`su - ${USER} -c 'echo A-X-4-X@@$PATH@@X-4-X-A' | grep 'A-X-4-X@@.*@@X-4-X-A' | sed -e 's/^A-X-4-X@@//g' -e 's/@@X-4-X-A$//g'`
|
||||||
|
else
|
||||||
|
P="`(exec -l ${theShell} -c 'echo $PATH')`"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Sorry, I don't know how to patch $BSH shells"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Now ensure that our bin directory is on $P and before /usr/bin at that
|
||||||
|
for elem in `echo $P | tr ':' ' '`
|
||||||
|
do
|
||||||
|
if [ "${elem}" = "${PYTHON_ROOT}/bin" ]; then
|
||||||
|
echo "All right, you're a python lover already"
|
||||||
|
exit 0
|
||||||
|
elif [ "${elem}" = "/usr/bin" ]; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "${PYTHON_ROOT}/bin is not on your PATH or at least not early enough"
|
||||||
|
case "${BSH}" in
|
||||||
|
*csh)
|
||||||
|
if [ -f "${HOME}/.tcshrc" ]; then
|
||||||
|
RC="${HOME}/.tcshrc"
|
||||||
|
else
|
||||||
|
RC="${HOME}/.cshrc"
|
||||||
|
fi
|
||||||
|
# Create backup copy before patching
|
||||||
|
if [ -f "${RC}" ]; then
|
||||||
|
cp -fp "${RC}" "${RC}.pysave"
|
||||||
|
fi
|
||||||
|
echo "" >> "${RC}"
|
||||||
|
echo "# Setting PATH for Python ${PYVER}" >> "${RC}"
|
||||||
|
echo "# The original version is saved in .cshrc.pysave" >> "${RC}"
|
||||||
|
echo "set path=(${PYTHON_ROOT}/bin "'$path'")" >> "${RC}"
|
||||||
|
if [ `id -ur` = 0 ]; then
|
||||||
|
chown -h "${USER}" "${RC}"
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
bash)
|
||||||
|
if [ -e "${HOME}/.bash_profile" ]; then
|
||||||
|
PR="${HOME}/.bash_profile"
|
||||||
|
elif [ -e "${HOME}/.bash_login" ]; then
|
||||||
|
PR="${HOME}/.bash_login"
|
||||||
|
elif [ -e "${HOME}/.profile" ]; then
|
||||||
|
PR="${HOME}/.profile"
|
||||||
|
else
|
||||||
|
PR="${HOME}/.bash_profile"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
fish)
|
||||||
|
CONFIG_DIR="${HOME}/.config/fish/conf.d/"
|
||||||
|
RC="${CONFIG_DIR}/python-${PYVER}.fish"
|
||||||
|
mkdir -p "$CONFIG_DIR"
|
||||||
|
if [ -f "${RC}" ]; then
|
||||||
|
cp -fp "${RC}" "${RC}.pysave"
|
||||||
|
fi
|
||||||
|
echo "# Setting PATH for Python ${PYVER}" > "${RC}"
|
||||||
|
if [ -f "${RC}.pysave" ]; then
|
||||||
|
echo "# The original version is saved in ${RC}.pysave" >> "${RC}"
|
||||||
|
fi
|
||||||
|
echo "fish_add_path -g \"${PYTHON_ROOT}/bin\"" >> "${RC}"
|
||||||
|
if [ `id -ur` = 0 ]; then
|
||||||
|
chown -h "${USER}" "${RC}"
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
zsh)
|
||||||
|
PR="${HOME}/.zprofile"
|
||||||
|
;;
|
||||||
|
*sh)
|
||||||
|
PR="${HOME}/.profile"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Create backup copy before patching
|
||||||
|
if [ -f "${PR}" ]; then
|
||||||
|
cp -fp "${PR}" "${PR}.pysave"
|
||||||
|
fi
|
||||||
|
echo "" >> "${PR}"
|
||||||
|
echo "# Setting PATH for Python ${PYVER}" >> "${PR}"
|
||||||
|
echo "# The original version is saved in `basename ${PR}`.pysave" >> "${PR}"
|
||||||
|
echo 'PATH="'"${PYTHON_ROOT}/bin"':${PATH}"' >> "${PR}"
|
||||||
|
echo 'export PATH' >> "${PR}"
|
||||||
|
if [ `id -ur` = 0 ]; then
|
||||||
|
chown -h "${USER}" "${PR}"
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
|
|
@ -1,116 +1,104 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
echo "This script will update your shell profile when the 'bin' directory"
|
|
||||||
echo "of python is not early enough of the PATH of your shell."
|
|
||||||
echo "These changes will be effective only in shell windows that you open"
|
|
||||||
echo "after running this script."
|
|
||||||
|
|
||||||
PYVER=@PYVER@
|
PYVER=@PYVER@
|
||||||
PYTHON_ROOT="/Library/Frameworks/Python.framework/Versions/@PYVER@"
|
PYTHON_ROOT="/Library/Frameworks/Python.framework/Versions/@PYVER@"
|
||||||
|
|
||||||
if [ `id -ur` = 0 ]; then
|
|
||||||
# Run from the installer, do some trickery to fetch the information
|
|
||||||
# we need.
|
|
||||||
theShell="`finger $USER | grep Shell: | head -1 | awk '{ print $NF }'`"
|
|
||||||
|
|
||||||
else
|
# Run from the installer, do some trickery to fetch the information
|
||||||
theShell="${SHELL}"
|
# we need.
|
||||||
fi
|
theShell="`finger $USER | grep Shell: | head -1 | awk '{ print $NF }'`"
|
||||||
|
|
||||||
# Make sure the directory ${PYTHON_ROOT}/bin is on the users PATH.
|
# Make sure the directory ${PYTHON_ROOT}/bin is on the users PATH.
|
||||||
BSH="`basename "${theShell}"`"
|
BSH="`basename "${theShell}"`"
|
||||||
case "${BSH}" in
|
case "${BSH}" in
|
||||||
bash|ksh|sh|*csh|zsh|fish)
|
bash|ksh|sh|*csh|zsh|fish)
|
||||||
if [ `id -ur` = 0 ]; then
|
true
|
||||||
P=`su - ${USER} -c 'echo A-X-4-X@@$PATH@@X-4-X-A' | grep 'A-X-4-X@@.*@@X-4-X-A' | sed -e 's/^A-X-4-X@@//g' -e 's/@@X-4-X-A$//g'`
|
;;
|
||||||
else
|
|
||||||
P="`(exec -l ${theShell} -c 'echo $PATH')`"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
*)
|
*)
|
||||||
echo "Sorry, I don't know how to patch $BSH shells"
|
exit 0
|
||||||
exit 0
|
;;
|
||||||
;;
|
|
||||||
esac
|
esac
|
||||||
|
|
||||||
# Now ensure that our bin directory is on $P and before /usr/bin at that
|
|
||||||
for elem in `echo $P | tr ':' ' '`
|
|
||||||
do
|
|
||||||
if [ "${elem}" = "${PYTHON_ROOT}/bin" ]; then
|
|
||||||
echo "All right, you're a python lover already"
|
|
||||||
exit 0
|
|
||||||
elif [ "${elem}" = "/usr/bin" ]; then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
echo "${PYTHON_ROOT}/bin is not on your PATH or at least not early enough"
|
|
||||||
case "${BSH}" in
|
case "${BSH}" in
|
||||||
*csh)
|
*csh)
|
||||||
if [ -f "${HOME}/.tcshrc" ]; then
|
if [ -f "${HOME}/.tcshrc" ]; then
|
||||||
RC="${HOME}/.tcshrc"
|
RC="${HOME}/.tcshrc"
|
||||||
else
|
else
|
||||||
RC="${HOME}/.cshrc"
|
RC="${HOME}/.cshrc"
|
||||||
fi
|
fi
|
||||||
# Create backup copy before patching
|
|
||||||
if [ -f "${RC}" ]; then
|
# Drop privileges while writing files.
|
||||||
cp -fp "${RC}" "${RC}.pysave"
|
su -m ${USER} <<EOFC
|
||||||
fi
|
# Create backup copy before patching
|
||||||
echo "" >> "${RC}"
|
if [ -f "${RC}" ]; then
|
||||||
echo "# Setting PATH for Python ${PYVER}" >> "${RC}"
|
cp -fp "${RC}" "${RC}.pysave"
|
||||||
echo "# The original version is saved in .cshrc.pysave" >> "${RC}"
|
fi
|
||||||
echo "set path=(${PYTHON_ROOT}/bin "'$path'")" >> "${RC}"
|
echo "" >> "${RC}"
|
||||||
if [ `id -ur` = 0 ]; then
|
echo "# Setting PATH for Python ${PYVER}" >> "${RC}"
|
||||||
chown "${USER}" "${RC}"
|
echo "# The original version is saved in .cshrc.pysave" >> "${RC}"
|
||||||
fi
|
echo "set path=(${PYTHON_ROOT}/bin "'\$path'")" >> "${RC}"
|
||||||
exit 0
|
EOFC
|
||||||
;;
|
|
||||||
|
if [ `id -ur` = 0 ]; then
|
||||||
|
chown -h "${USER}" "${RC}"
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
bash)
|
bash)
|
||||||
if [ -e "${HOME}/.bash_profile" ]; then
|
if [ -e "${HOME}/.bash_profile" ]; then
|
||||||
PR="${HOME}/.bash_profile"
|
PR="${HOME}/.bash_profile"
|
||||||
elif [ -e "${HOME}/.bash_login" ]; then
|
elif [ -e "${HOME}/.bash_login" ]; then
|
||||||
PR="${HOME}/.bash_login"
|
PR="${HOME}/.bash_login"
|
||||||
elif [ -e "${HOME}/.profile" ]; then
|
elif [ -e "${HOME}/.profile" ]; then
|
||||||
PR="${HOME}/.profile"
|
PR="${HOME}/.profile"
|
||||||
else
|
else
|
||||||
PR="${HOME}/.bash_profile"
|
PR="${HOME}/.bash_profile"
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
fish)
|
fish)
|
||||||
CONFIG_DIR="${HOME}/.config/fish/conf.d/"
|
CONFIG_DIR="${HOME}/.config/fish/conf.d/"
|
||||||
RC="${CONFIG_DIR}/python-${PYVER}.fish"
|
RC="${CONFIG_DIR}/python-${PYVER}.fish"
|
||||||
mkdir -p "$CONFIG_DIR"
|
|
||||||
if [ -f "${RC}" ]; then
|
# Drop privileges while writing files.
|
||||||
cp -fp "${RC}" "${RC}.pysave"
|
su -m ${USER} <<EOFF
|
||||||
fi
|
mkdir -p "$CONFIG_DIR"
|
||||||
echo "# Setting PATH for Python ${PYVER}" > "${RC}"
|
if [ -f "${RC}" ]; then
|
||||||
if [ -f "${RC}.pysave" ]; then
|
cp -fp "${RC}" "${RC}.pysave"
|
||||||
echo "# The original version is saved in ${RC}.pysave" >> "${RC}"
|
fi
|
||||||
fi
|
echo "# Setting PATH for Python ${PYVER}" > "${RC}"
|
||||||
echo "fish_add_path -g \"${PYTHON_ROOT}/bin\"" >> "${RC}"
|
if [ -f "${RC}.pysave" ]; then
|
||||||
if [ `id -ur` = 0 ]; then
|
echo "# The original version is saved in ${RC}.pysave" >> "${RC}"
|
||||||
chown "${USER}" "${RC}"
|
fi
|
||||||
fi
|
echo "fish_add_path -g \"${PYTHON_ROOT}/bin\"" >> "${RC}"
|
||||||
exit 0
|
EOFF
|
||||||
;;
|
|
||||||
|
if [ `id -ur` = 0 ]; then
|
||||||
|
chown -h "${USER}" "${RC}"
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
zsh)
|
zsh)
|
||||||
PR="${HOME}/.zprofile"
|
PR="${HOME}/.zprofile"
|
||||||
;;
|
;;
|
||||||
*sh)
|
*sh)
|
||||||
PR="${HOME}/.profile"
|
PR="${HOME}/.profile"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
# Drop privileges while writing files.
|
||||||
|
su -m ${USER} <<EOFS
|
||||||
# Create backup copy before patching
|
# Create backup copy before patching
|
||||||
if [ -f "${PR}" ]; then
|
if [ -f "${PR}" ]; then
|
||||||
cp -fp "${PR}" "${PR}.pysave"
|
cp -fp "${PR}" "${PR}.pysave"
|
||||||
fi
|
fi
|
||||||
echo "" >> "${PR}"
|
echo "" >> "${PR}"
|
||||||
echo "# Setting PATH for Python ${PYVER}" >> "${PR}"
|
echo "# Setting PATH for Python ${PYVER}" >> "${PR}"
|
||||||
echo "# The original version is saved in `basename ${PR}`.pysave" >> "${PR}"
|
echo "# The original version is saved in `basename ${PR}`.pysave" >> "${PR}"
|
||||||
echo 'PATH="'"${PYTHON_ROOT}/bin"':${PATH}"' >> "${PR}"
|
echo 'PATH="'"${PYTHON_ROOT}/bin"':\${PATH}"' >> "${PR}"
|
||||||
echo 'export PATH' >> "${PR}"
|
echo 'export PATH' >> "${PR}"
|
||||||
|
EOFS
|
||||||
|
|
||||||
if [ `id -ur` = 0 ]; then
|
if [ `id -ur` = 0 ]; then
|
||||||
chown "${USER}" "${PR}"
|
chown -h "${USER}" "${PR}"
|
||||||
fi
|
fi
|
||||||
exit 0
|
exit 0
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
macOS installer shell path management improvements: separate the installer
|
||||||
|
``Shell profile updater`` postinstall script from the
|
||||||
|
``Update Shell Profile.command`` to enable more robust error handling.
|
||||||
Loading…
Add table
Add a link
Reference in a new issue