Compare commits

...

9 Commits

Author SHA1 Message Date
njohnson
4c0251934f Move deploy job to Linux runner, use /repository path
All checks were successful
Release / build-linux (push) Successful in 1m0s
Release / build-macos (push) Successful in 2m31s
Release / build-windows (push) Successful in 4m56s
Release / deploy (push) Successful in 44s
- Change deploy job from Windows to Ubuntu runner
- Convert all CMD scripts to bash
- Change repository path from P:\repository to /repository
- Add Windows repository upload step
- Merge all three platform repositories in deploy job

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 21:10:04 -05:00
njohnson
93665ad65f Fix Gitea release: use action-gh-release v1, remove generate_release_notes
All checks were successful
Release / build-linux (push) Successful in 1m1s
Release / build-macos (push) Successful in 2m27s
Release / build-windows (push) Successful in 4m36s
Release / deploy (push) Successful in 42s
- Downgrade softprops/action-gh-release from v2 to v1 for Gitea compatibility
- Remove generate_release_notes (not supported by Gitea API)
- Add static release body instead

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 20:54:41 -05:00
njohnson
a02ad66306 Fix deploy job: make Merge repositories resilient to missing P: drive
Some checks failed
Release / build-linux (push) Successful in 58s
Release / build-macos (push) Successful in 2m25s
Release / build-windows (push) Successful in 4m29s
Release / deploy (push) Failing after 31s
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 20:44:39 -05:00
njohnson
a3e9600dc5 Make Deploy to Repository step resilient to missing P: drive
Some checks failed
Release / build-linux (push) Successful in 1m0s
Release / build-macos (push) Successful in 2m26s
Release / build-windows (push) Successful in 4m34s
Release / deploy (push) Failing after 40s
- Check if P: drive exists before attempting deployment
- Add continue-on-error: true as fallback
- Skip gracefully with warning message when drive not available

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 20:30:27 -05:00
njohnson
1c11b3b936 Downgrade artifact actions from v4 to v3 for Gitea compatibility
Some checks failed
Release / build-linux (push) Successful in 1m21s
Release / build-macos (push) Successful in 2m39s
Release / build-windows (push) Failing after 4m12s
Release / deploy (push) Has been skipped
actions/upload-artifact@v4 and actions/download-artifact@v4 are not
supported on Gitea (GHES). Downgraded to v3.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 19:30:23 -05:00
njohnson
58460407b3 Update Qt IFW paths for each platform
Some checks failed
Release / build-linux (push) Failing after 42s
Release / build-windows (push) Failing after 46s
Release / build-macos (push) Failing after 2m18s
Release / deploy (push) Has been skipped
- Windows: 4.8 -> 4.10
- macOS: ~/Qt/Tools/QtInstallerFramework/bin (4.10, no version in path)
- Linux: ~/Qt/Tools/QtInstallerFramework/4.8/bin (unchanged)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 19:24:12 -05:00
njohnson
7549f26a6d Fix Windows: use 'powershell' instead of 'pwsh'
Some checks failed
Release / build-macos (push) Failing after 35s
Release / build-linux (push) Failing after 37s
Release / build-windows (push) Failing after 1m10s
Release / deploy (push) Has been skipped
PowerShell Core (pwsh) is not installed on the Windows runner.
Windows PowerShell 5.1 (powershell) is always available.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 19:06:24 -05:00
njohnson
d53c6d019f 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>
2026-01-13 19:03:34 -05:00
njohnson
db61321e64 Fix Update Package Versions step: use bash instead of CMD
Some checks failed
Release / build-linux (push) Failing after 36s
Release / build-macos (push) Failing after 35s
Release / build-windows (push) Failing after 1m11s
Release / deploy (push) Has been skipped
The CMD approach failed because:
1. wmic is deprecated and not available on the Windows runner
2. PowerShell pipes inside CMD were misinterpreted

Switch to bash which is now available on the Windows runner.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 18:57:36 -05:00
18 changed files with 507 additions and 87 deletions

View File

