Marty Oehme
bba4e1d71f
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.
130 lines
3.3 KiB
Bash
Executable file
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 "$@"
|