#!/bin/sh #set -x REPLACE_ALL=0 DEST_DIR=$HOME DEBUG=: PRINT=echo PROMPT=echo_n VERBOSE=: MKDIR=mkdir LN=ln RM=rm echo_n() { printf "%s " "$*" } link_file() { local src=$1 local dest=$2 $PRINT "linking $dest" if [ -h $dest ]; then rm -f $dest fi $LN -s $src $dest } replace_file() { local src=$1 local dest=$2 $DEBUG replace_file $1 $2 $RM -rf $dest link_file $src $dest } is_nested() { echo $1 | sed "s:$DEST_DIR/::" | grep -q / return $? } is_identical() { diff -q -s $1 $2 > /dev/null } handle_dir() { local dest=$1 $DEBUG handle_dir $1 dirname $dest | xargs $MKDIR -p } handle_file() { local src=$1 local dest=$2 $DEBUG handle_file $1 $2 if [ -e "$dest" ]; then if is_identical $src $dest; then $VERBOSE "identical $dest" elif [ $REPLACE_ALL -eq 1 ]; then replace_file $src $dest else $PROMPT "overwrite ${dest}? [ynaq]" read overwrite case $overwrite in a) REPLACE_ALL=1 replace_file $src $dest ;; y) replace_file $src $dest ;; q) exit 1 ;; *) $VERBOSE "skipping $dest" ;; esac fi else link_file $src $dest fi } handle_command_line() { arg_tags="" verbosity=0 version=0 dotfiles_dirs= LS_ARGS= while getopts Vqvt:d: opt; do case "$opt" in t) arg_tags="$arg_tags $OPTARG" LS_ARGS="$LS_ARGS -t $OPTARG" ;; v) verbosity=$(($verbosity + 1));; q) verbosity=$(($verbosity - 1));; d) dotfiles_dirs="$dotfiles_dirs $OPTARG" LS_ARGS="$LS_ARGS -d $OPTARG" ;; V) version=1 esac done shift $(($OPTIND-1)) if [ $version -eq 1 ]; then version rcup exit 0 elif [ $verbosity -ge 2 ]; then DEBUG=echo VERBOSE=echo PRINT=echo elif [ $verbosity -eq 1 ]; then DEBUG=: VERBOSE=echo PRINT=echo elif [ $verbosity -eq 0 ]; then DEBUG=: VERBOSE=: PRINT=echo else DEBUG=: VERBOSE=: PRINT=: fi if [ "x$arg_tags" != "x" ]; then TAGS=$arg_tags fi if [ "x$dotfiles_dirs" != "x" ]; then DOTFILES_DIRS=$dotfiles_dirs fi FILES=$@ LS_ARGS="$LS_ARGS $FILES" } if [ -e $HOME/.rcrc ]; then . $HOME/.rcrc fi . `dirname $0`/../share/rcm/rcm.sh handle_command_line $* for dest_and_src in `lsrc $LS_ARGS`; do dest=`echo $dest_and_src | sed 's/:.*//'` src=`echo $dest_and_src | sed 's/.*://'` if is_nested $dest; then handle_dir $dest fi handle_file $src $dest done