- install.sh ставит три прямые ссылки без Stow; чужие файлы не трогает и перечисляет все конфликты сразу; ~/.local и ~/.config могут быть ссылками; блок в ~/.bashrc дописывается, если нет маркера. - proxy_on читает вывод proxy-client env без временного файла. - Тесты Bash-функций работают через поддельный PROXY_CLIENT_BIN. - test_proxy_client_full.sh запускает только тесты proxy-client, прогон под Python 3.8 — если есть uv. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
94 lines
3.0 KiB
Bash
Executable File
94 lines
3.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# Ставит proxy-client в домашний каталог: три ссылки на этот каталог и
|
||
# (по умолчанию) блок в ~/.bashrc. Повторный запуск ничего не меняет.
|
||
set -euo pipefail
|
||
|
||
PACKAGE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)"
|
||
SETUP_SHELL=1
|
||
|
||
usage() {
|
||
cat <<'EOF'
|
||
Использование: ./install.sh [--no-shell-setup]
|
||
|
||
--no-shell-setup не изменять ~/.bashrc
|
||
EOF
|
||
}
|
||
|
||
while [ "$#" -gt 0 ]; do
|
||
case "$1" in
|
||
--no-shell-setup) SETUP_SHELL=0 ;;
|
||
-h|--help)
|
||
usage
|
||
exit 0
|
||
;;
|
||
*)
|
||
echo "Ошибка: неизвестный параметр: $1" >&2
|
||
usage >&2
|
||
exit 2
|
||
;;
|
||
esac
|
||
shift
|
||
done
|
||
|
||
# Машинные config и default.url сюда не входят: они живут только в $HOME.
|
||
LINKS=(
|
||
.local/bin/proxy-client
|
||
.config/proxy-client/shell.bash
|
||
.config/proxy-client/examples
|
||
)
|
||
|
||
# Существующая ссылка на этот же файл пакета — не конфликт, всё остальное
|
||
# (включая битую ссылку) не трогаем.
|
||
conflicts=()
|
||
for link in "${LINKS[@]}"; do
|
||
target="$HOME/$link"
|
||
if [ -e "$target" ] || [ -L "$target" ]; then
|
||
if [ "$(readlink -f "$target" 2>/dev/null)" != "$PACKAGE_DIR/$link" ]; then
|
||
conflicts+=("$target")
|
||
fi
|
||
fi
|
||
done
|
||
|
||
if [ "${#conflicts[@]}" -gt 0 ]; then
|
||
echo "Ошибка: пути уже заняты, установка не выполнена:" >&2
|
||
printf ' %s\n' "${conflicts[@]}" >&2
|
||
echo "Удалите или переименуйте их и повторите установку." >&2
|
||
exit 1
|
||
fi
|
||
|
||
mkdir -p "$HOME/.local/bin" "$HOME/.config/proxy-client"
|
||
for link in "${LINKS[@]}"; do
|
||
[ -e "$HOME/$link" ] || ln -s "$PACKAGE_DIR/$link" "$HOME/$link"
|
||
done
|
||
|
||
SHELL_BLOCK_START='# >>> proxy-client >>>'
|
||
if [ "$SETUP_SHELL" -eq 0 ]; then
|
||
echo "Настройка Bash пропущена (--no-shell-setup)."
|
||
# Команда для пользователя: $HOME и $PATH раскроются в его сессии.
|
||
# shellcheck disable=SC2016
|
||
RELOAD_COMMAND='export PATH="$HOME/.local/bin:$PATH"; source ~/.config/proxy-client/shell.bash'
|
||
else
|
||
if ! grep -Fqx "$SHELL_BLOCK_START" "$HOME/.bashrc" 2>/dev/null; then
|
||
cat >> "$HOME/.bashrc" <<EOF
|
||
|
||
$SHELL_BLOCK_START
|
||
case ":\$PATH:" in
|
||
*":\$HOME/.local/bin:"*) ;;
|
||
*) export PATH="\$HOME/.local/bin:\$PATH" ;;
|
||
esac
|
||
[ -f "\$HOME/.config/proxy-client/shell.bash" ] && source "\$HOME/.config/proxy-client/shell.bash"
|
||
# <<< proxy-client <<<
|
||
EOF
|
||
echo "В ~/.bashrc добавлен блок proxy-client."
|
||
fi
|
||
RELOAD_COMMAND='source ~/.bashrc'
|
||
fi
|
||
|
||
cat <<EOF
|
||
proxy-client установлен.
|
||
Исходный каталог должен оставаться по постоянному пути:
|
||
$PACKAGE_DIR
|
||
Примените настройки в текущей сессии: $RELOAD_COMMAND
|
||
Настройка режима описана в $PACKAGE_DIR/README.md.
|
||
EOF
|