993337be9f
Build and Push Docker Container / build-and-push (push) Successful in 1m36s
- 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.
109 lines
3.3 KiB
Python
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}')
|