#!/bin/zsh die() { print -r - "$@" exit 1 } if [[ -z $SNAP_SRC ]]; then SNAP_SRC=$1;shift fi SNAP_SRC=${SNAP_SRC%%/} if [[ -z $SNAP_DST ]]; then SNAP_DST=$1;shift fi SNAP_DST=${SNAP_DST%%/} rsync=( rsync -aA --delete "$@" ) marks=( $SNAP_SRC/.snapshot.[0-9]*(N) ) (( $#marks != 1 )) && die invalid marks ${(qqq)marks} if [[ $SNAP_DST == *:* ]]; then # remote [[ $SNAP_DST == *.push ]] || SNAP_DST=$SNAP_DST.push $rsync --exclude=/.snapshot.\* $SNAP_SRC/ $SNAP_DST/ && \ $rsync $SNAP_SRC/ $SNAP_DST/ else # local [[ -d $SNAP_DST ]] || die destination not a directory: ${(qqq)SNAP_DST} ts=${marks##*.} snapshots=( ${SNAP_DST}/.snapshot.[1-9]*(N) ) if (($#snapshots)); then link=${SNAP_DST}/${${snapshots[-1]}##*.} $rsync --link-dest=$link $SNAP_SRC/ $SNAP_DST/$ts/ || exit $? else $rsync $SNAP_SRC/ $SNAP_DST/$ts/ || exit $? fi touch ${SNAP_DST}/$marks:t fi