#!/bin/bash # Print the logo print_logo() { cat << "EOF" ██ █ ██ ██ ██████ █████ ██ █████ █████ ████ ██ █████ ██ ██ ██ ██ ███ ███████ ██ ██ ██ ██ ██ ████████ ██ ██ ███████ █████ ██████ ██ ██ ██████ ██ ████████ ██ █ ███████ ██ ██ ██ ██████ ███████ ██████ ██ ██████ ██████ ██████ ███████ EOF } # Clear screen and show logo clear print_logo COREDESKTOP="$HOME/.local/share/coredesktop" echo "Updating CoreDesktop..." if [[ -z "$UPDATE_REEXECED" ]] && ! git -C "$COREDESKTOP" pull; then echo "WARNING: could not pull the latest CoreDesktop; running the update hooks already on disk." export UPDATE_PULL_FAILED=1 fi mkdir -p "$COREDESKTOP/updates.d" # --remove-destination replaces copies left root-owned by older versions of this script cp --remove-destination "$COREDESKTOP/update" ~/.local/bin/update cp --remove-destination "$COREDESKTOP/refresh" ~/.local/bin/refresh if [[ -z "$UPDATE_REEXECED" ]]; then export UPDATE_REEXECED=1 exec ~/.local/bin/update fi FAILED=() [[ -n "$UPDATE_PULL_FAILED" ]] && FAILED+=("git pull") # Each hook runs in its own subshell so a cd, set -e, exit, or stray variable # in one hook can't leak into or abort the hooks after it. for plugin in "$COREDESKTOP/updates.d/"*.sh; do [ -f "$plugin" ] || continue ( unset -f is_installed run_update source "$plugin" if declare -f run_update > /dev/null; then if ! declare -f is_installed > /dev/null || is_installed; then run_update fi fi ) # Checked separately: under `( ... ) ||`, bash would ignore set -e inside the hook [ $? -eq 0 ] || FAILED+=("$(basename "$plugin")") done if (( ${#FAILED[@]} > 0 )); then echo "Done, with errors in: ${FAILED[*]}" exit 1 fi echo "Done."