function __fish_obnam_nosubcommand
    if __fish_seen_subcommand_from add-key backup client-keys clients diff dump-repo force-lock forget fsck \
            generations genids help help-all kdirstat list-errors list-formats list-keys list-toplevels \
            ls mount nagios-last-backup-age remove-client remove-key restore verify
        return 1
    end
    return 0
end

complete -c obnam --no-files --condition __fish_obnam_nosubcommand -a add-key -d 'Add a key to the repository'
complete -c obnam --no-files --condition __fish_obnam_nosubcommand -a backup -d 'Backup data to repository'
complete -c obnam --no-files --condition __fish_obnam_nosubcommand -a client-keys -d 'List clients and their keys in the repository'
complete -c obnam --no-files --condition __fish_obnam_nosubcommand -a clients -d 'List clients using the repository'
complete -c obnam --no-files --condition __fish_obnam_nosubcommand -a diff -d 'Show difference between two generations'
complete -c obnam --no-files --condition __fish_obnam_nosubcommand -a dump-repo -d 'Dump (some) data structures from a repository'
complete -c obnam --no-files --condition __fish_obnam_nosubcommand -a force-lock -d 'Force a locked repository to be open'
complete -c obnam --no-files --condition __fish_obnam_nosubcommand -a forget -d 'Forget (remove) specified backup generations'
complete -c obnam --no-files --condition __fish_obnam_nosubcommand -a fsck -d 'Verify internal consistency of backup repository'
complete -c obnam --no-files --condition __fish_obnam_nosubcommand -a generations -d 'List backup generations for client'
complete -c obnam --no-files --condition __fish_obnam_nosubcommand -a genids -d 'List generation ids for client'
complete -c obnam --no-files --condition __fish_obnam_nosubcommand -a help -d 'Print help'
complete -c obnam --no-files --condition __fish_obnam_nosubcommand -a help-all -d 'Print help, including hidden subcommands'
complete -c obnam --no-files --condition __fish_obnam_nosubcommand -a kdirstat -d 'List contents of a generation in kdirstat cache format'
complete -c obnam --no-files --condition __fish_obnam_nosubcommand -a list-errors -d 'List error codes and explanations'
complete -c obnam --no-files --condition __fish_obnam_nosubcommand -a list-formats -d 'List available repository formats'
complete -c obnam --no-files --condition __fish_obnam_nosubcommand -a list-keys -d 'List keys and repository toplevels they are used in'
complete -c obnam --no-files --condition __fish_obnam_nosubcommand -a list-toplevels -d 'List repository toplevel directories and their keys'
complete -c obnam --no-files --condition __fish_obnam_nosubcommand -a ls -d 'List contents of a generation'
complete -c obnam --no-files --condition __fish_obnam_nosubcommand -a mount -d 'Mount a backup repository as a FUSE filesystem'
complete -c obnam --no-files --condition __fish_obnam_nosubcommand -a nagios-last-backup-age -d 'Check if the most recent generation is recent enough'
complete -c obnam --no-files --condition __fish_obnam_nosubcommand -a remove-client -d 'Remove client and its key from repository'
complete -c obnam --no-files --condition __fish_obnam_nosubcommand -a remove-key -d 'Remove a key from the repository'
complete -c obnam --no-files --condition __fish_obnam_nosubcommand -a restore -d 'Restore some or all files from a generation'
complete -c obnam --no-files --condition __fish_obnam_nosubcommand -a verify -d 'Verify that live data and backed up data match'

