diff --git a/pilot_installer_utilities.ps1 b/pilot_installer_utilities.ps1 new file mode 100644 index 0000000..d3a3cdd --- /dev/null +++ b/pilot_installer_utilities.ps1 @@ -0,0 +1,154 @@ +<# + Atualiza C:\plhDownloads\ com o conteúdo do repositório (branch main) + https://gitea.magicis.com.br/PilotSupport/vlt-install e executa pilot_install.ps1.ps1 + + Requisitos: + - PowerShell com permissões para escrever em C:\plhDownloads\ + - Preferível executar em janela elevada (winget pode pedir UAC) + + O script: + 1) Garante winget e usa-o para instalar/atualizar Git (Git.Git). + 2) Clona/atualiza o repo em pasta temporária. + 3) Copia por cima (sem /MIR) para C:\plhDownloads\ (exclui .git). + 4) Executa pilot_install.ps1.ps1 +#> + +$ErrorActionPreference = 'Stop' + +# ===== Configurações ===== +$RepoUrl = 'https://gitea.magicis.com.br/PilotSupport/vlt-install' +$Branch = 'main' # sempre main +$TargetDir = 'C:\PilotDownloads' +$WorkDir = Join-Path $env:TEMP 'vlt-install_repo' + +# ===== Utilitárias ===== +function Write-Info($m){ Write-Host "[INFO ] $m" -ForegroundColor Cyan } +function Write-Ok($m) { Write-Host "[ OK ] $m" -ForegroundColor Green } +function Write-Warn($m){ Write-Host "[WARN ] $m" -ForegroundColor Yellow } +function Write-Err($m) { Write-Host "[ERRO ] $m" -ForegroundColor Red } + +function Ensure-Dir([string]$Path){ + if (-not (Test-Path -LiteralPath $Path)) { + New-Item -ItemType Directory -Path $Path -Force | Out-Null + } +} + +function Test-Winget { + return [bool](Get-Command winget -ErrorAction SilentlyContinue) +} + +function Ensure-Git-WithWinget { + if (-not (Test-Winget)) { + Write-Err "winget não encontrado. Instale o 'App Installer' da Microsoft Store para habilitar o winget." + throw "winget ausente" + } + + Write-Info "Verificando Git via winget..." + $argsCommon = @('--accept-package-agreements','--accept-source-agreements') + + # Detecta se Git está instalado + $gitInstalled = $false + try { + # 'winget list' retorna errolevel 0 mesmo sem pacote; interpretamos saída + $list = winget list --id Git.Git -e 2>$null + if ($list -match 'Git\s+Git') { $gitInstalled = $true } + } catch { } + + if ($gitInstalled) { + Write-Info "Atualizando Git (se necessário)..." + # silencia prompts; se não houver upgrade disponível, winget finaliza OK. + winget upgrade --id Git.Git -e @argsCommon --silent | Out-Null + } else { + Write-Info "Instalando Git..." + winget install --id Git.Git -e @argsCommon --silent | Out-Null + } + + # Garante que o git esteja acessível + $gitCmd = Get-Command git -ErrorAction SilentlyContinue + if (-not $gitCmd) { + # tenta caminho usual + $maybeGit = 'C:\Program Files\Git\cmd\git.exe' + if (Test-Path $maybeGit) { + $env:Path = "C:\Program Files\Git\cmd;$env:Path" + } + } + + $ver = git --version 2>$null + if (-not $ver) { throw "Git não acessível após instalação/atualização." } + Write-Ok "Git pronto: $ver" +} + +# ===== Fluxo principal ===== +try { + Ensure-Git-WithWinget + + Ensure-Dir $TargetDir + + # Prepara/atualiza repositório no diretório de trabalho + if (Test-Path (Join-Path $WorkDir '.git')) { + Write-Info "Atualizando repositório existente em $WorkDir ..." + Push-Location $WorkDir + try { git remote set-url origin $RepoUrl | Out-Null } catch { } + git fetch --all --prune + git checkout $Branch + git reset --hard "origin/$Branch" + Pop-Location + } else { + Write-Info "Clonando repositório (branch $Branch) para $WorkDir ..." + try { Remove-Item -LiteralPath $WorkDir -Recurse -Force -ErrorAction SilentlyContinue } catch { } + Ensure-Dir $WorkDir + git clone --depth 1 --branch $Branch $RepoUrl $WorkDir + Write-Ok "Clone concluído." + } + + # Copiar por cima para o destino (sem espelhar/sem apagar o que já existe) + Write-Info "Copiando arquivos para $TargetDir (sem espelhar)..." + $log = Join-Path $env:TEMP 'vlt-install_copy.log' + + # Robocopy: + # /E -> inclui subpastas (inclui vazias) + # /IS -> inclui arquivos “iguais” (força overwrite) + # /IT -> inclui arquivos “tweak” + # /XO -> (opcional) pula arquivos mais antigos na origem; REMOVIDO para forçar overwrite + # /NFL /NDL /NP -> logs mais limpos + $rc = robocopy ` + $WorkDir ` + $TargetDir ` + * ` + /E /IS /IT /R:1 /W:1 /NFL /NDL /NP ` + /XD ".git" ` + /XF ".gitignore" ".gitattributes" ` + /LOG:$log + + if ($LASTEXITCODE -ge 8) { + Write-Err "Falha ao copiar arquivos. Veja o log: $log" + exit $LASTEXITCODE + } else { + Write-Ok "Cópia finalizada. (código robocopy: $LASTEXITCODE) Log: $log" + } + + # Executa o instalador + $InstallScript = Join-Path $TargetDir 'pilot_install.ps1.ps1' + if (Test-Path -LiteralPath $InstallScript) { + Write-Info "Executando $InstallScript ..." + try { Unblock-File -LiteralPath $InstallScript -ErrorAction SilentlyContinue } catch { } + $p = Start-Process -FilePath 'powershell.exe' -ArgumentList @( + '-NoProfile','-ExecutionPolicy','Bypass','-File', $InstallScript + ) -Wait -PassThru + if ($p.ExitCode -ne 0) { + Write-Err "pilot_install.ps1.ps1 retornou código $($p.ExitCode)." + exit $p.ExitCode + } else { + Write-Ok "pilot_install.ps1.ps1 executado com sucesso." + } + } else { + Write-Warn "Arquivo não encontrado: $InstallScript. Execução ignorada." + } + + Write-Ok "Processo concluído." + exit 0 + +} catch { + Write-Err ("Erro: " + $_.Exception.Message) + exit 1 +}