diff options
Diffstat (limited to 'bin/mkrc.in')
-rwxr-xr-x | bin/mkrc.in | 88 |
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 |