diff --git a/install.ps1 b/install.ps1 index 58e54ad..e77780b 100644 --- a/install.ps1 +++ b/install.ps1 @@ -26,7 +26,61 @@ if (-not $Version) { } } -Write-Host "Installing codeg-server $Version (windows/x64)..." +$TargetVer = $Version -replace '^v', '' + +# ── Version detection — skip if already up to date ── + +$ExistingBin = Join-Path $InstallDir "codeg-server.exe" +$CurrentVersion = "" +$WasRunning = $false + +if (Test-Path $ExistingBin) { + # Run with timeout to handle old binaries that lack --version support + # (old binaries would start the full server and hang) + try { + $verProc = Start-Process -FilePath $ExistingBin -ArgumentList "--version" ` + -NoNewWindow -PassThru -RedirectStandardOutput "$env:TEMP\codeg-ver.txt" ` + -RedirectStandardError "$env:TEMP\codeg-ver-err.txt" + $exited = $verProc.WaitForExit(3000) + if (-not $exited) { $verProc.Kill() } + if (Test-Path "$env:TEMP\codeg-ver.txt") { + $CurrentVersion = (Get-Content "$env:TEMP\codeg-ver.txt" -ErrorAction SilentlyContinue | Select-Object -First 1).Trim() + } + } catch { + $CurrentVersion = "" + } finally { + Remove-Item "$env:TEMP\codeg-ver.txt" -Force -ErrorAction SilentlyContinue + Remove-Item "$env:TEMP\codeg-ver-err.txt" -Force -ErrorAction SilentlyContinue + } +} + +if ($CurrentVersion -and ($CurrentVersion -eq $TargetVer)) { + Write-Host "codeg-server is already at version $TargetVer, nothing to do." + exit 0 +} + +if ($CurrentVersion) { + Write-Host "Upgrading codeg-server: $CurrentVersion -> $TargetVer..." +} else { + Write-Host "Installing codeg-server $Version (windows/x64)..." +} + +# ── Stop running service before upgrade ── + +$ServerProcesses = Get-Process -Name "codeg-server" -ErrorAction SilentlyContinue +if ($ServerProcesses) { + Write-Host "Stopping running codeg-server process(es)..." + $WasRunning = $true + $ServerProcesses | Stop-Process -Force + Start-Sleep -Seconds 2 + # Verify stopped + $StillRunning = Get-Process -Name "codeg-server" -ErrorAction SilentlyContinue + if ($StillRunning) { + $StillRunning | Stop-Process -Force + Start-Sleep -Seconds 1 + } + Write-Host "codeg-server stopped." +} # ── Download and extract ── @@ -78,10 +132,26 @@ if ($UserPath -notlike "*$InstallDir*") { Remove-Item $TmpDir -Recurse -Force -ErrorAction SilentlyContinue +# ── Restart service if it was running ── + +if ($WasRunning) { + Write-Host "" + Write-Host "Note: codeg-server was stopped for the upgrade." + Write-Host "Please restart it manually to ensure your environment variables (CODEG_PORT, CODEG_TOKEN, etc.) are preserved:" + Write-Host " `$env:CODEG_STATIC_DIR=`"$WebDir`"; codeg-server" +} + # ── Done ── +$InstalledVer = "" +try { + $InstalledVer = (& (Join-Path $InstallDir "codeg-server.exe") --version 2>$null).Trim() +} catch {} +if (-not $InstalledVer) { $InstalledVer = $TargetVer } + Write-Host "" Write-Host "codeg-server installed to $InstallDir\codeg-server.exe" +Write-Host "Version: $InstalledVer" Write-Host "" Write-Host "Quick start:" Write-Host " `$env:CODEG_STATIC_DIR=`"$WebDir`"; codeg-server" diff --git a/install.sh b/install.sh index 6dd6f45..f253e76 100755 --- a/install.sh +++ b/install.sh @@ -61,7 +61,63 @@ if [ -z "$VERSION" ]; then fi fi -echo "Installing codeg-server ${VERSION} (${PLATFORM}/${ARCH_SUFFIX})..." +# ── Version detection — skip if already up to date ── + +CURRENT_VERSION="" +EXISTING_BIN="${INSTALL_DIR}/codeg-server" + +if [ -x "$EXISTING_BIN" ]; then + # Run with timeout to handle old binaries that lack --version support + # (old binaries would start the full server and hang) + VER_TMP=$(mktemp) + "$EXISTING_BIN" --version > "$VER_TMP" 2>/dev/null & + VER_PID=$! + ( sleep 3 && kill "$VER_PID" 2>/dev/null ) & + VER_GUARD=$! + wait "$VER_PID" 2>/dev/null || true + kill "$VER_GUARD" 2>/dev/null || true + wait "$VER_GUARD" 2>/dev/null || true + CURRENT_VERSION=$(head -1 "$VER_TMP" 2>/dev/null | tr -d '[:space:]') + rm -f "$VER_TMP" +fi + +# Normalize: strip leading "v" for comparison +TARGET_VER="${VERSION#v}" + +if [ -n "$CURRENT_VERSION" ] && [ "$CURRENT_VERSION" = "$TARGET_VER" ]; then + echo "codeg-server is already at version ${TARGET_VER}, nothing to do." + exit 0 +fi + +if [ -n "$CURRENT_VERSION" ]; then + echo "Upgrading codeg-server: ${CURRENT_VERSION} -> ${TARGET_VER}..." +else + echo "Installing codeg-server ${VERSION} (${PLATFORM}/${ARCH_SUFFIX})..." +fi + +# ── Stop running service before upgrade ── + +RESTARTED_PIDS="" +if pgrep -x codeg-server >/dev/null 2>&1; then + echo "Stopping running codeg-server process(es)..." + RESTARTED_PIDS=$(pgrep -x codeg-server || true) + if kill $RESTARTED_PIDS 2>/dev/null; then + # Wait up to 10 seconds for graceful shutdown + for i in $(seq 1 10); do + if ! pgrep -x codeg-server >/dev/null 2>&1; then + break + fi + sleep 1 + done + # Force kill if still running + if pgrep -x codeg-server >/dev/null 2>&1; then + echo "Force stopping codeg-server..." + kill -9 $RESTARTED_PIDS 2>/dev/null || true + sleep 1 + fi + fi + echo "codeg-server stopped." +fi # ── Download and extract ── @@ -112,10 +168,21 @@ if [ -d "$WEB_SRC" ]; then fi fi +# ── Restart service if it was running ── + +if [ -n "$RESTARTED_PIDS" ]; then + echo "" + echo "Note: codeg-server was stopped for the upgrade." + echo "Please restart it manually to ensure your environment variables (CODEG_PORT, CODEG_TOKEN, etc.) are preserved:" + echo " CODEG_STATIC_DIR=${WEB_DIR} codeg-server" +fi + # ── Done ── echo "" echo "codeg-server installed to ${INSTALL_DIR}/codeg-server" +INSTALLED_VER=$("${INSTALL_DIR}/codeg-server" --version 2>/dev/null || echo "${TARGET_VER}") +echo "Version: ${INSTALLED_VER}" echo "" echo "Quick start:" echo " CODEG_STATIC_DIR=${WEB_DIR} codeg-server" diff --git a/src-tauri/src/bin/codeg_server.rs b/src-tauri/src/bin/codeg_server.rs index b013876..cc01c75 100644 --- a/src-tauri/src/bin/codeg_server.rs +++ b/src-tauri/src/bin/codeg_server.rs @@ -9,6 +9,13 @@ use codeg_lib::web::{ #[tokio::main] async fn main() { + // Support --version flag + let args: Vec = std::env::args().collect(); + if args.iter().any(|a| a == "--version" || a == "-V") { + println!("{}", env!("CARGO_PKG_VERSION")); + return; + } + codeg_lib::process::ensure_user_npm_prefix_in_path(); let port: u16 = std::env::var("CODEG_PORT")