Marty Oehme
4dfb9767ee
Invoking a dry-run with `autostow.sh -n` will simply print out the directories it would operate on, and those it would ignore and exit. Useful for debugging, not much more.
123 lines
2.7 KiB
Bash
Executable file
123 lines
2.7 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
|
|
if [ "$ign" == "$1" ] || [ "$ign/" == "$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." \
|
|
"" \
|
|
" -d Remove dotfiles, by unlinking any directory found next to stow.sh using GNU stow." \
|
|
"" \
|
|
""
|
|
}
|
|
|
|
main "$@"
|