mirror of
https://github.com/storytold/deckcraft.git
synced 2026-10-29 13:06:56 -06:00
Compare commits
5
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a5466741c4 | ||
|
|
688c7ef592 | ||
|
|
a4540c1f0e | ||
|
|
0ec0cc5e81 | ||
|
|
be14248577 |
@@ -23,33 +23,7 @@ permissions:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
freebsd:
|
freebsd:
|
||||||
name: FreeBSD 14 (build + test)
|
# Intentionally tracked at @main (not SHA-pinned) so org-wide CI improvements, security fixes, and build optimizations propagate without PR churn across all craftapp repos.
|
||||||
runs-on: ubuntu-latest
|
uses: storytold/craft-common-actions/.github/workflows/freebsd.yml@main
|
||||||
timeout-minutes: 300
|
with:
|
||||||
steps:
|
craft-fonts-ref: 43913056ce82a3fdad0ef69f6b88d1dc922a8104
|
||||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
||||||
- name: Check out craft-fonts
|
|
||||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
||||||
with:
|
|
||||||
repository: storytold/craft-fonts
|
|
||||||
ref: 43913056ce82a3fdad0ef69f6b88d1dc922a8104
|
|
||||||
path: craft-fonts
|
|
||||||
- name: Build and test in a FreeBSD VM
|
|
||||||
uses: vmactions/freebsd-vm@c46abacb49f09938ca4e1702d15d836285d694cc # v1.5.9
|
|
||||||
with:
|
|
||||||
release: "14.3"
|
|
||||||
usesh: true
|
|
||||||
cpu: 4
|
|
||||||
mem: 12288
|
|
||||||
# Nothing to bring back; copying the target dir out of the VM fails on large builds.
|
|
||||||
copyback: false
|
|
||||||
prepare: |
|
|
||||||
pkg install -y git curl pkgconf cmake python3 libxkbcommon wayland libX11 libXcursor libXrandr libXi libxcb mesa-libs vulkan-loader gtk3 fontconfig freetype2 alsa-lib
|
|
||||||
curl -fsSL https://sh.rustup.rs | sh -s -- -y --profile minimal
|
|
||||||
run: |
|
|
||||||
. "$HOME/.cargo/env"
|
|
||||||
# The checkout is synced in under another owner; let tests that call git read it.
|
|
||||||
git config --global --add safe.directory "*"
|
|
||||||
rustc --version
|
|
||||||
CARGO_PROFILE_DEV_DEBUG=0 cargo build --workspace --all-targets --locked
|
|
||||||
CRAFT_FONTS_DIR="$PWD/craft-fonts" CARGO_PROFILE_DEV_DEBUG=0 cargo test --workspace --locked
|
|
||||||
|
|||||||
@@ -19,48 +19,5 @@ concurrency:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lint:
|
lint:
|
||||||
runs-on: ubuntu-latest
|
# Intentionally tracked at @main (not SHA-pinned) so org-wide CI improvements, security fixes, and build optimizations propagate without PR churn across all craftapp repos.
|
||||||
env:
|
uses: storytold/craft-common-actions/.github/workflows/packaging-lint.yml@main
|
||||||
ACTIONLINT_VERSION: 1.7.12
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
||||||
- name: Install tools
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y --no-install-recommends shellcheck desktop-file-utils appstream libxml2-utils python3-yaml
|
|
||||||
curl -fsSL "https://github.com/rhysd/actionlint/releases/download/v${ACTIONLINT_VERSION}/actionlint_${ACTIONLINT_VERSION}_linux_amd64.tar.gz" \
|
|
||||||
| tar -xz -C "$RUNNER_TEMP" actionlint
|
|
||||||
- name: actionlint
|
|
||||||
run: |
|
|
||||||
"$RUNNER_TEMP/actionlint" -color
|
|
||||||
- name: shellcheck
|
|
||||||
run: shellcheck packaging/*.sh packaging/*/*.sh
|
|
||||||
- name: PowerShell
|
|
||||||
shell: pwsh
|
|
||||||
run: |
|
|
||||||
foreach ($f in Get-ChildItem packaging/windows/*.ps1) {
|
|
||||||
$errors = $null
|
|
||||||
[System.Management.Automation.Language.Parser]::ParseFile($f.FullName, [ref]$null, [ref]$errors) | Out-Null
|
|
||||||
if ($errors) { $errors | ForEach-Object { Write-Output "::error file=$($f.Name)::$_" }; exit 1 }
|
|
||||||
Write-Output "ok $($f.Name)"
|
|
||||||
}
|
|
||||||
- name: XML, desktop entry, AppStream, Flatpak manifest
|
|
||||||
run: |
|
|
||||||
xmllint --noout packaging/windows/deckcraft.wxs packaging/macos/*.plist* packaging/linux/*.xml*
|
|
||||||
# Windows Installer needs Icon ids ending in .ico or .exe, or shortcuts show a blank icon.
|
|
||||||
if grep -oE '<Icon Id="[^"]*"' packaging/windows/deckcraft.wxs | grep -vE '\.(ico|exe)"$'; then
|
|
||||||
echo "::error::Icon Id must end in .ico or .exe"; exit 1
|
|
||||||
fi
|
|
||||||
desktop-file-validate packaging/linux/ai.storyteller.deckcraft.desktop
|
|
||||||
sed -e 's/@VERSION@/0.0.0/' -e 's/@DATE@/2026-01-01/' packaging/linux/ai.storyteller.deckcraft.metainfo.xml.in >"$RUNNER_TEMP/ai.storyteller.deckcraft.metainfo.xml"
|
|
||||||
appstreamcli validate --no-net --explain "$RUNNER_TEMP/ai.storyteller.deckcraft.metainfo.xml"
|
|
||||||
python3 - <<'EOF'
|
|
||||||
import yaml
|
|
||||||
src = yaml.safe_load(open("packaging/linux/flatpak/ai.storyteller.deckcraft.yml"))
|
|
||||||
bundle = yaml.safe_load(open("packaging/linux/flatpak/ai.storyteller.deckcraft.bundle.yml"))
|
|
||||||
for m in (src, bundle):
|
|
||||||
assert m["id"] == "ai.storyteller.deckcraft" and m["command"] == "deckcraft", m["id"]
|
|
||||||
for key in ("runtime", "runtime-version", "sdk", "finish-args"):
|
|
||||||
assert src[key] == bundle[key], f"Flatpak manifests disagree on {key}: {src[key]} vs {bundle[key]}"
|
|
||||||
print("Flatpak manifests ok")
|
|
||||||
EOF
|
|
||||||
|
|||||||
+23
-472
@@ -1,16 +1,3 @@
|
|||||||
# Release pipeline: every push to `release` builds installers for every platform and creates or
|
|
||||||
# updates the draft GitHub Release "DeckCraft v<version>" (tag v<version>). Recipe:
|
|
||||||
# craftrules release/playbook.md.
|
|
||||||
#
|
|
||||||
# The version has one source: `[workspace.package] version` in Cargo.toml (`cargo xtask version`,
|
|
||||||
# `cargo xtask version set X.Y.Z`). The app shows it in About and `--version`; the release name
|
|
||||||
# and tag use it too. workflow_dispatch can override it for a test build (applied to the build).
|
|
||||||
#
|
|
||||||
# The jobs that sign (macOS, Windows) and the one that drafts the release run in the `release`
|
|
||||||
# environment (restricted to the `release` branch), which holds the signing secrets. Every secret
|
|
||||||
# is optional: missing ones produce unsigned artifacts and a warning, never a failed build. The
|
|
||||||
# other jobs sign nothing and get no secrets, so a workflow_dispatch from another branch is a dry
|
|
||||||
# run: they build, the signed jobs are refused by the environment, and no release is drafted.
|
|
||||||
name: Release
|
name: Release
|
||||||
|
|
||||||
on:
|
on:
|
||||||
@@ -24,469 +11,33 @@ on:
|
|||||||
default: ""
|
default: ""
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: write
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: release-${{ github.ref }}
|
group: release-${{ github.ref }}
|
||||||
# Never cancel a run mid-notarization or mid-upload; a newer push waits its turn.
|
|
||||||
cancel-in-progress: false
|
cancel-in-progress: false
|
||||||
|
|
||||||
env:
|
|
||||||
CARGO_TERM_COLOR: always
|
|
||||||
CARGO_INCREMENTAL: 0
|
|
||||||
RUST_BACKTRACE: 1
|
|
||||||
DECKCRAFT_BUILD_SHA: ${{ github.sha }}
|
|
||||||
INPUT_VERSION: ${{ inputs.version }}
|
|
||||||
# Optional font input (storytold/craft-fonts docs/integration.md); releases always embed it.
|
|
||||||
# This commit adds fonts/latin-manifest.txt (the Latin presentation fonts).
|
|
||||||
CRAFT_FONTS_REF: 43913056ce82a3fdad0ef69f6b88d1dc922a8104
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
version:
|
|
||||||
name: version
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
# No `environment: release`: no secrets needed, so branch dry runs get past it.
|
|
||||||
outputs:
|
|
||||||
version: ${{ steps.v.outputs.version }}
|
|
||||||
date: ${{ steps.v.outputs.date }}
|
|
||||||
prerelease: ${{ steps.v.outputs.prerelease }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
||||||
- id: v
|
|
||||||
name: Resolve version
|
|
||||||
run: |
|
|
||||||
. packaging/common.sh
|
|
||||||
v="${INPUT_VERSION#v}"
|
|
||||||
v="${v:-$VERSION}"
|
|
||||||
if ! printf '%s' "$v" | grep -Eq '^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(-[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?$'; then
|
|
||||||
echo "::error::'$v' is not a version like 1.2.3 or 1.2.3-rc.1"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
case "$v" in *-*) pre=true ;; *) pre=false ;; esac
|
|
||||||
{
|
|
||||||
echo "version=$v"
|
|
||||||
echo "date=$(date -u +%Y-%m-%d)"
|
|
||||||
echo "prerelease=$pre"
|
|
||||||
} >>"$GITHUB_OUTPUT"
|
|
||||||
echo "### DeckCraft v$v (\`${GITHUB_SHA::9}\`)" >>"$GITHUB_STEP_SUMMARY"
|
|
||||||
|
|
||||||
macos:
|
|
||||||
name: macOS universal
|
|
||||||
needs: version
|
|
||||||
runs-on: macos-15-xlarge # M2 Pro larger runner; use only in release.yml (actions_macos_xl budget caps spend)
|
|
||||||
environment: release
|
|
||||||
env:
|
|
||||||
DECKCRAFT_VERSION: ${{ needs.version.outputs.version }}
|
|
||||||
DECKCRAFT_BUILD_DATE: ${{ needs.version.outputs.date }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
||||||
- name: Check out craft-fonts
|
|
||||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
||||||
with:
|
|
||||||
repository: storytold/craft-fonts
|
|
||||||
ref: ${{ env.CRAFT_FONTS_REF }}
|
|
||||||
path: craft-fonts
|
|
||||||
- uses: dtolnay/rust-toolchain@686976e191b89faba57d3206551f0f330d8cb249 # stable
|
|
||||||
with:
|
|
||||||
targets: aarch64-apple-darwin, x86_64-apple-darwin
|
|
||||||
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
|
|
||||||
with:
|
|
||||||
key: release-macos-universal
|
|
||||||
- name: Apply version override
|
|
||||||
if: inputs.version != ''
|
|
||||||
run: cargo xtask version set "$DECKCRAFT_VERSION"
|
|
||||||
- name: Import signing certificate
|
|
||||||
env:
|
|
||||||
APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
|
|
||||||
APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
|
|
||||||
KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
|
|
||||||
run: packaging/macos/import-cert.sh
|
|
||||||
- name: Build, sign, notarize
|
|
||||||
env:
|
|
||||||
CRAFT_FONTS_DIR: ${{ github.workspace }}/craft-fonts
|
|
||||||
CRAFT_FONTS_REQUIRED: "1"
|
|
||||||
APPLE_ID: ${{ secrets.APPLE_ID }}
|
|
||||||
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
|
|
||||||
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
|
|
||||||
run: packaging/macos/package.sh --arch universal
|
|
||||||
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
||||||
with:
|
|
||||||
name: release-macos
|
|
||||||
path: dist/release/*
|
|
||||||
if-no-files-found: error
|
|
||||||
- name: Remove temporary keychain
|
|
||||||
if: always()
|
|
||||||
run: |
|
|
||||||
if [ -n "${MACOS_KEYCHAIN:-}" ]; then security delete-keychain "$MACOS_KEYCHAIN" || true; fi
|
|
||||||
|
|
||||||
windows:
|
|
||||||
name: Windows ${{ matrix.arch }}
|
|
||||||
needs: version
|
|
||||||
runs-on: windows-latest
|
|
||||||
environment: release
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- { arch: x64, target: x86_64-pc-windows-msvc }
|
|
||||||
- { arch: x86, target: i686-pc-windows-msvc }
|
|
||||||
# Windows on ARM: cross-compiled on the x64 runner, so signing (x64 signtool / Azure
|
|
||||||
# Trusted Signing) and WiX (-arch arm64) run as above. package.ps1 checks the PE machine
|
|
||||||
# type and skips the CLI smoke test, since an ARM64 exe can't run on the x64 runner.
|
|
||||||
- { arch: arm64, target: aarch64-pc-windows-msvc }
|
|
||||||
env:
|
|
||||||
DECKCRAFT_VERSION: ${{ needs.version.outputs.version }}
|
|
||||||
DECKCRAFT_BUILD_DATE: ${{ needs.version.outputs.date }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
||||||
- name: Check out craft-fonts
|
|
||||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
||||||
with:
|
|
||||||
repository: storytold/craft-fonts
|
|
||||||
ref: ${{ env.CRAFT_FONTS_REF }}
|
|
||||||
path: craft-fonts
|
|
||||||
- uses: dtolnay/rust-toolchain@686976e191b89faba57d3206551f0f330d8cb249 # stable
|
|
||||||
with:
|
|
||||||
targets: ${{ matrix.target }}
|
|
||||||
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
|
|
||||||
with:
|
|
||||||
key: release-windows-${{ matrix.arch }}
|
|
||||||
- name: Apply version override
|
|
||||||
if: inputs.version != ''
|
|
||||||
shell: bash
|
|
||||||
run: cargo xtask version set "$DECKCRAFT_VERSION"
|
|
||||||
- name: Install WiX
|
|
||||||
shell: pwsh
|
|
||||||
run: dotnet tool install --global wix --version 5.0.2
|
|
||||||
- name: Build, sign, package
|
|
||||||
shell: pwsh
|
|
||||||
env:
|
|
||||||
CRAFT_FONTS_DIR: ${{ github.workspace }}/craft-fonts
|
|
||||||
CRAFT_FONTS_REQUIRED: "1"
|
|
||||||
WINDOWS_CERTIFICATE: ${{ secrets.WINDOWS_CERTIFICATE }}
|
|
||||||
WINDOWS_CERTIFICATE_PASSWORD: ${{ secrets.WINDOWS_CERTIFICATE_PASSWORD }}
|
|
||||||
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
|
|
||||||
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
|
|
||||||
AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }}
|
|
||||||
AZURE_SIGNING_ENDPOINT: ${{ secrets.AZURE_SIGNING_ENDPOINT }}
|
|
||||||
AZURE_SIGNING_ACCOUNT: ${{ secrets.AZURE_SIGNING_ACCOUNT }}
|
|
||||||
AZURE_CERT_PROFILE: ${{ secrets.AZURE_CERT_PROFILE }}
|
|
||||||
run: ./packaging/windows/package.ps1 -Arch ${{ matrix.arch }}
|
|
||||||
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
||||||
with:
|
|
||||||
name: release-windows-${{ matrix.arch }}
|
|
||||||
path: dist/release/*
|
|
||||||
if-no-files-found: error
|
|
||||||
|
|
||||||
linux:
|
|
||||||
name: Linux ${{ matrix.arch }}
|
|
||||||
needs: version
|
|
||||||
# The oldest GitHub-hosted image, so the binaries only need glibc >= 2.35 (Ubuntu 22.04+,
|
|
||||||
# Debian 12+, Fedora 36+, RHEL 10).
|
|
||||||
runs-on: ${{ matrix.runner }}
|
|
||||||
# No `environment: release`: this job signs nothing, so it gets no release secrets.
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- { arch: x86_64, runner: ubuntu-22.04, deb: amd64 }
|
|
||||||
- { arch: aarch64, runner: ubuntu-22.04-arm, deb: arm64 }
|
|
||||||
env:
|
|
||||||
DECKCRAFT_VERSION: ${{ needs.version.outputs.version }}
|
|
||||||
DECKCRAFT_BUILD_DATE: ${{ needs.version.outputs.date }}
|
|
||||||
NFPM_VERSION: 2.47.0
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
||||||
- name: Check out craft-fonts
|
|
||||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
||||||
with:
|
|
||||||
repository: storytold/craft-fonts
|
|
||||||
ref: ${{ env.CRAFT_FONTS_REF }}
|
|
||||||
path: craft-fonts
|
|
||||||
- name: Install build and packaging tools
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y --no-install-recommends \
|
|
||||||
libasound2-dev libxkbcommon-dev libwayland-dev libx11-dev libxrandr-dev libxi-dev libgl1-mesa-dev \
|
|
||||||
desktop-file-utils appstream python3-yaml zsync
|
|
||||||
curl -fsSL -o "$RUNNER_TEMP/nfpm.deb" \
|
|
||||||
"https://github.com/goreleaser/nfpm/releases/download/v${NFPM_VERSION}/nfpm_${NFPM_VERSION}_${{ matrix.deb }}.deb"
|
|
||||||
sudo dpkg -i "$RUNNER_TEMP/nfpm.deb"
|
|
||||||
- uses: dtolnay/rust-toolchain@686976e191b89faba57d3206551f0f330d8cb249 # stable
|
|
||||||
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
|
|
||||||
with:
|
|
||||||
key: release-linux-${{ matrix.arch }}
|
|
||||||
- name: Apply version override
|
|
||||||
if: inputs.version != ''
|
|
||||||
run: cargo xtask version set "$DECKCRAFT_VERSION"
|
|
||||||
- name: Build and package (AppImage, deb, rpm, tar.gz)
|
|
||||||
env:
|
|
||||||
CRAFT_FONTS_DIR: ${{ github.workspace }}/craft-fonts
|
|
||||||
CRAFT_FONTS_REQUIRED: "1"
|
|
||||||
run: packaging/linux/package.sh
|
|
||||||
- name: Check the packages
|
|
||||||
run: |
|
|
||||||
dpkg-deb --info dist/release/*.deb
|
|
||||||
dpkg-deb --contents dist/release/*.deb | grep -E 'usr/bin/deckcraft$|metainfo|applications'
|
|
||||||
ldd target/release/deckcraft
|
|
||||||
for appimage in dist/release/*.AppImage; do
|
|
||||||
chmod +x "$appimage"
|
|
||||||
APPIMAGE_EXTRACT_AND_RUN=1 "$appimage" --version
|
|
||||||
# Update information is embedded, and the .zsync for delta updates sits beside it.
|
|
||||||
"$appimage" --appimage-updateinformation | grep -F 'gh-releases-zsync|'
|
|
||||||
test -s "$appimage.zsync"
|
|
||||||
done
|
|
||||||
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
||||||
with:
|
|
||||||
name: release-linux-${{ matrix.arch }}
|
|
||||||
path: dist/release/*
|
|
||||||
if-no-files-found: error
|
|
||||||
|
|
||||||
flatpak:
|
|
||||||
name: Flatpak ${{ matrix.arch }}
|
|
||||||
needs: [version, linux]
|
|
||||||
# Repackages the Linux job's tarball (the same binaries as the AppImage/deb/rpm, with the
|
|
||||||
# craft-fonts embedded); no Rust build here. packaging/linux/flatpak/ai.storyteller.deckcraft.yml
|
|
||||||
# stays the from-source manifest for Flathub. 24.04 for a newer flatpak-builder (1.4) than
|
|
||||||
# 22.04 ships.
|
|
||||||
runs-on: ${{ matrix.runner }}
|
|
||||||
# No `environment: release`: this job signs nothing, so it gets no release secrets.
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- { arch: x86_64, runner: ubuntu-24.04 }
|
|
||||||
- { arch: aarch64, runner: ubuntu-24.04-arm }
|
|
||||||
env:
|
|
||||||
DECKCRAFT_VERSION: ${{ needs.version.outputs.version }}
|
|
||||||
DECKCRAFT_BUILD_DATE: ${{ needs.version.outputs.date }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
||||||
- uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
|
|
||||||
with:
|
|
||||||
name: release-linux-${{ matrix.arch }}
|
|
||||||
path: dist/linux
|
|
||||||
- name: Install flatpak-builder
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
# librsvg2-common: the SVG pixbuf loader. flatpak-builder runs the host's
|
|
||||||
# `appstreamcli compose`, which can fail without it.
|
|
||||||
sudo apt-get install -y --no-install-recommends flatpak flatpak-builder librsvg2-common
|
|
||||||
# Ubuntu 24.04's AppArmor blocks the unprivileged user namespaces bubblewrap needs.
|
|
||||||
sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0
|
|
||||||
- name: Build the Flatpak bundle
|
|
||||||
run: packaging/linux/flatpak-bundle.sh "dist/linux/deckcraft-$DECKCRAFT_VERSION-linux-${{ matrix.arch }}.tar.gz"
|
|
||||||
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
||||||
with:
|
|
||||||
name: release-flatpak-${{ matrix.arch }}
|
|
||||||
path: dist/release/*.flatpak
|
|
||||||
if-no-files-found: error
|
|
||||||
|
|
||||||
freebsd:
|
|
||||||
name: FreeBSD x86_64
|
|
||||||
needs: version
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
# No `environment: release`: this job signs nothing, so it gets no release secrets.
|
|
||||||
timeout-minutes: 240
|
|
||||||
env:
|
|
||||||
DECKCRAFT_VERSION: ${{ needs.version.outputs.version }}
|
|
||||||
DECKCRAFT_BUILD_DATE: ${{ needs.version.outputs.date }}
|
|
||||||
VERSION_OVERRIDE: ${{ inputs.version }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
||||||
- name: Check out craft-fonts
|
|
||||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
||||||
with:
|
|
||||||
repository: storytold/craft-fonts
|
|
||||||
ref: ${{ env.CRAFT_FONTS_REF }}
|
|
||||||
path: craft-fonts
|
|
||||||
- name: Build and package in a FreeBSD VM
|
|
||||||
uses: vmactions/freebsd-vm@c46abacb49f09938ca4e1702d15d836285d694cc # v1.5.9
|
|
||||||
with:
|
|
||||||
release: "14.3"
|
|
||||||
usesh: true
|
|
||||||
cpu: 4
|
|
||||||
mem: 12288
|
|
||||||
envs: DECKCRAFT_VERSION DECKCRAFT_BUILD_DATE DECKCRAFT_BUILD_SHA VERSION_OVERRIDE
|
|
||||||
# Copies the workspace (with dist/release) back; the target dir lives outside it so the
|
|
||||||
# copy stays small.
|
|
||||||
copyback: true
|
|
||||||
prepare: |
|
|
||||||
pkg install -y bash git curl pkgconf cmake python3 libxkbcommon wayland libX11 libXcursor libXrandr libXi libxcb mesa-libs vulkan-loader fontconfig freetype2 alsa-lib
|
|
||||||
curl -fsSL https://sh.rustup.rs | sh -s -- -y --profile minimal
|
|
||||||
run: |
|
|
||||||
. "$HOME/.cargo/env"
|
|
||||||
git config --global --add safe.directory "*"
|
|
||||||
export CARGO_TARGET_DIR="$HOME/target" CRAFT_FONTS_DIR="$PWD/craft-fonts" CRAFT_FONTS_REQUIRED=1
|
|
||||||
if [ -n "$VERSION_OVERRIDE" ]; then cargo xtask version set "$DECKCRAFT_VERSION"; fi
|
|
||||||
bash packaging/freebsd/package.sh
|
|
||||||
tar -tzf dist/release/deckcraft-*-freebsd-x86_64.tar.gz \
|
|
||||||
| grep -E '/bin/deckcraft$|/bin/deckcraft-cli$|/share/applications/ai\.storyteller\.deckcraft\.desktop$'
|
|
||||||
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
||||||
with:
|
|
||||||
name: release-freebsd
|
|
||||||
path: dist/release/*
|
|
||||||
if-no-files-found: error
|
|
||||||
|
|
||||||
web:
|
|
||||||
name: Web (wasm)
|
|
||||||
needs: version
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
# No `environment: release`: this job signs nothing, so it gets no release secrets.
|
|
||||||
env:
|
|
||||||
DECKCRAFT_VERSION: ${{ needs.version.outputs.version }}
|
|
||||||
DECKCRAFT_BUILD_DATE: ${{ needs.version.outputs.date }}
|
|
||||||
TRUNK_VERSION: 0.21.14
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
||||||
- name: Check out craft-fonts
|
|
||||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
||||||
with:
|
|
||||||
repository: storytold/craft-fonts
|
|
||||||
ref: ${{ env.CRAFT_FONTS_REF }}
|
|
||||||
path: craft-fonts
|
|
||||||
- uses: dtolnay/rust-toolchain@686976e191b89faba57d3206551f0f330d8cb249 # stable
|
|
||||||
with:
|
|
||||||
targets: wasm32-unknown-unknown
|
|
||||||
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
|
|
||||||
with:
|
|
||||||
key: release-web
|
|
||||||
- name: Install trunk
|
|
||||||
run: |
|
|
||||||
curl -fsSL "https://github.com/trunk-rs/trunk/releases/download/v${TRUNK_VERSION}/trunk-x86_64-unknown-linux-gnu.tar.gz" \
|
|
||||||
| tar -xz -C "$HOME/.cargo/bin" trunk
|
|
||||||
trunk --version
|
|
||||||
- name: Apply version override
|
|
||||||
if: inputs.version != ''
|
|
||||||
run: cargo xtask version set "$DECKCRAFT_VERSION"
|
|
||||||
- name: Build and zip
|
|
||||||
env:
|
|
||||||
CRAFT_FONTS_DIR: ${{ github.workspace }}/craft-fonts
|
|
||||||
CRAFT_FONTS_REQUIRED: "1"
|
|
||||||
run: packaging/web/package.sh
|
|
||||||
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
||||||
with:
|
|
||||||
name: release-web
|
|
||||||
path: dist/release/*
|
|
||||||
if-no-files-found: error
|
|
||||||
|
|
||||||
linux-riscv64:
|
|
||||||
name: Linux riscv64
|
|
||||||
needs: version
|
|
||||||
# Cross-compiled on x86_64 (no hosted RISC-V runners) against the runner's own Ubuntu release
|
|
||||||
# from ports.ubuntu.com, so the binaries need that release's glibc (24.04: 2.39). 22.04's
|
|
||||||
# riscv64 ports lag its amd64 updates, which breaks the multiarch install. tar.gz only; the
|
|
||||||
# CLI is smoke-tested under QEMU.
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
# No `environment: release`: this job signs nothing, so it gets no release secrets.
|
|
||||||
env:
|
|
||||||
DECKCRAFT_VERSION: ${{ needs.version.outputs.version }}
|
|
||||||
DECKCRAFT_BUILD_DATE: ${{ needs.version.outputs.date }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
||||||
- name: Check out craft-fonts
|
|
||||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
||||||
with:
|
|
||||||
repository: storytold/craft-fonts
|
|
||||||
ref: ${{ env.CRAFT_FONTS_REF }}
|
|
||||||
path: craft-fonts
|
|
||||||
- uses: dtolnay/rust-toolchain@686976e191b89faba57d3206551f0f330d8cb249 # stable
|
|
||||||
with:
|
|
||||||
targets: riscv64gc-unknown-linux-gnu
|
|
||||||
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
|
|
||||||
with:
|
|
||||||
key: release-linux-riscv64
|
|
||||||
- name: Apply version override
|
|
||||||
if: inputs.version != ''
|
|
||||||
run: cargo xtask version set "$DECKCRAFT_VERSION"
|
|
||||||
- name: Install cross-compilation dependencies
|
|
||||||
run: |
|
|
||||||
. /etc/os-release
|
|
||||||
sudo dpkg --add-architecture riscv64
|
|
||||||
# Pin the existing (archive.ubuntu.com) sources to amd64; riscv64 comes from ports.
|
|
||||||
if [ -f /etc/apt/sources.list.d/ubuntu.sources ]; then
|
|
||||||
sudo sed -i '/^Types: deb/a Architectures: amd64' /etc/apt/sources.list.d/ubuntu.sources
|
|
||||||
fi
|
|
||||||
if [ -f /etc/apt/sources.list ]; then
|
|
||||||
sudo sed -i 's/^deb /deb [arch=amd64] /g' /etc/apt/sources.list
|
|
||||||
sudo sed -i 's/^deb-src /deb-src [arch=amd64] /g' /etc/apt/sources.list
|
|
||||||
fi
|
|
||||||
for suite in "$VERSION_CODENAME" "$VERSION_CODENAME-updates" "$VERSION_CODENAME-security"; do
|
|
||||||
echo "deb [arch=riscv64] http://ports.ubuntu.com/ubuntu-ports $suite main universe restricted multiverse"
|
|
||||||
done | sudo tee /etc/apt/sources.list.d/riscv64.list
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y --no-install-recommends \
|
|
||||||
gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu libc6-dev-riscv64-cross libc6-dev:riscv64 qemu-user \
|
|
||||||
libasound2-dev:riscv64 libxkbcommon-dev:riscv64 libwayland-dev:riscv64 libx11-dev:riscv64 \
|
|
||||||
libxrandr-dev:riscv64 libxi-dev:riscv64 libgl1-mesa-dev:riscv64
|
|
||||||
- name: Build and package (tar.gz)
|
|
||||||
env:
|
|
||||||
CRAFT_FONTS_DIR: ${{ github.workspace }}/craft-fonts
|
|
||||||
CRAFT_FONTS_REQUIRED: "1"
|
|
||||||
CARGO_TARGET_RISCV64GC_UNKNOWN_LINUX_GNU_LINKER: riscv64-linux-gnu-gcc
|
|
||||||
PKG_CONFIG_SYSROOT_DIR: /
|
|
||||||
PKG_CONFIG_PATH: /usr/lib/riscv64-linux-gnu/pkgconfig:/usr/share/pkgconfig
|
|
||||||
PKG_CONFIG_ALLOW_CROSS: "1"
|
|
||||||
CROSS_ARCH: riscv64
|
|
||||||
CROSS_TARGET: riscv64gc-unknown-linux-gnu
|
|
||||||
CROSS_COMPILE: riscv64-linux-gnu-
|
|
||||||
EMULATOR: qemu-riscv64
|
|
||||||
QEMU_LD_PREFIX: /usr/riscv64-linux-gnu
|
|
||||||
run: packaging/linux/package.sh --formats tar
|
|
||||||
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
||||||
with:
|
|
||||||
name: release-linux-riscv64
|
|
||||||
path: dist/release/*.tar.gz
|
|
||||||
if-no-files-found: error
|
|
||||||
|
|
||||||
release:
|
release:
|
||||||
name: Draft GitHub Release
|
# Intentionally tracked at @main (not SHA-pinned) so org-wide CI improvements, security fixes, and build optimizations propagate without PR churn across all craftapp repos.
|
||||||
# Every build is required, so the draft always has the full set the README lists. Needing the
|
uses: storytold/craft-common-actions/.github/workflows/release.yml@main
|
||||||
# signed jobs also keeps branch dry runs from drafting a release.
|
with:
|
||||||
needs: [version, macos, windows, linux, linux-riscv64, flatpak, freebsd, web]
|
app-name: deckcraft
|
||||||
runs-on: ubuntu-latest
|
app-title: DeckCraft
|
||||||
environment: release
|
craft-fonts-ref: 43913056ce82a3fdad0ef69f6b88d1dc922a8104
|
||||||
permissions:
|
version: ${{ inputs.version }}
|
||||||
contents: write
|
secrets:
|
||||||
env:
|
APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
|
||||||
VERSION: ${{ needs.version.outputs.version }}
|
APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
|
||||||
PRERELEASE: ${{ needs.version.outputs.prerelease }}
|
KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
|
||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
APPLE_ID: ${{ secrets.APPLE_ID }}
|
||||||
GH_REPO: ${{ github.repository }}
|
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
|
||||||
steps:
|
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
|
||||||
- uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
|
WINDOWS_CERTIFICATE: ${{ secrets.WINDOWS_CERTIFICATE }}
|
||||||
with:
|
WINDOWS_CERTIFICATE_PASSWORD: ${{ secrets.WINDOWS_CERTIFICATE_PASSWORD }}
|
||||||
pattern: release-*
|
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
|
||||||
path: artifacts
|
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
|
||||||
merge-multiple: true
|
AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }}
|
||||||
- name: Checksums
|
AZURE_SIGNING_ENDPOINT: ${{ secrets.AZURE_SIGNING_ENDPOINT }}
|
||||||
working-directory: artifacts
|
AZURE_SIGNING_ACCOUNT: ${{ secrets.AZURE_SIGNING_ACCOUNT }}
|
||||||
run: |
|
AZURE_CERT_PROFILE: ${{ secrets.AZURE_CERT_PROFILE }}
|
||||||
sha256sum -- * | tee SHA256SUMS.txt
|
|
||||||
- name: Create or update the draft release
|
|
||||||
working-directory: artifacts
|
|
||||||
run: |
|
|
||||||
tag="v$VERSION"
|
|
||||||
title="DeckCraft v$VERSION"
|
|
||||||
pre=()
|
|
||||||
if [ "$PRERELEASE" = true ]; then pre=(--prerelease); fi
|
|
||||||
if draft="$(gh release view "$tag" --json isDraft --jq .isDraft 2>/dev/null)"; then
|
|
||||||
if [ "$draft" != "true" ]; then
|
|
||||||
echo "::error::Release $tag is already published. Bump the version (cargo xtask version set) before pushing to release."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo "Updating draft $tag: replacing its assets"
|
|
||||||
gh release view "$tag" --json assets --jq '.assets[].name' | while read -r asset; do
|
|
||||||
gh release delete-asset "$tag" "$asset" --yes
|
|
||||||
done
|
|
||||||
gh release edit "$tag" --draft --title "$title" --target "$GITHUB_SHA" --prerelease="$PRERELEASE"
|
|
||||||
gh release upload "$tag" --clobber -- *
|
|
||||||
else
|
|
||||||
echo "Creating draft $tag"
|
|
||||||
gh release create "$tag" --draft --title "$title" --target "$GITHUB_SHA" --generate-notes "${pre[@]}" -- *
|
|
||||||
fi
|
|
||||||
{
|
|
||||||
echo "Draft release **$title** at \`${GITHUB_SHA::9}\`:"
|
|
||||||
echo
|
|
||||||
sed 's/^/ /' SHA256SUMS.txt
|
|
||||||
} >>"$GITHUB_STEP_SUMMARY"
|
|
||||||
|
|||||||
Generated
+27
-27
@@ -877,7 +877,7 @@ checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deckcraft"
|
name = "deckcraft"
|
||||||
version = "0.5.0"
|
version = "0.6.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"arboard",
|
"arboard",
|
||||||
"cpal",
|
"cpal",
|
||||||
@@ -896,7 +896,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deckcraft-anim"
|
name = "deckcraft-anim"
|
||||||
version = "0.5.0"
|
version = "0.6.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"deckcraft-geom",
|
"deckcraft-geom",
|
||||||
"deckcraft-model",
|
"deckcraft-model",
|
||||||
@@ -905,7 +905,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deckcraft-av1"
|
name = "deckcraft-av1"
|
||||||
version = "0.5.0"
|
version = "0.6.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"deckcraft-bitstream",
|
"deckcraft-bitstream",
|
||||||
"rayon",
|
"rayon",
|
||||||
@@ -914,14 +914,14 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deckcraft-bitstream"
|
name = "deckcraft-bitstream"
|
||||||
version = "0.5.0"
|
version = "0.6.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proptest",
|
"proptest",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deckcraft-cli"
|
name = "deckcraft-cli"
|
||||||
version = "0.5.0"
|
version = "0.6.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"deckcraft-engine",
|
"deckcraft-engine",
|
||||||
"deckcraft-mcp",
|
"deckcraft-mcp",
|
||||||
@@ -930,14 +930,14 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deckcraft-color"
|
name = "deckcraft-color"
|
||||||
version = "0.5.0"
|
version = "0.6.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deckcraft-engine"
|
name = "deckcraft-engine"
|
||||||
version = "0.5.0"
|
version = "0.6.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"deckcraft-color",
|
"deckcraft-color",
|
||||||
"deckcraft-fonts",
|
"deckcraft-fonts",
|
||||||
@@ -959,7 +959,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deckcraft-fonts"
|
name = "deckcraft-fonts"
|
||||||
version = "0.5.0"
|
version = "0.6.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"epaint_default_fonts",
|
"epaint_default_fonts",
|
||||||
"harfrust 0.13.3",
|
"harfrust 0.13.3",
|
||||||
@@ -971,7 +971,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deckcraft-format"
|
name = "deckcraft-format"
|
||||||
version = "0.5.0"
|
version = "0.6.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"deckcraft-model",
|
"deckcraft-model",
|
||||||
"serde",
|
"serde",
|
||||||
@@ -982,7 +982,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deckcraft-geom"
|
name = "deckcraft-geom"
|
||||||
version = "0.5.0"
|
version = "0.6.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"kurbo",
|
"kurbo",
|
||||||
"serde",
|
"serde",
|
||||||
@@ -990,7 +990,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deckcraft-h264"
|
name = "deckcraft-h264"
|
||||||
version = "0.5.0"
|
version = "0.6.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"deckcraft-bitstream",
|
"deckcraft-bitstream",
|
||||||
"rayon",
|
"rayon",
|
||||||
@@ -999,7 +999,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deckcraft-hevc"
|
name = "deckcraft-hevc"
|
||||||
version = "0.5.0"
|
version = "0.6.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"deckcraft-bitstream",
|
"deckcraft-bitstream",
|
||||||
"rayon",
|
"rayon",
|
||||||
@@ -1008,7 +1008,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deckcraft-isobmff"
|
name = "deckcraft-isobmff"
|
||||||
version = "0.5.0"
|
version = "0.6.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"deckcraft-bitstream",
|
"deckcraft-bitstream",
|
||||||
"thiserror 2.0.21",
|
"thiserror 2.0.21",
|
||||||
@@ -1016,11 +1016,11 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deckcraft-matroska"
|
name = "deckcraft-matroska"
|
||||||
version = "0.5.0"
|
version = "0.6.1"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deckcraft-mcp"
|
name = "deckcraft-mcp"
|
||||||
version = "0.5.0"
|
version = "0.6.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"deckcraft-engine",
|
"deckcraft-engine",
|
||||||
"deckcraft-render",
|
"deckcraft-render",
|
||||||
@@ -1030,7 +1030,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deckcraft-media"
|
name = "deckcraft-media"
|
||||||
version = "0.5.0"
|
version = "0.6.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"deckcraft-av1",
|
"deckcraft-av1",
|
||||||
"deckcraft-h264",
|
"deckcraft-h264",
|
||||||
@@ -1048,7 +1048,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deckcraft-model"
|
name = "deckcraft-model"
|
||||||
version = "0.5.0"
|
version = "0.6.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"deckcraft-color",
|
"deckcraft-color",
|
||||||
"deckcraft-geom",
|
"deckcraft-geom",
|
||||||
@@ -1059,15 +1059,15 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deckcraft-ogg"
|
name = "deckcraft-ogg"
|
||||||
version = "0.5.0"
|
version = "0.6.1"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deckcraft-opus"
|
name = "deckcraft-opus"
|
||||||
version = "0.5.0"
|
version = "0.6.1"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deckcraft-pdf"
|
name = "deckcraft-pdf"
|
||||||
version = "0.5.0"
|
version = "0.6.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"deckcraft-fonts",
|
"deckcraft-fonts",
|
||||||
"deckcraft-model",
|
"deckcraft-model",
|
||||||
@@ -1082,7 +1082,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deckcraft-pptx"
|
name = "deckcraft-pptx"
|
||||||
version = "0.5.0"
|
version = "0.6.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"deckcraft-color",
|
"deckcraft-color",
|
||||||
"deckcraft-engine",
|
"deckcraft-engine",
|
||||||
@@ -1098,7 +1098,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deckcraft-render"
|
name = "deckcraft-render"
|
||||||
version = "0.5.0"
|
version = "0.6.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"deckcraft-color",
|
"deckcraft-color",
|
||||||
"deckcraft-fonts",
|
"deckcraft-fonts",
|
||||||
@@ -1114,7 +1114,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deckcraft-text"
|
name = "deckcraft-text"
|
||||||
version = "0.5.0"
|
version = "0.6.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"chrono",
|
"chrono",
|
||||||
"deckcraft-color",
|
"deckcraft-color",
|
||||||
@@ -1128,7 +1128,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deckcraft-ui-egui"
|
name = "deckcraft-ui-egui"
|
||||||
version = "0.5.0"
|
version = "0.6.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"deckcraft-anim",
|
"deckcraft-anim",
|
||||||
"deckcraft-color",
|
"deckcraft-color",
|
||||||
@@ -1150,7 +1150,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deckcraft-vp9"
|
name = "deckcraft-vp9"
|
||||||
version = "0.5.0"
|
version = "0.6.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"deckcraft-bitstream",
|
"deckcraft-bitstream",
|
||||||
"rayon",
|
"rayon",
|
||||||
@@ -1159,7 +1159,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deckcraft-web"
|
name = "deckcraft-web"
|
||||||
version = "0.5.0"
|
version = "0.6.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"deckcraft-engine",
|
"deckcraft-engine",
|
||||||
"deckcraft-ui-egui",
|
"deckcraft-ui-egui",
|
||||||
@@ -5655,7 +5655,7 @@ checksum = "9440ea3e5aeabb0ac63af70daf835274065238cdd0cec83418f417eae38bacee"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "xtask"
|
name = "xtask"
|
||||||
version = "0.5.0"
|
version = "0.6.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde_json",
|
"serde_json",
|
||||||
]
|
]
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@ members = ["crates/*", "apps/*", "xtask"]
|
|||||||
default-members = ["crates/*", "apps/deckcraft", "apps/deckcraft-cli"]
|
default-members = ["crates/*", "apps/deckcraft", "apps/deckcraft-cli"]
|
||||||
|
|
||||||
[workspace.package]
|
[workspace.package]
|
||||||
version = "0.5.0"
|
version = "0.6.1"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
rust-version = "1.90"
|
rust-version = "1.90"
|
||||||
|
|||||||
+10
-4
@@ -566,6 +566,9 @@ fn shape_cells(ctx: &Ctx, text: &str, char_style: &[usize], styles: &[Style], fa
|
|||||||
cells
|
cells
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Size of superscript and subscript text relative to the run's size.
|
||||||
|
const SUB_SUPER: f64 = 0.66;
|
||||||
|
|
||||||
/// Shape cells `range` (one item) and hang each cluster's glyphs on its first cell, sharing the
|
/// Shape cells `range` (one item) and hang each cluster's glyphs on its first cell, sharing the
|
||||||
/// cluster's advance among its graphemes (by the ligature's GDEF carets when it has them).
|
/// cluster's advance among its graphemes (by the ligature's GDEF carets when it has them).
|
||||||
#[allow(clippy::too_many_arguments)]
|
#[allow(clippy::too_many_arguments)]
|
||||||
@@ -593,7 +596,11 @@ fn shape_item(
|
|||||||
let st = styles.get(cell.style);
|
let st = styles.get(cell.style);
|
||||||
let size = st.map(|s| s.size).unwrap_or(18.0);
|
let size = st.map(|s| s.size).unwrap_or(18.0);
|
||||||
let small = st.is_some_and(|s| s.caps == Caps::Small) && cell.ch.is_lowercase();
|
let small = st.is_some_and(|s| s.caps == Caps::Small) && cell.ch.is_lowercase();
|
||||||
(if small { size * 0.8 } else { size }) / upem
|
let size = if small { size * 0.8 } else { size };
|
||||||
|
// Superscript and subscript glyphs are drawn at two thirds of the size, so they advance by
|
||||||
|
// two thirds too.
|
||||||
|
let size = if st.is_some_and(|s| s.baseline != 0.0) { size * SUB_SUPER } else { size };
|
||||||
|
size / upem
|
||||||
};
|
};
|
||||||
// Cluster heads in this item, ascending; each cluster spans to the next head.
|
// Cluster heads in this item, ascending; each cluster spans to the next head.
|
||||||
let mut heads: Vec<usize> = glyphs.iter().filter_map(|g| char_at_byte.get(&g.cluster).copied()).filter(|h| range.contains(h)).collect();
|
let mut heads: Vec<usize> = glyphs.iter().filter_map(|g| char_at_byte.get(&g.cluster).copied()).filter(|h| range.contains(h)).collect();
|
||||||
@@ -1155,7 +1162,7 @@ fn layout_scaled(ctx: &Ctx, shape: &Shape, body: &TextBody, bp: &BodyProps, opts
|
|||||||
let Some(st) = p.styles.get(cell.style) else { continue };
|
let Some(st) = p.styles.get(cell.style) else { continue };
|
||||||
let Some(&(cx, cx1)) = line.edges.get(k) else { continue };
|
let Some(&(cx, cx1)) = line.edges.get(k) else { continue };
|
||||||
let base_y = line.baseline - st.baseline * st.size;
|
let base_y = line.baseline - st.baseline * st.size;
|
||||||
let size = if st.baseline != 0.0 { st.size * 0.66 } else { st.size };
|
let size = if st.baseline != 0.0 { st.size * SUB_SUPER } else { st.size };
|
||||||
let size = if st.caps == Caps::Small && cell.ch.is_lowercase() { size * 0.8 } else { size };
|
let size = if st.caps == Caps::Small && cell.ch.is_lowercase() { size * 0.8 } else { size };
|
||||||
let key = (cell.style, cell.face);
|
let key = (cell.style, cell.face);
|
||||||
if key != cur_key {
|
if key != cur_key {
|
||||||
@@ -1204,9 +1211,8 @@ fn layout_scaled(ctx: &Ctx, shape: &Shape, body: &TextBody, bp: &BodyProps, opts
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let k66 = if st.baseline != 0.0 { 0.66 } else { 1.0 };
|
|
||||||
for (gid, gx, gy) in &cell.glyphs {
|
for (gid, gx, gy) in &cell.glyphs {
|
||||||
r.glyphs.push((*gid, cl + kash + gx * k66, base_y + gy));
|
r.glyphs.push((*gid, cl + kash + gx, base_y + gy));
|
||||||
r.cells.push((ci, cell.ch));
|
r.cells.push((ci, cell.ch));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -395,3 +395,41 @@ fn hostile_bidi_input_never_panics() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Width of `word` laid out in a run with `baseline` (0 = normal, 0.3 = superscript …).
|
||||||
|
fn run_width(word: &str, baseline: Option<f64>) -> f64 {
|
||||||
|
let mut run = Run::new(word);
|
||||||
|
run.props.size = Some(24.0);
|
||||||
|
run.props.baseline = baseline;
|
||||||
|
let (p, sh) = bidi_setup(vec![run], 2000.0, false, Align::Left);
|
||||||
|
let l = lay(&p, &sh, 2000.0, 300.0);
|
||||||
|
let line = &l.lines[0];
|
||||||
|
line.caret_x.last().unwrap() - line.caret_x.first().unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn superscript_and_subscript_advance_at_their_drawn_size() {
|
||||||
|
// The glyphs are drawn at two thirds of the size; advancing by the full size spread the
|
||||||
|
// letters apart ("s u p e r").
|
||||||
|
let normal = run_width("superscript", None);
|
||||||
|
for b in [Some(0.3), Some(-0.25)] {
|
||||||
|
let w = run_width("superscript", b);
|
||||||
|
assert!((w / normal - SUB_SUPER).abs() < 0.02, "{b:?}: {w} vs {normal}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn superscript_glyphs_sit_inside_their_cells() {
|
||||||
|
let mut run = Run::new("super");
|
||||||
|
run.props.size = Some(24.0);
|
||||||
|
run.props.baseline = Some(0.3);
|
||||||
|
let (p, sh) = bidi_setup(vec![run], 2000.0, false, Align::Left);
|
||||||
|
let l = lay(&p, &sh, 2000.0, 300.0);
|
||||||
|
let line = &l.lines[0];
|
||||||
|
let r = l.runs.iter().find(|r| !r.cells.is_empty()).unwrap();
|
||||||
|
assert!((r.size - 24.0 * SUB_SUPER).abs() < 1e-6);
|
||||||
|
for (g, (ci, _)) in r.glyphs.iter().zip(&r.cells) {
|
||||||
|
let (x0, x1) = line.edges[*ci - line.start];
|
||||||
|
assert!(g.1 >= x0 - 0.01 && g.1 < x1, "glyph at {} outside its cell {x0}..{x1}", g.1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user