complete -c obnam --no-files -l always-restore-setuid -d 'Restore setuid/setgid bits in restored files'
complete -c obnam --no-files -l no-always-restore-setuid -d 'Do not restore setuid/setgid bits in restored files'
complete -c obnam --no-files -l checksum-algorithm -a 'sha512 sha224 sha256 sha384' -d 'Use CHECKSUM algorithm'
complete -c obnam --no-files -l client-name -a '$hostname' -d 'Name of client'
complete -c obnam --no-files -l compress-with -a 'none deflate' -d 'Compress repository with'
complete -c obnam --no-files -l critical-age -d 'For --nagios-last-backup-age: maximum age'
complete -c obnam --no-files -l dump-repo-file-metadata -d 'Dump metadata about files'
complete -c obnam --no-files -l no-dump-repo-file-metadata -d 'Do not dump metadata about files'
complete -c obnam --no-files -l generate-manpage -d 'Generate man page'
complete -c obnam --no-files -l generation -d 'Which generation to restore'
complete -c obnam --no-files -s h -l help -d 'Show this help message and exit'
complete -c obnam --no-files -l keep -d 'Policy for what generations to keep when forgetting.'
complete -c obnam --no-files -l lock-timeout -d 'Wait TIMEOUT seconds for an existing lock'
complete -c obnam -l output -d 'Write output to FILE instead of STDOUT'
complete -c obnam --no-files -l pretend -l dry-run -l no-act -d 'Do not actually change anything'
complete -c obnam --no-files -l no-pretend -l no-dry-run -l no-no-act -d 'Actually commit changes'
complete -c obnam --no-files -l quiet -d 'Show only errors, no progress updates'
complete -c obnam --no-files -l no-quiet -d 'Show errors and progress updates'
complete -c obnam -s r -l repository -d 'Name of backup repository'
complete -c obnam --no-files -l repository-format -a '6 green-albatross-20160813' -d 'Use FORMAT for new repositories'
complete -c obnam -l to -d 'Where to restore / mount to'
complete -c obnam --no-files -l verbose -d 'Be more verbose'
complete -c obnam --no-files -l no-verbose -d 'Do not be verbose'
complete -c obnam --no-files -l verify-randomly -d 'Verify N files randomly from the backup'
complete -c obnam --no-files -l version -d 'Show version number and exit'
complete -c obnam -l warn-age -d 'For nagios-last-backup-age: maximum age'

# Backing up
complete -c obnam --no-files -l checkpoint -d 'Make a checkpoint after a given SIZE'
complete -c obnam --no-files -l deduplicate -a 'fatalist never verify' -d 'Deduplicate mode'
complete -c obnam -l exclude -d 'REGEXP for pathnames to exclude'
complete -c obnam --no-files -l exclude-caches -d 'Exclude directories tagged as cache'
complete -c obnam --no-files -l no-exclude-caches -d 'Include directories tagged as cache'
complete -c obnam -l exclude-from -d 'Read exclude patterns from FILE'
complete -c obnam --no-files -l include -d 'REGEXP for pathnames to include, even if matches --exclude'
complete -c obnam --no-files -l leave-checkpoints -d 'Leave checkpoint generations at the end of backup'
complete -c obnam --no-files -l no-leave-checkpoints -d 'Omit checkpoint generations at the end of backup'
complete -c obnam --no-files -l one-file-system -d 'Do not follow mount points'
complete -c obnam --no-files -l no-one-file-system -d 'Follow mount points'
complete -c obnam -l root -d 'What to backup'
complete -c obnam --no-files -l small-files-in-btree -d 'Put small files directly into the B-tree'
complete -c obnam --no-files -l no-small-files-in-btree -d 'No not put small files into the B-tree'

# Configuration files and settings
complete -c obnam -l config -d 'Add FILE to config files'
complete -c obnam --no-files -l dump-config -d 'Write out the current configuration'
complete -c obnam --no-files -l dump-setting-names -d 'Write out setting names'
complete -c obnam --no-files -l help-all -d 'Show all options'
complete -c obnam --no-files -l list-config-files -d 'List config files'
complete -c obnam --no-files -l no-default-configs -d 'Clear list of configuration files to read'

# Development of Obnam itself
complete -c obnam --no-files -l crash-limit -d 'Artificially crash the program after COUNTER files'
complete -c obnam --no-files -l pretend-time -d 'Pretend it is TIMESTAMP'
complete -c obnam --no-files -l testing-fail-matching -d 'Simulate failures for files that match REGEXP'
complete -c obnam -l trace -d 'FILENAME pattern for trace debugging'

# Encryption
complete -c obnam --no-files -l encrypt-with -d 'PGP key with which to encrypt'
complete -c obnam -l gnupghome -d 'Home directory for GPG'
complete -c obnam --no-files -l key-details -d 'Show additional user IDs'
complete -c obnam --no-files -l no-key-details -d 'Do not show additional user IDs'
complete -c obnam --no-files -l keyid -d 'PGP key id'
complete -c obnam --no-files -l symmetric-key-bits -d 'Size of symmetric key'
complete -c obnam --no-files -l weak-random -d 'Use /dev/urandom instead of /dev/random'
complete -c obnam --no-files -l no-weak-random -d 'Use default /dev/random'

