diff --git a/ee/maintained-apps/inputs/homebrew/hammerspoon.json b/ee/maintained-apps/inputs/homebrew/hammerspoon.json new file mode 100644 index 00000000000..3fb44169142 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/hammerspoon.json @@ -0,0 +1,10 @@ +{ + "name": "Hammerspoon", + "unique_identifier": "org.hammerspoon.Hammerspoon", + "token": "hammerspoon", + "installer_format": "zip", + "slug": "hammerspoon/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/handbrake-app.json b/ee/maintained-apps/inputs/homebrew/handbrake-app.json new file mode 100644 index 00000000000..00262855cc0 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/handbrake-app.json @@ -0,0 +1,10 @@ +{ + "name": "HandBrake", + "unique_identifier": "fr.handbrake.HandBrake", + "token": "handbrake-app", + "installer_format": "dmg", + "slug": "handbrake-app/darwin", + "default_categories": [ + "Developer tools" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/hazel.json b/ee/maintained-apps/inputs/homebrew/hazel.json new file mode 100644 index 00000000000..8ae926871d3 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/hazel.json @@ -0,0 +1,10 @@ +{ + "name": "Hazel", + "unique_identifier": "com.noodlesoft.Hazel", + "token": "hazel", + "installer_format": "dmg", + "slug": "hazel/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/hazeover.json b/ee/maintained-apps/inputs/homebrew/hazeover.json new file mode 100644 index 00000000000..8e9ffb7933d --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/hazeover.json @@ -0,0 +1,10 @@ +{ + "name": "HazeOver", + "unique_identifier": "com.pointum.hazeover", + "token": "hazeover", + "installer_format": "dmg", + "slug": "hazeover/darwin", + "default_categories": [ + "Utilities" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/helium.json b/ee/maintained-apps/inputs/homebrew/helium.json new file mode 100644 index 00000000000..9fff0c5ac67 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/helium.json @@ -0,0 +1,10 @@ +{ + "name": "Helium", + "unique_identifier": "com.koushikdutta.Helium", + "token": "helium", + "installer_format": "zip", + "slug": "helium/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/hex-fiend.json b/ee/maintained-apps/inputs/homebrew/hex-fiend.json new file mode 100644 index 00000000000..b3b0bebdd60 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/hex-fiend.json @@ -0,0 +1,10 @@ +{ + "name": "Hex Fiend", + "unique_identifier": "com.ridiculousfish.HexFiend", + "token": "hex-fiend", + "installer_format": "dmg", + "slug": "hex-fiend/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/hey-desktop.json b/ee/maintained-apps/inputs/homebrew/hey-desktop.json new file mode 100644 index 00000000000..139a38bb4e0 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/hey-desktop.json @@ -0,0 +1,10 @@ +{ + "name": "HEY", + "unique_identifier": "com.hey.app.desktop", + "token": "hey-desktop", + "installer_format": "zip", + "slug": "hey-desktop/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/hiddenbar.json b/ee/maintained-apps/inputs/homebrew/hiddenbar.json new file mode 100644 index 00000000000..0f0bff34167 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/hiddenbar.json @@ -0,0 +1,10 @@ +{ + "name": "Hidden Bar", + "unique_identifier": "com.dwarvesv.minimalbar", + "token": "hiddenbar", + "installer_format": "zip", + "slug": "hiddenbar/darwin", + "default_categories": [ + "Developer tools" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/hides.json b/ee/maintained-apps/inputs/homebrew/hides.json new file mode 100644 index 00000000000..aff62d00220 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/hides.json @@ -0,0 +1,10 @@ +{ + "name": "Hides", + "unique_identifier": "com.sweetpproductions.Hides", + "token": "hides", + "installer_format": "dmg", + "slug": "hides/darwin", + "default_categories": [ + "Developer tools" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/hidock.json b/ee/maintained-apps/inputs/homebrew/hidock.json new file mode 100644 index 00000000000..4156d76108e --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/hidock.json @@ -0,0 +1,10 @@ +{ + "name": "HiDock", + "unique_identifier": "design.rafa.HiDock", + "token": "hidock", + "installer_format": "zip", + "slug": "hidock/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/highlight-ai.json b/ee/maintained-apps/inputs/homebrew/highlight-ai.json new file mode 100644 index 00000000000..ff3105bc9ea --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/highlight-ai.json @@ -0,0 +1,10 @@ +{ + "name": "Highlight", + "unique_identifier": "tv.medal.highlight", + "token": "highlight-ai", + "installer_format": "dmg", + "slug": "highlight-ai/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/hive-app.json b/ee/maintained-apps/inputs/homebrew/hive-app.json new file mode 100644 index 00000000000..21982f84edf --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/hive-app.json @@ -0,0 +1,10 @@ +{ + "name": "Hive", + "unique_identifier": "com.hive.app", + "token": "hive-app", + "installer_format": "dmg", + "slug": "hive-app/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/home-assistant.json b/ee/maintained-apps/inputs/homebrew/home-assistant.json new file mode 100644 index 00000000000..b9e671f51bb --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/home-assistant.json @@ -0,0 +1,10 @@ +{ + "name": "Home Assistant", + "unique_identifier": "io.robbie.HomeAssistant", + "token": "home-assistant", + "installer_format": "zip", + "slug": "home-assistant/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/homerow.json b/ee/maintained-apps/inputs/homebrew/homerow.json new file mode 100644 index 00000000000..8c3c246503c --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/homerow.json @@ -0,0 +1,10 @@ +{ + "name": "Homerow", + "unique_identifier": "com.superultra.Homerow", + "token": "homerow", + "installer_format": "zip", + "slug": "homerow/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/hot.json b/ee/maintained-apps/inputs/homebrew/hot.json new file mode 100644 index 00000000000..eded1eb4070 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/hot.json @@ -0,0 +1,10 @@ +{ + "name": "Hot", + "unique_identifier": "com.xs-labs.Hot", + "token": "hot", + "installer_format": "zip", + "slug": "hot/darwin", + "default_categories": [ + "Utilities" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/houdahspot.json b/ee/maintained-apps/inputs/homebrew/houdahspot.json new file mode 100644 index 00000000000..55b0bfe60fd --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/houdahspot.json @@ -0,0 +1,10 @@ +{ + "name": "HoudahSpot", + "unique_identifier": "com.houdah.HoudahSpot6", + "token": "houdahspot", + "installer_format": "dmg", + "slug": "houdahspot/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/hp-easy-admin.json b/ee/maintained-apps/inputs/homebrew/hp-easy-admin.json new file mode 100644 index 00000000000..97e19c8dfae --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/hp-easy-admin.json @@ -0,0 +1,10 @@ +{ + "name": "HP Easy Admin", + "unique_identifier": "com.hp.hp-easy-admin", + "token": "hp-easy-admin", + "installer_format": "zip", + "slug": "hp-easy-admin/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/hubstaff.json b/ee/maintained-apps/inputs/homebrew/hubstaff.json new file mode 100644 index 00000000000..048d8bbbf82 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/hubstaff.json @@ -0,0 +1,10 @@ +{ + "name": "Hubstaff", + "unique_identifier": "com.netsoft.Hubstaff", + "token": "hubstaff", + "installer_format": "dmg", + "slug": "hubstaff/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/huly.json b/ee/maintained-apps/inputs/homebrew/huly.json new file mode 100644 index 00000000000..0ab29747a56 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/huly.json @@ -0,0 +1,10 @@ +{ + "name": "Huly", + "unique_identifier": "hc.hcengineering.Huly", + "token": "huly", + "installer_format": "zip", + "slug": "huly/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/hyperkey.json b/ee/maintained-apps/inputs/homebrew/hyperkey.json new file mode 100644 index 00000000000..12a5f7a2974 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/hyperkey.json @@ -0,0 +1,10 @@ +{ + "name": "Hyperkey", + "unique_identifier": "com.knollsoft.Hyperkey", + "token": "hyperkey", + "installer_format": "dmg", + "slug": "hyperkey/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/outputs/apps.json b/ee/maintained-apps/outputs/apps.json index 48d0caed649..4a1fa2a475f 100644 --- a/ee/maintained-apps/outputs/apps.json +++ b/ee/maintained-apps/outputs/apps.json @@ -2318,6 +2318,139 @@ "unique_identifier": "com.gyazo.menu", "description": "Nota Gyazo GIF is a screenshot and screen recording tool." }, + { + "name": "Hammerspoon", + "slug": "hammerspoon/darwin", + "platform": "darwin", + "unique_identifier": "org.hammerspoon.Hammerspoon", + "description": "Hammerspoon is a desktop automation application." + }, + { + "name": "HandBrake", + "slug": "handbrake-app/darwin", + "platform": "darwin", + "unique_identifier": "fr.handbrake.HandBrake", + "description": "HandBrake is an open-source video transcoder." + }, + { + "name": "Hazel", + "slug": "hazel/darwin", + "platform": "darwin", + "unique_identifier": "com.noodlesoft.Hazel", + "description": "Hazel is an automated organisation." + }, + { + "name": "HazeOver", + "slug": "hazeover/darwin", + "platform": "darwin", + "unique_identifier": "com.pointum.hazeover", + "description": "HazeOver is a windows manager and desktop organiser." + }, + { + "name": "Helium", + "slug": "helium/darwin", + "platform": "darwin", + "unique_identifier": "com.koushikdutta.Helium", + "description": "Helium is a macOS application." + }, + { + "name": "Hex Fiend", + "slug": "hex-fiend/darwin", + "platform": "darwin", + "unique_identifier": "com.ridiculousfish.HexFiend", + "description": "Hex Fiend is a hex editor focussing on speed." + }, + { + "name": "HEY", + "slug": "hey-desktop/darwin", + "platform": "darwin", + "unique_identifier": "com.hey.app.desktop", + "description": "HEY is an access the HEY email service." + }, + { + "name": "Hidden Bar", + "slug": "hiddenbar/darwin", + "platform": "darwin", + "unique_identifier": "com.dwarvesv.minimalbar", + "description": "Hidden Bar is a utility to hide menu bar items." + }, + { + "name": "Hides", + "slug": "hides/darwin", + "platform": "darwin", + "unique_identifier": "com.sweetpproductions.Hides", + "description": "Hides is an app to hide all open apps except the current one." + }, + { + "name": "HiDock", + "slug": "hidock/darwin", + "platform": "darwin", + "unique_identifier": "design.rafa.HiDock", + "description": "HiDock is a set custom Dock settings for when on different displays." + }, + { + "name": "Highlight", + "slug": "highlight-ai/darwin", + "platform": "darwin", + "unique_identifier": "tv.medal.highlight", + "description": "Highlight is a context-aware AI assistant." + }, + { + "name": "Hive", + "slug": "hive-app/darwin", + "platform": "darwin", + "unique_identifier": "com.hive.app", + "description": "Hive is an AI agent orchestrator for parallel coding across projects." + }, + { + "name": "Home Assistant", + "slug": "home-assistant/darwin", + "platform": "darwin", + "unique_identifier": "io.robbie.HomeAssistant", + "description": "Home Assistant is a companion app for Home Assistant home automation software." + }, + { + "name": "Homerow", + "slug": "homerow/darwin", + "platform": "darwin", + "unique_identifier": "com.superultra.Homerow", + "description": "Homerow is a keyboard shortcuts for every button on your screen." + }, + { + "name": "Hot", + "slug": "hot/darwin", + "platform": "darwin", + "unique_identifier": "com.xs-labs.Hot", + "description": "Hot is a menu bar application that displays the CPU speed limit due to thermal issues." + }, + { + "name": "HoudahSpot", + "slug": "houdahspot/darwin", + "platform": "darwin", + "unique_identifier": "com.houdah.HoudahSpot6", + "description": "HoudahSpot is a file searching application." + }, + { + "name": "HP Easy Admin", + "slug": "hp-easy-admin/darwin", + "platform": "darwin", + "unique_identifier": "com.hp.hp-easy-admin", + "description": "HP Easy Admin is a tool to directly download HP printing and/or scanning drivers." + }, + { + "name": "Hubstaff", + "slug": "hubstaff/darwin", + "platform": "darwin", + "unique_identifier": "com.netsoft.Hubstaff", + "description": "Hubstaff is a work time tracker." + }, + { + "name": "Huly", + "slug": "huly/darwin", + "platform": "darwin", + "unique_identifier": "hc.hcengineering.Huly", + "description": "Huly is an All-in-One Project Management Platform." + }, { "name": "Hyper", "slug": "hyper/darwin", @@ -2325,6 +2458,13 @@ "unique_identifier": "co.zeit.hyper", "description": "Hyper is a terminal built on web technologies." }, + { + "name": "Hyperkey", + "slug": "hyperkey/darwin", + "platform": "darwin", + "unique_identifier": "com.knollsoft.Hyperkey", + "description": "Hyperkey is a tool to convert your caps lock key or any of your modifier keys to the hyper key." + }, { "name": "i1Profiler", "slug": "i1profiler/darwin", diff --git a/ee/maintained-apps/outputs/hammerspoon/darwin.json b/ee/maintained-apps/outputs/hammerspoon/darwin.json new file mode 100644 index 00000000000..4c100b55d06 --- /dev/null +++ b/ee/maintained-apps/outputs/hammerspoon/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "1.1.1", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'org.hammerspoon.Hammerspoon';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'org.hammerspoon.Hammerspoon' AND version_compare(bundle_short_version, '1.1.1') < 0);" + }, + "installer_url": "https://github.com/Hammerspoon/hammerspoon/releases/download/1.1.1/Hammerspoon-1.1.1.zip", + "install_script_ref": "148caa41", + "uninstall_script_ref": "6f1bdf8d", + "sha256": "11bb1c90faf5427f37c7bd4fe7eab9774ae43e1d5cb020c5b3088dac32849efa", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "148caa41": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_and_track_application 'org.hammerspoon.Hammerspoon'\nif [ -d \"$APPDIR/Hammerspoon.app\" ]; then\n\tsudo mv \"$APPDIR/Hammerspoon.app\" \"$TMPDIR/Hammerspoon.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Hammerspoon.app\" \"$APPDIR\"\nrelaunch_application 'org.hammerspoon.Hammerspoon'\n", + "6f1bdf8d": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nquit_application 'org.hammerspoon.Hammerspoon'\nsudo rm -rf \"$APPDIR/Hammerspoon.app\"\ntrash $LOGGED_IN_USER '~/.hammerspoon'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.crashlytics/org.hammerspoon.Hammerspoon'\ntrash $LOGGED_IN_USER '~/Library/Caches/org.hammerspoon.Hammerspoon'\ntrash $LOGGED_IN_USER '~/Library/Preferences/org.hammerspoon.Hammerspoon.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/org.hammerspoon.Hammerspoon.savedState'\n" + } +} diff --git a/ee/maintained-apps/outputs/handbrake-app/darwin.json b/ee/maintained-apps/outputs/handbrake-app/darwin.json new file mode 100644 index 00000000000..c35f1b73964 --- /dev/null +++ b/ee/maintained-apps/outputs/handbrake-app/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "1.11.2", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'fr.handbrake.HandBrake';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'fr.handbrake.HandBrake' AND version_compare(bundle_short_version, '1.11.2') < 0);" + }, + "installer_url": "https://handbrake.fr/rotation.php?file=HandBrake-1.11.2.dmg&update=true", + "install_script_ref": "fe8401db", + "uninstall_script_ref": "617fb34b", + "sha256": "4afe27aaa77a7bbb0dcda1a335d96a5f53649f2649fb84de6982ffecc35de9d7", + "default_categories": [ + "Developer tools" + ] + } + ], + "refs": { + "617fb34b": "#!/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/HandBrake.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/fr.handbrake.handbrake.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/HandBrake'\ntrash $LOGGED_IN_USER '~/Library/Caches/fr.handbrake.HandBrake'\ntrash $LOGGED_IN_USER '~/Library/Preferences/fr.handbrake.HandBrake.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/fr.handbrake.HandBrake.savedState'\n", + "fe8401db": "#!/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 'fr.handbrake.HandBrake'\nif [ -d \"$APPDIR/HandBrake.app\" ]; then\n\tsudo mv \"$APPDIR/HandBrake.app\" \"$TMPDIR/HandBrake.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/HandBrake.app\" \"$APPDIR\"\nrelaunch_application 'fr.handbrake.HandBrake'\n" + } +} diff --git a/ee/maintained-apps/outputs/hazel/darwin.json b/ee/maintained-apps/outputs/hazel/darwin.json new file mode 100644 index 00000000000..9595ab17e89 --- /dev/null +++ b/ee/maintained-apps/outputs/hazel/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "6.1.2", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.noodlesoft.Hazel';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.noodlesoft.Hazel' AND version_compare(bundle_short_version, '6.1.2') < 0);" + }, + "installer_url": "https://s3.amazonaws.com/Noodlesoft/Hazel-6.1.2.dmg", + "install_script_ref": "ff783450", + "uninstall_script_ref": "6479533e", + "sha256": "5f169b65ef2527901119187559c40fd17d693d8db723b738f3b8dbe3ab9f5726", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "6479533e": "#!/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 '86Z3GCJ4MF.com.noodlesoft.HazelHelper'\nsudo rm -rf \"$APPDIR/Hazel.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Hazel'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.noodlesoft.HazelHelper'\ntrash $LOGGED_IN_USER '~/Library/Logs/Hazel'\ntrash $LOGGED_IN_USER '~/Library/Preferences/86Z3GCJ4MF.com.noodlesoft.HazelHelper.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.noodlesoft.Hazel.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.noodlesoft.HazelHelper.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.noodlesoft.Hazel.savedState'\n", + "ff783450": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'com.noodlesoft.Hazel'\nif [ -d \"$APPDIR/Hazel.app\" ]; then\n\tsudo mv \"$APPDIR/Hazel.app\" \"$TMPDIR/Hazel.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Hazel.app\" \"$APPDIR\"\nrelaunch_application 'com.noodlesoft.Hazel'\n" + } +} diff --git a/ee/maintained-apps/outputs/hazeover/darwin.json b/ee/maintained-apps/outputs/hazeover/darwin.json new file mode 100644 index 00000000000..544f0d40df8 --- /dev/null +++ b/ee/maintained-apps/outputs/hazeover/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "1.9.7", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.pointum.hazeover';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.pointum.hazeover' AND version_compare(bundle_short_version, '1.9.7') < 0);" + }, + "installer_url": "https://hazeover.com/HazeOver.dmg", + "install_script_ref": "7e47c62b", + "uninstall_script_ref": "0f1226ba", + "sha256": "no_check", + "default_categories": [ + "Utilities" + ] + } + ], + "refs": { + "0f1226ba": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nremove_launchctl_service() {\n local service=\"$1\"\n local booleans=(\"true\" \"false\")\n local plist_status\n local paths\n local should_sudo\n\n echo \"Removing launchctl service ${service}\"\n\n for should_sudo in \"${booleans[@]}\"; do\n plist_status=$(launchctl list \"${service}\" 2>/dev/null)\n\n if [[ $plist_status == \\{* ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo launchctl remove \"${service}\"\n else\n launchctl remove \"${service}\"\n fi\n sleep 1\n fi\n\n paths=(\n \"/Library/LaunchAgents/${service}.plist\"\n \"/Library/LaunchDaemons/${service}.plist\"\n )\n\n # if not using sudo, prepend the home directory to the paths\n if [[ $should_sudo == \"false\" ]]; then\n for i in \"${!paths[@]}\"; do\n paths[i]=\"${HOME}${paths[i]}\"\n done\n fi\n\n for path in \"${paths[@]}\"; do\n if [[ -e \"$path\" ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo rm -f -- \"$path\"\n else\n rm -f -- \"$path\"\n fi\n fi\n done\n done\n}\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nremove_launchctl_service 'com.pointum.hazeover.launcher'\nquit_application 'com.pointum.hazeover'\nsudo rm -rf \"$APPDIR/HazeOver.app\"\ntrash $LOGGED_IN_USER '~/Library/Caches/com.pointum.hazeover'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.pointum.hazeover'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.pointum.hazeover.plist'\n", + "7e47c62b": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'com.pointum.hazeover'\nif [ -d \"$APPDIR/HazeOver.app\" ]; then\n\tsudo mv \"$APPDIR/HazeOver.app\" \"$TMPDIR/HazeOver.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/HazeOver.app\" \"$APPDIR\"\nrelaunch_application 'com.pointum.hazeover'\n" + } +} diff --git a/ee/maintained-apps/outputs/helium/darwin.json b/ee/maintained-apps/outputs/helium/darwin.json new file mode 100644 index 00000000000..22baeaaa5d9 --- /dev/null +++ b/ee/maintained-apps/outputs/helium/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "1.0.0", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.koushikdutta.Helium';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.koushikdutta.Helium' AND version_compare(bundle_short_version, '1.0.0') < 0);" + }, + "installer_url": "https://github.com/koush/CarbonResources/releases/download/v1.0.0/carbon-mac.zip", + "install_script_ref": "f0fe68cc", + "uninstall_script_ref": "693e2f07", + "sha256": "30abcdcb04e53f24948897acfd24899c7cdfca564b71b023224ae13f11365bbd", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "693e2f07": "#!/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.koushikdutta.Helium'\nsudo rm -rf \"$APPDIR/Helium.app\"\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.koushikdutta.Helium.savedState'\n", + "f0fe68cc": "#!/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.koushikdutta.Helium'\nif [ -d \"$APPDIR/Helium.app\" ]; then\n\tsudo mv \"$APPDIR/Helium.app\" \"$TMPDIR/Helium.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Helium.app\" \"$APPDIR\"\nrelaunch_application 'com.koushikdutta.Helium'\n" + } +} diff --git a/ee/maintained-apps/outputs/hex-fiend/darwin.json b/ee/maintained-apps/outputs/hex-fiend/darwin.json new file mode 100644 index 00000000000..55cdf0d0045 --- /dev/null +++ b/ee/maintained-apps/outputs/hex-fiend/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "2.18.1", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.ridiculousfish.HexFiend';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.ridiculousfish.HexFiend' AND version_compare(bundle_short_version, '2.18.1') < 0);" + }, + "installer_url": "https://github.com/ridiculousfish/HexFiend/releases/download/v2.18.1/Hex_Fiend_2.18.1.dmg", + "install_script_ref": "71c5b95d", + "uninstall_script_ref": "56aea7f8", + "sha256": "837041623a21eaae59b9b6c0bb7f75533938ab96580861ee7e276bb926e0e076", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "56aea7f8": "#!/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/Hex Fiend.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.ridiculousfish.hexfiend.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.ridiculousfish.HexFiend'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.ridiculousfish.HexFiend'\ntrash $LOGGED_IN_USER '~/Library/Cookies/com.ridiculousfish.HexFiend.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.ridiculousfish.HexFiend.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.ridiculousfish.HexFiend.savedState'\n", + "71c5b95d": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'com.ridiculousfish.HexFiend'\nif [ -d \"$APPDIR/Hex Fiend.app\" ]; then\n\tsudo mv \"$APPDIR/Hex Fiend.app\" \"$TMPDIR/Hex Fiend.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Hex Fiend.app\" \"$APPDIR\"\nrelaunch_application 'com.ridiculousfish.HexFiend'\n" + } +} diff --git a/ee/maintained-apps/outputs/hey-desktop/darwin.json b/ee/maintained-apps/outputs/hey-desktop/darwin.json new file mode 100644 index 00000000000..acd1a471708 --- /dev/null +++ b/ee/maintained-apps/outputs/hey-desktop/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "1.3.3", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.hey.app.desktop';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.hey.app.desktop' AND version_compare(bundle_short_version, '1.3.3') < 0);" + }, + "installer_url": "https://hey.com/desktop/HEY-1.3.3-arm64-mac.zip", + "install_script_ref": "2601e763", + "uninstall_script_ref": "4b55afa9", + "sha256": "dd20814f404850484721db5af932b1ef7e5335b4208a9e8e42421703096f049c", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "2601e763": "#!/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.hey.app.desktop'\nif [ -d \"$APPDIR/HEY.app\" ]; then\n\tsudo mv \"$APPDIR/HEY.app\" \"$TMPDIR/HEY.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/HEY.app\" \"$APPDIR\"\nrelaunch_application 'com.hey.app.desktop'\n", + "4b55afa9": "#!/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/HEY.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/HEY'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.hey.app.desktop.plist'\n" + } +} diff --git a/ee/maintained-apps/outputs/hiddenbar/darwin.json b/ee/maintained-apps/outputs/hiddenbar/darwin.json new file mode 100644 index 00000000000..8942c486030 --- /dev/null +++ b/ee/maintained-apps/outputs/hiddenbar/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "1.10", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.dwarvesv.minimalbar';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.dwarvesv.minimalbar' AND version_compare(bundle_short_version, '1.10') < 0);" + }, + "installer_url": "https://github.com/dwarvesf/hidden/releases/download/v1.10/Hidden-Bar-v1.10-macos.zip", + "install_script_ref": "0a0fdf38", + "uninstall_script_ref": "144f96c5", + "sha256": "a8a5f5299fdfab52bdffb2f5728a76d4cba690754e9b3b12f27bd38f2e76c0bc", + "default_categories": [ + "Developer tools" + ] + } + ], + "refs": { + "0a0fdf38": "#!/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.dwarvesv.minimalbar'\nif [ -d \"$APPDIR/Hidden Bar.app\" ]; then\n\tsudo mv \"$APPDIR/Hidden Bar.app\" \"$TMPDIR/Hidden Bar.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Hidden Bar.app\" \"$APPDIR\"\nrelaunch_application 'com.dwarvesv.minimalbar'\n", + "144f96c5": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nremove_launchctl_service() {\n local service=\"$1\"\n local booleans=(\"true\" \"false\")\n local plist_status\n local paths\n local should_sudo\n\n echo \"Removing launchctl service ${service}\"\n\n for should_sudo in \"${booleans[@]}\"; do\n plist_status=$(launchctl list \"${service}\" 2>/dev/null)\n\n if [[ $plist_status == \\{* ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo launchctl remove \"${service}\"\n else\n launchctl remove \"${service}\"\n fi\n sleep 1\n fi\n\n paths=(\n \"/Library/LaunchAgents/${service}.plist\"\n \"/Library/LaunchDaemons/${service}.plist\"\n )\n\n # if not using sudo, prepend the home directory to the paths\n if [[ $should_sudo == \"false\" ]]; then\n for i in \"${!paths[@]}\"; do\n paths[i]=\"${HOME}${paths[i]}\"\n done\n fi\n\n for path in \"${paths[@]}\"; do\n if [[ -e \"$path\" ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo rm -f -- \"$path\"\n else\n rm -f -- \"$path\"\n fi\n fi\n done\n done\n}\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nremove_launchctl_service 'com.dwarvesv.LauncherApplication'\nquit_application 'com.dwarvesv.minimalbar'\nsudo rm -rf \"$APPDIR/Hidden Bar.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.dwarvesv.LauncherApplication'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.dwarvesv.minimalbar'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.dwarvesv.LauncherApplication'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.dwarvesv.minimalbar'\n" + } +} diff --git a/ee/maintained-apps/outputs/hides/darwin.json b/ee/maintained-apps/outputs/hides/darwin.json new file mode 100644 index 00000000000..b1b24715f88 --- /dev/null +++ b/ee/maintained-apps/outputs/hides/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "7.3", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.sweetpproductions.Hides';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.sweetpproductions.Hides' AND version_compare(bundle_short_version, '7.3') < 0);" + }, + "installer_url": "https://sweetpproductions.com/products/hides/Hides.dmg", + "install_script_ref": "c07e8f53", + "uninstall_script_ref": "7e456b27", + "sha256": "no_check", + "default_categories": [ + "Developer tools" + ] + } + ], + "refs": { + "7e456b27": "#!/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/Hides.app\"\ntrash $LOGGED_IN_USER '~/Library/Containers/com.sweetpproductions.Hides'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/*.com.sweetpproductions.Hides'\n", + "c07e8f53": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'com.sweetpproductions.Hides'\nif [ -d \"$APPDIR/Hides.app\" ]; then\n\tsudo mv \"$APPDIR/Hides.app\" \"$TMPDIR/Hides.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Hides.app\" \"$APPDIR\"\nrelaunch_application 'com.sweetpproductions.Hides'\n" + } +} diff --git a/ee/maintained-apps/outputs/hidock/darwin.json b/ee/maintained-apps/outputs/hidock/darwin.json new file mode 100644 index 00000000000..57219c98e71 --- /dev/null +++ b/ee/maintained-apps/outputs/hidock/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "1.4", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'design.rafa.HiDock';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'design.rafa.HiDock' AND version_compare(bundle_short_version, '1.4') < 0);" + }, + "installer_url": "https://hidock.app/HiDock_1.4.zip", + "install_script_ref": "b8bf86ad", + "uninstall_script_ref": "c61194ba", + "sha256": "29e95a7eb061236658ccccbc86c1ba0ee872bf5e627c0fff0a37ca29b056f60e", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "b8bf86ad": "#!/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 'design.rafa.HiDock'\nif [ -d \"$APPDIR/HiDock.app\" ]; then\n\tsudo mv \"$APPDIR/HiDock.app\" \"$TMPDIR/HiDock.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/HiDock.app\" \"$APPDIR\"\nrelaunch_application 'design.rafa.HiDock'\n", + "c61194ba": "#!/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 'design.rafa.HiDock'\nquit_application 'design.rafa.HiDock-LaunchAtLoginHelper'\nsudo rm -rf \"$APPDIR/HiDock.app\"\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/design.rafa.HiDock'\ntrash $LOGGED_IN_USER '~/Library/Preferences/design.rafa.HiDock.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/design.rafa.HiDock.savedState'\n" + } +} diff --git a/ee/maintained-apps/outputs/highlight-ai/darwin.json b/ee/maintained-apps/outputs/highlight-ai/darwin.json new file mode 100644 index 00000000000..3442eaf9b9f --- /dev/null +++ b/ee/maintained-apps/outputs/highlight-ai/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "1.3.280", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'tv.medal.highlight';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'tv.medal.highlight' AND version_compare(bundle_short_version, '1.3.280') < 0);" + }, + "installer_url": "https://cdn.highlightai.com/releases/darwin/arm64/Highlight-1.3.280-arm64.dmg", + "install_script_ref": "bb764101", + "uninstall_script_ref": "49c63a27", + "sha256": "07b42c31dd7282f5ab290df0dc7e32a6de57ba6b826a1099bd313b636ac4157d", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "49c63a27": "#!/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/Highlight.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Highlight'\ntrash $LOGGED_IN_USER '~/Library/Preferences/tv.medal.highlight.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/tv.medal.highlight.savedState'\n", + "bb764101": "#!/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 'tv.medal.highlight'\nif [ -d \"$APPDIR/Highlight.app\" ]; then\n\tsudo mv \"$APPDIR/Highlight.app\" \"$TMPDIR/Highlight.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Highlight.app\" \"$APPDIR\"\nrelaunch_application 'tv.medal.highlight'\n" + } +} diff --git a/ee/maintained-apps/outputs/hive-app/darwin.json b/ee/maintained-apps/outputs/hive-app/darwin.json new file mode 100644 index 00000000000..826e9d5f5fa --- /dev/null +++ b/ee/maintained-apps/outputs/hive-app/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "1.1.18", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.hive.app';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.hive.app' AND version_compare(bundle_short_version, '1.1.18') < 0);" + }, + "installer_url": "https://github.com/morapelker/hive/releases/download/v1.1.18/Hive-1.1.18-arm64.dmg", + "install_script_ref": "6b39e7ad", + "uninstall_script_ref": "78bb4e43", + "sha256": "5bc89ebcab28c210e5a28cbe6d5b25753f34b6a0724216abd7b4d00ce2876eac", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "6b39e7ad": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'com.hive.app'\nif [ -d \"$APPDIR/Hive.app\" ]; then\n\tsudo mv \"$APPDIR/Hive.app\" \"$TMPDIR/Hive.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Hive.app\" \"$APPDIR\"\nrelaunch_application 'com.hive.app'\n", + "78bb4e43": "#!/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/Hive.app\"\ntrash $LOGGED_IN_USER '~/.hive'\ntrash $LOGGED_IN_USER '~/Library/Application Support/hive'\ntrash $LOGGED_IN_USER '~/Library/Logs/hive'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.hive.app.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.hive.app.savedState'\n" + } +} diff --git a/ee/maintained-apps/outputs/home-assistant/darwin.json b/ee/maintained-apps/outputs/home-assistant/darwin.json new file mode 100644 index 00000000000..816579fb0a2 --- /dev/null +++ b/ee/maintained-apps/outputs/home-assistant/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "2026.4.1", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'io.robbie.HomeAssistant';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'io.robbie.HomeAssistant' AND version_compare(bundle_short_version, '2026.4.1') < 0);" + }, + "installer_url": "https://github.com/home-assistant/iOS/releases/download/release%2F2026.4.1%2F2026.1904/home-assistant-mac.zip", + "install_script_ref": "8e645b2e", + "uninstall_script_ref": "b46351a1", + "sha256": "286ff6deb0b9f5f0017984cee7c0ae5bfc2113e8bf6dd43ea85b596ee588b93b", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "8e645b2e": "#!/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 'io.robbie.HomeAssistant'\nif [ -d \"$APPDIR/Home Assistant.app\" ]; then\n\tsudo mv \"$APPDIR/Home Assistant.app\" \"$TMPDIR/Home Assistant.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Home Assistant.app\" \"$APPDIR\"\nrelaunch_application 'io.robbie.HomeAssistant'\n", + "b46351a1": "#!/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/Home Assistant.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/io.robbie.HomeAssistant'\ntrash $LOGGED_IN_USER '~/Library/Containers/io.robbie.HomeAssistant'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/group.io.robbie.homeassistant'\n" + } +} diff --git a/ee/maintained-apps/outputs/homerow/darwin.json b/ee/maintained-apps/outputs/homerow/darwin.json new file mode 100644 index 00000000000..4e0dc8aa44b --- /dev/null +++ b/ee/maintained-apps/outputs/homerow/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "1.5.3", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.superultra.Homerow';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.superultra.Homerow' AND version_compare(bundle_short_version, '1.5.3') < 0);" + }, + "installer_url": "https://builds.homerow.app/v1.5.3/Homerow.zip", + "install_script_ref": "74e1a87a", + "uninstall_script_ref": "68dfdaa9", + "sha256": "39616e577d74459d2a095e2da571fce2e528d5375615abf102b8080c1f091c6b", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "68dfdaa9": "#!/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/Homerow.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.superultra.HomerowLauncher'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.superultra.Homerow'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.superultra.Homerow'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.superultra.Homerow'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.superultra.Homerow.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.superultra.Homerow.savedState'\n", + "74e1a87a": "#!/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.superultra.Homerow'\nif [ -d \"$APPDIR/Homerow.app\" ]; then\n\tsudo mv \"$APPDIR/Homerow.app\" \"$TMPDIR/Homerow.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Homerow.app\" \"$APPDIR\"\nrelaunch_application 'com.superultra.Homerow'\n" + } +} diff --git a/ee/maintained-apps/outputs/hot/darwin.json b/ee/maintained-apps/outputs/hot/darwin.json new file mode 100644 index 00000000000..7f4054968d9 --- /dev/null +++ b/ee/maintained-apps/outputs/hot/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "1.9.4", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.xs-labs.Hot';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.xs-labs.Hot' AND version_compare(bundle_short_version, '1.9.4') < 0);" + }, + "installer_url": "https://github.com/macmade/Hot/releases/download/1.9.4/Hot.zip", + "install_script_ref": "7d376c3f", + "uninstall_script_ref": "5ac2fab1", + "sha256": "e4f6ccf7606673ee611870bfb1d4cc8be86a508058db8f9bb5cf41e997ed61ca", + "default_categories": [ + "Utilities" + ] + } + ], + "refs": { + "5ac2fab1": "#!/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/Hot.app\"\ntrash $LOGGED_IN_USER '~/Library/Caches/com.xs-labs.Hot'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.xs-labs.Hot.plist'\n", + "7d376c3f": "#!/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.xs-labs.Hot'\nif [ -d \"$APPDIR/Hot.app\" ]; then\n\tsudo mv \"$APPDIR/Hot.app\" \"$TMPDIR/Hot.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Hot.app\" \"$APPDIR\"\nrelaunch_application 'com.xs-labs.Hot'\n" + } +} diff --git a/ee/maintained-apps/outputs/houdahspot/darwin.json b/ee/maintained-apps/outputs/houdahspot/darwin.json new file mode 100644 index 00000000000..535b7f6364c --- /dev/null +++ b/ee/maintained-apps/outputs/houdahspot/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "6.8.1", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.houdah.HoudahSpot6';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.houdah.HoudahSpot6' AND version_compare(bundle_short_version, '6.8.1') < 0);" + }, + "installer_url": "https://dl.houdah.com/houdahSpot/updates/cast_assets/906c763d-9739-48da-a68a-d43b144c0a92/HoudahSpot_6.8.1.dmg", + "install_script_ref": "9a0ba4bc", + "uninstall_script_ref": "c4ab567f", + "sha256": "0b014bed899f45302010767e3988e1f0fa98d28427287d178811599da7028ce0", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "9a0ba4bc": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'com.houdah.HoudahSpot6'\nif [ -d \"$APPDIR/HoudahSpot.app\" ]; then\n\tsudo mv \"$APPDIR/HoudahSpot.app\" \"$TMPDIR/HoudahSpot.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/HoudahSpot.app\" \"$APPDIR\"\nrelaunch_application 'com.houdah.HoudahSpot6'\n", + "c4ab567f": "#!/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/HoudahSpot.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.houdah.HoudahSpot6.FinderExtension'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.houdah.HoudahSpot6.HoudahSpotQuickAction'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.houdah.HoudahSpot6'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.houdah.HoudahSpot6'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.houdah.HoudahSpot6.FinderExtension'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.houdah.HoudahSpot6.HoudahSpotQuickAction'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.houdah.HoudahSpot6'\ntrash $LOGGED_IN_USER '~/Library/Mail/Bundles/HoudahSpotMailPlugin.mailbundle'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.houdah.HoudahSpot6.plist'\n" + } +} diff --git a/ee/maintained-apps/outputs/hp-easy-admin/darwin.json b/ee/maintained-apps/outputs/hp-easy-admin/darwin.json new file mode 100644 index 00000000000..0562b2f57f1 --- /dev/null +++ b/ee/maintained-apps/outputs/hp-easy-admin/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "2.16.0", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.hp.hp-easy-admin';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.hp.hp-easy-admin' AND version_compare(bundle_short_version, '2.16.0') < 0);" + }, + "installer_url": "https://ftp.hp.com/pub/softlib/software12/HP_Quick_Start/osx/Applications/HP_Easy_Admin.app.zip", + "install_script_ref": "3a651bdc", + "uninstall_script_ref": "2bc9a4ad", + "sha256": "no_check", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "2bc9a4ad": "#!/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/HP Easy Admin.app\"\ntrash $LOGGED_IN_USER '~/Library/Caches/com.hp.hp-easy-admin'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.hp.hp-easy-admin'\ntrash $LOGGED_IN_USER '~/Library/Logs/HP Easy Admin.log'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.hp.hp-easy-admin.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.hp.hp-easy-admin.savedState'\n", + "3a651bdc": "#!/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.hp.hp-easy-admin'\nif [ -d \"$APPDIR/HP Easy Admin.app\" ]; then\n\tsudo mv \"$APPDIR/HP Easy Admin.app\" \"$TMPDIR/HP Easy Admin.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/HP Easy Admin.app\" \"$APPDIR\"\nrelaunch_application 'com.hp.hp-easy-admin'\n" + } +} diff --git a/ee/maintained-apps/outputs/hubstaff/darwin.json b/ee/maintained-apps/outputs/hubstaff/darwin.json new file mode 100644 index 00000000000..dd56ff4f52d --- /dev/null +++ b/ee/maintained-apps/outputs/hubstaff/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "1.9.2", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.netsoft.Hubstaff';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.netsoft.Hubstaff' AND version_compare(bundle_short_version, '1.9.2') < 0);" + }, + "installer_url": "https://app.hubstaff.com/download/12156-standard-mac-os-x-1-9-2-release/dmg?architecture=arm64", + "install_script_ref": "98c8a835", + "uninstall_script_ref": "f0b8a143", + "sha256": "c47c1fd6250770844cf9a85437861a5e17967a279e90de21f5c5bdb9085c0c8e", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "98c8a835": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'com.netsoft.Hubstaff'\nif [ -d \"$APPDIR/Hubstaff.app\" ]; then\n\tsudo mv \"$APPDIR/Hubstaff.app\" \"$TMPDIR/Hubstaff.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Hubstaff.app\" \"$APPDIR\"\nrelaunch_application 'com.netsoft.Hubstaff'\n", + "f0b8a143": "#!/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/Hubstaff.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Hubstaff'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.netsoft.Hubstaff.plist'\n" + } +} diff --git a/ee/maintained-apps/outputs/huly/darwin.json b/ee/maintained-apps/outputs/huly/darwin.json new file mode 100644 index 00000000000..457a24439aa --- /dev/null +++ b/ee/maintained-apps/outputs/huly/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "0.7.423", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'hc.hcengineering.Huly';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'hc.hcengineering.Huly' AND version_compare(bundle_short_version, '0.7.423') < 0);" + }, + "installer_url": "https://dist.huly.io/Huly-macos-0.7.423-arm64.zip", + "install_script_ref": "fc10469f", + "uninstall_script_ref": "367bd3f8", + "sha256": "e3721316549ecc2f5097607eeec67d33f2e47eacbc2665db748a258ec41a2d73", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "367bd3f8": "#!/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/Huly.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/hc.hcengineering.huly.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Huly Desktop'\ntrash $LOGGED_IN_USER '~/Library/Logs/Huly Desktop'\ntrash $LOGGED_IN_USER '~/Library/Preferences/hc.hcengineering.Huly.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/hc.hcengineering.Huly.savedState'\n", + "fc10469f": "#!/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 'hc.hcengineering.Huly'\nif [ -d \"$APPDIR/Huly.app\" ]; then\n\tsudo mv \"$APPDIR/Huly.app\" \"$TMPDIR/Huly.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Huly.app\" \"$APPDIR\"\nrelaunch_application 'hc.hcengineering.Huly'\n" + } +} diff --git a/ee/maintained-apps/outputs/hyperkey/darwin.json b/ee/maintained-apps/outputs/hyperkey/darwin.json new file mode 100644 index 00000000000..1062fa1c679 --- /dev/null +++ b/ee/maintained-apps/outputs/hyperkey/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "1.56", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.knollsoft.Hyperkey';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.knollsoft.Hyperkey' AND version_compare(bundle_short_version, '1.56') < 0);" + }, + "installer_url": "https://hyperkey.app/downloads/Hyperkey1.56.dmg", + "install_script_ref": "5c184c66", + "uninstall_script_ref": "ae2ed0c6", + "sha256": "5be4f3abb629688795aa87ac6490c1a693b140847bbf36d38362fac97dfb7f1e", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "5c184c66": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'com.knollsoft.Hyperkey'\nif [ -d \"$APPDIR/Hyperkey.app\" ]; then\n\tsudo mv \"$APPDIR/Hyperkey.app\" \"$TMPDIR/Hyperkey.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Hyperkey.app\" \"$APPDIR\"\nrelaunch_application 'com.knollsoft.Hyperkey'\n", + "ae2ed0c6": "#!/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.knollsoft.Hyperkey'\nsudo rm -rf \"$APPDIR/Hyperkey.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.knollsoft.HyperkeyLauncher'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Hyperkey'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.knollsoft.Hyperkey'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.knollsoft.HyperkeyLauncher'\ntrash $LOGGED_IN_USER '~/Library/Cookies/com.knollsoft.Hyperkey.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.knollsoft.Hyperkey'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.knollsoft.Hyperkey.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.knollsoft.Hyperkey.plist'\n" + } +} diff --git a/frontend/pages/SoftwarePage/components/icons/Hammerspoon.tsx b/frontend/pages/SoftwarePage/components/icons/Hammerspoon.tsx new file mode 100644 index 00000000000..eed9ff947a6 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Hammerspoon.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Hammerspoon = (props: SVGProps) => ( + + + +); +export default Hammerspoon; diff --git a/frontend/pages/SoftwarePage/components/icons/HandbrakeApp.tsx b/frontend/pages/SoftwarePage/components/icons/HandbrakeApp.tsx new file mode 100644 index 00000000000..7c6010d928d --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/HandbrakeApp.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const HandbrakeApp = (props: SVGProps) => ( + + + +); +export default HandbrakeApp; diff --git a/frontend/pages/SoftwarePage/components/icons/Hazel.tsx b/frontend/pages/SoftwarePage/components/icons/Hazel.tsx new file mode 100644 index 00000000000..46b2079ed9b --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Hazel.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Hazel = (props: SVGProps) => ( + + + +); +export default Hazel; diff --git a/frontend/pages/SoftwarePage/components/icons/Hazeover.tsx b/frontend/pages/SoftwarePage/components/icons/Hazeover.tsx new file mode 100644 index 00000000000..15ccd054a0a --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Hazeover.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Hazeover = (props: SVGProps) => ( + + + +); +export default Hazeover; diff --git a/frontend/pages/SoftwarePage/components/icons/Helium.tsx b/frontend/pages/SoftwarePage/components/icons/Helium.tsx new file mode 100644 index 00000000000..ec4eabae7fd --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Helium.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Helium = (props: SVGProps) => ( + + + +); +export default Helium; diff --git a/frontend/pages/SoftwarePage/components/icons/HexFiend.tsx b/frontend/pages/SoftwarePage/components/icons/HexFiend.tsx new file mode 100644 index 00000000000..c28f692ab30 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/HexFiend.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const HexFiend = (props: SVGProps) => ( + + + +); +export default HexFiend; diff --git a/frontend/pages/SoftwarePage/components/icons/HeyDesktop.tsx b/frontend/pages/SoftwarePage/components/icons/HeyDesktop.tsx new file mode 100644 index 00000000000..acb9347b6ea --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/HeyDesktop.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const HeyDesktop = (props: SVGProps) => ( + + + +); +export default HeyDesktop; diff --git a/frontend/pages/SoftwarePage/components/icons/Hiddenbar.tsx b/frontend/pages/SoftwarePage/components/icons/Hiddenbar.tsx new file mode 100644 index 00000000000..cca0ff6dbaa --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Hiddenbar.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Hiddenbar = (props: SVGProps) => ( + + + +); +export default Hiddenbar; diff --git a/frontend/pages/SoftwarePage/components/icons/Hides.tsx b/frontend/pages/SoftwarePage/components/icons/Hides.tsx new file mode 100644 index 00000000000..a4ff4f90fc2 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Hides.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Hides = (props: SVGProps) => ( + + + +); +export default Hides; diff --git a/frontend/pages/SoftwarePage/components/icons/Hidock.tsx b/frontend/pages/SoftwarePage/components/icons/Hidock.tsx new file mode 100644 index 00000000000..b974f4029a0 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Hidock.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Hidock = (props: SVGProps) => ( + + + +); +export default Hidock; diff --git a/frontend/pages/SoftwarePage/components/icons/HighlightAi.tsx b/frontend/pages/SoftwarePage/components/icons/HighlightAi.tsx new file mode 100644 index 00000000000..a6991202d33 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/HighlightAi.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const HighlightAi = (props: SVGProps) => ( + + + +); +export default HighlightAi; diff --git a/frontend/pages/SoftwarePage/components/icons/HiveApp.tsx b/frontend/pages/SoftwarePage/components/icons/HiveApp.tsx new file mode 100644 index 00000000000..a1eb2b072c5 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/HiveApp.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const HiveApp = (props: SVGProps) => ( + + + +); +export default HiveApp; diff --git a/frontend/pages/SoftwarePage/components/icons/HomeAssistant.tsx b/frontend/pages/SoftwarePage/components/icons/HomeAssistant.tsx new file mode 100644 index 00000000000..6a486418b52 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/HomeAssistant.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const HomeAssistant = (props: SVGProps) => ( + + + +); +export default HomeAssistant; diff --git a/frontend/pages/SoftwarePage/components/icons/Homerow.tsx b/frontend/pages/SoftwarePage/components/icons/Homerow.tsx new file mode 100644 index 00000000000..9678119e642 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Homerow.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Homerow = (props: SVGProps) => ( + + + +); +export default Homerow; diff --git a/frontend/pages/SoftwarePage/components/icons/Hot.tsx b/frontend/pages/SoftwarePage/components/icons/Hot.tsx new file mode 100644 index 00000000000..deec2afaedd --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Hot.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Hot = (props: SVGProps) => ( + + + +); +export default Hot; diff --git a/frontend/pages/SoftwarePage/components/icons/Houdahspot.tsx b/frontend/pages/SoftwarePage/components/icons/Houdahspot.tsx new file mode 100644 index 00000000000..58bdc42d29e --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Houdahspot.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Houdahspot = (props: SVGProps) => ( + + + +); +export default Houdahspot; diff --git a/frontend/pages/SoftwarePage/components/icons/HpEasyAdmin.tsx b/frontend/pages/SoftwarePage/components/icons/HpEasyAdmin.tsx new file mode 100644 index 00000000000..226cf869616 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/HpEasyAdmin.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const HpEasyAdmin = (props: SVGProps) => ( + + + +); +export default HpEasyAdmin; diff --git a/frontend/pages/SoftwarePage/components/icons/Hubstaff.tsx b/frontend/pages/SoftwarePage/components/icons/Hubstaff.tsx new file mode 100644 index 00000000000..572e8aa3cc6 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Hubstaff.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Hubstaff = (props: SVGProps) => ( + + + +); +export default Hubstaff; diff --git a/frontend/pages/SoftwarePage/components/icons/Huly.tsx b/frontend/pages/SoftwarePage/components/icons/Huly.tsx new file mode 100644 index 00000000000..0544ac7cde6 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Huly.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Huly = (props: SVGProps) => ( + + + +); +export default Huly; diff --git a/frontend/pages/SoftwarePage/components/icons/Hyperkey.tsx b/frontend/pages/SoftwarePage/components/icons/Hyperkey.tsx new file mode 100644 index 00000000000..4e14b17d69b --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Hyperkey.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Hyperkey = (props: SVGProps) => ( + + + +); +export default Hyperkey; diff --git a/frontend/pages/SoftwarePage/components/icons/index.ts b/frontend/pages/SoftwarePage/components/icons/index.ts index 225c2d01ff5..23109c1f028 100644 --- a/frontend/pages/SoftwarePage/components/icons/index.ts +++ b/frontend/pages/SoftwarePage/components/icons/index.ts @@ -264,7 +264,27 @@ import Granola from "./Granola"; import Grids from "./Grids"; import GrooveOmniDialer from "./GrooveOmniDialer"; import Gyazo from "./Gyazo"; +import Hammerspoon from "./Hammerspoon"; +import HandbrakeApp from "./HandbrakeApp"; +import Hazel from "./Hazel"; +import Hazeover from "./Hazeover"; +import Helium from "./Helium"; +import HexFiend from "./HexFiend"; +import HeyDesktop from "./HeyDesktop"; +import Hiddenbar from "./Hiddenbar"; +import Hides from "./Hides"; +import Hidock from "./Hidock"; +import HighlightAi from "./HighlightAi"; +import HiveApp from "./HiveApp"; +import HomeAssistant from "./HomeAssistant"; +import Homerow from "./Homerow"; +import Hot from "./Hot"; +import Houdahspot from "./Houdahspot"; +import HpEasyAdmin from "./HpEasyAdmin"; +import Hubstaff from "./Hubstaff"; +import Huly from "./Huly"; import Hyper from "./Hyper"; +import Hyperkey from "./Hyperkey"; import I1Profiler from "./I1Profiler"; import IbmNotifier from "./IbmNotifier"; import IconComposer from "./IconComposer"; @@ -932,7 +952,27 @@ export const SOFTWARE_NAME_TO_ICON_MAP = { granola: Granola, grids: Grids, "groove omnidialer": GrooveOmniDialer, + hammerspoon: Hammerspoon, + handbrake: HandbrakeApp, + hazel: Hazel, + hazeover: Hazeover, + helium: Helium, + "hex fiend": HexFiend, + hey: HeyDesktop, + "hidden bar": Hiddenbar, + hides: Hides, + hidock: Hidock, + highlight: HighlightAi, + hive: HiveApp, + "home assistant": HomeAssistant, + homerow: Homerow, + hot: Hot, + houdahspot: Houdahspot, + "hp easy admin": HpEasyAdmin, + hubstaff: Hubstaff, + huly: Huly, hyper: Hyper, + hyperkey: Hyperkey, i1profiler: I1Profiler, "ibm notifier": IbmNotifier, ice: JordanbairdIce, diff --git a/website/assets/images/app-icon-hammerspoon-60x60@2x.png b/website/assets/images/app-icon-hammerspoon-60x60@2x.png new file mode 100644 index 00000000000..ae78d1da700 Binary files /dev/null and b/website/assets/images/app-icon-hammerspoon-60x60@2x.png differ diff --git a/website/assets/images/app-icon-handbrake-app-60x60@2x.png b/website/assets/images/app-icon-handbrake-app-60x60@2x.png new file mode 100644 index 00000000000..1125598755c Binary files /dev/null and b/website/assets/images/app-icon-handbrake-app-60x60@2x.png differ diff --git a/website/assets/images/app-icon-hazel-60x60@2x.png b/website/assets/images/app-icon-hazel-60x60@2x.png new file mode 100644 index 00000000000..d76da2af682 Binary files /dev/null and b/website/assets/images/app-icon-hazel-60x60@2x.png differ diff --git a/website/assets/images/app-icon-hazeover-60x60@2x.png b/website/assets/images/app-icon-hazeover-60x60@2x.png new file mode 100644 index 00000000000..48be2e426a1 Binary files /dev/null and b/website/assets/images/app-icon-hazeover-60x60@2x.png differ diff --git a/website/assets/images/app-icon-helium-60x60@2x.png b/website/assets/images/app-icon-helium-60x60@2x.png new file mode 100644 index 00000000000..de052bfe702 Binary files /dev/null and b/website/assets/images/app-icon-helium-60x60@2x.png differ diff --git a/website/assets/images/app-icon-hex-fiend-60x60@2x.png b/website/assets/images/app-icon-hex-fiend-60x60@2x.png new file mode 100644 index 00000000000..21486dbb561 Binary files /dev/null and b/website/assets/images/app-icon-hex-fiend-60x60@2x.png differ diff --git a/website/assets/images/app-icon-hey-desktop-60x60@2x.png b/website/assets/images/app-icon-hey-desktop-60x60@2x.png new file mode 100644 index 00000000000..6e2c7b6db60 Binary files /dev/null and b/website/assets/images/app-icon-hey-desktop-60x60@2x.png differ diff --git a/website/assets/images/app-icon-hiddenbar-60x60@2x.png b/website/assets/images/app-icon-hiddenbar-60x60@2x.png new file mode 100644 index 00000000000..814cd33a000 Binary files /dev/null and b/website/assets/images/app-icon-hiddenbar-60x60@2x.png differ diff --git a/website/assets/images/app-icon-hides-60x60@2x.png b/website/assets/images/app-icon-hides-60x60@2x.png new file mode 100644 index 00000000000..c818f9d563f Binary files /dev/null and b/website/assets/images/app-icon-hides-60x60@2x.png differ diff --git a/website/assets/images/app-icon-hidock-60x60@2x.png b/website/assets/images/app-icon-hidock-60x60@2x.png new file mode 100644 index 00000000000..67d3ddeb099 Binary files /dev/null and b/website/assets/images/app-icon-hidock-60x60@2x.png differ diff --git a/website/assets/images/app-icon-highlight-ai-60x60@2x.png b/website/assets/images/app-icon-highlight-ai-60x60@2x.png new file mode 100644 index 00000000000..2f63a7ebcab Binary files /dev/null and b/website/assets/images/app-icon-highlight-ai-60x60@2x.png differ diff --git a/website/assets/images/app-icon-hive-app-60x60@2x.png b/website/assets/images/app-icon-hive-app-60x60@2x.png new file mode 100644 index 00000000000..464fd62bc4b Binary files /dev/null and b/website/assets/images/app-icon-hive-app-60x60@2x.png differ diff --git a/website/assets/images/app-icon-home-assistant-60x60@2x.png b/website/assets/images/app-icon-home-assistant-60x60@2x.png new file mode 100644 index 00000000000..5478ae3a50a Binary files /dev/null and b/website/assets/images/app-icon-home-assistant-60x60@2x.png differ diff --git a/website/assets/images/app-icon-homerow-60x60@2x.png b/website/assets/images/app-icon-homerow-60x60@2x.png new file mode 100644 index 00000000000..70193cb9fb7 Binary files /dev/null and b/website/assets/images/app-icon-homerow-60x60@2x.png differ diff --git a/website/assets/images/app-icon-hot-60x60@2x.png b/website/assets/images/app-icon-hot-60x60@2x.png new file mode 100644 index 00000000000..fc56b2ef5df Binary files /dev/null and b/website/assets/images/app-icon-hot-60x60@2x.png differ diff --git a/website/assets/images/app-icon-houdahspot-60x60@2x.png b/website/assets/images/app-icon-houdahspot-60x60@2x.png new file mode 100644 index 00000000000..fc71d79129a Binary files /dev/null and b/website/assets/images/app-icon-houdahspot-60x60@2x.png differ diff --git a/website/assets/images/app-icon-hp-easy-admin-60x60@2x.png b/website/assets/images/app-icon-hp-easy-admin-60x60@2x.png new file mode 100644 index 00000000000..c839e8b52de Binary files /dev/null and b/website/assets/images/app-icon-hp-easy-admin-60x60@2x.png differ diff --git a/website/assets/images/app-icon-hubstaff-60x60@2x.png b/website/assets/images/app-icon-hubstaff-60x60@2x.png new file mode 100644 index 00000000000..04da154f410 Binary files /dev/null and b/website/assets/images/app-icon-hubstaff-60x60@2x.png differ diff --git a/website/assets/images/app-icon-huly-60x60@2x.png b/website/assets/images/app-icon-huly-60x60@2x.png new file mode 100644 index 00000000000..0a75c2c865b Binary files /dev/null and b/website/assets/images/app-icon-huly-60x60@2x.png differ diff --git a/website/assets/images/app-icon-hyperkey-60x60@2x.png b/website/assets/images/app-icon-hyperkey-60x60@2x.png new file mode 100644 index 00000000000..a40878f758d Binary files /dev/null and b/website/assets/images/app-icon-hyperkey-60x60@2x.png differ