summaryrefslogtreecommitdiff
path: root/bin/mkrc.in
diff options
context:
space:
mode:
Diffstat (limited to 'bin/mkrc.in')
-rwxr-xr-xbin/mkrc.in88
1 files changed, 88 insertions, 0 deletions
diff --git a/bin/mkrc.in b/bin/mkrc.in
new file mode 100755
index 0000000..398996a
--- /dev/null
+++ b/bin/mkrc.in
@@ -0,0 +1,88 @@
+#!@SHELL@
+
+: ${RCM_LIB:=$(dirname "$0")/../share/rcm}
+. "$RCM_LIB/rcm.sh"
+
+destination() {
+ local dotfiles_dir="$1"
+ local dotless=$2
+ local in_host=$3
+ local tag="$4"
+
+ if [ "x$tag" != "x" ]; then
+ echo "$dotfiles_dir/tag-$tag"
+ elif [ $in_host = 1 ]; then
+ echo "$dotfiles_dir/host-$HOSTNAME"
+ else
+ echo "$dotfiles_dir"
+ fi
+}
+
+show_help() {
+ local exit_code=${1:-0}
+
+ $PRINT "Usage: mkrc [-hvqo] [-t TAG] [-d DIR] FILES ..."
+ $PRINT "see mkrc(1) and rcm(5) for more details"
+
+ exit $exit_code
+}
+
+if [ $# -eq 0 ]; then
+ show_help 1
+fi
+
+for DOTFILES_DIR in $DOTFILES_DIRS $DEFAULT_DOTFILES_DIR; do
+ break
+done
+
+tag=
+verbosity=0
+in_host=0
+version=0
+always_copy=0
+force_symlink=0
+
+while getopts ChSsVvqot:d: opt; do
+ case "$opt" in
+ C) always_copy=1 ;;
+ h) show_help ;;
+ t) tag="$OPTARG" ;;
+ v) verbosity=$(($verbosity + 1)) ;;
+ q) verbosity=$(($verbosity - 1)) ;;
+ o) in_host=1 ;;
+ d) DOTFILES_DIR="$OPTARG" ;;
+ V) version=1 ;;
+ S) force_symlink=1 ;;
+ s) force_symlink=0 ;;
+ esac
+done
+shift $(($OPTIND-1))
+
+handle_common_flags mkrc $version $verbosity
+
+if [ $in_host -eq 1 -a "x$tag" != "x" ]; then
+ $ERROR 1 "Cannot specify both -o and -t"
+fi
+
+if [ $always_copy -eq 1 ]; then
+ INSTALL="$INSTALL -C"
+fi
+
+files=$@
+
+if [ $force_symlink -eq 1 ]; then
+ for file in $files; do
+ dedotted="$(de_dot "$file")"
+ INSTALL="$INSTALL -S $dedotted"
+ done
+fi
+
+for file in $files; do
+ dotless="$(de_dot "$file")"
+ dest="$(destination "$DOTFILES_DIR" "$dotless" $in_host "$tag")"
+ mkdir -p "$dest/$(dirname "$dotless")"
+ $PRINT "Moving..."
+ mv_v "$file" "$dest/$dotless"
+ $PRINT "Linking..."
+ $INSTALL -d "$DOTFILES_DIR" -t "${tag:--}" "$dotless"
+done