@ -131,35 +131,35 @@ jobs:
echo Definitions and docs packaged
- name: Update Package Versions
shell: cmd
shell: powershell
run: |
setlocal enabledelayedexpansion
$VERSION = $env:CLEAN_VERSION
$CHANNEL = $env:CHANNEL
$TODAY = Get-Date -Format "yyyy-MM-dd"
set "VERSION=%CLEAN_VERSION%"
set "CHANNEL=%CHANNEL%"
Write-Host "Updating to version $VERSION for channel $CHANNEL on $TODAY"
REM Get today's date in YYYY-MM-DD format
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /value') do set "DT=%%I"
set "TODAY=!DT:~0,4!-!DT:~4,2!-!DT:~6,2!"
# Update package.xml files
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
}
echo Updating to version !VERSION! for channel !CHANNEL! on !TODAY!
# Update 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
REM Update package.xml files using PowerShell for regex
for /r installer\packages %%f in (package.xml) do (
if exist "%%f" (
powershell -Command "(Get-Content '%%f') -replace '<Version>.*</Version>', '<Version>%VERSION%</Version>' -replace '<ReleaseDate>.*</ReleaseDate>', '<ReleaseDate>%TODAY%</ReleaseDate>' | Set-Content '%%f'"
)
)
REM Update config.xml
powershell -Command "(Get-Content 'installer\config\config.xml') -replace '<Version>.*</Version>', '<Version>%VERSION%</Version>' -replace 'repository/[^<\"]*', 'repository/%CHANNEL%' | Set-Content 'installer\config\config.xml'"
echo Updated versions to !VERSION! for channel !CHANNEL!
Write-Host "Updated versions to $VERSION for channel $CHANNEL"
- name: Generate Repository
shell: cmd
run: |
set PATH=C:\Qt\Tools\QtInstallerFramework\4.8\bin;%PATH%
set PATH=C:\Qt\Tools\QtInstallerFramework\4.10\bin;%PATH%
if exist repository rmdir /s /q repository
mkdir repository
@ -172,7 +172,7 @@ jobs:
- name: Create Offline Installer
shell: cmd
run: |
set PATH=C:\Qt\Tools\QtInstallerFramework\4.8\bin;%PATH%
set PATH=C:\Qt\Tools\QtInstallerFramework\4.10\bin;%PATH%
binarycreator.exe --offline-only -c installer\config\config.xml -p installer\packages "XPlor-%VERSION%-Windows-Setup.exe"
if errorlevel 1 exit /b 1
@ -182,7 +182,7 @@ jobs:
- name: Create Online Installer
shell: cmd
run: |
set PATH=C:\Qt\Tools\QtInstallerFramework\4.8\bin;%PATH%
set PATH=C:\Qt\Tools\QtInstallerFramework\4.10\bin;%PATH%
binarycreator.exe --online-only -c installer\config\config.xml -p installer\packages "XPlor-%VERSION%-Windows-Online.exe"
if errorlevel 1 exit /b 1
@ -191,11 +191,18 @@ jobs:
- name: Deploy to Repository
shell: cmd
continue-on-error: true
run: |
set REPO_PATH=P:\repository\%CHANNEL%
echo Deploying to %REPO_PATH%
REM Check if drive exists
if not exist "P:\" (
echo WARNING: P: drive not available, skipping local repository deployment
exit /b 0
)
if not exist "%REPO_PATH%" mkdir "%REPO_PATH%"
REM Copy repository contents
@ -204,7 +211,7 @@ jobs:
echo Repository updated at %REPO_PATH%
- name: Upload Installers
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v3
with:
name: windows-installers
path: |
@ -212,6 +219,13 @@ jobs:
XPlor-*-Windows-Online.exe
retention-days: 90
- name: Upload Repository
uses: actions/upload-artifact@v3
with:
name: windows-repository
path: repository/
retention-days: 90
# ===========================================================================
# macOS Build
# ===========================================================================
@ -349,22 +363,30 @@ 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
run: |
# Find Qt IFW
for IFW_PATH in ~/Qt/Tools/QtInstallerFramework/4.8/bin ~/Qt/Tools/QtInstallerFramework/4.7/bin /opt/homebrew/opt/qt-installer-framework/bin; do
# Find Qt IFW (macOS uses 4.10 at ~/Qt/Tools/QtInstallerFramework/bin)
for IFW_PATH in ~/Qt/Tools/QtInstallerFramework/bin ~/Qt/Tools/QtInstallerFramework/4.10/bin /opt/homebrew/opt/qt-installer-framework/bin; do
if [ -f "$IFW_PATH/repogen" ]; then
echo "Found Qt IFW at: $IFW_PATH"
export PATH="$IFW_PATH:$PATH"
@ -397,7 +419,7 @@ jobs:
ls -la XPlor-*
- name: Upload Installers
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v3
with:
name: macos-installers
path: |
@ -408,7 +430,7 @@ jobs:
retention-days: 90
- name: Upload Repository
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v3
with:
name: macos-repository
path: repository/
@ -553,16 +575,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
@ -593,7 +623,7 @@ jobs:
ls -la XPlor-*
- name: Upload Installers
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v3
with:
name: linux-installers
path: |
@ -602,7 +632,7 @@ jobs:
retention-days: 90
- name: Upload Repository
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v3
with:
name: linux-repository
path: repository/
@ -612,93 +642,107 @@ jobs:
# Deploy - Merge repositories and create release
# ===========================================================================
deploy:
runs-on: windows
runs-on: ubuntu
needs: [build-windows, build-macos, build-linux]
steps:
- name: Extract version info
shell: cmd
shell: bash
run: |
setlocal enabledelayedexpansion
TAG="${GITHUB_REF_NAME}"
VERSION="${TAG#v}"
set "TAG=%GITHUB_REF_NAME%"
set "VERSION=!TAG:~1!"
if [[ "$TAG" == *"-alpha"* ]]; then
CHANNEL="alpha"
elif [[ "$TAG" == *"-test"* ]]; then
CHANNEL="tester"
else
CHANNEL="stable"
fi
set "CHANNEL=stable"
echo !TAG! | findstr /C:"-alpha" >nul && set "CHANNEL=alpha"
echo !TAG! | findstr /C:"-test" >nul && set "CHANNEL=tester"
echo VERSION=!VERSION!>> %GITHUB_ENV%
echo CHANNEL=!CHANNEL!>> %GITHUB_ENV%
echo "VERSION=$VERSION" >> $GITHUB_ENV
echo "CHANNEL=$CHANNEL" >> $GITHUB_ENV
- name: Download all installers
uses: actions/download-artifact@v4
uses: actions/download-artifact@v3
with:
path: artifacts
- name: Download macOS repository
uses: actions/download-artifact@v4
uses: actions/download-artifact@v3
with:
name: macos-repository
path: repo-macos
- name: Download Linux repository
uses: actions/download-artifact@v4
uses: actions/download-artifact@v3
with:
name: linux-repository
path: repo-linux
- name: Download Windows repository
uses: actions/download-artifact@v3
with:
name: windows-repository
path: repo-windows
- name: Merge repositories
shell: cmd
shell: bash
run: |
setlocal enabledelayedexpansion
REPO_PATH="/repository/${CHANNEL}"
set "CHANNEL=%CHANNEL%"
set "REPO_PATH=P:\repository\!CHANNEL!"
echo "Deploying to: $REPO_PATH"
echo Deploying to: !REPO_PATH!
# Check if repository directory exists
if [ ! -d "/repository" ]; then
echo "WARNING: /repository not available, skipping repository deployment"
exit 0
fi
REM Ensure directory exists
if not exist "!REPO_PATH!" mkdir "!REPO_PATH!"
# Ensure channel directory exists
mkdir -p "$REPO_PATH"
REM The Windows build already deployed its repository
REM Now merge macOS and Linux platform-specific packages
# Merge all platform repositories
if [ -d "repo-windows" ]; then
cp -r repo-windows/* "$REPO_PATH/" 2>/dev/null || true
echo "Merged Windows repository"
fi
REM Copy macOS repository components
if exist "repo-macos" (
xcopy /s /e /y /q "repo-macos\*" "!REPO_PATH!\" >nul
echo Merged macOS repository
)
if [ -d "repo-macos" ]; then
cp -r repo-macos/* "$REPO_PATH/" 2>/dev/null || true
echo "Merged macOS repository"
fi
REM Copy Linux repository components
if exist "repo-linux" (
xcopy /s /e /y /q "repo-linux\*" "!REPO_PATH!\" >nul
echo Merged Linux repository
)
if [ -d "repo-linux" ]; then
cp -r repo-linux/* "$REPO_PATH/" 2>/dev/null || true
echo "Merged Linux repository"
fi
echo Repository deployed to !REPO_PATH!
echo "Repository deployed to $REPO_PATH"
ls -la "$REPO_PATH" || true
- name: Collect all installers
shell: cmd
shell: bash
run: |
REM Create release directory
if not exist release mkdir release
mkdir -p release
REM Copy all installers from artifacts
for /r artifacts %%f in (XPlor-*.exe XPlor-*.dmg XPlor-*.run) do (
if exist "%%f" (
copy /y "%%f" release\ >nul
echo Found: %%~nxf
)
)
# Copy all installers from artifacts
find artifacts -type f \( -name "XPlor-*.exe" -o -name "XPlor-*.dmg" -o -name "XPlor-*.run" \) -exec cp {} release/ \;
dir release\
echo "Collected installers:"
ls -la release/
- name: Create Gitea Release
uses: softprops/action-gh-release@v2
uses: softprops/action-gh-release@v1
with:
files: release/*
generate_release_notes: true
prerelease: ${{ contains(github.ref_name, 'alpha') || contains(github.ref_name, 'test') }}
body: |
Release ${{ github.ref_name }}
## Downloads
- **Windows**: XPlor-*-Windows-Setup.exe (offline), XPlor-*-Windows-Online.exe
- **macOS**: XPlor-*-macOS-Setup.dmg (offline), XPlor-*-macOS-Online.dmg
- **Linux**: XPlor-*-Linux-Setup.run (offline), XPlor-*-Linux-Online.run
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

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>