Lumi/companion/scripts/publish-dev-update.ps1
2026-07-24 14:44:27 +02:00

73 lines
3.4 KiB
PowerShell

param(
[Parameter(Mandatory = $true)][string]$OutputArchive,
[Parameter(Mandatory = $true)][string]$ManifestPath
)
$ErrorActionPreference = "Stop"
$repoRoot = (Resolve-Path (Join-Path $PSScriptRoot "..\..")).Path
$project = Join-Path $repoRoot "companion\src\Lumi.Companion.App\Lumi.Companion.App.csproj"
$outputArchive = [System.IO.Path]::GetFullPath($OutputArchive)
$manifest = [System.IO.Path]::GetFullPath($ManifestPath)
$workRoot = Join-Path ([System.IO.Path]::GetDirectoryName($outputArchive)) "work"
$publishRoot = Join-Path $workRoot "publish"
$stageRoot = Join-Path $workRoot "package"
if (!(Test-Path $manifest)) { throw "The development build manifest is missing." }
& (Join-Path $PSScriptRoot "generate-companion-icon.ps1")
Remove-Item $workRoot -Recurse -Force -ErrorAction SilentlyContinue
New-Item -ItemType Directory -Force -Path $publishRoot, $stageRoot | Out-Null
New-Item -ItemType Directory -Force -Path ([System.IO.Path]::GetDirectoryName($outputArchive)) | Out-Null
$localDotnet = Join-Path $HOME ".dotnet-sdk\dotnet.exe"
$dotnet = if (Test-Path $localDotnet) { $localDotnet } else { (Get-Command dotnet.exe -ErrorAction Stop).Source }
$arguments = @(
"publish", "`"$project`"",
"-c", "Release",
"-r", "win-x64",
"--self-contained", "true",
"--disable-build-servers",
"-o", "`"$publishRoot`"",
"-p:PublishSingleFile=true",
"-p:IncludeNativeLibrariesForSelfExtract=true",
"-p:DebugType=None"
)
$published = Start-Process -FilePath $dotnet -ArgumentList $arguments -NoNewWindow -Wait -PassThru
if ($published.ExitCode -ne 0) { throw "Companion development publish failed." }
$app = Join-Path $publishRoot "Lumi.Companion.App.exe"
if (!(Test-Path $app)) { throw "The Companion development publish did not create Lumi.Companion.App.exe." }
Copy-Item $app $stageRoot -Force
$componentsSource = Join-Path $publishRoot "components"
if (Test-Path $componentsSource) { Copy-Item $componentsSource (Join-Path $stageRoot "components") -Recurse -Force }
$legalSource = Join-Path $repoRoot "companion\legal"
$legalTarget = Join-Path $stageRoot "legal"
if (Test-Path $legalSource) {
New-Item -ItemType Directory -Force -Path $legalTarget | Out-Null
foreach ($name in @("LUMI-COMPANION-LICENCE.txt", "PRIVACY-NOTICE.txt", "THIRD-PARTY-NOTICES.txt", "LEGAL-README.txt")) {
$source = Join-Path $legalSource $name
if (Test-Path $source) { Copy-Item $source (Join-Path $legalTarget $name) -Force }
}
$thirdParty = Join-Path $legalSource "third-party"
if (Test-Path $thirdParty) { Copy-Item $thirdParty (Join-Path $legalTarget "third-party") -Recurse -Force }
}
Copy-Item $manifest (Join-Path $stageRoot ".lumi-dev-build.json") -Force
Remove-Item $outputArchive -Force -ErrorAction SilentlyContinue
$archiveItems = Get-ChildItem $stageRoot -Force | Select-Object -ExpandProperty FullName
$archiveCreated = $false
for ($attempt = 1; $attempt -le 20; $attempt++) {
try {
Compress-Archive -Path $archiveItems -DestinationPath $outputArchive -CompressionLevel Optimal -ErrorAction Stop
$archiveCreated = $true
break
}
catch {
Remove-Item $outputArchive -Force -ErrorAction SilentlyContinue
if ($attempt -eq 20) { throw }
Start-Sleep -Milliseconds 250
}
}
if (-not $archiveCreated) { throw "The Companion development archive could not be created." }
Remove-Item $workRoot -Recurse -Force -ErrorAction SilentlyContinue
Write-Host "Created localhost development update: $outputArchive"