#!/usr/bin/env bash # # Dotfiles manager and install helper # (c) Ismo Vuorinen 2022 # Licensed under MIT, see LICENSE # # shellcheck source-path=$HOME/.dotfiles/local/bin # # Helper variables, override with ENVs like `VERBOSE=1 dfm help` : "${VERBOSE:=0}" : "${DOTFILES:=$HOME/.dotfiles}" : "${INSTALL_SCRIPT:=$DOTFILES/scripts/install.sh}" : "${BREWFILE:=$DOTFILES/Brewfile}" SCRIPT=$(basename "$0") function section_install { USAGE_PREFIX="-> $SCRIPT install" case "$1" in all) bash "$DOTFILES/scripts/settler.sh" && echo "🎉 Done!" ;; antigen) curl -L git.io/antigen > "$DOTFILES/config/antigen.zsh" && echo "🎉 Done!" ;; defaults) bash "$DOTFILES/scripts/set-defaults.sh" && echo "🎉 Done!" ;; gh-extensions) bash "$DOTFILES/scripts/gh-extensions.sh" && echo "🎉 Done!" ;; *) echo "$USAGE_PREFIX [antigen | defaults | gh-extensions]" echo " * antigen: Updates the antigen.zsh file" echo " * defaults: Setup nice macOS defaults" echo " * gh-extensions: Install GitHub CLI Extensions" ;; esac } function section_brew { USAGE_PREFIX="-> $SCRIPT brew" if ! command -v brew &> /dev/null; then echo "brew could not be found, please install it first" exit fi case "$1" in install) brew bundle install --file="$BREWFILE" echo "🎉 Done!" ;; update) brew update && brew outdated && brew upgrade && brew cleanup echo "🎉 Done!" ;; updatebundle) # Updates .dotfiles/Brewfile with descriptions brew bundle dump --force --file="$BREWFILE" --describe && echo "🎉 Done!" ;; autoupdate) brew autoupdate start 43200 --upgrade --cleanup --immediate ;; *) echo "$USAGE_PREFIX [install | update | updatebundle]" echo " * install: Installs items defined in Brewfile" echo " * update: Updates and upgrades brew packages" echo " * updatebundle: Updates Brewfile with descriptions" echo " * autoupdate: Setups brew auto-update and runs it immediately" ;; esac } function section_dotfiles { USAGE_PREFIX="-> $SCRIPT dotfiles" case "$1" in link) rcup -B "$HOSTNAME" -v && echo "🎉 Done!" ;; update) # Updates .dotfiles/scripts/install.sh and formats it rcup -B 0 -g \ | tee "$INSTALL_SCRIPT" 1> /dev/null \ && shfmt -w -l "$INSTALL_SCRIPT" \ && sed -i '' "s|$HOME|\$HOME|g" "$INSTALL_SCRIPT" \ && echo "🎉 Done!" ;; shfmt) # Format shell scripts according to following rules. shfmt \ --list \ --write \ --diff \ --simplify \ --language-dialect bash \ --indent 2 \ --binary-next-line \ --case-indent \ --space-redirects \ --func-next-line \ "$DOTFILES" \ "$DOTFILES/local/bin/dotfiles" \ "$DOTFILES/local/bin/x-check-git-attributes" \ "$DOTFILES/local/bin/x-open-ports" \ "$DOTFILES/config/alias" \ "$DOTFILES/config/exports" \ "$DOTFILES/config/functions" ;; *) echo "$USAGE_PREFIX [link | update | shfmt]" echo " * link: Use rcrc to update dotfile links" echo " * update: Updates dotfile links, installs host specific overrides automatically" echo " * shfmt: Run shfmt to all dotfiles" ;; esac } function usage { echo $"Usage: $SCRIPT [install | brew | dotfiles]" echo $" All commands have their own subcommands." echo "" section_install echo "" section_brew echo "" section_dotfiles } # The main loop. first keyword after $0 triggers section, or help. case "$1" in install) section_install "$2" ;; brew) section_brew "$2" ;; dotfiles) section_dotfiles "$2" ;; *) usage && exit 1 ;; esac