diff --git a/kota_tech/__init__.py b/kota_tech/__init__.py index 0b261f5..2f96e44 100644 --- a/kota_tech/__init__.py +++ b/kota_tech/__init__.py @@ -1,3 +1,3 @@ """KOTA sensorbox technician tool.""" -__version__ = "0.8.0" +__version__ = "0.9.0" diff --git a/pyproject.toml b/pyproject.toml index f8ec057..de52aac 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "kota-technician-tool" -version = "0.8.0" +version = "0.9.0" description = "KOTA sensorbox technician diagnostic tool (demo)" requires-python = ">=3.11,<3.14" dependencies = [ diff --git a/run_macos.command b/run_macos.command index 0a15bf5..029f753 100755 --- a/run_macos.command +++ b/run_macos.command @@ -4,8 +4,8 @@ cd "$(dirname "$0")" || exit 1 # If Finder refuses to open this file (Google Drive drops the executable bit), run it once as: # bash run_macos.command (or: chmod +x run_macos.command) -# Keep the virtual environment out of the (Google Drive) tool folder. -export UV_PROJECT_ENVIRONMENT="$HOME/Library/Caches/KotaTechnicianTool/venv-0.8" +# One shared Python environment for every version (update_macos.command keeps it current). +export UV_PROJECT_ENVIRONMENT="$HOME/Library/Caches/KotaTechnicianTool/venv" export PATH="$HOME/.local/bin:$PATH" if ! command -v uv >/dev/null 2>&1; then diff --git a/run_windows.bat b/run_windows.bat index 180a59e..f4be0dc 100644 --- a/run_windows.bat +++ b/run_windows.bat @@ -2,8 +2,8 @@ setlocal cd /d "%~dp0" -rem Keep the virtual environment out of the (Google Drive) tool folder. -set "UV_PROJECT_ENVIRONMENT=%LOCALAPPDATA%\KotaTechnicianTool\venv-0.8" +rem One shared Python environment for every version (update_windows.bat keeps it current). +set "UV_PROJECT_ENVIRONMENT=%LOCALAPPDATA%\KotaTechnicianTool\venv" set "PATH=%USERPROFILE%\.local\bin;%PATH%" where uv >nul 2>nul diff --git a/update_macos.command b/update_macos.command new file mode 100755 index 0000000..b014914 --- /dev/null +++ b/update_macos.command @@ -0,0 +1,74 @@ +#!/bin/bash +# KOTA Sensorbox Technician Tool - update to the newest released version. +# Checks Gitea for the newest release tag (vX.Y) and downloads only what changed (git). +# Works in a git clone and in a folder unpacked from a release zip (it is connected on first run). +# If Finder refuses to open this file, run it once as: bash update_macos.command +cd "$(dirname "$0")" || exit 1 + +REPO_URL="${KOTA_REPO_URL:-https://gitea.kota-app.com/kkallas/kota-technician-tool.git}" +export UV_PROJECT_ENVIRONMENT="${UV_PROJECT_ENVIRONMENT:-$HOME/Library/Caches/KotaTechnicianTool/venv}" +export PATH="$HOME/.local/bin:$PATH" + +finish() { + [ -z "$KOTA_NO_PAUSE" ] && [ -t 0 ] && read -r -p "Press Enter to close..." _ + exit "$1" +} +fail() { echo; echo "[!] $*"; echo "[!] Update did not finish."; finish 1; } + +# ---- git (macOS: the Command Line Tools installer offers it) -------------- +if ! git --version >/dev/null 2>&1; then + if [ "$(uname)" = Darwin ]; then + xcode-select --install >/dev/null 2>&1 + fail "Git is being installed (Apple Command Line Tools). Run this again when the installer has finished." + fi + fail "Git is not installed." +fi + +# ---- connect a folder unpacked from a zip ---------------------------------- +if [ ! -d .git ]; then + echo "Connecting this folder to $REPO_URL ..." + git init -q && git remote add origin "$REPO_URL" || fail "Cannot set up git in this folder." +fi + +# A developer copy follows a branch; it is updated with "git pull", not here. +if git rev-parse -q --verify HEAD >/dev/null 2>&1 && branch=$(git symbolic-ref -q --short HEAD); then + echo "This is a developer copy on branch $branch. Update it with: git pull" + finish 0 +fi + +echo "Checking for a new version..." +git fetch --quiet --force --tags origin || + fail "Cannot reach $REPO_URL. Check the Internet connection and your Gitea login, then try again." + +latest=$(git tag -l 'v*' --sort=-v:refname | head -n 1) +[ -n "$latest" ] || fail "No released version found on the server." +current=$(git describe --tags --exact-match HEAD 2>/dev/null) + +if [ "$current" = "$latest" ]; then + echo "You already have the newest version $latest." +else + if [ -n "$current" ]; then + if [ -n "$(git status --porcelain --untracked-files=no)" ]; then + echo "Some tool files in this folder were changed by hand. They will be replaced by $latest." + read -r -p "Continue? [y/N] " answer + [[ "$answer" =~ ^[Yy]$ ]] || fail "Cancelled." + fi + echo "Updating $current -> $latest. Changes:" + git --no-pager log --oneline --no-decorate "$current..$latest" + else + echo "Installing $latest..." + fi + git -c advice.detachedHead=false checkout -q -f "$latest" || fail "Checkout of $latest failed." + echo "Now on $latest." +fi + +# ---- Python libraries (only what changed) ---------------------------------- +if ! command -v uv >/dev/null 2>&1; then + echo "Installing uv (Python package runner, current user only)..." + curl -LsSf https://astral.sh/uv/install.sh | sh || fail "uv installation failed. Ask the firmware team for help." +fi +echo "Checking Python libraries..." +uv sync --frozen --no-dev --python 3.12 --quiet || fail "Installing Python libraries failed." +echo +echo "Done. Start the tool with run_macos.command." +finish 0 diff --git a/update_windows.bat b/update_windows.bat new file mode 100644 index 0000000..e0de997 --- /dev/null +++ b/update_windows.bat @@ -0,0 +1,107 @@ +@echo off +rem KOTA Sensorbox Technician Tool - update to the newest released version. +rem Checks Gitea for the newest release tag (vX.Y) and downloads only what changed (git). +rem Works in a git clone and in a folder unpacked from a release zip (it is connected on first run). +setlocal EnableDelayedExpansion +cd /d "%~dp0" +title KOTA Technician Tool - update + +if not defined KOTA_REPO_URL set "KOTA_REPO_URL=https://gitea.kota-app.com/kkallas/kota-technician-tool.git" +set "UV_PROJECT_ENVIRONMENT=%LOCALAPPDATA%\KotaTechnicianTool\venv" +set "PATH=%USERPROFILE%\.local\bin;%ProgramFiles%\Git\cmd;%PATH%" + +rem ---- git ---------------------------------------------------------------- +where git >nul 2>nul +if errorlevel 1 ( + echo Git is not installed. It is needed to download updates. + choice /m "Install Git for Windows now" + if errorlevel 2 goto :fail + winget install --id Git.Git -e --source winget --accept-package-agreements + where git >nul 2>nul + if errorlevel 1 ( + echo [!] Git installation failed. Install it from https://git-scm.com and run this again. + goto :fail + ) +) + +rem ---- connect a folder unpacked from a zip --------------------------------- +if not exist ".git" ( + echo Connecting this folder to %KOTA_REPO_URL% ... + git init -q || goto :fail + git remote add origin "%KOTA_REPO_URL%" || goto :fail +) + +rem A developer copy follows a branch; it is updated with "git pull", not here. +git rev-parse -q --verify HEAD >nul 2>nul +if not errorlevel 1 ( + for /f "delims=" %%b in ('git symbolic-ref -q --short HEAD 2^>nul') do ( + echo This is a developer copy on branch %%b. Update it with: git pull + goto :done + ) +) + +echo Checking for a new version... +git fetch --quiet --force --tags origin +if errorlevel 1 ( + echo [!] Cannot reach %KOTA_REPO_URL%. + echo Check the Internet connection and your Gitea login, then try again. + goto :fail +) + +set "LATEST=" +for /f "delims=" %%t in ('git tag -l "v*" --sort^=-v:refname') do if not defined LATEST set "LATEST=%%t" +if not defined LATEST ( + echo [!] No released version found on the server. + goto :fail +) +set "CURRENT=" +for /f "delims=" %%t in ('git describe --tags --exact-match HEAD 2^>nul') do set "CURRENT=%%t" + +if "%CURRENT%"=="%LATEST%" ( + echo You already have the newest version %LATEST%. + goto :deps +) + +if defined CURRENT ( + for /f "delims=" %%s in ('git status --porcelain --untracked-files^=no') do set "DIRTY=1" + if defined DIRTY ( + echo Some tool files in this folder were changed by hand. They will be replaced by %LATEST%. + choice /m "Continue" + if errorlevel 2 goto :fail + ) + echo Updating %CURRENT% -^> %LATEST%. Changes: + git --no-pager log --oneline --no-decorate "%CURRENT%..%LATEST%" +) else ( + echo Installing %LATEST%... +) +git -c advice.detachedHead=false checkout -q -f "%LATEST%" +if errorlevel 1 goto :fail +echo Now on %LATEST%. + +rem ---- Python libraries (only what changed) ---------------------------------- +:deps +where uv >nul 2>nul +if errorlevel 1 ( + echo Installing uv ^(Python package runner, current user only^)... + powershell -NoProfile -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" +) +where uv >nul 2>nul +if errorlevel 1 ( + echo [!] uv installation failed. Ask the firmware team for help. + goto :fail +) +echo Checking Python libraries... +uv sync --frozen --no-dev --python 3.12 --quiet +if errorlevel 1 goto :fail +echo. +echo Done. Start the tool with run_windows.bat. + +:done +if not defined KOTA_NO_PAUSE pause +exit /b 0 + +:fail +echo. +echo [!] Update did not finish. +if not defined KOTA_NO_PAUSE pause +exit /b 1 diff --git a/uv.lock b/uv.lock index f56f5b6..098561d 100644 --- a/uv.lock +++ b/uv.lock @@ -250,7 +250,7 @@ wheels = [ [[package]] name = "kota-technician-tool" -version = "0.8.0" +version = "0.9.0" source = { virtual = "." } dependencies = [ { name = "esptool" },