#!/bin/sh : ${RCM_LIB:=`dirname $0`/../share/rcm} . $RCM_LIB/rcm.sh link_or_copy() { $DEBUG "link_or_copy $1" local sigil=$1 if [ "x$sigil" = "xX" ]; then echo $CP else echo $LN fi } link_file() { local src=$1 local dest=$2 local sigil=$3 if [ -h $dest ]; then $RM -f $dest fi action=`link_or_copy $sigil` $DEBUG "$action $src $dest" $action $src $dest } replace_file() { local src=$1 local dest=$2 local sigil=$3 $DEBUG replace_file $1 $2 $3 $RM -rf $dest link_file $src $dest $sigil } 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 local sigil=$3 $DEBUG handle_file $1 $2 $3 if [ -e "$dest" ]; then if is_identical $src $dest; then $VERBOSE "identical $dest" elif [ $REPLACE_ALL -eq 1 ]; then replace_file $src $dest $sigil else $PROMPT "overwrite ${dest}? [ynaq]" read overwrite case $overwrite in a) REPLACE_ALL=1 replace_file $src $dest $sigil ;; y) replace_file $src $dest $sigil ;; q) exit 1 ;; *) $VERBOSE "skipping $dest" ;; esac fi else link_file $src $dest $sigil fi } show_help() { local exit_code=${1:-0} $PRINT "Usage: rcup [-CVqvfhikK] [-I EXCL_PAT] [-x EXCL_PAT] [-t TAG] [-d DOT_DIR]" $PRINT "see rcup(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 always_copy=0 REPLACE_ALL=0 while getopts CVqvfhikKI:x:t:d: opt; do case "$opt" in C) always_copy=1 ;; d) dotfiles_dirs="$dotfiles_dirs $OPTARG" ;; f) REPLACE_ALL=1 ;; h) show_help ;; i) REPLACE_ALL=0 ;; I) includes="$includes $OPTARG" ;; k) run_hooks=1 ;; K) run_hooks=0 ;; q) verbosity=$(($verbosity - 1)) ;; t) arg_tags="$arg_tags $OPTARG" ;; v) verbosity=$(($verbosity + 1)) ;; V) version=1 ;; x) excludes="$excludes $OPTARG" ;; esac done shift $(($OPTIND-1)) if [ $always_copy -eq 1 ]; then LN=$CP fi handle_common_flags rcup $version $verbosity tags=${arg_tags:-$TAGS} DOTFILES_DIRS=${dotfiles_dirs:-$DOTFILES_DIRS} RUN_HOOKS=$run_hooks 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 for exclude in $excludes; do LS_ARGS="$LS_ARGS -x $exclude" done for include in $includes; do LS_ARGS="$LS_ARGS -I $include" done LS_ARGS="$LS_ARGS $files" $DEBUG "LS_ARGS: $LS_ARGS" } LS_ARGS=-F if [ -e $HOME/.rcrc ]; then . $HOME/.rcrc fi handle_command_line $* : ${DOTFILES_DIRS:=$DOTFILES_DIRS $DEFAULT_DOTFILES_DIR} run_hooks pre up for dest_and_src in `lsrc $LS_ARGS`; do saved_ifs=$IFS IFS=: set $dest_and_src IFS=$saved_ifs dest=$1 src=$2 sigil=$3 if is_nested $dest; then handle_dir $dest fi handle_file $src $dest $sigil done run_hooks post up