Files
tty7/assets/completions/rsync.json
T
l0ng-aiandl0ng-ai 21b7f82392 feat(completion): execute dynamic generators for live candidates (#52)
* feat(completion): execute dynamic generators for live candidates

The completion engine consumed Fig specs' static shape but never ran
their dynamic generators, so positions whose candidates come from the
live system — ssh hosts, git branches — fell through to filesystem
path completion (#51: ssh <Tab> listed the cwd).

Local-only by design: the pure engine returns each pending script, the
view runs it on the background executor (/bin/sh -c in the session
cwd, 800ms timeout, kill-on-drop, 256KiB stdout cap, 5s TTL cache) and
merges the parsed lines into the open menu, generation-tagged so a
result can't outlive its session. A per-script parser registry ports
the specs' dropped postProcess transforms (git markers, docker
{{json .}}, package.json scripts, …); unmatched scripts default to
one-candidate-per-line, and hopeless outputs are suppressed rather
than inserted as garbage.

ssh/scp/sftp/rsync specs gain host generators reading ~/.ssh/config
(Include-aware, wildcard patterns skipped) and known_hosts (hashed
entries skipped, [host]:port unwrapped).

Fixes #51

Co-authored-by: l0ng-ai <24760907+l0ng-ai@users.noreply.github.com>

* docs(comments): describe borrowed conventions directly

Prior-art name-drops in comments aged poorly as the implementations
diverged; keep the behavioral rationale, drop the product citations.

* fix(completion): make generator execution CI-portable

Linux: sh -c may fork the command instead of exec'ing it, so killing
only the shell on timeout left a grandchild holding the stdout pipe —
the reader (and the caller) then blocked until the grandchild exited
on its own. Spawn the child as its own process-group leader and kill
the group; the timeout test now forces the fork case (trailing true)
so the group-kill is what's actually proven.

Windows: generator scripts are POSIX sh + awk, so the execution path
now compiles to no-suggestions there instead of failing at runtime on
a missing /bin/sh; the process-spawning tests are Unix-only to match.

---------

Co-authored-by: l0ng-ai <24760907+l0ng-ai@users.noreply.github.com>
2026-07-11 19:12:10 +08:00

1 line
32 KiB
JSON

{"description":"Rsync is a file transfer program capable of efficient remote update via a fast differencing algorithm","options":[{"names":["-v","--verbose"],"description":"Increase verbosity","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--info"],"description":"Fine-grained informational verbosity","args":[{"name":"BACKUP","description":"Mention files backed up","optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]},{"name":"COPY","description":"Mention files copied locally on the receiving side","optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]},{"name":"DEL","description":"Mention deletions on the receiving side","optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]},{"name":"FLIST","description":"Mention file-list receiving/sending (levels 1-2)","optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]},{"name":"MISC","description":"Mention miscellaneous information (levels 1-2)","optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]},{"name":"MOUNT","description":"Mention mounts that were found or skipped","optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]},{"name":"NAME","description":"Mention 1) updated file/dir names, 2) unchanged names","optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]},{"name":"PROGRESS","description":"Mention 1) per-file progress or 2) total transfer progress","optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]},{"name":"REMOVE","description":"Mention files removed on the sending side","optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]},{"name":"SKIP","description":"Mention files that are skipped due to options used","optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]},{"name":"STATS","description":"Mention statistics at end of run (levels 1-3)","optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]},{"name":"SYMSAFE","description":"Mention symlinks that are unsafe","optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]},{"name":"ALL","description":"Set all --info options (e.g. all4)","optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]},{"name":"NONE","description":"Silence all --info options (same as all0)","optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]},{"name":"HELP","description":"Output this help message","optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--debug"],"description":"Fine-grained debug verbosity","args":[{"name":"BACKUP","description":"Mention files backed up","optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]},{"name":"COPY","description":"Mention files copied locally on the receiving side","optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]},{"name":"DEL","description":"Mention deletions on the receiving side","optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]},{"name":"FLIST","description":"Mention file-list receiving/sending (levels 1-2)","optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]},{"name":"MISC","description":"Mention miscellaneous information (levels 1-2)","optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]},{"name":"MOUNT","description":"Mention mounts that were found or skipped","optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]},{"name":"NAME","description":"Mention 1) updated file/dir names, 2) unchanged names","optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]},{"name":"PROGRESS","description":"Mention 1) per-file progress or 2) total transfer progress","optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]},{"name":"REMOVE","description":"Mention files removed on the sending side","optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]},{"name":"SKIP","description":"Mention files that are skipped due to options used","optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]},{"name":"STATS","description":"Mention statistics at end of run (levels 1-3)","optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]},{"name":"SYMSAFE","description":"Mention symlinks that are unsafe","optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]},{"name":"ALL","description":"Set all --info options (e.g. all4)","optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]},{"name":"NONE","description":"Silence all --info options (same as all0)","optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]},{"name":"HELP","description":"Output this help message","optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--msgs2stderr"],"description":"Special output handling for debugging","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--quiet","-q"],"description":"Suppress non-error messages","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--no-motd"],"description":"Suppress daemon-mode MOTD (see manpage caveat)","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--checksum","-c"],"description":"Skip based on checksum, not mod-time & size","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-a","--archive"],"description":"Archive mode; equals -rlptgoD (no -H,-A,-X)","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--no-OPTION"],"description":"Turn off an implied OPTION (e.g. --no-D)","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-r","--recursive"],"description":"Recurse into directories","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-R","--relative"],"description":"Use relative path names","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--no-implied-dirs"],"description":"Don't send implied dirs with --relative","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-b","--backup"],"description":"Make backups (see --suffix & --backup-dir)","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--backup-dir"],"description":"Make backups into hierarchy based in DIR","args":[{"name":"DIR","description":null,"optional":false,"variadic":false,"template":["folders"],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--suffix"],"description":"Set backup suffix (default ~ w/o --backup-dir)","args":[{"name":"SUFFIX","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["-u","--update"],"description":"Skip files that are newer on the receiver","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--inplace"],"description":"Update destination files in-place (SEE MAN PAGE)","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--append"],"description":"Append data onto shorter files","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--append-verify"],"description":"Like --append, but with old data in file checksum","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-d","--dirs"],"description":"Transfer directories without recursing","args":[{"name":"DIR","description":null,"optional":false,"variadic":false,"template":["folders"],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["-l","--links"],"description":"Copy symlinks as symlinks","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-L","--copy-links"],"description":"Transform symlink into referent file/dir","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--copy-unsafe-links"],"description":"Only \"unsafe\" symlinks are transformed","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--safe-links"],"description":"Ignore symlinks that point outside the source tree","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--munge-links"],"description":"Munge symlinks to make them safer (but unusable)","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-k","--copy-dirlinks"],"description":"Transform symlink to a dir into referent dir","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-K","--keep-dirlinks"],"description":"Treat symlinked dir on receiver as dir","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-H","--hard-links"],"description":"Preserve hard links","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-p","--perms"],"description":"Preserve permissions","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-E","--executability"],"description":"Preserve the file's executability","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--chmod"],"description":"Affect file and/or directory permissions","args":[{"name":"CHMOD","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["-A","--acls"],"description":"Preserve ACLs (implies --perms)","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-X","--xattrs"],"description":"Preserve extended attributes","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-o","--owner"],"description":"Preserve owner (super-user only)","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-g","--group"],"description":"Preserve group","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--devices"],"description":"Preserve device files (super-user only)","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--copy-devices"],"description":"Copy device contents as regular file","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--specials"],"description":"Preserve special files","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-D"],"description":"Same as --devices --specials","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-t","--times"],"description":"Preserve modification times","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-O","--omit-dir-times"],"description":"Omit directories from --times","args":[{"name":"DIR","description":null,"optional":false,"variadic":true,"template":["folders"],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["-J","--omit-link-times"],"description":"Omit symlinks from --times","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--super"],"description":"Receiver attempts super-user activities","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--fake-super"],"description":"Store/recover privileged attrs using xattrs","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-S","--sparse"],"description":"Turn sequences of nulls into sparse blocks","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--preallocate"],"description":"Allocate dest files before writing them","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-n","--dry-run"],"description":"Perform a trial run with no changes made","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-W","--whole-file"],"description":"Copy files whole (without delta-xfer algorithm)","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--checksum-choice"],"description":"Choose the checksum algorithms","args":[{"name":"ALGORITHM","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[{"names":["auto"],"description":null},{"names":["md4"],"description":null},{"names":["md5"],"description":null},{"names":["none"],"description":null}],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["-x","--one-file-system"],"description":"Don't cross filesystem boundaries","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-B","--block-size"],"description":"Force a fixed checksum block-size","args":[{"name":"SIZE","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["-e","--rsh"],"description":"Specify the remote shell to use","args":[{"name":"COMMAND","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--rsync-path"],"description":"Specify the rsync to run on the remote machine","args":[{"name":"PATH","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--existing"],"description":"Skip creating new files on receiver","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--ignore-existing"],"description":"Skip updating files that already exist on receiver","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--remove-source-files"],"description":"Sender removes synchronized files (non-dirs)","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--delete"],"description":"Delete extraneous files from destination dirs","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--delete-before"],"description":"Receiver deletes before transfer, not during","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--delete-during","--del"],"description":"Receiver deletes during the transfer","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--delete-delay"],"description":"Find deletions during, delete after","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--delete-after"],"description":"Receiver deletes after transfer, not during","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--delete-excluded"],"description":"Also delete excluded files from destination dirs","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--ignore-missing-args"],"description":"Ignore missing source args without error","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--delete-missing-args"],"description":"Delete missing source args from destination","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--ignore-errors"],"description":"Delete even if there are I/O errors","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--force"],"description":"Force deletion of directories even if not empty","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--max-delete"],"description":"Don't delete more than NUM files","args":[{"name":"NUM","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--max-size"],"description":"Don't transfer any file larger than SIZE","args":[{"name":"SIZE","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--min-size"],"description":"Don't transfer any file smaller than SIZE","args":[{"name":"SIZE","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--partial"],"description":"Keep partially transferred files","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--partial-dir=DIR"],"description":"Put a partially transferred file into DIR","args":[{"name":"DIR","description":null,"optional":false,"variadic":false,"template":["folders"],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--delay-updates"],"description":"Put all updated files into place at transfer's end","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-m","--prune-empty-dirs"],"description":"Prune empty directory chains from the file-list","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--numeric-ids"],"description":"Don't map uid/gid values by user/group name","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--usermap"],"description":"Custom username mapping","args":[{"name":"STRING","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--groupmap"],"description":"Custom groupname mapping","args":[{"name":"STRING","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--chown=USER:GROUP"],"description":"Simple username/groupname mapping","args":[{"name":"USER:GROUP","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--timeout"],"description":"Set I/O timeout in seconds","args":[{"name":"SECONDS","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--contimeout"],"description":"Set daemon connection timeout in seconds","args":[{"name":"SECONDS","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["-I","--ignore-times"],"description":"Don't skip files that match in size and mod-time","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-M"],"description":"Send OPTION to the remote side only","args":[{"name":"OPTION","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--remote-option"],"description":"Send OPTION to the remote side only","args":[{"name":"OPTION","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--size-only"],"description":"Skip files that match in size","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-@"],"description":"Set the accuracy for mod-time comparisons","args":[{"name":"NUM","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--modify-window"],"description":"Set the accuracy for mod-time comparisons","args":[{"name":"NUM","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["-T"],"description":"Create temporary files in directory DIR","args":[{"name":"DIR","description":null,"optional":false,"variadic":false,"template":["folders"],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--temp-dir"],"description":"Create temporary files in directory DIR","args":[{"name":"DIR","description":null,"optional":false,"variadic":false,"template":["folders"],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["-y","--fuzzy"],"description":"Find similar file for basis if no dest file","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--compare-dest"],"description":"Also compare destination files relative to DIR","args":[{"name":"DIR","description":null,"optional":false,"variadic":false,"template":["folders"],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--copy-dest"],"description":"Also compare destination files relative to DIR and include copies of unchanged files","args":[{"name":"DIR","description":null,"optional":false,"variadic":false,"template":["folders"],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--link-dest"],"description":"Hardlink to files in DIR when unchanged","args":[{"name":"DIR","description":null,"optional":false,"variadic":false,"template":["folders"],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["-z","--compress"],"description":"Compress file data during the transfer","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--compress-level"],"description":"Explicitly set compression level","args":[{"name":"NUM","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[{"names":["0"],"description":null},{"names":["1"],"description":null},{"names":["2"],"description":null},{"names":["3"],"description":null},{"names":["4"],"description":null},{"names":["5"],"description":null},{"names":["6"],"description":null},{"names":["7"],"description":null},{"names":["8"],"description":null},{"names":["9"],"description":null}],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--skip-compress"],"description":"Skip compressing files with a suffix in LIST","args":[{"name":"LIST","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["-C","--cvs-exclude"],"description":"Auto-ignore files the same way CVS does","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-f"],"description":"Add a file-filtering RULE","args":[{"name":"RULE","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--filter"],"description":"Add a file-filtering RULE","args":[{"name":"RULE","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["-F"],"description":"Same as --filter='dir-merge /.rsync-filter'","args":[{"name":"DIR","description":null,"optional":false,"variadic":true,"template":["folders"],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--exclude"],"description":"Exclude files matching PATTERN","args":[{"name":"PATTERN","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--exclude-from"],"description":"Read exclude patterns from FILE","args":[{"name":"FILE","description":null,"optional":false,"variadic":false,"template":["filepaths"],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--include"],"description":"Don't exclude files matching PATTERN","args":[{"name":"PATTERN","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--include-from"],"description":"Read include patterns from FILE","args":[{"name":"FILE","description":null,"optional":false,"variadic":false,"template":["filepaths"],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--files-from"],"description":"Read list of source-file names from FILE","args":[{"name":"FILE","description":null,"optional":false,"variadic":false,"template":["filepaths"],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["-0","--from0"],"description":"All *-from/filter files are delimited by 0s","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-s","--protect-args"],"description":"No space-splitting; only wildcard special-chars","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--address"],"description":"Bind address for outgoing socket to daemon","args":[{"name":"ADDRESS","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--port"],"description":"Specify double-colon alternate port number","args":[{"name":"PORT","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--sockopts"],"description":"Specify custom TCP options","args":[{"name":"OPTIONS","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--blocking-io"],"description":"Use blocking I/O for the remote shell","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--stats"],"description":"Give some file-transfer stats","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-8","--8-bit-output"],"description":"Leave high-bit chars unescaped in output","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-h","--human-readable"],"description":"Output numbers in a human-readable format","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--progress"],"description":"Show progress during transfer","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-P"],"description":"Same as --partial --progress","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-i","--itemize-changes"],"description":"Output a change-summary for all updates","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--out-format"],"description":"Output updates using the specified FORMAT","args":[{"name":"FORMAT","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--log-file"],"description":"Log what we're doing to the specified FILE","args":[{"name":"FILE","description":null,"optional":false,"variadic":false,"template":["filepaths"],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--log-file-format"],"description":"Log updates using the specified FMT","args":[{"name":"FMT","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--password-file"],"description":"Read daemon-access password from FILE","args":[{"name":"FILE","description":null,"optional":false,"variadic":false,"template":["filepaths"],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--list-only"],"description":"List the files instead of copying them","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--bwlimit"],"description":"Limit socket I/O bandwidth","args":[{"name":"RATE","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--stop-at"],"description":"Stop rsync at year-month-dayThour:minute","args":[{"name":"y-m-dTh:m","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--time-limit"],"description":"Stop rsync after MINS minutes have elapsed","args":[{"name":"MINS","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--outbuf"],"description":"Set output buffering to None, Line, or Block","args":[{"name":"BUFFER","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[{"names":["N"],"description":null},{"names":["L"],"description":null},{"names":["B"],"description":null}],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--write-batch"],"description":"Write a batched update to FILE","args":[{"name":"FILE","description":null,"optional":false,"variadic":false,"template":["filepaths"],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--only-write-batch"],"description":"Like --write-batch but w/o updating destination","args":[{"name":"FILE","description":null,"optional":false,"variadic":false,"template":["filepaths"],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--read-batch"],"description":"Read a batched update from FILE","args":[{"name":"FILE","description":null,"optional":false,"variadic":false,"template":["filepaths"],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--protocol"],"description":"Force an older protocol version to be used","args":[{"name":"NUM","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--iconv"],"description":"Request charset conversion of filenames","args":[{"name":"CONVERT_SPEC","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--checksum-seed"],"description":"Set block/file checksum seed (advanced)","args":[{"name":"NUM","description":null,"optional":false,"variadic":false,"template":[],"suggestions":[],"generators":[]}],"required":false,"repeatable":false,"hidden":false},{"names":["--noatime"],"description":"Do not alter atime when opening source files","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-4","--ipv4"],"description":"Prefer IPv4","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-6","--ipv6"],"description":"Prefer IPv6","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["--version"],"description":"Print version number","args":[],"required":false,"repeatable":false,"hidden":false},{"names":["-h","--help"],"description":"Show help for rsync (-h is --help only if used alone)","args":[],"required":false,"repeatable":false,"hidden":false}],"args":[{"name":"SRC","description":null,"optional":false,"variadic":true,"template":["filepaths"],"suggestions":[],"generators":[{"script":["cat ~/.ssh/config $(awk 'tolower($1)==\"include\"{for(i=2;i<=NF;i++){p=$i;if(p ~ /^~\\//){sub(/^~/,ENVIRON[\"HOME\"],p)}else if(p !~ /^\\//){p=ENVIRON[\"HOME\"]\"/.ssh/\"p}print p}}' ~/.ssh/config 2>/dev/null) 2>/dev/null | awk 'tolower($1)==\"host\"{for(i=2;i<=NF;i++){if($i !~ /[*?!]/)print $i}}' | sort -u"]},{"script":["awk '/^[|#@]/{next}{n=split($1,a,\",\");for(i=1;i<=n;i++){h=a[i];sub(/^\\[/,\"\",h);sub(/\\]:[0-9]+$/,\"\",h);sub(/\\]$/,\"\",h);print h}}' ~/.ssh/known_hosts 2>/dev/null | sort -u"]}]},{"name":"DEST","description":null,"optional":false,"variadic":false,"template":["filepaths"],"suggestions":[],"generators":[{"script":["cat ~/.ssh/config $(awk 'tolower($1)==\"include\"{for(i=2;i<=NF;i++){p=$i;if(p ~ /^~\\//){sub(/^~/,ENVIRON[\"HOME\"],p)}else if(p !~ /^\\//){p=ENVIRON[\"HOME\"]\"/.ssh/\"p}print p}}' ~/.ssh/config 2>/dev/null) 2>/dev/null | awk 'tolower($1)==\"host\"{for(i=2;i<=NF;i++){if($i !~ /[*?!]/)print $i}}' | sort -u"]},{"script":["awk '/^[|#@]/{next}{n=split($1,a,\",\");for(i=1;i<=n;i++){h=a[i];sub(/^\\[/,\"\",h);sub(/\\]:[0-9]+$/,\"\",h);sub(/\\]$/,\"\",h);print h}}' ~/.ssh/known_hosts 2>/dev/null | sort -u"]}]}],"subcommands":[],"name":"rsync"}