summaryrefslogtreecommitdiff
path: root/bin/rcdn.in
diff options
context:
space:
mode:
Diffstat (limited to 'bin/rcdn.in')
-rwxr-xr-xbin/rcdn.in107
1 files changed, 107 insertions, 0 deletions
diff --git a/bin/rcdn.in b/bin/rcdn.in
new file mode 100755
index 0000000..2ca6dae
--- /dev/null
+++ b/bin/rcdn.in
@@ -0,0 +1,107 @@
+#!@SHELL@
+
+: ${RCM_LIB:=$(dirname "$0")/../share/rcm}
+. "$RCM_LIB/rcm.sh"
+
+remove_link() {
+ local dest="$1"
+ local original="$2"
+ local sigil="$3"
+
+ if [ "x$dest" = "x/" ]; then
+ $VERBOSE "not a symlink, skipping: $original"
+ elif [ -L "$dest" -o "x$sigil" = "xX" ]; then
+ rm_v -rf "$dest"
+ rmdir -p "$(dirname "$original")" 2>/dev/null
+ else
+ remove_link "$(dirname "$dest")" "$original"
+ fi
+}
+
+show_help() {
+ local exit_code=${1:-0}
+
+ $PRINT "Usage: rcdn [-Vqvh] [-I EXCL_PAT] [-x EXCL_PAT] [-t TAG] [-d DOT_DIR]"
+ $PRINT "see rcdn(1) and rcm(5) for more details"
+
+ exit $exit_code
+}
+
+handle_command_line() {
+ local arg_tags=
+ local verbosity=0
+ local version=0
+ local run_hooks=0
+ local dotfiles_dirs=
+ local files=
+ local excludes=
+ local includes=
+ local symlink_dirs=
+
+ while getopts VqvhI:x:S:t:d: opt; do
+ case "$opt" in
+ h) show_help ;;
+ I) includes="$includes $OPTARG";;
+ k) run_hooks=1 ;;
+ K) run_hooks=0 ;;
+ t) arg_tags="$arg_tags $OPTARG" ;;
+ S) symlink_dirs="$symlink_dirs $OPTARG";;
+ v) verbosity=$(($verbosity + 1));;
+ q) verbosity=$(($verbosity - 1));;
+ d) dotfiles_dirs="$dotfiles_dirs $OPTARG" ;;
+ V) version=1 ;;
+ x) excludes="$excludes $OPTARG" ;;
+ esac
+ done
+ shift $(($OPTIND-1))
+
+ handle_common_flags rcup $version $verbosity
+
+ tags="${arg_tags:-$TAGS}"
+ dotfiles_dirs="${dotfiles_dirs:-$DOTFILES_DIRS}"
+ files="$@"
+ RUN_HOOKS=$run_hooks
+
+ for tag in $tags; do
+ LS_ARGS="$LS_ARGS -t $tag"
+ done
+ for dotfiles_dir in $dotfiles_dirs; do
+ LS_ARGS="$LS_ARGS -d $dotfiles_dir"
+ done
+ for exclude in $excludes; do
+ LS_ARGS="$LS_ARGS -x $exclude"
+ done
+ for include in $includes; do
+ LS_ARGS="$LS_ARGS -I $include"
+ done
+ for symlink_dir in $symlink_dirs; do
+ LS_ARGS="$LS_ARGS -S $symlink_dir"
+ done
+ LS_ARGS="$LS_ARGS $files"
+
+ $DEBUG "LS_ARGS: $LS_ARGS"
+}
+
+LS_ARGS=-F
+
+handle_command_line "$@"
+: ${DOTFILES_DIRS:=$DOTFILES_DIRS $DEFAULT_DOTFILES_DIR}
+
+run_hooks pre down
+
+dests_and_srcs="$(lsrc $LS_ARGS)"
+
+saved_ifs="$IFS"
+IFS='
+'
+for dest_and_src in $dests_and_srcs; do
+ IFS=:
+ set -- $dest_and_src
+ IFS="$saved_ifs"
+ dest="$1"
+ sigil="$3"
+
+ remove_link "$dest" "$dest" "$sigil"
+done
+
+run_hooks post down