

























@@ -65,40 +65,47 @@ fi
65656666echo "Creating DMG: $OUT_PATH"
676768-# Cleanup stuck volumes.
69-for vol in "/Volumes/$DMG_VOLUME_NAME"* "/Volumes/$APP_NAME"*; do
70-if [[ -d "$vol" ]]; then
71- hdiutil detach "$vol" -force 2>/dev/null || true
72- sleep 1
73-fi
74-done
75-7668DMG_TEMP="$(mktemp -d "${TMPDIR:-/tmp}/openclaw-dmg.XXXXXX")"
77-trap 'hdiutil detach "/Volumes/'"$DMG_VOLUME_NAME"'" -force 2>/dev/null || true; rm -rf "$DMG_TEMP" 2>/dev/null || true' EXIT
69+DMG_SOURCE="$DMG_TEMP/source"
70+MOUNT_POINT="$DMG_TEMP/mount"
71+DMG_RW_PATH="$DMG_TEMP/image-rw.dmg"
72+DMG_OUTPUT_TEMP=""
73+DMG_FINAL_PATH=""
74+MOUNTED=0
75+76+cleanup_dmg() {
77+if [[ "$MOUNTED" == "1" ]]; then
78+if hdiutil detach "$MOUNT_POINT" -force 2>/dev/null; then
79+ MOUNTED=0
80+else
81+echo "WARN: Preserving DMG temp root because mount is still attached: $DMG_TEMP" >&2
82+return
83+fi
84+fi
85+if [[ -n "$DMG_OUTPUT_TEMP" ]]; then
86+ rm -rf "$DMG_OUTPUT_TEMP" 2>/dev/null || true
87+fi
88+ rm -rf "$DMG_TEMP" 2>/dev/null || true
89+}
90+trap cleanup_dmg EXIT
789179-cp -R "$APP_PATH" "$DMG_TEMP/"
80-ln -s /Applications "$DMG_TEMP/Applications"
92+mkdir -p "$DMG_SOURCE" "$MOUNT_POINT"
93+cp -R "$APP_PATH" "$DMG_SOURCE/"
94+ln -s /Applications "$DMG_SOURCE/Applications"
81958296APP_SIZE_MB=$(du -sm "$APP_PATH" | awk '{print $1}')
8397DMG_SIZE_MB=$((APP_SIZE_MB + 80))
849885-DMG_RW_PATH="${OUT_PATH%.dmg}-rw.dmg"
86-rm -f "$DMG_RW_PATH" "$OUT_PATH"
87-8899hdiutil create \
89100 -volname "$DMG_VOLUME_NAME" \
90- -srcfolder "$DMG_TEMP" \
101+ -srcfolder "$DMG_SOURCE" \
91102 -ov \
92103 -format UDRW \
93104 -size "${DMG_SIZE_MB}m" \
94105"$DMG_RW_PATH"
9510696-MOUNT_POINT="/Volumes/$DMG_VOLUME_NAME"
97-if [[ -d "$MOUNT_POINT" ]]; then
98- hdiutil detach "$MOUNT_POINT" -force 2>/dev/null || true
99- sleep 2
100-fi
101107hdiutil attach "$DMG_RW_PATH" -mountpoint "$MOUNT_POINT" -nobrowse
108+MOUNTED=1
102109103110if [[ "${SKIP_DMG_STYLE:-0}" != "1" ]]; then
104111 mkdir -p "$MOUNT_POINT/.background"
@@ -121,7 +128,9 @@ if [[ "${SKIP_DMG_STYLE:-0}" != "1" ]]; then
121128122129 osascript <<EOF
123130tell application "Finder"
124- tell disk "$DMG_VOLUME_NAME"
131+ set dmgRoot to POSIX file "$MOUNT_POINT" as alias
132+ set dmgDisk to disk of dmgRoot
133+ tell dmgDisk
125134 open
126135 set current view of container window to icon view
127136 set toolbar visible of container window to false
@@ -144,23 +153,29 @@ tell application "Finder"
144153 close
145154 open
146155 delay 1
156+ close container window
147157 end tell
148158end tell
149159EOF
150-151- sleep 2
152- osascript -e 'tell application "Finder" to close every window' || true
153160fi
154161155162for i in {1..5}; do
156163if hdiutil detach "$MOUNT_POINT" -quiet 2>/dev/null; then
164+ MOUNTED=0
157165break
158166fi
159167if [[ "$i" == "3" ]]; then
160- hdiutil detach "$MOUNT_POINT" -force 2>/dev/null || true
168+if hdiutil detach "$MOUNT_POINT" -force 2>/dev/null; then
169+ MOUNTED=0
170+break
171+fi
161172fi
162173 sleep 2
163174done
175+if [[ "$MOUNTED" == "1" ]]; then
176+echo "Error: Failed to detach DMG mount: $MOUNT_POINT" >&2
177+exit 1
178+fi
164179165180DMG_LIMITS_PATH="$DMG_TEMP/resize-limits.txt"
166181hdiutil resize -limits "$DMG_RW_PATH" >"$DMG_LIMITS_PATH" 2>/dev/null || true
@@ -171,8 +186,11 @@ if [[ "$MIN_SECTORS" =~ ^[0-9]+$ ]] && [[ "$DMG_EXTRA_SECTORS" =~ ^[0-9]+$ ]]; t
171186 hdiutil resize -sectors "$TARGET_SECTORS" "$DMG_RW_PATH" >/dev/null 2>&1 || true
172187fi
173188174-hdiutil convert "$DMG_RW_PATH" -format ULMO -o "$OUT_PATH" -ov
175-rm -f "$DMG_RW_PATH"
189+DMG_OUTPUT_TEMP="$(mktemp -d "$(dirname "$OUT_PATH")/.openclaw-dmg.XXXXXX")"
190+DMG_FINAL_PATH="$DMG_OUTPUT_TEMP/final.dmg"
191+192+hdiutil convert "$DMG_RW_PATH" -format ULMO -o "$DMG_FINAL_PATH" -ov
176193177-hdiutil verify "$OUT_PATH" >/dev/null
194+hdiutil verify "$DMG_FINAL_PATH" >/dev/null
195+mv -f "$DMG_FINAL_PATH" "$OUT_PATH"
178196echo "✅ DMG ready: $OUT_PATH"
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。