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" } }