From 8df6aa5bfc819137cb14220e601db5cd431549d7 Mon Sep 17 00:00:00 2001 From: Kevin Date: Sat, 4 Nov 2017 12:02:03 -0400 Subject: [PATCH] Added ZSH Shell Completion Added ZSH Shell Completion from upstream. https://github.com/mrkmg/borgbackup-zsh-completion --- scripts/shell_completions/zsh/_borg | 390 ++++++++++++++++++++++++++++ 1 file changed, 390 insertions(+) create mode 100644 scripts/shell_completions/zsh/_borg diff --git a/scripts/shell_completions/zsh/_borg b/scripts/shell_completions/zsh/_borg new file mode 100644 index 000000000..2abb561bc --- /dev/null +++ b/scripts/shell_completions/zsh/_borg @@ -0,0 +1,390 @@ +#compdef borg + +# ------- +# +# For borg 1.1.1 +# +# To Install: +# +# Copy this file to /usr/share/zsh/site-functions/ +# +# ------- +# borgbackup ZSH completion +# Kevin Gravier 2017 +# +# The MIT License (MIT) + +# Copyright (c) 2017 Kevin + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + + + +_borg() { + typeset -A opt_args + local -a borg_possible_commands borg_possible_key_commands commands keyCommands borg_standard_options + local command keyCommand item subItem + + borg_standard_options=({-h,--help}'[show this help message and exit]' + --critical'[work on log level CRITICAL]' + --error'[work on log level ERROR]' + --warning'[work on log level WARNING (default)]' + {--info,-v,--verbose}'[work on log level INFO]' + --debug'[work on log level DEBUG]' + --default-topic'[enable TOPIC debugging (can be specified multiple times).]:TOPIC' + {-p,--progress}'[show progress information]' + --log-json'[Output one JSON object per log line instead of formatted text.]' + --lock-wait'[wait at most SECONDS for acquiring a repository/cache lock (default: 1).]:SECONDS' + --show-version'[show/log the borg version]' + --show-rc'[show/log the return code (rc)]' + --umask'[set umask to M (local and remote, default: 0077)]:umask' + --remote-path'[set remote path to executable (default: "borg")]:_files' + --remote-ratelimit'[set remote network upload rate limit in kiByte/s (default: 0=unlimited)]:RATE' + --consider-part-files'[treat part files like normal files (e.g. to list/extract them)]' + --debug-profile'[Write execution profile in Borg format into FILE.]:_files') + + borg_possible_commands=(serve init check key change-passphrase create extract export-tar diff rename delete list mount umount info break-lock prune upgrade with-lock benchmark) + borg_possible_key_commands=(change-passphrase import export) + command="" + keyCommand="" + + for item in $words; do + (( ${borg_possible_commands[(I)$item]} )) && command=$item + (( ${borg_possible_key_commands[(I)$item]} )) && keyCommand=$item + done + + case $command in + (serve) + _arguments \ + --restrict-to-path'[restrict repository access to PATH]:_files'\ + --restrict-to-repository'[restrict repository access]:_files'\ + --append-only'[only allow appending to repository segment files]'\ + --storage-quota'[Override storage quota of the repository]:QUOTA'\ + $borg_standard_options + ;; + (init) + _arguments \ + '2:repo:_files'\ + {-e,--encryption}'[select encryption key mode]:MODE'\ + --append-only'[only allow appending to repository segment files]'\ + --storage-quota'[Override storage quota of the repository]:QUOTA'\ + $borg_standard_options + ;; + (check) + _arguments \ + '2:archives:__borg_archive'\ + --repository-only'[only perform repository checks]'\ + --archives-only'[only perform archives checks]'\ + --verify-data'[perform cryptographic archive data integrity verification]'\ + --repair'[attempt to repair any inconsistencies found]'\ + --save-space'[work slower, but using less space]'\ + {-P,--prefix}'[only consider archive names starting with this prefix.]:PREFIX'\ + {-a,--glob-archives}'[only consider archive names matching the glob]:GLOB'\ + --sort-keys'[Comma-separated list of sorting keys]:KEYS'\ + --first'[consider first N archives after other filters were applied]:N'\ + --last'[consider last N archives after other filters were applied]:N'\ + $borg_standard_options + ;; + (key) + case $keyCommand in + (change-passphrase) + _arguments \ + '2:subCommand:(change-passphrase import export)'\ + '3:archives:__borg_archive'\ + $borg_standard_options + ;; + (import) + _arguments \ + '2:subCommand:(change-passphrase import export)'\ + '3:archives:__borg_archive'\ + '4:path:_files'\ + --paper'[interactively import from a backup done with --paper]'\ + $borg_standard_options + ;; + (export) + _arguments \ + '2:subCommand:(change-passphrase import export)'\ + '3:archives:__borg_archive'\ + '4:path:_files'\ + --paper'[Create an export suitable for printing and later type-in]'\ + --qr-html'[Create an html file suitable for printing and later type-in or qr scan]'\ + $borg_standard_options + ;; + *) + _arguments \ + '2:subCommand:(change-passphrase import export)'\ + $borg_standard_options + ;; + esac + ;; + (change-passphrase) + _arguments \ + '2:archives:__borg_archive'\ + $borg_standard_options + ;; + (create) + _arguments \ + '2:archives:__borg_archive'\ + '3:path:_files'\ + {-n,--dry-run}'[do not create a backup archive]'\ + {-s,--stats}'[print statistics for the created archive]'\ + --list'[output verbose list of items (files, dirs, ...)]'\ + --filter'[only display items with the given status characters]:STATUSCHARS'\ + --json'[output stats as JSON. Implies --stats.]'\ + --no-cache-sync'[experimental: do not synchronize the cache. Implies not using the files cache.]'\ + {-x,--one-file-system}'[stay in the same file system ]'\ + --numeric-owner'[only store numeric user and group identifiers]'\ + --noatime'[do not store atime into archive]'\ + --noctime'[do not store ctime into archive]'\ + --nobsdflags'[do not read and store bsdflags (e.g. NODUMP, IMMUTABLE) into archive]'\ + --ignore-inode'[gnore inode data in the file metadata cache used to detect unchanged files.]'\ + --files-cache'[operate files cache in MODE. default: ctime,size,inode]:MODE'\ + --read-special'[open and read block and char device files as well as FIFOs as if they were regular files.]'\ + {-e,--exclude}'[exclude paths matching PATTERN]:PATTERN'\ + --exclude-from'[read exclude patterns from EXCLUDEFILE, one per line]:_files'\ + --pattern'[experimental: include/exclude paths matching PATTERN]:PATTERN'\ + --patterns-from'[experimental: read include/exclude patterns from PATTERNFILE, one per line]:_files'\ + --exclude-caches'[exclude directories that contain a CACHEDIR.TAG file ]'\ + --exclude-if-present'[exclude directories that are tagged by containing a filesystem object with the given NAME]:NAME'\ + {--keep-exclude-tags,--keep-tag-files}'[if tag objects are specified with --exclude-if-present, don’t omit the tag objects themselves]'\ + --exclude-nodump'[exclude files flagged NODUMP]'\ + --comment'[add a comment text to the archive]:COMMENT'\ + --timestamp'[manually specify the archive creation date/time]:TIMESTAMP'\ + {-c,--checkpoint-interval}'[write checkpoint every SECONDS seconds]:SECONDS'\ + --chunker-params'[pecify the chunker parameters]:PARAMS'\ + {-C,--compression}'[select compression algorithm]:COMPRESSION'\ + $borg_standard_options + ;; + (extract) + _arguments \ + '2:archives:__borg_archive'\ + '3:path:_files'\ + --list'[output verbose list of items (files, dirs, ...)]'\ + {-n,--dry-run}'[do not actually change any files]'\ + --numeric-owner'[only obey numeric user and group identifiers]'\ + --nobsdflags'[do not extract/set bsdflags (e.g. NODUMP, IMMUTABLE)]'\ + --stdout'[write all extracted data to stdout]'\ + --sparse'[create holes in output sparse file from all-zero chunks]'\ + {-e,--exclude}'[exclude paths matching PATTERN]:PATTERN'\ + --exclude-from'[read exclude patterns from EXCLUDEFILE, one per line]:_files'\ + --pattern'[experimental: include/exclude paths matching PATTERN]:PATTERN'\ + --patterns-from'[experimental: read include/exclude patterns from PATTERNFILE, one per line]:_files'\ + --strip-components'[Remove the specified number of leading path elements. Paths with fewer elements will be silently skipped.]:NUMBER'\ + $borg_standard_options + ;; + (export-tar) + _arguments \ + '2:archives:__borg_archive'\ + '3:tar:_files'\ + '4:path:_files'\ + --tar-filter'[filter program to pipe data through]'\ + --list'[output verbose list of items (files, dirs, ...)]'\ + {-e,--exclude}'[exclude paths matching PATTERN]:PATTERN'\ + --exclude-from'[read exclude patterns from EXCLUDEFILE, one per line]:_files'\ + --pattern'[experimental: include/exclude paths matching PATTERN]:PATTERN'\ + --patterns-from'[experimental: read include/exclude patterns from PATTERNFILE, one per line]:_files'\ + --strip-components'[Remove the specified number of leading path elements. Paths with fewer elements will be silently skipped.]:NUMBER'\ + $borg_standard_options + ;; + (diff) + _arguments \ + '2:archives:__borg_archive'\ + '3:archives:__borg_archive'\ + '*:path:_files'\ + --numeric-owner'[only obey numeric user and group identifiers]'\ + --same-chunker-params'[Override check of chunker parameters.]'\ + --sort'[Sort the output lines by file path.]'\ + {-e,--exclude}'[exclude paths matching PATTERN]:PATTERN'\ + --exclude-from'[read exclude patterns from EXCLUDEFILE, one per line]:_files'\ + --pattern'[experimental: include/exclude paths matching PATTERN]:PATTERN'\ + --patterns-from'[experimental: read include/exclude patterns from PATTERNFILE, one per line]:_files'\ + --exclude-caches'[exclude directories that contain a CACHEDIR.TAG file ]'\ + --exclude-if-present'[exclude directories that are tagged by containing a filesystem object with the given NAME]:NAME'\ + {--keep-exclude-tags,--keep-tag-files}'[if tag objects are specified with --exclude-if-present, don’t omit the tag objects themselves]'\ + $borg_standard_options + + ;; + (rename) + _arguments \ + '2:archives:__borg_archive'\ + '3:name:NAME'\ + $borg_standard_options + ;; + (delete) + _arguments \ + '2:archives:__borg_archive'\ + '*:archives:archives'\ + {-s,--stats}'[print statistics for the deleted archive]'\ + --cache-only'[delete only the local cache for the given repository]'\ + --force'[force deletion of corrupted archives, use --force --force in case --force does not work.]'\ + --save-space'[work slower, but using less space]'\ + {-P,--prefix}'[only consider archive names starting with this prefix.]:PREFIX'\ + {-a,--glob-archives}'[only consider archive names matching the glob]:GLOB'\ + --sort-keys'[Comma-separated list of sorting keys]:KEYS'\ + --first'[consider first N archives after other filters were applied]:N'\ + --last'[consider last N archives after other filters were applied]:N'\ + $borg_standard_options + ;; + (list) + _arguments \ + '2:archives:__borg_archive'\ + '*:path:_files'\ + --short'[only print file/directory names, nothing else]'\ + {--format,--list-format}'[specify format for file listing]:FORMAT'\ + --json'[Only valid for listing repository contents. Format output as JSON.]'\ + --json-lines'[Only valid for listing archive contents. Format output as JSON Lines. ]'\ + {-P,--prefix}'[only consider archive names starting with this prefix.]:PREFIX'\ + {-a,--glob-archives}'[only consider archive names matching the glob]:GLOB'\ + --sort-keys'[Comma-separated list of sorting keys]:KEYS'\ + --first'[consider first N archives after other filters were applied]:N'\ + --last'[consider last N archives after other filters were applied]:N'\ + {-e,--exclude}'[exclude paths matching PATTERN]:PATTERN'\ + --exclude-from'[read exclude patterns from EXCLUDEFILE, one per line]:_files'\ + --pattern'[experimental: include/exclude paths matching PATTERN]:PATTERN'\ + --patterns-from'[experimental: read include/exclude patterns from PATTERNFILE, one per line]:_files'\ + --exclude-caches'[exclude directories that contain a CACHEDIR.TAG file ]'\ + --exclude-if-present'[exclude directories that are tagged by containing a filesystem object with the given NAME]:NAME'\ + {--keep-exclude-tags,--keep-tag-files}'[if tag objects are specified with --exclude-if-present, don’t omit the tag objects themselves]'\ + $borg_standard_options + ;; + (mount) + _arguments \ + '2:archives:__borg_archive'\ + '3:mountpoint:_files'\ + {-f,--foreground}'[stay in foreground, do not daemonize]'\ + -o'[Extra mount options]:OPTS'\ + {-P,--prefix}'[only consider archive names starting with this prefix.]:PREFIX'\ + {-a,--glob-archives}'[only consider archive names matching the glob]:GLOB'\ + --sort-keys'[Comma-separated list of sorting keys]:KEYS'\ + --first'[consider first N archives after other filters were applied]:N'\ + --last'[consider last N archives after other filters were applied]:N'\ + $borg_standard_options + ;; + (umount) + _arguments \ + '2:mountpoint:_files'\ + $borg_standard_options + ;; + (info) + _arguments \ + '2:archives:__borg_archive'\ + --json'[format output as JSON]'\ + {-P,--prefix}'[only consider archive names starting with this prefix.]:PREFIX'\ + {-a,--glob-archives}'[only consider archive names matching the glob]:GLOB'\ + --sort-keys'[Comma-separated list of sorting keys]:KEYS'\ + --first'[consider first N archives after other filters were applied]:N'\ + --last'[consider last N archives after other filters were applied]:N'\ + {-e,--exclude}'[exclude paths matching PATTERN]:PATTERN'\ + $borg_standard_options + ;; + (break-lock) + _arguments \ + '2:archives:__borg_archive'\ + $borg_standard_options + ;; + (prune) + _arguments \ + '2:archives:__borg_archive'\ + {-n,--dry-run}'[do not change repository]'\ + --force'[]'\ + {-s,--stats}'[]'\ + --list'[]'\ + --keep-within'[keep all archives within this time interval]:INERVAL'\ + {--keep-last,--keep-secondly}'[number of secondly archives to keep]:N'\ + --keep-minutely'[number of minutely archives to keep]:N'\ + {-H,--keep-hourly}'[number of hourly archives to keep]:N'\ + {-d,--keep-daily}'[number of daily archives to keep]:N'\ + {-w,--keep-weekly}'[number of weekly archives to keep]:N'\ + {-m,--keep-monthly}'[number of monthly archives to keep]:N'\ + {-y,--keep-yearly}'[number of yearly archives to keep]:N'\ + --save-space'[work slower, but using less space]'\ + $borg_standard_options + ;; + (upgrade) + _arguments \ + '2:archives:__borg_archive'\ + {-n,--dry-run}'[do not change repository]'\ + --inplace'[rewrite repository in place, with no chance of going back to older versions of the repository.]'\ + --force'[Force upgrade]'\ + --tam'[Enable manifest authentication (in key and cache) (Borg 1.0.9 and later).]'\ + --disable-tam'[Disable manifest authentication (in key and cache).]'\ + $borg_standard_options + ;; + (with-lock) + _arguments \ + '(-)2:archives:__borg_archive'\ + $borg_standard_options + #'3:command:_command_names -e'\ + #'4:arguments:_normal' + #TODO Debug this, getting "_tags:comptags:36: nesting level too deep" error + ;; + (benchmark) + _arguments \ + '2:type:(crud)'\ + '3:repo:_files'\ + '4:path:_files'\ + $borg_standard_options + ;; + *) + commands=( + 'serve:start repository server process' + 'init:initialize empty repository' + 'check:verify repository' + 'key:manage repository key' + 'change-passphrase:change repository passphrase' + 'create:create backup' + 'extract:extract archive contents' + 'export-tar:create tarball from archive' + 'diff:find differences in archive contents' + 'rename:rename archive' + 'delete:delete archive' + 'list:list archive or repository contents' + 'mount:mount repository' + 'umount:umount repository' + 'info:show repository or archive information' + 'break-lock:break repository and cache locks' + 'prune:prune archives' + 'upgrade:upgrade repository format' + 'with-lock:run user command with lock held' + 'benchmark:benchmark command' + ) + + _describe 'values' commands + _arguments $borg_standard_options + + ;; + esac +} + +__borg_archive() { + local -a items + if (($+BORG_REPO)); then + items=("${(@f)$(borg list $cpath --short 2>/dev/null | sed "s#^#::#")}") + else + local cpath + cpath=$words[-1] + cpath=${cpath%::*} + items=("${(@f)$(borg list $cpath --short 2>/dev/null | sed "s#^#${cpath}::#")}") + fi + if [[ $items[1] == "" ]]; then + _files -/ + else + _wanted archives expl 'archive' compadd $items + fi +}