tools/upgrade: Enable upgrading/(un)installing in the interactive shell process

This commit is contained in:
Koichi Murase 2022-01-12 18:27:18 +09:00
parent 7f420263b2
commit 16712a41c5
7 changed files with 107 additions and 86 deletions

@ -8,7 +8,7 @@ function uninstall_oh_my_bash() {
}
function upgrade_oh_my_bash() {
env OSH=$OSH sh $OSH/tools/upgrade.sh
source "$OSH"/tools/upgrade.sh
}
function take() {

@ -250,6 +250,17 @@ else
}
fi
_omb_util_unload_hook=()
_omb_util_unload() {
local hook
for hook in "${_omb_util_unload_hook[@]}"; do
eval -- "$hook"
done
}
_omb_util_original_PS1=$PS1
_omb_util_unload_hook+=('PS1=$_omb_util_original_PS1')
_omb_util_prompt_command=()
_omb_util_prompt_command_hook() {
local status=$? lastarg=$_ hook
@ -259,8 +270,9 @@ _omb_util_prompt_command_hook() {
done
}
: "${_omb_util_prompt_command_setup=}"
_omb_util_unload_hook+=('_omb_util_prompt_command=()')
: "${_omb_util_prompt_command_setup=}"
_omb_util_add_prompt_command() {
local other
for other in "${_omb_util_prompt_command[@]}"; do

@ -11,8 +11,8 @@ case $- in
esac
# Check for updates on initial load...
if [ "$DISABLE_AUTO_UPDATE" != "true" ]; then
env OSH="$OSH" DISABLE_UPDATE_PROMPT="$DISABLE_UPDATE_PROMPT" bash -f "$OSH"/tools/check_for_upgrade.sh
if [[ $DISABLE_AUTO_UPDATE != true ]]; then
source "$OSH"/tools/check_for_upgrade.sh
fi
# Initializes Oh My Bash

@ -1,60 +1,54 @@
#!/usr/bin/env bash
EPOCHSECONDS="$(date +%s)"
function _current_epoch() {
echo $(( $EPOCHSECONDS / 60 / 60 / 24 ))
function _omb_upgrade_current_epoch {
local sec=${EPOCHSECONDS-}
[[ $sec ]] || printf -v sec '%(%s)T' -1 2>/dev/null || sec=$(command date +%s)
echo $((sec / 60 / 60 / 24))
}
function _update_osh_update() {
echo "LAST_EPOCH=$(_current_epoch)" >| ~/.osh-update
function _omb_upgrade_update_timestamp {
echo "LAST_EPOCH=$(_omb_upgrade_current_epoch)" >| ~/.osh-update
}
function _upgrade_osh() {
env BASH=$OSH sh $OSH/tools/upgrade.sh
# update the osh file
_update_osh_update
}
function _omb_upgrade_check {
if [[ ! -f ~/.osh-update ]]; then
# create ~/.osh-update
_omb_upgrade_update_timestamp
return 0
fi
epoch_target=$UPDATE_OSH_DAYS
if [[ -z "$epoch_target" ]]; then
# Default to old behavior
epoch_target=13
fi
local LAST_EPOCH
. ~/.osh-update
if [[ ! $LAST_EPOCH ]]; then
_omb_upgrade_update_timestamp
return 0
fi
# Default to the old behavior
local epoch_expires=${UPDATE_OSH_DAYS:-13}
local epoch_elapsed=$(($(_omb_upgrade_current_epoch) - LAST_EPOCH))
if ((epoch_elapsed <= epoch_expires)); then
return 0
fi
# update ~/.osh-update
_omb_upgrade_update_timestamp
if [[ $DISABLE_UPDATE_PROMPT == true ]] ||
{ read -p '[Oh My Bash] Would you like to check for updates? [Y/n]: ' line &&
[[ $line == Y* || $line == y* || ! $line ]]; }
then
source "$OSH"/tools/upgrade.sh
fi
}
# Cancel upgrade if the current user doesn't have write permissions for the
# oh-my-bash directory.
[[ -w "$OSH" ]] || return 0
# Cancel upgrade if git is unavailable on the system
which git >/dev/null || return 0
type -P git &>/dev/null || return 0
if mkdir "$OSH/log/update.lock" 2>/dev/null; then
if [ -f ~/.osh-update ]; then
. ~/.osh-update
if [[ -z "$LAST_EPOCH" ]]; then
_update_osh_update && return 0;
fi
epoch_diff=$(($(_current_epoch) - $LAST_EPOCH))
if [ $epoch_diff -gt $epoch_target ]; then
if [ "$DISABLE_UPDATE_PROMPT" = "true" ]; then
_upgrade_osh
else
echo "[Oh My Bash] Would you like to check for updates? [Y/n]: \c"
read line
if [[ "$line" == Y* ]] || [[ "$line" == y* ]] || [ -z "$line" ]; then
_upgrade_osh
else
_update_osh_update
fi
fi
fi
else
# create the osh file
_update_osh_update
fi
rmdir $OSH/log/update.lock
if command mkdir "$OSH/log/update.lock" 2>/dev/null; then
_omb_upgrade_check
command rmdir "$OSH"/log/update.lock
fi

@ -63,7 +63,7 @@ _omb_install_run() {
printf '%s\n' "$BOLD$GREEN[dryrun]$NORMAL $BOLD$*$NORMAL" >&5
else
printf '%s\n' "$BOLD\$ $*$NORMAL" >&5
"$@"
command "$@"
fi
}
@ -124,19 +124,19 @@ _omb_install_main() {
umask g-w,o-w
printf "${BLUE}Cloning Oh My Bash...${NORMAL}\n"
hash git >/dev/null 2>&1 || {
type -P git &>/dev/null || {
echo "Error: git is not installed"
return 1
}
# The Windows (MSYS) Git is not compatible with normal use on cygwin
if [[ $OSTYPE = cygwin ]]; then
if git --version | grep msysgit > /dev/null; then
if command git --version | command grep msysgit > /dev/null; then
echo "Error: Windows/MSYS Git is not supported on Cygwin"
echo "Error: Make sure the Cygwin git package is installed and is first on the path"
return 1
fi
fi
_omb_install_run env git clone --depth=1 https://github.com/ohmybash/oh-my-bash.git "$OSH" || {
_omb_install_run git clone --depth=1 https://github.com/ohmybash/oh-my-bash.git "$OSH" || {
printf "Error: git clone of oh-my-bash repo failed\n"
return 1
}

@ -1,7 +1,10 @@
#!/usr/bin/env bash
# Note: this file is intentionally written in POSIX sh so that oh-my-bash can
# be uninstalled without bash.
_omb_uninstall_contains_omb() {
grep -qE '(source|\.)[[:space:]]+.*[/[:space:]]oh-my-bash\.sh' "$1" 2>/dev/null
command grep -qE '(source|\.)[[:space:]]+.*[/[:space:]]oh-my-bash\.sh' "$1" 2>/dev/null
}
# Find the latest bashrc that do not source oh-my-bash.sh
@ -36,7 +39,7 @@ unset _omb_uninstall_confirmation
if [ -d ~/.oh-my-bash ]; then
printf '%s\n' "Removing ~/.oh-my-bash"
rm -rf ~/.oh-my-bash
command rm -rf ~/.oh-my-bash
fi
_omb_uninstall_bashrc_original=
@ -56,16 +59,16 @@ _omb_uninstall_bashrc_uninstalled=
if [ -e ~/.bashrc ] || [ -h ~/.bashrc ]; then
_omb_uninstall_bashrc_uninstalled=".bashrc.omb-uninstalled-$(date +%Y%m%d%H%M%S)";
printf '%s\n' "Found ~/.bashrc -- Renaming to ~/${_omb_uninstall_bashrc_uninstalled}";
mv ~/.bashrc ~/"${_omb_uninstall_bashrc_uninstalled}";
command mv ~/.bashrc ~/"${_omb_uninstall_bashrc_uninstalled}";
fi
if [ -n "$_omb_uninstall_bashrc_original" ]; then
printf '%s\n' "Found $_omb_uninstall_bashrc_original -- Restoring to ~/.bashrc";
mv "$_omb_uninstall_bashrc_original" ~/.bashrc;
command mv "$_omb_uninstall_bashrc_original" ~/.bashrc;
printf '%s\n' "Your original bash config was restored. Please restart your session."
else
sed '/oh-my-bash\.sh/s/^/: #/' ~/"${_omb_uninstall_bashrc_uninstalled:-.bashrc}" >| ~/.bashrc.omb-temp && \
mv ~/.bashrc.omb-temp ~/.bashrc
command sed '/oh-my-bash\.sh/s/^/: #/' ~/"${_omb_uninstall_bashrc_uninstalled:-.bashrc}" >| ~/.bashrc.omb-temp && \
command mv ~/.bashrc.omb-temp ~/.bashrc
fi
unset _omb_uninstall_bashrc_original
@ -73,5 +76,9 @@ unset _omb_uninstall_bashrc_uninstalled
echo "Thanks for trying out Oh My Bash. It has been uninstalled."
case $- in
*i*) exec bash; source ~/.bashrc ;;
*i*)
if [ -n "${BASH_VERSION-}" ]; then
declare -f _omb_util_unload >/dev/null 2>&1 && _omb_util_unload
source ~/.bashrc
fi ;;
esac

@ -1,29 +1,35 @@
#!/usr/bin/env bash
# Use colors, but only if connected to a terminal, and that terminal
# supports them.
if which tput >/dev/null 2>&1; then
ncolors=$(tput colors)
fi
if [ -t 1 ] && [ -n "$ncolors" ] && [ "$ncolors" -ge 8 ]; then
RED=$(tput setaf 1)
GREEN=$(tput setaf 2)
YELLOW=$(tput setaf 3)
BLUE=$(tput setaf 4)
BOLD=$(tput bold)
NORMAL=$(tput sgr0)
else
RED=""
GREEN=""
YELLOW=""
BLUE=""
BOLD=""
NORMAL=""
fi
function _omb_upgrade {
# Use colors, but only if connected to a terminal, and that terminal
# supports them.
if type -P tput &>/dev/null; then
local ncolors=$(tput colors)
fi
printf "${BLUE}%s${NORMAL}\n" "Updating Oh My Bash"
if [[ -t 1 && $ncolors && $ncolors -ge 8 ]]; then
local RED=$(tput setaf 1)
local GREEN=$(tput setaf 2)
local YELLOW=$(tput setaf 3)
local BLUE=$(tput setaf 4)
local BOLD=$(tput bold)
local NORMAL=$(tput sgr0)
else
local RED=""
local GREEN=""
local YELLOW=""
local BLUE=""
local BOLD=""
local NORMAL=""
fi
printf "${BLUE}%s${NORMAL}\n" "Updating Oh My Bash"
if ! command git -C "$OSH" pull --rebase --stat origin master; then
printf "${RED}%s${NORMAL}\n" 'There was an error updating. Try again later?'
return 1
fi
if git -C "$OSH" pull --rebase --stat origin master; then
printf '%s' "$GREEN"
printf '%s\n' ' __ __ __ '
printf '%s\n' ' ____ / /_ ____ ___ __ __ / /_ ____ ______/ /_ '
@ -33,7 +39,9 @@ if git -C "$OSH" pull --rebase --stat origin master; then
printf '%s\n' ' /____/ '
printf "${BLUE}%s\n" "Hooray! Oh My Bash has been updated and/or is at the current version."
printf "${BLUE}${BOLD}%s${NORMAL}\n" "To keep up on the latest news and updates, follow us on GitHub: https://github.com/ohmybash/oh-my-bash"
exec bash; source ~/.bashrc
else
printf "${RED}%s${NORMAL}\n" 'There was an error updating. Try again later?'
fi
if [[ $- == *i* ]]; then
declare -f _omb_util_unload &>/dev/null && _omb_util_unload
source ~/.bashrc
fi
}
_omb_upgrade