diff --git a/README.md b/README.md index d4fdc7e..b14a445 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,12 @@ DCR — это утилита для управления проектами н - Очистка результатов сборки - Генерация минимального шаблона C-проекта +## Установка + +``` +curl -L dcr.zov.tatar | bash +``` + ## Быстрый старт Создать новый проект: `dcr new hello` diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..c075e83 --- /dev/null +++ b/install.sh @@ -0,0 +1,131 @@ +#!/usr/bin/env bash + +set -Eeuo pipefail + +TMPDIR="/tmp/dcr-temp" +INSTALL_PATH="$HOME/.local/share/dcr" +PYTHON_DIR="$INSTALL_PATH/Python" +BINPATH="$HOME/.local/bin" +LOGFILE="$PWD/dcr-install.log" + +PYTHON_DOWNLOAD_URL="https://github.com/astral-sh/python-build-standalone/releases/download/20260203/cpython-3.10.19+20260203-x86_64-unknown-linux-gnu-install_only.tar.gz" +GITHUB_API="https://api.github.com/repos/dexoron/dcr/releases/latest" + +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +exec > >(tee -a "$LOGFILE") 2>&1 + +log() { + echo -e "${BLUE}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1" +} + +success() { + echo -e "${GREEN}✔ $1${NC}" +} + +warn() { + echo -e "${YELLOW}⚠ $1${NC}" +} + +error() { + echo -e "${RED}✖ $1${NC}" +} + +trap 'error "Ошибка на строке $LINENO"; exit 1' ERR + +check_dependencies() { + log "Проверка зависимостей..." + + command -v curl >/dev/null 2>&1 || { + error "curl не установлен" + exit 1 + } + + command -v tar >/dev/null 2>&1 || { + error "tar не установлен" + exit 1 + } + + success "Зависимости в порядке" +} + +install_python() { + log "Установка встроенного Python..." + + mkdir -p "$PYTHON_DIR" + + curl -L "$PYTHON_DOWNLOAD_URL" -o "$TMPDIR/python.tar.gz" + tar -xf "$TMPDIR/python.tar.gz" -C "$PYTHON_DIR" --strip-components=1 + rm -f "$TMPDIR/python.tar.gz" + + cat > "$INSTALL_PATH/dcr" <<'EOF' +#!/usr/bin/env bash +BASE_DIR="$(dirname "$(readlink -f "$0")")" +SRC_DIR="$BASE_DIR/src" +PYTHON_BIN="$BASE_DIR/Python/bin/python3" +PYTHONPATH="$SRC_DIR" exec "$PYTHON_BIN" -m dcr.main "$@" +EOF + + chmod +x "$INSTALL_PATH/dcr" + + success "Python установлен" +} + +install_app() { + log "Получение последнего релиза..." + + TAG=$(curl -s "$GITHUB_API" | grep '"tag_name":' | cut -d'"' -f4) + + if [[ -z "$TAG" ]]; then + error "Не удалось определить версию релиза" + exit 1 + fi + + log "Найдена версия: $TAG" + + curl -L -o "$TMPDIR/sources.tar.gz" \ + "https://github.com/dexoron/dcr/archive/refs/tags/$TAG.tar.gz" + + mkdir -p "$INSTALL_PATH" + tar -xf "$TMPDIR/sources.tar.gz" -C "$INSTALL_PATH" --strip-components=1 + rm -f "$TMPDIR/sources.tar.gz" + + success "Приложение установлено" +} + +install_link() { + log "Создание симлинка..." + + mkdir -p "$BINPATH" + ln -sf "$INSTALL_PATH/dcr" "$BINPATH/dcr" + + success "Команда 'dcr' добавлена в $BINPATH" +} + +main() { + log "Запуск установки DCR" + + check_dependencies + + mkdir -p "$TMPDIR" + rm -rf "$TMPDIR"/* + + install_app + log "проверка наличия Python" + command -v curl >/dev/null 2>&1 || { + error "Python не установлен" + install_python + } + install_link + + rm -rf "$TMPDIR" + + success "Установка завершена успешно" + log "Лог сохранён в $LOGFILE" +} + +main "$@"