#!/usr/bin/env bash # # autostow.sh # # Stow automatic symlinking script # # Invokes stow for every folder within this repository, and that's it. ignore="${AUTOSTOW_IGNORED_DIRS}" main() { case "$1" in -s | --stow) have_stow stow_dirs exit 0 ;; -d | --delete) have_stow unstow_dirs exit 0 ;; -n | --dry-run) have_stow dryrun exit 0 ;; -v | --version) printf "System bootstrap script.\n\n©Marty Oehme\n\nVersion: 0.2.1\n" ;; -h | --help | *) usage exit 0 ;; esac shift } stow_dirs() { printf "Creating dotfile symlinks .................................................\n" for d in */; do if is_ignored "$d"; then printf "ignoring %s\n" "$d" continue fi printf "stowing %s\n" "$d" stow -S -t ~ "$d" done printf "Done creating symlinks ....................................................\n" } unstow_dirs() { printf "Removing dotfile symlinks .................................................\n" for d in */; do if is_ignored "$d"; then printf "ignoring %s\n" "$d" continue fi printf "unstowing %s\n" "$d" stow -D -t ~ "$d" done printf "Done removing symlinks ....................................................\n" } dryrun() { printf "Printing processed directories ............................................\n" for d in */; do if is_ignored "$d"; then printf "ignoring %s\n" "$d" continue fi printf "processing %s\n" "$d" done printf "Done printing directories .................................................\n" } is_ignored() { IFS=":" for ign in $ignore; do # it is either passed in through our environment variable if [ "$ign" = "$1" ] || [ "$ign/" = "$1" ]; then return 0 fi done # or it starts with a _ which is ignored by default (that's the regex). # (using herestring to avoid cat>grep) if grep -q -e '^_[[:alnum:]]\{1,\}' <<<"$1"; then return 0; fi return 1 } have_stow() { if ! type stow >/dev/null 2>&1; then printf "GNU stow needs to be installed for this script to function. Please install stow through your package manager.\n" exit 1 fi } usage() { printf "%s\n" \ "" \ " autostow.sh - Automatically stow your dotfiles." \ " Uses GNU stow to set up automatic links to any dotfiles in subdirectories of this directory." \ "" \ " Usage: stow.sh -dhsn" \ "" \ " Options:" \ "" \ " -h | --help Print out this help." \ "" \ " -s | --stow Install dotfiles, by symlinking any directory found next to stow.sh using GNU stow." \ "" \ " -d | --delete Remove dotfiles, by unlinking any directory found next to stow.sh using GNU stow." \ "" \ " -n | --dry-run Do not invoke any operation but print out directories affected, simulating a dry-run." \ "" \ " Note, by default any directory starting with an underscore _directoryname will be ignored." \ " Additional folders to ignore can be set through the environment variable AUTOSTOW_IGNORED_DIRS " \ " using a colon-separated string: AUTOSTOW_IGNORED_DIRS=\"directories:to:ignore\" " \ "" \ "" } main "$@"