#!/bin/sh : ${RCM_LIB:=`dirname $0`/../share/rcm} . $RCM_LIB/rcm.sh REPLACE_ALL=0 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() { local arg_tags= local verbosity=0 local version=0 local dotfiles_dirs= local files= while getopts Vqvt:d: opt; do case "$opt" in t) arg_tags="$arg_tags $OPTARG" ;; v) verbosity=$(($verbosity + 1));; q) verbosity=$(($verbosity - 1));; d) dotfiles_dirs="$dotfiles_dirs $OPTARG" ;; V) version=1 esac done shift $(($OPTIND-1)) handle_common_flags rcup $version $verbosity tags=${arg_tags:-$TAGS} dotfiles_dirs=${dotfiles_dirs:-$DOTFILES_DIRS} files=$@ 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 LS_ARGS="$LS_ARGS $files" $DEBUG "LS_ARGS: $LS_ARGS" } if [ -e $HOME/.rcrc ]; then . $HOME/.rcrc fi 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