From 6c35495a959d82619a35134fb695a99e4b43610a Mon Sep 17 00:00:00 2001 From: Allen Houchins <32207388+allenhouchins@users.noreply.github.com> Date: Thu, 11 Jun 2026 16:15:52 -0500 Subject: [PATCH] Add macOS Fleet-maintained apps (F) (#47403) Adds 32 Fleet-maintained app(s) whose cask token starts with 'F': inputs, outputs, app icons (TSX + website PNG), and the matching index.ts and apps.json entries. ## Summary by CodeRabbit * **New Features** * Added support for 40+ macOS apps (e.g., Fantastical, Far2L, Farrago, Fastmail, Framer, Franz, FreeFileSync, Focusrite Control 2). * App icons added to the software catalog for improved visual browsing. * **Chores** * Added packaged installer/uninstaller metadata and scripted install/uninstall flows for the new apps to simplify management and upgrades. --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../inputs/homebrew/fantastical.json | 10 + ee/maintained-apps/inputs/homebrew/far2l.json | 10 + .../inputs/homebrew/farrago.json | 10 + .../inputs/homebrew/fastmail.json | 10 + .../inputs/homebrew/fastscripts.json | 10 + .../inputs/homebrew/fellow.json | 10 + .../inputs/homebrew/ferdium.json | 10 + .../inputs/homebrew/fetch-app.json | 10 + ee/maintained-apps/inputs/homebrew/fig.json | 10 + .../inputs/homebrew/file-juicer.json | 10 + ee/maintained-apps/inputs/homebrew/filen.json | 10 + ee/maintained-apps/inputs/homebrew/fing.json | 10 + .../inputs/homebrew/firealpaca.json | 10 + .../inputs/homebrew/firefly-iota-desktop.json | 10 + .../inputs/homebrew/firefly-shimmer.json | 10 + .../inputs/homebrew/fission.json | 10 + .../inputs/homebrew/flexoptix.json | 10 + ee/maintained-apps/inputs/homebrew/fluid.json | 10 + .../inputs/homebrew/flux-app.json | 10 + .../inputs/homebrew/focusrite-control-2.json | 10 + ee/maintained-apps/inputs/homebrew/folx.json | 10 + .../inputs/homebrew/fontbase.json | 10 + .../inputs/homebrew/fontlab.json | 10 + .../inputs/homebrew/forecast.json | 10 + .../inputs/homebrew/forklift.json | 10 + .../inputs/homebrew/framer.json | 10 + ee/maintained-apps/inputs/homebrew/franz.json | 10 + .../homebrew/free-download-manager.json | 10 + .../inputs/homebrew/freefilesync.json | 10 + .../inputs/homebrew/fsmonitor.json | 10 + .../inputs/homebrew/funter.json | 10 + ee/maintained-apps/outputs/apps.json | 217 ++++++++++++++++++ .../outputs/fantastical/darwin.json | 22 ++ ee/maintained-apps/outputs/far2l/darwin.json | 22 ++ .../outputs/farrago/darwin.json | 22 ++ .../outputs/fastmail/darwin.json | 22 ++ .../outputs/fastscripts/darwin.json | 22 ++ ee/maintained-apps/outputs/fellow/darwin.json | 22 ++ .../outputs/ferdium/darwin.json | 22 ++ .../outputs/fetch-app/darwin.json | 22 ++ ee/maintained-apps/outputs/fig/darwin.json | 22 ++ .../outputs/file-juicer/darwin.json | 22 ++ ee/maintained-apps/outputs/filen/darwin.json | 22 ++ ee/maintained-apps/outputs/fing/darwin.json | 22 ++ .../outputs/firealpaca/darwin.json | 22 ++ .../outputs/firefly-iota-desktop/darwin.json | 22 ++ .../outputs/firefly-shimmer/darwin.json | 22 ++ .../outputs/fission/darwin.json | 22 ++ .../outputs/flexoptix/darwin.json | 22 ++ ee/maintained-apps/outputs/fluid/darwin.json | 22 ++ .../outputs/flux-app/darwin.json | 22 ++ .../outputs/focusrite-control-2/darwin.json | 22 ++ ee/maintained-apps/outputs/folx/darwin.json | 22 ++ .../outputs/fontbase/darwin.json | 22 ++ .../outputs/fontlab/darwin.json | 22 ++ .../outputs/forecast/darwin.json | 22 ++ .../outputs/forklift/darwin.json | 22 ++ ee/maintained-apps/outputs/framer/darwin.json | 22 ++ ee/maintained-apps/outputs/franz/darwin.json | 22 ++ .../outputs/free-download-manager/darwin.json | 22 ++ .../outputs/freefilesync/darwin.json | 22 ++ .../outputs/fsmonitor/darwin.json | 22 ++ ee/maintained-apps/outputs/funter/darwin.json | 22 ++ .../components/icons/Fantastical.tsx | 14 ++ .../SoftwarePage/components/icons/Far2L.tsx | 14 ++ .../SoftwarePage/components/icons/Farrago.tsx | 14 ++ .../components/icons/Fastmail.tsx | 14 ++ .../components/icons/Fastscripts.tsx | 14 ++ .../SoftwarePage/components/icons/Fellow.tsx | 14 ++ .../SoftwarePage/components/icons/Ferdium.tsx | 14 ++ .../components/icons/FetchApp.tsx | 14 ++ .../SoftwarePage/components/icons/Fig.tsx | 14 ++ .../components/icons/FileJuicer.tsx | 14 ++ .../SoftwarePage/components/icons/Filen.tsx | 14 ++ .../SoftwarePage/components/icons/Fing.tsx | 14 ++ .../components/icons/Firealpaca.tsx | 14 ++ .../components/icons/FireflyIotaDesktop.tsx | 14 ++ .../components/icons/FireflyShimmer.tsx | 14 ++ .../SoftwarePage/components/icons/Fission.tsx | 14 ++ .../components/icons/Flexoptix.tsx | 14 ++ .../SoftwarePage/components/icons/Fluid.tsx | 14 ++ .../SoftwarePage/components/icons/FluxApp.tsx | 14 ++ .../components/icons/FocusriteControl2.tsx | 14 ++ .../SoftwarePage/components/icons/Folx.tsx | 14 ++ .../components/icons/Fontbase.tsx | 14 ++ .../SoftwarePage/components/icons/Fontlab.tsx | 14 ++ .../components/icons/Forecast.tsx | 14 ++ .../components/icons/Forklift.tsx | 14 ++ .../SoftwarePage/components/icons/Framer.tsx | 14 ++ .../SoftwarePage/components/icons/Franz.tsx | 14 ++ .../components/icons/FreeDownloadManager.tsx | 14 ++ .../components/icons/Freefilesync.tsx | 14 ++ .../components/icons/Fsmonitor.tsx | 14 ++ .../SoftwarePage/components/icons/Funter.tsx | 14 ++ .../SoftwarePage/components/icons/index.ts | 62 +++++ .../images/app-icon-fantastical-60x60@2x.png | Bin 0 -> 13631 bytes .../assets/images/app-icon-far2l-60x60@2x.png | Bin 0 -> 13807 bytes .../images/app-icon-farrago-60x60@2x.png | Bin 0 -> 14758 bytes .../images/app-icon-fastmail-60x60@2x.png | Bin 0 -> 11725 bytes .../images/app-icon-fastscripts-60x60@2x.png | Bin 0 -> 14171 bytes .../images/app-icon-fellow-60x60@2x.png | Bin 0 -> 7240 bytes .../images/app-icon-ferdium-60x60@2x.png | Bin 0 -> 8300 bytes .../images/app-icon-fetch-app-60x60@2x.png | Bin 0 -> 18967 bytes .../assets/images/app-icon-fig-60x60@2x.png | Bin 0 -> 6588 bytes .../images/app-icon-file-juicer-60x60@2x.png | Bin 0 -> 27793 bytes .../assets/images/app-icon-filen-60x60@2x.png | Bin 0 -> 6555 bytes .../assets/images/app-icon-fing-60x60@2x.png | Bin 0 -> 7833 bytes .../images/app-icon-firealpaca-60x60@2x.png | Bin 0 -> 12303 bytes ...app-icon-firefly-iota-desktop-60x60@2x.png | Bin 0 -> 5879 bytes .../app-icon-firefly-shimmer-60x60@2x.png | Bin 0 -> 6835 bytes .../images/app-icon-fission-60x60@2x.png | Bin 0 -> 18204 bytes .../images/app-icon-flexoptix-60x60@2x.png | Bin 0 -> 3996 bytes .../assets/images/app-icon-fluid-60x60@2x.png | Bin 0 -> 25273 bytes .../images/app-icon-flux-app-60x60@2x.png | Bin 0 -> 10339 bytes .../app-icon-focusrite-control-2-60x60@2x.png | Bin 0 -> 22418 bytes .../assets/images/app-icon-folx-60x60@2x.png | Bin 0 -> 23144 bytes .../images/app-icon-fontbase-60x60@2x.png | Bin 0 -> 9476 bytes .../images/app-icon-fontlab-60x60@2x.png | Bin 0 -> 12571 bytes .../images/app-icon-forecast-60x60@2x.png | Bin 0 -> 12024 bytes .../images/app-icon-forklift-60x60@2x.png | Bin 0 -> 16962 bytes .../images/app-icon-framer-60x60@2x.png | Bin 0 -> 15329 bytes .../assets/images/app-icon-franz-60x60@2x.png | Bin 0 -> 18939 bytes ...pp-icon-free-download-manager-60x60@2x.png | Bin 0 -> 11583 bytes .../images/app-icon-freefilesync-60x60@2x.png | Bin 0 -> 14265 bytes .../images/app-icon-fsmonitor-60x60@2x.png | Bin 0 -> 8463 bytes .../images/app-icon-funter-60x60@2x.png | Bin 0 -> 16691 bytes 126 files changed, 1705 insertions(+) create mode 100644 ee/maintained-apps/inputs/homebrew/fantastical.json create mode 100644 ee/maintained-apps/inputs/homebrew/far2l.json create mode 100644 ee/maintained-apps/inputs/homebrew/farrago.json create mode 100644 ee/maintained-apps/inputs/homebrew/fastmail.json create mode 100644 ee/maintained-apps/inputs/homebrew/fastscripts.json create mode 100644 ee/maintained-apps/inputs/homebrew/fellow.json create mode 100644 ee/maintained-apps/inputs/homebrew/ferdium.json create mode 100644 ee/maintained-apps/inputs/homebrew/fetch-app.json create mode 100644 ee/maintained-apps/inputs/homebrew/fig.json create mode 100644 ee/maintained-apps/inputs/homebrew/file-juicer.json create mode 100644 ee/maintained-apps/inputs/homebrew/filen.json create mode 100644 ee/maintained-apps/inputs/homebrew/fing.json create mode 100644 ee/maintained-apps/inputs/homebrew/firealpaca.json create mode 100644 ee/maintained-apps/inputs/homebrew/firefly-iota-desktop.json create mode 100644 ee/maintained-apps/inputs/homebrew/firefly-shimmer.json create mode 100644 ee/maintained-apps/inputs/homebrew/fission.json create mode 100644 ee/maintained-apps/inputs/homebrew/flexoptix.json create mode 100644 ee/maintained-apps/inputs/homebrew/fluid.json create mode 100644 ee/maintained-apps/inputs/homebrew/flux-app.json create mode 100644 ee/maintained-apps/inputs/homebrew/focusrite-control-2.json create mode 100644 ee/maintained-apps/inputs/homebrew/folx.json create mode 100644 ee/maintained-apps/inputs/homebrew/fontbase.json create mode 100644 ee/maintained-apps/inputs/homebrew/fontlab.json create mode 100644 ee/maintained-apps/inputs/homebrew/forecast.json create mode 100644 ee/maintained-apps/inputs/homebrew/forklift.json create mode 100644 ee/maintained-apps/inputs/homebrew/framer.json create mode 100644 ee/maintained-apps/inputs/homebrew/franz.json create mode 100644 ee/maintained-apps/inputs/homebrew/free-download-manager.json create mode 100644 ee/maintained-apps/inputs/homebrew/freefilesync.json create mode 100644 ee/maintained-apps/inputs/homebrew/fsmonitor.json create mode 100644 ee/maintained-apps/inputs/homebrew/funter.json create mode 100644 ee/maintained-apps/outputs/fantastical/darwin.json create mode 100644 ee/maintained-apps/outputs/far2l/darwin.json create mode 100644 ee/maintained-apps/outputs/farrago/darwin.json create mode 100644 ee/maintained-apps/outputs/fastmail/darwin.json create mode 100644 ee/maintained-apps/outputs/fastscripts/darwin.json create mode 100644 ee/maintained-apps/outputs/fellow/darwin.json create mode 100644 ee/maintained-apps/outputs/ferdium/darwin.json create mode 100644 ee/maintained-apps/outputs/fetch-app/darwin.json create mode 100644 ee/maintained-apps/outputs/fig/darwin.json create mode 100644 ee/maintained-apps/outputs/file-juicer/darwin.json create mode 100644 ee/maintained-apps/outputs/filen/darwin.json create mode 100644 ee/maintained-apps/outputs/fing/darwin.json create mode 100644 ee/maintained-apps/outputs/firealpaca/darwin.json create mode 100644 ee/maintained-apps/outputs/firefly-iota-desktop/darwin.json create mode 100644 ee/maintained-apps/outputs/firefly-shimmer/darwin.json create mode 100644 ee/maintained-apps/outputs/fission/darwin.json create mode 100644 ee/maintained-apps/outputs/flexoptix/darwin.json create mode 100644 ee/maintained-apps/outputs/fluid/darwin.json create mode 100644 ee/maintained-apps/outputs/flux-app/darwin.json create mode 100644 ee/maintained-apps/outputs/focusrite-control-2/darwin.json create mode 100644 ee/maintained-apps/outputs/folx/darwin.json create mode 100644 ee/maintained-apps/outputs/fontbase/darwin.json create mode 100644 ee/maintained-apps/outputs/fontlab/darwin.json create mode 100644 ee/maintained-apps/outputs/forecast/darwin.json create mode 100644 ee/maintained-apps/outputs/forklift/darwin.json create mode 100644 ee/maintained-apps/outputs/framer/darwin.json create mode 100644 ee/maintained-apps/outputs/franz/darwin.json create mode 100644 ee/maintained-apps/outputs/free-download-manager/darwin.json create mode 100644 ee/maintained-apps/outputs/freefilesync/darwin.json create mode 100644 ee/maintained-apps/outputs/fsmonitor/darwin.json create mode 100644 ee/maintained-apps/outputs/funter/darwin.json create mode 100644 frontend/pages/SoftwarePage/components/icons/Fantastical.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/Far2L.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/Farrago.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/Fastmail.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/Fastscripts.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/Fellow.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/Ferdium.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/FetchApp.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/Fig.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/FileJuicer.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/Filen.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/Fing.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/Firealpaca.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/FireflyIotaDesktop.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/FireflyShimmer.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/Fission.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/Flexoptix.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/Fluid.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/FluxApp.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/FocusriteControl2.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/Folx.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/Fontbase.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/Fontlab.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/Forecast.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/Forklift.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/Framer.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/Franz.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/FreeDownloadManager.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/Freefilesync.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/Fsmonitor.tsx create mode 100644 frontend/pages/SoftwarePage/components/icons/Funter.tsx create mode 100644 website/assets/images/app-icon-fantastical-60x60@2x.png create mode 100644 website/assets/images/app-icon-far2l-60x60@2x.png create mode 100644 website/assets/images/app-icon-farrago-60x60@2x.png create mode 100644 website/assets/images/app-icon-fastmail-60x60@2x.png create mode 100644 website/assets/images/app-icon-fastscripts-60x60@2x.png create mode 100644 website/assets/images/app-icon-fellow-60x60@2x.png create mode 100644 website/assets/images/app-icon-ferdium-60x60@2x.png create mode 100644 website/assets/images/app-icon-fetch-app-60x60@2x.png create mode 100644 website/assets/images/app-icon-fig-60x60@2x.png create mode 100644 website/assets/images/app-icon-file-juicer-60x60@2x.png create mode 100644 website/assets/images/app-icon-filen-60x60@2x.png create mode 100644 website/assets/images/app-icon-fing-60x60@2x.png create mode 100644 website/assets/images/app-icon-firealpaca-60x60@2x.png create mode 100644 website/assets/images/app-icon-firefly-iota-desktop-60x60@2x.png create mode 100644 website/assets/images/app-icon-firefly-shimmer-60x60@2x.png create mode 100644 website/assets/images/app-icon-fission-60x60@2x.png create mode 100644 website/assets/images/app-icon-flexoptix-60x60@2x.png create mode 100644 website/assets/images/app-icon-fluid-60x60@2x.png create mode 100644 website/assets/images/app-icon-flux-app-60x60@2x.png create mode 100644 website/assets/images/app-icon-focusrite-control-2-60x60@2x.png create mode 100644 website/assets/images/app-icon-folx-60x60@2x.png create mode 100644 website/assets/images/app-icon-fontbase-60x60@2x.png create mode 100644 website/assets/images/app-icon-fontlab-60x60@2x.png create mode 100644 website/assets/images/app-icon-forecast-60x60@2x.png create mode 100644 website/assets/images/app-icon-forklift-60x60@2x.png create mode 100644 website/assets/images/app-icon-framer-60x60@2x.png create mode 100644 website/assets/images/app-icon-franz-60x60@2x.png create mode 100644 website/assets/images/app-icon-free-download-manager-60x60@2x.png create mode 100644 website/assets/images/app-icon-freefilesync-60x60@2x.png create mode 100644 website/assets/images/app-icon-fsmonitor-60x60@2x.png create mode 100644 website/assets/images/app-icon-funter-60x60@2x.png diff --git a/ee/maintained-apps/inputs/homebrew/fantastical.json b/ee/maintained-apps/inputs/homebrew/fantastical.json new file mode 100644 index 0000000000..1d468f9ab7 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/fantastical.json @@ -0,0 +1,10 @@ +{ + "name": "Fantastical", + "unique_identifier": "com.flexibits.fantastical", + "token": "fantastical", + "installer_format": "zip", + "slug": "fantastical/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/far2l.json b/ee/maintained-apps/inputs/homebrew/far2l.json new file mode 100644 index 0000000000..eeadf46079 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/far2l.json @@ -0,0 +1,10 @@ +{ + "name": "far2l", + "unique_identifier": "com.far2l", + "token": "far2l", + "installer_format": "dmg", + "slug": "far2l/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/farrago.json b/ee/maintained-apps/inputs/homebrew/farrago.json new file mode 100644 index 0000000000..2bc9b0e980 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/farrago.json @@ -0,0 +1,10 @@ +{ + "name": "Farrago", + "unique_identifier": "com.rogueamoeba.farrago", + "token": "farrago", + "installer_format": "zip", + "slug": "farrago/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/fastmail.json b/ee/maintained-apps/inputs/homebrew/fastmail.json new file mode 100644 index 0000000000..f5bc4b318c --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/fastmail.json @@ -0,0 +1,10 @@ +{ + "name": "Fastmail", + "unique_identifier": "com.fastmail.mac.Fastmail", + "token": "fastmail", + "installer_format": "zip", + "slug": "fastmail/darwin", + "default_categories": [ + "Communication" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/fastscripts.json b/ee/maintained-apps/inputs/homebrew/fastscripts.json new file mode 100644 index 0000000000..4175f865c6 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/fastscripts.json @@ -0,0 +1,10 @@ +{ + "name": "FastScripts", + "unique_identifier": "com.red-sweater.fastscripts3", + "token": "fastscripts", + "installer_format": "zip", + "slug": "fastscripts/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/fellow.json b/ee/maintained-apps/inputs/homebrew/fellow.json new file mode 100644 index 0000000000..8fda875f1d --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/fellow.json @@ -0,0 +1,10 @@ +{ + "name": "Fellow", + "unique_identifier": "com.electron.fellow", + "token": "fellow", + "installer_format": "dmg", + "slug": "fellow/darwin", + "default_categories": [ + "Communication" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/ferdium.json b/ee/maintained-apps/inputs/homebrew/ferdium.json new file mode 100644 index 0000000000..9054d63d92 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/ferdium.json @@ -0,0 +1,10 @@ +{ + "name": "Ferdium", + "unique_identifier": "com.ferdium.ferdium-app", + "token": "ferdium", + "installer_format": "dmg", + "slug": "ferdium/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/fetch-app.json b/ee/maintained-apps/inputs/homebrew/fetch-app.json new file mode 100644 index 0000000000..7abcfe1485 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/fetch-app.json @@ -0,0 +1,10 @@ +{ + "name": "Fetch", + "unique_identifier": "com.fetchsoftworks.Fetch", + "token": "fetch-app", + "installer_format": "zip", + "slug": "fetch-app/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/fig.json b/ee/maintained-apps/inputs/homebrew/fig.json new file mode 100644 index 0000000000..dc17368bca --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/fig.json @@ -0,0 +1,10 @@ +{ + "name": "fig", + "unique_identifier": "com.mschrage.fig", + "token": "fig", + "installer_format": "dmg", + "slug": "fig/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/file-juicer.json b/ee/maintained-apps/inputs/homebrew/file-juicer.json new file mode 100644 index 0000000000..3633172e5f --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/file-juicer.json @@ -0,0 +1,10 @@ +{ + "name": "File Juicer", + "unique_identifier": "com.echoone.FileJuicer", + "token": "file-juicer", + "installer_format": "zip", + "slug": "file-juicer/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/filen.json b/ee/maintained-apps/inputs/homebrew/filen.json new file mode 100644 index 0000000000..ddd0d6e3c9 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/filen.json @@ -0,0 +1,10 @@ +{ + "name": "Filen", + "unique_identifier": "io.filen.desktop", + "token": "filen", + "installer_format": "dmg", + "slug": "filen/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/fing.json b/ee/maintained-apps/inputs/homebrew/fing.json new file mode 100644 index 0000000000..ff928f1203 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/fing.json @@ -0,0 +1,10 @@ +{ + "name": "Fing Desktop", + "unique_identifier": "com.fing.app", + "token": "fing", + "installer_format": "dmg", + "slug": "fing/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/firealpaca.json b/ee/maintained-apps/inputs/homebrew/firealpaca.json new file mode 100644 index 0000000000..f95c875711 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/firealpaca.json @@ -0,0 +1,10 @@ +{ + "name": "Fire Alpaca", + "unique_identifier": "com.firealpaca", + "token": "firealpaca", + "installer_format": "zip", + "slug": "firealpaca/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/firefly-iota-desktop.json b/ee/maintained-apps/inputs/homebrew/firefly-iota-desktop.json new file mode 100644 index 0000000000..2e7bd350c7 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/firefly-iota-desktop.json @@ -0,0 +1,10 @@ +{ + "name": "Firefly", + "unique_identifier": "org.iota.firefly", + "token": "firefly-iota-desktop", + "installer_format": "dmg", + "slug": "firefly-iota-desktop/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/firefly-shimmer.json b/ee/maintained-apps/inputs/homebrew/firefly-shimmer.json new file mode 100644 index 0000000000..c43a424ad2 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/firefly-shimmer.json @@ -0,0 +1,10 @@ +{ + "name": "Firefly Shimmer", + "unique_identifier": "org.iota.firefly-shimmer", + "token": "firefly-shimmer", + "installer_format": "dmg", + "slug": "firefly-shimmer/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/fission.json b/ee/maintained-apps/inputs/homebrew/fission.json new file mode 100644 index 0000000000..213b7bb3e9 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/fission.json @@ -0,0 +1,10 @@ +{ + "name": "Fission", + "unique_identifier": "com.rogueamoeba.Fission", + "token": "fission", + "installer_format": "zip", + "slug": "fission/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/flexoptix.json b/ee/maintained-apps/inputs/homebrew/flexoptix.json new file mode 100644 index 0000000000..7052162c8e --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/flexoptix.json @@ -0,0 +1,10 @@ +{ + "name": "FLEXOPTIX App", + "unique_identifier": "net.flexoptix.flexoptix.app", + "token": "flexoptix", + "installer_format": "dmg", + "slug": "flexoptix/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/fluid.json b/ee/maintained-apps/inputs/homebrew/fluid.json new file mode 100644 index 0000000000..ce2eb46285 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/fluid.json @@ -0,0 +1,10 @@ +{ + "name": "Fluid", + "unique_identifier": "com.fluidapp.Fluid2", + "token": "fluid", + "installer_format": "zip", + "slug": "fluid/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/flux-app.json b/ee/maintained-apps/inputs/homebrew/flux-app.json new file mode 100644 index 0000000000..64b9e62705 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/flux-app.json @@ -0,0 +1,10 @@ +{ + "name": "f.lux", + "unique_identifier": "org.herf.Flux", + "token": "flux-app", + "installer_format": "zip", + "slug": "flux-app/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/focusrite-control-2.json b/ee/maintained-apps/inputs/homebrew/focusrite-control-2.json new file mode 100644 index 0000000000..4e41a2cf9f --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/focusrite-control-2.json @@ -0,0 +1,10 @@ +{ + "name": "Focusrite Control 2", + "unique_identifier": "com.focusrite.control", + "token": "focusrite-control-2", + "installer_format": "dmg", + "slug": "focusrite-control-2/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/folx.json b/ee/maintained-apps/inputs/homebrew/folx.json new file mode 100644 index 0000000000..11196eec32 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/folx.json @@ -0,0 +1,10 @@ +{ + "name": "Folx", + "unique_identifier": "com.eltima.Folx3", + "token": "folx", + "installer_format": "dmg", + "slug": "folx/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/fontbase.json b/ee/maintained-apps/inputs/homebrew/fontbase.json new file mode 100644 index 0000000000..8966c87d5a --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/fontbase.json @@ -0,0 +1,10 @@ +{ + "name": "FontBase", + "unique_identifier": "com.dominiklevitsky.fontbase", + "token": "fontbase", + "installer_format": "dmg", + "slug": "fontbase/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/fontlab.json b/ee/maintained-apps/inputs/homebrew/fontlab.json new file mode 100644 index 0000000000..5b77d8b971 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/fontlab.json @@ -0,0 +1,10 @@ +{ + "name": "Fontlab", + "unique_identifier": "com.fontlab.fontlab8", + "token": "fontlab", + "installer_format": "dmg", + "slug": "fontlab/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/forecast.json b/ee/maintained-apps/inputs/homebrew/forecast.json new file mode 100644 index 0000000000..a55c3666bf --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/forecast.json @@ -0,0 +1,10 @@ +{ + "name": "Forecast", + "unique_identifier": "fm.overcast.forecast-encoder", + "token": "forecast", + "installer_format": "zip", + "slug": "forecast/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/forklift.json b/ee/maintained-apps/inputs/homebrew/forklift.json new file mode 100644 index 0000000000..9aedea83f5 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/forklift.json @@ -0,0 +1,10 @@ +{ + "name": "ForkLift", + "unique_identifier": "com.binarynights.ForkLift-4", + "token": "forklift", + "installer_format": "zip", + "slug": "forklift/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/framer.json b/ee/maintained-apps/inputs/homebrew/framer.json new file mode 100644 index 0000000000..cd522f5847 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/framer.json @@ -0,0 +1,10 @@ +{ + "name": "Framer", + "unique_identifier": "com.framer.electron", + "token": "framer", + "installer_format": "zip", + "slug": "framer/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/franz.json b/ee/maintained-apps/inputs/homebrew/franz.json new file mode 100644 index 0000000000..aa0a6d85c2 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/franz.json @@ -0,0 +1,10 @@ +{ + "name": "Franz", + "unique_identifier": "com.meetfranz.franz", + "token": "franz", + "installer_format": "dmg", + "slug": "franz/darwin", + "default_categories": [ + "Communication" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/free-download-manager.json b/ee/maintained-apps/inputs/homebrew/free-download-manager.json new file mode 100644 index 0000000000..cca307b175 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/free-download-manager.json @@ -0,0 +1,10 @@ +{ + "name": "Free Download Manager", + "unique_identifier": "org.freedownloadmanager.fdm6", + "token": "free-download-manager", + "installer_format": "dmg", + "slug": "free-download-manager/darwin", + "default_categories": [ + "Utilities" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/freefilesync.json b/ee/maintained-apps/inputs/homebrew/freefilesync.json new file mode 100644 index 0000000000..49b6f0eff8 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/freefilesync.json @@ -0,0 +1,10 @@ +{ + "name": "FreeFileSync", + "unique_identifier": "org.freefilesync.FreeFileSync", + "token": "freefilesync", + "installer_format": "zip", + "slug": "freefilesync/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/fsmonitor.json b/ee/maintained-apps/inputs/homebrew/fsmonitor.json new file mode 100644 index 0000000000..00d8c42dbf --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/fsmonitor.json @@ -0,0 +1,10 @@ +{ + "name": "FSMonitor", + "unique_identifier": "com.tristan.FSMonitor", + "token": "fsmonitor", + "installer_format": "zip", + "slug": "fsmonitor/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/funter.json b/ee/maintained-apps/inputs/homebrew/funter.json new file mode 100644 index 0000000000..568deff9ef --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/funter.json @@ -0,0 +1,10 @@ +{ + "name": "Funter", + "unique_identifier": "com.nektony.Funter-SIII", + "token": "funter", + "installer_format": "dmg", + "slug": "funter/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/outputs/apps.json b/ee/maintained-apps/outputs/apps.json index 9ee37e279e..4d0ea65fbb 100644 --- a/ee/maintained-apps/outputs/apps.json +++ b/ee/maintained-apps/outputs/apps.json @@ -2206,6 +2206,69 @@ "unique_identifier": "dignicy.extraDock", "description": "ExtraDock is a tool to add fully customizable extra docks." }, + { + "name": "Fantastical", + "slug": "fantastical/darwin", + "platform": "darwin", + "unique_identifier": "com.flexibits.fantastical", + "description": "Fantastical is a calendar software." + }, + { + "name": "far2l", + "slug": "far2l/darwin", + "platform": "darwin", + "unique_identifier": "com.far2l", + "description": "far2l is a unix fork of FAR Manager v2." + }, + { + "name": "Farrago", + "slug": "farrago/darwin", + "platform": "darwin", + "unique_identifier": "com.rogueamoeba.farrago", + "description": "Farrago is an audio player." + }, + { + "name": "Fastmail", + "slug": "fastmail/darwin", + "platform": "darwin", + "unique_identifier": "com.fastmail.mac.Fastmail", + "description": "Fastmail is an email client." + }, + { + "name": "FastScripts", + "slug": "fastscripts/darwin", + "platform": "darwin", + "unique_identifier": "com.red-sweater.fastscripts3", + "description": "FastScripts is a tool for running time-saving scripts." + }, + { + "name": "Fellow", + "slug": "fellow/darwin", + "platform": "darwin", + "unique_identifier": "com.electron.fellow", + "description": "Fellow is a collaborative tool for meeting agendas, notes, and action items." + }, + { + "name": "Ferdium", + "slug": "ferdium/darwin", + "platform": "darwin", + "unique_identifier": "com.ferdium.ferdium-app", + "description": "Ferdium is a multi-platform multi-messaging app." + }, + { + "name": "Fetch", + "slug": "fetch-app/darwin", + "platform": "darwin", + "unique_identifier": "com.fetchsoftworks.Fetch", + "description": "Fetch is a file transfer client." + }, + { + "name": "fig", + "slug": "fig/darwin", + "platform": "darwin", + "unique_identifier": "com.mschrage.fig", + "description": "fig is a terminal app." + }, { "name": "Figma", "slug": "figma/darwin", @@ -2220,6 +2283,13 @@ "unique_identifier": "Figma", "description": "Figma is a collaborative design tool for teams to create, prototype, and share designs in real time." }, + { + "name": "File Juicer", + "slug": "file-juicer/darwin", + "platform": "darwin", + "unique_identifier": "com.echoone.FileJuicer", + "description": "File Juicer is an app that extracts images from PDF, PowerPoint, Word, Excel and other Files." + }, { "name": "FileMaker Pro", "slug": "filemaker-pro/darwin", @@ -2227,6 +2297,41 @@ "unique_identifier": "com.filemaker.client.pro12", "description": "FileMaker Pro is a relational database and rapid application development platform." }, + { + "name": "Filen", + "slug": "filen/darwin", + "platform": "darwin", + "unique_identifier": "io.filen.desktop", + "description": "Filen is a desktop client for Filen.io." + }, + { + "name": "Fing Desktop", + "slug": "fing/darwin", + "platform": "darwin", + "unique_identifier": "com.fing.app", + "description": "Fing Desktop is a network scanner." + }, + { + "name": "Fire Alpaca", + "slug": "firealpaca/darwin", + "platform": "darwin", + "unique_identifier": "com.firealpaca", + "description": "Fire Alpaca is a digital painting software." + }, + { + "name": "Firefly", + "slug": "firefly-iota-desktop/darwin", + "platform": "darwin", + "unique_identifier": "org.iota.firefly", + "description": "Firefly is an official wallet for IOTA." + }, + { + "name": "Firefly Shimmer", + "slug": "firefly-shimmer/darwin", + "platform": "darwin", + "unique_identifier": "org.iota.firefly-shimmer", + "description": "Firefly Shimmer is an official wallet for IOTA." + }, { "name": "Mozilla Firefox", "slug": "firefox/darwin", @@ -2255,6 +2360,13 @@ "unique_identifier": "Mozilla Firefox 140.7.1 ESR (x64 en-US)", "description": "Mozilla Firefox ESR is the Extended Support Release version of the popular web browser Firefox." }, + { + "name": "Fission", + "slug": "fission/darwin", + "platform": "darwin", + "unique_identifier": "com.rogueamoeba.Fission", + "description": "Fission is an audio editor." + }, { "name": "Fleet Desktop", "slug": "fleet-desktop/darwin", @@ -2262,6 +2374,62 @@ "unique_identifier": "com.fleetdm.fleet-desktop", "description": "Fleet Desktop is a native macOS application that provides end users with a self-service portal for Fleet." }, + { + "name": "FLEXOPTIX App", + "slug": "flexoptix/darwin", + "platform": "darwin", + "unique_identifier": "net.flexoptix.flexoptix.app", + "description": "FLEXOPTIX App is a connect to your FLEXBOX without cables and configure transceivers." + }, + { + "name": "Fluid", + "slug": "fluid/darwin", + "platform": "darwin", + "unique_identifier": "com.fluidapp.Fluid2", + "description": "Fluid is a tool to turn a website into a desktop app." + }, + { + "name": "f.lux", + "slug": "flux-app/darwin", + "platform": "darwin", + "unique_identifier": "org.herf.Flux", + "description": "f.lux is a screen colour temperature controller." + }, + { + "name": "Focusrite Control 2", + "slug": "focusrite-control-2/darwin", + "platform": "darwin", + "unique_identifier": "com.focusrite.control", + "description": "Focusrite Control 2 is a focusrite interface controller for devices of the 4th generation and newer." + }, + { + "name": "Folx", + "slug": "folx/darwin", + "platform": "darwin", + "unique_identifier": "com.eltima.Folx3", + "description": "Folx is a download manager with a torrent client." + }, + { + "name": "FontBase", + "slug": "fontbase/darwin", + "platform": "darwin", + "unique_identifier": "com.dominiklevitsky.fontbase", + "description": "FontBase is a font manager." + }, + { + "name": "Fontlab", + "slug": "fontlab/darwin", + "platform": "darwin", + "unique_identifier": "com.fontlab.fontlab8", + "description": "Fontlab is a professional font editor." + }, + { + "name": "Forecast", + "slug": "forecast/darwin", + "platform": "darwin", + "unique_identifier": "fm.overcast.forecast-encoder", + "description": "Forecast is a podcast MP3 encoder with chapters." + }, { "name": "Fork", "slug": "fork/darwin", @@ -2276,6 +2444,41 @@ "unique_identifier": "Fork", "description": "Fork is a git client." }, + { + "name": "ForkLift", + "slug": "forklift/darwin", + "platform": "darwin", + "unique_identifier": "com.binarynights.ForkLift-4", + "description": "ForkLift is a finder replacement and FTP, SFTP, WebDAV and Amazon s3 client." + }, + { + "name": "Framer", + "slug": "framer/darwin", + "platform": "darwin", + "unique_identifier": "com.framer.electron", + "description": "Framer is a tool that helps teams design every part of the product experience." + }, + { + "name": "Franz", + "slug": "franz/darwin", + "platform": "darwin", + "unique_identifier": "com.meetfranz.franz", + "description": "Franz is a messaging app for WhatsApp, Facebook Messenger, Slack, Telegram, and more." + }, + { + "name": "Free Download Manager", + "slug": "free-download-manager/darwin", + "platform": "darwin", + "unique_identifier": "org.freedownloadmanager.fdm6", + "description": "Free Download Manager is a download accelerator and organizer." + }, + { + "name": "FreeFileSync", + "slug": "freefilesync/darwin", + "platform": "darwin", + "unique_identifier": "org.freefilesync.FreeFileSync", + "description": "FreeFileSync is a folder comparison and synchronization software." + }, { "name": "Front", "slug": "front/darwin", @@ -2283,6 +2486,20 @@ "unique_identifier": "com.frontapp.Front", "description": "Front is a customer communication platform." }, + { + "name": "FSMonitor", + "slug": "fsmonitor/darwin", + "platform": "darwin", + "unique_identifier": "com.tristan.FSMonitor", + "description": "FSMonitor is a tool to visualize filesystem changes in realtime." + }, + { + "name": "Funter", + "slug": "funter/darwin", + "platform": "darwin", + "unique_identifier": "com.nektony.Funter-SIII", + "description": "Funter is a shows hidden files and folders and switches their visibility in Finder." + }, { "name": "Garmin Express", "slug": "garmin-express/darwin", diff --git a/ee/maintained-apps/outputs/fantastical/darwin.json b/ee/maintained-apps/outputs/fantastical/darwin.json new file mode 100644 index 0000000000..e5261f48ae --- /dev/null +++ b/ee/maintained-apps/outputs/fantastical/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "4.1.13", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.flexibits.fantastical';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.flexibits.fantastical' AND version_compare(bundle_short_version, '4.1.13') < 0);" + }, + "installer_url": "https://cdn.flexibits.com/Fantastical_4.1.13.zip", + "install_script_ref": "0da19afb", + "uninstall_script_ref": "846b1a5a", + "sha256": "12abaa1eea67f19fbed5ade5cac18cd1d02d6a6458e647ee7f98059ea8050278", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "0da19afb": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_and_track_application 'com.flexibits.fantastical'\nif [ -d \"$APPDIR/Fantastical.app\" ]; then\n\tsudo mv \"$APPDIR/Fantastical.app\" \"$TMPDIR/Fantastical.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Fantastical.app\" \"$APPDIR\"\nrelaunch_application 'com.flexibits.fantastical'\n", + "846b1a5a": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nremove_launchctl_service() {\n local service=\"$1\"\n local booleans=(\"true\" \"false\")\n local plist_status\n local paths\n local should_sudo\n\n echo \"Removing launchctl service ${service}\"\n\n for should_sudo in \"${booleans[@]}\"; do\n plist_status=$(launchctl list \"${service}\" 2>/dev/null)\n\n if [[ $plist_status == \\{* ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo launchctl remove \"${service}\"\n else\n launchctl remove \"${service}\"\n fi\n sleep 1\n fi\n\n paths=(\n \"/Library/LaunchAgents/${service}.plist\"\n \"/Library/LaunchDaemons/${service}.plist\"\n )\n\n # if not using sudo, prepend the home directory to the paths\n if [[ $should_sudo == \"false\" ]]; then\n for i in \"${!paths[@]}\"; do\n paths[i]=\"${HOME}${paths[i]}\"\n done\n fi\n\n for path in \"${paths[@]}\"; do\n if [[ -e \"$path\" ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo rm -f -- \"$path\"\n else\n rm -f -- \"$path\"\n fi\n fi\n done\n done\n}\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nremove_launchctl_service 'com.flexibits.fantastical*.mac.launcher'\nquit_application '*.com.flexibits.fantastical*.mac.helper'\nquit_application 'com.flexibits.fantastical*.mac'\nsudo rm -rf \"$APPDIR/Fantastical.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/*.com.flexibits.fantastical*'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.flexibits.fantastical*'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.flexibits.fbcaldav.*'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.flexibits.fantastical*'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.flexibits.fbcaldav.*'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/*.com.flexibits.fantastical*.mac'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.flexibits.fantastical.plist'\n" + } +} diff --git a/ee/maintained-apps/outputs/far2l/darwin.json b/ee/maintained-apps/outputs/far2l/darwin.json new file mode 100644 index 0000000000..caac8e9f28 --- /dev/null +++ b/ee/maintained-apps/outputs/far2l/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "2.8.0", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.far2l';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.far2l' AND version_compare(bundle_short_version, '2.8.0') < 0);" + }, + "installer_url": "https://github.com/elfmz/far2l/releases/download/v_2.8.0/far2l-2.8.0-beta-MacOS-11.2-universal.dmg", + "install_script_ref": "0658cf59", + "uninstall_script_ref": "e04ace0e", + "sha256": "9891d468f1242c8a7728de0f04f4d07108186b50faeb3bbe230ef4f8305189c8", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "0658cf59": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'com.far2l'\nif [ -d \"$APPDIR/far2l.app\" ]; then\n\tsudo mv \"$APPDIR/far2l.app\" \"$TMPDIR/far2l.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/far2l.app\" \"$APPDIR\"\nrelaunch_application 'com.far2l'\n", + "e04ace0e": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/far2l.app\"\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.far2l.savedState'\n" + } +} diff --git a/ee/maintained-apps/outputs/farrago/darwin.json b/ee/maintained-apps/outputs/farrago/darwin.json new file mode 100644 index 0000000000..1690116beb --- /dev/null +++ b/ee/maintained-apps/outputs/farrago/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "2.1.5", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.rogueamoeba.farrago';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.rogueamoeba.farrago' AND version_compare(bundle_short_version, '2.1.5') < 0);" + }, + "installer_url": "https://cdn.rogueamoeba.com/farrago/download/Farrago.zip", + "install_script_ref": "b545b7de", + "uninstall_script_ref": "e60054a1", + "sha256": "no_check", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "b545b7de": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_and_track_application 'com.rogueamoeba.farrago'\nif [ -d \"$APPDIR/Farrago.app\" ]; then\n\tsudo mv \"$APPDIR/Farrago.app\" \"$TMPDIR/Farrago.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Farrago.app\" \"$APPDIR\"\nrelaunch_application 'com.rogueamoeba.farrago'\n", + "e60054a1": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nquit_application 'com.rogueamoeba.farrago'\nsudo rm -rf \"$APPDIR/Farrago.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Farrago 2'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.rogueamoeba.farrago'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.rogueamoeba.farrago'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.rogueamoeba.farrago.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.rogueamoeba.farrago.savedState'\ntrash $LOGGED_IN_USER '~/Library/WebKit/com.rogueamoeba.farrago'\n" + } +} diff --git a/ee/maintained-apps/outputs/fastmail/darwin.json b/ee/maintained-apps/outputs/fastmail/darwin.json new file mode 100644 index 0000000000..9d920b533d --- /dev/null +++ b/ee/maintained-apps/outputs/fastmail/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "1.2.1", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.fastmail.mac.Fastmail';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.fastmail.mac.Fastmail' AND version_compare(bundle_short_version, '1.2.1') < 0);" + }, + "installer_url": "https://dl.fastmailcdn.com/desktop/production/mac/arm64/Fastmail-1.2.1-arm64-mac.zip", + "install_script_ref": "4a23adc1", + "uninstall_script_ref": "a0e5b1b8", + "sha256": "22bb36ccf2dabc457832a01560c5c42b210ef3c156f8fd3d28ee98f70834b6a9", + "default_categories": [ + "Communication" + ] + } + ], + "refs": { + "4a23adc1": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_and_track_application 'com.fastmail.mac.Fastmail'\nif [ -d \"$APPDIR/Fastmail.app\" ]; then\n\tsudo mv \"$APPDIR/Fastmail.app\" \"$TMPDIR/Fastmail.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Fastmail.app\" \"$APPDIR\"\nrelaunch_application 'com.fastmail.mac.Fastmail'\n", + "a0e5b1b8": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/Fastmail.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.fastmail.mac.fastmail.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Fastmail'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.fastmail.mac.Fastmail.plist'\n" + } +} diff --git a/ee/maintained-apps/outputs/fastscripts/darwin.json b/ee/maintained-apps/outputs/fastscripts/darwin.json new file mode 100644 index 0000000000..4eae629540 --- /dev/null +++ b/ee/maintained-apps/outputs/fastscripts/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "3.3.8", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.red-sweater.fastscripts3';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.red-sweater.fastscripts3' AND version_compare(bundle_short_version, '3.3.8') < 0);" + }, + "installer_url": "https://redsweater.com/fastscripts/FastScripts3.3.8.zip", + "install_script_ref": "ead87d07", + "uninstall_script_ref": "715655bf", + "sha256": "9c83004c7c44314238991074e8c842ef296eeb5de3435015eaa34c4995e35b0d", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "715655bf": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/FastScripts.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/FastScripts Script Runner'\ntrash $LOGGED_IN_USER '~/Library/Application Support/FastScripts'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.red-sweater.fastscripts3'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.red-sweater.fastscripts3.plist'\ntrash $LOGGED_IN_USER '~/Library/WebKit/com.red-sweater.fastscripts3'\n", + "ead87d07": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_and_track_application 'com.red-sweater.fastscripts3'\nif [ -d \"$APPDIR/FastScripts.app\" ]; then\n\tsudo mv \"$APPDIR/FastScripts.app\" \"$TMPDIR/FastScripts.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/FastScripts.app\" \"$APPDIR\"\nrelaunch_application 'com.red-sweater.fastscripts3'\n" + } +} diff --git a/ee/maintained-apps/outputs/fellow/darwin.json b/ee/maintained-apps/outputs/fellow/darwin.json new file mode 100644 index 0000000000..4900358e91 --- /dev/null +++ b/ee/maintained-apps/outputs/fellow/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "5.3.3", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.electron.fellow';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.electron.fellow' AND version_compare(bundle_short_version, '5.3.3') < 0);" + }, + "installer_url": "https://cdn.fellow.app/desktop/5.3.3/darwin/stable/universal/Fellow-5.3.3-universal.dmg", + "install_script_ref": "5f49780d", + "uninstall_script_ref": "8110dadb", + "sha256": "0e0d7da300a450eac07240f9b7763dec6fc8b4035cc7d2d48ee2e20b6fa80b81", + "default_categories": [ + "Communication" + ] + } + ], + "refs": { + "5f49780d": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'com.electron.fellow'\nif [ -d \"$APPDIR/Fellow.app\" ]; then\n\tsudo mv \"$APPDIR/Fellow.app\" \"$TMPDIR/Fellow.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Fellow.app\" \"$APPDIR\"\nrelaunch_application 'com.electron.fellow'\n", + "8110dadb": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/Fellow.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Fellow'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.electron.fellow.plist'\n" + } +} diff --git a/ee/maintained-apps/outputs/ferdium/darwin.json b/ee/maintained-apps/outputs/ferdium/darwin.json new file mode 100644 index 0000000000..fd2428b1dd --- /dev/null +++ b/ee/maintained-apps/outputs/ferdium/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "7.1.2", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.ferdium.ferdium-app';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.ferdium.ferdium-app' AND version_compare(bundle_short_version, '7.1.2') < 0);" + }, + "installer_url": "https://github.com/ferdium/ferdium-app/releases/download/v7.1.2/Ferdium-mac-7.1.2-arm64.dmg", + "install_script_ref": "4fcc54fb", + "uninstall_script_ref": "078d50c6", + "sha256": "27cb2b3e1b193b2d337db5042d648561ea268a3e25e5973df91d2ae8f08c3f4b", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "078d50c6": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nquit_application 'com.ferdium.ferdium-app'\nsudo rm -rf '/Library/Logs/DiagnosticReports/Ferdium Helper_.*wakeups_resource.diag'\nsudo rm -rf \"$APPDIR/Ferdium.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Caches/ferdium-updater'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Ferdium'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.ferdium.ferdium-app'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.ferdium.ferdium-app.ShipIt'\ntrash $LOGGED_IN_USER '~/Library/Logs/Ferdium'\ntrash $LOGGED_IN_USER '~/Library/Preferences/ByHost/com.ferdium.ferdium-app.ShipIt.*.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.electron.ferdium.helper.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.electron.ferdium.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.ferdium.ferdium-app.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.ferdium.ferdium-app.savedState'\n", + "4fcc54fb": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'com.ferdium.ferdium-app'\nif [ -d \"$APPDIR/Ferdium.app\" ]; then\n\tsudo mv \"$APPDIR/Ferdium.app\" \"$TMPDIR/Ferdium.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Ferdium.app\" \"$APPDIR\"\nrelaunch_application 'com.ferdium.ferdium-app'\n" + } +} diff --git a/ee/maintained-apps/outputs/fetch-app/darwin.json b/ee/maintained-apps/outputs/fetch-app/darwin.json new file mode 100644 index 0000000000..4b164fe0d0 --- /dev/null +++ b/ee/maintained-apps/outputs/fetch-app/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "5.8.3", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.fetchsoftworks.Fetch';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.fetchsoftworks.Fetch' AND version_compare(bundle_short_version, '5.8.3') < 0);" + }, + "installer_url": "https://fetchsoftworks.com/fetch/download/Fetch_5.8.3.zip", + "install_script_ref": "d448d481", + "uninstall_script_ref": "06350f7a", + "sha256": "249b7d870fd8feb480285efaea57cfc00f062f4d55bd8d2ae202856275da1065", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "06350f7a": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/Fetch.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.fetchsoftworks.Fetch'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.apple.helpd/Generated/com.fetchsoftworks.fetch.help*'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.fetchsoftworks.Fetch'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.fetchsoftworks.Fetch.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.fetchsoftworks.Fetch.savedState'\n", + "d448d481": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_and_track_application 'com.fetchsoftworks.Fetch'\nif [ -d \"$APPDIR/Fetch.app\" ]; then\n\tsudo mv \"$APPDIR/Fetch.app\" \"$TMPDIR/Fetch.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Fetch.app\" \"$APPDIR\"\nrelaunch_application 'com.fetchsoftworks.Fetch'\n" + } +} diff --git a/ee/maintained-apps/outputs/fig/darwin.json b/ee/maintained-apps/outputs/fig/darwin.json new file mode 100644 index 0000000000..9e86d4fa0e --- /dev/null +++ b/ee/maintained-apps/outputs/fig/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "2.19.0", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.mschrage.fig';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.mschrage.fig' AND version_compare(bundle_short_version, '2.19.0') < 0);" + }, + "installer_url": "https://repo.fig.io/generic/stable/asset/2.19.0/universal/fig.dmg", + "install_script_ref": "4ef03933", + "uninstall_script_ref": "7c764ab7", + "sha256": "6f0caf57e1251ca06c315c23957734b5c9246fa5af8f1424d5836054ebdd6514", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "4ef03933": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'com.mschrage.fig'\nif [ -d \"$APPDIR/Fig.app\" ]; then\n\tsudo mv \"$APPDIR/Fig.app\" \"$TMPDIR/Fig.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Fig.app\" \"$APPDIR\"\nrelaunch_application 'com.mschrage.fig'\nmkdir -p .\n/bin/ln -h -f -s -- \"$APPDIR/Fig.app/Contents/MacOS/fig-darwin-universal\" \"fig\"\n", + "7c764ab7": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nremove_launchctl_service() {\n local service=\"$1\"\n local booleans=(\"true\" \"false\")\n local plist_status\n local paths\n local should_sudo\n\n echo \"Removing launchctl service ${service}\"\n\n for should_sudo in \"${booleans[@]}\"; do\n plist_status=$(launchctl list \"${service}\" 2>/dev/null)\n\n if [[ $plist_status == \\{* ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo launchctl remove \"${service}\"\n else\n launchctl remove \"${service}\"\n fi\n sleep 1\n fi\n\n paths=(\n \"/Library/LaunchAgents/${service}.plist\"\n \"/Library/LaunchDaemons/${service}.plist\"\n )\n\n # if not using sudo, prepend the home directory to the paths\n if [[ $should_sudo == \"false\" ]]; then\n for i in \"${!paths[@]}\"; do\n paths[i]=\"${HOME}${paths[i]}\"\n done\n fi\n\n for path in \"${paths[@]}\"; do\n if [[ -e \"$path\" ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo rm -f -- \"$path\"\n else\n rm -f -- \"$path\"\n fi\n fi\n done\n done\n}\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nremove_launchctl_service 'io.fig.dotfiles-daemon'\nremove_launchctl_service 'io.fig.launcher'\nremove_launchctl_service 'io.fig.uninstall'\nquit_application 'com.mschrage.fig'\nquit_application 'io.fig.cursor'\n(cd /Users/$LOGGED_IN_USER && '$APPDIR/Fig.app/Contents/MacOS/fig-darwin-universal' '_' 'brew-uninstall')\nsudo rm -rf \"$APPDIR/Fig.app\"\nsudo rm -rf 'fig'\ntrash $LOGGED_IN_USER '~/.fig'\ntrash $LOGGED_IN_USER '~/.fig.dotfiles.bak'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.mschrage.fig'\ntrash $LOGGED_IN_USER '~/Library/Application Support/fig'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.mschrage.fig'\ntrash $LOGGED_IN_USER '~/Library/Caches/fig'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.mschrage.fig'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.mschrage.fig.*'\ntrash $LOGGED_IN_USER '~/Library/WebKit/com.mschrage.fig'\n" + } +} diff --git a/ee/maintained-apps/outputs/file-juicer/darwin.json b/ee/maintained-apps/outputs/file-juicer/darwin.json new file mode 100644 index 0000000000..e084029441 --- /dev/null +++ b/ee/maintained-apps/outputs/file-juicer/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "4.115", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.echoone.FileJuicer';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.echoone.FileJuicer' AND version_compare(bundle_short_version, '4.115') < 0);" + }, + "installer_url": "https://echoone.com/filejuicer/FileJuicer-4.115.zip", + "install_script_ref": "182faa83", + "uninstall_script_ref": "34b90d0a", + "sha256": "no_check", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "182faa83": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_and_track_application 'com.echoone.FileJuicer'\nif [ -d \"$APPDIR/File Juicer.app\" ]; then\n\tsudo mv \"$APPDIR/File Juicer.app\" \"$TMPDIR/File Juicer.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/File Juicer.app\" \"$APPDIR\"\nrelaunch_application 'com.echoone.FileJuicer'\n", + "34b90d0a": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/File Juicer.app\"\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.echoone.FileJuicer'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.echoone.FileJuicer.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.echoone.FileJuicer.savedState'\n" + } +} diff --git a/ee/maintained-apps/outputs/filen/darwin.json b/ee/maintained-apps/outputs/filen/darwin.json new file mode 100644 index 0000000000..5d3f8d0cfa --- /dev/null +++ b/ee/maintained-apps/outputs/filen/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "3.0.47", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'io.filen.desktop';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'io.filen.desktop' AND version_compare(bundle_short_version, '3.0.47') < 0);" + }, + "installer_url": "https://cdn.filen.io/@filen/desktop/release/v3.0.47/Filen_mac_arm64.dmg", + "install_script_ref": "a77addd7", + "uninstall_script_ref": "357adb6a", + "sha256": "041f30b361fb5b07f9039d380cf9f3e56b1180491a1ebf711cc5d2d81d5f741b", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "357adb6a": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/Filen.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/@filen'\ntrash $LOGGED_IN_USER '~/Library/Application Support/filen-desktop'\ntrash $LOGGED_IN_USER '~/Library/Caches/@filendesktop-updater'\ntrash $LOGGED_IN_USER '~/Library/Caches/io.filen.desktop'\ntrash $LOGGED_IN_USER '~/Library/Caches/io.filen.desktop.ShipIt'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/io.filen.desktop'\ntrash $LOGGED_IN_USER '~/Library/Logs/filen-desktop'\ntrash $LOGGED_IN_USER '~/Library/Preferences/io.filen.desktop.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/io.filen.desktop.savedState'\n", + "a77addd7": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'io.filen.desktop'\nif [ -d \"$APPDIR/Filen.app\" ]; then\n\tsudo mv \"$APPDIR/Filen.app\" \"$TMPDIR/Filen.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Filen.app\" \"$APPDIR\"\nrelaunch_application 'io.filen.desktop'\n" + } +} diff --git a/ee/maintained-apps/outputs/fing/darwin.json b/ee/maintained-apps/outputs/fing/darwin.json new file mode 100644 index 0000000000..51a651f67a --- /dev/null +++ b/ee/maintained-apps/outputs/fing/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "3.10.1", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.fing.app';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.fing.app' AND version_compare(bundle_short_version, '3.10.1') < 0);" + }, + "installer_url": "https://get.fing.com/fing-desktop-releases/mac/Fing-3.10.1.dmg", + "install_script_ref": "db73d798", + "uninstall_script_ref": "b7e00712", + "sha256": "f0ccdf3b1a57117dc08e4e6970aded3f453eae75d1e6d8b28aa7a590381eeacf", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "b7e00712": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nremove_launchctl_service() {\n local service=\"$1\"\n local booleans=(\"true\" \"false\")\n local plist_status\n local paths\n local should_sudo\n\n echo \"Removing launchctl service ${service}\"\n\n for should_sudo in \"${booleans[@]}\"; do\n plist_status=$(launchctl list \"${service}\" 2>/dev/null)\n\n if [[ $plist_status == \\{* ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo launchctl remove \"${service}\"\n else\n launchctl remove \"${service}\"\n fi\n sleep 1\n fi\n\n paths=(\n \"/Library/LaunchAgents/${service}.plist\"\n \"/Library/LaunchDaemons/${service}.plist\"\n )\n\n # if not using sudo, prepend the home directory to the paths\n if [[ $should_sudo == \"false\" ]]; then\n for i in \"${!paths[@]}\"; do\n paths[i]=\"${HOME}${paths[i]}\"\n done\n fi\n\n for path in \"${paths[@]}\"; do\n if [[ -e \"$path\" ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo rm -f -- \"$path\"\n else\n rm -f -- \"$path\"\n fi\n fi\n done\n done\n}\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nremove_launchctl_service 'com.fing.service'\nsudo rm -rf \"$APPDIR/Fing.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Fing'\ntrash $LOGGED_IN_USER '~/Library/Logs/Fing'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.fing.app.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.fing.app.savedState'\n", + "db73d798": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'com.fing.app'\nif [ -d \"$APPDIR/Fing.app\" ]; then\n\tsudo mv \"$APPDIR/Fing.app\" \"$TMPDIR/Fing.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Fing.app\" \"$APPDIR\"\nrelaunch_application 'com.fing.app'\n" + } +} diff --git a/ee/maintained-apps/outputs/firealpaca/darwin.json b/ee/maintained-apps/outputs/firealpaca/darwin.json new file mode 100644 index 0000000000..6ae9b45ef7 --- /dev/null +++ b/ee/maintained-apps/outputs/firealpaca/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "2.15.2", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.firealpaca';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.firealpaca' AND version_compare(bundle_short_version, '2.15.2') < 0);" + }, + "installer_url": "https://firealpaca.com/download/mac", + "install_script_ref": "f2cad371", + "uninstall_script_ref": "d83aac80", + "sha256": "no_check", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "d83aac80": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/FireAlpaca.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/FireAlpaca'\n", + "f2cad371": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_and_track_application 'com.firealpaca'\nif [ -d \"$APPDIR/FireAlpaca.app\" ]; then\n\tsudo mv \"$APPDIR/FireAlpaca.app\" \"$TMPDIR/FireAlpaca.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/FireAlpaca.app\" \"$APPDIR\"\nrelaunch_application 'com.firealpaca'\n" + } +} diff --git a/ee/maintained-apps/outputs/firefly-iota-desktop/darwin.json b/ee/maintained-apps/outputs/firefly-iota-desktop/darwin.json new file mode 100644 index 0000000000..d698840354 --- /dev/null +++ b/ee/maintained-apps/outputs/firefly-iota-desktop/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "2.1.2", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'org.iota.firefly';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'org.iota.firefly' AND version_compare(bundle_short_version, '2.1.2') < 0);" + }, + "installer_url": "https://dl.firefly.iota.org/firefly-iota-desktop-2.1.2.dmg", + "install_script_ref": "634505f9", + "uninstall_script_ref": "bce01ef7", + "sha256": "261da02d338d2a904c1119eb0d808b40a698f81b1614f9727187619d31c26a63", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "634505f9": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'org.iota.firefly'\nif [ -d \"$APPDIR/Firefly.app\" ]; then\n\tsudo mv \"$APPDIR/Firefly.app\" \"$TMPDIR/Firefly.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Firefly.app\" \"$APPDIR\"\nrelaunch_application 'org.iota.firefly'\n", + "bce01ef7": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nquit_application 'org.iota.firefly'\nsudo rm -rf \"$APPDIR/Firefly.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Firefly'\ntrash $LOGGED_IN_USER '~/Library/Logs/Firefly'\ntrash $LOGGED_IN_USER '~/Library/Preferences/org.iota.firefly.helper.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/org.iota.firefly.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/org.iota.firefly.savedState'\n" + } +} diff --git a/ee/maintained-apps/outputs/firefly-shimmer/darwin.json b/ee/maintained-apps/outputs/firefly-shimmer/darwin.json new file mode 100644 index 0000000000..30d00879cb --- /dev/null +++ b/ee/maintained-apps/outputs/firefly-shimmer/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "2.2.2", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'org.iota.firefly-shimmer';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'org.iota.firefly-shimmer' AND version_compare(bundle_short_version, '2.2.2') < 0);" + }, + "installer_url": "https://github.com/iotaledger/firefly/releases/download/desktop-shimmer-2.2.2/firefly-shimmer-desktop-2.2.2.dmg", + "install_script_ref": "79df03de", + "uninstall_script_ref": "f8de362a", + "sha256": "123a710a8e42a717c29df2f96b722e2507b2ee5593aa699893aee4947dedbb06", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "79df03de": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'org.iota.firefly-shimmer'\nif [ -d \"$APPDIR/Firefly Shimmer.app\" ]; then\n\tsudo mv \"$APPDIR/Firefly Shimmer.app\" \"$TMPDIR/Firefly Shimmer.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Firefly Shimmer.app\" \"$APPDIR\"\nrelaunch_application 'org.iota.firefly-shimmer'\n", + "f8de362a": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nquit_application 'org.iota.firefly'\nsudo rm -rf \"$APPDIR/Firefly Shimmer.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Firefly'\ntrash $LOGGED_IN_USER '~/Library/Logs/Firefly'\ntrash $LOGGED_IN_USER '~/Library/Preferences/org.iota.firefly.helper.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/org.iota.firefly.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/org.iota.firefly.savedState'\n" + } +} diff --git a/ee/maintained-apps/outputs/fission/darwin.json b/ee/maintained-apps/outputs/fission/darwin.json new file mode 100644 index 0000000000..6f3aef6d8f --- /dev/null +++ b/ee/maintained-apps/outputs/fission/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "2.9.4", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.rogueamoeba.Fission';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.rogueamoeba.Fission' AND version_compare(bundle_short_version, '2.9.4') < 0);" + }, + "installer_url": "https://cdn.rogueamoeba.com/fission/download/Fission.zip", + "install_script_ref": "1f93e92e", + "uninstall_script_ref": "572fd0d4", + "sha256": "no_check", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "1f93e92e": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_and_track_application 'com.rogueamoeba.Fission'\nif [ -d \"$APPDIR/Fission.app\" ]; then\n\tsudo mv \"$APPDIR/Fission.app\" \"$TMPDIR/Fission.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Fission.app\" \"$APPDIR\"\nrelaunch_application 'com.rogueamoeba.Fission'\n", + "572fd0d4": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nquit_application 'com.rogueamoeba.Fission'\nsudo rm -rf \"$APPDIR/Fission.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.rogueamoeba.fission.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Fission'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.rogueamoeba.Fission'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.rogueamoeba.Fission'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.rogueamoeba.Fission.plist'\ntrash $LOGGED_IN_USER '~/Library/WebKit/com.rogueamoeba.Fission'\n" + } +} diff --git a/ee/maintained-apps/outputs/flexoptix/darwin.json b/ee/maintained-apps/outputs/flexoptix/darwin.json new file mode 100644 index 0000000000..0dcbbd1909 --- /dev/null +++ b/ee/maintained-apps/outputs/flexoptix/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "5.64.0-latest", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'net.flexoptix.flexoptix.app';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'net.flexoptix.flexoptix.app' AND version_compare(bundle_short_version, '5.64.0-latest') < 0);" + }, + "installer_url": "https://flexbox.reconfigure.me/download/electron/mac/arm64/FLEXOPTIX%20App-5.64.0-latest-arm64.dmg", + "install_script_ref": "f02733f2", + "uninstall_script_ref": "38a5d563", + "sha256": "7fa984b3c6935000952e01d25c4452ab4922e7388fe7f49d92b1f7dfda410e08", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "38a5d563": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/FLEXOPTIX App.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/flexoptix-app'\ntrash $LOGGED_IN_USER '~/Library/Preferences/net.flexoptix.flexoptix.app.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/net.flexoptix.flexoptix.app.savedState'\n", + "f02733f2": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'net.flexoptix.flexoptix.app'\nif [ -d \"$APPDIR/FLEXOPTIX App.app\" ]; then\n\tsudo mv \"$APPDIR/FLEXOPTIX App.app\" \"$TMPDIR/FLEXOPTIX App.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/FLEXOPTIX App.app\" \"$APPDIR\"\nrelaunch_application 'net.flexoptix.flexoptix.app'\n" + } +} diff --git a/ee/maintained-apps/outputs/fluid/darwin.json b/ee/maintained-apps/outputs/fluid/darwin.json new file mode 100644 index 0000000000..9974fc68fa --- /dev/null +++ b/ee/maintained-apps/outputs/fluid/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "2.1.2", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.fluidapp.Fluid2';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.fluidapp.Fluid2' AND version_compare(bundle_short_version, '2.1.2') < 0);" + }, + "installer_url": "https://fluidapp.com/dist/Fluid_2.1.2.zip", + "install_script_ref": "e0b24c09", + "uninstall_script_ref": "60e136d1", + "sha256": "cf58c480f631d2adc050b423e65776e253f52989ade9c1aaf8d77b8ced63a653", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "60e136d1": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/Fluid.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Fluid'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.fluidapp.Fluid2'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.fluidapp.Fluid*'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.fluidapp.Fluid*'\n", + "e0b24c09": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_and_track_application 'com.fluidapp.Fluid2'\nif [ -d \"$APPDIR/Fluid.app\" ]; then\n\tsudo mv \"$APPDIR/Fluid.app\" \"$TMPDIR/Fluid.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Fluid.app\" \"$APPDIR\"\nrelaunch_application 'com.fluidapp.Fluid2'\n" + } +} diff --git a/ee/maintained-apps/outputs/flux-app/darwin.json b/ee/maintained-apps/outputs/flux-app/darwin.json new file mode 100644 index 0000000000..6cdf993c89 --- /dev/null +++ b/ee/maintained-apps/outputs/flux-app/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "42.2", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'org.herf.Flux';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'org.herf.Flux' AND version_compare(bundle_short_version, '42.2') < 0);" + }, + "installer_url": "https://justgetflux.com/mac/Flux42.2.zip", + "install_script_ref": "59bf077e", + "uninstall_script_ref": "f95d7b66", + "sha256": "c937e24209f2ee99ad4586d7a19948bb1bdfca725b62e6bd061668be1f182765", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "59bf077e": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_and_track_application 'org.herf.Flux'\nif [ -d \"$APPDIR/Flux.app\" ]; then\n\tsudo mv \"$APPDIR/Flux.app\" \"$TMPDIR/Flux.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Flux.app\" \"$APPDIR\"\nrelaunch_application 'org.herf.Flux'\n", + "f95d7b66": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nquit_application 'org.herf.Flux'\nsudo rm -rf \"$APPDIR/Flux.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Flux'\ntrash $LOGGED_IN_USER '~/Library/Caches/org.herf.Flux'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.justgetflux.flux'\ntrash $LOGGED_IN_USER '~/Library/Cookies/org.herf.Flux.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/Preferences/org.herf.Flux.plist'\n" + } +} diff --git a/ee/maintained-apps/outputs/focusrite-control-2/darwin.json b/ee/maintained-apps/outputs/focusrite-control-2/darwin.json new file mode 100644 index 0000000000..630e203953 --- /dev/null +++ b/ee/maintained-apps/outputs/focusrite-control-2/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "1.1014.0.0", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.focusrite.control';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.focusrite.control' AND version_compare(bundle_short_version, '1.1014.0.0') < 0);" + }, + "installer_url": "https://releases.focusrite.com/com.focusrite.focusrite-control/release/Focusrite-Control-2-1.1014.0.0.dmg", + "install_script_ref": "41d926ee", + "uninstall_script_ref": "d9157ca8", + "sha256": "50fce21422b63fee23859d17169b188db352c7f3e80a2843dfed824bc7597ba3", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "41d926ee": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'com.focusrite.control'\nif [ -d \"$APPDIR/Focusrite Control 2.app\" ]; then\n\tsudo mv \"$APPDIR/Focusrite Control 2.app\" \"$TMPDIR/Focusrite Control 2.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Focusrite Control 2.app\" \"$APPDIR\"\nrelaunch_application 'com.focusrite.control'\n", + "d9157ca8": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nremove_launchctl_service() {\n local service=\"$1\"\n local booleans=(\"true\" \"false\")\n local plist_status\n local paths\n local should_sudo\n\n echo \"Removing launchctl service ${service}\"\n\n for should_sudo in \"${booleans[@]}\"; do\n plist_status=$(launchctl list \"${service}\" 2>/dev/null)\n\n if [[ $plist_status == \\{* ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo launchctl remove \"${service}\"\n else\n launchctl remove \"${service}\"\n fi\n sleep 1\n fi\n\n paths=(\n \"/Library/LaunchAgents/${service}.plist\"\n \"/Library/LaunchDaemons/${service}.plist\"\n )\n\n # if not using sudo, prepend the home directory to the paths\n if [[ $should_sudo == \"false\" ]]; then\n for i in \"${!paths[@]}\"; do\n paths[i]=\"${HOME}${paths[i]}\"\n done\n fi\n\n for path in \"${paths[@]}\"; do\n if [[ -e \"$path\" ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo rm -f -- \"$path\"\n else\n rm -f -- \"$path\"\n fi\n fi\n done\n done\n}\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nremove_launchctl_service 'com.focusrite.ControlServer'\nquit_application 'com.focusrite.control'\nsudo rm -rf \"$APPDIR/Focusrite Control 2.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Focusrite'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.juce.locks'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.focusrite.control'\ntrash $LOGGED_IN_USER '~/Library/Logs/Focusrite Control 2'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.focusrite.control.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.focusrite.control.savedState'\n" + } +} diff --git a/ee/maintained-apps/outputs/folx/darwin.json b/ee/maintained-apps/outputs/folx/darwin.json new file mode 100644 index 0000000000..7bad26a36e --- /dev/null +++ b/ee/maintained-apps/outputs/folx/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "5.34", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.eltima.Folx3';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.eltima.Folx3' AND version_compare(bundle_short_version, '5.34') < 0);" + }, + "installer_url": "https://cdn.electronic.us/products/folx/mac/download/downloader_mac.dmg", + "install_script_ref": "06b55c5d", + "uninstall_script_ref": "0fa6eb14", + "sha256": "no_check", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "06b55c5d": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'com.eltima.Folx3'\nif [ -d \"$APPDIR/Folx.app\" ]; then\n\tsudo mv \"$APPDIR/Folx.app\" \"$TMPDIR/Folx.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Folx.app\" \"$APPDIR\"\nrelaunch_application 'com.eltima.Folx3'\n", + "0fa6eb14": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/Folx.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.eltima.Folx3.FolxSafariExtension'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Eltima Software/Folx3'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Folx'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Google/Chrome/NativeMessagingHosts/com.eltima.folx.host.json'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Mozilla/NativeMessagingHosts/com.eltima.folx.host.json'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.eltima.Folx3'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.eltima.Folx3.FolxSafariExtension'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.eltima.Folx3'\ntrash $LOGGED_IN_USER '~/Library/Internet Plug-Ins/Folx3Plugin.plugin'\ntrash $LOGGED_IN_USER '~/Library/Logs/Folx.log'\ntrash $LOGGED_IN_USER '~/Library/Logs/Folx3.log'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.eltima.Folx3.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.eltima.FolxAgent.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.eltima.Folx3.savedState'\n" + } +} diff --git a/ee/maintained-apps/outputs/fontbase/darwin.json b/ee/maintained-apps/outputs/fontbase/darwin.json new file mode 100644 index 0000000000..a902f6533f --- /dev/null +++ b/ee/maintained-apps/outputs/fontbase/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "2026.5.17", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.dominiklevitsky.fontbase';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.dominiklevitsky.fontbase' AND version_compare(bundle_short_version, '2026.5.17') < 0);" + }, + "installer_url": "https://releases.fontba.se/mac/FontBase-2026.5.17.dmg", + "install_script_ref": "c8308243", + "uninstall_script_ref": "0ba275cf", + "sha256": "2ec577474fe8ea04e7b494893031df2a78923bd3690e34a29f0b2796bb2a2979", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "0ba275cf": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/FontBase.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/FontBase'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.dominiklevitsky.fontbase.helper.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.dominiklevitsky.fontbase.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.dominiklevitsky.fontbase.savedState'\n", + "c8308243": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'com.dominiklevitsky.fontbase'\nif [ -d \"$APPDIR/FontBase.app\" ]; then\n\tsudo mv \"$APPDIR/FontBase.app\" \"$TMPDIR/FontBase.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/FontBase.app\" \"$APPDIR\"\nrelaunch_application 'com.dominiklevitsky.fontbase'\n" + } +} diff --git a/ee/maintained-apps/outputs/fontlab/darwin.json b/ee/maintained-apps/outputs/fontlab/darwin.json new file mode 100644 index 0000000000..218bc556a8 --- /dev/null +++ b/ee/maintained-apps/outputs/fontlab/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "8.4.2.8950", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.fontlab.fontlab8';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.fontlab.fontlab8' AND version_compare(bundle_short_version, '8.4.2.8950') < 0);" + }, + "installer_url": "https://fontlab.s3.amazonaws.com/fontlab-8/8950/FontLab-8-Mac-Install-8950.dmg", + "install_script_ref": "4de2c50f", + "uninstall_script_ref": "3c4ddc48", + "sha256": "7891000fb57e699ed9067905efeee3b09a0e421b857234b12eafe65d06a46562", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "3c4ddc48": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/FontLab 8.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/FontLab'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.fontlab.fontlab8.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.fontlab.fontlab8.savedState'\n", + "4de2c50f": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'com.fontlab.fontlab8'\nif [ -d \"$APPDIR/FontLab 8.app\" ]; then\n\tsudo mv \"$APPDIR/FontLab 8.app\" \"$TMPDIR/FontLab 8.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/FontLab 8.app\" \"$APPDIR\"\nrelaunch_application 'com.fontlab.fontlab8'\n" + } +} diff --git a/ee/maintained-apps/outputs/forecast/darwin.json b/ee/maintained-apps/outputs/forecast/darwin.json new file mode 100644 index 0000000000..2201b9a1fb --- /dev/null +++ b/ee/maintained-apps/outputs/forecast/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "0.9.6", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'fm.overcast.forecast-encoder';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'fm.overcast.forecast-encoder' AND version_compare(bundle_short_version, '0.9.6') < 0);" + }, + "installer_url": "https://d2uzvmey2c90kn.cloudfront.net/appcast_download/Forecast_0.9.6_139.zip", + "install_script_ref": "87bc838d", + "uninstall_script_ref": "04c8f4ea", + "sha256": "5323c8afcc5114ebeb3d97c02e7f367e2c7e7a776a4e8b57809ef8c305272501", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "04c8f4ea": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/Forecast.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/fm.overcast.forecast-encoder.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Forecast'\ntrash $LOGGED_IN_USER '~/Library/Caches/fm.overcast.forecast-encoder'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/fm.overcast.forecast-encoder'\ntrash $LOGGED_IN_USER '~/Library/Preferences/fm.overcast.forecast-encoder.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/fm.overcast.forecast-encoder.savedState'\ntrash $LOGGED_IN_USER '~/Library/WebKit/fm.overcast.forecast-encoder'\n", + "87bc838d": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_and_track_application 'fm.overcast.forecast-encoder'\nif [ -d \"$APPDIR/Forecast.app\" ]; then\n\tsudo mv \"$APPDIR/Forecast.app\" \"$TMPDIR/Forecast.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Forecast.app\" \"$APPDIR\"\nrelaunch_application 'fm.overcast.forecast-encoder'\n" + } +} diff --git a/ee/maintained-apps/outputs/forklift/darwin.json b/ee/maintained-apps/outputs/forklift/darwin.json new file mode 100644 index 0000000000..9e4207bfc6 --- /dev/null +++ b/ee/maintained-apps/outputs/forklift/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "4.6.3", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.binarynights.ForkLift-4';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.binarynights.ForkLift-4' AND version_compare(bundle_short_version, '4.6.3') < 0);" + }, + "installer_url": "https://download.binarynights.com/ForkLift/ForkLift4.6.3.zip", + "install_script_ref": "050b6846", + "uninstall_script_ref": "99e7648d", + "sha256": "17bbf7669c72cf42f928e21ffbc8bbfdf0267b4992994594f1d8fa0c2e99f084", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "050b6846": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_and_track_application 'com.binarynights.ForkLift-4'\nif [ -d \"$APPDIR/ForkLift.app\" ]; then\n\tsudo mv \"$APPDIR/ForkLift.app\" \"$TMPDIR/ForkLift.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/ForkLift.app\" \"$APPDIR\"\nrelaunch_application 'com.binarynights.ForkLift-4'\n", + "99e7648d": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nremove_launchctl_service() {\n local service=\"$1\"\n local booleans=(\"true\" \"false\")\n local plist_status\n local paths\n local should_sudo\n\n echo \"Removing launchctl service ${service}\"\n\n for should_sudo in \"${booleans[@]}\"; do\n plist_status=$(launchctl list \"${service}\" 2>/dev/null)\n\n if [[ $plist_status == \\{* ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo launchctl remove \"${service}\"\n else\n launchctl remove \"${service}\"\n fi\n sleep 1\n fi\n\n paths=(\n \"/Library/LaunchAgents/${service}.plist\"\n \"/Library/LaunchDaemons/${service}.plist\"\n )\n\n # if not using sudo, prepend the home directory to the paths\n if [[ $should_sudo == \"false\" ]]; then\n for i in \"${!paths[@]}\"; do\n paths[i]=\"${HOME}${paths[i]}\"\n done\n fi\n\n for path in \"${paths[@]}\"; do\n if [[ -e \"$path\" ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo rm -f -- \"$path\"\n else\n rm -f -- \"$path\"\n fi\n fi\n done\n done\n}\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nremove_launchctl_service 'com.binarynights.ForkLiftHelper'\nremove_launchctl_service 'com.binarynights.ForkLiftMini'\nquit_application 'com.binarynights.ForkLift-4'\nquit_application 'com.binarynights.ForkLiftMini'\nsudo rm -rf '/Library/PrivilegedHelperTools/com.binarynights.ForkLiftHelper'\nsudo rm -rf \"$APPDIR/ForkLift.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/ForkLift'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.binarynights.ForkLift-4'\ntrash $LOGGED_IN_USER '~/Library/Cookies/com.binarynights.ForkLift-4.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.binarynights.ForkLift-4'\ntrash $LOGGED_IN_USER '~/Library/Logs/ForkLift'\ntrash $LOGGED_IN_USER '~/Library/Logs/ForkLiftMini'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.binarynights.ForkLift-4.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.binarynights.ForkLiftMini.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.binarynights.ForkLift-4.savedState'\n" + } +} diff --git a/ee/maintained-apps/outputs/framer/darwin.json b/ee/maintained-apps/outputs/framer/darwin.json new file mode 100644 index 0000000000..2115d4558e --- /dev/null +++ b/ee/maintained-apps/outputs/framer/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "2026.12.6", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.framer.electron';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.framer.electron' AND version_compare(bundle_short_version, '2026.12.6') < 0);" + }, + "installer_url": "https://updates.framer.com/electron/darwin/arm64/Framer-2026.12.6.zip", + "install_script_ref": "7c743e16", + "uninstall_script_ref": "4775195c", + "sha256": "4beda67f6593b09718c4bbb5f00e6a7ca77b4fac10107b27254cd33b80ac5b29", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "4775195c": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/Framer.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Framer'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.framer.electron'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.framer.electron.ShipIt'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.framer.electron'\ntrash $LOGGED_IN_USER '~/Library/Preferences/ByHost/com.framer.electron.ShipIt.*.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.framer.electron.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.framer.electron.savedState'\n", + "7c743e16": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_and_track_application 'com.framer.electron'\nif [ -d \"$APPDIR/Framer.app\" ]; then\n\tsudo mv \"$APPDIR/Framer.app\" \"$TMPDIR/Framer.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Framer.app\" \"$APPDIR\"\nrelaunch_application 'com.framer.electron'\n" + } +} diff --git a/ee/maintained-apps/outputs/franz/darwin.json b/ee/maintained-apps/outputs/franz/darwin.json new file mode 100644 index 0000000000..f6924f7efe --- /dev/null +++ b/ee/maintained-apps/outputs/franz/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "5.11.0", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.meetfranz.franz';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.meetfranz.franz' AND version_compare(bundle_short_version, '5.11.0') < 0);" + }, + "installer_url": "https://github.com/meetfranz/franz/releases/download/v5.11.0/franz-5.11.0-arm64.dmg", + "install_script_ref": "8c009aad", + "uninstall_script_ref": "acd2d9b1", + "sha256": "3390a32cab5510b34e2237f2215fc82086d1203cd621cdb8b5bd2f809db2297f", + "default_categories": [ + "Communication" + ] + } + ], + "refs": { + "8c009aad": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'com.meetfranz.franz'\nif [ -d \"$APPDIR/Franz.app\" ]; then\n\tsudo mv \"$APPDIR/Franz.app\" \"$TMPDIR/Franz.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Franz.app\" \"$APPDIR\"\nrelaunch_application 'com.meetfranz.franz'\n", + "acd2d9b1": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nsend_signal() {\n local signal=\"$1\"\n local bundle_id=\"$2\"\n local logged_in_user=\"$3\"\n local logged_in_uid pids\n\n if [ -z \"$signal\" ] || [ -z \"$bundle_id\" ] || [ -z \"$logged_in_user\" ]; then\n echo \"Usage: uninstall_signal \"\n return 1\n fi\n\n logged_in_uid=$(id -u \"$logged_in_user\")\n if [ -z \"$logged_in_uid\" ]; then\n echo \"Could not find UID for user '$logged_in_user'.\"\n return 1\n fi\n\n echo \"Signalling '$signal' to application ID '$bundle_id' for user '$logged_in_user'\"\n\n pids=$(/bin/launchctl asuser \"$logged_in_uid\" sudo -iu \"$logged_in_user\" /bin/launchctl list | awk -v bundle_id=\"$bundle_id\" '\n $3 ~ bundle_id { print $1 }')\n\n if [ -z \"$pids\" ]; then\n echo \"No processes found for bundle ID '$bundle_id'.\"\n return 0\n fi\n\n echo \"Unix PIDs are $pids for processes with bundle identifier $bundle_id\"\n for pid in $pids; do\n if kill -s \"$signal\" \"$pid\" 2>/dev/null; then\n echo \"Successfully signaled PID $pid with signal $signal.\"\n else\n echo \"Failed to kill PID $pid with signal $signal. Check permissions.\"\n fi\n done\n\n sleep 3\n}\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsend_signal 'QUIT' 'com.meetfranz.franz' \"$LOGGED_IN_USER\"\nsudo rm -rf '/Library/Logs/DiagnosticReports/Franz Helper_.*wakeups_resource.diag'\nsudo rm -rf \"$APPDIR/Franz.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Caches/franz-updater'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Franz'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.meetfranz.franz'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.meetfranz.franz.ShipIt'\ntrash $LOGGED_IN_USER '~/Library/Logs/Franz'\ntrash $LOGGED_IN_USER '~/Library/Preferences/ByHost/com.meetfranz.franz.ShipIt.*.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.electron.franz.helper.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.electron.franz.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.meetfranz.franz.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.electron.franz.savedState'\n" + } +} diff --git a/ee/maintained-apps/outputs/free-download-manager/darwin.json b/ee/maintained-apps/outputs/free-download-manager/darwin.json new file mode 100644 index 0000000000..8250f9bdc4 --- /dev/null +++ b/ee/maintained-apps/outputs/free-download-manager/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "6.34.1", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'org.freedownloadmanager.fdm6';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'org.freedownloadmanager.fdm6' AND version_compare(bundle_short_version, '6.34.1') < 0);" + }, + "installer_url": "https://files2.freedownloadmanager.org/6/latest/fdm.dmg", + "install_script_ref": "231b7da2", + "uninstall_script_ref": "a75037c2", + "sha256": "no_check", + "default_categories": [ + "Utilities" + ] + } + ], + "refs": { + "231b7da2": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'org.freedownloadmanager.fdm6'\nif [ -d \"$APPDIR/Free Download Manager.app\" ]; then\n\tsudo mv \"$APPDIR/Free Download Manager.app\" \"$TMPDIR/Free Download Manager.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Free Download Manager.app\" \"$APPDIR\"\nrelaunch_application 'org.freedownloadmanager.fdm6'\n", + "a75037c2": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nremove_launchctl_service() {\n local service=\"$1\"\n local booleans=(\"true\" \"false\")\n local plist_status\n local paths\n local should_sudo\n\n echo \"Removing launchctl service ${service}\"\n\n for should_sudo in \"${booleans[@]}\"; do\n plist_status=$(launchctl list \"${service}\" 2>/dev/null)\n\n if [[ $plist_status == \\{* ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo launchctl remove \"${service}\"\n else\n launchctl remove \"${service}\"\n fi\n sleep 1\n fi\n\n paths=(\n \"/Library/LaunchAgents/${service}.plist\"\n \"/Library/LaunchDaemons/${service}.plist\"\n )\n\n # if not using sudo, prepend the home directory to the paths\n if [[ $should_sudo == \"false\" ]]; then\n for i in \"${!paths[@]}\"; do\n paths[i]=\"${HOME}${paths[i]}\"\n done\n fi\n\n for path in \"${paths[@]}\"; do\n if [[ -e \"$path\" ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo rm -f -- \"$path\"\n else\n rm -f -- \"$path\"\n fi\n fi\n done\n done\n}\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nremove_launchctl_service 'org.freedownloadmanager.fdm6'\nremove_launchctl_service 'org.freedownloadmanager.fdm6.helper'\nquit_application 'org.freedownloadmanager.fdm6'\nquit_application 'org.freedownloadmanager.fdm6.launcher'\nsudo rm -rf \"$APPDIR/Free Download Manager.app\"\nsudo rmdir '~/Library/Application Support/Softdeluxe'\nsudo rmdir '~/Library/Caches/Softdeluxe'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Free Download Manager'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Softdeluxe/Free Download Manager'\ntrash $LOGGED_IN_USER '~/Library/Caches/org.freedownloadmanager.fdm6'\ntrash $LOGGED_IN_USER '~/Library/Caches/Softdeluxe/Free Download Manager'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.softdeluxe.Free Download Manager.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/org.freedownloadmanager.fdm6.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/org.freedownloadmanager.fdm6.savedState'\n" + } +} diff --git a/ee/maintained-apps/outputs/freefilesync/darwin.json b/ee/maintained-apps/outputs/freefilesync/darwin.json new file mode 100644 index 0000000000..7c74a77c02 --- /dev/null +++ b/ee/maintained-apps/outputs/freefilesync/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "14.9", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'org.freefilesync.FreeFileSync';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'org.freefilesync.FreeFileSync' AND version_compare(bundle_short_version, '14.9') < 0);" + }, + "installer_url": "https://freefilesync.org/download/FreeFileSync_14.9_macOS.zip", + "install_script_ref": "a3b4ab17", + "uninstall_script_ref": "d90871d5", + "sha256": "ec0c1fb52373055f0121de7b67fbda5d08cbf1e967bd915feea161358270cd30", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "a3b4ab17": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# install pkg files\nquit_and_track_application 'org.freefilesync.FreeFileSync'\nsudo installer -pkg \"$TMPDIR/FreeFileSync_14.9.pkg\" -target /\nrelaunch_application 'org.freefilesync.FreeFileSync'\n", + "d90871d5": "#!/bin/bash\n\n# variables\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nexpand_pkgid_and_map() {\n local PKGID=\"$1\"\n local FUNC=\"$2\"\n if [[ \"$PKGID\" == *\"*\" ]]; then\n local prefix=\"${PKGID%\\*}\"\n echo \"Expanding wildcard for PKGID: $PKGID\"\n for receipt in $(pkgutil --pkgs | grep \"^${prefix}\"); do\n echo \"Processing $receipt\"\n \"$FUNC\" \"$receipt\"\n done\n else\n \"$FUNC\" \"$PKGID\"\n fi\n}\n\nforget_pkg() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" forget_receipt\n}\n\nforget_receipt() {\n local PKGID=\"$1\"\n sudo pkgutil --forget \"$PKGID\"\n}\n\nremove_pkg_files() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" remove_receipt_files\n}\n\nremove_receipt_files() {\n local PKGID=\"$1\"\n local PKGINFO VOLUME INSTALL_LOCATION FULL_INSTALL_LOCATION\n\n echo \"pkgutil --pkg-info-plist \\\"$PKGID\\\"\"\n PKGINFO=$(pkgutil --pkg-info-plist \"$PKGID\")\n VOLUME=$(echo \"$PKGINFO\" | awk '/volume<\\/key>/ {getline; gsub(/.*|<\\/string>.*/, \"\"); print}')\n INSTALL_LOCATION=$(echo \"$PKGINFO\" | awk '/install-location<\\/key>/ {getline; gsub(/.*|<\\/string>.*/, \"\"); print}')\n\n if [ -z \"$INSTALL_LOCATION\" ] || [ \"$INSTALL_LOCATION\" = \"/\" ]; then\n FULL_INSTALL_LOCATION=\"$VOLUME\"\n else\n FULL_INSTALL_LOCATION=\"$VOLUME/$INSTALL_LOCATION\"\n FULL_INSTALL_LOCATION=$(echo \"$FULL_INSTALL_LOCATION\" | sed 's|//|/|g')\n fi\n\n echo \"sudo pkgutil --only-files --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-files --files \"$PKGID\" | sed \"s|^|/${INSTALL_LOCATION}/|\" | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n echo \"sudo pkgutil --only-dirs --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | grep '\\\\.app$' | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-dirs --files \"$PKGID\" | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" | grep '\\.app$' | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n root_app_dir=$(\n sudo pkgutil --only-dirs --files \"$PKGID\" \\\n | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" \\\n | grep 'Applications' \\\n | awk '{ print length, $0 }' \\\n | sort -n \\\n | head -n1 \\\n | cut -d' ' -f2-\n )\n if [ -n \"$root_app_dir\" ]; then\n echo \"sudo rmdir -p \\\"$root_app_dir\\\" 2>/dev/null || :\"\n sudo rmdir -p \"$root_app_dir\" 2>/dev/null || :\n fi\n}\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nremove_pkg_files 'org.freefilesync.pkg.FreeFileSync'\nforget_pkg 'org.freefilesync.pkg.FreeFileSync'\nremove_pkg_files 'org.freefilesync.pkg.RealTimeSync'\nforget_pkg 'org.freefilesync.pkg.RealTimeSync'\nsudo rm -rf '/usr/local/bin/freefilesync'\ntrash $LOGGED_IN_USER '~/Library/Application Support/FreeFileSync'\ntrash $LOGGED_IN_USER '~/Library/Preferences/org.freefilesync.FreeFileSync.plist'\n" + } +} diff --git a/ee/maintained-apps/outputs/fsmonitor/darwin.json b/ee/maintained-apps/outputs/fsmonitor/darwin.json new file mode 100644 index 0000000000..c64b4dc080 --- /dev/null +++ b/ee/maintained-apps/outputs/fsmonitor/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "2.0", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.tristan.FSMonitor';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.tristan.FSMonitor' AND version_compare(bundle_short_version, '2.0') < 0);" + }, + "installer_url": "https://tristan-software.ch/FSMonitor/Archives/FSMonitor_2.0(158).zip", + "install_script_ref": "af8199e9", + "uninstall_script_ref": "27df41ad", + "sha256": "9e9b73568bfcd91ef64980782b847e1fc721b001ae38a0fa03fbf5de08bef6ef", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "27df41ad": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nremove_launchctl_service() {\n local service=\"$1\"\n local booleans=(\"true\" \"false\")\n local plist_status\n local paths\n local should_sudo\n\n echo \"Removing launchctl service ${service}\"\n\n for should_sudo in \"${booleans[@]}\"; do\n plist_status=$(launchctl list \"${service}\" 2>/dev/null)\n\n if [[ $plist_status == \\{* ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo launchctl remove \"${service}\"\n else\n launchctl remove \"${service}\"\n fi\n sleep 1\n fi\n\n paths=(\n \"/Library/LaunchAgents/${service}.plist\"\n \"/Library/LaunchDaemons/${service}.plist\"\n )\n\n # if not using sudo, prepend the home directory to the paths\n if [[ $should_sudo == \"false\" ]]; then\n for i in \"${!paths[@]}\"; do\n paths[i]=\"${HOME}${paths[i]}\"\n done\n fi\n\n for path in \"${paths[@]}\"; do\n if [[ -e \"$path\" ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo rm -f -- \"$path\"\n else\n rm -f -- \"$path\"\n fi\n fi\n done\n done\n}\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nremove_launchctl_service 'com.tristan.fseventstool'\nsudo rm -rf '/Library/PrivilegedHelperTools/com.tristan.fseventstool'\nsudo rm -rf \"$APPDIR/FSMonitor.app\"\ntrash $LOGGED_IN_USER '/Users/Shared/FSMonitor'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.tristan.FSMonitor'\ntrash $LOGGED_IN_USER '~/Library/Application Support/FSMonitor'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.tristan.FSMonitor'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.tristan.FSMonitor.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.tristan.FSMonitor.savedState'\n", + "af8199e9": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_and_track_application 'com.tristan.FSMonitor'\nif [ -d \"$APPDIR/FSMonitor.app\" ]; then\n\tsudo mv \"$APPDIR/FSMonitor.app\" \"$TMPDIR/FSMonitor.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/FSMonitor.app\" \"$APPDIR\"\nrelaunch_application 'com.tristan.FSMonitor'\n" + } +} diff --git a/ee/maintained-apps/outputs/funter/darwin.json b/ee/maintained-apps/outputs/funter/darwin.json new file mode 100644 index 0000000000..41a85b6d8c --- /dev/null +++ b/ee/maintained-apps/outputs/funter/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "7.1.1", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.nektony.Funter-SIII';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.nektony.Funter-SIII' AND version_compare(bundle_short_version, '7.1.1') < 0);" + }, + "installer_url": "https://download.nektony.com/download/funter/Funter.dmg?build=374", + "install_script_ref": "1cb99628", + "uninstall_script_ref": "0088be9f", + "sha256": "8a8f8784ef3042106ff1f776803d96682f079c175e21a63d8f42568205e1081c", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "0088be9f": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/Funter 7.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/8DKG4XB37M.group.com.nektony.Funter-SIII'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/8DKG4XB37M.group.com.nektony.MacCleaner-PRO-SIII'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.nektony.Funter-SIII*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.nektony.Funter-SIII'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.nektony.Funter-SIII'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.nektony.Funter-SIII.FinderSyncExt*'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/8DKG4XB37M.group.com.nektony.Funter-SIII'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/8DKG4XB37M.group.com.nektony.MacCleaner-PRO-SIII'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.nektony.Funter-SIII'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.nektony.Funter-SIII.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.nektony.Funter-SIII.savedState'\n", + "1cb99628": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'com.nektony.Funter-SIII'\nif [ -d \"$APPDIR/Funter 7.app\" ]; then\n\tsudo mv \"$APPDIR/Funter 7.app\" \"$TMPDIR/Funter 7.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Funter 7.app\" \"$APPDIR\"\nrelaunch_application 'com.nektony.Funter-SIII'\n" + } +} diff --git a/frontend/pages/SoftwarePage/components/icons/Fantastical.tsx b/frontend/pages/SoftwarePage/components/icons/Fantastical.tsx new file mode 100644 index 0000000000..0ce36cbe66 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Fantastical.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Fantastical = (props: SVGProps) => ( + + + +); +export default Fantastical; diff --git a/frontend/pages/SoftwarePage/components/icons/Far2L.tsx b/frontend/pages/SoftwarePage/components/icons/Far2L.tsx new file mode 100644 index 0000000000..a29d863360 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Far2L.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Far2L = (props: SVGProps) => ( + + + +); +export default Far2L; diff --git a/frontend/pages/SoftwarePage/components/icons/Farrago.tsx b/frontend/pages/SoftwarePage/components/icons/Farrago.tsx new file mode 100644 index 0000000000..bc6fcc44d2 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Farrago.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Farrago = (props: SVGProps) => ( + + + +); +export default Farrago; diff --git a/frontend/pages/SoftwarePage/components/icons/Fastmail.tsx b/frontend/pages/SoftwarePage/components/icons/Fastmail.tsx new file mode 100644 index 0000000000..2ebac3b4a3 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Fastmail.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Fastmail = (props: SVGProps) => ( + + + +); +export default Fastmail; diff --git a/frontend/pages/SoftwarePage/components/icons/Fastscripts.tsx b/frontend/pages/SoftwarePage/components/icons/Fastscripts.tsx new file mode 100644 index 0000000000..6b2188b130 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Fastscripts.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Fastscripts = (props: SVGProps) => ( + + + +); +export default Fastscripts; diff --git a/frontend/pages/SoftwarePage/components/icons/Fellow.tsx b/frontend/pages/SoftwarePage/components/icons/Fellow.tsx new file mode 100644 index 0000000000..efdba7d5ea --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Fellow.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Fellow = (props: SVGProps) => ( + + + +); +export default Fellow; diff --git a/frontend/pages/SoftwarePage/components/icons/Ferdium.tsx b/frontend/pages/SoftwarePage/components/icons/Ferdium.tsx new file mode 100644 index 0000000000..c343bccf9a --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Ferdium.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Ferdium = (props: SVGProps) => ( + + + +); +export default Ferdium; diff --git a/frontend/pages/SoftwarePage/components/icons/FetchApp.tsx b/frontend/pages/SoftwarePage/components/icons/FetchApp.tsx new file mode 100644 index 0000000000..a3673b89ce --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/FetchApp.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const FetchApp = (props: SVGProps) => ( + + + +); +export default FetchApp; diff --git a/frontend/pages/SoftwarePage/components/icons/Fig.tsx b/frontend/pages/SoftwarePage/components/icons/Fig.tsx new file mode 100644 index 0000000000..e1fb78bf80 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Fig.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Fig = (props: SVGProps) => ( + + + +); +export default Fig; diff --git a/frontend/pages/SoftwarePage/components/icons/FileJuicer.tsx b/frontend/pages/SoftwarePage/components/icons/FileJuicer.tsx new file mode 100644 index 0000000000..13784f0d4a --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/FileJuicer.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const FileJuicer = (props: SVGProps) => ( + + + +); +export default FileJuicer; diff --git a/frontend/pages/SoftwarePage/components/icons/Filen.tsx b/frontend/pages/SoftwarePage/components/icons/Filen.tsx new file mode 100644 index 0000000000..837bfa566e --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Filen.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Filen = (props: SVGProps) => ( + + + +); +export default Filen; diff --git a/frontend/pages/SoftwarePage/components/icons/Fing.tsx b/frontend/pages/SoftwarePage/components/icons/Fing.tsx new file mode 100644 index 0000000000..b2eb9e9da7 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Fing.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Fing = (props: SVGProps) => ( + + + +); +export default Fing; diff --git a/frontend/pages/SoftwarePage/components/icons/Firealpaca.tsx b/frontend/pages/SoftwarePage/components/icons/Firealpaca.tsx new file mode 100644 index 0000000000..48483f9769 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Firealpaca.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Firealpaca = (props: SVGProps) => ( + + + +); +export default Firealpaca; diff --git a/frontend/pages/SoftwarePage/components/icons/FireflyIotaDesktop.tsx b/frontend/pages/SoftwarePage/components/icons/FireflyIotaDesktop.tsx new file mode 100644 index 0000000000..c5761c5136 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/FireflyIotaDesktop.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const FireflyIotaDesktop = (props: SVGProps) => ( + + + +); +export default FireflyIotaDesktop; diff --git a/frontend/pages/SoftwarePage/components/icons/FireflyShimmer.tsx b/frontend/pages/SoftwarePage/components/icons/FireflyShimmer.tsx new file mode 100644 index 0000000000..df3a06b556 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/FireflyShimmer.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const FireflyShimmer = (props: SVGProps) => ( + + + +); +export default FireflyShimmer; diff --git a/frontend/pages/SoftwarePage/components/icons/Fission.tsx b/frontend/pages/SoftwarePage/components/icons/Fission.tsx new file mode 100644 index 0000000000..3c3be05df7 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Fission.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Fission = (props: SVGProps) => ( + + + +); +export default Fission; diff --git a/frontend/pages/SoftwarePage/components/icons/Flexoptix.tsx b/frontend/pages/SoftwarePage/components/icons/Flexoptix.tsx new file mode 100644 index 0000000000..1cc72250d1 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Flexoptix.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Flexoptix = (props: SVGProps) => ( + + + +); +export default Flexoptix; diff --git a/frontend/pages/SoftwarePage/components/icons/Fluid.tsx b/frontend/pages/SoftwarePage/components/icons/Fluid.tsx new file mode 100644 index 0000000000..f76a8848f4 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Fluid.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Fluid = (props: SVGProps) => ( + + + +); +export default Fluid; diff --git a/frontend/pages/SoftwarePage/components/icons/FluxApp.tsx b/frontend/pages/SoftwarePage/components/icons/FluxApp.tsx new file mode 100644 index 0000000000..16ccace394 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/FluxApp.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const FluxApp = (props: SVGProps) => ( + + + +); +export default FluxApp; diff --git a/frontend/pages/SoftwarePage/components/icons/FocusriteControl2.tsx b/frontend/pages/SoftwarePage/components/icons/FocusriteControl2.tsx new file mode 100644 index 0000000000..f4eaecc4e9 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/FocusriteControl2.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const FocusriteControl2 = (props: SVGProps) => ( + + + +); +export default FocusriteControl2; diff --git a/frontend/pages/SoftwarePage/components/icons/Folx.tsx b/frontend/pages/SoftwarePage/components/icons/Folx.tsx new file mode 100644 index 0000000000..254e943ff7 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Folx.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Folx = (props: SVGProps) => ( + + + +); +export default Folx; diff --git a/frontend/pages/SoftwarePage/components/icons/Fontbase.tsx b/frontend/pages/SoftwarePage/components/icons/Fontbase.tsx new file mode 100644 index 0000000000..4514e8c261 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Fontbase.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Fontbase = (props: SVGProps) => ( + + + +); +export default Fontbase; diff --git a/frontend/pages/SoftwarePage/components/icons/Fontlab.tsx b/frontend/pages/SoftwarePage/components/icons/Fontlab.tsx new file mode 100644 index 0000000000..4762188ef3 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Fontlab.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Fontlab = (props: SVGProps) => ( + + + +); +export default Fontlab; diff --git a/frontend/pages/SoftwarePage/components/icons/Forecast.tsx b/frontend/pages/SoftwarePage/components/icons/Forecast.tsx new file mode 100644 index 0000000000..f3f2adb477 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Forecast.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Forecast = (props: SVGProps) => ( + + + +); +export default Forecast; diff --git a/frontend/pages/SoftwarePage/components/icons/Forklift.tsx b/frontend/pages/SoftwarePage/components/icons/Forklift.tsx new file mode 100644 index 0000000000..dc1a2a2405 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Forklift.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Forklift = (props: SVGProps) => ( + + + +); +export default Forklift; diff --git a/frontend/pages/SoftwarePage/components/icons/Framer.tsx b/frontend/pages/SoftwarePage/components/icons/Framer.tsx new file mode 100644 index 0000000000..5202ae0c1f --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Framer.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Framer = (props: SVGProps) => ( + + + +); +export default Framer; diff --git a/frontend/pages/SoftwarePage/components/icons/Franz.tsx b/frontend/pages/SoftwarePage/components/icons/Franz.tsx new file mode 100644 index 0000000000..3fd8df2f78 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Franz.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Franz = (props: SVGProps) => ( + + + +); +export default Franz; diff --git a/frontend/pages/SoftwarePage/components/icons/FreeDownloadManager.tsx b/frontend/pages/SoftwarePage/components/icons/FreeDownloadManager.tsx new file mode 100644 index 0000000000..50b00d5667 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/FreeDownloadManager.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const FreeDownloadManager = (props: SVGProps) => ( + + + +); +export default FreeDownloadManager; diff --git a/frontend/pages/SoftwarePage/components/icons/Freefilesync.tsx b/frontend/pages/SoftwarePage/components/icons/Freefilesync.tsx new file mode 100644 index 0000000000..00347225cd --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Freefilesync.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Freefilesync = (props: SVGProps) => ( + + + +); +export default Freefilesync; diff --git a/frontend/pages/SoftwarePage/components/icons/Fsmonitor.tsx b/frontend/pages/SoftwarePage/components/icons/Fsmonitor.tsx new file mode 100644 index 0000000000..1ca3076af2 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Fsmonitor.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Fsmonitor = (props: SVGProps) => ( + + + +); +export default Fsmonitor; diff --git a/frontend/pages/SoftwarePage/components/icons/Funter.tsx b/frontend/pages/SoftwarePage/components/icons/Funter.tsx new file mode 100644 index 0000000000..fced362f77 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Funter.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Funter = (props: SVGProps) => ( + + + +); +export default Funter; diff --git a/frontend/pages/SoftwarePage/components/icons/index.ts b/frontend/pages/SoftwarePage/components/icons/index.ts index 03d87ab8ec..da426905a2 100644 --- a/frontend/pages/SoftwarePage/components/icons/index.ts +++ b/frontend/pages/SoftwarePage/components/icons/index.ts @@ -259,17 +259,48 @@ import ExpressVpn from "./ExpressVpn"; import Extension from "./Extension"; import Extradock from "./Extradock"; import Falcon from "./Falcon"; +import Fantastical from "./Fantastical"; +import Far2L from "./Far2L"; +import Farrago from "./Farrago"; +import Fastmail from "./Fastmail"; +import Fastscripts from "./Fastscripts"; +import Fellow from "./Fellow"; +import Ferdium from "./Ferdium"; +import FetchApp from "./FetchApp"; +import Fig from "./Fig"; import Figma from "./Figma"; +import FileJuicer from "./FileJuicer"; import FileMakerPro from "./FileMakerPro"; +import Filen from "./Filen"; +import Fing from "./Fing"; +import Firealpaca from "./Firealpaca"; +import FireflyIotaDesktop from "./FireflyIotaDesktop"; +import FireflyShimmer from "./FireflyShimmer"; import Firefox from "./Firefox"; +import Fission from "./Fission"; import FleetDesktop from "./FleetDesktop"; +import Flexoptix from "./Flexoptix"; +import Fluid from "./Fluid"; +import FluxApp from "./FluxApp"; +import FocusriteControl2 from "./FocusriteControl2"; +import Folx from "./Folx"; +import Fontbase from "./Fontbase"; +import Fontlab from "./Fontlab"; +import Forecast from "./Forecast"; import Fork from "./Fork"; +import Forklift from "./Forklift"; import FourKSlideshowMaker from "./FourKSlideshowMaker"; import FourKStogram from "./FourKStogram"; import FourKVideoDownloader from "./FourKVideoDownloader"; import FourKVideoToMp3 from "./FourKVideoToMp3"; import FourKYoutubeToMp3 from "./FourKYoutubeToMp3"; +import Framer from "./Framer"; +import Franz from "./Franz"; +import FreeDownloadManager from "./FreeDownloadManager"; +import Freefilesync from "./Freefilesync"; import Front from "./Front"; +import Fsmonitor from "./Fsmonitor"; +import Funter from "./Funter"; import GarminExpress from "./GarminExpress"; import Gather from "./Gather"; import Gdevelop from "./Gdevelop"; @@ -1065,13 +1096,44 @@ export const SOFTWARE_NAME_TO_ICON_MAP = { exifrenamer: Exifrenamer, expressvpn: ExpressVpn, extradock: Extradock, + "f.lux": FluxApp, falcon: Falcon, + fantastical: Fantastical, + far2l: Far2L, + farrago: Farrago, + fastmail: Fastmail, + fastscripts: Fastscripts, + fellow: Fellow, + ferdium: Ferdium, + fetch: FetchApp, + fig: Fig, figma: Figma, + "file juicer": FileJuicer, "filemaker pro": FileMakerPro, + filen: Filen, + "fing desktop": Fing, + "fire alpaca": Firealpaca, + firefly: FireflyIotaDesktop, + "firefly shimmer": FireflyShimmer, firefox: Firefox, + fission: Fission, "fleet desktop": FleetDesktop, + "flexoptix app": Flexoptix, + fluid: Fluid, + "focusrite control 2": FocusriteControl2, + folx: Folx, + fontbase: Fontbase, + fontlab: Fontlab, + forecast: Forecast, fork: Fork, + forklift: Forklift, + framer: Framer, + franz: Franz, + "free download manager": FreeDownloadManager, + freefilesync: Freefilesync, front: Front, + fsmonitor: Fsmonitor, + funter: Funter, "garmin express": GarminExpress, "gather town": Gather, gdevelop: Gdevelop, diff --git a/website/assets/images/app-icon-fantastical-60x60@2x.png b/website/assets/images/app-icon-fantastical-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..100f50684df1ba62cd962c1bb0ff608d40b1f9e0 GIT binary patch literal 13631 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 literal 0 HcmV?d00001 diff --git a/website/assets/images/app-icon-far2l-60x60@2x.png b/website/assets/images/app-icon-far2l-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b37b7149baa27a6bd2bb1d279db0eb54b27a5f12 GIT binary patch literal 13807 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 XaA*4F8t?vdHcCleU9M8bBJ_U&u&bAU literal 0 HcmV?d00001 diff --git a/website/assets/images/app-icon-farrago-60x60@2x.png b/website/assets/images/app-icon-farrago-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..81d9004ddcc8880209f7035af0fd9ec92e57273f GIT binary patch literal 14758 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 TFw^``3$Lt{qGXM@QON%R^2A@a literal 0 HcmV?d00001 diff --git a/website/assets/images/app-icon-fastscripts-60x60@2x.png b/website/assets/images/app-icon-fastscripts-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0e01ba200cb9309a1fe0d1ce586e0bd6d8d79cf2 GIT binary patch literal 14171 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 O&}1c*Br4w<2mLR;-Kj(X literal 0 HcmV?d00001 diff --git a/website/assets/images/app-icon-fellow-60x60@2x.png b/website/assets/images/app-icon-fellow-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5827b9a3d0d68d756e9b6be23f0adb8121d6c159 GIT binary patch literal 7240 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 literal 0 HcmV?d00001 diff --git a/website/assets/images/app-icon-ferdium-60x60@2x.png b/website/assets/images/app-icon-ferdium-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0809ce51150f487568f01d7cb943b8d0c8d4267c GIT binary patch literal 8300 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 literal 0 HcmV?d00001 diff --git a/website/assets/images/app-icon-fetch-app-60x60@2x.png b/website/assets/images/app-icon-fetch-app-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..06a1ff311273aea01a73e38a61eab683688edff4 GIT binary patch literal 18967 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 literal 0 HcmV?d00001 diff --git a/website/assets/images/app-icon-fig-60x60@2x.png b/website/assets/images/app-icon-fig-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..159047e70c77063508e77f2a509cf5277bf29c09 GIT binary patch literal 6588 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 literal 0 HcmV?d00001 diff --git a/website/assets/images/app-icon-file-juicer-60x60@2x.png b/website/assets/images/app-icon-file-juicer-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4fd0c9731fc39e1187635b9101d3d325afc83b83 GIT binary patch literal 27793 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 literal 0 HcmV?d00001 diff --git a/website/assets/images/app-icon-filen-60x60@2x.png b/website/assets/images/app-icon-filen-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c2607a71590f4b716777de155a9c8402d00ec5ea GIT binary patch literal 6555 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 literal 0 HcmV?d00001 diff --git a/website/assets/images/app-icon-firealpaca-60x60@2x.png b/website/assets/images/app-icon-firealpaca-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..23b9ac068854e0fca9591df3fe9ade4c1f9d6338 GIT binary patch literal 12303 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 literal 0 HcmV?d00001 diff --git a/website/assets/images/app-icon-firefly-shimmer-60x60@2x.png b/website/assets/images/app-icon-firefly-shimmer-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5171011d204663cea23f42448483538625f013b9 GIT binary patch literal 6835 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 Vi~WA>GSdJ6002ovPDHLkV1g@a0D}Mk literal 0 HcmV?d00001 diff --git a/website/assets/images/app-icon-flexoptix-60x60@2x.png b/website/assets/images/app-icon-flexoptix-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0723746741f92cf77f1d88fece10bc298f2f2ae4 GIT binary patch literal 3996 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 literal 0 HcmV?d00001 diff --git a/website/assets/images/app-icon-fluid-60x60@2x.png b/website/assets/images/app-icon-fluid-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5f08705e9c2856805c271d814581e627ec747162 GIT binary patch literal 25273 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 S{ywJw0000S0L^6`hd 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 literal 0 HcmV?d00001 diff --git a/website/assets/images/app-icon-focusrite-control-2-60x60@2x.png b/website/assets/images/app-icon-focusrite-control-2-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b812cf86102555fbee6c51c6691c691e9b099141 GIT binary patch literal 22418 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 literal 0 HcmV?d00001 diff --git a/website/assets/images/app-icon-folx-60x60@2x.png b/website/assets/images/app-icon-folx-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..21e855b821ea28de19a90854c4ee2bb02b2d9b6b GIT binary patch literal 23144 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 Bl3D-& literal 0 HcmV?d00001 diff --git a/website/assets/images/app-icon-fontbase-60x60@2x.png b/website/assets/images/app-icon-fontbase-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e5a311288f981d62a2fe9a5c703d40bfbb45457c GIT binary patch literal 9476 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 Y>p-ahY^;*2zdsBq$*Id$Nn3>d4=tlyZU6uP literal 0 HcmV?d00001 diff --git a/website/assets/images/app-icon-fontlab-60x60@2x.png b/website/assets/images/app-icon-fontlab-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..14974a176a08fee673c5e5a9dfa18657dcb4286c GIT binary patch literal 12571 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 literal 0 HcmV?d00001 diff --git a/website/assets/images/app-icon-forecast-60x60@2x.png b/website/assets/images/app-icon-forecast-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6e28cb76f64459d324c5f533f5779e9f2f58323d GIT binary patch literal 12024 zcmZ{K1ymi)vhKz`xVyW%yL)hVciqTl1Hm0akR({p5L^NTC%C)2yUWIT{O8`84 zl2D#4;NJTbRtg_g0e}FycU(9C@c0k@008je005560RW*)007@Tt65XzT_IzmuV|~P z3SfHY5dlz94glD94(h!Ty*B^=CJzb#^G>1uk>x@EM;np{^WXeGK!rqD;5%&CL0jKj zUsXlO%FTt%!rIN!hRx5#{T~28#82p*b+Pfbpzw2XcJ&hS6Q%kWLg=0UN6bz|@h^zC zlPHzGss@F$o2Ly09~%c72bCBy1qFqOr?sunM;W>QGJo%hQrUZZy9=?i1A#y`AUB(v zryV<|pr9Z-2NydR7wbEM)yv=2+rp34)rHd%O z|6SXEN#BbrhAhJVpNSGf21IPUUoI@hiZYVgeo&`DNLePbX^=mV_TOgbix6)qJOxzB zE&%eU5a`+g_4p635}25TgmxOizyt6l(H69hsdNG)^m z{Y+@n$OKr8J&BA^7~QGWy|K$NetLhe>c16F;v@}=EpNL-%bl`fUb;HskMD`QU7x=W zxj=kKR6lw2pmc_dEU<(FU{C>R_2mf3(8A-W`pCk3JK8eaL z`^ql{{|0}sKdsWY$Gh5^o(0lOfqwh1MfBpd z3?${PVn`4w?zngCc@3snbel)v0*16HAm?dv>(_MOFm1ccjiWjhsM(@d6e}V0&|GAe zJJ6Qxm0OHilAnJbY2m65w zF3M4ax4n!XV;uAe^f|T!AUR8a&B=y;A==ZTc|p-}n3j1OR5g6FT30;yT!kKV9aC&f zOL8W_e-uSb{;)1wg&JfpGrtcbw?8i`=Ugm99ih{DbjVnbJ%NhEg*kF_F9V%MW%JuI zN-ic`j!FdH1L|hRvv3 zG7y9;AyzG6%C4fdTvs!E_jWVeSBo&-Vqs61Agu)WcK$R&yPI<`N*0sF!g=EdS;&cC z{i$AD7Zn&rmA2hW#;a_7b7?uRhF?mMfdh@6d4_|-H8LsyT$~}`M1=Xe-e448JWBPn zhHdo*pE75Hkv>-F%RwO{nl?%pflnj}V*bzz-8gUj)bkm{#l3KOW{d9o@~iz6$S&q; z&2c3foPX@8e-p`dvLa)nmQZnYh>;8k;QT6js9n>~j#2uJWs6z4Ar#g77nr`=M{qDp z(PF|wC^w*weCtQ#C+$eY6#y%m<%uD!T(=WO>@Agr{Rc-M&$$;@9y{Phw(_&0gddwSJIGSc+dJK*ayd!Hop3Mu> zb6BFF#W+odIh@E z4!O3U*`xsixgDKrvPzd2;`xeDcl09OaX;c1{7jaF`<2y#BN>*G&cPYOJX3V- zD%J$pyl^c>eRuFDS{@pX&Iv<)#sY2w&RB4n~CQb)J zJM;Qun8k6k=G*g)a@Z>DXMc^&4R*HHhQHWtC~V7~ymQA(F)@8|23H=l+oy1PF`}+w zSdzTGelLG9+O;qy2&^DRmgSG6k%;!NOPC}=hy)c}0I~4!O~IM;3vk(E+4xFEitbhv zjvQ?zT(4Q+snof$-uM$``7^nNWM2sjX!OGS)|`v={0Ql@z&5cZd$XFsof7s>{{W%w zi4XSc(z~!VNy2)CwzUKZe3p)jh?E;RQ?u?1XpuA^Ftf)c8vY1_Fh|W}Q5rL_rMHmA z#nR=wfJL+m7Hr`bXzNK}(ODF}^Bajw&HE$*rjK5eQu zXrP1y{DlF*Z${Vbw6WH(XWdNWqo;pHr6q+ny?=Z@f}0*DyL&o``%+V4xV0e?R-?x8 zqOF((d6VfI>*fyca^Og-y$v(qd%>FVq)wC$9PfO_pYAWNI6&tiF^M)09p2`*oz*40 z9{Z|udjc~IF*jyG`=SEKX%5isHK>yl-+>UXj_9?{Lx)hZVW#wa8txT4ro#-LO|ja! zjl#!)4yJu3uq$}cv|+G338S!YE=2CP%-H3&i)Tj9y6C!mwIefGjb@zelvac_zswSB zcgx~`Y&V}UUO8QXx-taJ__--=QNOXoMCg_25^6l0C3c>~PXleeBOgxS?V3OAH(!ea zgT`v_KS=IRj*khX{pcj$7k(6tKuM4pK|UEQu?Wh?0*B!$p622GB!QDc6ahQU^?aKs zR23f1^#{JaLXqPuQvrtEvR=Bc@@|u`d^U&Yrv1Zgrtkmo#|1t2mYP-#p4dNYlFNLj zM7(SAx71U|!d{cHdD_8%&K>^-d?g9qh#Kb=;h(VfKye5j()+u56NVmK)VvayBq@iT z#XC`b{Xh#|tFTmmQE+Tkw-qja3wW_~Hldq)TVuisEiM_CkpAViaKT3=g40%c_xAi^ zO2cS)%<}R_cyT({bEd_}P58E)k@vMk)Bev@jIc8O_2TvTn^-&rhxk&M3AefG39zmi z<$zi3+lL68Y<>WxpFw%Y3N&RWi-K^1zVLe3F+rpB?dWFQv8&N5RRIFDc@QdU>tg~o zy~@vdU~1VtyikHLRoC;@#2b}@EqO;;_gU?-x1-p0a|wuI(GJdkjLZk!1D8s%#EGv#LQ=I{I8i&C87TF&^lTVjZvmV{ z$J`Mi)-wIbk0Y|V-?Zv>a^~+WLw}r4)kDx2+!&W<(XjwfY`>1X{CdB6e|SF;C|*`8AuX#sp?xZ8O~ZW^OV>kQt=0-? zRp{NA6Fx|Vzn|Upu~N&{zhxfga^!02fBS(I~k@03&uCVLs6M#q=%ZNbOt z?{_|)N}5F%8v@9Lj#zglug#bJnv!|4liR3Yl~Vx{bZMZ; z_({Ec=(+mxwIno>m}c3}nI38>*FmwI{qe>dDpr}Dtz*@(BlpsTH|BLkP{s5YE|N}0 z-|K&qeYWQ*P2l1pFOGuEGℑ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 literal 0 HcmV?d00001 diff --git a/website/assets/images/app-icon-forklift-60x60@2x.png b/website/assets/images/app-icon-forklift-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..04dcec8e7b6f349207deeee94ce999778aba7528 GIT binary patch literal 16962 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 c0SSO1*sfIm7ZnrvuD_J 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 Bh2j7J literal 0 HcmV?d00001 diff --git a/website/assets/images/app-icon-free-download-manager-60x60@2x.png b/website/assets/images/app-icon-free-download-manager-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d5b1048a9b2632ef1be97ff902601e69086308ad GIT binary patch literal 11583 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 GL;n})O_&=1 literal 0 HcmV?d00001 diff --git a/website/assets/images/app-icon-freefilesync-60x60@2x.png b/website/assets/images/app-icon-freefilesync-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..88c55f1f46ecaf31186303c9073e3529ae36b5fd GIT binary patch literal 14265 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 L@?zEB41)d_>&hVt literal 0 HcmV?d00001 diff --git a/website/assets/images/app-icon-fsmonitor-60x60@2x.png b/website/assets/images/app-icon-fsmonitor-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1d8039f3e5ff61bab13d882a7962b8959af4f608 GIT binary patch literal 8463 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 aRHVAxtJPg)nScKskd}}auM{)<{J#Jnngosj literal 0 HcmV?d00001 diff --git a/website/assets/images/app-icon-funter-60x60@2x.png b/website/assets/images/app-icon-funter-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a64d54c77d53ffa97911c8e2681f722510fd6abf GIT binary patch literal 16691 zcmb8X1yEeiwl6%mLxKeN1P$(kLvVKp9^7qkhX5fsB)Gc|?oJY12iGCk3$kdBOLcekUcIB$RpoFn$uI!`0FHwE2hG26$Ugxc_3wL7%zW%` zglr?JA_)N0Cty9Aqx?O006OTc87+@ zU%>|}eFbY36#&a$8XbTTWd}h1OCkIXWPbwyfRv8_K>8aa{KLyf{4Z%pKGJ{F{{ZFV zk-h)I#_Y89LHa7nKnoWqc5_RYPgd+cPOkp|03trXzoe5D$ehN<$_4J13nOCJhaZh`XgVQ1gTAf7Jh`MCoinAXgv< zhqt#kyEhNJi@Oa6mynPU2PZcNH#gf~1e=GiGsxVB&Dn$g-`FybQuyD6?1=+bc z)BKaK`6m}okSHD9KL!2Q^KUz?eC+C=vr~OQY{y_qspHE{ZJ>w=p5lFH6bB5HimV0u|?W-R+R&}Nxo8AcYp1uW*m7fr$ zSRO+Wr(0eg{q5W0{ic)W;Fso&r=yE^p%)RHyJ9v;F5u>ktLv-UhQ*DC#91G*o4z)* zU!t7Hp>BAw{$^`P+f*d~Hx~5829Ni-F;4hTU8A2K1%I%v$4Zkine?D=SrTtEm+yJ@ z-syDlFKA!WoFlKM+RbNc(@osC+S-jd$7h?W$IJ5)XELgfixeaumq|#;Iq4oVH(<+heg?wVh=Q zhtAoKCuKm$)(GVp>pk%#QLJI zk(=l8*`KoL=||->J#1YiylU|sqs?0RGbgHMr%#)2UbYR7UoG>vf!%_xf6ioz`3D*9 z)ZG|Rul8^SCh%yQ-cZ|XQ*XeIj&5v!(RyKfx%~2yurXz)B?xJ4W{WEL{8v z`9cCw{{Y#j$N^+H42UZRO4wqiJo17bPn~cW( z7*p1exPSe%dCCs>ry9#oPdV>=Qr7!MC~o8V>8N2#a{24FeW4q61@2fP;yC&-v19`^ zlEJzeV5iSr^!}~4&+AuxWK^FHI`ktAh)tSeM8=SX%VN{qu$h5vjpq86PK8;C0$Yr0 zvff~_CQEGRu1+D|%L+K_f>9H6z+1FT>GQ<i;oY_YDJ+2@HLFC5;16(MKGZ?cy{gzi(y z;}U8=R|Fz2QBw(8GGkMwXd%-)8w2*6x;~AC_vgB46_v@=LsV#tmW^8Pr>Jh{3-GyzKwz35>s&lR5KmN+I6lto?${xOCTd zN~2H-{X9LKlhiL8%|96a>vK_#T8gi0#TLpqjq&g@apIqVT}k|g@E&#o;Au!w81*iY z%JWsm;fQpkIbypBbb+3vDh`Ud{&^ENGck1vy+gWT7xSKJ-Dou-S$)5Ibj|;%^{`5u zw;~vf)H@5yJB?Ct0yz~^zD2l=aSzG&f|&VL$0WkqZz?~jm7q#iks01d7F zK&1l1r!;>m>`yPU!z>>SQ$tZl&=*BH@e*{`@cPzMIp-^DkY#DzUVGd_-@)KHl_j`+ zmsZ=e|JA951D)u=-bKfEvr&9qe7132k36NctEXbslwV3U-rA83bu4%EwBzm8DqAew zQ>Dr$Tl5^w=Kgb3?7rpUm?0`j+^)a_pv z7*iQ+NG88zenoeQvDps z$bk;ZSi{@wA8-f~zrkMd7Kf7^5N@V+Kmb@Kz{-Je`5(36Him%j4Zeq;-a*N&w%XVl zRisgHsr(=#D|h^Zj1qs4zmz*F$32gLsSgfqO(asqArzM)k;&E)V~35y>$wL)fLlp&l!y zzDCvc`Bg_KmWlaRJa16@=kaL-*S_kkgXv@`vBzqpv;o1*W6PCTeGvMUVkK#DTW9?!wHK#@4Vop;o_s(ZxDu7uN_;KRQ{H4hxjWck%RrAwcXv6 zvZ9)lH}KOwytO`uG{Yf`=Shdpw89ciXuUv{zU**{&nOipI3_THMj0ZC0dPvyxI)G6 zKNZJYd>maTDK>6?ZS!!03BZNgi~45YH4pm&!c>pK&7IEI*BYc1Qs1~3DDd9LmQn~N zSqODye=nehim=6xoIJ2vMBc=4%;i zFF%G5eH`?}@PQ^tk98Qq5t$%+El@_EC3`UxypNhoD(%TgPBm0kpg8W^Vlp+3R^vd% z+8n<9qjtB$+SeVFS|<;sYAymI7M&;+os0=V%uzk6U*{&cQNIi##dVR1F6n*DkIKu~ zai;_)3iIHIe9ptOujER*BQj>$cvB%7_S~2{{2r*!qs?@VWP)tqaxz+Dn5vLvE?a4A zTRNz~_rxvX#Gc>yD<9Zt=A1-~ZqC}nrIt&Njkmto?Kp3K6L{5K73R%&r#l6Z7FK@l zmUY?ep}5XZ$C2Q|znXY-{P3&1*0YO@^MbVqOD$!L>Idu~El4AY_qZd#?N z-Z(w9=`N~{i6EUTi|}6M6d}fLKtWJ%`ZKOtNZCH4Z3A z=z~CyrduVq-&cvE*RD$L#MR(%sW2t<5ybZ_spZNlBuVZ^!qHfMOSppm1rwJ|p-IGI zruLLgAuu^K$GG)?!fY~r49}MTAz^{kGxZmt9A_dAP@cUiEcBa#IcN?^mda=5%~cE28i82cea8lh?-9$(VS##jxSRT=V|$uVbTdBTEuBVi0|Vs-)>+#x;=RASqT4 zgrr+m1)1A|&aW~d{rgBpz34l5CoBZ7}z#%a>KbdJY6m@Qz+%+|3 zDTgv-x{Jczo@=xru86Upvl}##Z^p4VLraMJJa~wKEYN(cH^9#xlH0_s)v`$Hn#dSB zeKX6o#9jD!&PdeRi9CuY14ti1JiairoY6XS8E-AXO4{pjU!o>u8>eQmPf-5qR2j#JiE$w*v4ji?^_LIw^Hu<^|-SUqm1hE zS%K*s&h+!16%TT!sX;6Pe(_VtImW`c0F%?{H%~OVN2|`htDWnxR{;_3F!Moo+#e1Z z7uA-fWum8U@=f0nIVDQI;^lTl} zZwE>YA)GF)eCM&crJ#OX(kDy;eqd1~>i$Eq$kheFQuM-ad;IW5BUk8)o`ZG>zVgu@ z?DA~oth?|iu}M%(m^$ZS>MBo|MuZ7}%3g*Gj-9s+4|n)yuM75eZUpWWrWMpseggdr z>e~qHb>&>&9q4GBE(&kvdnAM!OG9@H+)u;j;|=?NdIoKpIfrx)eDJ0>SH+dMfEAfR zQWhf~Toh3O2-8zz0L6w$;Lle@Y%oQwQuUJQukpfOcrl4Yhn9(nkT<7&jjjTfIk@aT zJ9B`1eBbH5K?Hglr?)E=A84#3;@+Yq2oC{wprNB8`AD_FzRVu9W7PQ+SXlu9L+d`5JzhhCcg?^0X zX)uq#&CJJItLqA@qLm9s)fuW99oGEG3vjcY<1r|wXjBVr*~vl`+tpiEq%JFmB(o}DULSP3@&LnH(4XT=dOWm;93`!}lf8Akb zMzUIq;#Az{iA+qwJL62ze|R-<7JEI6gqHeqv#xTddAq&dE86Rv?Tov(urbGkSbLku z2W6h^sQii_^@9#EU0VT?Z>Mw7febtEI;9K3xdVE{&-4aa?@eqOLtRXn-;4*-Rk%D_ zWCO1VC;C#8BuRX6-W9zO(stDr&fS6{BevuF?CzKHr@JBQ>SzNCcaF9` z_I6|*3vK||*!R8ixD+~YbkaiM&X+XJYjhzDCj+4Tw7MR?crE*2xEex?)u@u|wBl#! zB5aLlup{04Y9&M*1>vn1&6nSlw=A&|TKITP=s&WN<%Gr%%g}X35C}|f2>mB?D0e5L zLYE~>VRKQc+Uql;DlxK%A90NBTlPAmm90%9oS`c|R@N?`=u`K(*(7L#ORKj5)7x?= z5~R$oa<|%iTgO7GZ$*-&_ z&0+~+0z&N?j4;FSs%#?p4zb~Bat+sth456ZPJhA=zlG^UmT=tn5=uWULm)LIhqD}0 zid{iA!u<7;pQ_1MEYdD_`dDrf&B_s~m;L~xgaj;eTMCx!UF(TL->%`{jh=Feo7EzY z6Ui~jTd4i*!vy}&x0a*&WrY}8sbxQAo!@$sOk%AmD;e_tu-0*G(5V~^6}v4W)y)1- zSe<88AZ<>r(u9M9Q__zRn3DhNi1D&isIjyp&{{>!|CpO?V#C~i#qHoTucwsh!O7uk zMII*#3dKWy>{3SE8nu{IuqvKN3!P}2rPaqKM;$+V>7c)h*=kL`M!q86b0fY{5_N}x zP(KASskE-O<13`89UpKNy!%Zb2Z|j2HE$rmVN4qm9xr^%?I|h*j&{Prt|!eYjSy@NeRxjV(s-1U{#C zZ_k0|f;vmL^8^?v8*av%styPqZjV)Y!mO*zw{V$Vjx3f^VN5dOCki{$SHGKgM&{wy zQB-QZ9otEu!Sxu(Z^p$ha`acsBpq$LQh1IUR15|PBINf~}byIryMl3n^V`o2)d~530(V#<}Kj^PH zF$0}aZi!ow6_Mk%esQo(&!^%Op!N<+qHs(hQc@#>C;++>Un7XP6D{cn_048-SIe8d zwkktS1rQ%YFa$1&@+~*oNvsyG;*i4a;$?3f;zi%)_&y@o^{!i&w`VLkQ7Eg`EUN=4 z&UJ@cKkP(jUs12qp_f;G4>7QHPPx5(}P#Xm&*hFJI z1^Vf93a{Gu)i3>MDHJ!L9J)dzmq{_V)w`Q$gOw4A9PE}puSi8zTmYcVX01E1nlxyk zX(*&g0+L01XMQFW^g$;Z{+45a*U4cs`w6#`=KY`+o>H*uZ%Mn>oK`(f z>=M31G?DIbt+kyYJmp2l`w$$vUuJ&PBox{PE$9pM{!5ovJk4p8H^2JLT_~0*;%%A9 z36D`{>XpYer*r)8xl*4ds*dG1+kRhP?$}SDKXv0GzsFeZ>eP;K#agv(4f#=ombdt$W(A7Lj{3;4s@6V&x@BTBuyV};iAe%1&qA&ix!YAr^%YCio!k?fi8mvu zHjG@ZjhwIHq1hvNRROK+rfYAwsg>Vr9Ic6`cEyvN@_o4kKskLW&)Qj>d1BehFSB(>)vi}axMbZ%RVjt>y8U9A z3146OzQ#Zxae-y2wDPFCjPkpQ|DUeQpLuK9JswBvcH12VbKp3eo*XMqGaLQohI!dT zsg!W(lGrTTYl{}6%Ud&^2j&9Va$>#A!W5+;g!~#UdmnvU`Y)+42KccuP|2xi;?NjW38NiTd8Ko6JzZs)CY$)~1i@3%jI!RW z-K5(fU8B85Unc&kCy#Dw2~W+CYr{s6^=D_%dl&FYxw5aYu&ZjCa9Y1H9;pw44Y4Gx zF;JSf7@|&&aqpQb^B$ecJe0!R#te!;qX@V?q^1vW4_3S9@qFx56*cO-qe>71&&$Yy zWrZnU5`p*rdTXgY9`i@=4Y^!(xwvAJnkmuD6-L#JZ&PTWkYZw8S*%J-5Ic)sA8{QU zH_)wD?^ zFA?xfg)bg4^zXqp-RCsuzVhJ540=-}FFTKplMP5xKCm6y=+A(Eha$c`^{6Ov*hlCq zP$PCIL#C%FNm71oixA;5^DC)Fk^oIe>TD~?juwQ^N7?t(d#hp68pKJ-@2z{^>7D%z zcX2W(JiANxu$LKRZhQhcT9?jT==Fie!IMolGT(@weG~3(?G;za+(CQ0FaxRDX`(Rw z#@^r*?j$KV-r0S2sD;+hYS3ou+i_H-SIqJ3BMH>edOpc>bzSlN<#l}fIw#J}pPSHNXt1@?vFZt?s*P23kGgK3+r^}@;i`0aTzWj|3GKLlH zvgvG6c%!P;P%F-==*bR`=c$MqnNn)8o~R0`dMIga16wieiaQrQaeC6nQ`(x=@Qy(L zv5~0asoW=)nk$INfzbSziGp2WDeU_S{AKLjVliI8^(?5p^g$BE^5q9cg?AW5Evcm1 z5N{Z710j(mta#&6yKg&Y@BWCI@6mV$G zLukssNAC^pIBEbB|FReb;)XC^s0nEWPdb?dy{mp#RK9|!-q38%+>zj1J>SQg!u&Jfd2{ZdK+k1lnbtARL)HAxCaR{d=w{+ zDhoRHN!bJDh>ffDb5(nd(*K%wq!p`S{H*-}>?I(~(iHW|7;K$$H4D!)q*m_jxhiOC zoW$C*hkS{rVCUj$_)y0vbXONRI|*U%R||9cBT4baTzvuuf2mS~Fi*qIgO`a>uwRUu z7j$zV9JHVT0QDf}C&i9y>1(tz#q@mN5X2KPW2(Tv*ZTd*P~8YO+AhxcnIbM*Eicd> zcnlS7?kB60j$_SK=$N=)pZyMh3D|15q+IvoDr8X0sRmnsM)hRd<(lv4kn3g2DR}cW zxb4nA^Xhry`72D~9;Aykb3l~cPb}2nw>KkAs@`bbz!Mjk*J4WDiXne~*Bmi8H%L@z zdLt}wpgl9x#P{+UzTSH?z$-1XsPB>^XB#e+#7uC3iux8iKxn~ zn$M&FGe|zHZ=nb0?-}`|YmX0#5jEEEWeyyWHclc*NM)|LSr5JWIkWz84x2e%I=sVe zgDBh-JATp>95;t`z5dQPUuCYR^Qhe4?`c`Y2Yu0@TlV@U$W!iq8by4;X+7m&IQrNJ z7|y&xH8RlFf~bwa|2De(tnNbaY#P~5vc7Hc!Eay zLsrTbimA|mN|cZ3xh2@SjNg;iz*m7EvieUPWIOJTXx3o)e!%;Z#^V{`bJv3nwkFHT#w?Bm3-IWlkbS=qi-J#O4L54{{6U5R<@jK-j zfs37_!VtoWL!!OUMd~c?(Mh}{wV;P{cSDp7diUq1U1Ad(cEaAMDzV*SPa{o|HQ@cH z)v4J{lhdLm#rT}^$&=Y~7tVFa>tULH>VagQPHY(7drF{-D)1$^i?{pe-37!M_ybO~ z79}$Em2l~tDK19r?`x8|jp2B%$# zf;OCSjrgPL%uYCs@d{MMKJ_-Kd%wYB^OI5{4aTjtHHG863{a4aTr(vA>zJZytnljY zCnr-wCXt|hX}J~R>WMc1CQUUi6dl=lazm@^__)~0D>69Pe+Gf<4y>}O25&7IXo=1| zCq9f`Tc&=|y+2TMK1T&dt+G%smiY(b?uoyWpU97wI#vHiDH$b^M~09EaH;Zz}rtQ z`TB>;JN2D%kvF(}CbX07$k-JZrupGTF&m!lD+-6)IpPbSi-azPG|*HR*L!(II~+X^ zSgvOo;O&hoj$@(uDKef1ND1$idV7uvK*MXs5cW)iB`h<6F+?8@(SXe+Tlm)|^)Un+ z5?_VaQdg&PORqk20Kq1FXFb``16(5@P=6d}B8>n*#`z<N=e+1bZa7)ILf%32a_e za8Bqe$e8TC9TF&M6uTr6bze_sP|n?11QU0 zyt(zR$~!yR1axX*mxG%mQg#08^>yD^IP+AkSRbM_!YFg{d+{5YanyEm$HjOgnlUhQ zUx&R_j60JPYdv+N46B@QtTkSgE48C4$Q2(c;rp8b`NS_e&nT0=dj= zl{BSV97wF9ZY=&2FM2fLB+EI&q3+40#g%tOtA=0rF%?6-199+JY&?xzX)wMla;H&1 zeufJ5aVf%9pmuAmc+Z|HwHcRLB#MQFV7bQ2B4!vd?1x7duT3!3#KH=&v!_EvYb2 zN`Z|26qj|;V;tTgT~`=Xrz;+N*Uwog4Zm2H?joE_5OwN#xTk*>vWBkJEZ53;<-9bT zmgX6I+hlTAn6iEx1lBHWK|n`5Vz<|6B?^JS8T#_Iy9_I?CMyRwr?J7|g#_3M=U+>? z8PvjKo#Qq*J4g&w^eTlpMaVLPOixI1j=SZ>#iyA&u1BCQ&zGf_&k4a={I*TDWqIB| zmb;+lJ@00520x9BqcKMkWk8yI>6==N?O}r6UjzRrt?POc>Hx7RVHo?Unrxm#7-6p` zkf|Zcrx%BBN-@Y@VFOGAw}={%E_u(O?Trwq>=Thbnq-Rxh1nss)x&^0akGFKFhSeTZer@&BG(JSJXJ%TR!GMx6J zgW>NYBW7s569oNerepIF6y&R(0IFzy&4{uFv$YcC%<1h#NYV0%h^^Kz>I~(3vR-fV zXESD*|RYB^U6K=Qa z7PLPKbbSjCHbeuB!12Ut1wwwL@Lex6OfoIl#`OfBrQC6rFIhZDMGX%gmv^Rs3N8X$ zd6SKy+*yi~UC)1)n^S($irj*CSf5v~u zBZY7ocq$K9vXXM1hooiSz~PVHc{eyhW;q)_A*@IRo+B|YY$mm>wWGFRkBZfD_vWqw zas^Hkv3Y7YMQZ;kRtUL?pZv$mA1vKG`4Wp}znvHsUM|FL!ka+LilX)lGp?oMdbfkD zw;AtDJPOWVhez*|=al}P_JE;$qAn5*>evZ=uA~tfRBcTS8e}R2pib}Z$ZW&}-|t75p5pA!S=AbMvj^^u3JYKTd~?Rp zb1>PYDza@HI(nQrvA_t#==?6oyPfC|2E5x2cCVCuzL>=i^!?HK*Ds=rqtATWm-v}; z{izRM{P0U>9u%!?Tt!F>Z$n1+R)jtdlk)IXIc@TRoK{@;#Gq@=r4`eDYpy)Wmp=FI!zyAq+QVahPE+%YFCkJ6h>p#h|&L zMS48LC4M6Q;bJ>x;qA>BD~CU~AM`fua$C@>J=<$r!g?EY{2b>*#rPk`^73+3XC6Lt zonKr4M3d%X&qt z$1;-NE;$Hs1;1Ria9dr7JU-~HWln0m;#Bn6o3b7r3k`#Q5asW_?P@Iz^j?=7Dn1m+ zq`NUuUk{uXeCD!|9xrI7>Zc76BR8SK^dvYPctMMMWUXC1$`9zjKmu+a25$+Ex_CY} z4dDe>vK^`iBsP;nnzy&OtTwkN=R{Y#0@RZz`+pGRq)o7tq_9%gQq=hf%Ug#HHR z-$@X^B<>{ePF&nZd{C>gB2&ur>38@~))Mk7AHD@ueUt>U)vm=p=H#(A7bZ^V;7)J5 zOksaH%4TPd`DX0sd}GFA62XY#C%^7xkLx>e1wD>7fh#+qGo(6x-}X+NCZ7YOmA2&G z{n%}Y>7i{JsncC0&T+s72Gn8ad(~oDLcnz=JkszOQgz^06{ zy}mzpZpbeJJW2&tK+u&DT3^gnTE&%E-=2wN>g?-!lAX7VO=aq9u3KCLBDbfrpmmoM zH94v#@63u;uXGlLE*#|NXu0FO>rMaElkaJw?W5kWoH=!mG#4d{>g9O)KdrxchL%1+ zME%;sLp~YrJxKwDU&w;aeIVTlCB3~n9hWn~z1*Ug(BB$4E*PGMQn*_6(8J45W4V6t z9gF?!)Qxh{arZ#`Nr^|QAK%0~wqG)J!{(c+$%1TO|@i61w!cQ8uEu!82*c!xIt`?=JQy2RAarlsX zemUH4cn*yB!AnnWVtylxSn$r`wUS=7!VOF;I4OvHq4q+lpg^y#9Fbfi?j@wuV^Yw> z|2HjsO`w<82^?jl#J9`i|Fhr?b;1T{H9Yg0LuITb2n@N$PMQ0#Mcbdsv^nKrv&kB07(QjJz&>7V8eAg#z znzV6QS#&wE>FQg;A}0=E+Q&$Hy05*A=6Et18!B=y?|GiFb(fMI9!U(4L5KSBT|fs64QhpniITzIW2-;J0aLl4;_8You~Q{#b(;B@7a4^`&qN zemUPPo-z$+cfN}}*HQ)cINq}uCv^&SA1aFAOfH~G4EcwQtRS=4%XQ?YXI&0LM&!L*U_AJ2CVdp(9>fXwci&^yCJbTZZifx#BnH4 z2i;WIO)c}xY6cn(w}#E!{c&2rJmE3zcyIieQ$=L;@qm}$N7D%(RS)bz**)e_1r!tV zy1SHC26S=Uj0b8#{=4e?cb_UBsXyv+<`}6RsSa@hf3z~uXzIQ3F;BeUls)p5Uicp5 zF(eKDc!YJm$U5);r=w_5Q}#`0AK_}12I$YljRIKknIvIQdZG zpL|_c8V*neh)GEUX5Ela^qiksgmXW0<`TS)1(AEX<%72o|2gywYFFi3-fCP(Nk1pv z=oNfAQ41C}26v+Oh+LzwX1=DAh#M|}*|y(S!mOVPO%jo!_}^a)7S8SgY;o7SulpTx zS5=^vh!Wt4{WO|sDf{_vxPjP3I77*DEU0qLqe^JV?1WwK+jq{0;6p$TXe~7V$$PBz zt2@8ixS;wL7Nzr<>U4X56{xkY%Ilu>iqp1YaskeHISs9n^(i^r14(Cm!jc?gv=68r z;F?FsJa~bDj*eeoI`EQY8Gu;5dyd-GdHEC`2>o;L%SJO?i};CCwEnST4$P7InDG%5 zv`+kO(3>_ZyGcmg30K$k&U7SN7Qxk14nh5pG$!!Z*d*iQop*Cx+y+uzi+zpPene=& zd*8m{RV2D>b?j)*j+M_caxk-9*LB+Liv_J&jTM^ng7VEKwl|y&OVp?5s7|eG7v;I_ zn;Er`eM3BWws{SVl&^Zk@ljUPT^DN;>Jc+iL*C_M9&WI&KLUiOBS9qZmm1}~&daQC ze@CgJrCoSilV8&az(1T6f?v4TJ*Vhb(ro7%$MjxV^zP0FhIWS~D9)&=eg#^&BB^$> z*_oDJC!L4}-3|TI@Uh!dPqoi33uSPR^y-1VZ{HfYnp@x*Rh||HmrX76RlCx-`}%Ea zl(#D>cuFo$PuuH~xX5uG@@=(xf&q6tk_i1#nRthilLKhfN?4v7&tFEBnhy6JH#u9lWC|FPQJsCdMD$DBM> zMMJ|4d7FGf*J>8;_eHOm&pF?px;r$Zm7ij+9hw#-)Q4`5>*TC}>9xcLJ8sbyOU7z@ zM02hi=x0g6BHR-hLhC2Qzn1%Doeuc1Yi}<6b9u&fAA0V6E}B<(>B8+YCn%KA$9?IB zIv=48FJ^-yhDvG&@?^QwoGS)iOTnk1EG`!!mAi2NG&Xthr=JscKP#K5uGUg@^D2oR z1_hS3B+4J8cLldR{OzhB&}0pSw-k)G7h2FIZ-!A7i*7F}01lYXfaYtyghnPeFhAC# z2|b$$sZg24DJ$EjpToy${JosjGYP>aM)d;j!-eTX1Q1$!c|c&As45JfZXz~?VMg(I zmwK2a74h6H1jTI`HRHn(=Pwqqd)K0I{IxeNff%fjvo;ju} zVe;cPgisg{z##cdqQmqG@)+jW%c zg}FzU%?>)_^CHu-B2!L*?mxHTkbbn|0*>Iad>OJibn72BE$&{+m3>$w&f}9vnr1R+ zxIR8M2$X5?)XN27YE|*YagU3d8-KNa+r09UaDTtvR#P}>Yz*E2>TU~j%;-Qq^En;* zbXkL_>j)Bu*qMHcxBk-t5^!GGIfs<^R18>6*F0Ga0fvpYDXls z!N_3$D4Rm?VboQY_#H4G{dsK80KIj=E7<}w($GF~chW0LhlwKs^ z(k!n`&oh3-t&0JX`iR~5TDxOASLWapZT1L@S~cMioKRPLV}I{GRD@TQD*_rLYppHl z^k`yl3E3)SpI$iS$4GwDI@8uyP$JID$tO&gUo`jEr-2z7so2j6NczTASQ~bT^2(~q zaHs(PSCj`!(LoDxZiFsQE&Nrn6340vEE9@rRC{$B_3`hy%cFJ9lbSq_cW$jXai?@< z_aXKP@$FoU3Y`|Pvd;2UMI3U6Pszuz;EPD!$w&z3@lO;B%$7JHm3r#O=~pkQOQ0yR z^%&A7VIf?X^YrQ0l6BZi2NOLryBUjOISh;*tnIYAWV;HBId6H@@TOj&->! zG)AMAsC@4e86>3Oe)u3*SCsp@5qqQ+zmJ|2)nE&y8$(h(BY2N*K)39lMjW1Sh)l9> z??@c}>JF0?a&go?W72SLTj93*#Zl~BCB%d6xt~?=iaxXqcPxh^|KO2Pev*bQhi7WkF6u7?5G%ozod8)U4KKuX2T49ZVMghRL5_;KORnw_smAx@ln0dC?&Y{W zDVX0Tz|&R7$)GqFlC_!8H!WXLHFxSvz1lGa$IT~nE0^PIug&@!DNb4P2q_gKjq}Gnsj@BO7GaGxP9)=>xY<4KuNMTdlRuf?hC9R~ z4oO%+`rSGL5yHESWQ~J0McF=)K zx64ZS93;EdUp#1PS-t(wSnC4VHJ}l*@sU&kR#4>44reJ_lmaWuK+z)$Q_>j&@vVUd z%kOJ-{Wu`*6`N&C_9S8vByFl=`}YEkxa@!XhF><}{H%~jlHeU-eGTHOy2H2CH52yd zJRyU#**BodH@X>mcKinOYJ~3G=wkO%s;qz^BqkZkLmA^EXeyodcWE4_zu##?Iebp5 zeF_>iBll^z@{L$T7R~b!A2E$J22ZC)%E@G4?|z7^0P&< zZ@SZXaTtkX(SvOaAvyZMDKx=L&B1{tc@R)~Y`J@cE#3ZA_TJoERMNuJ{>SeOPn|4G zWBLgq&*b`Ve^06yE;-0Q4w^bE7uGNn%(BEG*QFH}q%Lk{nJ010hgc-O7ED^yZ*Pl6 zT77M1ezJ?Yv~XB7J+J>`uZ!VZq21~ohJI^jq`+6c$T{JbfuekEE2l?y2WLFPBXV1A z0=Dq*d!A=Jv;+N%h6yUx4ihifv9CUPs!pjyTX00rF|q_~&$OS_mZ+E_ik;2=ZE+MEoIA)$pa0`~lqfk-0m&pg#51gn*&*JD4Pf-zWs}Ul zp^JcJ5@C*Zorum?iv91DG#GMDr&6geSd3vh;7YP-={)Cy17*Iorx#wwD zjMy_?lJ(eGvxl-hDFAu_u+Ow3oi+T#*5XW5^4AW6;4lS)HHp%l<(OOM5M_(lSemY` zjBy=wk20CYSGQ>5E0`xnEUtXC8(saZBs zU$7_ySm@GJ#Y+hpJXKS?X=^Qt?jT&8>huOj^=SJn2W;tJZ8Q~sxrnSlWf<(uiVHVk9V@qJm~G}rR>%XR6{oJHGgMt+=^f8H0kL|w8j%U^$MN#6 zQz&PZW9HWAlp+U`k?O8bx2BgM&kD5`Iwu_fNG;v<>a?<%Lipe)>XZ3Q_iQLoMU1C! zHaVn7SSR+C=XYfB@?`Y>HCq^L`h zn^)3DQKoKABYvfGzV~#T=eEdB#G*%EO`Z}y@Nl7w;_mw3&?qQSr^c;GIq!%vjp`~9 z+;)G!&t*}$Fi%2&Ag|;NbT6Pve@yjI1=j$SELVINxaAmCNKzL4^cu8c^_|J>qEM;a z`I%*lFMhugCJ46>ZOsnDLfYzQVwkg6;kziryWC5PW?hd(3Ow4MobU-#WcN~M;^YbY z;Q4)Bt${Y+)A~e$*ONz|)svA|cbw@u>e*+#W{&!<_f@}#1}k{ow`Z3*K7NVMDXqZ_ zxvb&2)SDtR{rcKkZacD&1{XmVc?kNUUL%Vx7D+rCfFrm>%&DhHna%~(KAj`qvUER` z#KmJrnQ@9(b44>qP5XOQr|EPgAbheKQ#gI!ufK$DeHiiQrz8YGKx?@ADR!A6r2z{X zp8M1Ipq>x1^G?Pj4rWO0^9BcmF?2(r#}k1DBQ96LRKsT@tye)>8X@NQBxy6^*;tN| z>w%9x6~rp{<^#awdHMCXt=~xqJSCWA-*95Mzm#-gn8c;+I-yQA91M)tFf^8CWkC&+ zm-nw71v9Ihy-2~_iyhJIwk%<>dd95eu}oogc#CI#8>fNvs{+D)L?UzVh@)zh4yoF$ z%|?&q@K{3BCQLDv>I<`k%PZ$@EtGc=`YT$?04N+Qae8QkbgoE_9W?AmNpUjlZHZ_x zY$Mnr?)bL_;RuFppK<%er&r)bJwjdi%t8p$>#JA&yLv&_nJuMUdaZt_5(DF+)&Y{# z$d8IH>g5b^T(jbpKM~!nQG-GbTy_g~?Io;l0@Jt&|*u z*Qi-Uub1tLZI|Cr@prkMDmv*hj1_Z}6c;PbDcsE{RbgW@-o9r2o-Dh)ANt*Q&nc(; zGbx@s&FDcZWH%KXC5td%Wvu<32VWsaKbJKB40WpJJBJiE?%>gSl!?=}_yq>(M!5!} z8Ry!}cgw=N*8w=f?wy-rCade455KJzgZ(6jmofvY(n4Of9M2r4Ddz_Mun#o2!0gs~ z$BAiEw!d16h{)nf#XAsPB2njBSFu*Cxm=FIk+lDbmXF#;JB!W2lDB`R(1#P^OW5qn z{fQh`V%vbA=(ezuwn>BYLib`%vE@4|>qi(?AzpjP;lBIQtJqf-s8$jYKp6qGCsFv? zuE6t{cetg)g;{s=Wrk|E_|detX?i5t$(+Ceo5^qI;AJ-!A{!C}B!~V_`b`kzcb>=L ztCXtiJ0<;AW`y28(r`3GLc*=TuEgbn4%iu;NC41DE@!i^x7hIM&qh8Tx; zt+Q(Azo_GExtt^yVS8%uc%!Csffv72XryV*`N zcjdR$X@K-Z-A#|5&`WyNZjjGBSs-x3Ge3@@?&$LhW+ZJ!vFA^L`zc6nLFT~jEhe4~ z=gJ@HEoN`mHaTst?q9g1ecwdB{^>HhX@+(du>`8?;*@F$5m;Y_ZPPp2?M{|A5~vJo zRKRe0)p3-@1qW9y?amyQ<5+02$XmSOosqSFZ8;V@WQz$tE%4+!o2qP^Km@Q+Aj|zd zwuDyd@bIZoW)`*VF1g~UHZ&ep{wW#VllR)@VBl1E80slX-H zUPpIor>+19+aSC&JJ?D8|8yQ$k#0Kn;hGf zg}atzWM|2$U4h)-ZLy)!luiavZ`ll_jlAf*APIc{BgrLnD827UB)8(id_}eKoutJt zf3hEbTHR~xDX%%GnS)M_4-TJGn9;_CQK(yroW}h89i5dnihNYW;Zv<@V|qRHLY$9i z_k@S?qSCObCvC4`i{m5>#}{%v*Y2QLFDt*Q;36^O-h!FM!1`y$uHWBLve;r5 zaKEKSf?R9&%VJl~aU3}6KAIwl(lr@gm08x>U-N>E-L`u-3T&6Y5$#NA*xTJvVE8b! zMCEu&o(y6UPuk+*Oxa=cd(XVI_@@=%NNZjGn#R31VC%)MY+)B^*2H@#A*^O|oql-?NK x*0%Jv-I-3*xdr||Uh@9eRq)%BKcO#ZZ%Ki#6NVL*{`tRvf{f~iS}C)z{{;kCo