diff --git a/sync2.sh b/sync2.sh index 1bd3a8e..5d20cb1 100755 --- a/sync2.sh +++ b/sync2.sh @@ -3,35 +3,64 @@ info() { echo "$$: $*"; } err() { echo "E: $$: $*" >&2; } +set -u + FILES="$(pwd -P)" for x; do - if [ -d "$x" ]; then - true # skip dirs - elif [ -L "$HOME/$x" ]; then - d0="$(readlink "$HOME/$x")" - d1="$(echo "$FILES/$x" | sed -e 's,/\./,/,g')" - d1="$(readlink -f "$d1")" - if [ "$d0" != "$d1" ]; then - err "$x: relinking, was [$d0]" - ln -snf "$d1" "$HOME/$x" - fi + # clean + # + x="${x#./}" + + # find target (d1) + # + if [ -L "$FILES/$x" ]; then + d0="$(readlink "$FILES/$x")" + d1="$(readlink -f "$FILES/$x")" + + [ "$d1" = "${d1#$FILES/}" ] || d1="$d0" + elif [ ! -d "$FILES/$x" ]; then + d1="$FILES/$x" else - d="$(dirname "$x")" - if [ ! -d "$HOME/$d/" ]; then - info "$d: creating dir" - mkdir -p "$HOME/$d/" - fi + continue + fi - d="$(echo "$FILES/$x" | sed -e 's,/\./,/,g')" - if [ -e "$HOME/$x" ]; then - info "$x: importing changes and linking" - rm "$d" - cp -a "$HOME/$x" "$d" - else - info "$x: linking" - d="$(readlink -f "$d")" + # link dir + # + d="${x%/*}" + if [ "$d" = "$x" ]; then + d= + elif [ ! -d "$HOME/$d/" ]; then + info "$d: creating dir" + mkdir -p "$HOME/$d/" + fi + + # link + # + if [ -L "$HOME/$x" ]; then + # preexisting link ($d1) + d0="$(readlink "$HOME/$x")" + + [ "$d0" != "$d1" ] || continue + + err "$x: relinking, was [$d0]" + elif [ ! -e "$HOME/$x" ]; then + # new + info "$x: linking" + elif [ -d "$HOME/$x" ]; then + # preexisting dir + + err "$x: importing directory and linking [$d1]" + if ! rmdir "$HOME/$x" 2> /dev/null; then + rm "$FILES/$x" + mv "$HOME/$x" "$FILES/$x" fi - ln -snf "$d" "$HOME/$x" + else + # preexisting file + info "$x: importing changes and linking [$d1]" + rm "$FILES/$x" + cp -a "$HOME/$x" "$FILES/$x" fi + + ln -snf "$d1" "$HOME/$x" done