Переглянути джерело

Merge pull request #3269 from mrkmg/shell-completion-zsh-1.1.1

Added ZSH Shell Completion Script
TW 7 роки тому
батько
коміт
d1d5590444
1 змінених файлів з 391 додано та 0 видалено
  1. 391 0
      scripts/shell_completions/zsh/_borg

+ 391 - 0
scripts/shell_completions/zsh/_borg

@@ -0,0 +1,391 @@
+#compdef borg
+
+# -------
+#
+# For borg 1.1.1
+#
+# To Install:
+#
+# Copy this file to /usr/share/zsh/site-functions/
+#
+# -------
+# borgbackup ZSH completion
+# Kevin Gravier 2017 <kevin@mrkmg.com>
+# https://github.com/mrkmg/borgbackup-zsh-completion
+# 
+# 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
+}