chore: add VERSION file and Bump-Version.ps1 script

Single source of truth for version numbers. Bump-Version.ps1 replaces
the old version across all 61 files (113 occurrences) automatically.
CHANGELOG.md is excluded to preserve historical entries.

Usage:
  .\Tools\Bump-Version.ps1 -NewVersion "2.2.4" -DryRun  # preview
  .\Tools\Bump-Version.ps1 -NewVersion "2.2.4"           # apply

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nexus 2026-03-24 20:10:42 +01:00
parent 6192753a7a
commit 10af4b34bd
2 changed files with 161 additions and 0 deletions

160
Tools/Bump-Version.ps1 Normal file
View file

@ -0,0 +1,160 @@
#Requires -Version 5.1
<#
.SYNOPSIS
Bump version number across all project files
.DESCRIPTION
Reads the current version from the VERSION file, replaces it with the new
version in all project files, and updates the VERSION file.
CHANGELOG.md is excluded because it contains historical version entries
that must not be modified.
.PARAMETER NewVersion
The new version number (e.g., "2.2.4")
.PARAMETER DryRun
Preview changes without modifying any files
.EXAMPLE
.\Bump-Version.ps1 -NewVersion "2.2.4"
Bump all files from current version to 2.2.4
.EXAMPLE
.\Bump-Version.ps1 -NewVersion "2.2.4" -DryRun
Preview what would change without modifying files
.NOTES
Author: NexusOne23
The VERSION file at the project root is the single source of truth.
#>
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)]
[ValidatePattern('^\d+\.\d+\.\d+$')]
[string]$NewVersion,
[switch]$DryRun
)
$ErrorActionPreference = 'Stop'
# Resolve project root (one level up from Tools/)
$projectRoot = Split-Path $PSScriptRoot -Parent
$versionFile = Join-Path $projectRoot "VERSION"
# Read current version
if (-not (Test-Path $versionFile)) {
Write-Host "ERROR: VERSION file not found at: $versionFile" -ForegroundColor Red
exit 1
}
$oldVersion = (Get-Content $versionFile -Raw).Trim()
if (-not ($oldVersion -match '^\d+\.\d+\.\d+$')) {
Write-Host "ERROR: Invalid version in VERSION file: '$oldVersion'" -ForegroundColor Red
exit 1
}
if ($oldVersion -eq $NewVersion) {
Write-Host "ERROR: New version ($NewVersion) is identical to current version ($oldVersion)" -ForegroundColor Red
exit 1
}
# File extensions to process
$extensions = @("*.ps1", "*.psm1", "*.psd1", "*.json", "*.md", "*.bat", "*.yml")
# Files to exclude (relative to project root)
$excludedFiles = @("CHANGELOG.md")
Write-Host ""
Write-Host "========================================" -ForegroundColor Cyan
Write-Host " NoID Privacy Version Bump" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan
Write-Host ""
Write-Host " Current version: $oldVersion" -ForegroundColor White
Write-Host " New version: $NewVersion" -ForegroundColor Green
Write-Host ""
if ($DryRun) {
Write-Host " [DRY RUN - No files will be modified]" -ForegroundColor Yellow
Write-Host ""
}
# Collect all matching files
$allFiles = @()
foreach ($ext in $extensions) {
$allFiles += Get-ChildItem -Path $projectRoot -Filter $ext -Recurse -File |
Where-Object { $_.FullName -notmatch '[\\/]\.git[\\/]' }
}
# Process files
$changedFiles = 0
$totalReplacements = 0
foreach ($file in $allFiles) {
$relativePath = $file.FullName.Substring($projectRoot.Length + 1)
# Check exclusion list
$isExcluded = $false
foreach ($excluded in $excludedFiles) {
if ($relativePath -eq $excluded) {
$isExcluded = $true
break
}
}
if ($isExcluded) {
Write-Host " [SKIP] $relativePath (excluded)" -ForegroundColor DarkGray
continue
}
# Read file content
$content = Get-Content $file.FullName -Raw -Encoding UTF8
# Count occurrences
$count = ([regex]::Matches($content, [regex]::Escape($oldVersion))).Count
if ($count -gt 0) {
$changedFiles++
$totalReplacements += $count
Write-Host " [BUMP] $relativePath ($count replacement$(if ($count -gt 1) {'s'}))" -ForegroundColor Green
if (-not $DryRun) {
$newContent = $content.Replace($oldVersion, $NewVersion)
[System.IO.File]::WriteAllText($file.FullName, $newContent, [System.Text.UTF8Encoding]::new($false))
}
}
}
# Update VERSION file
if (-not $DryRun) {
[System.IO.File]::WriteAllText($versionFile, "$NewVersion`n", [System.Text.UTF8Encoding]::new($false))
}
# Summary
Write-Host ""
Write-Host "========================================" -ForegroundColor Cyan
Write-Host " Summary" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan
Write-Host ""
Write-Host " Files changed: $changedFiles" -ForegroundColor White
Write-Host " Total replacements: $totalReplacements" -ForegroundColor White
Write-Host ""
if ($DryRun) {
Write-Host " DRY RUN complete. No files were modified." -ForegroundColor Yellow
Write-Host " Run without -DryRun to apply changes." -ForegroundColor Yellow
}
else {
Write-Host " Version bumped: $oldVersion -> $NewVersion" -ForegroundColor Green
Write-Host ""
Write-Host " Next steps:" -ForegroundColor White
Write-Host " 1. Update CHANGELOG.md with new version section" -ForegroundColor Gray
Write-Host " 2. Review changes: git diff" -ForegroundColor Gray
Write-Host " 3. Commit: git add -A && git commit -m 'chore: bump version to $NewVersion'" -ForegroundColor Gray
}
Write-Host ""

1
VERSION Normal file
View file

@ -0,0 +1 @@
2.2.3