From 6030d100692326d129369063d1ab021d00021f30 Mon Sep 17 00:00:00 2001 From: Shahovalov MIkhail Date: Wed, 8 Apr 2026 00:49:44 +0300 Subject: [PATCH] Move packaging logic into scripts and fix release metadata --- .gitea/workflows/build.yml | 80 +-------------------------- .gitignore | 2 + scripts/build.ps1 | 109 ++++++++++++++++++++++++++++++++++++- scripts/build.sh | 2 +- 4 files changed, 110 insertions(+), 83 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index b65b0d7..016e6cf 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -68,24 +68,6 @@ jobs: - name: Build .pak run: | $ErrorActionPreference = "Stop" - $workspace = "${{ gitea.workspace }}" - $refName = "${{ gitea.ref_name }}" - $archiveBaseName = "DnD 5.5e AIO Russian" - $modName = "DnD 5.5e All-in-One BEYOND Russian Localization" - $modFolder = "DnD 5.5e AIO Russian" - $modUuid = "6401e84d-daf2-416d-adeb-99c03a2487a6" - $modDescription = "Russian Localization" - $modAuthor = "MikhailRaw" - $modVersion64 = "36028797018963968" - $modGroup = "6401e84d-daf2-416d-adeb-99c03a2487a6" - if ($refName -and $refName -like "v*") { - $archiveBaseName = "DnD 5.5e AIO Russian $refName" - } - $stagingPath = [System.IO.Path]::GetFullPath((Join-Path $workspace ".build-stage")) - $packagePath = [System.IO.Path]::GetFullPath((Join-Path $workspace "build/DnD 5.5e AIO Russian.pak")) - $tempPackagePath = [System.IO.Path]::GetFullPath((Join-Path $env:TEMP "DnD 5.5e AIO Russian.pak")) - $zipPath = [System.IO.Path]::GetFullPath((Join-Path $workspace "build/$archiveBaseName.zip")) - $infoJsonPath = [System.IO.Path]::GetFullPath((Join-Path $workspace "build/info.json")) $divine = Get-ChildItem -Path ".tools/lslib" -Recurse -File | Where-Object { $_.Name -ieq "Divine.exe" } | Select-Object -First 1 @@ -94,67 +76,7 @@ jobs: throw "Divine.exe was not found in the downloaded LSLib release." } - if (Test-Path -LiteralPath $stagingPath) { - Remove-Item -LiteralPath $stagingPath -Recurse -Force - } - if (Test-Path -LiteralPath $tempPackagePath) { - Remove-Item -LiteralPath $tempPackagePath -Force - } - if (Test-Path -LiteralPath $packagePath) { - Remove-Item -LiteralPath $packagePath -Force - } - - New-Item -ItemType Directory -Path $stagingPath | Out-Null - Copy-Item -LiteralPath (Join-Path $workspace "Mods") -Destination $stagingPath -Recurse - - & $divine.FullName -a create-package -g bg3 -s $stagingPath -d $tempPackagePath - - if (-not (Test-Path -LiteralPath $tempPackagePath)) { - throw "Temporary package was not created." - } - - Move-Item -LiteralPath $tempPackagePath -Destination $packagePath - - if (-not (Test-Path -LiteralPath "build/DnD 5.5e AIO Russian.pak")) { - throw "Package was not created." - } - - $packageFile = Get-Item -LiteralPath $packagePath - if ($packageFile.Length -lt 1024) { - throw "Package looks invalid: '$packagePath' is only $($packageFile.Length) bytes." - } - - if (Test-Path -LiteralPath $zipPath) { - Remove-Item -LiteralPath $zipPath -Force - } - - $packageMd5 = (Get-FileHash -LiteralPath $packagePath -Algorithm MD5).Hash.ToLowerInvariant() - $createdAt = (Get-Date).ToString("o") - - $infoJson = [ordered]@{ - Mods = @( - [ordered]@{ - Author = $modAuthor - Name = $modName - Folder = $modFolder - Version = $modVersion64 - Description = $modDescription - UUID = $modUuid - Created = $createdAt - Dependencies = @() - Group = $modGroup - } - ) - MD5 = $packageMd5 - } | ConvertTo-Json -Depth 4 - - Set-Content -LiteralPath $infoJsonPath -Value $infoJson -Encoding utf8 - - Compress-Archive -LiteralPath @($packagePath, $infoJsonPath) -DestinationPath $zipPath -CompressionLevel Optimal - - if (-not (Test-Path -LiteralPath $zipPath)) { - throw "ZIP archive was not created." - } + & ".\\scripts\\build.ps1" -DivinePath $divine.FullName -Workspace "${{ gitea.workspace }}" -VersionTag "${{ gitea.ref_name }}" - name: Show build result run: | diff --git a/.gitignore b/.gitignore index 60ca4a9..c534fa2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ build/ +build-stage* +.tools/ *.pak *.tmp *.temp diff --git a/scripts/build.ps1 b/scripts/build.ps1 index 6228123..a44a991 100644 --- a/scripts/build.ps1 +++ b/scripts/build.ps1 @@ -1,7 +1,110 @@ +param( + [string]$DivinePath = "Divine", + [string]$Workspace = (Get-Location).Path, + [string]$VersionTag = "", + [string]$ModFolder = "DnD 5.5e AIO Russian", + [string]$PackageName = "DnD 5.5e AIO Russian.pak", + [string]$ArchiveBaseName = "DnD 5.5e AIO Russian", + [string]$ModName = "DnD 5.5e All-in-One BEYOND Russian Localization", + [string]$ModUuid = "6401e84d-daf2-416d-adeb-99c03a2487a6", + [string]$ModAuthor = "MikhailRaw", + [string]$ModDescription = "Russian Localization", + [string]$ModVersion64 = "36028797018963968", + [string]$ModGroup = "6401e84d-daf2-416d-adeb-99c03a2487a6", + [string]$DependencyUuid = "897914ef-5c96-053c-44af-0be823f895fe", + [string]$DependencyVersion64 = "36028797018963968" +) + $ErrorActionPreference = "Stop" -if (-not (Test-Path -LiteralPath "build")) { - New-Item -ItemType Directory -Path "build" | Out-Null +$workspacePath = [System.IO.Path]::GetFullPath($Workspace) +$modsPath = Join-Path $workspacePath "Mods" +$modPath = Join-Path $modsPath $ModFolder +$buildPath = Join-Path $workspacePath "build" +$stagingPath = Join-Path $workspacePath "build-stage" +$packagePath = Join-Path $buildPath $PackageName +$tempPackagePath = Join-Path $env:TEMP $PackageName +$archiveName = $ArchiveBaseName +if ($VersionTag) { + $archiveName = "$ArchiveBaseName $VersionTag" +} +$zipPath = Join-Path $buildPath "$archiveName.zip" +$infoJsonPath = Join-Path $buildPath "info.json" + +if (-not (Test-Path -LiteralPath $DivinePath)) { + $resolvedCommand = Get-Command $DivinePath -ErrorAction SilentlyContinue + if (-not $resolvedCommand) { + throw "Divine executable was not found: '$DivinePath'." + } + $DivinePath = $resolvedCommand.Source } -Divine -a pack -s Mods -d "build/DnD 5.5e AIO Russian.pak" +if (-not (Test-Path -LiteralPath $modPath)) { + throw "Mod folder was not found: '$modPath'." +} + +if (-not (Test-Path -LiteralPath (Join-Path $modPath "Localization\\Russian\\russian.xml"))) { + throw "Localization file was not found under '$modPath'." +} + +New-Item -ItemType Directory -Path $buildPath -Force | Out-Null + +foreach ($path in @($stagingPath, $tempPackagePath, $packagePath, $zipPath, $infoJsonPath)) { + if (Test-Path -LiteralPath $path) { + if ((Get-Item -LiteralPath $path).PSIsContainer) { + Remove-Item -LiteralPath $path -Recurse -Force + } else { + Remove-Item -LiteralPath $path -Force + } + } +} + +New-Item -ItemType Directory -Path $stagingPath | Out-Null +Copy-Item -LiteralPath $modsPath -Destination $stagingPath -Recurse + +& $DivinePath -a create-package -g bg3 -s $stagingPath -d $tempPackagePath + +if (-not (Test-Path -LiteralPath $tempPackagePath)) { + throw "Temporary package was not created." +} + +Move-Item -LiteralPath $tempPackagePath -Destination $packagePath + +if (-not (Test-Path -LiteralPath $packagePath)) { + throw "Package was not created." +} + +$packageFile = Get-Item -LiteralPath $packagePath +if ($packageFile.Length -lt 1024) { + throw "Package looks invalid: '$packagePath' is only $($packageFile.Length) bytes." +} + +$packageMd5 = (Get-FileHash -LiteralPath $packagePath -Algorithm MD5).Hash.ToLowerInvariant() +$createdAt = (Get-Date).ToString("o") + +$infoJson = [ordered]@{ + Mods = @( + [ordered]@{ + Author = $ModAuthor + Name = $ModName + Folder = $ModFolder + Version = $ModVersion64 + Description = $ModDescription + UUID = $ModUuid + Created = $createdAt + Dependencies = @($DependencyUuid) + Group = $ModGroup + } + ) + MD5 = $packageMd5 +} | ConvertTo-Json -Depth 4 + +Set-Content -LiteralPath $infoJsonPath -Value $infoJson -Encoding utf8 +Compress-Archive -LiteralPath @($packagePath, $infoJsonPath) -DestinationPath $zipPath -CompressionLevel Optimal + +if (-not (Test-Path -LiteralPath $zipPath)) { + throw "ZIP archive was not created." +} + +Get-ChildItem -LiteralPath $packagePath, $infoJsonPath, $zipPath | + Select-Object FullName, Length, LastWriteTime diff --git a/scripts/build.sh b/scripts/build.sh index e114c51..e088759 100644 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -2,4 +2,4 @@ set -euo pipefail mkdir -p build -Divine -a pack -s Mods -d "build/DnD 5.5e AIO Russian.pak" +Divine -a create-package -g bg3 -s Mods -d "build/DnD 5.5e AIO Russian.pak"