forked from 1b-agent/opencadstudio-upstream
macOS DMG: add an Applications shortcut for drag-to-install
The DMG dropped just the bare .app with no indication of where it's supposed to go, unlike the "drag the icon onto Applications" layout every other Mac app uses. Stage the .app next to a symlink to /Applications before building the image, then lay out the Finder window's icon view (via a temporary read-write DMG, since a compressed UDZO image can't be mounted for editing afterward) so both items are visible side by side. The Finder/AppleScript layout step is best-effort and fails gracefully: this script mirrors the CI build-macos job, which likely has no interactive Finder session for AppleScript to reach at all, so the essential fix (the symlink itself, which doesn't depend on Finder scripting) still lands even when the cosmetic pass can't run. Fixes #769. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
dfe8b77cca
commit
d9bad54e1e
1 file changed
+62
-2
@@ -112,13 +112,73 @@ codesign --verify --strict --verbose=2 "$APP"
|
||||
echo "==> dmg"
|
||||
DMG="$DIST/OpenCADStudio-v$VERSION-macos-arm64.dmg"
|
||||
rm -f "$DMG"
|
||||
|
||||
# Stage the .app next to a symlink to /Applications so the DMG opens onto
|
||||
# the familiar "drag the icon onto Applications" installer layout, rather
|
||||
# than dropping just the bare .app into the user's Downloads-mounted volume
|
||||
# with no indication of where it's supposed to go (#769).
|
||||
STAGING="$DIST/dmg-staging"
|
||||
rm -rf "$STAGING"
|
||||
mkdir -p "$STAGING"
|
||||
cp -R "$APP" "$STAGING/"
|
||||
ln -s /Applications "$STAGING/Applications"
|
||||
|
||||
# Build read-write first so Finder can save the window's icon layout, then
|
||||
# convert to the compressed read-only image the CI job's own DMG step
|
||||
# already produces — same two-stage approach that layout customization
|
||||
# always needs, since a UDZO image can't be mounted for editing afterward.
|
||||
RW_DMG="$DIST/OpenCADStudio-rw.dmg"
|
||||
rm -f "$RW_DMG"
|
||||
for i in 1 2 3 4 5; do
|
||||
if hdiutil create -volname "Open CAD Studio" -srcfolder "$APP" -ov -format UDZO "$DMG"; then
|
||||
if hdiutil create -volname "Open CAD Studio" -srcfolder "$STAGING" -ov -format UDRW -fs HFS+ "$RW_DMG"; then
|
||||
break
|
||||
fi
|
||||
echo "hdiutil failed (attempt $i), retrying..." >&2
|
||||
echo "hdiutil create (rw) failed (attempt $i), retrying..." >&2
|
||||
sleep 3
|
||||
done
|
||||
[ -f "$RW_DMG" ] || { echo "hdiutil create (rw) failed permanently" >&2; exit 1; }
|
||||
|
||||
MOUNT_DIR="$(mktemp -d /tmp/ocs-dmg-mount.XXXXXX)"
|
||||
hdiutil attach "$RW_DMG" -mountpoint "$MOUNT_DIR" -quiet
|
||||
# Finder's own volume list can lag a moment behind `hdiutil attach`
|
||||
# returning, and "container window of <alias>" isn't a valid reference the
|
||||
# way "container window of disk <name>" is — so poll by name (up to 15s)
|
||||
# before touching it, rather than a fixed sleep or a path-based reference.
|
||||
osascript <<APPLESCRIPT || echo "DMG layout script failed (non-fatal, keeping default Finder view)" >&2
|
||||
tell application "Finder"
|
||||
repeat 30 times
|
||||
if (exists disk "Open CAD Studio") then exit repeat
|
||||
delay 0.5
|
||||
end repeat
|
||||
tell disk "Open CAD Studio"
|
||||
open
|
||||
set current view of container window to icon view
|
||||
set toolbar visible of container window to false
|
||||
set statusbar visible of container window to false
|
||||
set the bounds of container window to {200, 120, 760, 480}
|
||||
set viewOptions to the icon view options of container window
|
||||
set arrangement of viewOptions to not arranged
|
||||
set icon size of viewOptions to 96
|
||||
set position of item "OpenCADStudio.app" of container window to {140, 180}
|
||||
set position of item "Applications" of container window to {420, 180}
|
||||
close
|
||||
open
|
||||
update without registering applications
|
||||
delay 1
|
||||
end tell
|
||||
end tell
|
||||
APPLESCRIPT
|
||||
hdiutil detach "$MOUNT_DIR" -quiet
|
||||
|
||||
for i in 1 2 3 4 5; do
|
||||
if hdiutil convert "$RW_DMG" -format UDZO -ov -o "$DMG"; then
|
||||
break
|
||||
fi
|
||||
echo "hdiutil convert failed (attempt $i), retrying..." >&2
|
||||
sleep 3
|
||||
done
|
||||
rm -f "$RW_DMG"
|
||||
rm -rf "$STAGING"
|
||||
[ -f "$DMG" ] || { echo "hdiutil failed permanently" >&2; exit 1; }
|
||||
|
||||
if [ -n "${NOTARY_PROFILE:-}" ] && [ "$DEVELOPER_ID" != "-" ]; then
|
||||
|
||||
Reference in new issue
Block a user