dotfiles/bootstrap/autostow.sh

129 lines
3.2 KiB
Bash
Executable file

#!/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:-"bootstrap:assets"}"
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 "$@"