mirror of
https://github.com/itsmemac/Packwright.git
synced 2026-10-06 08:00:19 +02:00
- Send to console: working progress bar and sizes, automatic reconnect when
the connection drops, FTP user name and password, and plain-language errors
- Tasks: size done, left and total; clear failure messages with the technical
details kept in the log; clearer task counter in the sidebar
- Verify: shows real progress and a clear result ("Verified: no problems found")
- Right-click a game for Convert / Build, Extract or Verify
- Tools: built-in ZArchive preset; presets only shown for Convert / Build
- A damaged or incomplete package now says so
- Release notes per version (release-notes/<version>.md) shown in the update window
228 lines
10 KiB
YAML
228 lines
10 KiB
YAML
name: Release
|
|
|
|
# Every push to main builds the app for Windows, Linux and macOS and publishes (or refreshes) a GitHub
|
|
# release named after the <Version> in src/Packwright.App/Packwright.App.csproj. To cut a new
|
|
# release, bump that version and push.
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
paths-ignore:
|
|
- '**.md'
|
|
- 'LICENSE'
|
|
workflow_dispatch:
|
|
|
|
permissions:
|
|
contents: write
|
|
|
|
concurrency:
|
|
group: release
|
|
cancel-in-progress: false
|
|
|
|
env:
|
|
PROJECT: src/Packwright.App/Packwright.App.csproj
|
|
APP: Packwright
|
|
|
|
jobs:
|
|
version:
|
|
runs-on: ubuntu-latest
|
|
outputs:
|
|
version: ${{ steps.read.outputs.version }}
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- id: read
|
|
run: |
|
|
version=$(sed -n 's:.*<Version>\(.*\)</Version>.*:\1:p' "$PROJECT" | head -n1)
|
|
if [ -z "$version" ]; then echo "No <Version> found in $PROJECT" >&2; exit 1; fi
|
|
echo "version=$version" >> "$GITHUB_OUTPUT"
|
|
|
|
build-linux:
|
|
needs: version
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: actions/setup-dotnet@v4
|
|
with:
|
|
dotnet-version: 10.0.x
|
|
- name: Publish
|
|
run: dotnet publish "$PROJECT" -c Release -r linux-x64 --self-contained true -o publish
|
|
- name: Add the licenses
|
|
run: |
|
|
cp LICENSE THIRD_PARTY_NOTICES.md publish/
|
|
mkdir -p publish/licenses
|
|
cp third-party/ProsperoPkgTool/LICENSE publish/licenses/ProsperoPkgTool-LICENSE
|
|
cp third-party/LibProsperoPkg12/LICENSE publish/licenses/LibProsperoPkg-LICENSE
|
|
cp third-party/LibProsperoPkg12/NOTICE publish/licenses/LibProsperoPkg-NOTICE
|
|
cp src/Packwright.Ufs2/LICENSE publish/licenses/UFS2Tool-LICENSE
|
|
cp third-party/licenses/* publish/licenses/
|
|
- name: Build the .deb and .rpm
|
|
run: |
|
|
sudo apt-get update -qq
|
|
sudo apt-get install -y -qq rpm
|
|
bash installer/linux/build-packages.sh "${{ needs.version.outputs.version }}" publish dist
|
|
- uses: actions/upload-artifact@v4
|
|
with:
|
|
name: release-linux-packages
|
|
path: dist/*
|
|
|
|
build-windows-installer:
|
|
needs: version
|
|
runs-on: windows-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: actions/setup-dotnet@v4
|
|
with:
|
|
dotnet-version: 10.0.x
|
|
- name: Publish
|
|
shell: bash
|
|
run: dotnet publish "$PROJECT" -c Release -r win-x64 --self-contained true -o publish
|
|
- name: Add the licenses
|
|
shell: bash
|
|
run: |
|
|
cp LICENSE THIRD_PARTY_NOTICES.md publish/
|
|
mkdir -p publish/licenses
|
|
cp third-party/ProsperoPkgTool/LICENSE publish/licenses/ProsperoPkgTool-LICENSE
|
|
cp third-party/LibProsperoPkg12/LICENSE publish/licenses/LibProsperoPkg-LICENSE
|
|
cp third-party/LibProsperoPkg12/NOTICE publish/licenses/LibProsperoPkg-NOTICE
|
|
cp src/Packwright.Ufs2/LICENSE publish/licenses/UFS2Tool-LICENSE
|
|
cp third-party/licenses/* publish/licenses/
|
|
- name: Install Inno Setup
|
|
run: choco install innosetup -y --no-progress
|
|
- name: Build the installer
|
|
shell: pwsh
|
|
run: |
|
|
New-Item -ItemType Directory -Force dist | Out-Null
|
|
$iscc = Join-Path ${env:ProgramFiles(x86)} 'Inno Setup 6\ISCC.exe'
|
|
& $iscc "/DAppVersion=${{ needs.version.outputs.version }}" "/DSourceDir=$env:GITHUB_WORKSPACE\publish" "/O$env:GITHUB_WORKSPACE\dist" installer\Packwright.iss
|
|
if ($LASTEXITCODE -ne 0) { throw "Inno Setup failed ($LASTEXITCODE)" }
|
|
- uses: actions/upload-artifact@v4
|
|
with:
|
|
name: release-windows-installer
|
|
path: dist/*.exe
|
|
|
|
build-macos:
|
|
needs: version
|
|
runs-on: macos-latest
|
|
strategy:
|
|
fail-fast: true
|
|
matrix:
|
|
include:
|
|
- { rid: osx-arm64, label: macos-arm64 }
|
|
- { rid: osx-x64, label: macos-x64 }
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: actions/setup-dotnet@v4
|
|
with:
|
|
dotnet-version: 10.0.x
|
|
- name: Publish
|
|
run: dotnet publish "$PROJECT" -c Release -r ${{ matrix.rid }} --self-contained true -o publish
|
|
- name: Create the app bundle
|
|
run: |
|
|
version="${{ needs.version.outputs.version }}"
|
|
bundle="Packwright.app"
|
|
mkdir -p "$bundle/Contents/MacOS" "$bundle/Contents/Resources"
|
|
cp -R publish/. "$bundle/Contents/MacOS/"
|
|
chmod +x "$bundle/Contents/MacOS/$APP"
|
|
cp LICENSE THIRD_PARTY_NOTICES.md "$bundle/Contents/Resources/"
|
|
mkdir -p "$bundle/Contents/Resources/licenses"
|
|
cp third-party/ProsperoPkgTool/LICENSE "$bundle/Contents/Resources/licenses/ProsperoPkgTool-LICENSE"
|
|
cp src/Packwright.Ufs2/LICENSE "$bundle/Contents/Resources/licenses/UFS2Tool-LICENSE"
|
|
cp third-party/licenses/* "$bundle/Contents/Resources/licenses/"
|
|
|
|
# Icon: build an .icns from the PNG
|
|
iconset=icon.iconset
|
|
mkdir "$iconset"
|
|
for size in 16 32 128 256 512; do
|
|
double=$((size * 2))
|
|
sips -z $size $size src/Packwright.App/Assets/icon.png --out "$iconset/icon_${size}x${size}.png" > /dev/null
|
|
sips -z $double $double src/Packwright.App/Assets/icon.png --out "$iconset/icon_${size}x${size}@2x.png" > /dev/null
|
|
done
|
|
iconutil -c icns "$iconset" -o "$bundle/Contents/Resources/icon.icns"
|
|
|
|
cat > "$bundle/Contents/Info.plist" <<PLIST
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
<plist version="1.0">
|
|
<dict>
|
|
<key>CFBundleName</key><string>Packwright</string>
|
|
<key>CFBundleDisplayName</key><string>Packwright</string>
|
|
<key>CFBundleIdentifier</key><string>io.github.itsmemac.packwright</string>
|
|
<key>CFBundleVersion</key><string>${version}</string>
|
|
<key>CFBundleShortVersionString</key><string>${version}</string>
|
|
<key>CFBundleExecutable</key><string>${APP}</string>
|
|
<key>CFBundleIconFile</key><string>icon</string>
|
|
<key>CFBundlePackageType</key><string>APPL</string>
|
|
<key>LSMinimumSystemVersion</key><string>13.0</string>
|
|
<key>NSHighResolutionCapable</key><true/>
|
|
</dict>
|
|
</plist>
|
|
PLIST
|
|
- name: Sign ad hoc
|
|
# Apple Silicon refuses to start unsigned code. An ad-hoc signature is enough to run locally;
|
|
# the app is not notarized, so the first launch still needs right click, then Open.
|
|
run: codesign --force --deep --sign - "Packwright.app"
|
|
- name: Build the disk image
|
|
# The disk image holds the app and a shortcut to Applications: open it and drag the app across.
|
|
run: |
|
|
mkdir dist dmgroot
|
|
name="$APP-v${{ needs.version.outputs.version }}-${{ matrix.label }}"
|
|
ditto "Packwright.app" "dmgroot/Packwright.app"
|
|
ln -s /Applications dmgroot/Applications
|
|
hdiutil create -volname "Packwright" -srcfolder dmgroot -ov -format UDZO "dist/$name.dmg"
|
|
- uses: actions/upload-artifact@v4
|
|
with:
|
|
name: release-${{ matrix.label }}
|
|
path: dist/*
|
|
|
|
release:
|
|
needs: [version, build-linux, build-windows-installer, build-macos]
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: actions/download-artifact@v4
|
|
with:
|
|
pattern: release-*
|
|
merge-multiple: true
|
|
path: dist
|
|
- name: Checksums and notes
|
|
run: |
|
|
version="${{ needs.version.outputs.version }}"
|
|
(cd dist && sha256sum * > SHA256SUMS.txt)
|
|
# The notes file for this version (release-notes/<version>.md), when there is one, goes first: it is what
|
|
# the app's update window shows under "what is new".
|
|
{
|
|
echo "## Packwright v${version}"
|
|
echo
|
|
if [ -f "release-notes/${version}.md" ]; then cat "release-notes/${version}.md"; echo; fi
|
|
} > notes.md
|
|
cat >> notes.md <<NOTES
|
|
Pick the installer for your system. Everything is self-contained, nothing else needs to be installed.
|
|
|
|
| System | Download |
|
|
| --- | --- |
|
|
| Windows 10/11 (64-bit) | \`$APP-Setup-v${version}-windows-x64.exe\` |
|
|
| macOS, Apple silicon | \`$APP-v${version}-macos-arm64.dmg\` |
|
|
| macOS, Intel | \`$APP-v${version}-macos-x64.dmg\` |
|
|
| Linux (64-bit), Debian, Ubuntu, Mint | \`$APP-v${version}-linux-x64.deb\` |
|
|
| Linux (64-bit), Fedora, openSUSE, RHEL | \`$APP-v${version}-linux-x64.rpm\` |
|
|
|
|
- **Windows:** run the installer. It installs for you without administrator rights, adds an uninstaller (Settings, Apps) and lets Packwright update itself. Windows may warn that the publisher is unknown because it is not code-signed.
|
|
- **macOS:** open the disk image and drag **Packwright** onto **Applications**. The app is not notarized, so the first time you open it go to **System Settings, Privacy & Security** and click **Open Anyway** (step by step in the README under *macOS help*). To uninstall, delete it from Applications.
|
|
- **Linux:** install with your software installer, or \`sudo apt install ./<file>.deb\` / \`sudo dnf install ./<file>.rpm\`. It adds a menu entry and a \`packwright\` command, and is removed with your package manager.
|
|
|
|
Verify a download with \`SHA256SUMS.txt\`.
|
|
|
|
**License and source:** GPL-3.0, with no warranty. Packwright grew out of PS5 PKG Tool by pearlxcore (GPL-3.0), whose engines still power parts of it; the changes and every bundled component are listed in THIRD_PARTY_NOTICES.md, and the license texts are in the \`licenses\` folder of the installed app. The source for this release is the \`v${version}\` tag of this repository.
|
|
NOTES
|
|
- name: Publish the release
|
|
env:
|
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
run: |
|
|
tag="v${{ needs.version.outputs.version }}"
|
|
# Replace an earlier release of the same version so the tag points at this build.
|
|
gh release delete "$tag" --cleanup-tag --yes 2>/dev/null || true
|
|
gh release create "$tag" dist/* \
|
|
--target "$GITHUB_SHA" \
|
|
--title "Packwright $tag" \
|
|
--notes-file notes.md \
|
|
--latest
|