/
sapertlt
/
layout_switcher
Обзор
Документация
Войти
/
sapertlt
/
layout_switcher
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
scripts/update.sh
255 строк
10 KB
Andrey
feat: путь production-установки вынесен в .prod_install_dir.mk
06 авг 2026, 11:13
06 авг 2026, 11:13
3a06dcf
Код
Авторство
О чём код?
#!/usr/bin/env bash # ============================================================================ # Скрипт обновления Layout Switcher из репозитория. # # Обновляет программу в каталоге установки пользователя, # переустанавливает Python-пакет и перезапускает сервис. # Пользовательские настройки (~/.config/layout-switcher/) НЕ затрагиваются. # # Использование: # scripts/update.sh # Обновление из git (pull) # scripts/update.sh --branch main # Обновление с указанной ветки # scripts/update.sh --install-dir /path/to/dir # Другой каталог установки # ============================================================================ set -euo pipefail # --- Цвета для вывода --- RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' info() { echo -e "${BLUE}[INFO]${NC} $*"; } success() { echo -e "${GREEN}[OK]${NC} $*"; } warn() { echo -e "${YELLOW}[ВНИМАНИЕ]${NC} $*"; } error() { echo -e "${RED}[ОШИБКА]${NC} $*"; exit 1; } # --- Значения по умолчанию --- # Пробуем прочитать production-путь из .prod_install_dir.mk (задаётся при make install) SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" PROD_DIR_FILE="$REPO_ROOT/.prod_install_dir.mk" if [[ -f "$PROD_DIR_FILE" ]]; then # Читаем строку вида "PROD_DIR = /path/to/dir" INSTALL_DIR=$(grep '^PROD_DIR' "$PROD_DIR_FILE" | sed 's/PROD_DIR\s*=\s*//' | xargs) if [[ -z "$INSTALL_DIR" ]]; then warn "Файл $PROD_DIR_FILE есть, но PROD_DIR не задан. Используется ~/layout_switcher" INSTALL_DIR="$HOME/layout_switcher" fi else warn "Файл $PROD_DIR_FILE не найден. Используется ~/layout_switcher по умолчанию." warn "Запустите 'make install' в каталоге production-установки для автоматической настройки." INSTALL_DIR="$HOME/layout_switcher" fi BRANCH="production" CONFIG_DIR="$HOME/.config/layout-switcher" # --- Разбор аргументов --- while [[ $# -gt 0 ]]; do case "$1" in --install-dir) INSTALL_DIR="$2" shift 2 ;; --branch) BRANCH="$2" shift 2 ;; -h|--help) echo "Использование: $0 [опции]" echo "" echo "Опции:" echo " --install-dir DIR Каталог установки (по умолчанию: ~/layout_switcher)" echo " --branch BRANCH Ветка для обновления (по умолчанию: текущая)" echo " -h, --help Показать справку" exit 0 ;; *) error "Неизвестная опция: $1. Используйте --help для справки." ;; esac done # ============================================================================ # Проверки # ============================================================================ echo "" echo -e "${BLUE}╔════════════════════════════════════════════╗${NC}" echo -e "${BLUE}║ Обновление Layout Switcher ║${NC}" echo -e "${BLUE}╚════════════════════════════════════════════╝${NC}" echo "" # Проверяем каталог установки if [[ ! -d "$INSTALL_DIR" ]]; then error "Каталог установки не найден: $INSTALL_DIR" fi if [[ ! -d "$INSTALL_DIR/.git" ]]; then error "Каталог установки не является git-репозиторием: $INSTALL_DIR" fi if [[ ! -x "$INSTALL_DIR/.venv/bin/activate" ]]; then info "Виртуальное окружение не найдено или повреждено. Создаю новое..." rm -rf "$INSTALL_DIR/.venv" 2>/dev/null || true python3 -m venv "$INSTALL_DIR/.venv" --system-site-packages fi # ============================================================================ # Сохраняем информацию о текущей версии # ============================================================================ cd "$INSTALL_DIR" CURRENT_BRANCH=$(git branch --show-current) CURRENT_VERSION=$(grep -oP "__version__\s*=\s*['\"]\\K[^'\"]*" \ src/layout_switcher/__init__.py 2>/dev/null || echo "неизвестна") CURRENT_COMMIT=$(git rev-parse --short HEAD) info "Каталог установки: $INSTALL_DIR" info "Текущая ветка: $CURRENT_BRANCH" info "Текущая версия: $CURRENT_VERSION (commit: $CURRENT_COMMIT)" # Проверяем наличие пользовательских настроек if [[ -d "$CONFIG_DIR" ]]; then success "Настройки пользователя: $CONFIG_DIR (будут сохранены)" else info "Настройки пользователя: не найдены (будут созданы при первом запуске)" fi # ============================================================================ # Остановка сервиса # ============================================================================ info "Остановка сервиса..." if systemctl --user is-active --quiet layout-switcher 2>/dev/null; then systemctl --user stop layout-switcher success "Сервис остановлен" else info "Сервис не был запущен" fi # ============================================================================ # Обновление из git # ============================================================================ info "Обновление исходного кода из репозитория..." git fetch origin if [[ "$BRANCH" != "$CURRENT_BRANCH" ]]; then info "Переключение на ветку: $BRANCH" git checkout "$BRANCH" fi git pull origin "$BRANCH" NEW_VERSION=$(grep -oP "__version__\s*=\s*['\"]\\K[^'\"]*" \ src/layout_switcher/__init__.py 2>/dev/null || echo "неизвестна") NEW_COMMIT=$(git rev-parse --short HEAD) if [[ "$CURRENT_COMMIT" == "$NEW_COMMIT" ]]; then info "Репозиторий уже актуален (commit: $NEW_COMMIT)" else success "Обновлено: $CURRENT_VERSION ($CURRENT_COMMIT) → $NEW_VERSION ($NEW_COMMIT)" fi # ============================================================================ # Переустановка Python-пакета # ============================================================================ info "Переустановка Python-пакета..." # Очистка кэша find "$INSTALL_DIR" -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true rm -rf "$INSTALL_DIR/build" "$INSTALL_DIR/dist" "$INSTALL_DIR"/src/*.egg-info 2>/dev/null || true # Активируем venv и переустанавливаем source "$INSTALL_DIR/.venv/bin/activate" pip install -e . --quiet deactivate 2>/dev/null || true # Проверяем симлинк local_bin="$HOME/.local/bin/layout-switcher" if [[ -L "$local_bin" ]]; then target=$(readlink -f "$local_bin" 2>/dev/null || true) if [[ "$target" == *"$INSTALL_DIR"* ]]; then success "Симлинк актуален: $local_bin → $target" else warn "Симлинк указывает на: $target" ln -sf "$INSTALL_DIR/.venv/bin/layout-switcher" "$local_bin" success "Симлинк обновлён: $local_bin → $INSTALL_DIR/.venv/bin/layout-switcher" fi else mkdir -p "$HOME/.local/bin" ln -sf "$INSTALL_DIR/.venv/bin/layout-switcher" "$local_bin" success "Симлинк создан: $local_bin" fi success "Python-пакет переустановлен" # ============================================================================ # Обновление systemd-сервиса (если изменился) # ============================================================================ service_src="$INSTALL_DIR/systemd/layout-switcher.service" service_dst="$HOME/.config/systemd/user/layout-switcher.service" if [[ -f "$service_src" ]]; then if [[ -f "$service_dst" ]]; then if ! diff -q "$service_src" "$service_dst" &>/dev/null; then info "Файл сервиса изменился, обновляю..." cp "$service_src" "$service_dst" systemctl --user daemon-reload success "Systemd-сервис обновлён" else info "Файл systemd-сервиса не изменился" fi else info "Systemd-сервис не установлен, пропускаю" fi fi # ============================================================================ # Запуск сервиса # ============================================================================ info "Запуск сервиса..." if systemctl --user is-enabled --quiet layout-switcher 2>/dev/null; then systemctl --user start layout-switcher sleep 1 if systemctl --user is-active --quiet layout-switcher; then success "Сервис запущен" else warn "Сервис не запустился. Проверьте: journalctl --user -u layout-switcher -n 20" fi else info "Сервис не включён в автозагрузку, пропускаю запуск" fi # ============================================================================ # Итог # ============================================================================ echo "" echo -e "${GREEN}============================================${NC}" echo -e "${GREEN} Обновление завершено!${NC}" echo -e "${GREEN}============================================${NC}" echo "" echo " Версия: $NEW_VERSION (commit: $NEW_COMMIT)" echo " Ветка: $BRANCH" echo " Каталог: $INSTALL_DIR" echo "" if [[ -d "$CONFIG_DIR" ]]; then echo " Настройки сохранены: $CONFIG_DIR" fi echo "" echo " Проверка статуса:" echo " systemctl --user status layout-switcher" echo " journalctl --user -u layout-switcher -f" echo ""