UEScripts/inc/projectversion.ps1

157 lines
5.0 KiB
PowerShell

Import-Module PsIni
function Get-Project-Version-Ini-Filename {
param (
[string]$srcfolder
)
return Join-Path $srcfolder "Config/DefaultGame.ini" -Resolve
}
function Get-Project-Version {
param (
[string]$srcfolder
)
$file = Get-Project-Version-Ini-Filename $srcfolder
$gameIni = Get-IniContent $file
return $gameIni["/Script/EngineSettings.GeneralProjectSettings"].ProjectVersion
}
function Get-ProjectVersionComponents {
param (
[string]$srcfolder
)
$versionString = Get-Project-Version $srcfolder
# Regex features:
# - Can read 2-4 version components but will pad with 0s up to 4 when writing
# - captures pre- and post-fix text and retains
$regex = "([^\d]*)(\d+)\.(\d+)(?:\.(\d+))?(?:\.(\d+))?(.*)"
$matches = $versionString | Select-String -Pattern $regex
# 1 = prefix
# 2-5 = version number components
# 6 = postfix
if (($matches.Matches.Count -gt 0) -and ($matches.Matches[0].Groups.Count -eq 7)) {
$prefix = $matches.Matches[0].Groups[1].Value
$postfix = $matches.Matches[0].Groups[6].Value
$intversions = $matches.Matches[0].Groups[2..5] | ForEach-Object {
if ($_.Value -ne "") {
[int]$_.Value
} else {
# We fill in the version numbers to 4 digits always
0
}
}
return New-Object PsObject -Property @{prefix=$prefix ; postfix=$postfix; digits=$intversions}
} else {
return New-Object PsObject -Property @{prefix="" ; postfix=""; digits=@(1,0,0,0)}
}
}
function Write-ProjectVersionFromObject {
param (
[string]$srcfolder,
[object]$versionObj,
[bool]$dryrun = $false
)
$newver = "$($versionObj.prefix)$($versionObj.digits[0]).$($versionObj.digits[1]).$($versionObj.digits[2]).$($versionObj.digits[3])$($versionObj.postfix)"
Write-Project-Version -srcfolder:$srcfolder -newversion:$newver -dryrun:$dryrun
}
function Write-Project-Version {
param (
[string]$srcfolder,
[string]$newversion,
[bool]$dryrun = $false
)
$gameIniFile = Get-Project-Version-Ini-Filename $srcfolder
if ($dryrun) {
Write-Verbose "[version] dryrun: would have set $gameIniFile version: $newversion"
} else {
# We don't use PsIni to write, because it can screw up some nested non-trivial properties :(
#$gameIni["/Script/EngineSettings.GeneralProjectSettings"].ProjectVersion = $newver
#Out-IniFile -Force -InputObject $gameIni -FilePath $gameIniFile
$verlineregex = "ProjectVersion=.*"
$matches = Select-String -Path "$gameIniFile" -Pattern $verlineregex
if ($matches.Matches.Count -gt 0) {
$origline = $matches.Matches[0].Value
$newline = "ProjectVersion=$newversion"
(Get-Content "$gameIniFile").replace($origline, $newline) | Set-Content "$gameIniFile"
Write-Verbose "[version++] Success! Version is now $newversion"
} else {
throw "[version++] Error: unable to substitute current version, unable to find '$verlineregex'"
}
}
}
function Increment-Project-Version {
param (
[string]$srcfolder,
[bool]$major,
[bool]$minor,
[bool]$patch,
[bool]$hotfix,
[bool]$dryrun = $false
)
if (($major + $minor + $patch + $hotfix) -gt 1) {
throw "Can't set more than one of major/minor/patch/hotfix at the same time!"
}
$versionobj = Get-ProjectVersionComponents $srcfolder
$gameIniFile = Get-Project-Version-Ini-Filename $srcfolder
Write-Verbose "[version++] M:$major m:$minor p:$patch h:$hotfix"
# We have to use Write-Verbose now that we're using the return value, Write-Output
# appends to the return value. Write-Verbose works but doesn't appear by default
# Unless user sets $VerbosePreference="Continue"
# Bump the version number of the build
Write-Verbose "[inc_version] Updating $gameIniFile"
Write-Verbose "[version++] Current version is $($versionObj.digits[0]).$($versionObj.digits[1]).$($versionObj.digits[2]).$($versionObj.digits[3])"
$versionDigit = 2;
if ($major) {
$versionDigit = 0
} elseif ($minor) {
$versionDigit = 1
} elseif ($patch) {
$versionDigit = 2
} elseif ($hotfix) {
$versionDigit = 3
}
# increment then zero anything after
$versionObj.digits[$versionDigit]++
for ($d = $versionDigit + 1; $d -lt $versionObj.digits.Length; $d++) {
$versionObj.digits[$d] = 0
}
$newver = "$($versionObj.prefix)$($versionObj.digits[0]).$($versionObj.digits[1]).$($versionObj.digits[2]).$($versionObj.digits[3])$($versionObj.postfix)"
Write-Verbose "[version++] Bumping version to $newver"
Write-Project-Version -srcfolder:$srcfolder -newversion:$newver -dryrun:$dryrun
return "$newver"
}