lkjdsalkjdsalkjdsalk
This commit is contained in:
@@ -1,65 +1,105 @@
|
|||||||
zeditor-remote() {
|
zeditor-remote() {
|
||||||
if printf '%s\n' "$(gum --version)" "gum version 0.15.1" | sort -C -V; then
|
ensure() {
|
||||||
local maybe_spin="" # doesn't forward stdin
|
local error
|
||||||
else
|
for name in "$@"; do
|
||||||
local maybe_spin="gum spin --show-output --show-error --"
|
if ! command -v "${name}" >/dev/null; then
|
||||||
fi
|
printf >&2 '%s\n' "ERROR: '$name' not found in PATH"
|
||||||
# echo maybe_spin="$maybe_spin"
|
error=1
|
||||||
|
fi
|
||||||
local host=$(
|
done
|
||||||
{
|
if [[ -n "$error" ]]; then
|
||||||
echo localhost
|
|
||||||
tailscale status --json | jq .Peer[].HostName -r | grep -v '^localhost$' | sort -u
|
|
||||||
} | fzf --multi --reverse --bind 'ctrl-a:toggle-all' --height=25 --cycle \
|
|
||||||
| sed -e 's/%/%%/g'
|
|
||||||
)
|
|
||||||
if [[ -z "$host" ]]; then
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
local repos=$(
|
|
||||||
worker() {
|
|
||||||
local host="$1"
|
|
||||||
fdargs=(repos/ --hidden --max-depth 5)
|
|
||||||
sshargs=(-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null)
|
|
||||||
if [[ "$host" = localhost ]]; then
|
|
||||||
cd "$HOME"
|
|
||||||
fd "^\.git$" "${fdargs[@]}" -x printf '~/%q\n' "{//}"
|
|
||||||
else
|
|
||||||
timeout 5 ssh "${sshargs[@]}" 2>/dev/null "$host" \
|
|
||||||
fd "^\.git$" "${fdargs[@]}" -x printf "'ssh://$host/~/%q\n'" "'{//}'"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
$maybe_spin xe <<<"$host" -j"$(wc -l <<<"$host")" -s "$(declare -f worker); worker \"\$@\"" 2>/dev/null ||:
|
|
||||||
)
|
|
||||||
if [[ -z "${repos}" ]]; then
|
|
||||||
echo >&2 "no repos found!"
|
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
}
|
||||||
|
ensure xe fd fzf gum || return 1
|
||||||
|
|
||||||
local choice=$(sort <<<"$repos" | fzf --reverse --height=25)
|
local spin=""
|
||||||
if [[ -z "${choice}" ]]; then
|
# doesn't forward stdin
|
||||||
return
|
if command -v gum >/dev/null; then
|
||||||
fi
|
if printf '%s\n' "$(gum --version)" "gum version 0.15.1" | sort -C -V; then
|
||||||
|
: # older version don't forward stdin
|
||||||
local zed_cmd="zeditor ${choice}"
|
|
||||||
local ssh_cd_cmd=$(
|
|
||||||
rg <<<"$choice" '^ssh://([^/]*)/(~/.*)$' -r 'ssh -t "$1" "cd $2; $$SHELL -l"' ||:
|
|
||||||
)
|
|
||||||
[[ -z "$zed_cmd" ]] || echo "$zed_cmd"
|
|
||||||
[[ -z "$ssh_cd_cmd" ]] || echo "$ssh_cd_cmd"
|
|
||||||
|
|
||||||
if [[ -n "$ssh_cd_cmd" ]] && gum confirm "SSH in there?" --default=yes; then
|
|
||||||
# history -s "${zed_cmd}"
|
|
||||||
eval ${zed_cmd}
|
|
||||||
|
|
||||||
# TODO: find a way to not push the rest of the unpushed history
|
|
||||||
history -s "${ssh_cd_cmd}"
|
|
||||||
history -a
|
|
||||||
eval ${ssh_cd_cmd}
|
|
||||||
else
|
else
|
||||||
# history -s "${zed_cmd}"
|
spin="gum spin --show-output --show-error --"
|
||||||
eval ${zed_cmd}
|
|
||||||
cd "${choice}"
|
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
local host=$(
|
||||||
|
{
|
||||||
|
printf '%s\n' localhost
|
||||||
|
{
|
||||||
|
# ask tailscale
|
||||||
|
if command -v tailscale >/dev/null; then
|
||||||
|
tailscale status --json | jq .Peer[].HostName -r;
|
||||||
|
fi
|
||||||
|
# search .ssh/known_hosts, strip DNS search domains to deduplicate
|
||||||
|
if [[ -r /etc/resolv.conf && -r "$HOME"/.ssh/known_hosts ]]; then
|
||||||
|
local -a hosts
|
||||||
|
readarray -d $'\n' -t hosts < <(
|
||||||
|
cut <"$HOME"/.ssh/known_hosts -d' ' -f1 | sort -u \
|
||||||
|
| grep -E "(\\.$(hostname --domain)|^[^.]*)$"
|
||||||
|
)
|
||||||
|
local -a domains
|
||||||
|
readarray -d ' ' -t domains < <(
|
||||||
|
grep </etc/resolv.conf '^search ' | cut -d' ' -f2-
|
||||||
|
)
|
||||||
|
printf '%s\n' "${hosts[@]}" | sed -E "s/\\.($(IFS='|'; printf "%s" "${domains[*]}"))\$//g"
|
||||||
|
fi
|
||||||
|
} | grep -v '^localhost$' | sort -u
|
||||||
|
} | fzf --multi --reverse --bind 'ctrl-a:toggle-all' --height=25 --cycle \
|
||||||
|
| sed -e 's/%/%%/g'
|
||||||
|
)
|
||||||
|
if [[ -z "$host" ]]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local repos=$(
|
||||||
|
worker() {
|
||||||
|
local host="$1"
|
||||||
|
# TODO: this assumes remote hosts only code in 'repos/'
|
||||||
|
# TODO: this assumes remote hosts has 'fd', use 'find' instead?
|
||||||
|
fdargs=(--hidden --max-depth 5)
|
||||||
|
# accept all, persist nothing, to scan hosts we've yet to trust,
|
||||||
|
# zed will still complain however
|
||||||
|
sshargs=(-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null)
|
||||||
|
if [[ "$host" = localhost ]]; then
|
||||||
|
cd "$HOME"
|
||||||
|
fd "^\.git$" repos/ "${fdargs[@]}" -x printf '~/%q\n' "{//}"
|
||||||
|
else
|
||||||
|
# TODO: report timeouts?
|
||||||
|
timeout 5 ssh "${sshargs[@]}" 2>/dev/null "$host" \
|
||||||
|
fd "^\.git$" repos/ "${fdargs[@]}" -x printf "'ssh://%s/~/%q\n'" "'$host'" "'{//}'"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
$spin xe <<<"$host" -j"$(wc -l <<<"$host")" -s "$(declare -f worker); worker \"\$@\"" 2>/dev/null ||:
|
||||||
|
)
|
||||||
|
if [[ -z "${repos}" ]]; then
|
||||||
|
printf >&2 '%s\n' "ERROR: no repos found!"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local choice=$(sort <<<"$repos" | fzf --reverse --cycle --height=25)
|
||||||
|
if [[ -z "${choice}" ]]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
local zed_cmd="zeditor ${choice}"
|
||||||
|
local ssh_cd_cmd=$(
|
||||||
|
rg <<<"$choice" '^ssh://([^/]*)/(~/.*)$' -r 'ssh -t "$1" "cd $2; $$SHELL -l"' ||:
|
||||||
|
)
|
||||||
|
|
||||||
|
if [[ -n "$ssh_cd_cmd" ]] && gum confirm "SSH in there now?" --default=yes; then
|
||||||
|
# history -s "${zed_cmd}"
|
||||||
|
eval ${zed_cmd}
|
||||||
|
|
||||||
|
# TODO: find a way to not push the rest of the unpushed history
|
||||||
|
history -s "${ssh_cd_cmd}"
|
||||||
|
history -a
|
||||||
|
printf >&2 "%s\n" "+ ${ssh_cd_cmd}"
|
||||||
|
eval ${ssh_cd_cmd}
|
||||||
|
else
|
||||||
|
# history -s "${zed_cmd}"
|
||||||
|
eval ${zed_cmd}
|
||||||
|
printf >&2 "%s\n" "+$(printf " %q" cd "${choice}")"
|
||||||
|
eval cd "${choice}" # 'eval' to expand the tilde
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user