2020-10-31 23:14:24 +01:00
#!/usr/bin/env zsh
2023-08-29 10:27:36 +02:00
set +u # disable nounset
2020-10-31 23:14:24 +01:00
2023-04-01 10:14:18 +02:00
local ret = 0 # exit code
2021-09-15 19:06:51 +02:00
# Protect against running with shells other than zsh
2020-12-01 11:12:31 +01:00
if [ -z " $ZSH_VERSION " ] ; then
2021-01-21 11:52:09 +01:00
exec zsh " $0 " " $@ "
2020-12-01 11:12:31 +01:00
fi
2021-09-15 19:06:51 +02:00
# Protect against unwanted sourcing
case " $ZSH_EVAL_CONTEXT " in
2024-04-18 07:16:42 +02:00
*:file) echo "error: this file should not be sourced" && return 1 ; ;
2021-09-15 19:06:51 +02:00
esac
2024-04-18 07:16:42 +02:00
# Define "$ZSH" if not defined -- in theory this should be `export`ed by the calling script
if [ [ -z " $ZSH " ] ] ; then
ZSH = " ${ 0 : a : h : h } "
fi
2020-10-31 23:14:24 +01:00
cd " $ZSH "
2023-03-28 12:50:05 +02:00
verbose_mode = "default"
interactive = false
while getopts "v:i" opt; do
case $opt in
v)
if [ [ $OPTARG = = default || $OPTARG = = minimal || $OPTARG = = silent ] ] ; then
verbose_mode = $OPTARG
else
echo " [oh-my-zsh] update verbosity ' $OPTARG ' is not valid "
echo "[oh-my-zsh] valid options are 'default', 'minimal' and 'silent'"
fi
; ;
i) interactive = true ; ;
esac
done
2020-10-31 23:14:24 +01:00
# Use colors, but only if connected to a terminal
# and that terminal supports them.
2021-10-13 11:58:56 +02:00
# The [ -t 1 ] check only works when the function is not called from
# a subshell (like in `$(...)` or `(...)`, so this hack redefines the
# function at the top level to always return false when stdout is not
# a tty.
if [ -t 1 ] ; then
is_tty( ) {
true
}
else
is_tty( ) {
false
}
fi
# This function uses the logic from supports-hyperlinks[1][2], which is
# made by Kat Marchán (@zkat) and licensed under the Apache License 2.0.
# [1] https://github.com/zkat/supports-hyperlinks
# [2] https://crates.io/crates/supports-hyperlinks
#
# Copyright (c) 2021 Kat Marchán
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
supports_hyperlinks( ) {
# $FORCE_HYPERLINK must be set and be non-zero (this acts as a logic bypass)
if [ -n " $FORCE_HYPERLINK " ] ; then
[ " $FORCE_HYPERLINK " != 0 ]
return $?
fi
# If stdout is not a tty, it doesn't support hyperlinks
is_tty || return 1
# DomTerm terminal emulator (domterm.org)
if [ -n " $DOMTERM " ] ; then
return 0
fi
# VTE-based terminals above v0.50 (Gnome Terminal, Guake, ROXTerm, etc)
if [ -n " $VTE_VERSION " ] ; then
[ $VTE_VERSION -ge 5000 ]
return $?
fi
# If $TERM_PROGRAM is set, these terminals support hyperlinks
case " $TERM_PROGRAM " in
2024-03-07 09:54:43 +01:00
Hyper| iTerm.app| terminology| WezTerm| vscode) return 0 ; ;
2021-10-13 11:58:56 +02:00
esac
2024-03-07 09:54:43 +01:00
# These termcap entries support hyperlinks
case " $TERM " in
xterm-kitty| alacritty| alacritty-direct) return 0 ; ;
esac
# xfce4-terminal supports hyperlinks
if [ " $COLORTERM " = "xfce4-terminal" ] ; then
2021-10-13 11:58:56 +02:00
return 0
fi
2022-10-12 10:55:02 +02:00
# Windows Terminal also supports hyperlinks
if [ -n " $WT_SESSION " ] ; then
2021-10-13 11:58:56 +02:00
return 0
fi
2022-10-12 10:55:02 +02:00
# Konsole supports hyperlinks, but it's an opt-in setting that can't be detected
# https://github.com/ohmyzsh/ohmyzsh/issues/10964
# if [ -n "$KONSOLE_VERSION" ]; then
# return 0
# fi
2021-10-13 11:58:56 +02:00
return 1
}
2022-01-09 23:06:34 +01:00
# Adapted from code and information by Anton Kochkov (@XVilka)
# Source: https://gist.github.com/XVilka/8346728
supports_truecolor( ) {
case " $COLORTERM " in
truecolor| 24bit) return 0 ; ;
esac
case " $TERM " in
iterm | \
tmux-truecolor | \
linux-truecolor | \
xterm-truecolor | \
screen-truecolor) return 0 ; ;
esac
return 1
}
2021-10-13 11:58:56 +02:00
fmt_link( ) {
# $1: text, $2: url, $3: fallback mode
if supports_hyperlinks; then
2022-10-12 10:49:44 +02:00
printf '\033]8;;%s\033\\%s\033]8;;\033\\\n' " $2 " " $1 "
2021-10-13 11:58:56 +02:00
return
fi
case " $3 " in
--text) printf '%s\n' " $1 " ; ;
--url| *) fmt_underline " $2 " ; ;
esac
}
fmt_underline( ) {
is_tty && printf '\033[4m%s\033[24m\n' " $* " || printf '%s\n' " $* "
}
2021-09-15 19:06:51 +02:00
setopt typeset_silent
typeset -a RAINBOW
2020-10-31 23:14:24 +01:00
2021-10-13 11:58:56 +02:00
if is_tty; then
2022-01-09 23:06:34 +01:00
if supports_truecolor; then
RAINBOW = (
" $( printf '\033[38;2;255;0;0m' ) "
" $( printf '\033[38;2;255;97;0m' ) "
" $( printf '\033[38;2;247;255;0m' ) "
" $( printf '\033[38;2;0;255;30m' ) "
" $( printf '\033[38;2;77;0;255m' ) "
" $( printf '\033[38;2;168;0;255m' ) "
" $( printf '\033[38;2;245;0;172m' ) "
)
else
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' ) "
)
fi
2020-05-18 11:23:28 +02:00
2020-03-11 14:24:04 +01:00
RED = $( printf '\033[31m' )
GREEN = $( printf '\033[32m' )
YELLOW = $( printf '\033[33m' )
BLUE = $( printf '\033[34m' )
BOLD = $( printf '\033[1m' )
2021-08-17 16:35:42 +02:00
RESET = $( printf '\033[0m' )
2015-07-07 02:18:32 +02:00
fi
2020-10-31 23:14:24 +01:00
# Update upstream remote to ohmyzsh org
2020-12-02 11:57:37 +01:00
git remote -v | while read remote url extra; do
2020-10-31 23:14:24 +01:00
case " $url " in
2023-04-01 10:14:18 +02:00
git://github.com/robbyrussell/oh-my-zsh( | .git) )
# Update out-of-date "unauthenticated git protocol on port 9418" to https
git remote set-url " $remote " "https://github.com/ohmyzsh/ohmyzsh.git" ; ;
2020-10-31 23:14:24 +01:00
https://github.com/robbyrussell/oh-my-zsh( | .git) )
2023-04-01 10:14:18 +02:00
git remote set-url " $remote " "https://github.com/ohmyzsh/ohmyzsh.git" ; ;
2020-10-31 23:14:24 +01:00
git@github.com:robbyrussell/oh-my-zsh( | .git) )
2023-04-01 10:14:18 +02:00
git remote set-url " $remote " "git@github.com:ohmyzsh/ohmyzsh.git" ; ;
https://github.com/ohmyzsh/ohmyzsh( | .git) ) ; ;
git@github.com:ohmyzsh/ohmyzsh( | .git) ) ; ;
*) continue ; ;
2020-10-31 23:14:24 +01:00
esac
2023-04-01 10:14:18 +02:00
# If we reach this point we have found the proper ohmyzsh upstream remote. If we don't,
# we'll only update from the set remote if `oh-my-zsh.remote` has been set to a remote,
# as when installing from a fork.
git config --local oh-my-zsh.remote " $remote "
break
2020-10-31 23:14:24 +01:00
done
2019-10-21 16:42:06 +02:00
# Set git-config values known to fix git errors
# Line endings (#4069)
git config core.eol lf
git config core.autocrlf false
# zeroPaddedFilemode fsck errors (#4963)
git config fsck.zeroPaddedFilemode ignore
git config fetch.fsck.zeroPaddedFilemode ignore
git config receive.fsck.zeroPaddedFilemode ignore
2020-03-11 14:17:41 +01:00
# autostash on rebase (#7172)
2020-10-31 23:14:24 +01:00
resetAutoStash = $( git config --bool rebase.autoStash 2>/dev/null)
2020-03-11 14:17:41 +01:00
git config rebase.autoStash true
2019-10-21 16:42:06 +02:00
2020-10-31 23:14:24 +01:00
local ret = 0
2019-11-21 02:26:18 +01:00
2021-09-09 12:57:59 +02:00
# repository settings
remote = ${ " $( git config --local oh-my-zsh.remote) " :- origin }
branch = ${ " $( git config --local oh-my-zsh.branch) " :- master }
# repository state
last_head = $( git symbolic-ref --quiet --short HEAD || git rev-parse HEAD)
# checkout update branch
git checkout -q " $branch " -- || exit 1
# branch commit before update (used in changelog)
last_commit = $( git rev-parse " $branch " )
2020-10-31 23:14:24 +01:00
# Update Oh My Zsh
2023-03-28 12:50:05 +02:00
if [ [ $verbose_mode != silent ] ] ; then
printf " ${ BLUE } %s ${ RESET } \n " "Updating Oh My Zsh"
fi
2022-01-24 18:32:36 +01:00
if LANG = git pull --quiet --rebase $remote $branch ; then
2020-10-31 23:14:24 +01:00
# 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."
else
message = "Hooray! Oh My Zsh has been updated!"
2020-11-01 00:26:03 +01:00
2020-12-12 13:41:29 +01:00
# Save the commit prior to updating
git config oh-my-zsh.lastVersion " $last_commit "
2021-06-12 05:03:21 +02:00
# Print changelog to the terminal
2023-03-31 15:30:19 +02:00
if [ [ $interactive = = true && $verbose_mode = = default ] ] ; then
2020-12-28 19:35:43 +01:00
" $ZSH /tools/changelog.sh " HEAD " $last_commit "
2020-11-01 00:26:03 +01:00
fi
2020-12-12 13:41:29 +01:00
2023-03-28 12:50:05 +02:00
if [ [ $verbose_mode != silent ] ] ; then
printf " ${ BLUE } %s \` ${ BOLD } %s ${ RESET } ${ BLUE } \` ${ RESET } \n " "You can see the changelog with" "omz changelog"
fi
2020-10-31 23:14:24 +01:00
fi
2023-03-28 12:50:05 +02:00
if [ [ $verbose_mode = = default ] ] ; then
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\n " " $message "
printf " ${ BLUE } ${ BOLD } %s %s ${ RESET } \n " "To keep up with the latest news and updates, follow us on Twitter:" " $( fmt_link @ohmyzsh https://twitter.com/ohmyzsh) "
printf " ${ BLUE } ${ BOLD } %s %s ${ RESET } \n " "Want to get involved in the community? Join our Discord:" " $( fmt_link "Discord server" https://discord.gg/ohmyzsh) "
printf " ${ BLUE } ${ BOLD } %s %s ${ RESET } \n " "Get your Oh My Zsh swag at:" " $( fmt_link "Planet Argon Shop" https://shop.planetargon.com/collections/oh-my-zsh) "
elif [ [ $verbose_mode = = minimal ] ] ; then
printf " ${ BLUE } %s ${ RESET } \n " " $message "
fi
2012-01-15 07:49:52 +01:00
else
2020-10-31 23:14:24 +01:00
ret = $?
2020-03-11 14:24:04 +01:00
printf " ${ RED } %s ${ RESET } \n " 'There was an error updating. Try again later?'
2012-01-15 07:49:52 +01:00
fi
2020-03-11 14:17:41 +01:00
2021-09-09 12:57:59 +02:00
# go back to HEAD previous to update
git checkout -q " $last_head " --
2020-03-11 14:17:41 +01:00
# Unset git-config values set just for the upgrade
case " $resetAutoStash " in
"" ) git config --unset rebase.autoStash ; ;
*) git config rebase.autoStash " $resetAutoStash " ; ;
esac
2020-09-09 11:07:46 +02:00
# Exit with `1` if the update failed
2020-10-31 23:14:24 +01:00
exit $ret