@@ -8,147 +8,37 @@ cd "$(dirname "$0")/.."
88
99die () { echo " error: $1 " >&2 ; exit 1; }
1010
11- check_app_updates () {
12- local lockfile=" ./external.lock.json"
13-
14- local locked_wezterm
15- locked_wezterm=$( jq -r ' .wezterm.version' " $lockfile " )
16- local latest_wezterm
17- latest_wezterm=$( curl -fsSL " https://api.github.com/repos/wez/wezterm/releases/latest" 2> /dev/null | jq -r ' .tag_name' || echo " $locked_wezterm " )
18- if [[ " $latest_wezterm " != " $locked_wezterm " ]]; then
19- echo " warning: WezTerm $latest_wezterm available (locked: $locked_wezterm ). Run ./update.sh to update."
20- fi
21-
22- local locked_zed
23- locked_zed=$( jq -r ' .zed.version' " $lockfile " )
24- local latest_zed
25- latest_zed=$( curl -fsSL " https://api.github.com/repos/zed-industries/zed/releases/latest" 2> /dev/null | jq -r ' .tag_name' || echo " $locked_zed " )
26- if [[ " $latest_zed " != " $locked_zed " ]]; then
27- echo " warning: Zed $latest_zed available (locked: $locked_zed ). Run ./update.sh to update."
28- fi
29- }
30-
31- finalize_app_install () {
32- local source_bundle=" $1 " app_name=" $2 "
33- echo " Finalizing $app_name installation..."
34- sudo rm -rf " /Applications/${app_name} .app"
35- sudo mv " $source_bundle " " /Applications/${app_name} .app"
36- sudo xattr -dr com.apple.quarantine " /Applications/${app_name} .app" 2> /dev/null || true
37- }
38-
39- install_app_logic () {
40- local new_bundle=" $1 " app_name=" $2 "
41-
42- if pgrep -x " $app_name " > /dev/null; then
43- local staging_dir=" $HOME /.local/share/clipkitty/update_staging"
44- mkdir -p " $staging_dir "
45- local staged_bundle=" ${staging_dir} /${app_name} .app"
46-
47- echo " $app_name is currently running. Update scheduled for when it closes."
48- rm -rf " $staged_bundle "
49- mv " $new_bundle " " $staged_bundle "
50-
51- # Spawn background waiter
52- (
53- while pgrep -x " $app_name " > /dev/null; do
54- # Keep sudo session alive (non-interactive refresh)
55- sudo -n -v 2> /dev/null || true
56- sleep 60
57- done
58- finalize_app_install " $staged_bundle " " $app_name "
59- ) & disown
60- else
61- finalize_app_install " $new_bundle " " $app_name "
62- fi
63- }
64-
65- install_app_from_zip () {
66- local url=" $1 " expected_sha256=" $2 " app_name=" $3 "
67- local tmp_dir zip_path actual_sha256
68-
69- tmp_dir=" $( mktemp -d) "
70- zip_path=" ${tmp_dir} /app.zip"
71-
72- curl -fsSL " $url " -o " $zip_path "
73- actual_sha256=$( shasum -a 256 " $zip_path " | awk ' {print $1}' )
74- if [[ " $actual_sha256 " != " $expected_sha256 " ]]; then
75- rm -rf " $tmp_dir "
76- die " SHA256 mismatch for $app_name : expected $expected_sha256 , got $actual_sha256 "
77- fi
78-
79- unzip -q " $zip_path " -d " $tmp_dir "
80- local app_bundle
81- app_bundle=$( find " $tmp_dir " -name " *.app" -type d | head -1)
82- if [[ -z " $app_bundle " ]]; then
83- echo " Contents of extracted zip:"
84- ls -la " $tmp_dir "
85- rm -rf " $tmp_dir "
86- die " No .app bundle found in $app_name zip file"
87- fi
88-
89- install_app_logic " $app_bundle " " $app_name "
90-
91- rm -rf " $tmp_dir "
92- }
93-
94- install_app_from_dmg () {
95- local url=" $1 " expected_sha256=" $2 " app_name=" $3 "
96- local tmp_dir dmg_path actual_sha256 mount_point
97-
98- tmp_dir=" $( mktemp -d) "
99- dmg_path=" ${tmp_dir} /app.dmg"
100-
101- curl -fsSL " $url " -o " $dmg_path "
102- actual_sha256=$( shasum -a 256 " $dmg_path " | awk ' {print $1}' )
103- if [[ " $actual_sha256 " != " $expected_sha256 " ]]; then
104- rm -rf " $tmp_dir "
105- die " SHA256 mismatch for $app_name : expected $expected_sha256 , got $actual_sha256 "
106- fi
107-
108- mount_point=$( hdiutil attach -nobrowse -readonly " $dmg_path " 2> /dev/null | grep -o ' /Volumes/.*' | head -1)
109- local app_bundle
110- app_bundle=$( find " $mount_point " -maxdepth 1 -name " *.app" | head -1)
111-
112- # Copy from read-only mount to a writable temp location before handing off to logic
113- local writable_bundle=" ${tmp_dir} /staged_${app_name} .app"
114- cp -R " $app_bundle " " $writable_bundle "
115- hdiutil detach " $mount_point " -quiet
116-
117- install_app_logic " $writable_bundle " " $app_name "
118-
119- rm -rf " $tmp_dir "
120- }
121-
122- install_clipkitty () {
123- local lockfile=" ./external.lock.json"
124- local url sha256
125- url=$( jq -r ' .clipkitty.url' " $lockfile " )
126- sha256=$( jq -r ' .clipkitty.sha256' " $lockfile " )
127- echo " Installing ClipKitty..."
128- install_app_from_dmg " $url " " $sha256 " " ClipKitty"
129- }
130-
13111install_desktop_apps () {
13212 echo " Installing desktop apps..."
133- check_app_updates
134-
135- local arch
136- arch=$( uname -m)
137- [[ " $arch " == " arm64" ]] && arch=" aarch64"
138-
139- local wezterm_url wezterm_sha256
140- wezterm_url=$( jq -r ' .wezterm.url' " ./external.lock.json" )
141- wezterm_sha256=$( jq -r ' .wezterm.sha256' " ./external.lock.json" )
142- echo " Installing WezTerm..."
143- install_app_from_zip " $wezterm_url " " $wezterm_sha256 " " WezTerm"
144-
145- local zed_url zed_sha256
146- zed_url=$( jq -r " .zed.${arch} .url" " ./external.lock.json" )
147- zed_sha256=$( jq -r " .zed.${arch} .sha256" " ./external.lock.json" )
148- echo " Installing Zed..."
149- install_app_from_dmg " $zed_url " " $zed_sha256 " " Zed"
150-
151- install_clipkitty
13+ echo " Ensuring desktop apps are managed by Homebrew..."
14+ local casks=(" wezterm" " zed" " jul-sh/clipkitty/clipkitty" )
15+ for cask in " ${casks[@]} " ; do
16+ local base_name=" ${cask##*/ } "
17+ # Check if installed
18+ if ! brew list --cask | grep -q " ^${base_name} $" ; then
19+ echo " Installing $cask ..."
20+ brew install --cask " $cask "
21+ else
22+ # Check if outdated
23+ if brew outdated --cask --quiet " $cask " > /dev/null 2>&1 ; then
24+ if pgrep -ix " $base_name " > /dev/null; then
25+ echo " $base_name is currently running. Scheduling update for when it closes..."
26+ (
27+ while pgrep -ix " $base_name " > /dev/null; do
28+ sleep 60
29+ done
30+ echo " $base_name closed. Starting Homebrew update..."
31+ brew upgrade --cask " $cask "
32+ ) & disown
33+ else
34+ echo " Updating $base_name ..."
35+ brew upgrade --cask " $cask " || true
36+ fi
37+ else
38+ echo " $base_name is up to date."
39+ fi
40+ fi
41+ done
15242}
15343
15444build_spotlight_scripts () {
0 commit comments