From 44b52efb3e2f48139dd72f928f67a882fa0b77ed Mon Sep 17 00:00:00 2001 From: Bruno Lopes Date: Sun, 22 Mar 2026 15:50:14 -0300 Subject: [PATCH] Revert "build/windows: Evaluate INNO_PATH to the highest versioned Inno" This reverts commit 37dd5755aa7bbfbf38ba187f2df8182f65ffc75f. I think the line breaking or other thing changed. This is wrong. --- build/windows/installer/3_dist-gimp-inno.ps1 | 494 +++++++++---------- 1 file changed, 247 insertions(+), 247 deletions(-) diff --git a/build/windows/installer/3_dist-gimp-inno.ps1 b/build/windows/installer/3_dist-gimp-inno.ps1 index cace5b26e2..d332c4b9a7 100644 --- a/build/windows/installer/3_dist-gimp-inno.ps1 +++ b/build/windows/installer/3_dist-gimp-inno.ps1 @@ -1,247 +1,247 @@ -#!/usr/bin/env pwsh - -# Parameters -param ($revision = "$GIMP_CI_WIN_INSTALLER", - $BUILD_DIR, - $ARM64_BUNDLE = "$PWD\gimp-clangarm64", - $X64_BUNDLE = "$PWD\gimp-clang64") - -# Ensure the script work properly -$ErrorActionPreference = 'Stop' -$PSNativeCommandUseErrorActionPreference = $false #to ensure error catching as in pre-7.4 PS -if (-not (Test-Path build\windows\installer) -and -not (Test-Path 3_dist-gimp-inno.ps1 -Type Leaf) -or $PSScriptRoot -notlike "*build\windows\installer*") - { - Write-Host '(ERROR): Script called from wrong dir. Please, call the script from gimp source.' -ForegroundColor Red - exit 1 - } -elseif (Test-Path 3_dist-gimp-inno.ps1 -Type Leaf) - { - Set-Location ..\..\.. - } - - -# 1. GET INNO -Write-Output "$([char]27)[0Ksection_start:$(Get-Date -UFormat %s -Millisecond 0):installer_tlkt$([char]13)$([char]27)[0KChecking Inno installation" -## Install or Update Inno (if needed) -## (We need to ensure that TLS 1.2 is enabled because of some runners) -[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 -Invoke-WebRequest "https://jrsoftware.org/download.php/is.exe" -UseBasicParsing -OutFile ..\is.exe -$inno_version_downloaded = (Get-Item ..\is.exe).VersionInfo.ProductVersion -replace ' ','' -$broken_inno = Get-ChildItem $env:TMP -Filter *.isl.bak -ErrorAction SilentlyContinue -$inno_version = Get-ItemProperty Registry::'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall\Inno Setup*' -ErrorAction SilentlyContinue | Select-Object -ExpandProperty DisplayVersion -if ("$broken_inno" -or "$inno_version" -ne "$inno_version_downloaded") - { - if ("$broken_inno") - { - Write-Output '(INFO): repairing Inno' - Remove-Item "$(Get-ItemProperty Registry::'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall\Inno Setup*' -ErrorAction SilentlyContinue | Select-Object -ExpandProperty InstallLocation)Languages" -Recurse -Force -ErrorAction SilentlyContinue - } - elseif ("$inno_version" -notlike "*.*") - { - Write-Output '(INFO): installing Inno' - } - else - { - Write-Output "(INFO): updating Inno from $inno_version to $inno_version_downloaded" - } - ..\is.exe /VERYSILENT /SUPPRESSMSGBOXES /CURRENTUSER /SP- #/LOG="..\innosetup.log" - Wait-Process is - } -Remove-Item ..\is.exe -$INNO_PATH = (Get-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\Inno Setup*" | Sort-Object { [version]($_.DisplayVersion -split '-')[0] } -Descending | Select-Object -First 1).InstallLocation -#$INNO_PATH = [regex]::Matches((Get-Content ..\innosetup.log | Select-String ISCC.exe), '(?<=filename: ).+?(?=\\ISCC.exe)').Value -Set-Alias iscc "$INNO_PATH\iscc.exe" - -## This script needs a bit of Python to work -if (-not (Get-Command "python" -ErrorAction SilentlyContinue) -or "$(Get-Command "python" -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Source)" -like '*WindowsApps*') - { - Invoke-Expression ((Get-Content build\windows\1_build-deps-msys2.ps1 | Select-String '-not \$env:MSYS_ROOT' -Context 0,12) -replace '> ','') - $env:PATH = "$env:MSYS_ROOT/$env:MSYSTEM_PREFIX/bin;$env:PATH" - } -Write-Output "(INFO): Installed Inno: $inno_version_downloaded | Installed Python: $((python --version) -replace '[^0-9.]', '')" -Write-Output "$([char]27)[0Ksection_end:$(Get-Date -UFormat %s -Millisecond 0):installer_tlkt$([char]13)$([char]27)[0K" - - -# 2. GET GLOBAL INFO -Write-Output "$([char]27)[0Ksection_start:$(Get-Date -UFormat %s -Millisecond 0):installer_info$([char]13)$([char]27)[0KGetting installer global info" -if (-not $BUILD_DIR) - { - $BUILD_DIR = Get-ChildItem _build* | Select-Object -First 1 - } -$CONFIG_PATH = "$BUILD_DIR\config.h" -if (-not (Test-Path "$CONFIG_PATH")) - { - Write-Host "(ERROR): config.h file not found. You can run 'build\windows\2_build-gimp-msys2.ps1' or configure GIMP to generate it.'" -ForegroundColor red - exit 1 - } -ForEach ($line in $(Select-String 'define' $CONFIG_PATH -AllMatches)) - { - Invoke-Expression $($line -replace '^.*#' -replace 'define ','$' -replace ' ','=') - } -#FIXME: Meson don't support C++ style comments. See: https://github.com/mesonbuild/meson/issues/14260 -$CLEANCONFIG_PATH ="$(Split-Path -Parent $CONFIG_PATH)\config_clean.h" -if (Test-Path $CLEANCONFIG_PATH) - { - Remove-Item $CLEANCONFIG_PATH -Force - } -(Get-Content $CONFIG_PATH -Raw) -replace '/\*[\s\S]*?\*/', '' | Set-Content $CLEANCONFIG_PATH - -## Get CUSTOM_GIMP_VERSION (GIMP version as we display for users in installer) -$CUSTOM_GIMP_VERSION = $GIMP_VERSION -if ($revision -notmatch '[1-9]' -or $CI_PIPELINE_SOURCE -eq 'schedule') - { - $revision = '0' - } -else - { - $CUSTOM_GIMP_VERSION = "$CUSTOM_GIMP_VERSION-$revision" - } -Write-Output "(INFO): GIMP version: $CUSTOM_GIMP_VERSION" - -## Autodetects what arch bundles will be packaged -# (The .iss script supports creating both an installer per arch or an universal installer with all arches) -if (-not (Test-Path "$ARM64_BUNDLE") -and -not (Test-Path "$X64_BUNDLE")) - { - Write-Host "(ERROR): No bundle found. You can tweak 'build/windows/2_build-gimp-msys2.ps1' or configure GIMP with '-Dwindows-installer=true' to make one." -ForegroundColor red - exit 1 - } -elseif ((Test-Path "$ARM64_BUNDLE") -and -not (Test-Path "$X64_BUNDLE")) - { - Write-Output "(INFO): Arch: arm64" - $supported_archs=@("-DARM64_BUNDLE=$ARM64_BUNDLE") - } -elseif (-not (Test-Path "$ARM64_BUNDLE") -and (Test-Path "$X64_BUNDLE")) - { - Write-Output "(INFO): Arch: x64" - $supported_archs=@("-DX64_BUNDLE=$X64_BUNDLE") - } -elseif ((Test-Path "$ARM64_BUNDLE") -and (Test-Path "$X64_BUNDLE")) - { - Write-Output "(INFO): Arch: arm64 and x64" - $supported_archs=@("-DARM64_BUNDLE=$ARM64_BUNDLE", "-DX64_BUNDLE=$X64_BUNDLE") - } -Write-Output "$([char]27)[0Ksection_end:$(Get-Date -UFormat %s -Millisecond 0):installer_info$([char]13)$([char]27)[0K" - - -# 3. PREPARE INSTALLER "SOURCE" -Write-Output "$([char]27)[0Ksection_start:$(Get-Date -UFormat %s -Millisecond 0):installer_source[collapsed=true]$([char]13)$([char]27)[0KMaking installer assets" -## Custom installer strings translations and other assets -## (They are loaded with 'iscc -DBUILD_DIR' on section 5.) -if (-not (Test-Path "$BUILD_DIR\build\windows\installer")) - { - Write-Host "(ERROR): Installer assets not found. You can tweak 'build\windows\2_build-gimp-msys2.ps1' or configure GIMP with '-Dwindows-installer=true' to build them." -ForegroundColor red - exit 1 - } - -## Inno installer strings translations -## NOTE: All the maintenance process is done only in 'iso_639_custom.xml' file -$xmlObject = New-Object XML -$xmlObject.Load("$PWD\build\windows\installer\lang\iso_639_custom.xml") -$langsArray_Official = $xmlObject.iso_639_entries.iso_639_entry | Select-Object -ExpandProperty inno_code | - Where-Object { $_ -like "*Languages*" } | Where-Object { $_ -notlike "*Unofficial*" } -$langsArray_unofficial = $xmlObject.iso_639_entries.iso_639_entry | Select-Object -ExpandProperty inno_code | - Where-Object { $_ -like "*Unofficial*" } -### Complete Inno source with not released translations: https://jrsoftware.org/files/istrans/ -function download_langs ([array]$langsArray) -{ - git clone --depth 1 https://github.com/jrsoftware/issrc.git "$env:TMP\issrc" - foreach ($langfile in $langsArray) - { - $langfilePath = "$INNO_PATH\$langfile" - if ($langfile -ne '' -and -not (Test-Path "$langfilePath" -Type Leaf)) - { - Write-Output "(INFO): temporarily installing $($langfilePath -replace '\\\\','\')" - New-Item $(Split-Path -Parent $langfilePath) -ItemType Directory -Force | Out-Null - Copy-Item "$env:TMP\issrc\Files\$langfile" "$langfilePath" -Force - } - } - Remove-Item "$env:TMP\issrc" -Recurse -Force -} -download_langs $langsArray_Official -download_langs $langsArray_unofficial -### Patch 'AppVer*' against Inno pervasive behavior: https://groups.google.com/g/innosetup/c/w0sebw5YAeg -function fix_msg ([array]$langsArray, [string]$AppVer) -{ - foreach ($langfile in $langsArray) - { - $langfilePath = "$INNO_PATH\$langfile" -replace '\\\\','\' - if ($AppVer -ne 'revert') - { - Copy-Item "$langfilePath" "$env:TMP\$(Split-Path $langfile -Leaf).bak" -Force - #Prefer Python since PowerShell/.NET doesn't handle well files with different encodings - python build\windows\installer\lang\fix_msg.py "$langfilePath" $AppVer - } - else #($AppVer -eq 'revert') - { - Move-Item "$env:TMP\$(Split-Path $langfile -Leaf).bak" "$langfilePath" -Force - } - } -} -fix_msg 'Default.isl' $CUSTOM_GIMP_VERSION -fix_msg $langsArray_Official $CUSTOM_GIMP_VERSION -fix_msg $langsArray_unofficial $CUSTOM_GIMP_VERSION -Write-Output "$([char]27)[0Ksection_end:$(Get-Date -UFormat %s -Millisecond 0):installer_source$([char]13)$([char]27)[0K" - - -# 4. PREPARE GIMP FILES -# (Most of the file processing and special-casing is done on *gimp3264.iss [Files] section. -# The resulting .exe installer content should be identical to the .msix and vice-versa) - - -# 5. COMPILE .EXE INSTALLER -$INSTALLER="gimp-${CUSTOM_GIMP_VERSION}-setup.exe" -Write-Output "$([char]27)[0Ksection_start:$(Get-Date -UFormat %s -Millisecond 0):installer_making[collapsed=true]$([char]13)$([char]27)[0KConstructing $INSTALLER installer" -iscc -DREVISION="$revision" -DBUILD_DIR="$BUILD_DIR" $supported_archs -DDEBUG_SYMBOLS -DPYTHON build\windows\installer\gimp-setup.iss | Out-Null; if ("$LASTEXITCODE" -gt '0') { exit 1 } -Write-Output "$([char]27)[0Ksection_end:$(Get-Date -UFormat %s -Millisecond 0):installer_making$([char]13)$([char]27)[0K" - -## Clean changes in Inno installation -fix_msg 'Default.isl' revert -fix_msg $langsArray_Official revert -fix_msg $langsArray_unofficial revert -## We delete only unofficial langs because the downloaded official ones will be kept by Inno updates -Remove-Item "$INNO_PATH\Languages\Unofficial" -Recurse -Force - - -# 6. GENERATE CHECKSUMS IN GNU FORMAT -Write-Output "$([char]27)[0Ksection_start:$(Get-Date -UFormat %s -Millisecond 0):installer_trust[collapsed=true]$([char]13)$([char]27)[0KChecksumming $INSTALLER" -## (We use .NET directly because 'sha*sum' does NOT support BOM from pre-PS6 'Set-Content') -$Utf8NoBomEncoding = New-Object -TypeName System.Text.UTF8Encoding -ArgumentList $False -$sha256 = (Get-FileHash $INSTALLER -Algorithm SHA256 | Select-Object -ExpandProperty Hash).ToLower() -Write-Output "(INFO): $INSTALLER SHA-256: $sha256" -if ($GIMP_RELEASE -and -not $GIMP_IS_RC_GIT) - { - [System.IO.File]::WriteAllText("$PWD\$INSTALLER.SHA256SUMS", "$sha256 *$INSTALLER", $Utf8NoBomEncoding) - #Set-Content $INSTALLER.SHA256SUMS "$sha256 *$INSTALLER" -Encoding utf8NoBOM -NoNewline - } -$sha512 = (Get-FileHash $INSTALLER -Algorithm SHA512 | Select-Object -ExpandProperty Hash).ToLower() -Write-Output "(INFO): $INSTALLER SHA-512: $sha512" -if ($GIMP_RELEASE -and -not $GIMP_IS_RC_GIT) - { - [System.IO.File]::WriteAllText("$PWD\$INSTALLER.SHA512SUMS", "$sha512 *$INSTALLER", $Utf8NoBomEncoding) - #Set-Content $INSTALLER.SHA512SUMS "$sha512 *$INSTALLER" -Encoding utf8NoBOM -NoNewline - } -## Check in advance if the certificate we will use in the future tagged pipeline is fine -if ((-not $GIMP_RELEASE -or $GIMP_IS_RC_GIT) -and $CI_COMMIT_TAG) - { - $latest_installer_cert = New-Object -TypeName System.DateTime -ArgumentList 2027, 2, 28 - Write-Output "(INFO): Certificate expire date is: $latest_installer_cert" - if ((Get-Date) -ge $latest_installer_cert) - { - $expired_pfx = $latest_installer_cert - Write-Host "(ERROR): Signing certificate for releases expired. Please ask the owner to issue a new one then commit its expire date on 'build\windows\installer\*.ps1'." -ForegroundColor Red - } - } -Write-Output "$([char]27)[0Ksection_end:$(Get-Date -UFormat %s -Millisecond 0):installer_trust$([char]13)$([char]27)[0K" - - -if ($GITLAB_CI) - { - # GitLab doesn't support wildcards when using "expose_as" so let's move to a dir - $output_dir = "$PWD\build\windows\installer\_Output" - New-Item $output_dir -ItemType Directory | Out-Null - Move-Item $INSTALLER* $output_dir - if ($expired_pfx) - { - exit 1 - } - } +#!/usr/bin/env pwsh + +# Parameters +param ($revision = "$GIMP_CI_WIN_INSTALLER", + $BUILD_DIR, + $ARM64_BUNDLE = "$PWD\gimp-clangarm64", + $X64_BUNDLE = "$PWD\gimp-clang64") + +# Ensure the script work properly +$ErrorActionPreference = 'Stop' +$PSNativeCommandUseErrorActionPreference = $false #to ensure error catching as in pre-7.4 PS +if (-not (Test-Path build\windows\installer) -and -not (Test-Path 3_dist-gimp-inno.ps1 -Type Leaf) -or $PSScriptRoot -notlike "*build\windows\installer*") + { + Write-Host '(ERROR): Script called from wrong dir. Please, call the script from gimp source.' -ForegroundColor Red + exit 1 + } +elseif (Test-Path 3_dist-gimp-inno.ps1 -Type Leaf) + { + Set-Location ..\..\.. + } + + +# 1. GET INNO +Write-Output "$([char]27)[0Ksection_start:$(Get-Date -UFormat %s -Millisecond 0):installer_tlkt$([char]13)$([char]27)[0KChecking Inno installation" +## Install or Update Inno (if needed) +## (We need to ensure that TLS 1.2 is enabled because of some runners) +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +Invoke-WebRequest "https://jrsoftware.org/download.php/is.exe" -UseBasicParsing -OutFile ..\is.exe +$inno_version_downloaded = (Get-Item ..\is.exe).VersionInfo.ProductVersion -replace ' ','' +$broken_inno = Get-ChildItem $env:TMP -Filter *.isl.bak -ErrorAction SilentlyContinue +$inno_version = Get-ItemProperty Registry::'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall\Inno Setup*' -ErrorAction SilentlyContinue | Select-Object -ExpandProperty DisplayVersion +if ("$broken_inno" -or "$inno_version" -ne "$inno_version_downloaded") + { + if ("$broken_inno") + { + Write-Output '(INFO): repairing Inno' + Remove-Item "$(Get-ItemProperty Registry::'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall\Inno Setup*' -ErrorAction SilentlyContinue | Select-Object -ExpandProperty InstallLocation)Languages" -Recurse -Force -ErrorAction SilentlyContinue + } + elseif ("$inno_version" -notlike "*.*") + { + Write-Output '(INFO): installing Inno' + } + else + { + Write-Output "(INFO): updating Inno from $inno_version to $inno_version_downloaded" + } + ..\is.exe /VERYSILENT /SUPPRESSMSGBOXES /CURRENTUSER /SP- #/LOG="..\innosetup.log" + Wait-Process is + } +Remove-Item ..\is.exe +$INNO_PATH = Get-ItemProperty (Resolve-Path Registry::'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall\Inno Setup*') | Select-Object -ExpandProperty InstallLocation +#$INNO_PATH = [regex]::Matches((Get-Content ..\innosetup.log | Select-String ISCC.exe), '(?<=filename: ).+?(?=\\ISCC.exe)').Value +Set-Alias iscc "$INNO_PATH\iscc.exe" + +## This script needs a bit of Python to work +if (-not (Get-Command "python" -ErrorAction SilentlyContinue) -or "$(Get-Command "python" -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Source)" -like '*WindowsApps*') + { + Invoke-Expression ((Get-Content build\windows\1_build-deps-msys2.ps1 | Select-String '-not \$env:MSYS_ROOT' -Context 0,12) -replace '> ','') + $env:PATH = "$env:MSYS_ROOT/$env:MSYSTEM_PREFIX/bin;$env:PATH" + } +Write-Output "(INFO): Installed Inno: $inno_version_downloaded | Installed Python: $((python --version) -replace '[^0-9.]', '')" +Write-Output "$([char]27)[0Ksection_end:$(Get-Date -UFormat %s -Millisecond 0):installer_tlkt$([char]13)$([char]27)[0K" + + +# 2. GET GLOBAL INFO +Write-Output "$([char]27)[0Ksection_start:$(Get-Date -UFormat %s -Millisecond 0):installer_info$([char]13)$([char]27)[0KGetting installer global info" +if (-not $BUILD_DIR) + { + $BUILD_DIR = Get-ChildItem _build* | Select-Object -First 1 + } +$CONFIG_PATH = "$BUILD_DIR\config.h" +if (-not (Test-Path "$CONFIG_PATH")) + { + Write-Host "(ERROR): config.h file not found. You can run 'build\windows\2_build-gimp-msys2.ps1' or configure GIMP to generate it.'" -ForegroundColor red + exit 1 + } +ForEach ($line in $(Select-String 'define' $CONFIG_PATH -AllMatches)) + { + Invoke-Expression $($line -replace '^.*#' -replace 'define ','$' -replace ' ','=') + } +#FIXME: Meson don't support C++ style comments. See: https://github.com/mesonbuild/meson/issues/14260 +$CLEANCONFIG_PATH ="$(Split-Path -Parent $CONFIG_PATH)\config_clean.h" +if (Test-Path $CLEANCONFIG_PATH) + { + Remove-Item $CLEANCONFIG_PATH -Force + } +(Get-Content $CONFIG_PATH -Raw) -replace '/\*[\s\S]*?\*/', '' | Set-Content $CLEANCONFIG_PATH + +## Get CUSTOM_GIMP_VERSION (GIMP version as we display for users in installer) +$CUSTOM_GIMP_VERSION = $GIMP_VERSION +if ($revision -notmatch '[1-9]' -or $CI_PIPELINE_SOURCE -eq 'schedule') + { + $revision = '0' + } +else + { + $CUSTOM_GIMP_VERSION = "$CUSTOM_GIMP_VERSION-$revision" + } +Write-Output "(INFO): GIMP version: $CUSTOM_GIMP_VERSION" + +## Autodetects what arch bundles will be packaged +# (The .iss script supports creating both an installer per arch or an universal installer with all arches) +if (-not (Test-Path "$ARM64_BUNDLE") -and -not (Test-Path "$X64_BUNDLE")) + { + Write-Host "(ERROR): No bundle found. You can tweak 'build/windows/2_build-gimp-msys2.ps1' or configure GIMP with '-Dwindows-installer=true' to make one." -ForegroundColor red + exit 1 + } +elseif ((Test-Path "$ARM64_BUNDLE") -and -not (Test-Path "$X64_BUNDLE")) + { + Write-Output "(INFO): Arch: arm64" + $supported_archs=@("-DARM64_BUNDLE=$ARM64_BUNDLE") + } +elseif (-not (Test-Path "$ARM64_BUNDLE") -and (Test-Path "$X64_BUNDLE")) + { + Write-Output "(INFO): Arch: x64" + $supported_archs=@("-DX64_BUNDLE=$X64_BUNDLE") + } +elseif ((Test-Path "$ARM64_BUNDLE") -and (Test-Path "$X64_BUNDLE")) + { + Write-Output "(INFO): Arch: arm64 and x64" + $supported_archs=@("-DARM64_BUNDLE=$ARM64_BUNDLE", "-DX64_BUNDLE=$X64_BUNDLE") + } +Write-Output "$([char]27)[0Ksection_end:$(Get-Date -UFormat %s -Millisecond 0):installer_info$([char]13)$([char]27)[0K" + + +# 3. PREPARE INSTALLER "SOURCE" +Write-Output "$([char]27)[0Ksection_start:$(Get-Date -UFormat %s -Millisecond 0):installer_source[collapsed=true]$([char]13)$([char]27)[0KMaking installer assets" +## Custom installer strings translations and other assets +## (They are loaded with 'iscc -DBUILD_DIR' on section 5.) +if (-not (Test-Path "$BUILD_DIR\build\windows\installer")) + { + Write-Host "(ERROR): Installer assets not found. You can tweak 'build\windows\2_build-gimp-msys2.ps1' or configure GIMP with '-Dwindows-installer=true' to build them." -ForegroundColor red + exit 1 + } + +## Inno installer strings translations +## NOTE: All the maintenance process is done only in 'iso_639_custom.xml' file +$xmlObject = New-Object XML +$xmlObject.Load("$PWD\build\windows\installer\lang\iso_639_custom.xml") +$langsArray_Official = $xmlObject.iso_639_entries.iso_639_entry | Select-Object -ExpandProperty inno_code | + Where-Object { $_ -like "*Languages*" } | Where-Object { $_ -notlike "*Unofficial*" } +$langsArray_unofficial = $xmlObject.iso_639_entries.iso_639_entry | Select-Object -ExpandProperty inno_code | + Where-Object { $_ -like "*Unofficial*" } +### Complete Inno source with not released translations: https://jrsoftware.org/files/istrans/ +function download_langs ([array]$langsArray) +{ + git clone --depth 1 https://github.com/jrsoftware/issrc.git "$env:TMP\issrc" + foreach ($langfile in $langsArray) + { + $langfilePath = "$INNO_PATH\$langfile" + if ($langfile -ne '' -and -not (Test-Path "$langfilePath" -Type Leaf)) + { + Write-Output "(INFO): temporarily installing $($langfilePath -replace '\\\\','\')" + New-Item $(Split-Path -Parent $langfilePath) -ItemType Directory -Force | Out-Null + Copy-Item "$env:TMP\issrc\Files\$langfile" "$langfilePath" -Force + } + } + Remove-Item "$env:TMP\issrc" -Recurse -Force +} +download_langs $langsArray_Official +download_langs $langsArray_unofficial +### Patch 'AppVer*' against Inno pervasive behavior: https://groups.google.com/g/innosetup/c/w0sebw5YAeg +function fix_msg ([array]$langsArray, [string]$AppVer) +{ + foreach ($langfile in $langsArray) + { + $langfilePath = "$INNO_PATH\$langfile" -replace '\\\\','\' + if ($AppVer -ne 'revert') + { + Copy-Item "$langfilePath" "$env:TMP\$(Split-Path $langfile -Leaf).bak" -Force + #Prefer Python since PowerShell/.NET doesn't handle well files with different encodings + python build\windows\installer\lang\fix_msg.py "$langfilePath" $AppVer + } + else #($AppVer -eq 'revert') + { + Move-Item "$env:TMP\$(Split-Path $langfile -Leaf).bak" "$langfilePath" -Force + } + } +} +fix_msg 'Default.isl' $CUSTOM_GIMP_VERSION +fix_msg $langsArray_Official $CUSTOM_GIMP_VERSION +fix_msg $langsArray_unofficial $CUSTOM_GIMP_VERSION +Write-Output "$([char]27)[0Ksection_end:$(Get-Date -UFormat %s -Millisecond 0):installer_source$([char]13)$([char]27)[0K" + + +# 4. PREPARE GIMP FILES +# (Most of the file processing and special-casing is done on *gimp3264.iss [Files] section. +# The resulting .exe installer content should be identical to the .msix and vice-versa) + + +# 5. COMPILE .EXE INSTALLER +$INSTALLER="gimp-${CUSTOM_GIMP_VERSION}-setup.exe" +Write-Output "$([char]27)[0Ksection_start:$(Get-Date -UFormat %s -Millisecond 0):installer_making[collapsed=true]$([char]13)$([char]27)[0KConstructing $INSTALLER installer" +iscc -DREVISION="$revision" -DBUILD_DIR="$BUILD_DIR" $supported_archs -DDEBUG_SYMBOLS -DPYTHON build\windows\installer\gimp-setup.iss | Out-Null; if ("$LASTEXITCODE" -gt '0') { exit 1 } +Write-Output "$([char]27)[0Ksection_end:$(Get-Date -UFormat %s -Millisecond 0):installer_making$([char]13)$([char]27)[0K" + +## Clean changes in Inno installation +fix_msg 'Default.isl' revert +fix_msg $langsArray_Official revert +fix_msg $langsArray_unofficial revert +## We delete only unofficial langs because the downloaded official ones will be kept by Inno updates +Remove-Item "$INNO_PATH\Languages\Unofficial" -Recurse -Force + + +# 6. GENERATE CHECKSUMS IN GNU FORMAT +Write-Output "$([char]27)[0Ksection_start:$(Get-Date -UFormat %s -Millisecond 0):installer_trust[collapsed=true]$([char]13)$([char]27)[0KChecksumming $INSTALLER" +## (We use .NET directly because 'sha*sum' does NOT support BOM from pre-PS6 'Set-Content') +$Utf8NoBomEncoding = New-Object -TypeName System.Text.UTF8Encoding -ArgumentList $False +$sha256 = (Get-FileHash $INSTALLER -Algorithm SHA256 | Select-Object -ExpandProperty Hash).ToLower() +Write-Output "(INFO): $INSTALLER SHA-256: $sha256" +if ($GIMP_RELEASE -and -not $GIMP_IS_RC_GIT) + { + [System.IO.File]::WriteAllText("$PWD\$INSTALLER.SHA256SUMS", "$sha256 *$INSTALLER", $Utf8NoBomEncoding) + #Set-Content $INSTALLER.SHA256SUMS "$sha256 *$INSTALLER" -Encoding utf8NoBOM -NoNewline + } +$sha512 = (Get-FileHash $INSTALLER -Algorithm SHA512 | Select-Object -ExpandProperty Hash).ToLower() +Write-Output "(INFO): $INSTALLER SHA-512: $sha512" +if ($GIMP_RELEASE -and -not $GIMP_IS_RC_GIT) + { + [System.IO.File]::WriteAllText("$PWD\$INSTALLER.SHA512SUMS", "$sha512 *$INSTALLER", $Utf8NoBomEncoding) + #Set-Content $INSTALLER.SHA512SUMS "$sha512 *$INSTALLER" -Encoding utf8NoBOM -NoNewline + } +## Check in advance if the certificate we will use in the future tagged pipeline is fine +if ((-not $GIMP_RELEASE -or $GIMP_IS_RC_GIT) -and $CI_COMMIT_TAG) + { + $latest_installer_cert = New-Object -TypeName System.DateTime -ArgumentList 2027, 2, 28 + Write-Output "(INFO): Certificate expire date is: $latest_installer_cert" + if ((Get-Date) -ge $latest_installer_cert) + { + $expired_pfx = $latest_installer_cert + Write-Host "(ERROR): Signing certificate for releases expired. Please ask the owner to issue a new one then commit its expire date on 'build\windows\installer\*.ps1'." -ForegroundColor Red + } + } +Write-Output "$([char]27)[0Ksection_end:$(Get-Date -UFormat %s -Millisecond 0):installer_trust$([char]13)$([char]27)[0K" + + +if ($GITLAB_CI) + { + # GitLab doesn't support wildcards when using "expose_as" so let's move to a dir + $output_dir = "$PWD\build\windows\installer\_Output" + New-Item $output_dir -ItemType Directory | Out-Null + Move-Item $INSTALLER* $output_dir + if ($expired_pfx) + { + exit 1 + } + }