diff --git a/Bump-Version.ps1 b/Bump-Version.ps1 new file mode 100644 index 0000000..756fa22 --- /dev/null +++ b/Bump-Version.ps1 @@ -0,0 +1,161 @@ +################################################## +## ____ ___ ____ _____ _ _ _____ _____ ## +## / ___/ _ \| _ \| ____| | \ | | ____|_ _| ## +## | | | | | | |_) | _| | \| | _| | | ## +## | |__| |_| | _ <| |___ _| |\ | |___ | | ## +## \____\__\_\_| \_\_____(_)_| \_|_____| |_| ## +## Move fast and fix things. ## +################################################## +## Project: Elysium ## +## File: Bump-Version.ps1 ## +## Version: 2.2.1 ## +## Support: support@cqre.net ## +################################################## + +#Requires -Version 5.1 +$ErrorActionPreference = 'Stop' +Set-StrictMode -Version Latest + +<# +.SYNOPSIS + Bumps the unified Elysium version across all project files. + +.DESCRIPTION + Updates the centralized $ElysiumVersion variable, ASCII headers in all + operational scripts, the settings template, and runtime references + (User-Agent, usage beacon, etc.). Optionally stubs a new CHANGELOG entry. + +.PARAMETER NewVersion + The new version string to apply (e.g. 2.2.2). + +.PARAMETER SkipChangelog + Do not print a CHANGELOG entry stub. + +.EXAMPLE + .\Bump-Version.ps1 -NewVersion 2.2.2 +#> +param( + [Parameter(Mandatory = $true)] + [string]$NewVersion, + + [switch]$SkipChangelog +) + +$scriptRoot = $PSScriptRoot +if (-not $scriptRoot) { $scriptRoot = (Get-Location).Path } + +# --------------------------------------------------------------------------- +# Validate input +# --------------------------------------------------------------------------- +if ($NewVersion -notmatch '^\d+\.\d+\.\d+$') { + throw "Version must be in semantic format X.Y.Z (e.g. 2.2.2). Got: '$NewVersion'" +} + +# --------------------------------------------------------------------------- +# Determine current version from Elysium.Common.ps1 +# --------------------------------------------------------------------------- +$commonPath = Join-Path -Path $scriptRoot -ChildPath 'Elysium.Common.ps1' +if (-not (Test-Path -LiteralPath $commonPath)) { + throw "Elysium.Common.ps1 not found at $commonPath" +} + +$commonContent = Get-Content -LiteralPath $commonPath -Raw +$currentVersionMatch = [regex]::Match($commonContent, "\`$script:ElysiumVersion\s*=\s*'([^']+)'") +if (-not $currentVersionMatch.Success) { + throw "Could not determine current version from Elysium.Common.ps1" +} +$oldVersion = $currentVersionMatch.Groups[1].Value + +if ($oldVersion -eq $NewVersion) { + Write-Warning "Current version is already $NewVersion. Nothing to do." + return +} + +Write-Host "Bumping Elysium from $oldVersion -> $NewVersion" + +# --------------------------------------------------------------------------- +# Helper: replace in file +# --------------------------------------------------------------------------- +function Edit-FileVersion { + param( + [string]$Path, + [string]$Old, + [string]$New + ) + $content = Get-Content -LiteralPath $Path -Raw + $newContent = $content.Replace($Old, $New) + if ($newContent -eq $content) { + Write-Verbose " No changes in $(Split-Path -Leaf $Path)" + } else { + Set-Content -LiteralPath $Path -Value $newContent -NoNewline -Encoding UTF8 + Write-Host " Updated $(Split-Path -Leaf $Path)" + } +} + +# --------------------------------------------------------------------------- +# 1. Central version variable +# --------------------------------------------------------------------------- +Write-Host "`n[1/4] Updating centralized version variable..." +Edit-FileVersion -Path $commonPath -Old "`$script:ElysiumVersion = '$oldVersion'" -New "`$script:ElysiumVersion = '$NewVersion'" + +# --------------------------------------------------------------------------- +# 2. ASCII headers in scripts and templates +# --------------------------------------------------------------------------- +Write-Host "`n[2/4] Updating script headers..." +$headerTargets = Get-ChildItem -Path $scriptRoot -File | Where-Object { + $_.Extension -in @('.ps1', '.py') -or $_.Name -eq 'ElysiumSettings.txt.sample' +} +foreach ($file in $headerTargets) { + $content = Get-Content -LiteralPath $file.FullName -Raw + # The header pattern: ## Version: X.Y.Z ## + $pattern = "## Version:\s+$([regex]::Escape($oldVersion))\s+##" + $replacement = "## Version: $NewVersion ##" + $newContent = [regex]::Replace($content, $pattern, $replacement) + if ($newContent -ne $content) { + Set-Content -LiteralPath $file.FullName -Value $newContent -NoNewline -Encoding UTF8 + Write-Host " Updated $($file.Name)" + } +} + +# --------------------------------------------------------------------------- +# 3. Runtime references (safety net) +# --------------------------------------------------------------------------- +Write-Host "`n[3/4] Updating runtime version references..." +$runtimeTargets = Get-ChildItem -Path $scriptRoot -Filter '*.ps1' -File +foreach ($file in $runtimeTargets) { + $content = Get-Content -LiteralPath $file.FullName -Raw + $newContent = $content + # User-Agent patterns: 'Elysium/2.2.1 (+...)' or "Elysium/2.2.1 (+...)" + $newContent = [regex]::Replace($newContent, + "Elysium/$([regex]::Escape($oldVersion))", + "Elysium/$NewVersion") + # Literal string assignments: version = '2.2.1' + $newContent = [regex]::Replace($newContent, + "version\s*=\s*'$([regex]::Escape($oldVersion))'", + "version = '$NewVersion'") + if ($newContent -ne $content) { + Set-Content -LiteralPath $file.FullName -Value $newContent -NoNewline -Encoding UTF8 + Write-Host " Updated runtime refs in $($file.Name)" + } +} + +# --------------------------------------------------------------------------- +# 4. CHANGELOG stub +# --------------------------------------------------------------------------- +if (-not $SkipChangelog) { + Write-Host "`n[4/4] CHANGELOG entry stub (copy-paste ready):" + $today = (Get-Date).ToString('yyyy-MM-dd') + $stub = @" + +--- + +## [$NewVersion] — $today + +### Changed +- (describe your change here) +"@ + Write-Host $stub + Write-Host "`nAppend the above to CHANGELOG.md, then commit and tag." +} + +Write-Host "`nDone. Review the changes with: git diff --stat" diff --git a/Elysium.Common.ps1 b/Elysium.Common.ps1 index f094d86..e9f4cae 100644 --- a/Elysium.Common.ps1 +++ b/Elysium.Common.ps1 @@ -1,3 +1,5 @@ +$script:ElysiumVersion = '2.2.1' + function Invoke-RestartWithExecutable { param( [string]$ExecutablePath, diff --git a/Test-WeakADPasswords.ps1 b/Test-WeakADPasswords.ps1 index ed8ccd7..07406d9 100644 --- a/Test-WeakADPasswords.ps1 +++ b/Test-WeakADPasswords.ps1 @@ -95,7 +95,7 @@ function Invoke-UsageBeacon { if ($normalizedMethod -in @('POST', 'PUT')) { $payload = [ordered]@{ script = 'Test-WeakADPasswords' - version = '2.2.1' + version = $ElysiumVersion ranAtUtc = (Get-Date).ToUniversalTime().ToString('o') } if (-not [string]::IsNullOrWhiteSpace($InstanceId)) { diff --git a/Update-KHDB.ps1 b/Update-KHDB.ps1 index 1afdf0e..1064cd5 100644 --- a/Update-KHDB.ps1 +++ b/Update-KHDB.ps1 @@ -61,7 +61,7 @@ function New-HttpClient { Add-Type -AssemblyName System.Net.Http -ErrorAction SilentlyContinue $client = [System.Net.Http.HttpClient]::new() $client.Timeout = [TimeSpan]::FromSeconds(600) - $client.DefaultRequestHeaders.UserAgent.ParseAdd('Elysium/2.2.1 (+Update-KHDB)') + $client.DefaultRequestHeaders.UserAgent.ParseAdd("Elysium/$ElysiumVersion (+Update-KHDB)") return $client }