Scripts/screenshots-mac.sh (4764B)
1
2set -euo pipefail
3
4DO_COMPOSE=false
5while getopts "c" opt; do
6 case $opt in
7 c) DO_COMPOSE=true ;;
8 *) ;;
9 esac
10done
11shift $((OPTIND - 1))
12
13REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
14SECRETS="$REPO_ROOT/.asc/secrets.sh"
15
16if [[ ! -f "$SECRETS" ]]; then
17 echo "Error: $SECRETS not found. See Scripts/secrets.sh.example for the required format."
18 exit 1
19fi
20
21source "$SECRETS"
22
23DEV_P12="$REPO_ROOT/.asc/dev.p12"
24TMP_KEYCHAIN="$REPO_ROOT/.asc/build.keychain-db"
25
26echo "==> Setting up temporary keychain..."
27security delete-keychain "$TMP_KEYCHAIN" 2>/dev/null || true
28security create-keychain -p "$TMP_KEYCHAIN_PASS" "$TMP_KEYCHAIN"
29security unlock-keychain -p "$TMP_KEYCHAIN_PASS" "$TMP_KEYCHAIN"
30security set-keychain-settings -lut 21600 "$TMP_KEYCHAIN"
31security import "$DEV_P12" -k "$TMP_KEYCHAIN" -P "$DEV_P12_PASS" \
32 -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
33security set-key-partition-list -S apple-tool:,apple:,codesign:,productbuild: \
34 -s -k "$TMP_KEYCHAIN_PASS" "$TMP_KEYCHAIN"
35security list-keychains -d user -s "$TMP_KEYCHAIN" ~/Library/Keychains/login.keychain-db
36
37cleanup_keychain() {
38 echo "==> Restoring keychain search list..."
39 security list-keychains -d user -s ~/Library/Keychains/login.keychain-db
40 security default-keychain -d user -s ~/Library/Keychains/login.keychain-db
41 security delete-keychain "$TMP_KEYCHAIN" 2>/dev/null || true
42}
43trap cleanup_keychain EXIT
44
45SCREENSHOT_TMP="/tmp/listless-screenshots"
46FRAMED_TMP="/tmp/listless-framed"
47MARKETING_DIR="$(pwd)/Marketing"
48SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
49
50
51CANVAS_WIDTH=2880
52CANVAS_HEIGHT=1800
53
54CAPTIONS=(
55 "Syncs via iCloud"
56 "Dark Mode"
57 "Natural Selection"
58)
59
60XCRESULT_DIR=$(mktemp -d)
61
62
63echo "==> Running macOS screenshot tests..."
64xcodebuild test \
65 -scheme "Listless macOS" \
66 -destination "platform=macOS" \
67 -only-testing:"Listless macOS UI Tests/ListlessMacScreenshots" \
68 -resultBundlePath "${XCRESULT_DIR}/result.xcresult" \
69 2>&1
70
71
72echo "==> Extracting screenshots from xcresult..."
73rm -rf "${SCREENSHOT_TMP}"
74mkdir -p "${SCREENSHOT_TMP}"
75xcrun xcresulttool export attachments \
76 --path "${XCRESULT_DIR}/result.xcresult" \
77 --output-path "${SCREENSHOT_TMP}"
78
79
80osascript -l JavaScript -e "
81var manifest = JSON.parse($.NSString.alloc.initWithDataEncoding(
82 $.NSData.dataWithContentsOfFile('${SCREENSHOT_TMP}/manifest.json'),
83 $.NSUTF8StringEncoding).js);
84var fm = $.NSFileManager.defaultManager;
85manifest.forEach(function(entry) {
86 (entry.attachments || []).forEach(function(att) {
87 var exported = att.exportedFileName || '';
88 var suggested = att.suggestedHumanReadableName || '';
89 if (exported && suggested) {
90 var name = suggested.replace(/_\d+_[A-F0-9-]+\.png$/, '');
91 var src = '${SCREENSHOT_TMP}/' + exported;
92 var dst = '${SCREENSHOT_TMP}/' + name + '.png';
93 fm.moveItemAtPathToPathError(src, dst, null);
94 }
95 });
96});"
97
98rm -rf "${XCRESULT_DIR}"
99
100if ! ls "${SCREENSHOT_TMP}"/*.png 1>/dev/null 2>&1; then
101 echo "No screenshots found in ${SCREENSHOT_TMP}."
102 exit 1
103fi
104
105mkdir -p "${MARKETING_DIR}"
106
107if [ "$DO_COMPOSE" = true ]; then
108 DESKTOP_TMP="/tmp/listless-desktop"
109 mkdir -p "${DESKTOP_TMP}"
110 mkdir -p "${FRAMED_TMP}"
111
112 echo ""
113 echo "Composing desktop images..."
114 n=0
115 for file in "${SCREENSHOT_TMP}"/0*.png; do
116 swift "${SCRIPT_DIR}/screenshots-mac-desktop.swift" "$file" "${DESKTOP_TMP}/desktop_${n}.png" "$(pwd)/Marketing/sequoia-wallpaper.jpg"
117 echo " desktop_${n}.png"
118 n=$((n + 1))
119 done
120
121 echo "Framing screenshots..."
122 n=0
123 for file in "${DESKTOP_TMP}"/desktop_*.png; do
124 shortcuts run "Frame Screenshots" -i "$file" -o "${FRAMED_TMP}/framed_${n}.png"
125 echo " Framed screenshot ${n}"
126 n=$((n + 1))
127 done
128
129 rm -rf "${DESKTOP_TMP}"
130
131 echo "Composing final images..."
132 n=0
133 for file in "${FRAMED_TMP}"/framed_*.png; do
134 caption="${CAPTIONS[$n]:-}"
135 swift "${SCRIPT_DIR}/screenshots-ios-compose.swift" "$file" "${MARKETING_DIR}/mac_${n}.png" "$caption" "$CANVAS_WIDTH" "$CANVAS_HEIGHT"
136 echo " mac_${n}.png — ${caption}"
137 n=$((n + 1))
138 done
139
140 rm -rf "${FRAMED_TMP}"
141else
142 OUTPUT_DIR="$(pwd)"
143 echo ""
144 n=0
145 for file in "${SCREENSHOT_TMP}"/0*.png; do
146 cp "$file" "${OUTPUT_DIR}/mac_${n}.png"
147 n=$((n + 1))
148 done
149fi
150
151rm -rf "${SCREENSHOT_TMP}"
152
153if [ "$DO_COMPOSE" = true ]; then
154 echo ""
155 echo "Screenshots saved to ${MARKETING_DIR}/"
156 ls -la "${MARKETING_DIR}"/mac_*.png
157else
158 echo ""
159 echo "Screenshots saved to ${OUTPUT_DIR}/"
160 ls -la "${OUTPUT_DIR}"/mac_*.png
161fi