124 lines
3.3 KiB
PowerShell
124 lines
3.3 KiB
PowerShell
# Hudra release builder
|
|
# Reads the version from manifest.json, creates a clean release folder,
|
|
# and produces a Chrome Web Store-ready ZIP.
|
|
|
|
$ErrorActionPreference = "Stop"
|
|
|
|
# Project locations
|
|
$ProjectRoot = $PSScriptRoot
|
|
$ManifestPath = Join-Path $ProjectRoot "manifest.json"
|
|
$ReleaseRoot = Join-Path $ProjectRoot "release"
|
|
|
|
# Check that manifest.json exists
|
|
if (-not (Test-Path $ManifestPath)) {
|
|
Write-Host "ERROR: manifest.json was not found." -ForegroundColor Red
|
|
Write-Host "Place release.ps1 in the same folder as manifest.json."
|
|
exit 1
|
|
}
|
|
|
|
# Read extension name and version
|
|
try {
|
|
$Manifest = Get-Content $ManifestPath -Raw | ConvertFrom-Json
|
|
}
|
|
catch {
|
|
Write-Host "ERROR: manifest.json is not valid JSON." -ForegroundColor Red
|
|
exit 1
|
|
}
|
|
|
|
$ExtensionName = $Manifest.name
|
|
$Version = $Manifest.version
|
|
|
|
if ([string]::IsNullOrWhiteSpace($ExtensionName)) {
|
|
$ExtensionName = "Hudra"
|
|
}
|
|
|
|
if ([string]::IsNullOrWhiteSpace($Version)) {
|
|
Write-Host "ERROR: No version was found in manifest.json." -ForegroundColor Red
|
|
exit 1
|
|
}
|
|
|
|
$SafeName = $ExtensionName -replace '[^a-zA-Z0-9_-]', '-'
|
|
$ReleaseName = "$SafeName-v$Version"
|
|
|
|
$StagingFolder = Join-Path $ReleaseRoot $ReleaseName
|
|
$ZipPath = Join-Path $ReleaseRoot "$ReleaseName.zip"
|
|
|
|
Write-Host ""
|
|
Write-Host "Building $ExtensionName $Version..." -ForegroundColor Cyan
|
|
Write-Host ""
|
|
|
|
# Files and folders that should not be included in the extension ZIP
|
|
$ExcludedItems = @(
|
|
".git",
|
|
".github",
|
|
".gitea",
|
|
".vscode",
|
|
"docs",
|
|
"release",
|
|
"node_modules",
|
|
".gitignore",
|
|
"README.md",
|
|
"ROADMAP.md",
|
|
"CONTRIBUTING.md",
|
|
"LICENSE",
|
|
"release.ps1"
|
|
)
|
|
|
|
# Recreate the staging folder
|
|
if (Test-Path $StagingFolder) {
|
|
Remove-Item $StagingFolder -Recurse -Force
|
|
}
|
|
|
|
New-Item -ItemType Directory -Path $StagingFolder -Force | Out-Null
|
|
|
|
# Copy extension files into the clean staging folder
|
|
Get-ChildItem -Path $ProjectRoot -Force | ForEach-Object {
|
|
if ($ExcludedItems -notcontains $_.Name) {
|
|
Copy-Item `
|
|
-Path $_.FullName `
|
|
-Destination $StagingFolder `
|
|
-Recurse `
|
|
-Force
|
|
}
|
|
}
|
|
|
|
# Confirm that the copied release contains manifest.json
|
|
$CopiedManifest = Join-Path $StagingFolder "manifest.json"
|
|
|
|
if (-not (Test-Path $CopiedManifest)) {
|
|
Write-Host "ERROR: manifest.json was not copied into the release folder." -ForegroundColor Red
|
|
exit 1
|
|
}
|
|
|
|
# Remove any previous ZIP for this version
|
|
if (Test-Path $ZipPath) {
|
|
Remove-Item $ZipPath -Force
|
|
}
|
|
|
|
# ZIP the contents, ensuring manifest.json is at the ZIP root
|
|
$FilesToZip = Join-Path $StagingFolder "*"
|
|
Compress-Archive `
|
|
-Path $FilesToZip `
|
|
-DestinationPath $ZipPath `
|
|
-CompressionLevel Optimal `
|
|
-Force
|
|
|
|
# Verify the ZIP was created
|
|
if (-not (Test-Path $ZipPath)) {
|
|
Write-Host "ERROR: The release ZIP could not be created." -ForegroundColor Red
|
|
exit 1
|
|
}
|
|
|
|
$ZipSize = [math]::Round((Get-Item $ZipPath).Length / 1KB, 1)
|
|
|
|
Write-Host "Release created successfully!" -ForegroundColor Green
|
|
Write-Host ""
|
|
Write-Host "Release folder:"
|
|
Write-Host " $StagingFolder" -ForegroundColor Yellow
|
|
Write-Host ""
|
|
Write-Host "ZIP file:"
|
|
Write-Host " $ZipPath" -ForegroundColor Yellow
|
|
Write-Host ""
|
|
Write-Host "ZIP size: $ZipSize KB"
|
|
Write-Host ""
|
|
Write-Host "Ready for Gitea and the Chrome Web Store." -ForegroundColor Green |