From 30570fb624429e344106f237d2216f4919194f48 Mon Sep 17 00:00:00 2001 From: fleet-release <80479975+fleet-release@users.noreply.github.com> Date: Tue, 16 Jun 2026 09:15:16 -0500 Subject: [PATCH] Update Fleet-maintained apps (#47662) Automated ingestion of latest Fleet-maintained app data. ## Summary by CodeRabbit ## Release Notes * **Chores** * Updated 21+ maintained applications across Windows and macOS platforms to their latest available versions, including Adobe Creative Cloud, AWS CLI, Codex, CodexBar, Discord, Egnyte, Google Drive, Grammarly, Gyazo, Insomnia, Loom, Slack, and Spotify. * Improved uninstaller behavior for select applications to ensure proper cleanup. Co-authored-by: allenhouchins <32207388+allenhouchins@users.noreply.github.com> --- .../outputs/adobe-creative-cloud/windows.json | 2 +- ee/maintained-apps/outputs/aws-cli/windows.json | 8 ++++---- ee/maintained-apps/outputs/codex-app/darwin.json | 8 ++++---- ee/maintained-apps/outputs/codexbar/darwin.json | 8 ++++---- ee/maintained-apps/outputs/devknife/darwin.json | 8 ++++---- ee/maintained-apps/outputs/discord/windows.json | 8 ++++---- ee/maintained-apps/outputs/egnyte/darwin.json | 8 ++++---- ee/maintained-apps/outputs/google-drive/darwin.json | 4 ++-- .../outputs/grammarly-desktop/darwin.json | 8 ++++---- ee/maintained-apps/outputs/gyazo/darwin.json | 12 ++++++------ ee/maintained-apps/outputs/insomnia/windows.json | 8 ++++---- ee/maintained-apps/outputs/loom/windows.json | 8 ++++---- ee/maintained-apps/outputs/mace/darwin.json | 8 ++++---- ee/maintained-apps/outputs/macwhisper/darwin.json | 8 ++++---- ee/maintained-apps/outputs/masscode/darwin.json | 8 ++++---- ee/maintained-apps/outputs/milanote/darwin.json | 8 ++++---- ee/maintained-apps/outputs/opera/darwin.json | 4 ++-- ee/maintained-apps/outputs/slack/windows.json | 8 ++++---- ee/maintained-apps/outputs/spotify/darwin.json | 4 ++-- ee/maintained-apps/outputs/thaw/darwin.json | 4 ++-- ee/maintained-apps/outputs/virtualbuddy/darwin.json | 4 ++-- 21 files changed, 73 insertions(+), 73 deletions(-) diff --git a/ee/maintained-apps/outputs/adobe-creative-cloud/windows.json b/ee/maintained-apps/outputs/adobe-creative-cloud/windows.json index d45e44924d..a115ef9d0d 100644 --- a/ee/maintained-apps/outputs/adobe-creative-cloud/windows.json +++ b/ee/maintained-apps/outputs/adobe-creative-cloud/windows.json @@ -9,7 +9,7 @@ "installer_url": "https://prod-rel-ffc-ccm.oobesaas.adobe.com/adobe-ffc-external/core/v1/wam/download?sapCode=KCCC&wamFeature=nuj-live", "install_script_ref": "a4660692", "uninstall_script_ref": "756b1d8c", - "sha256": "c74d99ce367bab6e3b18c9b521c739dde570147d1de04608fcbef6ba59f83efc", + "sha256": "fdaffc59a98ff32f50b5991719310cd846742976fe1331a581b8addb41408f04", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/aws-cli/windows.json b/ee/maintained-apps/outputs/aws-cli/windows.json index 7de39c487d..3a8a199ec5 100644 --- a/ee/maintained-apps/outputs/aws-cli/windows.json +++ b/ee/maintained-apps/outputs/aws-cli/windows.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "2.35.4", + "version": "2.35.5", "queries": { "exists": "SELECT 1 FROM programs WHERE name LIKE 'AWS Command Line Interface v2 %' AND publisher = 'Amazon Web Services';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'AWS Command Line Interface v2 %' AND publisher = 'Amazon Web Services' AND version_compare(version, '2.35.4') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'AWS Command Line Interface v2 %' AND publisher = 'Amazon Web Services' AND version_compare(version, '2.35.5') < 0);" }, - "installer_url": "https://awscli.amazonaws.com/AWSCLIV2-2.35.4.msi", + "installer_url": "https://awscli.amazonaws.com/AWSCLIV2-2.35.5.msi", "install_script_ref": "8959087b", "uninstall_script_ref": "58bcd016", - "sha256": "0785d8af3ef6f31a5f407287a1edf879fe94d19b24e7616e0d0894f38c79932c", + "sha256": "648b9854ffc71147223d98fbea53d82612e724c56c98531ad66c9df668ce14a9", "default_categories": [ "Developer tools" ], diff --git a/ee/maintained-apps/outputs/codex-app/darwin.json b/ee/maintained-apps/outputs/codex-app/darwin.json index 3c04169fc2..9949afe857 100644 --- a/ee/maintained-apps/outputs/codex-app/darwin.json +++ b/ee/maintained-apps/outputs/codex-app/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "26.609.41114", + "version": "26.609.71450", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.openai.codex';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.openai.codex' AND version_compare(bundle_short_version, '26.609.41114') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.openai.codex' AND version_compare(bundle_short_version, '26.609.71450') < 0);" }, - "installer_url": "https://persistent.oaistatic.com/codex-app-prod/Codex-darwin-arm64-26.609.41114.zip", + "installer_url": "https://persistent.oaistatic.com/codex-app-prod/Codex-darwin-arm64-26.609.71450.zip", "install_script_ref": "5e3efa57", "uninstall_script_ref": "a2b5ee81", - "sha256": "6f69d0de7800bc7f48cda0f87810068f109fe6ecf839df8dec0d093cb23ad362", + "sha256": "e773c824d5ad0d8567bbabb1d39f32ce730dd4699e4a9de5b838ea6955e268b7", "default_categories": [ "Developer tools" ] diff --git a/ee/maintained-apps/outputs/codexbar/darwin.json b/ee/maintained-apps/outputs/codexbar/darwin.json index aa1238cb44..97a57e07cc 100644 --- a/ee/maintained-apps/outputs/codexbar/darwin.json +++ b/ee/maintained-apps/outputs/codexbar/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "0.35.0", + "version": "0.36.1", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.steipete.codexbar';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.steipete.codexbar' AND version_compare(bundle_short_version, '0.35.0') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.steipete.codexbar' AND version_compare(bundle_short_version, '0.36.1') < 0);" }, - "installer_url": "https://github.com/steipete/CodexBar/releases/download/v0.35.0/CodexBar-macos-universal-0.35.0.zip", + "installer_url": "https://github.com/steipete/CodexBar/releases/download/v0.36.1/CodexBar-macos-universal-0.36.1.zip", "install_script_ref": "aea54a4e", "uninstall_script_ref": "efcab822", - "sha256": "961525fe7b86e379a1b048fc5113f757867435d4ad6749494ef6fe9fa672c266", + "sha256": "ac9b15d3bdfc5ed6ae751ea3bfffbe8f808d927daf76ed00bfd9194692752754", "default_categories": [ "Utilities" ] diff --git a/ee/maintained-apps/outputs/devknife/darwin.json b/ee/maintained-apps/outputs/devknife/darwin.json index 43b45ecdfa..79c31ddd00 100644 --- a/ee/maintained-apps/outputs/devknife/darwin.json +++ b/ee/maintained-apps/outputs/devknife/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "1.15.2", + "version": "1.15.3", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.solotuna.devknife';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.solotuna.devknife' AND version_compare(bundle_short_version, '1.15.2') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.solotuna.devknife' AND version_compare(bundle_short_version, '1.15.3') < 0);" }, - "installer_url": "https://files.solotuna.com/devknife/DevKnife-1.15.2.dmg", + "installer_url": "https://files.solotuna.com/devknife/DevKnife-1.15.3.dmg", "install_script_ref": "35f5d59e", "uninstall_script_ref": "34c288a4", - "sha256": "2048ccf5834b03a6a38ee5a77d7b5f35aba7e3be78d8de5adfc9007a588d18b9", + "sha256": "fde61669080be1a069922e69d68a481c809486c164505f9901ec27c8875b3b78", "default_categories": [ "Developer tools" ] diff --git a/ee/maintained-apps/outputs/discord/windows.json b/ee/maintained-apps/outputs/discord/windows.json index 61f29e953c..bd5811fa44 100644 --- a/ee/maintained-apps/outputs/discord/windows.json +++ b/ee/maintained-apps/outputs/discord/windows.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "1.0.9241", + "version": "1.0.9242", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'Discord' AND publisher = 'Discord Inc.';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Discord' AND publisher = 'Discord Inc.' AND version_compare(version, '1.0.9241') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Discord' AND publisher = 'Discord Inc.' AND version_compare(version, '1.0.9242') < 0);" }, - "installer_url": "https://stable.dl2.discordapp.net/distro/app/stable/win/x64/1.0.9241/DiscordSetup.exe", + "installer_url": "https://stable.dl2.discordapp.net/distro/app/stable/win/x64/1.0.9242/DiscordSetup.exe", "install_script_ref": "fd04e860", "uninstall_script_ref": "73fc6eff", - "sha256": "99909799082c39500bd6abe13ec7752fbe13ee659a75ddab585ff727d1d8b2bb", + "sha256": "3ee7967fc974f0f0d3c829d196f6c9846331815d3ab1c3b61b972306b60e1e71", "default_categories": [ "Communication" ] diff --git a/ee/maintained-apps/outputs/egnyte/darwin.json b/ee/maintained-apps/outputs/egnyte/darwin.json index 51f0216353..36be4cb1bf 100644 --- a/ee/maintained-apps/outputs/egnyte/darwin.json +++ b/ee/maintained-apps/outputs/egnyte/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "1.17.0", + "version": "1.18.1", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.egnyte.DesktopApp';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.egnyte.DesktopApp' AND version_compare(bundle_short_version, '1.17.0') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.egnyte.DesktopApp' AND version_compare(bundle_short_version, '1.18.1') < 0);" }, - "installer_url": "https://egnyte-cdn.egnyte.com/desktopapp/mac/en-us/1.17.0/Egnyte_1.17.0_2340.dmg", + "installer_url": "https://egnyte-cdn.egnyte.com/desktopapp/mac/en-us/1.18.1/Egnyte_1.18.1_2360.dmg", "install_script_ref": "ed6b4114", "uninstall_script_ref": "34c8aecc", - "sha256": "6f16d7e6b7040f32122e7f645785023b1b054866a1ebb6d8cb91fb86ff9f018c", + "sha256": "46c07adfd4cce7f1abff89e6973ee6e0ff5fa58ded8f782cf9f5872250ea53b2", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/google-drive/darwin.json b/ee/maintained-apps/outputs/google-drive/darwin.json index 59d1bc1f51..aeb0c66688 100644 --- a/ee/maintained-apps/outputs/google-drive/darwin.json +++ b/ee/maintained-apps/outputs/google-drive/darwin.json @@ -1,10 +1,10 @@ { "versions": [ { - "version": "126.0", + "version": "127.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.google.drivefs';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.google.drivefs' AND version_compare(bundle_short_version, '126.0') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.google.drivefs' AND version_compare(bundle_short_version, '127.0') < 0);" }, "installer_url": "https://dl.google.com/drive-file-stream/5-percent/GoogleDrive.dmg", "install_script_ref": "91aa50c7", diff --git a/ee/maintained-apps/outputs/grammarly-desktop/darwin.json b/ee/maintained-apps/outputs/grammarly-desktop/darwin.json index 676d4ea7aa..03fe1c7294 100644 --- a/ee/maintained-apps/outputs/grammarly-desktop/darwin.json +++ b/ee/maintained-apps/outputs/grammarly-desktop/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "1.169.1", + "version": "1.170.1", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.grammarly.ProjectLlama';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.grammarly.ProjectLlama' AND version_compare(bundle_short_version, '1.169.1') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.grammarly.ProjectLlama' AND version_compare(bundle_short_version, '1.170.1') < 0);" }, - "installer_url": "https://download-mac.grammarly.com/versions/1.169.1.0/Grammarly.dmg", + "installer_url": "https://download-mac.grammarly.com/versions/1.170.1.0/Grammarly.dmg", "install_script_ref": "20d5bd8f", "uninstall_script_ref": "e14b2d61", - "sha256": "e486fb425b7a2b631e56190273517518ad137705475e0be84aed247173b30b75", + "sha256": "2948a5f5d3b1e32039101854b8108509494c9cd3140772ddc3f3a4d04f277c47", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/gyazo/darwin.json b/ee/maintained-apps/outputs/gyazo/darwin.json index 8c8b0d966e..d08df6ac3a 100644 --- a/ee/maintained-apps/outputs/gyazo/darwin.json +++ b/ee/maintained-apps/outputs/gyazo/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "10.10.0", + "version": "10.10.1", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.gyazo.menu';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.gyazo.menu' AND version_compare(bundle_short_version, '10.10.0') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.gyazo.menu' AND version_compare(bundle_short_version, '10.10.1') < 0);" }, - "installer_url": "https://files.gyazo.com/setup/Gyazo-10.10.0.pkg", - "install_script_ref": "6378b496", + "installer_url": "https://files.gyazo.com/setup/Gyazo-10.10.1.pkg", + "install_script_ref": "473d5b8d", "uninstall_script_ref": "0499da8a", - "sha256": "5f7af731d47f1ffd23023707fece6d3c8fa3de9363f63268cfa1036fc7f36a3a", + "sha256": "3d85431d0ed47c36de9754c7846d2063d7f81fcd8e815842ae273ecce7a0cb5a", "default_categories": [ "Productivity" ] @@ -17,6 +17,6 @@ ], "refs": { "0499da8a": "#!/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\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\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_launchctl_service 'com.gyazo.menu.helper'\nquit_application 'com.gyazo.menu'\nremove_pkg_files 'com.gyazo.pkg'\nforget_pkg 'com.gyazo.pkg'\nsudo rm -rf '/Applications/Gyazo Menu.app'\nsudo rm -rf '/Applications/Gyazo Video.app'\nsudo rm -rf '/Applications/Gyazo.app'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.gyazo.gif'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.gyazo.mac'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.gyazo.gif.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.gyazo.mac.plist'\n", - "6378b496": "#!/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# install pkg files\nquit_and_track_application 'com.gyazo.menu'\nsudo installer -pkg \"$TMPDIR/Gyazo-10.10.0.pkg\" -target /\nrelaunch_application 'com.gyazo.menu'\n" + "473d5b8d": "#!/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# install pkg files\nquit_and_track_application 'com.gyazo.menu'\nsudo installer -pkg \"$TMPDIR/Gyazo-10.10.1.pkg\" -target /\nrelaunch_application 'com.gyazo.menu'\n" } } diff --git a/ee/maintained-apps/outputs/insomnia/windows.json b/ee/maintained-apps/outputs/insomnia/windows.json index 6f76dfb828..a83bea8a0a 100644 --- a/ee/maintained-apps/outputs/insomnia/windows.json +++ b/ee/maintained-apps/outputs/insomnia/windows.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "12.6.0", + "version": "13.0.0", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'Insomnia' AND publisher = 'Kong';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Insomnia' AND publisher = 'Kong' AND version_compare(version, '12.6.0') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Insomnia' AND publisher = 'Kong' AND version_compare(version, '13.0.0') < 0);" }, - "installer_url": "https://github.com/Kong/insomnia/releases/download/core@12.6.0/Insomnia.Core-12.6.0.exe", + "installer_url": "https://github.com/Kong/insomnia/releases/download/core@13.0.0/Insomnia.Core-13.0.0.exe", "install_script_ref": "a20529f5", "uninstall_script_ref": "b9ba50cf", - "sha256": "bec143adc50fcc78a838641af6593f585874856629fb5f1b8a6b62be058be714", + "sha256": "2b1ef8612fefcf4002585da919e6b56943ffd1336109f53a778f822afd752be4", "default_categories": [ "Developer tools" ] diff --git a/ee/maintained-apps/outputs/loom/windows.json b/ee/maintained-apps/outputs/loom/windows.json index 800248323b..2079e6c247 100644 --- a/ee/maintained-apps/outputs/loom/windows.json +++ b/ee/maintained-apps/outputs/loom/windows.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "0.353.3", + "version": "0.354.0", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'Loom' AND publisher = 'Loom, Inc.';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Loom' AND publisher = 'Loom, Inc.' AND version_compare(version, '0.353.3') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Loom' AND publisher = 'Loom, Inc.' AND version_compare(version, '0.354.0') < 0);" }, - "installer_url": "https://cdn.loom.com/desktop-packages/Loom%20Setup%200.353.3.exe", + "installer_url": "https://cdn.loom.com/desktop-packages/Loom%20Setup%200.354.0.exe", "install_script_ref": "77327cbf", "uninstall_script_ref": "b012f1e7", - "sha256": "db4b68d78b06fae97442c9ca36a00581632ed6945f4ea867b83ba8ccc63996fa", + "sha256": "65df0c885a41eda53d694440c36392ce31b40520531cf4b4b0d189df66b8c81d", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/mace/darwin.json b/ee/maintained-apps/outputs/mace/darwin.json index 8f83449962..c49ab1a08c 100644 --- a/ee/maintained-apps/outputs/mace/darwin.json +++ b/ee/maintained-apps/outputs/mace/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "0.2.1-beta", + "version": "0.2.2-beta", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.mace.app';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.mace.app' AND version_compare(bundle_short_version, '0.2.1-beta') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.mace.app' AND version_compare(bundle_short_version, '0.2.2-beta') < 0);" }, - "installer_url": "https://github.com/MACE-App/MACE/releases/download/v0.2.1-beta/M.A.C.E.V0.2.1-beta.dmg", + "installer_url": "https://github.com/MACE-App/MACE/releases/download/v0.2.2-beta/M.A.C.E.V0.2.2-beta.dmg", "install_script_ref": "e194b881", "uninstall_script_ref": "672b1fee", - "sha256": "0dbd95c74e90a582ab2fc30c5ee6791223fd49afb73a3d5da0e07569ec420c82", + "sha256": "6383c6b2de383c4277fd7a1af2e0af851eb031f57c97ea73ca3062d9816741a9", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/macwhisper/darwin.json b/ee/maintained-apps/outputs/macwhisper/darwin.json index 7dd092d446..02a3afc3bb 100644 --- a/ee/maintained-apps/outputs/macwhisper/darwin.json +++ b/ee/maintained-apps/outputs/macwhisper/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "13.21.4", + "version": "13.22.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.goodsnooze.MacWhisper';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.goodsnooze.MacWhisper' AND version_compare(bundle_short_version, '13.21.4') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.goodsnooze.MacWhisper' AND version_compare(bundle_short_version, '13.22.0') < 0);" }, - "installer_url": "https://cdn.macwhisper.com/macwhisper/MacWhisper-1427.zip", + "installer_url": "https://cdn.macwhisper.com/macwhisper/MacWhisper-1432.zip", "install_script_ref": "cf608a83", "uninstall_script_ref": "fc63912f", - "sha256": "efa294cc256e6de23c66a4bf013f6c67d6d1ccbf956543224c4d67218edeb337", + "sha256": "c1b9c112c2371ea9489da0c5de54de9835d48881a546c79ea918b6aadf832644", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/masscode/darwin.json b/ee/maintained-apps/outputs/masscode/darwin.json index 64a1f64be7..fc3aceedda 100644 --- a/ee/maintained-apps/outputs/masscode/darwin.json +++ b/ee/maintained-apps/outputs/masscode/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "5.6.1", + "version": "5.7.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'io.masscode.app';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'io.masscode.app' AND version_compare(bundle_short_version, '5.6.1') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'io.masscode.app' AND version_compare(bundle_short_version, '5.7.0') < 0);" }, - "installer_url": "https://github.com/massCodeIO/massCode/releases/download/v5.6.1/massCode-5.6.1-arm64.dmg", + "installer_url": "https://github.com/massCodeIO/massCode/releases/download/v5.7.0/massCode-5.7.0-arm64.dmg", "install_script_ref": "0a664ca4", "uninstall_script_ref": "39171b71", - "sha256": "f07665bbeed0a962a5eabdb12dda2554d6a7bfb2ae996c694552f11c0b708d16", + "sha256": "30f52296af5a5e42db96531090ca768f3b5fbea8b8e3ee723b730846800b729a", "default_categories": [ "Developer tools" ] diff --git a/ee/maintained-apps/outputs/milanote/darwin.json b/ee/maintained-apps/outputs/milanote/darwin.json index 6d6507c908..aaf219f557 100644 --- a/ee/maintained-apps/outputs/milanote/darwin.json +++ b/ee/maintained-apps/outputs/milanote/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "3.18.107", + "version": "3.18.108", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.milanote.app';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.milanote.app' AND version_compare(bundle_short_version, '3.18.107') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.milanote.app' AND version_compare(bundle_short_version, '3.18.108') < 0);" }, - "installer_url": "https://milanote-app-releases.s3.amazonaws.com/Milanote-3.18.107.dmg", + "installer_url": "https://milanote-app-releases.s3.amazonaws.com/Milanote-3.18.108.dmg", "install_script_ref": "ed82e649", "uninstall_script_ref": "19269206", - "sha256": "603c13e5fc91217f9f3527c69dc698ea6c5e7582b438eae872998a9a902e1f26", + "sha256": "4e7dc5229c22fe78baa8ee9171e5976251ef44dc816b8b5a0114a7cca2eb1fbe", "default_categories": [ "Developer tools" ] diff --git a/ee/maintained-apps/outputs/opera/darwin.json b/ee/maintained-apps/outputs/opera/darwin.json index 9e2e5362cd..322786d8ff 100644 --- a/ee/maintained-apps/outputs/opera/darwin.json +++ b/ee/maintained-apps/outputs/opera/darwin.json @@ -6,10 +6,10 @@ "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.operasoftware.Opera';", "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.operasoftware.Opera' AND version_compare(bundle_short_version, '132.0') < 0);" }, - "installer_url": "https://get.geo.opera.com/pub/opera/desktop/132.0.5905.37/mac/Opera_132.0.5905.37_Setup.dmg", + "installer_url": "https://get.geo.opera.com/pub/opera/desktop/132.0.5905.73/mac/Opera_132.0.5905.73_Setup.dmg", "install_script_ref": "e9e947a7", "uninstall_script_ref": "566d9846", - "sha256": "a0d0fa6073fc69999cca3ebb3db1d1928e2a0806494e469f77c8d3fcc63bb51a", + "sha256": "df959c52640d3c410f9cf54b4644588d54d9d47d22b6d14362f5b7969283f392", "default_categories": [ "Browsers" ] diff --git a/ee/maintained-apps/outputs/slack/windows.json b/ee/maintained-apps/outputs/slack/windows.json index ee3b39e633..f434e5ce50 100644 --- a/ee/maintained-apps/outputs/slack/windows.json +++ b/ee/maintained-apps/outputs/slack/windows.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "4.50.136", + "version": "4.50.140", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'Slack' AND publisher = 'Slack Technologies Inc.';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Slack' AND publisher = 'Slack Technologies Inc.' AND version_compare(version, '4.50.136') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Slack' AND publisher = 'Slack Technologies Inc.' AND version_compare(version, '4.50.140') < 0);" }, - "installer_url": "https://downloads.slack-edge.com/desktop-releases/windows/x64/4.50.136/Slack.msix", + "installer_url": "https://downloads.slack-edge.com/desktop-releases/windows/x64/4.50.140/Slack.msix", "install_script_ref": "8b41f934", "uninstall_script_ref": "034eae14", - "sha256": "da15dc60c979b4c278278ac0b00e754716fc2163d2b1144a1a570dd82bb7b13d", + "sha256": "c2a04477eeb19dced44462b605ef87a929af75425d0dac3ee8c179a31b75c0b7", "default_categories": [ "Communication" ] diff --git a/ee/maintained-apps/outputs/spotify/darwin.json b/ee/maintained-apps/outputs/spotify/darwin.json index 5b4a44c323..c7183e8b89 100644 --- a/ee/maintained-apps/outputs/spotify/darwin.json +++ b/ee/maintained-apps/outputs/spotify/darwin.json @@ -1,10 +1,10 @@ { "versions": [ { - "version": "1.2.92.147", + "version": "1.2.92.148", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.spotify.client';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.spotify.client' AND version_compare(bundle_short_version, '1.2.92.147') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.spotify.client' AND version_compare(bundle_short_version, '1.2.92.148') < 0);" }, "installer_url": "https://download.scdn.co/SpotifyARM64.dmg", "install_script_ref": "0ddf928e", diff --git a/ee/maintained-apps/outputs/thaw/darwin.json b/ee/maintained-apps/outputs/thaw/darwin.json index 018062e99b..cc1f75f429 100644 --- a/ee/maintained-apps/outputs/thaw/darwin.json +++ b/ee/maintained-apps/outputs/thaw/darwin.json @@ -8,7 +8,7 @@ }, "installer_url": "https://github.com/stonerl/Thaw/releases/download/1.2.0/Thaw_1.2.0.zip", "install_script_ref": "d8e6eec2", - "uninstall_script_ref": "d4d962b1", + "uninstall_script_ref": "5a2c9aee", "sha256": "d67f4d31ef9fa057849a98540b810cfa42e0bc66019d3605abd08e45c69aa06f", "default_categories": [ "Utilities" @@ -16,7 +16,7 @@ } ], "refs": { - "d4d962b1": "#!/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/Thaw.app\"\ntrash $LOGGED_IN_USER '~/Library/Caches/com.stonerl.Thaw'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.stonerl.Thaw'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.stonerl.Thaw.plist'\ntrash $LOGGED_IN_USER '~/Library/WebKit/com.stonerl.Thaw'\n", + "5a2c9aee": "#!/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.stonerl.Thaw'\nquit_application 'com.stonerl.Thaw.MenuBarItemService'\nsudo rm -rf \"$APPDIR/Thaw.app\"\ntrash $LOGGED_IN_USER '~/Library/Caches/com.stonerl.Thaw'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.stonerl.Thaw'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.stonerl.Thaw.plist'\ntrash $LOGGED_IN_USER '~/Library/WebKit/com.stonerl.Thaw'\n", "d8e6eec2": "#!/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.stonerl.Thaw'\nif [ -d \"$APPDIR/Thaw.app\" ]; then\n\tsudo mv \"$APPDIR/Thaw.app\" \"$TMPDIR/Thaw.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Thaw.app\" \"$APPDIR\"\nrelaunch_application 'com.stonerl.Thaw'\n" } } diff --git a/ee/maintained-apps/outputs/virtualbuddy/darwin.json b/ee/maintained-apps/outputs/virtualbuddy/darwin.json index 69a752e6b0..a8cfd6a8f7 100644 --- a/ee/maintained-apps/outputs/virtualbuddy/darwin.json +++ b/ee/maintained-apps/outputs/virtualbuddy/darwin.json @@ -8,7 +8,7 @@ }, "installer_url": "https://su.virtualbuddy.app/VirtualBuddy_v2.1-325.dmg", "install_script_ref": "c7f4aec0", - "uninstall_script_ref": "53e198e6", + "uninstall_script_ref": "335b859b", "sha256": "6ed17e8d7245931fd405c419321ace7ef9333fe2e3d59b3a7f78e34fcbe628b6", "default_categories": [ "Productivity" @@ -16,7 +16,7 @@ } ], "refs": { - "53e198e6": "#!/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/VirtualBuddy.app\"\nsudo rm -rf 'vctool'\ntrash $LOGGED_IN_USER '~/Library/Application Support/VirtualBuddy'\ntrash $LOGGED_IN_USER '~/Library/Caches/codes.rambo.VirtualBuddy'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/codes.rambo.VirtualBuddy'\ntrash $LOGGED_IN_USER '~/Library/Preferences/codes.rambo.VirtualBuddy.plist'\n", + "335b859b": "#!/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/VirtualBuddy.app\"\nsudo rm -rf 'vctool'\ntrash $LOGGED_IN_USER '~/Library/Application Support/VirtualBuddy'\ntrash $LOGGED_IN_USER '~/Library/Caches/codes.rambo.VirtualBuddy'\ntrash $LOGGED_IN_USER '~/Library/Caches/VirtualBuddy'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/codes.rambo.VirtualBuddy'\ntrash $LOGGED_IN_USER '~/Library/Preferences/codes.rambo.VirtualBuddy.plist'\n", "c7f4aec0": "#!/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 'codes.rambo.VirtualBuddy'\nif [ -d \"$APPDIR/VirtualBuddy.app\" ]; then\n\tsudo mv \"$APPDIR/VirtualBuddy.app\" \"$TMPDIR/VirtualBuddy.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/VirtualBuddy.app\" \"$APPDIR\"\nrelaunch_application 'codes.rambo.VirtualBuddy'\nmkdir -p .\n/bin/ln -h -f -s -- \"$APPDIR/VirtualBuddy.app/Contents/MacOS/vctool\" \"vctool\"\n" } }