|
@@ -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
|
|
|
+}
|