<# Atualiza C:\PilotDownloads\ com o conteúdo do repositório (branch main) https://gitea.magicis.com.br/PilotSupport/vlt-install e executa pilot_install.ps1 Ajuste as variáveis $GitUser e $GitToken conforme necessário. #> # ========= CONFIGURAÇÃO DE USUÁRIO/TOKEN ========= $GitUser = "ricardo.sarda" $GitToken = "d6504f7d969c77a51dcbd5854a1f37f0a96398cd" # ================================================ $ErrorActionPreference = 'Stop' # ===== Auto-desbloqueio (MOTW) ===== try { $scriptPath = $MyInvocation.MyCommand.Path if ($scriptPath -and (Test-Path -LiteralPath $scriptPath)) { Unblock-File -LiteralPath $scriptPath -ErrorAction SilentlyContinue Remove-Item -LiteralPath "$scriptPath`:Zone.Identifier" -Force -ErrorAction SilentlyContinue } } catch {} # ===== Configurações ===== $RepoUrl = 'https://gitea.magicis.com.br/PilotSupport/vlt-install' $Branch = 'main' $TargetDir = 'C:\PilotDownloads' $WorkDir = Join-Path $env:TEMP 'vlt-install_repo' $CopyLog = Join-Path $env:TEMP 'vlt-install_copy.log' 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 { [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." throw "winget ausente" } Write-Info "Verificando Git via winget..." $argsCommon = @('--accept-package-agreements','--accept-source-agreements','--silent') $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 } if (-not (Get-Command git -ErrorAction SilentlyContinue)) { $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" } function Get-BasicAuthHeader([string]$user,[string]$token){ if (-not $user -or -not $token) { return $null } $bytes = [Text.Encoding]::ASCII.GetBytes("$user`:$token") $base64 = [Convert]::ToBase64String($bytes) return "Authorization: Basic $base64" } function Get-GitCommonArgs { param([string]$AuthHeader) $args = @( '-c','credential.helper=', '-c','credential.interactive=never', '-c','core.askPass=' ) if ($AuthHeader) { $args += @('-c',"http.extraHeader=$AuthHeader") } return ,$args } function Force-ReplaceFile { param( [Parameter(Mandatory = $true)][string]$SourceFile, [Parameter(Mandatory = $true)][string]$TargetFile ) if (-not (Test-Path -LiteralPath $SourceFile)) { throw "Arquivo de origem não encontrado: $SourceFile" } $targetParent = Split-Path -Path $TargetFile -Parent Ensure-Dir $targetParent if (Test-Path -LiteralPath $TargetFile) { Remove-Item -LiteralPath $TargetFile -Force -ErrorAction SilentlyContinue } Copy-Item -LiteralPath $SourceFile -Destination $TargetFile -Force Unblock-File -LiteralPath $TargetFile -ErrorAction SilentlyContinue $srcHash = (Get-FileHash -LiteralPath $SourceFile -Algorithm SHA256).Hash $dstHash = (Get-FileHash -LiteralPath $TargetFile -Algorithm SHA256).Hash Write-Info "Hash origem : $srcHash" Write-Info "Hash destino: $dstHash" if ($srcHash -ne $dstHash) { throw "Validação por hash falhou para: $TargetFile" } } try { Ensure-Git-WithWinget Ensure-Dir $TargetDir $AuthHeader = $null if ($GitUser -and $GitToken) { $AuthHeader = Get-BasicAuthHeader -user $GitUser -token $GitToken Write-Info "Usando autenticação com header." } $env:GIT_TERMINAL_PROMPT = '0' # ===== AUTOATUALIZAÇÃO ===== $NeedCopy = $false $GitDir = Join-Path $WorkDir '.git' if (-not (Test-Path -LiteralPath $GitDir)) { Write-Info "Primeira execução. Clonando repositório..." if (Test-Path $WorkDir) { Remove-Item $WorkDir -Recurse -Force -ErrorAction SilentlyContinue } Ensure-Dir $WorkDir & git (Get-GitCommonArgs -AuthHeader $AuthHeader) clone --depth 1 --branch $Branch $RepoUrl $WorkDir if ($LASTEXITCODE -ne 0 -or -not (Test-Path $GitDir)) { throw "Falha ao clonar o repositório." } $NeedCopy = $true } else { Push-Location $WorkDir try { Write-Info "Verificando atualizações..." & git (Get-GitCommonArgs -AuthHeader $AuthHeader) fetch --prune origin $Branch if ($LASTEXITCODE -ne 0) { throw "git fetch falhou." } & git diff --quiet HEAD ("origin/" + $Branch) $DiffExit = $LASTEXITCODE switch ($DiffExit) { 0 { Write-Ok "Repositório já está atualizado." } 1 { Write-Info "Atualizações encontradas." & git reset --hard ("origin/" + $Branch) if ($LASTEXITCODE -ne 0) { throw "git reset falhou." } & git clean -fd $NeedCopy = $true } default { throw "Falha ao comparar versões do Git." } } } finally { Pop-Location } } if ($NeedCopy) { Write-Info "Atualizando arquivos em $TargetDir..." $null = robocopy $WorkDir $TargetDir * /E /IS /IT /R:1 /W:1 /NFL /NDL /NP /XD ".git" /XF ".gitignore" ".gitattributes" /LOG:$CopyLog if ($LASTEXITCODE -ge 8) { throw "Falha ao copiar arquivos. Veja o log: $CopyLog" } Write-Ok "Arquivos atualizados." } else { Write-Ok "Nenhuma atualização necessária." } # ===== GARANTE A ATUALIZAÇÃO DOS ARQUIVOS PRINCIPAIS ===== $SourceInstallScript = Join-Path $WorkDir 'pilot_install.ps1' $TargetInstallScript = Join-Path $TargetDir 'pilot_install.ps1' $SourceUtilityScript = Join-Path $WorkDir 'pilot_installer_utilities.ps1' $TargetUtilityScript = Join-Path $TargetDir 'pilot_installer_utilities.ps1' Write-Info "Forçando atualização de pilot_install.ps1 ..." Force-ReplaceFile -SourceFile $SourceInstallScript -TargetFile $TargetInstallScript Write-Ok "pilot_install.ps1 atualizado com sucesso." Write-Info "Forçando atualização de pilot_installer_utilities.ps1 ..." Force-ReplaceFile -SourceFile $SourceUtilityScript -TargetFile $TargetUtilityScript Write-Ok "pilot_installer_utilities.ps1 atualizado com sucesso." if (Test-Path -LiteralPath $TargetInstallScript) { Write-Info "Executando $TargetInstallScript ..." try { Unblock-File -LiteralPath $TargetInstallScript -ErrorAction SilentlyContinue } catch { } $p = Start-Process -FilePath 'powershell.exe' -ArgumentList @( '-NoProfile','-ExecutionPolicy','Bypass','-File', $TargetInstallScript ) -Wait -PassThru if ($p.ExitCode -ne 0) { Write-Err "pilot_install.ps1 retornou código $($p.ExitCode)." Stop-Process -Id $PID -Force } else { Write-Ok "pilot_install.ps1 executado com sucesso." } } else { Write-Warn "Arquivo não encontrado: $TargetInstallScript. Execução ignorada." } Write-Ok "Processo concluído." Stop-Process -Id $PID -Force } catch { Write-Err ("Erro: " + $_.Exception.Message) Stop-Process -Id $PID -Force } finally { Remove-Item Env:\GIT_TERMINAL_PROMPT -ErrorAction SilentlyContinue }