Files
cmr-mini/publish-event-config.ps1

104 lines
2.9 KiB
PowerShell

param(
[Parameter(Position = 0)]
[string]$Target = "all",
[switch]$DryRun
)
$ErrorActionPreference = "Stop"
$projectRoot = $PSScriptRoot
$uploadScript = Join-Path $projectRoot "oss-html.ps1"
if (-not (Test-Path $uploadScript)) {
throw ("Upload script not found: {0}" -f $uploadScript)
}
$publishTargets = @{
"classic-sequential" = @{
LocalPath = "event/classic-sequential.json"
RemotePath = "gotomars/event/classic-sequential.json"
PublicUrl = "https://oss-mbh5.colormaprun.com/gotomars/event/classic-sequential.json"
}
"score-o" = @{
LocalPath = "event/score-o.json"
RemotePath = "gotomars/event/score-o.json"
PublicUrl = "https://oss-mbh5.colormaprun.com/gotomars/event/score-o.json"
}
}
function Assert-JsonConfig {
param(
[string]$ConfigPath,
[string]$ConfigName
)
if (-not (Test-Path $ConfigPath)) {
throw ("Config file not found: {0}" -f $ConfigPath)
}
$raw = Get-Content -LiteralPath $ConfigPath -Raw -Encoding UTF8
try {
$parsed = $raw | ConvertFrom-Json
} catch {
throw ("JSON parse failed: {0}`n{1}" -f $ConfigPath, $_.Exception.Message)
}
if (-not $parsed.schemaVersion) {
throw ("Missing schemaVersion: {0}" -f $ConfigPath)
}
if (-not $parsed.game) {
throw ("Missing game block: {0}" -f $ConfigPath)
}
if (-not $parsed.game.mode) {
throw ("Missing game.mode: {0}" -f $ConfigPath)
}
Write-Host ("[OK] {0} schemaVersion={1} game.mode={2}" -f $ConfigName, $parsed.schemaVersion, $parsed.game.mode)
}
function Publish-ConfigTarget {
param(
[string]$ConfigName,
[hashtable]$Config
)
$localPath = Join-Path $projectRoot $Config.LocalPath
$remotePath = $Config.RemotePath
$publicUrl = $Config.PublicUrl
Assert-JsonConfig -ConfigPath $localPath -ConfigName $ConfigName
if ($DryRun) {
Write-Host ("[DRY-RUN] Skip upload: {0} -> {1}" -f $localPath, $remotePath)
Write-Host ("[DRY-RUN] Public URL: {0}" -f $publicUrl)
return
}
Write-Host ("[UPLOAD] {0} -> {1}" -f $localPath, $remotePath)
& $uploadScript cp-up $localPath $remotePath
if ($LASTEXITCODE -ne 0) {
throw ("Upload failed: {0}" -f $ConfigName)
}
Write-Host ("[DONE] {0} published" -f $ConfigName)
Write-Host ("[URL] {0}" -f $publicUrl)
}
$selectedTargets = if ($Target -eq "all") {
$publishTargets.Keys | Sort-Object
} else {
@($Target)
}
foreach ($selectedTarget in $selectedTargets) {
if (-not $publishTargets.ContainsKey($selectedTarget)) {
$supported = ($publishTargets.Keys + "all" | Sort-Object) -join ", "
throw ("Unsupported publish target: {0}. Allowed: {1}" -f $selectedTarget, $supported)
}
Publish-ConfigTarget -ConfigName $selectedTarget -Config $publishTargets[$selectedTarget]
}