dotfiles/bootstrap/autostow.sh
Marty Oehme a3a1c4a5bd Add autostow.sh ignore pattern to underscore dirs
autostow.sh will automatically ignore any directories it finds that
begin with an underscore. This will make it possible to remove the
default entires of AUTOSTOW_IGNORED_DIRS variable and thus remove some
of the magic and make autostow.sh behavior more predictable.
2020-01-30 12:51:48 +01:00

128 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
echo "Creating dotfile symlinks ................................................."
stow_dirs
echo "Done creating symlinks ...................................................."
exit 0
;;
-d | --delete)
have_stow
echo "Removing dotfile symlinks ................................................."
unstow_dirs
echo "Done removing symlinks ...................................................."
exit 0
;;
-n | --dry-run)
have_stow
echo "Printing processed directories ............................................"
dryrun
echo "Done printing directories ................................................."
exit 0
;;
-v | --version)
printf "System bootstrap script.\n\n©Marty Oehme\n\nVersion: 0.2\n"
;;
-h | --help | *)
usage
exit 0
;;
esac
shift
}
stow_dirs() {
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
}
unstow_dirs() {
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
}
dryrun() {
for d in */; do
if is_ignored "$d"; then
printf "ignoring %s\n" "$d"
continue
fi
printf "processing %s\n" "$d"
done
}
is_ignored() {
IFS=":"
for ign in $ignore; do
# it is either passed in through our environment variable
# or it starts with a _ which is ignored by default (that's the regex).
# (using herestring to avoid cat>grep)
if [ "$ign" = "$1" ] || [ "$ign/" = "$1" ] || grep -q -e '^_[[:alnum:]]\{1,\}' <<<"$1"; then
return 0
fi
done
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 "$@"