snap.push.single.zsh (885B)
1 #!/bin/zsh 2 die() { 3 print -r - "$@" 4 exit 1 5 } 6 7 if [[ -z $SNAP_SRC ]]; then 8 SNAP_SRC=$1;shift 9 fi 10 SNAP_SRC=${SNAP_SRC%%/} 11 12 if [[ -z $SNAP_DST ]]; then 13 SNAP_DST=$1;shift 14 fi 15 SNAP_DST=${SNAP_DST%%/} 16 17 rsync=( rsync -aA --delete "$@" ) 18 19 marks=( $SNAP_SRC/.snapshot.[0-9]*(N) ) 20 (( $#marks != 1 )) && die invalid marks ${(qqq)marks} 21 22 if [[ $SNAP_DST == *:* ]]; then 23 # remote 24 [[ $SNAP_DST == *.push ]] || SNAP_DST=$SNAP_DST.push 25 $rsync --exclude=/.snapshot.\* $SNAP_SRC/ $SNAP_DST/ && \ 26 $rsync $SNAP_SRC/ $SNAP_DST/ 27 else 28 # local 29 [[ -d $SNAP_DST ]] || die destination not a directory: ${(qqq)SNAP_DST} 30 ts=${marks##*.} 31 snapshots=( ${SNAP_DST}/.snapshot.[1-9]*(N) ) 32 if (($#snapshots)); then 33 link=${SNAP_DST}/${${snapshots[-1]}##*.} 34 $rsync --link-dest=$link $SNAP_SRC/ $SNAP_DST/$ts/ || exit $? 35 else 36 $rsync $SNAP_SRC/ $SNAP_DST/$ts/ || exit $? 37 fi 38 touch ${SNAP_DST}/$marks:t 39 fi