fix(installer): fix error message if $ZSH exists when installing

Also prefix all formatting functions with fmt_

Related: #9427
This commit is contained in:
Marc Cornellà 2020-10-31 23:53:03 +01:00
parent a3e0f4f2af
commit eef04c62c2
2 changed files with 195 additions and 176 deletions

View file

@ -4,7 +4,5 @@ root = true
end_of_line = lf end_of_line = lf
insert_final_newline = true insert_final_newline = true
charset = utf-8 charset = utf-8
indent_size = 2
[*.sh] indent_style = space
indent_size = 4
indent_style = tab

View file

@ -37,6 +37,9 @@
# #
set -e set -e
# Track if $ZSH was provided
custom_zsh=${ZSH:+yes}
# Default settings # Default settings
ZSH=${ZSH:-~/.oh-my-zsh} ZSH=${ZSH:-~/.oh-my-zsh}
REPO=${REPO:-ohmyzsh/ohmyzsh} REPO=${REPO:-ohmyzsh/ohmyzsh}
@ -53,14 +56,18 @@ command_exists() {
command -v "$@" >/dev/null 2>&1 command -v "$@" >/dev/null 2>&1
} }
error() { fmt_error() {
echo ${RED}"Error: $@"${RESET} >&2 echo ${RED}"Error: $@"${RESET} >&2
} }
underline() { fmt_underline() {
echo "$(printf '\033[4m')$@$(printf '\033[24m')" echo "$(printf '\033[4m')$@$(printf '\033[24m')"
} }
fmt_code() {
echo "\`$(printf '\033[38;5;247m')$@${RESET}\`"
}
setup_color() { setup_color() {
# Only use colors if connected to a terminal # Only use colors if connected to a terminal
if [ -t 1 ]; then if [ -t 1 ]; then
@ -91,13 +98,13 @@ setup_ohmyzsh() {
echo "${BLUE}Cloning Oh My Zsh...${RESET}" echo "${BLUE}Cloning Oh My Zsh...${RESET}"
command_exists git || { command_exists git || {
error "git is not installed" fmt_error "git is not installed"
exit 1 exit 1
} }
if [ "$OSTYPE" = cygwin ] && git --version | grep -q msysgit; then if [ "$OSTYPE" = cygwin ] && git --version | grep -q msysgit; then
error "Windows/MSYS Git is not supported on Cygwin" fmt_error "Windows/MSYS Git is not supported on Cygwin"
error "Make sure the Cygwin git package is installed and is first on the \$PATH" fmt_error "Make sure the Cygwin git package is installed and is first on the \$PATH"
exit 1 exit 1
fi fi
@ -106,7 +113,7 @@ setup_ohmyzsh() {
-c fetch.fsck.zeroPaddedFilemode=ignore \ -c fetch.fsck.zeroPaddedFilemode=ignore \
-c receive.fsck.zeroPaddedFilemode=ignore \ -c receive.fsck.zeroPaddedFilemode=ignore \
--depth=1 --branch "$BRANCH" "$REMOTE" "$ZSH" || { --depth=1 --branch "$BRANCH" "$REMOTE" "$ZSH" || {
error "git clone of oh-my-zsh repo failed" fmt_error "git clone of oh-my-zsh repo failed"
exit 1 exit 1
} }
@ -130,8 +137,8 @@ setup_zshrc() {
if [ -e "$OLD_ZSHRC" ]; then if [ -e "$OLD_ZSHRC" ]; then
OLD_OLD_ZSHRC="${OLD_ZSHRC}-$(date +%Y-%m-%d_%H-%M-%S)" OLD_OLD_ZSHRC="${OLD_ZSHRC}-$(date +%Y-%m-%d_%H-%M-%S)"
if [ -e "$OLD_OLD_ZSHRC" ]; then if [ -e "$OLD_OLD_ZSHRC" ]; then
error "$OLD_OLD_ZSHRC exists. Can't back up ${OLD_ZSHRC}" fmt_error "$OLD_OLD_ZSHRC exists. Can't back up ${OLD_ZSHRC}"
error "re-run the installer again in a couple of seconds" fmt_error "re-run the installer again in a couple of seconds"
exit 1 exit 1
fi fi
mv "$OLD_ZSHRC" "${OLD_OLD_ZSHRC}" mv "$OLD_ZSHRC" "${OLD_OLD_ZSHRC}"
@ -160,16 +167,16 @@ setup_shell() {
fi fi
# If this user's login shell is already "zsh", do not attempt to switch. # If this user's login shell is already "zsh", do not attempt to switch.
if [ "$(basename "$SHELL")" = "zsh" ]; then if [ "$(basename -- "$SHELL")" = "zsh" ]; then
return return
fi fi
# If this platform doesn't provide a "chsh" command, bail out. # If this platform doesn't provide a "chsh" command, bail out.
if ! command_exists chsh; then if ! command_exists chsh; then
cat <<-EOF cat <<EOF
I can't change your shell automatically because this system does not have chsh. I can't change your shell automatically because this system does not have chsh.
${BLUE}Please manually change your default shell to zsh${RESET} ${BLUE}Please manually change your default shell to zsh${RESET}
EOF EOF
return return
fi fi
@ -197,7 +204,7 @@ setup_shell() {
elif [ -f /usr/share/defaults/etc/shells ]; then # Solus OS elif [ -f /usr/share/defaults/etc/shells ]; then # Solus OS
shells_file=/usr/share/defaults/etc/shells shells_file=/usr/share/defaults/etc/shells
else else
error "could not find /etc/shells file. Change your default shell manually." fmt_error "could not find /etc/shells file. Change your default shell manually."
return return
fi fi
@ -206,8 +213,8 @@ setup_shell() {
# 2. If that fails, get a zsh path from the shells file, then check it actually exists # 2. If that fails, get a zsh path from the shells file, then check it actually exists
if ! zsh=$(which zsh) || ! grep -qx "$zsh" "$shells_file"; then if ! zsh=$(which zsh) || ! grep -qx "$zsh" "$shells_file"; then
if ! zsh=$(grep '^/.*/zsh$' "$shells_file" | tail -1) || [ ! -f "$zsh" ]; then if ! zsh=$(grep '^/.*/zsh$' "$shells_file" | tail -1) || [ ! -f "$zsh" ]; then
error "no zsh binary found or not present in '$shells_file'" fmt_error "no zsh binary found or not present in '$shells_file'"
error "change your default shell manually." fmt_error "change your default shell manually."
return return
fi fi
fi fi
@ -222,7 +229,7 @@ setup_shell() {
# Actually change the default shell to zsh # Actually change the default shell to zsh
if ! chsh -s "$zsh"; then if ! chsh -s "$zsh"; then
error "chsh command unsuccessful. Change your default shell manually." fmt_error "chsh command unsuccessful. Change your default shell manually."
else else
export SHELL="$zsh" export SHELL="$zsh"
echo "${GREEN}Shell successfully changed to '$zsh'.${RESET}" echo "${GREEN}Shell successfully changed to '$zsh'.${RESET}"
@ -232,7 +239,7 @@ setup_shell() {
} }
main() { main() {
# Run as unattended if stdin is closed # Run as unattended if stdin is not a tty
if [ ! -t 0 ]; then if [ ! -t 0 ]; then
RUNZSH=no RUNZSH=no
CHSH=no CHSH=no
@ -256,10 +263,24 @@ main() {
fi fi
if [ -d "$ZSH" ]; then if [ -d "$ZSH" ]; then
cat <<-EOF echo "${YELLOW}The \$ZSH folder already exists ($ZSH).${RESET}"
${YELLOW}You already have Oh My Zsh installed.${RESET} if [ "$custom_zsh" = yes ]; then
You'll need to remove '$ZSH' if you want to reinstall. cat <<EOF
EOF
You ran the installer with the \$ZSH setting or the \$ZSH variable is
exported. You have 3 options:
1. Unset the ZSH variable when calling the installer:
$(fmt_code "ZSH= sh install.sh")
2. Install Oh My Zsh to a directory that doesn't exist yet:
$(fmt_code "ZSH=path/to/new/ohmyzsh/folder sh install.sh")
3. (Caution) If the folder doesn't contain important information,
you can just remove it with $(fmt_code "rm -r $ZSH")
EOF
else
echo "You'll need to remove it if you want to reinstall."
fi
exit 1 exit 1
fi fi
@ -268,24 +289,24 @@ main() {
setup_shell setup_shell
printf "$GREEN" printf "$GREEN"
cat <<-'EOF' cat <<'EOF'
__ __ __ __
____ / /_ ____ ___ __ __ ____ _____/ /_ ____ / /_ ____ ___ __ __ ____ _____/ /_
/ __ \/ __ \ / __ `__ \/ / / / /_ / / ___/ __ \ / __ \/ __ \ / __ `__ \/ / / / /_ / / ___/ __ \
/ /_/ / / / / / / / / / / /_/ / / /_(__ ) / / / / /_/ / / / / / / / / / / /_/ / / /_(__ ) / / /
\____/_/ /_/ /_/ /_/ /_/\__, / /___/____/_/ /_/ \____/_/ /_/ /_/ /_/ /_/\__, / /___/____/_/ /_/
/____/ ....is now installed! /____/ ....is now installed!
EOF EOF
cat <<-EOF cat <<EOF
Before you scream Oh My Zsh! please look over the ~/.zshrc file to select plugins, themes, and options. Before you scream Oh My Zsh! please look over the ~/.zshrc file to select plugins, themes, and options.
• Follow us on Twitter: $(underline https://twitter.com/ohmyzsh) • Follow us on Twitter: $(fmt_underline https://twitter.com/ohmyzsh)
• Join our Discord server: $(underline https://discord.gg/ohmyzsh) • Join our Discord server: $(fmt_underline https://discord.gg/ohmyzsh)
• Get stickers, shirts, coffee mugs and other swag: $(underline https://shop.planetargon.com/collections/oh-my-zsh) • Get stickers, shirts, coffee mugs and other swag: $(fmt_underline https://shop.planetargon.com/collections/oh-my-zsh)
EOF EOF
printf "$RESET" printf "$RESET"
if [ $RUNZSH = no ]; then if [ $RUNZSH = no ]; then