1
0
Fork 0
mirror of https://github.com/borgbackup/borg.git synced 2024-12-11 02:27:57 +00:00

shell completions: adapt zsh for borg 2.0.0b13

I am not familiar with zsh completions, so I did only the easy stuff.

A lot of the more complex stuff is likely still broken, PR's welcome!
This commit is contained in:
Thomas Waldmann 2024-11-05 09:20:23 +01:00
parent d1d438ba57
commit fdc882230e
No known key found for this signature in database
GPG key ID: 243ACFA951F78E01

View file

@ -1,13 +1,12 @@
#compdef borg borgfs -P -value-,BORG_*,-default-
# Zsh completion for Borg Backup 1.2.0a9 (2020-09-27).
# Zsh completion for Borg Backup 2.0.0b13 (2024-11-04).
#
# Recommended _borg specific settings:
#
# zstyle -e ':completion:*:*:borg-*:argument-rest:*' tag-order \
# '[[ $words[CURRENT] == -* ]] && reply=( "! archives archive-files" "-" )'
# zstyle ':completion:*:*:(borg|-value-,BORG_)*' sort false
# zstyle ':completion:*:*:borg-config:argument-2:keys' list-grouped false
# zstyle ':completion:*:*:borg-*:*' gain-privileges true
# zstyle ':completion:*' fake-parameters 'BORG_REPO:scalar'
#
@ -23,41 +22,57 @@
# path-style-selector
# Style selector used to select a path (when Borg would use either `pp` or `pf`).
# Default: `fm`.
# repository-suffix
# This boolean style controls whether to add the `::` auto-removable suffix to a repository.
# Default: `true`.
(( $+functions[_borg_commands] )) ||
_borg_commands() {
local -a commands_=(
'analyze:analyze archives'
'benchmark:benchmark command'
'break-lock:break the repository lock'
'check:check repository consistency'
'compact:compact segment files in the repository'
'config:get, set, and delete values in a repository or cache config file'
'break-lock:break the repository and cache locks'
'check:verify repository'
'compact:compact repository'
'create:create new archive'
'debug:debugging command (not intended for normal use)'
'delete:delete an existing repository or archives'
'diff:diff contents of two archives'
'delete:delete archives'
'diff:find differences in archive contents'
'export-tar:export archive contents as a tarball'
'extract:extract archive contents'
'help:extra help'
'info:show repository or archive information'
'init:initialize an empty repository'
'import-tar:create an archive from a tarball'
'info:show archive information'
'key:manage repository key'
'list:list archive or repository contents'
'list:list archive contents'
'mount:mount archive or an entire repository as a FUSE filesystem'
'prune:prune repository archives according to specified rules'
'prune:prune archives according to specified rules'
'recreate:re-create archives'
'rename:rename an existing archive'
'repo-compress:repository (re-)compression'
'repo-create:create an empty repository'
'repo-delete:delete a repository'
'repo-info:show repository information'
'repo-list:list repository contents'
'repo-space:manage reserved space in a repository'
'serve:start in server mode'
'tag:tag archives'
'transfer:transfer of archives from another repository'
'umount:un-mount the FUSE filesystem'
'upgrade:upgrade a repository from a previous version'
'version:display borg client version / borg server version'
'with-lock:run a user specified command with the repository lock held'
)
_describe -t commands 'borg commands' commands_
}
(( $+functions[_borg-analyze] )) ||
_borg-analyze() {
local -a common_options common_archive_filters_options
__borg_setup_common_options
__borg_setup_common_archive_filters_options
_arguments -s -w -S : \
$common_archive_filters_options \
$common_options
}
(( $+functions[_borg-benchmark] )) ||
_borg-benchmark() {
local -a common_options
@ -65,8 +80,7 @@ _borg-benchmark() {
_arguments -s -w -S : \
$common_options \
':type:(crud)' \
': :_borg_repository' \
':type:(crud cpu)' \
':PATH:_files'
}
@ -76,8 +90,7 @@ _borg-break-lock() {
__borg_setup_common_options
_arguments -s -w -S : \
$common_options \
':: :_borg_repository'
$common_options
}
(( $+functions[_borg-check] )) ||
@ -91,11 +104,9 @@ _borg-check() {
'--archives-only[only perform archives checks]' \
'(--repository-only)--verify-data[perform cryptographic archive data integrity verification]' \
'--repair[attempt to repair any inconsistencies found]' \
'--save-space[work slower, but using less space]' \
'--max-duration=[partial repo check for max. SECONDS]: : _borg_guard_unsigned_number "SECONDS"' \
$common_archive_filters_options \
$common_options \
'::REPOSITORY_OR_ARCHIVE: _borg_repository_or_archive'
$common_options
}
(( $+functions[_borg-compact] )) ||
@ -104,25 +115,7 @@ _borg-compact() {
__borg_setup_common_options
_arguments -s -w -S : \
$common_options \
'--cleanup-commits[cleanup commit-only 17-byte segment files]' \
'--threshold=[set minimum threshold for saved space in PERCENT (default: 10)]: : _borg_guard_unsigned_number "PERCENT (default\: 10)"' \
':: :_borg_repository'
}
(( $+functions[_borg-config] )) ||
_borg-config() {
local -a common_options
__borg_setup_common_options
_arguments -s -w -S : \
'(-c --cache)'{-c,--cache}'[get and set values from the repo cache]' \
'(-d --delete)'{-d,--delete}'[delete the key from the config]' \
'(-l --list)'{-l,--list}'[list the configuration of the repo]' \
$common_options \
': :_borg_repository' \
': : _borg_config $line[1]' \
'::VALUE'
$common_options
}
(( $+functions[_borg-create] )) ||
@ -140,27 +133,24 @@ _borg-create() {
_arguments -C -s -w -S : \
'*'{-e,--exclude}'=[exclude paths matching PATTERN]: : _borg_style_selector_or_archive_files -f -e "$line[1]" fm "${(@)line[2,-1]}"' \
'*--pattern=[experimental: include/exclude paths matching PATTERN]: : _borg_style_selector_or_archive_files -p -f -e "$line[1]" sh "${(@)line[2,-1]}"' \
'*--pattern=[include/exclude paths matching PATTERN]: : _borg_style_selector_or_archive_files -p -f -e "$line[1]" sh "${(@)line[2,-1]}"' \
$common_create_options \
'(-s --stats)--json[Output stats as JSON. Implies --stats.]' \
'--no-cache-sync[experimental: do not synchronize the cache. Implies not using the files cache.]' \
'--stdin-name=[use NAME in archive for stdin data (default: "stdin")]:NAME' \
'--content-from-command[interpret PATH as command and store its stdout]' \
'--exclude-nodump[exclude files flagged NODUMP]' \
'(-x --one-file-system)'{-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]' \
'--atime[do store atime into archive]' \
'--noctime[do not store ctime into archive]' \
'--nobirthtime[do not store birthtime (creation date) into archive]' \
'--nobsdflags[deprecated, use --noflags instead]' \
'--noacls[do not read and store ACLs into archive]' \
'--noxattrs[do not read and store xattrs into archive]' \
'--noflags[do not read and store flags (e.g. NODUMP, IMMUTABLE) into archive]' \
'--files-cache=[operate files cache in MODE. default: ctime,size,inode]:MODE:(ctime,size,inode mtime,size,inode ctime,size mtime,size rechunk,ctime rechunk,mtime size disabled)' \
'--read-special[open and read block and char device files as well as FIFOs as if they were regular files]' \
$common_options \
':ARCHIVE: _borg_repository_or_archive -a -p' \
':ARCHIVE: _borg_archive -a -p' \
$lastspec && ret=0
case $state in
@ -201,8 +191,6 @@ _borg-debug() {
'get-obj:get object from repository'
'put-obj:put object to repository'
'delete-obj:delete object from repository'
'refcount-obj:show refcount for object from repository'
'dump-hints:dump repository hints'
'convert-profile:convert Borg profile to Python profile'
)
_describe -t commands 'command' debug_commands && ret=0
@ -218,62 +206,44 @@ _borg-debug() {
(dump-archive-items)
_arguments -s -w -S : \
$common_options \
':ARCHIVE: _borg_repository_or_archive -a' && ret=0
':ARCHIVE: _borg_archive -a' && ret=0
;;
(dump-archive)
_arguments -s -w -S : \
$common_options \
':ARCHIVE: _borg_repository_or_archive -a' \
':ARCHIVE: _borg_archive -a' \
':PATH:_files' && ret=0
;;
(dump-manifest)
_arguments -s -w -S : \
$common_options \
': :_borg_repository' \
':PATH:_files' && ret=0
;;
(dump-repo-objs)
_arguments -s -w -S : \
$common_options \
': :_borg_repository' && ret=0
$common_options && ret=0
;;
(search-repo-objs)
_arguments -s -w -S : \
$common_options \
': :_borg_repository' \
':WANTED (hex or string):' && ret=0
;;
(get-obj)
_arguments -s -w -S : \
$common_options \
': :_borg_repository' \
':ID (hex object):' \
':PATH:_files' && ret=0
;;
(put-obj)
_arguments -s -w -S : \
$common_options \
': :_borg_repository' \
'*:PATH:_files' && ret=0
;;
(delete-obj)
_arguments -s -w -S : \
$common_options \
': :_borg_repository' \
'*:ID (hex object):' && ret=0
;;
(refcount-obj)
_arguments -s -w -S : \
$common_options \
': :_borg_repository' \
'*:ID (hex object):' && ret=0
;;
(dump-hints)
_arguments -s -w -S : \
$common_options \
': :_borg_repository' \
'*:PATH:_files' && ret=0
;;
(convert-profile)
_arguments -s -w -S : \
$common_options \
@ -301,13 +271,9 @@ _borg-delete() {
_arguments -s -w -S : \
$common_dry_run_stats_options \
'--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]' \
'--keep-security-info[keep the local security info when deleting a repository]' \
'--save-space[work slower, but using less space]' \
$common_archive_filters_options \
$common_options \
':REPOSITORY_OR_ARCHIVE: _borg_repository_or_archive' \
':ARCHIVE: _borg_archive' \
'*:ARCHIVE: _borg_archive "${line[1]%%::*}"'
}
@ -324,7 +290,7 @@ _borg-diff() {
'--json-lines[format output as JSON Lines]' \
$common_exclude_options \
$common_options \
':ARCHIVE1: _borg_repository_or_archive -a' \
':ARCHIVE1: _borg_archive -a' \
':ARCHIVE2: _borg_archive "${line[1]%%::*}"' \
'*: : _borg_style_selector_or_archive_files -e "$line[1]" pp'
}
@ -340,7 +306,7 @@ _borg-export-tar() {
'--list[output verbose list of items (files, dirs, ...)]' \
$common_exclude_extract_options \
$common_options \
':ARCHIVE: _borg_repository_or_archive -a' \
':ARCHIVE: _borg_archive -a' \
':FILE:_files' \
'*: : _borg_style_selector_or_archive_files -e "$line[1]" pp'
}
@ -355,7 +321,6 @@ _borg-extract() {
'--list[output verbose list of items (files, dirs, ...)]' \
'(-n --dry-run)'{-n,--dry-run}'[do not actually change any files]' \
'--numeric-owner[only obey numeric user and group identifiers]' \
'--nobsdflags[deprecated, use --noflags instead]' \
'--noacls[do not extract/set ACLs]' \
'--noxattrs[do not extract/set xattrs]' \
'--noflags[do not extract/set flags (e.g. NODUMP, IMMUTABLE)]' \
@ -363,7 +328,7 @@ _borg-extract() {
'--sparse[create holes in output sparse file from all-zero chunks]' \
$common_exclude_extract_options \
$common_options \
':ARCHIVE: _borg_repository_or_archive -a' \
':ARCHIVE: _borg_archive -a' \
'*: : _borg_style_selector_or_archive_files -e "$line[1]" pp'
}
@ -379,6 +344,22 @@ _borg-help() {
':: : _alternative "topics:TOPIC:(patterns placeholders compression)" ": :_borg_commands"'
}
(( $+functions[_borg-import-tar] )) ||
_borg-import-tar() {
local -a common_options common_exclude_extract_options
__borg_setup_common_options
__borg_setup_common_exclude_extract_options
_arguments -s -w -S : \
'--tar-filter[filter program to pipe data through]: :_cmdstring' \
'--list[output verbose list of items (files, dirs, ...)]' \
$common_exclude_extract_options \
$common_options \
':ARCHIVE: _borg_archive -a' \
':FILE:_files' \
'*: : _borg_style_selector_or_archive_files -e "$line[1]" pp'
}
(( $+functions[_borg-info] )) ||
_borg-info() {
local -a common_options common_archive_filters_options
@ -389,30 +370,7 @@ _borg-info() {
'--json[format output as JSON]' \
$common_archive_filters_options \
$common_options \
'::REPOSITORY_OR_ARCHIVE: _borg_repository_or_archive'
}
(( $+functions[_borg-init] )) ||
_borg-init() {
local -i ret=1
local -a common_options common_init_options
__borg_setup_common_options
__borg_setup_common_init_options
# special handling for the required optional argument
if (( ! ${words[(I)(-e|--encryption)(|=*)]} )); then
local desc='select encryption key mode'
local -a long=( "--encryption:$desc" ) short=( "-e:$desc" ) remove_chars=( -r '= \t\n\-' )
_describe -t required-options 'required option' long -S '=' $remove_chars -- short $remove_chars && ret=0
fi
_arguments -s -w -S : \
'(-e --encryption)'{-e,--encryption}'=[select encryption key mode (required)]:MODE:(none keyfile keyfile-blake2 repokey repokey-blake2 authenticated authenticated-blake2)' \
$common_init_options \
'--make-parent-dirs[create parent directories]' \
'::REPOSITORY:_directories' && ret=0
return ret
'::ARCHIVE: _borg_archive'
}
(( $+functions[_borg-key] )) ||
@ -431,10 +389,9 @@ _borg-key() {
case $state in
(command)
local -a key_commands=(
'change-passphrase:Change repository key file passphrase'
'export:Export the repository key for backup'
'import:Import the repository key from backup'
'migrate-to-repokey:Migrate passphrase -> repokey'
'change-passphrase:Change borg key passphrase'
'export:Export a backup of the borg key'
'import:Import a backup of the borg key'
)
_describe -t commands 'command' key_commands && ret=0
;;
@ -444,29 +401,21 @@ _borg-key() {
case $line[1] in
(change-passphrase)
_arguments -s -w -S : \
$common_options \
': :_borg_repository' && ret=0
$common_options
;;
(export)
_arguments -s -w -S : \
'--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]' \
$common_options \
': :_borg_repository' \
'::PATH:_files' && ret=0
;;
(import)
_arguments -s -w -S : \
'--paper[interactively import from a backup done with --paper]' \
$common_options \
': :_borg_repository' \
'::PATH:_files' && ret=0
;;
(migrate-to-repokey)
_arguments -s -w -S : \
$common_options \
':: :_borg_repository' && ret=0
;;
(*)
if ! _call_function ret _borg_key_$line[1]; then
_default && ret=0
@ -487,15 +436,13 @@ _borg-list() {
__borg_setup_common_archive_filters_options
_arguments -s -w -S : \
'--consider-checkpoints[show checkpoint archives in the repository contents list (default: hidden)]' \
'--short[only print file/directory names, nothing else]' \
{--format,--list-format}'=[specify format for file listing]:FORMAT: _borg_format_keys $line[1]' \
'--json[Only valid for listing repository contents. Format output as JSON.]' \
'--json-lines[Only valid for listing archive contents. Format output as JSON Lines.]' \
'--format=[specify format for file listing]: : _borg_format_keys $line[1]' \
'--json-lines[Format output as JSON Lines.]' \
$common_archive_filters_options \
$common_exclude_options \
$common_options \
':REPOSITORY_OR_ARCHIVE: _borg_repository_or_archive' \
':ARCHIVE: _borg_archive' \
'*: : _borg_style_selector_or_archive_files -e "$line[1]" pp'
}
@ -508,7 +455,6 @@ _borg-mount() {
_arguments -s -w -S : \
$* \
'--consider-checkpoints[show checkpoint archives in the repository contents list (default: hidden)]' \
'(-f --foreground)'{-f,--foreground}'[stay in foreground, do not daemonize]' \
'-o[mount options]: :_fuse_values "mount options"
"versions[merged, versioned view of the files in the archives]"
@ -517,16 +463,15 @@ _borg-mount() {
$common_archive_filters_options \
$common_exclude_extract_options \
$common_options \
':REPOSITORY_OR_ARCHIVE: _borg_repository_or_archive' \
':MOUNTPOINT:_directories' \
'*: : _borg_style_selector_or_archive_files "$line[1]" pp'
}
(( $+functions[_borg-prune] )) ||
_borg-prune() {
local -a common_options common_prefix_and_glob_archives_filter_options common_dry_run_stats_options
local -a common_options common_match_archives_filter_options common_dry_run_stats_options
__borg_setup_common_options
__borg_setup_common_prefix_and_glob_archives_filter_options
__borg_setup_common_match_archives_filter_options
__borg_setup_common_dry_run_stats_options
_arguments -s -w -S : \
@ -540,11 +485,11 @@ _borg-prune() {
'(-d --keep-daily)'{-d,--keep-daily}'[number of daily archives to keep]: : _borg_guard_unsigned_number "N"' \
'(-w --keep-weekly)'{-w,--keep-weekly}'[number of weekly archives to keep]: : _borg_guard_unsigned_number "N"' \
'(-m --keep-monthly)'{-m,--keep-monthly}'[number of monthly archives to keep]: : _borg_guard_unsigned_number "N"' \
'--keep-3monthly[number of 3monthly archives to keep]: : _borg_guard_unsigned_number "N"' \
'--keep-13weekly[number of 13weekly archives to keep]: : _borg_guard_unsigned_number "N"' \
'(-y --keep-yearly)'{-y,--keep-yearly}'[number of yearly archives to keep]: : _borg_guard_unsigned_number "N"' \
'--save-space[work slower, but using less space]' \
$common_prefix_and_glob_archives_filter_options \
$common_options \
':: :_borg_repository'
$common_match_archives_filter_options \
$common_options
}
(( $+functions[_borg-recreate] )) ||
@ -566,7 +511,7 @@ _borg-recreate() {
'--target=[create a new archive with the name ARCHIVE]:ARCHIVE: _borg_placeholder_or_archive "${line[1]%%\:\:*}"' \
'--recompress=[recompress data chunks according to "MODE" and "--compression"]:MODE:'"(($mods))" \
$common_options \
':REPOSITORY_OR_ARCHIVE: _borg_repository_or_archive' \
':ARCHIVE: _borg_archive' \
'*: : _borg_style_selector_or_archive_files -e "$line[1]" pp'
}
@ -577,22 +522,132 @@ _borg-rename() {
_arguments -s -w -S : \
$common_options \
':ARCHIVE: _borg_repository_or_archive -a' \
':ARCHIVE: _borg_archive -a' \
':NEWNAME'
}
(( $+functions[_borg-repo-compress] )) ||
_borg-repo-compress() {
local -a common_options common_dry_run_stats_options
__borg_setup_common_options
__borg_setup_common_dry_run_stats_options
_arguments -s -w -S : \
$common_dry_run_stats_options \
$common_options \
'(-C --compression)'{-C,--compression}'=[select compression algorithm]: :_borg_compression'
}
(( $+functions[_borg-repo-create] )) ||
_borg-repo-create() {
local -i ret=1
local -a common_options common_repo_options
__borg_setup_common_options
__borg_setup_common_repo_options
# special handling for the required optional argument
if (( ! ${words[(I)(-e|--encryption)(|=*)]} )); then
local desc='select encryption key mode'
local -a long=( "--encryption:$desc" ) short=( "-e:$desc" ) remove_chars=( -r '= \t\n\-' )
_describe -t required-options 'required option' long -S '=' $remove_chars -- short $remove_chars && ret=0
fi
_arguments -s -w -S : \
'(-e --encryption)'{-e,--encryption}'=[select encryption key mode (required)]:MODE:(none authenticated authenticated-blake2 keyfile-aes-ocb repokey-aes-ocb keyfile-chacha20-poly1305 repokey-chacha20-poly1305 keyfile-blake2-aes-ocb repokey-blake2-aes-ocb keyfile-blake2-chacha20-poly1305 repokey-blake2-chacha20-poly1305)' \
$common_repo_options \
'--make-parent-dirs[create parent directories]'
}
(( $+functions[_borg-repo-delete] )) ||
_borg-repo-delete() {
local -a common_options common_dry_run_stats_options
__borg_setup_common_options
__borg_setup_common_dry_run_stats_options
_arguments -s -w -S : \
$common_dry_run_stats_options \
'--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]' \
'--keep-security-info[keep the local security info when deleting a repository]' \
$common_options
}
(( $+functions[_borg-repo-info] )) ||
_borg-repo-info() {
local -a common_options
__borg_setup_common_options
_arguments -s -w -S : \
'--json[format output as JSON]' \
$common_options
}
(( $+functions[_borg-repo-list] )) ||
_borg-repo-list() {
local -a common_options common_archive_filters_options
__borg_setup_common_options
__borg_setup_common_archive_filters_options
_arguments -s -w -S : \
'--short[only print archive IDs]' \
'--format=[specify format for archive listing]: : _borg_format_keys $line[1]' \
'--json[Format output as JSON.]' \
$common_archive_filters_options \
$common_options
}
(( $+functions[_borg-repo-space] )) ||
_borg-repo-space() {
local -a common_options
__borg_setup_common_options
_arguments -s -w -S : \
$common_options \
'--reserve=[amount of space to reserve in repository]: :_borg_quota_suffixes' \
'--free[free all reserved space]'
}
(( $+functions[_borg-serve] )) ||
_borg-serve() {
local -a common_options common_init_options
local -a common_options common_repo_options
__borg_setup_common_options
__borg_setup_common_init_options
__borg_setup_common_repo_options
_arguments -s -w -S : \
$common_init_options \
$common_repo_options \
'*--restrict-to-path=[restrict repository access to PATH]:PATH:_files' \
'*--restrict-to-repository=[restrict repository access]: :_borg_repository'
}
(( $+functions[_borg-tag] )) ||
_borg-tag() {
local -a common_options common_archive_filters_options common_dry_run_stats_options
__borg_setup_common_options
__borg_setup_common_archive_filters_options
__borg_setup_common_dry_run_stats_options
_arguments -s -w -S : \
$common_dry_run_stats_options \
$common_archive_filters_options \
$common_options \
':ARCHIVE: _borg_archive' \
'*:ARCHIVE: _borg_archive "${line[1]%%::*}"'
}
(( $+functions[_borg-transfer] )) ||
_borg-transfer() {
local -a common_options common_archive_filters_options common_dry_run_stats_options
__borg_setup_common_options
__borg_setup_common_archive_filters_options
__borg_setup_common_dry_run_stats_options
_arguments -s -w -S : \
$common_dry_run_stats_options \
$common_archive_filters_options \
$common_options \
'(-C --compression)'{-C,--compression}'=[select compression algorithm]: :_borg_compression'
}
(( $+functions[_borg-umount] )) ||
_borg-umount() {
local -a common_options
@ -603,19 +658,13 @@ _borg-umount() {
':MOUNTPOINT:_umountable'
}
(( $+functions[_borg-upgrade] )) ||
_borg-upgrade() {
(( $+functions[_borg-version] )) ||
_borg-version() {
local -a common_options
__borg_setup_common_options
_arguments -s -w -S : \
'(-n --dry-run)'{-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)]' \
'--disable-tam[disable manifest authentication (in key and cache)]' \
$common_options \
':: :_borg_repository'
$common_options
}
(( $+functions[_borg-with-lock] )) ||
@ -628,7 +677,6 @@ _borg-with-lock() {
_arguments -s -w -C -S : \
$common_options \
'(-): :_borg_repository' \
'(-):COMMAND: _command_names -e' \
'(-)*:ARGS:->normal' && ret=0
@ -662,9 +710,9 @@ __borg_setup_common_options() {
'--remote-path=[set remote path to executable (default: "borg")]: :_cmdstring'
'--remote-ratelimit=[set remote network upload rate limit in kiByte/s (default: 0=unlimited)]: : _borg_guard_unsigned_number "RATE"'
'--remote-buffer=[set upload buffer size in MiB. (default: 0=no buffer)]: : _borg_guard_unsigned_number "UPLOAD_BUFFER"'
'--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]:FILE:_files'
'--rsh=[use COMMAND instead of ssh]: :_cmdstring'
'(-r --repo)'{-r,--repo}'=[repository]'
)
}
@ -673,8 +721,8 @@ __borg_setup_common_exclude_options() {
typeset -ga common_exclude_options=(
'*'{-e,--exclude}'=[exclude paths matching PATTERN]: : _borg_style_selector_or_archive_files "$line[1]" fm'
'*--exclude-from=[read exclude patterns from EXCLUDEFILE, one per line]:EXCLUDEFILE:_files'
'*--pattern=[experimental: include/exclude paths matching PATTERN]: : _borg_style_selector_or_archive_files -p "$line[1]" sh'
'*--patterns-from=[experimental: read include/exclude patterns from PATTERNFILE, one per line]:PATTERNFILE:_files'
'*--pattern=[include/exclude paths matching PATTERN]: : _borg_style_selector_or_archive_files -p "$line[1]" sh'
'*--patterns-from=[read include/exclude patterns from PATTERNFILE, one per line]:PATTERNFILE:_files'
)
}
@ -688,20 +736,19 @@ __borg_setup_common_exclude_extract_options() {
)
}
(( $+functions[__borg_setup_common_prefix_and_glob_archives_filter_options] )) ||
__borg_setup_common_prefix_and_glob_archives_filter_options() {
typeset -ga common_prefix_and_glob_archives_filter_options=(
'(-P --prefix -a --glob-archives)'{-P,--prefix}'=[only consider archive names starting with this prefix]:PREFIX: _borg_archive -n "${line[1]%%\:\:*}"'
'(-P --prefix)*'{-a,--glob-archives}'=[only consider archive names matching the glob]:GLOB: _borg_archive -n "${line[1]%%\:\:*}"'
(( $+functions[__borg_setup_common_match_archives_filter_options] )) ||
__borg_setup_common_match_archives_filter_options() {
typeset -ga common_match_archives_filter_options=(
'(-P --prefix)*'{-a,--match-archives}'=[only consider archive names matching the pattern]:PATTERN: _borg_archive -n "${line[1]%%\:\:*}"'
)
}
(( $+functions[__borg_setup_common_archive_filters_options] )) ||
__borg_setup_common_archive_filters_options() {
local -a common_prefix_and_glob_archives_filter_options
__borg_setup_common_prefix_and_glob_archives_filter_options
local -a common_match_archives_filter_options
__borg_setup_common_match_archives_filter_options
typeset -ga common_archive_filters_options=(
$common_prefix_and_glob_archives_filter_options
$common_match_archives_filter_options
'--sort-by=[Comma-separated list of sorting keys, default: timestamp]:KEYS:(timestamp name id)'
'(--last)--first=[consider first N archives after other filters were applied]:N: _borg_archive -n "${line[1]%%\:\:*}"'
'(--first)--last=[consider last N archives after other filters were applied]:N: _borg_archive -n "${line[1]%%\:\:*}"'
@ -732,17 +779,16 @@ __borg_setup_common_create_options() {
'--keep-exclude-tags[if tag objects are specified with --exclude-if-present, don'\''t omit the tag objects themselves]'
'--comment=[add a comment text to the archive]:COMMENT:_borg_placeholders'
'--timestamp=[manually specify the archive creation date/time]:TIMESTAMP:_borg_timestamp'
'(-c --checkpoint-interval)'{-c,--checkpoint-interval}'=[write checkpoint every SECONDS seconds (default: 1800)]: : _borg_guard_unsigned_number "SECONDS"'
'--chunker-params=[specify the chunker parameters]: :_borg_chunker_params_examples'
'(-C --compression)'{-C,--compression}'=[select compression algorithm]: :_borg_compression'
)
}
(( $+functions[__borg_setup_common_init_options] )) ||
__borg_setup_common_init_options() {
(( $+functions[__borg_setup_common_repo_options] )) ||
__borg_setup_common_repo_options() {
local -a common_options
__borg_setup_common_options
typeset -ga common_init_options=(
typeset -ga common_repo_options=(
$common_options
'--append-only[only allow appending to repository segment files]'
'--storage-quota=[override storage quota of the repository]: :_borg_quota_suffixes'
@ -888,59 +934,6 @@ _borg_remote_repositories() {
fi
}
# _borg_repository_or_archive [-a] [-p]
#
# -a archive is mandatory. The suffix `::` will be added to the repository if possible.
# -p complete placeholders
(( $+functions[_borg_repository_or_archive] )) ||
_borg_repository_or_archive() {
local -A opts
zparseopts -A opts -D -E a p
if compset -P 1 '*::'; then
local qrepo=$IPREFIX[1,-3]
local -i def_repo=0
[[ -z $qrepo && -n $BORG_REPO ]] && qrepo=${(q)BORG_REPO} && def_repo=1
if [[ -n $qrepo ]]; then
if (( ! def_repo )); then
case $compstate[quote] in
(\') qrepo=${(qq)qrepo} ;;
(\") qrepo=${(qqq)${(e)qrepo}} ;;
# NOTE: currently `(e)` don't have any effect, but maybe one day zsh will stop to change the quoting method
# of double quoted parameters
esac
fi
if (( $+opts[-p] )); then
_borg_placeholder_or_archive $qrepo
else
_borg_archive $qrepo
fi
else
_message "not a borg repository: ${(Q)qrepo}"
return 1
fi
else
local -a suf
if ! compset -S '::*'; then
if (( $+opts[-a] )) || zstyle -T ":completion:${curcontext}:repositories" repository-suffix; then
suf=( -S '::' )
fi
local oqrepo="$PREFIX$SUFFIX"
local qrepo=$oqrepo
[[ $compstate[quote] != (\'|\") ]] && qrepo=${(Q)qrepo}
if __borg_is_borg_repo $qrepo; then
qrepo=${oqrepo%%/}
[[ -z $SUFFIX ]] && PREFIX=${PREFIX%%/} || SUFFIX=${SUFFIX%%/}
compadd -S '::' -r ':/ \t\n\-' -Q -- $qrepo
return
fi
fi
_borg_repository "$suf[@]"
fi
}
# _borg_archive [-F] [-n] [qrepo]
#
# -F don't apply archive filter options on the command line
@ -971,7 +964,7 @@ _borg_archive() {
local -i reversed_order=1
if (( ! $+opts[-F] )); then
local -a archive_filter_options=( -P --prefix -a --glob-archives --first --last --sort-by ) tmp
local -a archive_filter_options=( -a --match-archives --first --last --sort-by ) tmp
local k
for k in $archive_filter_options; do
if [[ -n $opt_args[$k] ]]; then
@ -1040,7 +1033,7 @@ _borg_archive() {
descfmt='{archive:<36} {time} [{id}]'
fmt="{barchive}{NUL}$descfmt{NUL}"
_call_program -p archive-descriptions \
${(q)__borg_command:-borg} list --format=${(q)fmt} ${(q)sort_by} $archive_filters $qrepo 2>/dev/null |
${(q)__borg_command:-borg} repo-list --format=${(q)fmt} ${(q)sort_by} $archive_filters $qrepo 2>/dev/null |
while IFS= read -r -d $'\0' name && IFS= read -r -d $'\0' descr; do
__borg_archive_names[1,0]=( $name )
__borg_archive_descriptions[1,0]=( "$descr" )
@ -1060,7 +1053,7 @@ _borg_archive() {
typeset -gHa __borg_archive_names=()
local fmt='{barchive}{NUL}'
__borg_archive_names=( ${(@0aO)"$(_call_program -p archives \
${(q)__borg_command:-borg} list --format=${(q)fmt} ${(q)sort_by} $archive_filters $qrepo 2>/dev/null)"} )
${(q)__borg_command:-borg} repo-list --format=${(q)fmt} ${(q)sort_by} $archive_filters $qrepo 2>/dev/null)"} )
(( $pipestatus[1] )) && {
_message "couldn't list repository: ${(Q)qrepo}"
unset __borg_prev_{repo,mtime,order,sort_by}
@ -1091,17 +1084,6 @@ __borg_unset_archives_need_update() {
unset __borg_archives_need_update
}
(( $+functions[__borg_is_borg_repo] )) ||
__borg_is_borg_repo() {
local repo=$1
__borg_expand_path $repo repo
if [[ -d $repo && -d $repo/data ]]; then
local -a files=( $repo/(hints|index|integrity).<1->(#qN.) )
(( $#files >= 3 )) && return 0
fi
return 1
}
(( $+functions[__borg_expand_path] )) ||
__borg_expand_path() {
local _path=$1
@ -1464,37 +1446,6 @@ __borg_skip_pattern_matching() {
return 0
}
(( $+functions[_borg_config] )) ||
_borg_config() {
local qrepo=$1
shift
if (( ! $+__borg_config_sect )); then
comppostfuncs+=( __borg_unset_config )
typeset -gH __borg_config_sect=
typeset -gHa __borg_config_keys=()
local sect line
local -a match mbegin mend
_call_program -p keys ${(q)__borg_command:-borg} config --list $qrepo 2>/dev/null | {
IFS= read -r sect
sect=${${sect#\[}%\]}
__borg_config_sect=$sect
while IFS= read -r line && [[ $line == (#b)(*)\ =\ (*) ]]; do
__borg_config_keys+=( "${${match[1]//\\/\\\\}//:/\\:}:(current: $match[2])" )
done
}
fi
local -a alts=( 'keys:key: _describe -t keys "key" __borg_config_keys' )
compset -P "${__borg_config_sect}." || alts+=( 'sections:section:compadd -S "." $__borg_config_sect' )
_alternative $alts
}
(( $+functions[__borg_unset_config] )) ||
__borg_unset_config() {
unset __borg_config_sect __borg_config_keys
}
# A simple prefix-oriented completion function for compressors. Can be improved by supporting the suffix.
(( $+functions[_borg_compression] )) ||
_borg_compression() {
@ -1582,8 +1533,8 @@ _borg_statuschars() {
's[symlink]' \
'f[fifo]' \
'i[backup data was read from standard input (stdin)]' \
'-[dry run, item was not backed up]' \
'x[excluded, item was not backed up]' \
'-[excluded]' \
'+[included]' \
'?[missing status code]'
}