From eef04c62c2dfbd81f9fee6752e3b7e0b9c3bf617 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Sat, 31 Oct 2020 23:53:03 +0100 Subject: [PATCH] fix(installer): fix error message if $ZSH exists when installing Also prefix all formatting functions with fmt_ Related: #9427 --- .editorconfig | 6 +- tools/install.sh | 365 +++++++++++++++++++++++++---------------------- 2 files changed, 195 insertions(+), 176 deletions(-) diff --git a/.editorconfig b/.editorconfig index aa18e0e5c..b5321de59 100644 --- a/.editorconfig +++ b/.editorconfig @@ -4,7 +4,5 @@ root = true end_of_line = lf insert_final_newline = true charset = utf-8 - -[*.sh] -indent_size = 4 -indent_style = tab +indent_size = 2 +indent_style = space diff --git a/tools/install.sh b/tools/install.sh index 61b21cb9e..953c68baf 100755 --- a/tools/install.sh +++ b/tools/install.sh @@ -37,6 +37,9 @@ # set -e +# Track if $ZSH was provided +custom_zsh=${ZSH:+yes} + # Default settings ZSH=${ZSH:-~/.oh-my-zsh} REPO=${REPO:-ohmyzsh/ohmyzsh} @@ -53,12 +56,16 @@ command_exists() { command -v "$@" >/dev/null 2>&1 } -error() { - echo ${RED}"Error: $@"${RESET} >&2 +fmt_error() { + echo ${RED}"Error: $@"${RESET} >&2 } -underline() { - echo "$(printf '\033[4m')$@$(printf '\033[24m')" +fmt_underline() { + echo "$(printf '\033[4m')$@$(printf '\033[24m')" +} + +fmt_code() { + echo "\`$(printf '\033[38;5;247m')$@${RESET}\`" } setup_color() { @@ -81,71 +88,71 @@ setup_color() { } setup_ohmyzsh() { - # Prevent the cloned repository from having insecure permissions. Failing to do - # so causes compinit() calls to fail with "command not found: compdef" errors - # for users with insecure umasks (e.g., "002", allowing group writability). Note - # that this will be ignored under Cygwin by default, as Windows ACLs take - # precedence over umasks except for filesystems mounted with option "noacl". - umask g-w,o-w + # Prevent the cloned repository from having insecure permissions. Failing to do + # so causes compinit() calls to fail with "command not found: compdef" errors + # for users with insecure umasks (e.g., "002", allowing group writability). Note + # that this will be ignored under Cygwin by default, as Windows ACLs take + # precedence over umasks except for filesystems mounted with option "noacl". + umask g-w,o-w - echo "${BLUE}Cloning Oh My Zsh...${RESET}" + echo "${BLUE}Cloning Oh My Zsh...${RESET}" - command_exists git || { - error "git is not installed" - exit 1 - } + command_exists git || { + fmt_error "git is not installed" + exit 1 + } - if [ "$OSTYPE" = cygwin ] && git --version | grep -q msysgit; then - error "Windows/MSYS Git is not supported on Cygwin" - error "Make sure the Cygwin git package is installed and is first on the \$PATH" - exit 1 - fi + if [ "$OSTYPE" = cygwin ] && git --version | grep -q msysgit; then + fmt_error "Windows/MSYS Git is not supported on Cygwin" + fmt_error "Make sure the Cygwin git package is installed and is first on the \$PATH" + exit 1 + fi - git clone -c core.eol=lf -c core.autocrlf=false \ - -c fsck.zeroPaddedFilemode=ignore \ - -c fetch.fsck.zeroPaddedFilemode=ignore \ - -c receive.fsck.zeroPaddedFilemode=ignore \ - --depth=1 --branch "$BRANCH" "$REMOTE" "$ZSH" || { - error "git clone of oh-my-zsh repo failed" - exit 1 - } + git clone -c core.eol=lf -c core.autocrlf=false \ + -c fsck.zeroPaddedFilemode=ignore \ + -c fetch.fsck.zeroPaddedFilemode=ignore \ + -c receive.fsck.zeroPaddedFilemode=ignore \ + --depth=1 --branch "$BRANCH" "$REMOTE" "$ZSH" || { + fmt_error "git clone of oh-my-zsh repo failed" + exit 1 + } - echo + echo } setup_zshrc() { - # Keep most recent old .zshrc at .zshrc.pre-oh-my-zsh, and older ones - # with datestamp of installation that moved them aside, so we never actually - # destroy a user's original zshrc - echo "${BLUE}Looking for an existing zsh config...${RESET}" + # Keep most recent old .zshrc at .zshrc.pre-oh-my-zsh, and older ones + # with datestamp of installation that moved them aside, so we never actually + # destroy a user's original zshrc + echo "${BLUE}Looking for an existing zsh config...${RESET}" - # Must use this exact name so uninstall.sh can find it - OLD_ZSHRC=~/.zshrc.pre-oh-my-zsh - if [ -f ~/.zshrc ] || [ -h ~/.zshrc ]; then - # Skip this if the user doesn't want to replace an existing .zshrc - if [ $KEEP_ZSHRC = yes ]; then - echo "${YELLOW}Found ~/.zshrc.${RESET} ${GREEN}Keeping...${RESET}" - return - fi - if [ -e "$OLD_ZSHRC" ]; then - OLD_OLD_ZSHRC="${OLD_ZSHRC}-$(date +%Y-%m-%d_%H-%M-%S)" - if [ -e "$OLD_OLD_ZSHRC" ]; then - error "$OLD_OLD_ZSHRC exists. Can't back up ${OLD_ZSHRC}" - error "re-run the installer again in a couple of seconds" - exit 1 - fi - mv "$OLD_ZSHRC" "${OLD_OLD_ZSHRC}" + # Must use this exact name so uninstall.sh can find it + OLD_ZSHRC=~/.zshrc.pre-oh-my-zsh + if [ -f ~/.zshrc ] || [ -h ~/.zshrc ]; then + # Skip this if the user doesn't want to replace an existing .zshrc + if [ $KEEP_ZSHRC = yes ]; then + echo "${YELLOW}Found ~/.zshrc.${RESET} ${GREEN}Keeping...${RESET}" + return + fi + if [ -e "$OLD_ZSHRC" ]; then + OLD_OLD_ZSHRC="${OLD_ZSHRC}-$(date +%Y-%m-%d_%H-%M-%S)" + if [ -e "$OLD_OLD_ZSHRC" ]; then + fmt_error "$OLD_OLD_ZSHRC exists. Can't back up ${OLD_ZSHRC}" + fmt_error "re-run the installer again in a couple of seconds" + exit 1 + fi + mv "$OLD_ZSHRC" "${OLD_OLD_ZSHRC}" - echo "${YELLOW}Found old ~/.zshrc.pre-oh-my-zsh." \ - "${GREEN}Backing up to ${OLD_OLD_ZSHRC}${RESET}" - fi - echo "${YELLOW}Found ~/.zshrc.${RESET} ${GREEN}Backing up to ${OLD_ZSHRC}${RESET}" - mv ~/.zshrc "$OLD_ZSHRC" - fi + echo "${YELLOW}Found old ~/.zshrc.pre-oh-my-zsh." \ + "${GREEN}Backing up to ${OLD_OLD_ZSHRC}${RESET}" + fi + echo "${YELLOW}Found ~/.zshrc.${RESET} ${GREEN}Backing up to ${OLD_ZSHRC}${RESET}" + mv ~/.zshrc "$OLD_ZSHRC" + fi - echo "${GREEN}Using the Oh My Zsh template file and adding it to ~/.zshrc.${RESET}" + echo "${GREEN}Using the Oh My Zsh template file and adding it to ~/.zshrc.${RESET}" - sed "/^export ZSH=/ c\\ + sed "/^export ZSH=/ c\\ export ZSH=\"$ZSH\" " "$ZSH/templates/zshrc.zsh-template" > ~/.zshrc-omztemp mv -f ~/.zshrc-omztemp ~/.zshrc @@ -154,146 +161,160 @@ export ZSH=\"$ZSH\" } setup_shell() { - # Skip setup if the user wants or stdin is closed (not running interactively). - if [ $CHSH = no ]; then - return - fi + # Skip setup if the user wants or stdin is closed (not running interactively). + if [ $CHSH = no ]; then + return + fi - # If this user's login shell is already "zsh", do not attempt to switch. - if [ "$(basename "$SHELL")" = "zsh" ]; then - return - fi + # If this user's login shell is already "zsh", do not attempt to switch. + if [ "$(basename -- "$SHELL")" = "zsh" ]; then + return + fi - # If this platform doesn't provide a "chsh" command, bail out. - if ! command_exists chsh; then - cat <<-EOF - I can't change your shell automatically because this system does not have chsh. - ${BLUE}Please manually change your default shell to zsh${RESET} - EOF - return - fi + # If this platform doesn't provide a "chsh" command, bail out. + if ! command_exists chsh; then + cat < ~/.shell.pre-oh-my-zsh - else - grep "^$USER:" /etc/passwd | awk -F: '{print $7}' > ~/.shell.pre-oh-my-zsh - fi + # We're going to change the default shell, so back up the current one + if [ -n "$SHELL" ]; then + echo $SHELL > ~/.shell.pre-oh-my-zsh + else + grep "^$USER:" /etc/passwd | awk -F: '{print $7}' > ~/.shell.pre-oh-my-zsh + fi - # Actually change the default shell to zsh - if ! chsh -s "$zsh"; then - error "chsh command unsuccessful. Change your default shell manually." - else - export SHELL="$zsh" - echo "${GREEN}Shell successfully changed to '$zsh'.${RESET}" - fi + # Actually change the default shell to zsh + if ! chsh -s "$zsh"; then + fmt_error "chsh command unsuccessful. Change your default shell manually." + else + export SHELL="$zsh" + echo "${GREEN}Shell successfully changed to '$zsh'.${RESET}" + fi - echo + echo } main() { - # Run as unattended if stdin is closed - if [ ! -t 0 ]; then - RUNZSH=no - CHSH=no - fi + # Run as unattended if stdin is not a tty + if [ ! -t 0 ]; then + RUNZSH=no + CHSH=no + fi - # Parse arguments - while [ $# -gt 0 ]; do - case $1 in - --unattended) RUNZSH=no; CHSH=no ;; - --skip-chsh) CHSH=no ;; - --keep-zshrc) KEEP_ZSHRC=yes ;; - esac - shift - done + # Parse arguments + while [ $# -gt 0 ]; do + case $1 in + --unattended) RUNZSH=no; CHSH=no ;; + --skip-chsh) CHSH=no ;; + --keep-zshrc) KEEP_ZSHRC=yes ;; + esac + shift + done - setup_color + setup_color - if ! command_exists zsh; then - echo "${YELLOW}Zsh is not installed.${RESET} Please install zsh first." - exit 1 - fi + if ! command_exists zsh; then + echo "${YELLOW}Zsh is not installed.${RESET} Please install zsh first." + exit 1 + fi - if [ -d "$ZSH" ]; then - cat <<-EOF - ${YELLOW}You already have Oh My Zsh installed.${RESET} - You'll need to remove '$ZSH' if you want to reinstall. - EOF - exit 1 - fi + if [ -d "$ZSH" ]; then + echo "${YELLOW}The \$ZSH folder already exists ($ZSH).${RESET}" + if [ "$custom_zsh" = yes ]; then + cat <