<# 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 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 #> $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','--silent') # Detecta se Git está instalado $gitInstalled = $false try { $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)..." & winget upgrade --id Git.Git -e @argsCommon | Out-Null } else { Write-Info "Instalando Git..." & winget install --id Git.Git -e @argsCommon | Out-Null } # Garante que o git esteja acessível $gitCmd = Get-Command git -ErrorAction SilentlyContinue if (-not $gitCmd) { $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' 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 retornou código $($p.ExitCode)." exit $p.ExitCode } else { Write-Ok "pilot_install.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 }