Files
simple-nanoshare/cli/nanoshare_client/completion.py
T
daniel156161 993337be9f
Build and Push Docker Container / build-and-push (push) Successful in 1m36s
feat(cli): sync folders with remote paths
- Store synced folder locations in file_path instead of embedding them in file names.
- Add ignore rules from .nanoshareignore and repeatable sync --ignore flags.
- Adopt existing remote files only after SHA-256 verification.
- Move adopted remotes with metadata updates instead of uploading duplicates.
- Bump NanoShare to 1.23.0 and the standalone CLI to 0.2.0.
2026-07-27 20:53:00 +02:00

109 lines
3.3 KiB
Python

from __future__ import annotations
_ZSH = r'''# nanoshare zsh completion -- add to ~/.zshrc: eval "$(nanoshare completion zsh)"
_nanoshare_files() {
local id path name size label
while IFS=$'\t' read -r id path name size; do
label="${path:+$path/}$name"
[[ -n $id ]] && printf '%s:%s\n' "$id" "$label"
done < <(nanoshare list --format tsv 2>/dev/null)
}
_nanoshare() {
local -a commands common_opts login_opts sync_opts watch_opts download_opts
commands=(login upload list download sync watch completion)
common_opts=(--config --url --token --refresh-token --token-url --source --timeout --node)
login_opts=(--config --node --source --scope --callback-host --callback-port --login-timeout --timeout --no-browser)
sync_opts=($common_opts --note --expires --delete --ignore)
watch_opts=($sync_opts --interval)
download_opts=($common_opts --output -o)
if (( CURRENT == 2 )); then
compadd -- $commands
return
fi
case ${words[2]} in
login)
compadd -- $login_opts
;;
upload)
compadd -- $common_opts --name --note --expires
_files
;;
list)
compadd -- $common_opts --format
;;
download)
if (( CURRENT == 3 )); then
local -a remote_files
remote_files=("${(@f)$(_nanoshare_files)}")
_describe 'remote file' remote_files
else
compadd -- $download_opts
_files
fi
;;
sync|watch)
compadd -- ${(P)${:-${words[2]}_opts}}
_files -/
;;
completion)
(( CURRENT == 3 )) && compadd -- zsh bash
;;
esac
}
compdef _nanoshare nanoshare
'''
_BASH = r'''# nanoshare bash completion -- add to ~/.bashrc: eval "$(nanoshare completion bash)"
_nanoshare_files() {
nanoshare list --format tsv 2>/dev/null
}
_nanoshare() {
local cur="${COMP_WORDS[COMP_CWORD]}" cmd="${COMP_WORDS[1]}"
local commands="login upload list download sync watch completion"
local common_opts="--config --url --token --refresh-token --token-url --source --timeout --node"
local login_opts="--config --node --source --scope --callback-host --callback-port --login-timeout --timeout --no-browser"
local sync_opts="$common_opts --note --expires --delete --ignore"
local watch_opts="$sync_opts --interval"
local download_opts="$common_opts --output -o"
if [ "$COMP_CWORD" -eq 1 ]; then
COMPREPLY=( $(compgen -W "$commands" -- "$cur") )
return
fi
case "$cmd" in
login)
COMPREPLY=( $(compgen -W "$login_opts" -- "$cur") ) ;;
upload)
COMPREPLY=( $(compgen -W "$common_opts --name --note --expires" -- "$cur") ) ;;
list)
COMPREPLY=( $(compgen -W "$common_opts --format" -- "$cur") ) ;;
download)
if [ "$COMP_CWORD" -eq 2 ]; then
COMPREPLY=( $(compgen -W "$(_nanoshare_files | cut -f1)" -- "$cur") )
else
COMPREPLY=( $(compgen -W "$download_opts" -- "$cur") )
fi ;;
sync)
COMPREPLY=( $(compgen -W "$sync_opts" -- "$cur") ) ;;
watch)
COMPREPLY=( $(compgen -W "$watch_opts" -- "$cur") ) ;;
completion)
[ "$COMP_CWORD" -eq 2 ] && COMPREPLY=( $(compgen -W "zsh bash" -- "$cur") ) ;;
esac
}
complete -F _nanoshare nanoshare
'''
def script(shell: str) -> str:
if shell == 'zsh':
return _ZSH
if shell == 'bash':
return _BASH
raise ValueError(f'unsupported shell: {shell}')