diff options
| author | Marc Cornellà <marc.cornella@live.com> | 2020-10-31 23:14:24 +0100 | 
|---|---|---|
| committer | Marc Cornellà <marc.cornella@live.com> | 2020-11-30 15:48:46 +0100 | 
| commit | 889cd7acf349f1cae81c07378986157b382f7f1d (patch) | |
| tree | 4990a515004db37da7f1e89c40ea5b9b92af45ba | |
| parent | 05e2956dc61198d4767b96d97c5d10c93cedd6e3 (diff) | |
| download | zsh-889cd7acf349f1cae81c07378986157b382f7f1d.tar.gz zsh-889cd7acf349f1cae81c07378986157b382f7f1d.tar.bz2 zsh-889cd7acf349f1cae81c07378986157b382f7f1d.zip  | |
refactor(updater): switch to Zsh execution and fix git remote detection logic
| -rw-r--r-- | lib/cli.zsh | 2 | ||||
| -rw-r--r-- | lib/functions.zsh | 2 | ||||
| -rw-r--r-- | tools/check_for_upgrade.sh | 110 | ||||
| -rwxr-xr-x[-rw-r--r--] | tools/upgrade.sh | 98 | 
4 files changed, 112 insertions, 100 deletions
diff --git a/lib/cli.zsh b/lib/cli.zsh index b1478a89f..30790bec7 100644 --- a/lib/cli.zsh +++ b/lib/cli.zsh @@ -351,7 +351,7 @@ function _omz::theme::use {  function _omz::update {      # Run update script -    env ZSH="$ZSH" sh "$ZSH/tools/upgrade.sh" +    env ZSH="$ZSH" zsh -f "$ZSH/tools/upgrade.sh"      # Update last updated file      zmodload zsh/datetime      echo "LAST_EPOCH=$(( EPOCHSECONDS / 60 / 60 / 24 ))" >! "${ZSH_CACHE_DIR}/.zsh-update" diff --git a/lib/functions.zsh b/lib/functions.zsh index 15526cd5f..f6f34e851 100644 --- a/lib/functions.zsh +++ b/lib/functions.zsh @@ -14,7 +14,7 @@ function upgrade_oh_my_zsh() {    fi    # Run update script -  env ZSH="$ZSH" sh "$ZSH/tools/upgrade.sh" +  env ZSH="$ZSH" zsh -f "$ZSH/tools/upgrade.sh"    # Update last updated file    zmodload zsh/datetime    echo "LAST_EPOCH=$(( EPOCHSECONDS / 60 / 60 / 24 ))" >! "${ZSH_CACHE_DIR}/.zsh-update" diff --git a/tools/check_for_upgrade.sh b/tools/check_for_upgrade.sh index cadd5fe49..17925af8b 100644 --- a/tools/check_for_upgrade.sh +++ b/tools/check_for_upgrade.sh @@ -1,6 +1,6 @@  # Migrate .zsh-update file to $ZSH_CACHE_DIR  if [[ -f ~/.zsh-update && ! -f "${ZSH_CACHE_DIR}/.zsh-update" ]]; then -    mv ~/.zsh-update "${ZSH_CACHE_DIR}/.zsh-update" +  mv ~/.zsh-update "${ZSH_CACHE_DIR}/.zsh-update"  fi  # Cancel update if: @@ -10,79 +10,81 @@ fi  if [[ "$DISABLE_AUTO_UPDATE" = true ]] \     || [[ ! -w "$ZSH" || ! -O "$ZSH" ]] \     || ! command -v git &>/dev/null; then -    return +  return  fi  function current_epoch() { -    zmodload zsh/datetime -    echo $(( EPOCHSECONDS / 60 / 60 / 24 )) +  zmodload zsh/datetime +  echo $(( EPOCHSECONDS / 60 / 60 / 24 ))  }  function update_last_updated_file() { -    echo "LAST_EPOCH=$(current_epoch)" >! "${ZSH_CACHE_DIR}/.zsh-update" +  echo "LAST_EPOCH=$(current_epoch)" >! "${ZSH_CACHE_DIR}/.zsh-update"  }  function update_ohmyzsh() { -    ZSH="$ZSH" sh "$ZSH/tools/upgrade.sh" -    update_last_updated_file +  ZSH="$ZSH" zsh -f "$ZSH/tools/upgrade.sh" +  update_last_updated_file  }  () { -    emulate -L zsh +  emulate -L zsh -    local epoch_target mtime option LAST_EPOCH +  local epoch_target mtime option LAST_EPOCH -    # Remove lock directory if older than a day -    zmodload zsh/datetime -    zmodload -F zsh/stat b:zstat -    if mtime=$(zstat +mtime "$ZSH/log/update.lock" 2>/dev/null); then -        if (( (mtime + 3600 * 24) < EPOCHSECONDS )); then -            command rm -rf "$ZSH/log/update.lock" -        fi +  # Remove lock directory if older than a day +  zmodload zsh/datetime +  zmodload -F zsh/stat b:zstat +  if mtime=$(zstat +mtime "$ZSH/log/update.lock" 2>/dev/null); then +    if (( (mtime + 3600 * 24) < EPOCHSECONDS )); then +      command rm -rf "$ZSH/log/update.lock"      fi +  fi -    # Check for lock directory -    if ! command mkdir "$ZSH/log/update.lock" 2>/dev/null; then -        return -    fi +  # Check for lock directory +  if ! command mkdir "$ZSH/log/update.lock" 2>/dev/null; then +    return +  fi -    # Remove lock directory on exit. `return 1` is important for when trapping a SIGINT: -    #  The return status from the function is handled specially. If it is zero, the signal is -    #  assumed to have been handled, and execution continues normally. Otherwise, the shell -    #  will behave as interrupted except that the return status of the trap is retained. -    trap "command rm -rf '$ZSH/log/update.lock'; return 1" EXIT INT QUIT +  # Remove lock directory on exit. `return 1` is important for when trapping a SIGINT: +  #  The return status from the function is handled specially. If it is zero, the signal is +  #  assumed to have been handled, and execution continues normally. Otherwise, the shell +  #  will behave as interrupted except that the return status of the trap is retained. +  trap " +  unset -f current_epoch update_last_updated_file update_ohmyzsh +  command rm -rf '$ZSH/log/update.lock' +  return 1 +  " EXIT INT QUIT -    # Create or update .zsh-update file if missing or malformed -    if ! source "${ZSH_CACHE_DIR}/.zsh-update" 2>/dev/null || [[ -z "$LAST_EPOCH" ]]; then -        update_last_updated_file -        return -    fi +  # Create or update .zsh-update file if missing or malformed +  if ! source "${ZSH_CACHE_DIR}/.zsh-update" 2>/dev/null || [[ -z "$LAST_EPOCH" ]]; then +    update_last_updated_file +    return +  fi -    # Number of days before trying to update again -    epoch_target=${UPDATE_ZSH_DAYS:-13} -    # Test if enough time has passed until the next update -    if (( ( $(current_epoch) - $LAST_EPOCH ) < $epoch_target )); then -        return -    fi +  # Number of days before trying to update again +  epoch_target=${UPDATE_ZSH_DAYS:-13} +  # Test if enough time has passed until the next update +  if (( ( $(current_epoch) - $LAST_EPOCH ) < $epoch_target )); then +    return +  fi -    # Ask for confirmation before updating unless disabled -    if [[ "$DISABLE_UPDATE_PROMPT" = true ]]; then -        update_ohmyzsh -    else -        # input sink to swallow all characters typed before the prompt -        # and add a newline if there wasn't one after characters typed -        while read -t -k 1 option; do true; done -        [[ "$option" != ($'\n'|"") ]] && echo +  # Ask for confirmation before updating unless disabled +  if [[ "$DISABLE_UPDATE_PROMPT" = true ]]; then +    update_ohmyzsh +  else +    # input sink to swallow all characters typed before the prompt +    # and add a newline if there wasn't one after characters typed +    while read -t -k 1 option; do true; done +    [[ "$option" != ($'\n'|"") ]] && echo -        echo -n "[oh-my-zsh] Would you like to update? [Y/n] " -        read -r -k 1 option -        [[ "$option" != $'\n' ]] && echo -        case "$option" in -            [yY$'\n']) update_ohmyzsh ;; -            [nN]) update_last_updated_file ;; -        esac -    fi +    echo -n "[oh-my-zsh] Would you like to update? [Y/n] " +    read -r -k 1 option +    [[ "$option" != $'\n' ]] && echo +    case "$option" in +      [yY$'\n']) update_ohmyzsh ;; +      [nN]) update_last_updated_file ;; +    esac +  fi  } - -unset -f current_epoch update_last_updated_file update_ohmyzsh diff --git a/tools/upgrade.sh b/tools/upgrade.sh index e005519d6..634d5c03d 100644..100755 --- a/tools/upgrade.sh +++ b/tools/upgrade.sh @@ -1,13 +1,23 @@ -# Use colors, but only if connected to a terminal, and that terminal -# supports them. +#!/usr/bin/env zsh + +cd "$ZSH" + +# Use colors, but only if connected to a terminal +# and that terminal supports them. + +local -a RAINBOW +local RED GREEN YELLOW BLUE UNDER BOLD RESET +  if [ -t 1 ]; then -  RB_RED=$(printf '\033[38;5;196m') -  RB_ORANGE=$(printf '\033[38;5;202m') -  RB_YELLOW=$(printf '\033[38;5;226m') -  RB_GREEN=$(printf '\033[38;5;082m') -  RB_BLUE=$(printf '\033[38;5;021m') -  RB_INDIGO=$(printf '\033[38;5;093m') -  RB_VIOLET=$(printf '\033[38;5;163m') +  RAINBOW=( +    "$(printf '\033[38;5;196m')" +    "$(printf '\033[38;5;202m')" +    "$(printf '\033[38;5;226m')" +    "$(printf '\033[38;5;082m')" +    "$(printf '\033[38;5;021m')" +    "$(printf '\033[38;5;093m')" +    "$(printf '\033[38;5;163m')" +  )    RED=$(printf '\033[31m')    GREEN=$(printf '\033[32m') @@ -16,25 +26,19 @@ if [ -t 1 ]; then    BOLD=$(printf '\033[1m')    UNDER=$(printf '\033[4m')    RESET=$(printf '\033[m') -else -  RB_RED="" -  RB_ORANGE="" -  RB_YELLOW="" -  RB_GREEN="" -  RB_BLUE="" -  RB_INDIGO="" -  RB_VIOLET="" - -  RED="" -  GREEN="" -  YELLOW="" -  BLUE="" -  UNDER="" -  BOLD="" -  RESET=""  fi -cd "$ZSH" +# Update upstream remote to ohmyzsh org +git remote -v | while read remote url _; do +  case "$url" in +  https://github.com/robbyrussell/oh-my-zsh(|.git)) +    git remote set-url "$remote" "https://github.com/ohmyzsh/ohmyzsh.git" +    break ;; +  git@github.com:robbyrussell/oh-my-zsh(|.git)) +    git remote set-url "$remote" "git@github.com:ohmyzsh/ohmyzsh.git" +    break ;; +  esac +done  # Set git-config values known to fix git errors  # Line endings (#4069) @@ -45,30 +49,36 @@ git config fsck.zeroPaddedFilemode ignore  git config fetch.fsck.zeroPaddedFilemode ignore  git config receive.fsck.zeroPaddedFilemode ignore  # autostash on rebase (#7172) -resetAutoStash=$(git config --bool rebase.autoStash 2>&1) +resetAutoStash=$(git config --bool rebase.autoStash 2>/dev/null)  git config rebase.autoStash true -# Update upstream remote to ohmyzsh org -remote=$(git remote -v | awk '/https:\/\/github\.com\/robbyrussell\/oh-my-zsh\.git/{ print $1; exit }') -if [ -n "$remote" ]; then -  git remote set-url "$remote" "https://github.com/ohmyzsh/ohmyzsh.git" -fi +local ret=0 +# Update Oh My Zsh  printf "${BLUE}%s${RESET}\n" "Updating Oh My Zsh" -if git pull --rebase --stat origin master -then -  printf '%s         %s__      %s           %s        %s       %s     %s__   %s\n' $RB_RED $RB_ORANGE $RB_YELLOW $RB_GREEN $RB_BLUE $RB_INDIGO $RB_VIOLET $RB_RESET -  printf '%s  ____  %s/ /_    %s ____ ___  %s__  __  %s ____  %s_____%s/ /_  %s\n' $RB_RED $RB_ORANGE $RB_YELLOW $RB_GREEN $RB_BLUE $RB_INDIGO $RB_VIOLET $RB_RESET -  printf '%s / __ \%s/ __ \  %s / __ `__ \%s/ / / / %s /_  / %s/ ___/%s __ \ %s\n' $RB_RED $RB_ORANGE $RB_YELLOW $RB_GREEN $RB_BLUE $RB_INDIGO $RB_VIOLET $RB_RESET -  printf '%s/ /_/ /%s / / / %s / / / / / /%s /_/ / %s   / /_%s(__  )%s / / / %s\n' $RB_RED $RB_ORANGE $RB_YELLOW $RB_GREEN $RB_BLUE $RB_INDIGO $RB_VIOLET $RB_RESET -  printf '%s\____/%s_/ /_/ %s /_/ /_/ /_/%s\__, / %s   /___/%s____/%s_/ /_/  %s\n' $RB_RED $RB_ORANGE $RB_YELLOW $RB_GREEN $RB_BLUE $RB_INDIGO $RB_VIOLET $RB_RESET -  printf '%s    %s        %s           %s /____/ %s       %s     %s          %s\n' $RB_RED $RB_ORANGE $RB_YELLOW $RB_GREEN $RB_BLUE $RB_INDIGO $RB_VIOLET $RB_RESET -  printf "${BLUE}%s\n" "Hooray! Oh My Zsh has been updated and/or is at the current version." -  printf "${BLUE}${BOLD}%s ${UNDER}%s${RESET}\n" "To keep up on the latest news and updates, follow us on Twitter:" "https://twitter.com/ohmyzsh" +last_commit=$(git rev-parse HEAD) +if git pull --rebase --stat origin master; then +  # Check if it was really updated or not +  if [[ "$(git rev-parse HEAD)" = "$last_commit" ]]; then +    message="Oh My Zsh is already at the latest version." +    ret=80 # non-zero exit code to indicate no changes pulled +  else +    message="Hooray! Oh My Zsh has been updated!" +  fi + +  printf '%s         %s__      %s           %s        %s       %s     %s__   %s\n' $RAINBOW $RESET +  printf '%s  ____  %s/ /_    %s ____ ___  %s__  __  %s ____  %s_____%s/ /_  %s\n' $RAINBOW $RESET +  printf '%s / __ \%s/ __ \  %s / __ `__ \%s/ / / / %s /_  / %s/ ___/%s __ \ %s\n' $RAINBOW $RESET +  printf '%s/ /_/ /%s / / / %s / / / / / /%s /_/ / %s   / /_%s(__  )%s / / / %s\n' $RAINBOW $RESET +  printf '%s\____/%s_/ /_/ %s /_/ /_/ /_/%s\__, / %s   /___/%s____/%s_/ /_/  %s\n' $RAINBOW $RESET +  printf '%s    %s        %s           %s /____/ %s       %s     %s          %s\n' $RAINBOW $RESET +  printf '\n' +  printf "${BLUE}%s${RESET}\n" "$message" +  printf "${BLUE}${BOLD}%s ${UNDER}%s${RESET}\n" "To keep up with the latest news and updates, follow us on Twitter:" "https://twitter.com/ohmyzsh"    printf "${BLUE}${BOLD}%s ${UNDER}%s${RESET}\n" "Want to get involved in the community? Join our Discord:" "https://discord.gg/ohmyzsh"    printf "${BLUE}${BOLD}%s ${UNDER}%s${RESET}\n" "Get your Oh My Zsh swag at:" "https://shop.planetargon.com/collections/oh-my-zsh"  else -  status=$? +  ret=$?    printf "${RED}%s${RESET}\n" 'There was an error updating. Try again later?'  fi @@ -79,4 +89,4 @@ case "$resetAutoStash" in  esac  # Exit with `1` if the update failed -exit $status +exit $ret  | 