# Integrity checking (fsck)
complete -c obnam --no-files -l fsck-fix -d 'fsck should try to fix problems'
complete -c obnam --no-files -l no-fsck-fix -d 'fsck should not try to fix problems'
complete -c obnam --no-files -l fsck-ignore-chunks -d 'Ignore chunks when checking integrity'
complete -c obnam --no-files -l no-fsck-ignore-chunks -d 'Check chunks when checking integrity'
complete -c obnam --no-files -l fsck-ignore-client -d 'Do not check data for client NAME'
complete -c obnam --no-files -l fsck-last-generation-only -d 'Check only the last generation'
complete -c obnam --no-files -l no-fsck-last-generation-only -d 'Check all generations'
complete -c obnam --no-files -l fsck-rm-unused -d 'fsck should remove unused chunks'
complete -c obnam --no-files -l no-fsck-rm-unused -d 'fsck should remove unused chunks'
complete -c obnam --no-files -l fsck-skip-checksums -d 'Do not check checksums of files'
complete -c obnam --no-files -l no-fsck-skip-checksums -d 'Check checksums of files'
complete -c obnam --no-files -l fsck-skip-dirs -d 'Do not check directories'
complete -c obnam --no-files -l no-fsck-skip-dirs -d 'Check directories'
complete -c obnam --no-files -l fsck-skip-files -d 'Do not check files'
complete -c obnam --no-files -l no-fsck-skip-files -d 'Check files'
complete -c obnam --no-files -l fsck-skip-generations -d 'Do not check any generations'
complete -c obnam --no-files -l no-fsck-skip-generations -d 'Check all generations'
complete -c obnam --no-files -l fsck-skip-per-client-b-trees -d 'Do not check per-client B-trees'
complete -c obnam --no-files -l no-fsck-skip-per-client-b-trees -d 'Check per-client B-trees'
complete -c obnam --no-files -l fsck-skip-shared-b-trees -d 'Do not check shared B-trees'
complete -c obnam --no-files -l no-fsck-skip-shared-b-trees -d 'Check shared B-trees'

# Logging
complete -c obnam -l log -a syslog -d 'Write log to FILE or syslog'
complete -c obnam --no-files -l log-keep -d 'Keep last N logs (10)'
complete -c obnam --no-files -l log-level -a 'debug info warning error critical fatal' -d 'Log at LEVEL'
complete -c obnam --no-files -l log-max -d 'Rotate logs larger than SIZE'
complete -c obnam --no-files -l log-mode -d 'Set permissions of logfiles to MODE'

# Mounting with FUSE
complete -c obnam --no-files -l fuse-opt -d 'Options to pass to FUSE'

# Performance
complete -c obnam --no-files -l dump-memory-profile -a 'none simple meliae heapy' -d 'Make memory profiling dumps using METHOD'
complete -c obnam --no-files -l memory-dump-interval -d 'Make memory profiling dumps at SECONDS'

# Performance tweaking
complete -c obnam --no-files -l chunk-size -d 'Size of chunks of file data'
complete -c obnam --no-files -l chunkids-per-group -d 'Encode NUM chunk ids per group'
complete -c obnam --no-files -l idpath-bits -d 'Chunk id level size'
complete -c obnam --no-files -l idpath-depth -d 'Depth of chunk id mapping'
complete -c obnam --no-files -l idpath-skip -d 'Chunk id mapping lowest bits skip'
complete -c obnam --no-files -l lru-size -d 'Size of LRU cache for B-tree nodes'
complete -c obnam --no-files -l node-size -d 'Size of B-tree nodes on disk'
complete -c obnam --no-files -l upload-queue-size -d 'Length of upload queue for B-tree nodes'

# Repository format green-albatross
complete -c obnam --no-files -l chunk-bag-size -d 'Approx max SIZE of bag combining chunk objects'
complete -c obnam --no-files -l chunk-cache-size -d 'In-memory cache SIZE for chunk objects'
complete -c obnam --no-files -l dir-bag-size -d 'Approx max SIZE of bags combining dir objects'
complete -c obnam --no-files -l dir-cache-size -d 'In-memory cache SIZE for dir objects'

# SSH/SFTP
complete -c obnam --no-files -l pure-paramiko -d 'Use only paramiko, no openssh'
complete -c obnam --no-files -l no-pure-paramiko -d 'Use openssh if available'
complete -c obnam -l ssh-command -d 'Executable to be used instead of "ssh"'
complete -c obnam --no-files -l ssh-host-keys-check -a 'no yes ask ssh-config' -d 'ssh host key check'
complete -c obnam -l ssh-key -d 'Use FILENAME as the ssh RSA key'
complete -c obnam -l ssh-known-hosts -a '\\~/.ssh/known_hosts' -d 'FILENAME of the known_hosts file'
