#!/usr/bin/env bash _check_date_if_format() { local format=`_date_format` if [ "$format" != "" ]; then _check_date $format $1 fi } _date_format() { case $UPDATE_CHECK in "daily") echo +%d/%m/%Y;; "weekly") echo +%V/%Y;; "monthly") echo +%m/%Y;; esac } _check_date_file() { mkdir -p ~/.config/dotfiles/.data touch ~/.config/dotfiles/.data/update_date } _sentence() { subject0=("Your" "The" "This") subject1=("system" "machine" "pc" "computer") adjective=("awesome" "incredible" "amazing" "brave" "hard working" "loyal" "nice" "polite" "powerful" "pro-active" "reliable" "fabulous" "fantastic" "incredible" "outstanding" "remarkable" "spectacular" "splendid" "super" "happy" "cheerful") verb=("is" "seems" "looks" "appears to be") no_verb=("is not" "doesn't seem" "doesn't look" "appears not to be") adverb=("up-to-date" "ready" "updated") dot=("." "!" "...") n_subject0=`shuf -i0-"$((${#subject0[@]}-1))" -n1` n_subject1=`shuf -i0-"$((${#subject1[@]}-1))" -n1` n_adjective=`shuf -i0-"$((${#adjective[@]}-1))" -n1` n_adverb=`shuf -i0-"$((${#adverb[@]}-1))" -n1` n_dot=`shuf -i0-"$((${#dot[@]}-1))" -n1` if [ $1 = "updated" ]; then color="32" n_verb=`shuf -i0-"$((${#verb[@]}-1))" -n1` s_verb=${verb[$n_verb]} elif [ $1 = "not_updated" ]; then color="31" n_verb=`shuf -i0-"$((${#no_verb[@]}-1))" -n1` s_verb=${no_verb[$n_verb]} fi echo -e "\033[$color;1m${subject0[$n_subject0]} ${adjective[$n_adjective]} ${subject1[$n_subject1]} $s_verb ${adverb[$n_adverb]}${dot[$n_dot]}\033[0m" } _check_date() { _check_date_file old_date=`cat ~/.config/dotfiles/.data/update_date` new_date=`date $1` if [ "$new_date" != "$old_date" ]; then _sentence not_updated elif [ "$UPDATE_CHECK_ALWAYS" = "true" ] || [ "$2" = "force" ]; then _sentence updated fi } update-system() { echo -e "\033[32;1m=== Starting system update, please enter your password ===\033[0m" sudo true if [ $? -ne 0 ]; then echo "Could not get sudo..." return 1 fi echo -e "\033[32;1m=== Updating system ===\033[0m" start_system_update=`date +%s` # Debian based systems command -v apt > /dev/null 2>&1 if [ $? -eq 0 ]; then sudo apt update -y if [ $? -eq 0 ]; then sudo apt upgrade -y if [ $? -eq 0 ]; then sudo apt autoremove -y fi fi fi # Archlinux based systems command -v yay > /dev/null 2>&1 if [ $? -eq 0 ]; then yay -Syu --noconfirm yay -Syua --noconfirm else command -v pacman > /dev/null 2>&1 if [ $? -eq 0 ]; then sudo pacman -Syu --noconfirm fi fi # Fedora based systems command -v dnf > /dev/null 2>&1 if [ $? -eq 0 ]; then sudo dnf upgrade fi seconds=$((`date +%s` - $start_system_update )) formatted=`date -ud "@$seconds" +'%H hours %M minutes %S seconds'` echo -e "\033[32;1m=== System updated in $formatted ===\033[0m" } update-rust() { # Update rust if installed command -v rustup > /dev/null 2>&1 if [ $? -ne 0 ]; then return fi start_rust_update=`date +%s` echo -e "\033[32;1m=== Updating rustup ===\033[0m" rustup self update echo -e "\033[32;1m=== Updating rust ===\033[0m" rustup update cargo install-update --help > /dev/null 2>&1 if [ $? -ne 0 ]; then pkg-config --libs --cflags openssl > /dev/null 2>&1 # We need to install openssl if [ $? -ne 0 ]; then # Ask for sudo right now sudoresult=$(sudo -nv 2>&1) if [ $? -eq 0 ]; then command -v apt > /dev/null 2>&1 if [ $? -eq 0 ]; then sudo apt install -y libssl-dev fi # For fedora command -v dnf > /dev/null 2>&1 if [ $? -eq 0 ]; then sudo dnf install openssl-devel fi elif echo $sudoresult | grep -q '^sudo:'; then echo -e "\033[32;1m=== libssl-dev is needed to update rust packages, please enter your password ===\033[0m" sudo true if [ $? -ne 0 ]; then echo "Could not get sudo..." return 1 fi else echo -e "\033[33;1m=== You are not a sudoer, cannot install cargo-update... ===\033[0m" return 1 fi fi echo -e "\033[32;1m=== Installing rust packages updater ===\033[0m" cargo install cargo-update fi echo -e "\033[32;1m=== Updating rust packages ===\033[0m" cargo install-update -ag seconds=$((`date +%s` - $start_rust_update )) formatted=`date -ud "@$seconds" +'%H hours %M minutes %S seconds'` echo -e "\033[32;1m=== Rust updated in $formatted ===\033[0m" } update-npm() { # Update node packages if installed command -v npm > /dev/null 2>&1 if [ $? -ne 0 ]; then return fi if [ ! -d ~/.npmbin ]; then return fi start_npm_update=`date +%s` echo -e "\033[32;1m=== Updating node packages ===\033[0m" for package in $(npm -g outdated --parseable --depth=0 | cut -d: -f3) do npm -g install "$package" done seconds=$((`date +%s` - $start_npm_update )) formatted=`date -ud "@$seconds" +'%H hours %M minutes %S seconds'` echo -e "\033[32;1m=== Node packages updated in $formatted ===\033[0m" } update-dotfiles() { start_dotfiles_update=`date +%s` current_dir=$PWD echo -e "\033[32;1m=== Updating dotfiles ===\033[0m" cd ~/.config/dotfiles && git pull if [ -d ~/.config/oh-my-zsh ]; then echo -e "\033[32;1m=== Updating oh-my-zsh ===\033[0m" cd ~/.config/oh-my-zsh && git pull fi if [ -d ~/.config/awesome/.git ]; then echo -e "\033[32;1m=== Updating awesome config ===\033[0m" cd ~/.config/awesome/ && git pull fi cd $current_dir seconds=$((`date +%s` - $start_dotfiles_update )) formatted=`date -ud "@$seconds" +'%H hours %M minutes %S seconds'` echo -e "\033[32;1m=== Dotfiles updated in $formatted ===\033[0m" } update-neovim() { command -v nvim > /dev/null 2>&1 if [ $? -ne 0 ]; then return fi start_neovim_update=`date +%s` echo -e "\033[32;1m=== Updating neovim packages ===\033[0m" nvim +PlugUpdate +qall seconds=$((`date +%s` - $start_neovim_update )) formatted=`date -ud "@$seconds" +'%H hours %M minutes %S seconds'` echo -e "\033[32;1m=== Neovim updated in $formatted ===\033[0m" } _print_help() { echo } partial-test() { case $1 in "system") return 0;; "rust") return 0;; "npm") return 0;; "dotfiles") return 0;; "neovim") return 0;; "check") return 0;; "startup") return 0;; *) return 1;; esac } partial-update() { case $1 in "system") update-system;; "rust") update-rust;; "npm") update-npm;; "dotfiles") update-dotfiles;; "neovim") update-neovim;; "check") _check_date_if_format force;; "startup") _check_date_if_format;; *) return 1 esac } main() { if [ $# -eq 0 ]; then start=`date +%s` echo -e "\033[32;1m=== Starting full update ===\033[0m" # Update the system update-system # Update rust and rust packages update-rust # Update npm and npm packages update-npm # Update the dotfiles update-dotfiles # Update the neovim packages update-neovim format=`_date_format` if [ $? -eq 0 ]; then _check_date_file date $format > ~/.config/dotfiles/.data/update_date fi seconds=$((`date +%s` - $start )) formatted=`date -ud "@$seconds" +'%H hours %M minutes %S seconds'` echo -e "\033[32;1m=== Update finished in $formatted ===\033[0m" _check_date_if_format force else for part in $@; do partial-test $part if [ $? -ne 0 ]; then echo -e "\033[1;31merror:\033[0m unrocognized update command \"$part\"" return 1 fi done for part in $@; do partial-update $part done fi } main $@