diff --git a/ue4-release.ps1 b/ue4-release.ps1 index 80b267f..3f1bf6d 100644 --- a/ue4-release.ps1 +++ b/ue4-release.ps1 @@ -1,12 +1,9 @@ [CmdletBinding()] # Fail on unknown args param ( # Version to release - [Parameter(Mandatory=$true)] [string]$version, - # Variant name to release - [Parameter(Mandatory=$true)] - # Project folder (assumes current dir if not specified) - [string]$variant, + # Variant name(s) to release; if not specified release all DefaultVariants with ReleaseTo options + [array]$variants, # Source folder, current dir if omitted [string]$src, # Which service(s) to release on e.g. "steam": defaults to "ReleaseTo" services in packageconfig.json for variant @@ -28,13 +25,13 @@ function Write-Usage { Write-Output "Usage:" Write-Output " ue4-release.ps1 -version:ver -variant:var -services:steam,itch [-src:sourcefolder] [-dryrun]" Write-Output " " - Write-Output " -version:ver : Version to release; must have been packaged already" - Write-Output " -variant:var : Name of package variant to release" - Write-Output " -services:s1,s2 : Name of services to release to. Can omit and rely on ReleaseTo" - Write-Output " setting of variant in packageconfig.json " - Write-Output " -src : Source folder (current folder if omitted), must contain packageconfig.json" - Write-Output " -dryrun : Don't perform any actual actions, just report what would happen" - Write-Output " -help : Print this help" + Write-Output " -version:ver : Version to release; must have been packaged already" + Write-Output " -variants:var1,var2 : Name of variants to release. Omit to use DefaultVariants" + Write-Output " -services:s1,s2 : Name of services to release to. Can omit and rely on ReleaseTo" + Write-Output " setting of variant in packageconfig.json " + Write-Output " -src : Source folder (current folder if omitted), must contain packageconfig.json" + Write-Output " -dryrun : Don't perform any actual actions, just report what would happen" + Write-Output " -help : Print this help" } $ErrorActionPreference = "Stop" @@ -49,6 +46,11 @@ if ($src.Length -eq 0) { Write-Verbose "-src not specified, assuming current directory" } +if (-not $version) { + Write-Output "Mandatory argument: version" + Exit 1 +} + Write-Output "~-~-~ UE4 Release Helper Start ~-~-~" try { @@ -56,55 +58,67 @@ try { # Import config $config = Read-Package-Config -srcfolder:$src - # Find variant (first match in case config has many) - $variantConfig = $config.Variants | Where-Object { $_.Name -eq $variant } - if ($variantConfig -is [array]) { - if ($variantConfig.Count > 1) { - throw "More than one package variant called $variant in packageconfig.json, ambiguous!" - } else { - # Don't think this will happen but still - $variantConfig = $variantConfig[0] - } - } - - # Get source dir - $sourcedir = Get-Package-Client-Dir -config:$config -versionNumber:$version -variantName:$variant - - if (-not (Test-Path $sourcedir -PathType Container)) { - throw "Release folder $sourcedir does not exist" - } - - # Find service(s) - if ($services) { - # Release to a subset of allowed services - $servicesFound = $services | Where-Object {$variantConfig.ReleaseTo -contains $_ } - if ($servicesFound.Count -ne $services.Count) { - $unmatchedServices = $services | Where-Object { $servicesFound -notcontains $_ } - Write-Warning "Services(s) not supported by $($variantConfig.Name): $($unmatchedServices -join ", ")" + if ($variants) { + $variantConfigs = $config.Variants | Where-Object { $_.Name -in $variants } + if ($variantConfigs.Count -ne $variants.Count) { + $unmatchedVariants = $variants | Where-Object { $_ -notin $variantConfigs.Name } + Write-Warning "Variant(s) not found, ignoring: $($unmatchedVariants -join ", ")" } } else { - $servicesFound = $variantConfig.ReleaseTo + # Use default variants + $variantConfigs = $config.Variants | Where-Object { $_.Name -in $config.DefaultVariants } } - if (-not $servicesFound) { - throw "No matching services to release $variant to" - } + $hasErrors = $false + foreach ($variantConfig in $variantConfigs) { - Write-Output "" - Write-Output "Variant : $variant" - Write-Output "Source Folder : $sourcedir" - Write-Output "Service(s) : $($servicesFound -join ", ")" - Write-Output "" + # Get source dir + $sourcedir = Get-Package-Client-Dir -config:$config -versionNumber:$version -variantName:$variantConfig.Name - - foreach ($service in $servicesFound) { - if ($service -eq "steam") { - Release-Steam -config:$config -variant:$variantConfig -sourcefolder:$sourcedir -version:$version -dryrun:$dryrun - } elseif ($service -eq "itch") { - Release-Itch -config:$config -variant:$variantConfig -sourcefolder:$sourcedir -version:$version -dryrun:$dryrun - } else { - throw "Unknown release service: $service" + if (-not (Test-Path $sourcedir -PathType Container)) { + Write-Error "Release folder $sourcedir does not exist, skipping" + $hasErrors = $true + continue } + + # Find service(s) + if ($services) { + # Release to a subset of allowed services + $servicesFound = $services | Where-Object {$variantConfig.ReleaseTo -contains $_ } + if ($servicesFound.Count -ne $services.Count) { + $unmatchedServices = $services | Where-Object { $servicesFound -notcontains $_ } + Write-Warning "Services(s) not supported by $($variantConfig.Name): $($unmatchedServices -join ", ")" + } + } else { + $servicesFound = $variantConfig.ReleaseTo + } + + if (-not $servicesFound) { + Write-Verbose "Skipping $($variantConfig.Name), no matching release services" + continue + } + + Write-Output "" + Write-Output "Variant : $($variantConfig.Name)" + Write-Output "Source Folder : $sourcedir" + Write-Output "Service(s) : $($servicesFound -join ", ")" + Write-Output "" + + + foreach ($service in $servicesFound) { + if ($service -eq "steam") { + Release-Steam -config:$config -variant:$variantConfig -sourcefolder:$sourcedir -version:$version -dryrun:$dryrun + } elseif ($service -eq "itch") { + Release-Itch -config:$config -variant:$variantConfig -sourcefolder:$sourcedir -version:$version -dryrun:$dryrun + } else { + throw "Unknown release service: $service" + } + } + + } + + if ($hasErrors) { + throw "Errors occurred, see above" } } catch {