mirror of
https://github.com/itsmemac/Packwright.git
synced 2026-10-06 09:00:21 +02:00
Packwright 1.0.0
A cross-platform (Windows, Linux, macOS) manager for PS5 dumps, images and packages, grown out of PS5 PKG Tool by pearlxcore (GPL-3.0). - Library of dumps, packages and images (cards or list), search language, grouping, saved views, health report and export (CSV, JSON, web page) - Edit and autofill details (including region, IDs, versions, features and icon), in the library or written into the file; optional Title ID lookup - Convert, build, extract, verify, repair and edit exFAT, FFPKG, FFPFSC and ZArchive images and debug packages, with presets - Send to console over FTP or by URL on the local network - Command-line mode - Installers for Windows, macOS and Linux, and an opt-in update check See README.md and THIRD_PARTY_NOTICES.md for credits, licenses and the list of changes made to the original project.
This commit is contained in:
183 files changed
+38228
No files matched your search
@@ -0,0 +1,22 @@
|
||||
name: Build
|
||||
|
||||
# Pull requests are built on all four targets to catch breakage. Pushes to main are built and released
|
||||
# by release.yml.
|
||||
on:
|
||||
pull_request:
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
rid: [win-x64, linux-x64, osx-arm64, osx-x64]
|
||||
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 src/Packwright.App/Packwright.App.csproj -c Release -r ${{ matrix.rid }} --self-contained true -o publish
|
||||
@@ -0,0 +1,222 @@
|
||||
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)
|
||||
cat > notes.md <<NOTES
|
||||
## Packwright v${version}
|
||||
|
||||
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
|
||||
Reference in new issue
Block a user