# (C) 2013 magicant

# Completion script for the "rsync" command.
# Supports rsync 3.0.9.

function completion/rsync {

        typeset OPTIONS ARGOPT PREFIX
        OPTIONS=( #>#
        "0 --from0; treat filename list files as null-separated"
        "4 --ipv4; prefer IPv4"
        "6 --ipv6; prefer IPv6"
        "8 --8-bit-output; don't escape non-ASCII characters"
        "A --acls; like -P but preserve ACL as well"
        "--address:; specify an address to bind to"
        "--append; copy files by appending only"
        "--append-verify; like --append but verify whole files"
        "a --archive; like -Dgloprt"
        "b --backup; make a backup of existing destination files"
        "--backup-dir:; specify where to make a backup"
        "--blocking-io; use blocking IO"
        "B: --block-size:; specify the block size used in delta-transfer"
        "--bwlimit:; specify a speed limit in kilobytes/second"
        "c --checksum; use checksum to decide if a file needs to be sent"
        "--checksum-seed:; specify a seed for checksum"
        "--chmod:; specify permissions of copied files"
        "--compare-dest:; specify a directory to compare with as destination"
        "--compress-level:; specify the compression level"
        "--config:; specify a config file for daemon"
        "--contimeout:; specify timeout for rsync connection daemon"
        "--copy-dest:; like --compare-dest but copy from if possible"
        "--copy-unsafe-links; follow symbolic links to outside of source tree"
        "C --cvs-exclude; exclude files like CVS does"
        "D; like --devices --specials"
        "--daemon; run as a daemon"
        "--delay-updates; replace destination files after all transfer"
        "--devices; copy character and block device files"
        "d --dirs; copy directories but not their contents"
        "--exclude:; skip files whose names match the specified pattern"
        "--exclude-from:; skip files whose names match a pattern in the specified file"
        "E --executability; preserve file executability"
        "--existing --ignore-non-existing; copy only files existing on destination"
        "e: --rsh:; specify a program for remote connection"
        "F; like --filter='dir-merge /.rsync-filter'"
        "--fake-super; use extended attributes to preserve various attributes"
        "--files-from:; specify a file containing filenames to transfer"
        "f: --filter:; specify an exclusion rule"
        "--force; allow replacing non-empty directories with non-directories"
        "g --group; preserve file owner groups"
        "H --hard-links; preserve hard links"
        "h --human-readable; print size using K, M, etc."
        "--iconv:; specify filename encodings"
        "--ignore-existing; don't copy files existing on destination"
        "I --ignore-times; don't skip files that match size and time"
        "--include:; copy only files whose names match the specified pattern"
        "--include-from:; copy only files whose names match a pattern in the specified file"
        "--inplace; modify destination files in-place"
        "i --itemize-changes; print a summarized list of changes"
        "K --keep-dirlinks; follow symbolic links to directories on destination side"
        "k --copy-dirlinks; follow symbolic links to directories on source side"
        "L --copy-links; follow all symbolic links in source files"
        "--link-dest:; specify a directory to search for hard-linkable files"
        "l --links; copy symbolic links as symbolic links"
        "--list-only; list files without actual transfer"
        "--log-file:; specify a file to print log to"
        "--log-file-format:; specify a format used in logging with --log-file"
        "m --prune-empty-dirs; don't copy empty directories"
        "--max-delete:; specify the maximum number of files deleted"
        "--max-size:; specify the maximum size of files copied"
        "--min-size:; specify the minimum size of files copied"
        "--modify-window:; specify max time difference treated as same"
        "n --dry-run; don't actually copy files"
        "--no-detach; don't run in the background (with --daemon)"
        "--no-motd; don't print the message of the day sent from daemon"
        "--no-implied-dirs; don't copy intermediate directory paths (with -R)"
        "--no-inc-recursive --no-i-r; disable incremental recursion"
        "--numeric-ids; match numeric owner/group IDs rather than names"
        "O --omit-dir-times; don't preserve modification times for directories"
        "--only-write-batch:; like --write-batch, but no actual transfer"
        "--out-format:; specify a format printed for each file update"
        "o --owner; preserve file owners"
        "P; like --partial --progress"
        "--partial; leave partially copied files if interrupted"
        "--partial-dir:; specify a directory where intermediate files are kept"
        "--password-file:; specify a file containing a password"
        "p --perms; preserve file permissions"
        "--port:; specify a port for daemon connection"
        "--progress; show progress during transfer"
        "--protocol:; specify a protocol version"
        "q --quiet; print error messages only"
        "--read-batch:; specify a batch file containing transfer recipe"
        "R --relative; preserve all pathname components from source"
        "r --recursive; copy directories recursively"
        "--rsync-path:; specify a program executed on the remote host"
        "s --protect-args; protect filenames from word splitting by the remote shell"
        "--safe-links; ignore symbolic links to outside of source tree"
        "--size-only; skip files that match in size"
        "--skip-compress:; specify a list of suffixes that are not compressed"
        "--sockopts:; specify socket options"
        "S --sparse; handle sparse files efficiently"
        "--specials; copy named sockets, pipes, etc."
        "--stats; print transfer statistics"
        "--suffix:; specify a suffix to append to backup file names"
        "--super; exercise superuser rights to preserve various attributes"
        "T: --temp-dir:; specify a directory for temporary files on destination side"
        "--timeout:; specify timeout in seconds"
        "t --times; preserve file modification times"
        "u --update; don't copy if destination is newer than source"
        "v --verbose; print detail during execution"
        "W --whole-file; send whole files rather than just different parts"
        "--write-batch:; specify a file where transfer recipe is recorded"
        "X --xattrs; preserve extended attributes"
        "x --one-file-system; skip subdirectories on different file systems"
        "y --fuzzy; look for similar files to optimize transfer"
        "z --compress; enable compression"
        "--help"
        "--version"
        ) #<#
        # TODO --no-xxx option

        command -f completion//parseoptions
        case $ARGOPT in
        (-)
                command -f completion//completeoptions
                ;;
        (--*-batch|--config|--exclude*|--files-from|--include*|--log-file|--password-file)
                complete -P "$PREFIX" -f
                ;;
        (--address)
                complete -P "$PREFIX" -h
                ;;
#       (--backup-dir)
#               ;;
        (B|--block-size)
                #TODO
                ;;
#       (--bwlimit)
#               ;;
#       (--checksum-seed)
#               ;;
        (--chmod)
                if command -vf completion/chmod::mode >/dev/null 2>&1 ||
                                . -AL completion/chmod; then
                        command -f completion/chmod::mode rsync
                fi
                ;;
#       (--*-dest)
#               # How can we complete remote directory names before the remote
#               # host name is entered on the command line?
#               ;;
#       (--compress-level)
#               ;;
#       (--contimeout)
#               ;;
        (e|--rsh)
                complete -P "$PREFIX" --external-command
                ;;
        (f|--filter)
                #TODO
                ;;
        (--*-format)
                #TODO
                ;;
        (--iconv)
                typeset word="${TARGETWORD#"$PREFIX"}"
                word=${word#*,}
                PREFIX="${TARGETWORD%"$word"}"
                if command -vf completion/iconv::compenc >/dev/null 2>&1 ||
                                . -AL completion/iconv; then
                        command -f completion/iconv::compenc
                fi
                ;;
#       (--max-delete)
#               ;;
        (--max-size|--min-size)
                if command -vf completion//prefixdigits >/dev/null 2>&1 ||
                                . -AL completion/_blocksize; then
                        if command -f completion//prefixdigits; then
                                command -f completion//completesizesuffix KMGB
                        fi
                fi
                ;;
#       (--modify-window)
#               ;;
#       (--partial-dir)
#               # How can we complete remote directory names before the remote
#               # host name is entered on the command line?
#               ;;
#       (--port)
#               ;;
#       (--protocol)
#               ;;
#       (--rsync-path)
#               ;;
#       (--skip-compress)
#               ;;
#       (--sockopts)
#               ;;
#       (--suffix)
#               ;;
#       (T|--temp-dir)
#               # How can we complete remote directory names before the remote
#               # host name is entered on the command line?
#               ;;
#       (--timeout)
#               ;;
        ('')
                command -f completion/rsync::operand
                ;;
        esac

}

function completion/rsync::operand {

        #TODO support rsync daemon protocol

        command -f completion//getoperands
        WORDS=(rsync "$WORDS")

        if command -vf completion/scp::operand >/dev/null 2>&1 ||
                        . -AL completion/ssh; then
                command -f completion/scp::operand
        fi

}


# vim: set ft=sh ts=8 sts=8 sw=8 et:
