Merge remote-tracking branch 'origin/main' into integration-batch-7

# Conflicts:
#	crates/engine/Cargo.toml
This commit is contained in:
David Mann
2026-10-23 23:13:46 +02:00
7 changed files with 41 additions and 12 deletions
+2 -1
View File
@@ -11,7 +11,8 @@ permissions:
concurrency: concurrency:
group: sonarcloud-${{ github.ref }} group: sonarcloud-${{ github.ref }}
cancel-in-progress: true # A push to main is the run that publishes coverage; superseded runs there would never finish.
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
jobs: jobs:
sonarcloud: sonarcloud:
Generated
+2 -2
View File
@@ -4839,7 +4839,7 @@ dependencies = [
"photocraft-text", "photocraft-text",
"photocraft-vector", "photocraft-vector",
"rayon", "rayon",
"roxmltree 0.20.0", "roxmltree 0.21.1",
"same-file", "same-file",
"semver", "semver",
"serde", "serde",
@@ -4931,7 +4931,7 @@ dependencies = [
"photocraft-vector", "photocraft-vector",
"proptest", "proptest",
"resvg", "resvg",
"roxmltree 0.20.0", "roxmltree 0.21.1",
"serde_json", "serde_json",
"thiserror 2.0.21", "thiserror 2.0.21",
] ]
+1 -1
View File
@@ -38,7 +38,7 @@ craft-print = { workspace = true }
# Photoshop `.kys` shortcut sets (`edit.keyboardShortcuts` `importKys`); already in the tree # Photoshop `.kys` shortcut sets (`edit.keyboardShortcuts` `importKys`); already in the tree
# through photocraft-ui-egui and usvg. # through photocraft-ui-egui and usvg.
roxmltree = "0.20" roxmltree = "0.21"
# Release tags use the same semantic versions as Cargo. # Release tags use the same semantic versions as Cargo.
semver = "1" semver = "1"
+1 -1
View File
@@ -39,7 +39,7 @@ blake3 = { version = "1.8", default-features = false, features = ["pure"] }
# pdn.rs inflates Paint.NET's gzip pixel chunks. # pdn.rs inflates Paint.NET's gzip pixel chunks.
flate2 = { workspace = true } flate2 = { workspace = true }
# ora.rs reads OpenRaster's stack.xml (already in the tree through usvg). # ora.rs reads OpenRaster's stack.xml (already in the tree through usvg).
roxmltree = "0.20" roxmltree = "0.21"
# SVG import (svg.rs): usvg parses, resvg rasterises what the shape model can't hold. Both are # SVG import (svg.rs): usvg parses, resvg rasterises what the shape model can't hold. Both are
# already in the tree through the UI's icon loader; text shaping needs the fonts feature set. # already in the tree through the UI's icon loader; text shaping needs the fonts feature set.
[target.'cfg(not(target_arch = "wasm32"))'.dependencies] [target.'cfg(not(target_arch = "wasm32"))'.dependencies]
+20 -4
View File
@@ -97,6 +97,24 @@ notarize() {
fi fi
} }
# Stapling and validating both look the ticket up in Apple's CloudKit service. Right after
# notarization that lookup can drop the connection ("The network connection was lost", error 68)
# even though the ticket exists, so retry the pair a few times before failing the release.
staple() {
local file="$1" attempt
for attempt in 1 2 3 4 5; do
if xcrun stapler staple "$file" && xcrun stapler validate "$file"; then
return
fi
if [ "$attempt" = 5 ]; then
echo "error: stapling $(basename "$file") failed after $attempt attempts" >&2
exit 1
fi
echo "stapling $(basename "$file") failed (attempt $attempt); retrying in $((attempt * 20))s" >&2
sleep $((attempt * 20))
done
}
# ---- PhotoCraft.app ---------------------------------------------------------------------------- # ---- PhotoCraft.app ----------------------------------------------------------------------------
echo "==> assembling $APP" echo "==> assembling $APP"
mkdir -p "$APP/Contents/MacOS" "$APP/Contents/Resources" mkdir -p "$APP/Contents/MacOS" "$APP/Contents/Resources"
@@ -123,8 +141,7 @@ codesign --verify --strict --deep --verbose=2 "$APP"
if [[ "$NOTARIZE" = 1 ]]; then if [[ "$NOTARIZE" = 1 ]]; then
ditto -c -k --keepParent "$APP" "$WORK/PhotoCraft-notarize.zip" ditto -c -k --keepParent "$APP" "$WORK/PhotoCraft-notarize.zip"
notarize "$WORK/PhotoCraft-notarize.zip" notarize "$WORK/PhotoCraft-notarize.zip"
xcrun stapler staple "$APP" staple "$APP"
xcrun stapler validate "$APP"
spctl --assess --type execute -vvv "$APP" spctl --assess --type execute -vvv "$APP"
fi fi
@@ -149,8 +166,7 @@ sign "$DMG"
codesign --verify --strict --verbose=2 "$DMG" codesign --verify --strict --verbose=2 "$DMG"
if [[ "$NOTARIZE" = 1 ]]; then if [[ "$NOTARIZE" = 1 ]]; then
notarize "$DMG" notarize "$DMG"
xcrun stapler staple "$DMG" staple "$DMG"
xcrun stapler validate "$DMG"
spctl --assess --type open --context context:primary-signature -vvv "$DMG" spctl --assess --type open --context context:primary-signature -vvv "$DMG"
fi fi
+12 -1
View File
@@ -70,6 +70,17 @@ assess() {
return 1 return 1
} }
# `stapler validate` asks Apple's CloudKit service too, which sometimes drops the connection
# (error 68) though the ticket is there.
validate_staple() {
local attempt
for attempt in 1 2 3 4 5; do
xcrun stapler validate "$1" && return 0
[[ "$attempt" = 5 ]] || sleep $((attempt * 20))
done
return 1
}
for f in "$DMG" "$CLI_ZIP"; do for f in "$DMG" "$CLI_ZIP"; do
if [[ ! -f "$f" ]]; then if [[ ! -f "$f" ]]; then
echo "error: missing $f" >&2 echo "error: missing $f" >&2
@@ -126,7 +137,7 @@ fi
echo "==> $(basename "$DMG")" echo "==> $(basename "$DMG")"
codesign --verify --strict --verbose=2 "$DMG" codesign --verify --strict --verbose=2 "$DMG"
if [[ "$STRICT" = 1 ]]; then if [[ "$STRICT" = 1 ]]; then
xcrun stapler validate "$DMG" || fail "no notarization ticket stapled to the DMG" validate_staple "$DMG" || fail "no notarization ticket stapled to the DMG"
assess --assess --type open --context context:primary-signature -vv "$DMG" \ assess --assess --type open --context context:primary-signature -vv "$DMG" \
|| fail "Gatekeeper rejects the DMG" || fail "Gatekeeper rejects the DMG"
fi fi
+3 -2
View File
@@ -231,8 +231,9 @@ fn cmd_gate_tests(panic_hunt: bool) -> Result<(), String> {
c.args(["--run-ignored", "only", "-E", "binary_id(photocraft-engine::panic_hunt)"]); c.args(["--run-ignored", "only", "-E", "binary_id(photocraft-engine::panic_hunt)"]);
} }
} else if panic_hunt { } else if panic_hunt {
// `-- --ignored` across the workspace would run every ignored test, not only the hunt. // `-- --ignored` across the workspace would run every ignored test, not only the hunt. The
c.args(["test", "-p", "photocraft-engine", "--locked", "--test", "panic_hunt", "--", "--ignored"]); // engine has no `heif` feature of its own; it reaches the decoder through photocraft-io.
c.args(["test", "-p", "photocraft-engine", "--locked", "--features", "photocraft-io/heif", "--test", "panic_hunt", "--", "--ignored"]);
} else { } else {
eprintln!("note: cargo-nextest is not installed, running cargo test (cargo install cargo-nextest --locked)"); eprintln!("note: cargo-nextest is not installed, running cargo test (cargo install cargo-nextest --locked)");
c.arg("test").args(GATE_ARGS).args(&TEST_TARGETS[1..]); c.arg("test").args(GATE_ARGS).args(&TEST_TARGETS[1..]);