dotfiles/bootstrap/autostow.sh
Marty Oehme bba4e1d71f Fix ignore pattern search on empty ignore variable
The default ignore pattern would not be searched when the additional
variable was kept empty. This fixes it to always seach for the pattern,
regardless of any other variables.
2020-01-30 13:21:01 +01:00

130 lines
3.3 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
echo "Done printing directories ................................................."
}
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 "$@"