Fix installer config tracking and Update Package Versions steps
Some checks failed
Release / build-linux (push) Failing after 35s
Release / build-macos (push) Failing after 34s
Release / build-windows (push) Failing after 1m7s
Release / deploy (push) Has been skipped

1. Fix .gitignore to track installer/config and package metadata
   - Previously `installer/*` ignored everything
   - Now only `installer/packages/*/data/` is ignored

2. Add installer config and package metadata files to repo:
   - installer/config/config.xml
   - installer/config/controlscript.qs
   - installer/packages/*/meta/package.xml

3. Fix Windows Update Package Versions to use PowerShell Core (pwsh)
   - Bash is not available on the Windows runner
   - CMD with inline PowerShell had pipe escaping issues

4. Add safety checks to macOS/Linux versions
   - Check if config.xml exists before trying to edit it

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
njohnson 2026-01-13 19:03:34 -05:00
parent db61321e64
commit d53c6d019f
18 changed files with 420 additions and 23 deletions

View File

@ -131,25 +131,30 @@ jobs:
echo Definitions and docs packaged
- name: Update Package Versions
shell: bash
shell: pwsh
run: |
VERSION="$CLEAN_VERSION"
CHANNEL="$CHANNEL"
TODAY=$(date +%Y-%m-%d)
$VERSION = $env:CLEAN_VERSION
$CHANNEL = $env:CHANNEL
$TODAY = Get-Date -Format "yyyy-MM-dd"
echo "Updating to version $VERSION for channel $CHANNEL on $TODAY"
Write-Host "Updating to version $VERSION for channel $CHANNEL on $TODAY"
# Update package.xml files
find installer/packages -name "package.xml" | while read f; do
sed -i "s|<Version>.*</Version>|<Version>$VERSION</Version>|g" "$f"
sed -i "s|<ReleaseDate>.*</ReleaseDate>|<ReleaseDate>$TODAY</ReleaseDate>|g" "$f"
done
Get-ChildItem -Path "installer\packages" -Filter "package.xml" -Recurse | ForEach-Object {
$content = Get-Content $_.FullName -Raw
$content = $content -replace '<Version>.*?</Version>', "<Version>$VERSION</Version>"
$content = $content -replace '<ReleaseDate>.*?</ReleaseDate>', "<ReleaseDate>$TODAY</ReleaseDate>"
Set-Content -Path $_.FullName -Value $content -NoNewline
}
# Update config.xml
sed -i "s|<Version>.*</Version>|<Version>$VERSION</Version>|g" installer/config/config.xml
sed -i "s|repository/[^<\"]*|repository/$CHANNEL|g" installer/config/config.xml
$configPath = "installer\config\config.xml"
$content = Get-Content $configPath -Raw
$content = $content -replace '<Version>.*?</Version>', "<Version>$VERSION</Version>"
$content = $content -replace 'repository/[^<"]*', "repository/$CHANNEL"
Set-Content -Path $configPath -Value $content -NoNewline
echo "Updated versions to $VERSION for channel $CHANNEL"
Write-Host "Updated versions to $VERSION for channel $CHANNEL"
- name: Generate Repository
shell: cmd
@ -344,16 +349,24 @@ jobs:
CHANNEL="${{ env.CHANNEL }}"
TODAY=$(date +%Y-%m-%d)
echo "Updating to version $VERSION for channel $CHANNEL on $TODAY"
# Update package.xml files
find installer/packages -name "package.xml" -exec sed -i '' \
-e "s|<Version>.*</Version>|<Version>$VERSION</Version>|" \
-e "s|<ReleaseDate>.*</ReleaseDate>|<ReleaseDate>$TODAY</ReleaseDate>|" {} \;
# Update config.xml
sed -i '' \
-e "s|<Version>.*</Version>|<Version>$VERSION</Version>|" \
-e "s|repository/[^<\"]*|repository/$CHANNEL|" \
installer/config/config.xml
if [ -f "installer/config/config.xml" ]; then
sed -i '' \
-e "s|<Version>.*</Version>|<Version>$VERSION</Version>|" \
-e "s|repository/[^<\"]*|repository/$CHANNEL|" \
installer/config/config.xml
else
echo "WARNING: installer/config/config.xml not found"
fi
echo "Updated versions to $VERSION for channel $CHANNEL"
- name: Generate Repository and Installers
shell: bash
@ -548,16 +561,24 @@ jobs:
CHANNEL="${{ env.CHANNEL }}"
TODAY=$(date +%Y-%m-%d)
echo "Updating to version $VERSION for channel $CHANNEL on $TODAY"
# Update package.xml files
find installer/packages -name "package.xml" -exec sed -i \
-e "s|<Version>.*</Version>|<Version>$VERSION</Version>|" \
-e "s|<ReleaseDate>.*</ReleaseDate>|<ReleaseDate>$TODAY</ReleaseDate>|" {} \;
# Update config.xml
sed -i \
-e "s|<Version>.*</Version>|<Version>$VERSION</Version>|" \
-e "s|repository/[^<\"]*|repository/$CHANNEL|" \
installer/config/config.xml
if [ -f "installer/config/config.xml" ]; then
sed -i \
-e "s|<Version>.*</Version>|<Version>$VERSION</Version>|" \
-e "s|repository/[^<\"]*|repository/$CHANNEL|" \
installer/config/config.xml
else
echo "WARNING: installer/config/config.xml not found"
fi
echo "Updated versions to $VERSION for channel $CHANNEL"
- name: Generate Repository and Installers
shell: bash

6
.gitignore vendored
View File

@ -11,7 +11,8 @@ tmpcl*
.vscode/*
.qmake.stash
installer/*
# Installer: ignore data directories but track config and package metadata
installer/packages/*/data/
# Ignore Qt Creator user files
*.pro.user
@ -73,7 +74,6 @@ third_party/dx9_sdk/
third_party/xna/
third_party/lzxdhelper/
# Qt Installer Framework
# Qt Installer Framework build outputs
repository/
installer/packages/*/data/
.deploy-temp/

View File

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<Installer>
<Name>XPlor</Name>
<Version>1.11.0</Version>
<Title>XPlor Binary Format Explorer</Title>
<Publisher>RedLine Solutions LLC</Publisher>
<StartMenuDir>XPlor</StartMenuDir>
<TargetDir>@HomeDir@/XPlor</TargetDir>
<!-- Allow users to change install directory -->
<AllowNonAsciiCharacters>true</AllowNonAsciiCharacters>
<AllowSpaceInPath>true</AllowSpaceInPath>
<!-- Remote repository URL - updated by deploy.cmd based on git branch -->
<RemoteRepositories>
<Repository>
<Url>https://xplor.redline.llc/repository/main</Url>
<Enabled>1</Enabled>
<DisplayName>XPlor Updates</DisplayName>
</Repository>
</RemoteRepositories>
<!-- Maintenance tool settings -->
<MaintenanceToolName>XPlorMaintenanceTool</MaintenanceToolName>
<MaintenanceToolIniFile>XPlorMaintenanceTool.ini</MaintenanceToolIniFile>
<!-- Update check settings -->
<InstallActionColumnVisible>true</InstallActionColumnVisible>
<!-- Styling -->
<WizardStyle>Modern</WizardStyle>
<WizardDefaultWidth>800</WizardDefaultWidth>
<WizardDefaultHeight>600</WizardDefaultHeight>
<!-- Installer resources (optional - will use defaults if missing) -->
<!-- <Logo>logo.png</Logo> -->
<!-- <Banner>banner.png</Banner> -->
<!-- <Watermark>watermark.png</Watermark> -->
<!-- Control script for channel selection -->
<ControlScript>controlscript.qs</ControlScript>
</Installer>

View File

@ -0,0 +1,117 @@
// XPlor Installer Control Script
// Provides channel selection (stable/beta) and post-install options
function Controller()
{
installer.setDefaultPageVisible(QInstaller.Introduction, true);
installer.setDefaultPageVisible(QInstaller.TargetDirectory, true);
installer.setDefaultPageVisible(QInstaller.ComponentSelection, true);
installer.setDefaultPageVisible(QInstaller.StartMenuSelection, true);
installer.setDefaultPageVisible(QInstaller.ReadyForInstallation, true);
installer.setDefaultPageVisible(QInstaller.PerformInstallation, true);
installer.setDefaultPageVisible(QInstaller.InstallationFinished, true);
}
Controller.prototype.IntroductionPageCallback = function()
{
var widget = gui.currentPageWidget();
if (widget != null) {
// Add channel selection radio buttons (only for fresh install, not updates)
if (!installer.isUpdater()) {
var channelWidget = widget.findChild("ChannelGroupBox");
if (channelWidget == null) {
var layout = widget.layout();
var groupBox = new QGroupBox("Update Channel");
groupBox.objectName = "ChannelGroupBox";
var vbox = new QVBoxLayout(groupBox);
var stableRadio = new QRadioButton("Stable - Recommended for most users");
stableRadio.checked = true;
stableRadio.objectName = "stableChannel";
vbox.addWidget(stableRadio);
var betaRadio = new QRadioButton("Beta - Early access to new features");
betaRadio.objectName = "betaChannel";
vbox.addWidget(betaRadio);
layout.addWidget(groupBox);
// Connect signal to update repository URL
stableRadio.toggled.connect(this, this.channelChanged);
}
}
}
}
Controller.prototype.channelChanged = function(checked)
{
if (!checked) return;
var widget = gui.currentPageWidget();
var stableRadio = widget.findChild("stableChannel");
// Update repository URL based on selection
var repos = installer.defaultRepositories();
for (var i = 0; i < repos.length; i++) {
var repo = repos[i];
var url = repo.url().toString();
if (stableRadio.checked) {
url = url.replace("/beta", "/stable");
} else {
url = url.replace("/stable", "/beta");
}
repo.setUrl(new QUrl(url));
}
}
Controller.prototype.TargetDirectoryPageCallback = function()
{
// Set default target directory
var widget = gui.currentPageWidget();
if (widget != null) {
widget.targetDirectoryLineEdit.setText(installer.value("TargetDir"));
}
}
Controller.prototype.ComponentSelectionPageCallback = function()
{
var widget = gui.currentPageWidget();
if (widget != null) {
// Optionally customize component tree
}
}
Controller.prototype.InstallationFinishedPageCallback = function()
{
// Offer to run the application after installation
if (installer.isInstaller() && installer.status == QInstaller.Success) {
var widget = gui.currentPageWidget();
if (widget != null) {
var runCheckbox = widget.findChild("RunAppCheckbox");
if (runCheckbox == null) {
var checkbox = new QCheckBox("Run XPlor after installation");
checkbox.checked = true;
checkbox.objectName = "RunAppCheckbox";
widget.layout().addWidget(checkbox);
}
}
}
}
Controller.prototype.FinishedPageCallback = function()
{
// Launch application if checkbox was checked
if (installer.isInstaller() && installer.status == QInstaller.Success) {
var widget = gui.currentPageWidget();
if (widget != null) {
var runCheckbox = widget.findChild("RunAppCheckbox");
if (runCheckbox != null && runCheckbox.checked) {
var installDir = installer.value("TargetDir");
QDesktopServices.openUrl("file:///" + installDir + "/XPlor.exe");
}
}
}
}

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<Package>
<DisplayName>XPlor CLI Tool</DisplayName>
<Description>Command-line interface for scripted file analysis and batch processing.</Description>
<Version>1.11.0</Version>
<ReleaseDate>2026-01-12</ReleaseDate>
<Name>com.xplor.cli</Name>
<Default>false</Default>
<SortingPriority>90</SortingPriority>
</Package>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<Package>
<DisplayName>Asura Engine Formats</DisplayName>
<Description>Support for Sniper Elite V2 and related Asura engine game files.</Description>
<Version>1.11.0</Version>
<ReleaseDate>2026-01-12</ReleaseDate>
<Name>com.xplor.definitions.asura</Name>
<Dependencies>com.xplor.gui</Dependencies>
<Default>true</Default>
<SortingPriority>76</SortingPriority>
</Package>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<Package>
<DisplayName>Call of Duty Formats</DisplayName>
<Description>Support for Call of Duty game files including Fast Files (.ff), IWD archives, and related formats.</Description>
<Version>1.11.0</Version>
<ReleaseDate>2026-01-12</ReleaseDate>
<Name>com.xplor.definitions.cod</Name>
<Dependencies>com.xplor.gui</Dependencies>
<Default>true</Default>
<SortingPriority>79</SortingPriority>
</Package>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<Package>
<DisplayName>Dead Rising Formats</DisplayName>
<Description>Support for Dead Rising game files including BIG archives, textures, and animations.</Description>
<Version>1.11.0</Version>
<ReleaseDate>2026-01-12</ReleaseDate>
<Name>com.xplor.definitions.deadrising</Name>
<Dependencies>com.xplor.gui</Dependencies>
<Default>true</Default>
<SortingPriority>77</SortingPriority>
</Package>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<Package>
<DisplayName>FMOD Audio Formats</DisplayName>
<Description>Support for FMOD sound bank files and audio containers.</Description>
<Version>1.11.0</Version>
<ReleaseDate>2026-01-12</ReleaseDate>
<Name>com.xplor.definitions.fmod</Name>
<Dependencies>com.xplor.gui</Dependencies>
<Default>true</Default>
<SortingPriority>75</SortingPriority>
</Package>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<Package>
<DisplayName>THQA Formats</DisplayName>
<Description>Support for Tony Hawk series and related game files.</Description>
<Version>1.11.0</Version>
<ReleaseDate>2026-01-12</ReleaseDate>
<Name>com.xplor.definitions.thqa</Name>
<Dependencies>com.xplor.gui</Dependencies>
<Default>true</Default>
<SortingPriority>74</SortingPriority>
</Package>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<Package>
<DisplayName>Volition Engine Formats</DisplayName>
<Description>Support for Saints Row and Red Faction VPP archives, PEG textures, and related formats.</Description>
<Version>1.11.0</Version>
<ReleaseDate>2026-01-12</ReleaseDate>
<Name>com.xplor.definitions.volition</Name>
<Dependencies>com.xplor.gui</Dependencies>
<Default>true</Default>
<SortingPriority>78</SortingPriority>
</Package>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<Package>
<DisplayName>Nintendo Wii Formats</DisplayName>
<Description>Support for Wii-specific file formats and archives.</Description>
<Version>1.11.0</Version>
<ReleaseDate>2026-01-12</ReleaseDate>
<Name>com.xplor.definitions.wii</Name>
<Dependencies>com.xplor.gui</Dependencies>
<Default>true</Default>
<SortingPriority>73</SortingPriority>
</Package>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<Package>
<DisplayName>Format Definitions</DisplayName>
<Description>XScript format definition packs for various game engines. Select individual packs below.</Description>
<Version>1.11.0</Version>
<ReleaseDate>2026-01-12</ReleaseDate>
<Name>com.xplor.definitions</Name>
<Virtual>true</Virtual>
<SortingPriority>80</SortingPriority>
</Package>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<Package>
<DisplayName>Documentation</DisplayName>
<Description>XScript language guide and API reference documentation.</Description>
<Version>1.11.0</Version>
<ReleaseDate>2026-01-12</ReleaseDate>
<Name>com.xplor.docs</Name>
<Default>true</Default>
<SortingPriority>70</SortingPriority>
</Package>

View File

@ -0,0 +1,67 @@
// XPlor GUI Installation Script
// Creates shortcuts and registers file associations
function Component()
{
// Default constructor
}
Component.prototype.createOperations = function()
{
// Call default implementation
component.createOperations();
if (systemInfo.productType === "windows") {
// Create Start Menu shortcut
component.addOperation("CreateShortcut",
"@TargetDir@/XPlor.exe",
"@StartMenuDir@/XPlor.lnk",
"workingDirectory=@TargetDir@",
"iconPath=@TargetDir@/XPlor.exe",
"iconId=0",
"description=Binary File Format Explorer");
// Create Desktop shortcut
component.addOperation("CreateShortcut",
"@TargetDir@/XPlor.exe",
"@DesktopDir@/XPlor.lnk",
"workingDirectory=@TargetDir@",
"iconPath=@TargetDir@/XPlor.exe");
// Register file associations for common formats
component.addOperation("RegisterFileType",
"vpp_xbox2",
"@TargetDir@/XPlor.exe \"%1\"",
"Volition Package (Xbox 360)",
"application/octet-stream",
"@TargetDir@/XPlor.exe,0");
component.addOperation("RegisterFileType",
"vpp_pc",
"@TargetDir@/XPlor.exe \"%1\"",
"Volition Package (PC)",
"application/octet-stream",
"@TargetDir@/XPlor.exe,0");
component.addOperation("RegisterFileType",
"str2_pc",
"@TargetDir@/XPlor.exe \"%1\"",
"Saints Row Stream Container",
"application/octet-stream",
"@TargetDir@/XPlor.exe,0");
component.addOperation("RegisterFileType",
"ff",
"@TargetDir@/XPlor.exe \"%1\"",
"Call of Duty Fast File",
"application/octet-stream",
"@TargetDir@/XPlor.exe,0");
component.addOperation("RegisterFileType",
"big",
"@TargetDir@/XPlor.exe \"%1\"",
"Dead Rising Archive",
"application/octet-stream",
"@TargetDir@/XPlor.exe,0");
}
}

View File

@ -0,0 +1,17 @@
XPlor Binary Format Explorer
Copyright (c) 2025 RedLine Solutions LLC
This software is provided for personal and educational use.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Third-Party Components:
- Qt Framework: LGPL v3 / Commercial License
- zlib: zlib License
- DevIL: LGPL License

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<Package>
<DisplayName>XPlor GUI Application</DisplayName>
<Description>Binary file format explorer with graphical interface. Includes Qt runtime libraries.</Description>
<Version>1.11.0</Version>
<ReleaseDate>2026-01-12</ReleaseDate>
<Name>com.xplor.gui</Name>
<Default>true</Default>
<Essential>false</Essential>
<ForcedInstallation>false</ForcedInstallation>
<SortingPriority>100</SortingPriority>
<Script>installscript.qs</Script>
<Licenses>
<License name="License Agreement" file="license.txt"/>
</Licenses>
</Package>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<Package>
<DisplayName>Analysis Scripts</DisplayName>
<Description>Python scripts for advanced file analysis and data extraction. Requires Python 3.x.</Description>
<Version>1.11.0</Version>
<ReleaseDate>2026-01-12</ReleaseDate>
<Name>com.xplor.scripts</Name>
<Default>false</Default>
<SortingPriority>60</SortingPriority>
</Package>