104 lines
2.9 KiB
PowerShell
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]
|
|
}
|