diff --git a/ee/maintained-apps/inputs/homebrew/a-better-finder-rename.json b/ee/maintained-apps/inputs/homebrew/a-better-finder-rename.json new file mode 100644 index 0000000000..802981951f --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/a-better-finder-rename.json @@ -0,0 +1,10 @@ +{ + "name": "A Better Finder Rename", + "unique_identifier": "net.publicspace.abfr12", + "token": "a-better-finder-rename", + "installer_format": "dmg", + "slug": "a-better-finder-rename/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/acorn.json b/ee/maintained-apps/inputs/homebrew/acorn.json new file mode 100644 index 0000000000..1912c2db22 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/acorn.json @@ -0,0 +1,10 @@ +{ + "name": "Acorn", + "unique_identifier": "com.flyingmeat.Acorn8", + "token": "acorn", + "installer_format": "zip", + "slug": "acorn/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/activedock.json b/ee/maintained-apps/inputs/homebrew/activedock.json new file mode 100644 index 0000000000..ec4e020a0b --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/activedock.json @@ -0,0 +1,10 @@ +{ + "name": "ActiveDock", + "unique_identifier": "com.sergey-gerasimenko.ActiveDock-2", + "token": "activedock", + "installer_format": "zip", + "slug": "activedock/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/activitywatch.json b/ee/maintained-apps/inputs/homebrew/activitywatch.json new file mode 100644 index 0000000000..414a343222 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/activitywatch.json @@ -0,0 +1,10 @@ +{ + "name": "ActivityWatch", + "unique_identifier": "net.activitywatch.ActivityWatch", + "token": "activitywatch", + "installer_format": "dmg", + "slug": "activitywatch/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/actual.json b/ee/maintained-apps/inputs/homebrew/actual.json new file mode 100644 index 0000000000..00d98948ac --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/actual.json @@ -0,0 +1,10 @@ +{ + "name": "Actual", + "unique_identifier": "com.actualbudget.actual", + "token": "actual", + "installer_format": "dmg", + "slug": "actual/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/adguard.json b/ee/maintained-apps/inputs/homebrew/adguard.json new file mode 100644 index 0000000000..8893655c55 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/adguard.json @@ -0,0 +1,10 @@ +{ + "name": "AdGuard", + "unique_identifier": "com.adguard.mac.adguard", + "token": "adguard", + "installer_format": "dmg", + "slug": "adguard/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/adlock.json b/ee/maintained-apps/inputs/homebrew/adlock.json new file mode 100644 index 0000000000..f7c1a9b230 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/adlock.json @@ -0,0 +1,10 @@ +{ + "name": "AdLock", + "unique_identifier": "com.hankuper.adlock.desktop", + "token": "adlock", + "installer_format": "dmg", + "slug": "adlock/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/advanced-renamer.json b/ee/maintained-apps/inputs/homebrew/advanced-renamer.json new file mode 100644 index 0000000000..f7dbdf4d81 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/advanced-renamer.json @@ -0,0 +1,10 @@ +{ + "name": "Advanced Renamer", + "unique_identifier": "com.HulubuluSoftware.AdvancedRenamer", + "token": "advanced-renamer", + "installer_format": "dmg", + "slug": "advanced-renamer/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/affinity-designer.json b/ee/maintained-apps/inputs/homebrew/affinity-designer.json new file mode 100644 index 0000000000..e2f42bef4e --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/affinity-designer.json @@ -0,0 +1,10 @@ +{ + "name": "Affinity Designer 2", + "unique_identifier": "com.seriflabs.affinitydesigner2", + "token": "affinity-designer", + "installer_format": "zip", + "slug": "affinity-designer/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/affinity-designer@1.json b/ee/maintained-apps/inputs/homebrew/affinity-designer@1.json new file mode 100644 index 0000000000..26fd3aba60 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/affinity-designer@1.json @@ -0,0 +1,10 @@ +{ + "name": "Affinity Designer", + "unique_identifier": "com.seriflabs.affinitydesigner", + "token": "affinity-designer@1", + "installer_format": "zip", + "slug": "affinity-designer@1/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/affinity-photo.json b/ee/maintained-apps/inputs/homebrew/affinity-photo.json new file mode 100644 index 0000000000..4e1317d422 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/affinity-photo.json @@ -0,0 +1,10 @@ +{ + "name": "Affinity Photo 2", + "unique_identifier": "com.seriflabs.affinityphoto2", + "token": "affinity-photo", + "installer_format": "zip", + "slug": "affinity-photo/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/affinity-photo@1.json b/ee/maintained-apps/inputs/homebrew/affinity-photo@1.json new file mode 100644 index 0000000000..83720dc11a --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/affinity-photo@1.json @@ -0,0 +1,10 @@ +{ + "name": "Affinity Photo", + "unique_identifier": "com.seriflabs.affinityphoto", + "token": "affinity-photo@1", + "installer_format": "zip", + "slug": "affinity-photo@1/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/affinity-publisher.json b/ee/maintained-apps/inputs/homebrew/affinity-publisher.json new file mode 100644 index 0000000000..66b5a91e57 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/affinity-publisher.json @@ -0,0 +1,10 @@ +{ + "name": "Affinity Publisher 2", + "unique_identifier": "com.seriflabs.affinitypublisher2", + "token": "affinity-publisher", + "installer_format": "zip", + "slug": "affinity-publisher/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/affinity-publisher@1.json b/ee/maintained-apps/inputs/homebrew/affinity-publisher@1.json new file mode 100644 index 0000000000..8c781b4690 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/affinity-publisher@1.json @@ -0,0 +1,10 @@ +{ + "name": "Affinity Publisher", + "unique_identifier": "com.seriflabs.affinitypublisher", + "token": "affinity-publisher@1", + "installer_format": "zip", + "slug": "affinity-publisher@1/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/airbuddy.json b/ee/maintained-apps/inputs/homebrew/airbuddy.json new file mode 100644 index 0000000000..8b36bb0f6d --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/airbuddy.json @@ -0,0 +1,10 @@ +{ + "name": "AirBuddy", + "unique_identifier": "codes.rambo.AirBuddy", + "token": "airbuddy", + "installer_format": "dmg", + "slug": "airbuddy/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/airdroid.json b/ee/maintained-apps/inputs/homebrew/airdroid.json new file mode 100644 index 0000000000..06b60df709 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/airdroid.json @@ -0,0 +1,10 @@ +{ + "name": "AirDroid", + "unique_identifier": "com.sandstudio.airdroid", + "token": "airdroid", + "installer_format": "dmg", + "slug": "airdroid/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/airparrot.json b/ee/maintained-apps/inputs/homebrew/airparrot.json new file mode 100644 index 0000000000..1cf9530b50 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/airparrot.json @@ -0,0 +1,10 @@ +{ + "name": "AirParrot", + "unique_identifier": "com.squirrels.AirParrot-3", + "token": "airparrot", + "installer_format": "dmg", + "slug": "airparrot/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/airserver.json b/ee/maintained-apps/inputs/homebrew/airserver.json new file mode 100644 index 0000000000..8fc6326e1c --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/airserver.json @@ -0,0 +1,10 @@ +{ + "name": "AirServer", + "unique_identifier": "com.pratikkumar.airserver-mac", + "token": "airserver", + "installer_format": "dmg", + "slug": "airserver/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/airtable.json b/ee/maintained-apps/inputs/homebrew/airtable.json new file mode 100644 index 0000000000..b184da2074 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/airtable.json @@ -0,0 +1,10 @@ +{ + "name": "Airtable", + "unique_identifier": "com.FormaGrid.Airtable", + "token": "airtable", + "installer_format": "dmg", + "slug": "airtable/darwin", + "default_categories": [ + "Developer tools" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/airy.json b/ee/maintained-apps/inputs/homebrew/airy.json new file mode 100644 index 0000000000..134bfca395 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/airy.json @@ -0,0 +1,10 @@ +{ + "name": "Airy", + "unique_identifier": "com.eltima.Airy", + "token": "airy", + "installer_format": "dmg", + "slug": "airy/darwin", + "default_categories": [ + "Developer tools" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/akiflow.json b/ee/maintained-apps/inputs/homebrew/akiflow.json new file mode 100644 index 0000000000..2c03b1711e --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/akiflow.json @@ -0,0 +1,10 @@ +{ + "name": "Akiflow", + "unique_identifier": "com.akiflow.akiflow", + "token": "akiflow", + "installer_format": "dmg", + "slug": "akiflow/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/alcove.json b/ee/maintained-apps/inputs/homebrew/alcove.json new file mode 100644 index 0000000000..ad284762c8 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/alcove.json @@ -0,0 +1,10 @@ +{ + "name": "Alcove", + "unique_identifier": "com.henrikruscon.Alcove", + "token": "alcove", + "installer_format": "zip", + "slug": "alcove/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/aldente.json b/ee/maintained-apps/inputs/homebrew/aldente.json new file mode 100644 index 0000000000..b18457331a --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/aldente.json @@ -0,0 +1,10 @@ +{ + "name": "AlDente", + "unique_identifier": "com.apphousekitchen.aldente-pro", + "token": "aldente", + "installer_format": "dmg", + "slug": "aldente/darwin", + "default_categories": [ + "Utilities" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/alloy.json b/ee/maintained-apps/inputs/homebrew/alloy.json new file mode 100644 index 0000000000..707575b5d0 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/alloy.json @@ -0,0 +1,10 @@ +{ + "name": "Alloy", + "unique_identifier": "org.alloytools.alloy", + "token": "alloy", + "installer_format": "zip", + "slug": "alloy/darwin", + "default_categories": [ + "Developer tools" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/alt-tab.json b/ee/maintained-apps/inputs/homebrew/alt-tab.json new file mode 100644 index 0000000000..2e5329b986 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/alt-tab.json @@ -0,0 +1,10 @@ +{ + "name": "AltTab", + "unique_identifier": "com.lwouis.alt-tab-macos", + "token": "alt-tab", + "installer_format": "zip", + "slug": "alt-tab/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/altair-graphql-client.json b/ee/maintained-apps/inputs/homebrew/altair-graphql-client.json new file mode 100644 index 0000000000..0b7656a40b --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/altair-graphql-client.json @@ -0,0 +1,10 @@ +{ + "name": "Altair GraphQL Client", + "unique_identifier": "com.xkoji.altair", + "token": "altair-graphql-client", + "installer_format": "zip", + "slug": "altair-graphql-client/darwin", + "default_categories": [ + "Developer tools" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/amadeus-pro.json b/ee/maintained-apps/inputs/homebrew/amadeus-pro.json new file mode 100644 index 0000000000..bc20907795 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/amadeus-pro.json @@ -0,0 +1,10 @@ +{ + "name": "Amadeus Pro", + "unique_identifier": "com.HairerSoft.AmadeusPro", + "token": "amadeus-pro", + "installer_format": "zip", + "slug": "amadeus-pro/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/amadine.json b/ee/maintained-apps/inputs/homebrew/amadine.json new file mode 100644 index 0000000000..c40c7894bd --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/amadine.json @@ -0,0 +1,10 @@ +{ + "name": "Amadine", + "unique_identifier": "com.belightsoft.Amadine", + "token": "amadine", + "installer_format": "dmg", + "slug": "amadine/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/amethyst.json b/ee/maintained-apps/inputs/homebrew/amethyst.json new file mode 100644 index 0000000000..57b84ec679 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/amethyst.json @@ -0,0 +1,10 @@ +{ + "name": "Amethyst", + "unique_identifier": "com.amethyst.Amethyst", + "token": "amethyst", + "installer_format": "zip", + "slug": "amethyst/darwin", + "default_categories": [ + "Utilities" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/amie.json b/ee/maintained-apps/inputs/homebrew/amie.json new file mode 100644 index 0000000000..d7b1976693 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/amie.json @@ -0,0 +1,10 @@ +{ + "name": "Amie", + "unique_identifier": "so.amie.electron-app", + "token": "amie", + "installer_format": "zip", + "slug": "amie/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/angry-ip-scanner.json b/ee/maintained-apps/inputs/homebrew/angry-ip-scanner.json new file mode 100644 index 0000000000..e3495a01b0 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/angry-ip-scanner.json @@ -0,0 +1,10 @@ +{ + "name": "Angry IP Scanner", + "unique_identifier": "net.azib.ipscan", + "token": "angry-ip-scanner", + "installer_format": "zip", + "slug": "angry-ip-scanner/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/antinote.json b/ee/maintained-apps/inputs/homebrew/antinote.json new file mode 100644 index 0000000000..32d6e854df --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/antinote.json @@ -0,0 +1,10 @@ +{ + "name": "Antinote", + "unique_identifier": "com.chabomakers.Antinote", + "token": "antinote", + "installer_format": "dmg", + "slug": "antinote/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/anydo.json b/ee/maintained-apps/inputs/homebrew/anydo.json new file mode 100644 index 0000000000..ed1c5f9700 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/anydo.json @@ -0,0 +1,10 @@ +{ + "name": "Any.do", + "unique_identifier": "com.anydo.mac", + "token": "anydo", + "installer_format": "dmg", + "slug": "anydo/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/anytype.json b/ee/maintained-apps/inputs/homebrew/anytype.json new file mode 100644 index 0000000000..28d7902c56 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/anytype.json @@ -0,0 +1,10 @@ +{ + "name": "Anytype", + "unique_identifier": "com.anytype.anytype", + "token": "anytype", + "installer_format": "dmg", + "slug": "anytype/darwin", + "default_categories": [ + "Security" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/apidog.json b/ee/maintained-apps/inputs/homebrew/apidog.json new file mode 100644 index 0000000000..d47e8a5753 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/apidog.json @@ -0,0 +1,10 @@ +{ + "name": "Apidog", + "unique_identifier": "com.apidog.app", + "token": "apidog", + "installer_format": "dmg", + "slug": "apidog/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/app-fair.json b/ee/maintained-apps/inputs/homebrew/app-fair.json new file mode 100644 index 0000000000..dbce510d98 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/app-fair.json @@ -0,0 +1,10 @@ +{ + "name": "App Fair", + "unique_identifier": "app.App-Fair", + "token": "app-fair", + "installer_format": "zip", + "slug": "app-fair/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/appium-inspector.json b/ee/maintained-apps/inputs/homebrew/appium-inspector.json new file mode 100644 index 0000000000..a64fa17e76 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/appium-inspector.json @@ -0,0 +1,10 @@ +{ + "name": "Appium Inspector GUI", + "unique_identifier": "io.appium.inspector", + "token": "appium-inspector", + "installer_format": "zip", + "slug": "appium-inspector/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/applite.json b/ee/maintained-apps/inputs/homebrew/applite.json new file mode 100644 index 0000000000..02bb9a240d --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/applite.json @@ -0,0 +1,10 @@ +{ + "name": "Applite", + "unique_identifier": "dev.aerolite.Applite", + "token": "applite", + "installer_format": "dmg", + "slug": "applite/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/asset-catalog-tinkerer.json b/ee/maintained-apps/inputs/homebrew/asset-catalog-tinkerer.json new file mode 100644 index 0000000000..0fbec7b8df --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/asset-catalog-tinkerer.json @@ -0,0 +1,10 @@ +{ + "name": "Asset Catalog Tinkerer", + "unique_identifier": "br.com.guilhermerambo.Asset-Catalog-Tinkerer", + "token": "asset-catalog-tinkerer", + "installer_format": "zip", + "slug": "asset-catalog-tinkerer/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/atext.json b/ee/maintained-apps/inputs/homebrew/atext.json new file mode 100644 index 0000000000..f6072dea30 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/atext.json @@ -0,0 +1,10 @@ +{ + "name": "aText", + "unique_identifier": "com.trankynam.aText", + "token": "atext", + "installer_format": "dmg", + "slug": "atext/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/audio-hijack.json b/ee/maintained-apps/inputs/homebrew/audio-hijack.json new file mode 100644 index 0000000000..124961d9e4 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/audio-hijack.json @@ -0,0 +1,10 @@ +{ + "name": "Audio Hijack", + "unique_identifier": "com.rogueamoeba.audiohijack", + "token": "audio-hijack", + "installer_format": "zip", + "slug": "audio-hijack/darwin", + "default_categories": [ + "Productivity" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/aviatrix-vpn-client.json b/ee/maintained-apps/inputs/homebrew/aviatrix-vpn-client.json new file mode 100644 index 0000000000..8096825cfa --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/aviatrix-vpn-client.json @@ -0,0 +1,10 @@ +{ + "name": "Aviatrix VPN Client", + "unique_identifier": "org.pythonmac.unspecified.AviatrixVPNClient", + "token": "aviatrix-vpn-client", + "installer_format": "pkg", + "slug": "aviatrix-vpn-client/darwin", + "default_categories": [ + "Security" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/inputs/homebrew/axure-rp.json b/ee/maintained-apps/inputs/homebrew/axure-rp.json new file mode 100644 index 0000000000..29e2b6bb81 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/axure-rp.json @@ -0,0 +1,10 @@ +{ + "name": "Axure RP", + "unique_identifier": "com.axure.AxureRP11", + "token": "axure-rp", + "installer_format": "dmg", + "slug": "axure-rp/darwin", + "default_categories": [ + "Developer tools" + ] +} \ No newline at end of file diff --git a/ee/maintained-apps/outputs/a-better-finder-rename/darwin.json b/ee/maintained-apps/outputs/a-better-finder-rename/darwin.json new file mode 100644 index 0000000000..a307ffe614 --- /dev/null +++ b/ee/maintained-apps/outputs/a-better-finder-rename/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "12.30", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'net.publicspace.abfr12';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'net.publicspace.abfr12' AND version_compare(bundle_short_version, '12.30') < 0);" + }, + "installer_url": "https://www.publicspace.net/download/ABFRX12.dmg", + "install_script_ref": "1cbc7e4f", + "uninstall_script_ref": "25b72319", + "sha256": "no_check", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "1cbc7e4f": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'net.publicspace.abfr12'\nif [ -d \"$APPDIR/A Better Finder Rename 12.app\" ]; then\n\tsudo mv \"$APPDIR/A Better Finder Rename 12.app\" \"$TMPDIR/A Better Finder Rename 12.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/A Better Finder Rename 12.app\" \"$APPDIR\"\nrelaunch_application 'net.publicspace.abfr12'\n", + "25b72319": "#!/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/A Better Finder Rename 12.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/A Better Finder Rename 12'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.apple.helpd/Generated/net.publicspace.abfr12.help*'\ntrash $LOGGED_IN_USER '~/Library/Caches/net.publicspace.abfr*'\ntrash $LOGGED_IN_USER '~/Library/Cookies/net.publicspace.abfr*.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/net.publicspace.abfr*'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/net.publicspace.abfr*.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/Preferences/net.publicspace.abfr*.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/net.publicspace.abfr*.savedState'\n" + } +} diff --git a/ee/maintained-apps/outputs/acorn/darwin.json b/ee/maintained-apps/outputs/acorn/darwin.json new file mode 100644 index 0000000000..ae20176519 --- /dev/null +++ b/ee/maintained-apps/outputs/acorn/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "8.5.1", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.flyingmeat.Acorn8';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.flyingmeat.Acorn8' AND version_compare(bundle_short_version, '8.5.1') < 0);" + }, + "installer_url": "https://flyingmeat.com/download/Acorn-8.5.1.zip", + "install_script_ref": "299f47da", + "uninstall_script_ref": "d8d84d04", + "sha256": "95f140cda6e7e13ba1d881e2add2bbff2aaa8dabdc74d96c7536205454e94a77", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "299f47da": "#!/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.flyingmeat.Acorn8'\nif [ -d \"$APPDIR/Acorn.app\" ]; then\n\tsudo mv \"$APPDIR/Acorn.app\" \"$TMPDIR/Acorn.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Acorn.app\" \"$APPDIR\"\nrelaunch_application 'com.flyingmeat.Acorn8'\n", + "d8d84d04": "#!/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/Acorn.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Acorn'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.flyingmeat.Acorn8'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.flyingmeat.Acorn8.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.flyingmeat.Acorn8.savedState'\n" + } +} diff --git a/ee/maintained-apps/outputs/activedock/darwin.json b/ee/maintained-apps/outputs/activedock/darwin.json new file mode 100644 index 0000000000..5f69a89045 --- /dev/null +++ b/ee/maintained-apps/outputs/activedock/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "2.860", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.sergey-gerasimenko.ActiveDock-2';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.sergey-gerasimenko.ActiveDock-2' AND version_compare(bundle_short_version, '2.860') < 0);" + }, + "installer_url": "https://macplus-software.com/downloads/ActiveDock.zip", + "install_script_ref": "44aae78e", + "uninstall_script_ref": "9850444d", + "sha256": "no_check", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "44aae78e": "#!/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.sergey-gerasimenko.ActiveDock-2'\nif [ -d \"$APPDIR/ActiveDock 2.app\" ]; then\n\tsudo mv \"$APPDIR/ActiveDock 2.app\" \"$TMPDIR/ActiveDock 2.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/ActiveDock 2.app\" \"$APPDIR\"\nrelaunch_application 'com.sergey-gerasimenko.ActiveDock-2'\n", + "9850444d": "#!/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/ActiveDock 2.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/ActiveDock 2'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.sergey-gerasimenko.ActiveDock-2'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.sergey-gerasimenko.ActiveDock-2'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.sergey-gerasimenko.ActiveDock-2'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.sergey-gerasimenko.ActiveDock-2.plist'\n" + } +} diff --git a/ee/maintained-apps/outputs/activitywatch/darwin.json b/ee/maintained-apps/outputs/activitywatch/darwin.json new file mode 100644 index 0000000000..a786f6a255 --- /dev/null +++ b/ee/maintained-apps/outputs/activitywatch/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "0.13.2", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'net.activitywatch.ActivityWatch';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'net.activitywatch.ActivityWatch' AND version_compare(bundle_short_version, '0.13.2') < 0);" + }, + "installer_url": "https://github.com/ActivityWatch/activitywatch/releases/download/v0.13.2/activitywatch-v0.13.2-macos-x86_64.dmg", + "install_script_ref": "14c0a917", + "uninstall_script_ref": "6025409f", + "sha256": "22f3bce0e169457902b2c8d2967701cde887171f737d281dd414a210bd3090ed", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "14c0a917": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'net.activitywatch.ActivityWatch'\nif [ -d \"$APPDIR/ActivityWatch.app\" ]; then\n\tsudo mv \"$APPDIR/ActivityWatch.app\" \"$TMPDIR/ActivityWatch.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/ActivityWatch.app\" \"$APPDIR\"\nrelaunch_application 'net.activitywatch.ActivityWatch'\n", + "6025409f": "#!/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/ActivityWatch.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/activitywatch'\ntrash $LOGGED_IN_USER '~/Library/Caches/activitywatch'\ntrash $LOGGED_IN_USER '~/Library/Logs/activitywatch'\n" + } +} diff --git a/ee/maintained-apps/outputs/actual/darwin.json b/ee/maintained-apps/outputs/actual/darwin.json new file mode 100644 index 0000000000..494b6892ec --- /dev/null +++ b/ee/maintained-apps/outputs/actual/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "26.6.0", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.actualbudget.actual';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.actualbudget.actual' AND version_compare(bundle_short_version, '26.6.0') < 0);" + }, + "installer_url": "https://github.com/actualbudget/actual/releases/download/v26.6.0/Actual-mac-arm64.dmg", + "install_script_ref": "631bbb42", + "uninstall_script_ref": "27bb5492", + "sha256": "32f6893b599e8408b21e9cfe4b0d2530f41951c31100a41d0585b815691c577f", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "27bb5492": "#!/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/Actual.app\"\ntrash $LOGGED_IN_USER '~/Documents/Actual'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Actual'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.actualbudget.actual.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Logs/Actual'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.actualbudget.actual.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.actualbudget.actual.savedState'\n", + "631bbb42": "#!/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.actualbudget.actual'\nif [ -d \"$APPDIR/Actual.app\" ]; then\n\tsudo mv \"$APPDIR/Actual.app\" \"$TMPDIR/Actual.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Actual.app\" \"$APPDIR\"\nrelaunch_application 'com.actualbudget.actual'\n" + } +} diff --git a/ee/maintained-apps/outputs/adguard/darwin.json b/ee/maintained-apps/outputs/adguard/darwin.json new file mode 100644 index 0000000000..115b2f52eb --- /dev/null +++ b/ee/maintained-apps/outputs/adguard/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "2.18.0.2089", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.adguard.mac.adguard';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.adguard.mac.adguard' AND version_compare(bundle_short_version, '2.18.0.2089') < 0);" + }, + "installer_url": "https://static.adguard.com/mac/release/AdGuard-2.18.0.2089.dmg", + "install_script_ref": "fd52311a", + "uninstall_script_ref": "176886c7", + "sha256": "d69d8ab59f1d73c867eeeb719262b5658d88680eeb84c9e6e511589c406c033a", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "176886c7": "#!/bin/bash\n\n# variables\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nexpand_pkgid_and_map() {\n local PKGID=\"$1\"\n local FUNC=\"$2\"\n if [[ \"$PKGID\" == *\"*\" ]]; then\n local prefix=\"${PKGID%\\*}\"\n echo \"Expanding wildcard for PKGID: $PKGID\"\n for receipt in $(pkgutil --pkgs | grep \"^${prefix}\"); do\n echo \"Processing $receipt\"\n \"$FUNC\" \"$receipt\"\n done\n else\n \"$FUNC\" \"$PKGID\"\n fi\n}\n\nforget_pkg() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" forget_receipt\n}\n\nforget_receipt() {\n local PKGID=\"$1\"\n sudo pkgutil --forget \"$PKGID\"\n}\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nremove_launchctl_service() {\n local service=\"$1\"\n local booleans=(\"true\" \"false\")\n local plist_status\n local paths\n local should_sudo\n\n echo \"Removing launchctl service ${service}\"\n\n for should_sudo in \"${booleans[@]}\"; do\n plist_status=$(launchctl list \"${service}\" 2>/dev/null)\n\n if [[ $plist_status == \\{* ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo launchctl remove \"${service}\"\n else\n launchctl remove \"${service}\"\n fi\n sleep 1\n fi\n\n paths=(\n \"/Library/LaunchAgents/${service}.plist\"\n \"/Library/LaunchDaemons/${service}.plist\"\n )\n\n # if not using sudo, prepend the home directory to the paths\n if [[ $should_sudo == \"false\" ]]; then\n for i in \"${!paths[@]}\"; do\n paths[i]=\"${HOME}${paths[i]}\"\n done\n fi\n\n for path in \"${paths[@]}\"; do\n if [[ -e \"$path\" ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo rm -f -- \"$path\"\n else\n rm -f -- \"$path\"\n fi\n fi\n done\n done\n}\n\nremove_pkg_files() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" remove_receipt_files\n}\n\nremove_receipt_files() {\n local PKGID=\"$1\"\n local PKGINFO VOLUME INSTALL_LOCATION FULL_INSTALL_LOCATION\n\n echo \"pkgutil --pkg-info-plist \\\"$PKGID\\\"\"\n PKGINFO=$(pkgutil --pkg-info-plist \"$PKGID\")\n VOLUME=$(echo \"$PKGINFO\" | awk '/volume<\\/key>/ {getline; gsub(/.*|<\\/string>.*/, \"\"); print}')\n INSTALL_LOCATION=$(echo \"$PKGINFO\" | awk '/install-location<\\/key>/ {getline; gsub(/.*|<\\/string>.*/, \"\"); print}')\n\n if [ -z \"$INSTALL_LOCATION\" ] || [ \"$INSTALL_LOCATION\" = \"/\" ]; then\n FULL_INSTALL_LOCATION=\"$VOLUME\"\n else\n FULL_INSTALL_LOCATION=\"$VOLUME/$INSTALL_LOCATION\"\n FULL_INSTALL_LOCATION=$(echo \"$FULL_INSTALL_LOCATION\" | sed 's|//|/|g')\n fi\n\n echo \"sudo pkgutil --only-files --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-files --files \"$PKGID\" | sed \"s|^|/${INSTALL_LOCATION}/|\" | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n echo \"sudo pkgutil --only-dirs --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | grep '\\\\.app$' | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-dirs --files \"$PKGID\" | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" | grep '\\.app$' | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n root_app_dir=$(\n sudo pkgutil --only-dirs --files \"$PKGID\" \\\n | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" \\\n | grep 'Applications' \\\n | awk '{ print length, $0 }' \\\n | sort -n \\\n | head -n1 \\\n | cut -d' ' -f2-\n )\n if [ -n \"$root_app_dir\" ]; then\n echo \"sudo rmdir -p \\\"$root_app_dir\\\" 2>/dev/null || :\"\n sudo rmdir -p \"$root_app_dir\" 2>/dev/null || :\n fi\n}\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nremove_launchctl_service 'com.adguard.mac.adguard.helper'\nremove_launchctl_service 'com.adguard.mac.adguard.pac'\nremove_launchctl_service 'com.adguard.mac.adguard.tun-helper'\nremove_launchctl_service 'com.adguard.mac.adguard.xpcgate2'\nquit_application 'com.adguard.mac.adguard'\nremove_pkg_files 'com.adguard.mac.adguard-pkg'\nforget_pkg 'com.adguard.mac.adguard-pkg'\nsudo rm -rf '/Library/Application Support/AdGuard Software/com.adguard.mac.adguard'\nsudo rm -rf '/Library/Application Support/com.adguard.Adguard'\nsudo rm -rf '/Library/com.adguard.mac.adguard.pac'\nsudo rmdir '/Library/Application Support/AdGuard Software'\nsudo rm -rf '/Library/Logs/com.adguard.mac.adguard'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/*com.adguard.mac*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Adguard'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.adguard.*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.adguard.mac.adguard.loginhelper.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.adguard.*'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.adguard.mac.*'\ntrash $LOGGED_IN_USER '~/Library/Cookies/com.adguard.Adguard.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/*.com.adguard.mac'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.adguard.mac.*'\ntrash $LOGGED_IN_USER '~/Library/Logs/Adguard'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.adguard.*.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.adguard.mac.adguard.savedState'\n", + "fd52311a": "#!/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# install pkg files\nquit_and_track_application 'com.adguard.mac.adguard'\nsudo installer -pkg \"$TMPDIR/AdGuard.pkg\" -target /\nrelaunch_application 'com.adguard.mac.adguard'\n" + } +} diff --git a/ee/maintained-apps/outputs/adlock/darwin.json b/ee/maintained-apps/outputs/adlock/darwin.json new file mode 100644 index 0000000000..8e8119793f --- /dev/null +++ b/ee/maintained-apps/outputs/adlock/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "2.1.7.3", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.hankuper.adlock.desktop';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.hankuper.adlock.desktop' AND version_compare(bundle_short_version, '2.1.7.3') < 0);" + }, + "installer_url": "https://downloads.adlock.com/mac/AdLock_Installer.dmg", + "install_script_ref": "ec52d1d9", + "uninstall_script_ref": "09c6fd06", + "sha256": "no_check", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "09c6fd06": "#!/bin/bash\n\n# variables\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nexpand_pkgid_and_map() {\n local PKGID=\"$1\"\n local FUNC=\"$2\"\n if [[ \"$PKGID\" == *\"*\" ]]; then\n local prefix=\"${PKGID%\\*}\"\n echo \"Expanding wildcard for PKGID: $PKGID\"\n for receipt in $(pkgutil --pkgs | grep \"^${prefix}\"); do\n echo \"Processing $receipt\"\n \"$FUNC\" \"$receipt\"\n done\n else\n \"$FUNC\" \"$PKGID\"\n fi\n}\n\nforget_pkg() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" forget_receipt\n}\n\nforget_receipt() {\n local PKGID=\"$1\"\n sudo pkgutil --forget \"$PKGID\"\n}\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nremove_launchctl_service() {\n local service=\"$1\"\n local booleans=(\"true\" \"false\")\n local plist_status\n local paths\n local should_sudo\n\n echo \"Removing launchctl service ${service}\"\n\n for should_sudo in \"${booleans[@]}\"; do\n plist_status=$(launchctl list \"${service}\" 2>/dev/null)\n\n if [[ $plist_status == \\{* ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo launchctl remove \"${service}\"\n else\n launchctl remove \"${service}\"\n fi\n sleep 1\n fi\n\n paths=(\n \"/Library/LaunchAgents/${service}.plist\"\n \"/Library/LaunchDaemons/${service}.plist\"\n )\n\n # if not using sudo, prepend the home directory to the paths\n if [[ $should_sudo == \"false\" ]]; then\n for i in \"${!paths[@]}\"; do\n paths[i]=\"${HOME}${paths[i]}\"\n done\n fi\n\n for path in \"${paths[@]}\"; do\n if [[ -e \"$path\" ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo rm -f -- \"$path\"\n else\n rm -f -- \"$path\"\n fi\n fi\n done\n done\n}\n\nremove_pkg_files() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" remove_receipt_files\n}\n\nremove_receipt_files() {\n local PKGID=\"$1\"\n local PKGINFO VOLUME INSTALL_LOCATION FULL_INSTALL_LOCATION\n\n echo \"pkgutil --pkg-info-plist \\\"$PKGID\\\"\"\n PKGINFO=$(pkgutil --pkg-info-plist \"$PKGID\")\n VOLUME=$(echo \"$PKGINFO\" | awk '/volume<\\/key>/ {getline; gsub(/.*|<\\/string>.*/, \"\"); print}')\n INSTALL_LOCATION=$(echo \"$PKGINFO\" | awk '/install-location<\\/key>/ {getline; gsub(/.*|<\\/string>.*/, \"\"); print}')\n\n if [ -z \"$INSTALL_LOCATION\" ] || [ \"$INSTALL_LOCATION\" = \"/\" ]; then\n FULL_INSTALL_LOCATION=\"$VOLUME\"\n else\n FULL_INSTALL_LOCATION=\"$VOLUME/$INSTALL_LOCATION\"\n FULL_INSTALL_LOCATION=$(echo \"$FULL_INSTALL_LOCATION\" | sed 's|//|/|g')\n fi\n\n echo \"sudo pkgutil --only-files --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-files --files \"$PKGID\" | sed \"s|^|/${INSTALL_LOCATION}/|\" | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n echo \"sudo pkgutil --only-dirs --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | grep '\\\\.app$' | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-dirs --files \"$PKGID\" | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" | grep '\\.app$' | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n root_app_dir=$(\n sudo pkgutil --only-dirs --files \"$PKGID\" \\\n | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" \\\n | grep 'Applications' \\\n | awk '{ print length, $0 }' \\\n | sort -n \\\n | head -n1 \\\n | cut -d' ' -f2-\n )\n if [ -n \"$root_app_dir\" ]; then\n echo \"sudo rmdir -p \\\"$root_app_dir\\\" 2>/dev/null || :\"\n sudo rmdir -p \"$root_app_dir\" 2>/dev/null || :\n fi\n}\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nremove_launchctl_service 'application.com.hankuper.adlock.desktop.146095782.146095788'\nremove_launchctl_service 'com.hankuper.adlock.desktop.launcher'\nquit_application 'com.hankuper.adlock.desktop'\nremove_pkg_files 'com.hankuper.adlock-desktop-ui.pkg'\nforget_pkg 'com.hankuper.adlock-desktop-ui.pkg'\nremove_pkg_files 'com.hankuper.adlock-resourses.pkg'\nforget_pkg 'com.hankuper.adlock-resourses.pkg'\nsudo rm -rf '/Applications/AdLock.app'\nsudo rm -rf '/Library/Application Support/com.hankuper.adlock.desktop'\nsudo rm -rf '/Library/Logs/DiagnosticReports/com.hankuper.adlock.desktop*.ips'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.hankuper.adlock.desktop.launcher.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.hankuper.adlock.desktop'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.hankuper.adlock.desktop'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.hankuper.adlock.desktop*.plist'\ntrash $LOGGED_IN_USER '~/Library/WebKit/com.hankuper.adlock.desktop'\n", + "ec52d1d9": "#!/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# install pkg files\nquit_and_track_application 'com.hankuper.adlock.desktop'\nsudo installer -pkg \"$TMPDIR/AdLock-Installer.pkg\" -target /\nrelaunch_application 'com.hankuper.adlock.desktop'\n" + } +} diff --git a/ee/maintained-apps/outputs/advanced-renamer/darwin.json b/ee/maintained-apps/outputs/advanced-renamer/darwin.json new file mode 100644 index 0000000000..4dd918ca6e --- /dev/null +++ b/ee/maintained-apps/outputs/advanced-renamer/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "4.23", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.HulubuluSoftware.AdvancedRenamer';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.HulubuluSoftware.AdvancedRenamer' AND version_compare(bundle_short_version, '4.23') < 0);" + }, + "installer_url": "https://www.advancedrenamer.com/down/macos/arm/AdvancedRenamer_4_23.dmg", + "install_script_ref": "6176c798", + "uninstall_script_ref": "e844bc22", + "sha256": "2dac93ad40a4a825b7ef22d6ec099fc8f1edd38520af44521e883c36842fb2da", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "6176c798": "#!/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.HulubuluSoftware.AdvancedRenamer'\nif [ -d \"$APPDIR/Advanced Renamer.app\" ]; then\n\tsudo mv \"$APPDIR/Advanced Renamer.app\" \"$TMPDIR/Advanced Renamer.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Advanced Renamer.app\" \"$APPDIR\"\nrelaunch_application 'com.HulubuluSoftware.AdvancedRenamer'\n", + "e844bc22": "#!/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/Advanced Renamer.app\"\ntrash $LOGGED_IN_USER '~/Library/Caches/com.HulubuluSoftware.AdvancedRenamer'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.HulubuluSoftware.AdvancedRenamer'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.HulubuluSoftware.AdvancedRenamer.savedState'\n" + } +} diff --git a/ee/maintained-apps/outputs/affinity-designer/darwin.json b/ee/maintained-apps/outputs/affinity-designer/darwin.json new file mode 100644 index 0000000000..c991e73236 --- /dev/null +++ b/ee/maintained-apps/outputs/affinity-designer/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "2.6.5", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.seriflabs.affinitydesigner2';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.seriflabs.affinitydesigner2' AND version_compare(bundle_short_version, '2.6.5') < 0);" + }, + "installer_url": "https://affinity-update.s3.amazonaws.com/mac2/retail/Affinity%20Designer%202%20Affinity%20Store%203782.zip", + "install_script_ref": "a74c1958", + "uninstall_script_ref": "8f0b4ab9", + "sha256": "b07e7237ced47fccabd07ed8d1c282c9918bbffbae23a7df5e1c55b2620834f9", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "8f0b4ab9": "#!/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/Affinity Designer 2.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Affinity Designer 2'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.seriflabs.affinitydesigner2'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.seriflabs.affinitydesigner2'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.seriflabs.affinitydesigner2.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.seriflabs.affinitydesigner2.savedState'\ntrash $LOGGED_IN_USER '~/Library/WebKit/com.seriflabs.affinitydesigner2'\n", + "a74c1958": "#!/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.seriflabs.affinitydesigner2'\nif [ -d \"$APPDIR/Affinity Designer 2.app\" ]; then\n\tsudo mv \"$APPDIR/Affinity Designer 2.app\" \"$TMPDIR/Affinity Designer 2.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Affinity Designer 2.app\" \"$APPDIR\"\nrelaunch_application 'com.seriflabs.affinitydesigner2'\n" + } +} diff --git a/ee/maintained-apps/outputs/affinity-designer@1/darwin.json b/ee/maintained-apps/outputs/affinity-designer@1/darwin.json new file mode 100644 index 0000000000..f9babf52bb --- /dev/null +++ b/ee/maintained-apps/outputs/affinity-designer@1/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "1.10.8", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.seriflabs.affinitydesigner';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.seriflabs.affinitydesigner' AND version_compare(bundle_short_version, '1.10.8') < 0);" + }, + "installer_url": "https://affinity-update.s3.amazonaws.com/mac/retail/Affinity%20Designer-1.10.8.app.zip", + "install_script_ref": "86ee1ced", + "uninstall_script_ref": "e1335ca6", + "sha256": "7c3d9ce7e42dd8f3b3cf7f37aaffde3a59f33087007b9a2c81d86baceaa39ef6", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "86ee1ced": "#!/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.seriflabs.affinitydesigner'\nif [ -d \"$APPDIR/Affinity Designer.app\" ]; then\n\tsudo mv \"$APPDIR/Affinity Designer.app\" \"$TMPDIR/Affinity Designer.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Affinity Designer.app\" \"$APPDIR\"\nrelaunch_application 'com.seriflabs.affinitydesigner'\n", + "e1335ca6": "#!/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/Affinity Designer.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Affinity Designer'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.seriflabs.affinitydesigner'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.seriflabs.affinitydesigner.savedState'\n" + } +} diff --git a/ee/maintained-apps/outputs/affinity-photo/darwin.json b/ee/maintained-apps/outputs/affinity-photo/darwin.json new file mode 100644 index 0000000000..5ef304cc33 --- /dev/null +++ b/ee/maintained-apps/outputs/affinity-photo/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "2.6.5", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.seriflabs.affinityphoto2';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.seriflabs.affinityphoto2' AND version_compare(bundle_short_version, '2.6.5') < 0);" + }, + "installer_url": "https://affinity-update.s3.amazonaws.com/mac2/retail/Affinity%20Photo%202%20Affinity%20Store%203782.zip", + "install_script_ref": "494c4b46", + "uninstall_script_ref": "a950df54", + "sha256": "8ea03dfac76cebe9eeceef996ac585813b47624217c3f23e6921cbd9580a0788", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "494c4b46": "#!/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.seriflabs.affinityphoto2'\nif [ -d \"$APPDIR/Affinity Photo 2.app\" ]; then\n\tsudo mv \"$APPDIR/Affinity Photo 2.app\" \"$TMPDIR/Affinity Photo 2.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Affinity Photo 2.app\" \"$APPDIR\"\nrelaunch_application 'com.seriflabs.affinityphoto2'\n", + "a950df54": "#!/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/Affinity Photo 2.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Affinity Photo 2'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.seriflabs.affinityphoto2'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.seriflabs.affinityphoto2'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.seriflabs.affinityphoto2.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.seriflabs.affinityphoto2.savedState'\ntrash $LOGGED_IN_USER '~/Library/WebKit/com.seriflabs.affinityphoto2'\n" + } +} diff --git a/ee/maintained-apps/outputs/affinity-photo@1/darwin.json b/ee/maintained-apps/outputs/affinity-photo@1/darwin.json new file mode 100644 index 0000000000..e81ed918de --- /dev/null +++ b/ee/maintained-apps/outputs/affinity-photo@1/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "1.10.8", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.seriflabs.affinityphoto';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.seriflabs.affinityphoto' AND version_compare(bundle_short_version, '1.10.8') < 0);" + }, + "installer_url": "https://affinity-update.s3.amazonaws.com/mac/retail/Affinity%20Photo-1.10.8.app.zip", + "install_script_ref": "4433ad15", + "uninstall_script_ref": "8cd18b1a", + "sha256": "02b1f30f890ae58cab9fa8bf9a509f4a9d8ad8c09de79baf499cd6f6fdd5bfb1", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "4433ad15": "#!/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.seriflabs.affinityphoto'\nif [ -d \"$APPDIR/Affinity Photo.app\" ]; then\n\tsudo mv \"$APPDIR/Affinity Photo.app\" \"$TMPDIR/Affinity Photo.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Affinity Photo.app\" \"$APPDIR\"\nrelaunch_application 'com.seriflabs.affinityphoto'\n", + "8cd18b1a": "#!/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/Affinity Photo.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Affinity Photo'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.seriflabs.affinityphoto'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.seriflabs.affinityphoto.savedState'\n" + } +} diff --git a/ee/maintained-apps/outputs/affinity-publisher/darwin.json b/ee/maintained-apps/outputs/affinity-publisher/darwin.json new file mode 100644 index 0000000000..93fb82de0c --- /dev/null +++ b/ee/maintained-apps/outputs/affinity-publisher/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "2.6.5", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.seriflabs.affinitypublisher2';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.seriflabs.affinitypublisher2' AND version_compare(bundle_short_version, '2.6.5') < 0);" + }, + "installer_url": "https://affinity-update.s3.amazonaws.com/mac2/retail/Affinity%20Publisher%202%20Affinity%20Store%203782.zip", + "install_script_ref": "76c7f1e0", + "uninstall_script_ref": "1aaa3570", + "sha256": "06b9628d108e7ecee5a2c4b3d607ba58996d5cdef4ef83a76195db48c1df9efa", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "1aaa3570": "#!/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/Affinity Publisher 2.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Affinity Publisher 2'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.seriflabs.affinitypublisher2'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.seriflabs.affinitypublisher2'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.seriflabs.affinitypublisher2.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.seriflabs.affinitypublisher2.savedState'\ntrash $LOGGED_IN_USER '~/Library/WebKit/com.seriflabs.affinitypublisher2'\n", + "76c7f1e0": "#!/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.seriflabs.affinitypublisher2'\nif [ -d \"$APPDIR/Affinity Publisher 2.app\" ]; then\n\tsudo mv \"$APPDIR/Affinity Publisher 2.app\" \"$TMPDIR/Affinity Publisher 2.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Affinity Publisher 2.app\" \"$APPDIR\"\nrelaunch_application 'com.seriflabs.affinitypublisher2'\n" + } +} diff --git a/ee/maintained-apps/outputs/affinity-publisher@1/darwin.json b/ee/maintained-apps/outputs/affinity-publisher@1/darwin.json new file mode 100644 index 0000000000..0c3dc50cb4 --- /dev/null +++ b/ee/maintained-apps/outputs/affinity-publisher@1/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "1.10.8", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.seriflabs.affinitypublisher';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.seriflabs.affinitypublisher' AND version_compare(bundle_short_version, '1.10.8') < 0);" + }, + "installer_url": "https://affinity-update.s3.amazonaws.com/mac/retail/Affinity%20Publisher-1.10.8.app.zip", + "install_script_ref": "3be86f9a", + "uninstall_script_ref": "0f402e8a", + "sha256": "6d5675970b745775bd5c35d28d20e1c68fe0771cdc2c17161f6762c2730a1278", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "0f402e8a": "#!/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/Affinity Publisher.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Affinity Publisher'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.seriflabs.affinitypublisher'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.seriflabs.affinitypublisher.savedState'\n", + "3be86f9a": "#!/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.seriflabs.affinitypublisher'\nif [ -d \"$APPDIR/Affinity Publisher.app\" ]; then\n\tsudo mv \"$APPDIR/Affinity Publisher.app\" \"$TMPDIR/Affinity Publisher.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Affinity Publisher.app\" \"$APPDIR\"\nrelaunch_application 'com.seriflabs.affinitypublisher'\n" + } +} diff --git a/ee/maintained-apps/outputs/airbuddy/darwin.json b/ee/maintained-apps/outputs/airbuddy/darwin.json new file mode 100644 index 0000000000..68c59c8d27 --- /dev/null +++ b/ee/maintained-apps/outputs/airbuddy/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "2.8.1", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'codes.rambo.AirBuddy';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'codes.rambo.AirBuddy' AND version_compare(bundle_short_version, '2.8.1') < 0);" + }, + "installer_url": "https://su.airbuddy.app/kCRSAmcjBc/AirBuddy_v2.8.1-660.dmg", + "install_script_ref": "821a79ce", + "uninstall_script_ref": "a18b7e7a", + "sha256": "61e3b5ce63d1345e3a126b91a75e3627d491bd6cc7ada5abd7e56eaad849cec4", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "821a79ce": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'codes.rambo.AirBuddy'\nif [ -d \"$APPDIR/AirBuddy.app\" ]; then\n\tsudo mv \"$APPDIR/AirBuddy.app\" \"$TMPDIR/AirBuddy.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/AirBuddy.app\" \"$APPDIR\"\nrelaunch_application 'codes.rambo.AirBuddy'\n", + "a18b7e7a": "#!/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/AirBuddy.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/codes.rambo.AirBuddy*'\ntrash $LOGGED_IN_USER '~/Library/Caches/codes.rambo.AirBuddy'\ntrash $LOGGED_IN_USER '~/Library/Caches/codes.rambo.AirCore'\ntrash $LOGGED_IN_USER '~/Library/Containers/codes.rambo.AirBuddy*'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/*.group.codes.rambo.AirBuddy'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/codes.rambo.AirBuddy.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/LaunchAgents/codes.rambo.AirBuddyHelper.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/codes.rambo.AirBuddy.plist'\ntrash $LOGGED_IN_USER '~/Library/SyncedPreferences/codes.rambo.AirBuddy.plist'\ntrash $LOGGED_IN_USER '~/Library/SyncedPreferences/com.apple.kvs/ChangeTokens/NoEncryption/AirBuddy'\n" + } +} diff --git a/ee/maintained-apps/outputs/airdroid/darwin.json b/ee/maintained-apps/outputs/airdroid/darwin.json new file mode 100644 index 0000000000..d68f2c9890 --- /dev/null +++ b/ee/maintained-apps/outputs/airdroid/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "3.7.3.1", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.sandstudio.airdroid';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.sandstudio.airdroid' AND version_compare(bundle_short_version, '3.7.3.1') < 0);" + }, + "installer_url": "https://dl.airdroid.com/AirDroid_Desktop_Client_3.7.3.1.dmg", + "install_script_ref": "14840e1a", + "uninstall_script_ref": "0e745983", + "sha256": "f0d8199dedc6daa3a93ca672d5e1c8d33554b07bc7371ba4538802926ea1acba", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "0e745983": "#!/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/AirDroid.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/AirDroid'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.sandstudio.airdroid'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.sandstudio.airdroid'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.sandstudio.airdroid.savedState'\ntrash $LOGGED_IN_USER '~/Library/WebKit/Databases/___IndexedDB/com.sandstudio.airdroid'\n", + "14840e1a": "#!/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.sandstudio.airdroid'\nif [ -d \"$APPDIR/AirDroid.app\" ]; then\n\tsudo mv \"$APPDIR/AirDroid.app\" \"$TMPDIR/AirDroid.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/AirDroid.app\" \"$APPDIR\"\nrelaunch_application 'com.sandstudio.airdroid'\n" + } +} diff --git a/ee/maintained-apps/outputs/airparrot/darwin.json b/ee/maintained-apps/outputs/airparrot/darwin.json new file mode 100644 index 0000000000..853a9515c9 --- /dev/null +++ b/ee/maintained-apps/outputs/airparrot/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "3.1.7", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.squirrels.AirParrot-3';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.squirrels.AirParrot-3' AND version_compare(bundle_short_version, '3.1.7') < 0);" + }, + "installer_url": "https://download.airsquirrels.com/AirParrot3/Mac/AirParrot-3.1.7.dmg", + "install_script_ref": "81749f4f", + "uninstall_script_ref": "cc28f4b8", + "sha256": "acb42bb53c1dfde1fec6835fd8fd89a278b215a97f1e08545e45780cebb19409", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "81749f4f": "#!/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.squirrels.AirParrot-3'\nif [ -d \"$APPDIR/AirParrot 3.app\" ]; then\n\tsudo mv \"$APPDIR/AirParrot 3.app\" \"$TMPDIR/AirParrot 3.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/AirParrot 3.app\" \"$APPDIR\"\nrelaunch_application 'com.squirrels.AirParrot-3'\n", + "cc28f4b8": "#!/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.squirrels.AirParrot-3'\nsudo rm -rf \"$APPDIR/AirParrot 3.app\"\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.squirrels.AirParrot-*.plist'\n" + } +} diff --git a/ee/maintained-apps/outputs/airserver/darwin.json b/ee/maintained-apps/outputs/airserver/darwin.json new file mode 100644 index 0000000000..0c4c43eb59 --- /dev/null +++ b/ee/maintained-apps/outputs/airserver/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "7.3.3", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.pratikkumar.airserver-mac';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.pratikkumar.airserver-mac' AND version_compare(bundle_short_version, '7.3.3') < 0);" + }, + "installer_url": "https://dl.airserver.com/mac/AirServer-7.3.3.dmg", + "install_script_ref": "2c88b93c", + "uninstall_script_ref": "8ac2c4c2", + "sha256": "e8a6ecd95e5ce8fa1ec92e6107c737e7c3c3ef5eaff6f32cadf1ffa7515faeb0", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "2c88b93c": "#!/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.pratikkumar.airserver-mac'\nif [ -d \"$APPDIR/AirServer.app\" ]; then\n\tsudo mv \"$APPDIR/AirServer.app\" \"$TMPDIR/AirServer.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/AirServer.app\" \"$APPDIR\"\nrelaunch_application 'com.pratikkumar.airserver-mac'\n", + "8ac2c4c2": "#!/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/AirServer.app\"\ntrash $LOGGED_IN_USER '~/Library/Caches/com.pratikkumar.airserver-mac'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.pratikkumar.airserver-mac.AirServer.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.pratikkumar.airserver-mac.plist'\n" + } +} diff --git a/ee/maintained-apps/outputs/airtable/darwin.json b/ee/maintained-apps/outputs/airtable/darwin.json new file mode 100644 index 0000000000..fff7f90a5e --- /dev/null +++ b/ee/maintained-apps/outputs/airtable/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "1.6.6", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.FormaGrid.Airtable';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.FormaGrid.Airtable' AND version_compare(bundle_short_version, '1.6.6') < 0);" + }, + "installer_url": "https://static.airtable.com/download/macos/Airtable-1.6.6.dmg", + "install_script_ref": "6a001ebb", + "uninstall_script_ref": "7bd924a9", + "sha256": "cc677bb77a76437cf423cb49675bdbb6e54840f1c29ea80d3910f2ed41ceb627", + "default_categories": [ + "Developer tools" + ] + } + ], + "refs": { + "6a001ebb": "#!/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.FormaGrid.Airtable'\nif [ -d \"$APPDIR/Airtable.app\" ]; then\n\tsudo mv \"$APPDIR/Airtable.app\" \"$TMPDIR/Airtable.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Airtable.app\" \"$APPDIR\"\nrelaunch_application 'com.FormaGrid.Airtable'\n", + "7bd924a9": "#!/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.FormaGrid.Airtable'\nsudo rm -rf '/Library/Logs/DiagnosticReports/Airtable*.*_resource.diag'\nsudo rm -rf \"$APPDIR/Airtable.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Airtable'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.FormaGrid.Airtable*'\ntrash $LOGGED_IN_USER '~/Library/Cookies/com.FormaGrid.Airtable.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.FormaGrid.Airtable*'\ntrash $LOGGED_IN_USER '~/Library/Logs/Airtable'\ntrash $LOGGED_IN_USER '~/Library/Preferences/ByHost/com.FormaGrid.Airtable.ShipIt.*.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.FormaGrid.Airtable*.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.FormaGrid.Airtable.savedState'\n" + } +} diff --git a/ee/maintained-apps/outputs/airy/darwin.json b/ee/maintained-apps/outputs/airy/darwin.json new file mode 100644 index 0000000000..f082e6a569 --- /dev/null +++ b/ee/maintained-apps/outputs/airy/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "3.29.2", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.eltima.Airy';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.eltima.Airy' AND version_compare(bundle_short_version, '3.29.2') < 0);" + }, + "installer_url": "https://cdn.airy-youtube-downloader.com/products/airy/mac/download/airy.dmg", + "install_script_ref": "7bf9a353", + "uninstall_script_ref": "9b5d653f", + "sha256": "no_check", + "default_categories": [ + "Developer tools" + ] + } + ], + "refs": { + "7bf9a353": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'com.eltima.Airy'\nif [ -d \"$APPDIR/Airy.app\" ]; then\n\tsudo mv \"$APPDIR/Airy.app\" \"$TMPDIR/Airy.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Airy.app\" \"$APPDIR\"\nrelaunch_application 'com.eltima.Airy'\n", + "9b5d653f": "#!/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.eltima.Airy'\nsudo rm -rf \"$APPDIR/Airy.app\"\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.eltima.Airy.plist'\n" + } +} diff --git a/ee/maintained-apps/outputs/akiflow/darwin.json b/ee/maintained-apps/outputs/akiflow/darwin.json new file mode 100644 index 0000000000..f3f0abf2b5 --- /dev/null +++ b/ee/maintained-apps/outputs/akiflow/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "2.74.21", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.akiflow.akiflow';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.akiflow.akiflow' AND version_compare(bundle_short_version, '2.74.21') < 0);" + }, + "installer_url": "https://download.akiflow.com/builds/Akiflow-2.74.21-d6d9f817-universal.dmg", + "install_script_ref": "19097683", + "uninstall_script_ref": "9d10ecef", + "sha256": "41a5c10cd9118e2ff3acdfc372b3e2cdcf2b6af7e7822c0f3cf13458d340eee7", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "19097683": "#!/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.akiflow.akiflow'\nif [ -d \"$APPDIR/Akiflow.app\" ]; then\n\tsudo mv \"$APPDIR/Akiflow.app\" \"$TMPDIR/Akiflow.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Akiflow.app\" \"$APPDIR\"\nrelaunch_application 'com.akiflow.akiflow'\n", + "9d10ecef": "#!/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/Akiflow.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Akiflow'\ntrash $LOGGED_IN_USER '~/Library/Preferences/Akiflow'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.akiflow.akiflow.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.akiflow.akiflow.savedState'\n" + } +} diff --git a/ee/maintained-apps/outputs/alcove/darwin.json b/ee/maintained-apps/outputs/alcove/darwin.json new file mode 100644 index 0000000000..b957b34eff --- /dev/null +++ b/ee/maintained-apps/outputs/alcove/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "1.7.2", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.henrikruscon.Alcove';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.henrikruscon.Alcove' AND version_compare(bundle_short_version, '1.7.2') < 0);" + }, + "installer_url": "https://github.com/henrikruscon/alcove-releases/releases/download/1.7.2/Alcove.zip", + "install_script_ref": "bdb62bd2", + "uninstall_script_ref": "61446eae", + "sha256": "83357f05d2edd1c978f7470f1cf2b943a4b81d168723f7b8cdc39d9ccf8c5588", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "61446eae": "#!/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/Alcove.app\"\ntrash $LOGGED_IN_USER '~/Library/Caches/com.henrikruscon.Alcove'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.henrikruscon.Alcove'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.henrikruscon.Alcove.plist'\n", + "bdb62bd2": "#!/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.henrikruscon.Alcove'\nif [ -d \"$APPDIR/Alcove.app\" ]; then\n\tsudo mv \"$APPDIR/Alcove.app\" \"$TMPDIR/Alcove.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Alcove.app\" \"$APPDIR\"\nrelaunch_application 'com.henrikruscon.Alcove'\n" + } +} diff --git a/ee/maintained-apps/outputs/aldente/darwin.json b/ee/maintained-apps/outputs/aldente/darwin.json new file mode 100644 index 0000000000..cf27b15dc8 --- /dev/null +++ b/ee/maintained-apps/outputs/aldente/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "1.37.3", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.apphousekitchen.aldente-pro';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.apphousekitchen.aldente-pro' AND version_compare(bundle_short_version, '1.37.3') < 0);" + }, + "installer_url": "https://apphousekitchen.com/aldente/AlDente1.37.3.dmg", + "install_script_ref": "5e5ca0a4", + "uninstall_script_ref": "7abc4904", + "sha256": "468ac2c11f1d3310e4e9a3c68d32bc8d514282c63d6d2e189f469415a468bdee", + "default_categories": [ + "Utilities" + ] + } + ], + "refs": { + "5e5ca0a4": "#!/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.apphousekitchen.aldente-pro'\nif [ -d \"$APPDIR/AlDente.app\" ]; then\n\tsudo mv \"$APPDIR/AlDente.app\" \"$TMPDIR/AlDente.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/AlDente.app\" \"$APPDIR\"\nrelaunch_application 'com.apphousekitchen.aldente-pro'\n", + "7abc4904": "#!/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.apphousekitchen.aldente-pro.helper'\nquit_application 'com.apphousekitchen.aldente-pro'\nsudo rm -rf '/Library/PrivilegedHelperTools/com.apphousekitchen.aldente-pro.helper'\nsudo rm -rf \"$APPDIR/AlDente.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/AlDente'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.apphousekitchen.aldente-pro'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.apphousekitchen.aldente-pro'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.apphousekitchen.aldente-pro.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.apphousekitchen.aldente-pro.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.apphousekitchen.aldente-pro_backup.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.apphousekitchen.aldente-pro_stats.sqlite3'\n" + } +} diff --git a/ee/maintained-apps/outputs/alloy/darwin.json b/ee/maintained-apps/outputs/alloy/darwin.json new file mode 100644 index 0000000000..ccf942b804 --- /dev/null +++ b/ee/maintained-apps/outputs/alloy/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "6.2.0", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'org.alloytools.alloy';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'org.alloytools.alloy' AND version_compare(bundle_short_version, '6.2.0') < 0);" + }, + "installer_url": "https://github.com/AlloyTools/org.alloytools.alloy/releases/download/v6.2.0/alloy-6.2.0-mac-aarch64.zip", + "install_script_ref": "16a05348", + "uninstall_script_ref": "39d0e06a", + "sha256": "d7ce578954e24f8faa81bd8ad4fb56dd146555a39740fed3ef8c9d34a7333f63", + "default_categories": [ + "Developer tools" + ] + } + ], + "refs": { + "16a05348": "#!/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.alloytools.alloy'\nif [ -d \"$APPDIR/Alloy.app\" ]; then\n\tsudo mv \"$APPDIR/Alloy.app\" \"$TMPDIR/Alloy.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Alloy.app\" \"$APPDIR\"\nrelaunch_application 'org.alloytools.alloy'\n", + "39d0e06a": "#!/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/Alloy.app\"\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/org.alloytools.alloy.savedState'\n" + } +} diff --git a/ee/maintained-apps/outputs/alt-tab/darwin.json b/ee/maintained-apps/outputs/alt-tab/darwin.json new file mode 100644 index 0000000000..6aaa342b76 --- /dev/null +++ b/ee/maintained-apps/outputs/alt-tab/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "11.3.0", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.lwouis.alt-tab-macos';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.lwouis.alt-tab-macos' AND version_compare(bundle_short_version, '11.3.0') < 0);" + }, + "installer_url": "https://github.com/lwouis/alt-tab-macos/releases/download/v11.3.0/AltTab-11.3.0.zip", + "install_script_ref": "b04664c1", + "uninstall_script_ref": "2cc2914b", + "sha256": "5b28c3b26d29c1ccbd1f110736d6100378a89d242fd7c797a3603592cc92c8aa", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "2cc2914b": "#!/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.lwouis.alt-tab-macos'\nsudo rm -rf \"$APPDIR/AltTab.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.lwouis.alt-tab-macos'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.lwouis.alt-tab-macos'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.plausiblelabs.crashreporter.data/com.lwouis.alt-tab-macos'\ntrash $LOGGED_IN_USER '~/Library/Cookies/com.lwouis.alt-tab-macos.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.lwouis.alt-tab-macos'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.lwouis.alt-tab-macos.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/LaunchAgents/com.lwouis.alt-tab-macos.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.lwouis.alt-tab-macos.license.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.lwouis.alt-tab-macos.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.lwouis.alt-tab-macos.usage.plist'\n", + "b04664c1": "#!/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.lwouis.alt-tab-macos'\nif [ -d \"$APPDIR/AltTab.app\" ]; then\n\tsudo mv \"$APPDIR/AltTab.app\" \"$TMPDIR/AltTab.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/AltTab.app\" \"$APPDIR\"\nrelaunch_application 'com.lwouis.alt-tab-macos'\n" + } +} diff --git a/ee/maintained-apps/outputs/altair-graphql-client/darwin.json b/ee/maintained-apps/outputs/altair-graphql-client/darwin.json new file mode 100644 index 0000000000..c1f4c4ddb2 --- /dev/null +++ b/ee/maintained-apps/outputs/altair-graphql-client/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "8.5.7", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.xkoji.altair';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.xkoji.altair' AND version_compare(bundle_short_version, '8.5.7') < 0);" + }, + "installer_url": "https://github.com/imolorhe/altair/releases/download/v8.5.7/altair_8.5.7_arm64_mac.zip", + "install_script_ref": "cb73b214", + "uninstall_script_ref": "c196066e", + "sha256": "bf62986cbc4a481942a37d555a4b052252acddc45640ea406eb2fce96b33db1d", + "default_categories": [ + "Developer tools" + ] + } + ], + "refs": { + "c196066e": "#!/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/Altair GraphQL Client.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/altair'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.electron.altair.helper.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.electron.altair.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.electron.altair.savedState'\n", + "cb73b214": "#!/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.xkoji.altair'\nif [ -d \"$APPDIR/Altair GraphQL Client.app\" ]; then\n\tsudo mv \"$APPDIR/Altair GraphQL Client.app\" \"$TMPDIR/Altair GraphQL Client.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Altair GraphQL Client.app\" \"$APPDIR\"\nrelaunch_application 'com.xkoji.altair'\n" + } +} diff --git a/ee/maintained-apps/outputs/amadeus-pro/darwin.json b/ee/maintained-apps/outputs/amadeus-pro/darwin.json new file mode 100644 index 0000000000..cbba354655 --- /dev/null +++ b/ee/maintained-apps/outputs/amadeus-pro/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "2.8.14", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.HairerSoft.AmadeusPro';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.HairerSoft.AmadeusPro' AND version_compare(bundle_short_version, '2.8.14') < 0);" + }, + "installer_url": "https://s3.amazonaws.com/AmadeusPro2/AmadeusPro.zip", + "install_script_ref": "580f9506", + "uninstall_script_ref": "59c96f5e", + "sha256": "no_check", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "580f9506": "#!/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.HairerSoft.AmadeusPro'\nif [ -d \"$APPDIR/Amadeus Pro.app\" ]; then\n\tsudo mv \"$APPDIR/Amadeus Pro.app\" \"$TMPDIR/Amadeus Pro.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Amadeus Pro.app\" \"$APPDIR\"\nrelaunch_application 'com.HairerSoft.AmadeusPro'\n", + "59c96f5e": "#!/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/Amadeus Pro.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Amadeus Pro'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.HairerSoft.AmadeusPro'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.HairerSoft.AmadeusPro'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.HairerSoft.AmadeusPro.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.HairerSoft.AmadeusPro.savedState'\n" + } +} diff --git a/ee/maintained-apps/outputs/amadine/darwin.json b/ee/maintained-apps/outputs/amadine/darwin.json new file mode 100644 index 0000000000..79a6b9a0f3 --- /dev/null +++ b/ee/maintained-apps/outputs/amadine/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "1.8.2", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.belightsoft.Amadine';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.belightsoft.Amadine' AND version_compare(bundle_short_version, '1.8.2') < 0);" + }, + "installer_url": "https://belightsoft.s3.amazonaws.com/Amadine.dmg", + "install_script_ref": "88bf1cb8", + "uninstall_script_ref": "b09fd8fc", + "sha256": "no_check", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "88bf1cb8": "#!/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.belightsoft.Amadine'\nif [ -d \"$APPDIR/Amadine.app\" ]; then\n\tsudo mv \"$APPDIR/Amadine.app\" \"$TMPDIR/Amadine.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Amadine.app\" \"$APPDIR\"\nrelaunch_application 'com.belightsoft.Amadine'\n", + "b09fd8fc": "#!/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/Amadine.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Amadine'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.belightsoft.Amadine'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.belightsoft.Amadine.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.belightsoft.Amadine.savedState'\n" + } +} diff --git a/ee/maintained-apps/outputs/amethyst/darwin.json b/ee/maintained-apps/outputs/amethyst/darwin.json new file mode 100644 index 0000000000..d83aff6ee8 --- /dev/null +++ b/ee/maintained-apps/outputs/amethyst/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "0.24.3", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.amethyst.Amethyst';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.amethyst.Amethyst' AND version_compare(bundle_short_version, '0.24.3') < 0);" + }, + "installer_url": "https://github.com/ianyh/Amethyst/releases/download/v0.24.3/Amethyst.zip", + "install_script_ref": "6e282b1b", + "uninstall_script_ref": "7a06731b", + "sha256": "442d2b9fe53f8062051dd63e5d01512ed2020c78cbdbe4f93ecf30290a5b0302", + "default_categories": [ + "Utilities" + ] + } + ], + "refs": { + "6e282b1b": "#!/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.amethyst.Amethyst'\nif [ -d \"$APPDIR/Amethyst.app\" ]; then\n\tsudo mv \"$APPDIR/Amethyst.app\" \"$TMPDIR/Amethyst.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Amethyst.app\" \"$APPDIR\"\nrelaunch_application 'com.amethyst.Amethyst'\n", + "7a06731b": "#!/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/Amethyst.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Amethyst'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.amethyst.amethyst.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.amethyst.Amethyst'\ntrash $LOGGED_IN_USER '~/Library/Cookies/com.amethyst.Amethyst.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.amethyst.Amethyst'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.amethyst.Amethyst.plist'\n" + } +} diff --git a/ee/maintained-apps/outputs/amie/darwin.json b/ee/maintained-apps/outputs/amie/darwin.json new file mode 100644 index 0000000000..08001f086c --- /dev/null +++ b/ee/maintained-apps/outputs/amie/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "260216.1.0", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'so.amie.electron-app';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'so.amie.electron-app' AND version_compare(bundle_short_version, '260216.1.0') < 0);" + }, + "installer_url": "https://github.com/amieso/electron-releases/releases/download/v260216.1.0/Amie-260216.1.0-arm64-mac.zip", + "install_script_ref": "b75e60b7", + "uninstall_script_ref": "44125419", + "sha256": "1743f22688fe546d080f78d6147ed624f9206ff6e59a22a8a18cfd6607f0e904", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "44125419": "#!/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/Amie.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/amie-desktop'\ntrash $LOGGED_IN_USER '~/Library/Caches/amie-desktop'\ntrash $LOGGED_IN_USER '~/Library/Logs/amie-desktop'\ntrash $LOGGED_IN_USER '~/Library/Preferences/so.amie.electron-app.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/so.amie.electron-app.savedState'\n", + "b75e60b7": "#!/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 'so.amie.electron-app'\nif [ -d \"$APPDIR/Amie.app\" ]; then\n\tsudo mv \"$APPDIR/Amie.app\" \"$TMPDIR/Amie.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Amie.app\" \"$APPDIR\"\nrelaunch_application 'so.amie.electron-app'\n" + } +} diff --git a/ee/maintained-apps/outputs/angry-ip-scanner/darwin.json b/ee/maintained-apps/outputs/angry-ip-scanner/darwin.json new file mode 100644 index 0000000000..a173c7db82 --- /dev/null +++ b/ee/maintained-apps/outputs/angry-ip-scanner/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "3.9.3", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'net.azib.ipscan';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'net.azib.ipscan' AND version_compare(bundle_short_version, '3.9.3') < 0);" + }, + "installer_url": "https://github.com/angryip/ipscan/releases/download/3.9.3/ipscan-macArm64-3.9.3.zip", + "install_script_ref": "2a9d26ac", + "uninstall_script_ref": "bbdeb78d", + "sha256": "e8997d2ff12f7322ecb3dd0b4c4a410187aa8a26ad89772c833af6de781dfd29", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "2a9d26ac": "#!/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 'net.azib.ipscan'\nif [ -d \"$APPDIR/Angry IP Scanner.app\" ]; then\n\tsudo mv \"$APPDIR/Angry IP Scanner.app\" \"$TMPDIR/Angry IP Scanner.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Angry IP Scanner.app\" \"$APPDIR\"\nrelaunch_application 'net.azib.ipscan'\n", + "bbdeb78d": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\n\nsudo rm -rf \"$APPDIR/Angry IP Scanner.app\"\n" + } +} diff --git a/ee/maintained-apps/outputs/antinote/darwin.json b/ee/maintained-apps/outputs/antinote/darwin.json new file mode 100644 index 0000000000..ce918149b4 --- /dev/null +++ b/ee/maintained-apps/outputs/antinote/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "1.1.7", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.chabomakers.Antinote';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.chabomakers.Antinote' AND version_compare(bundle_short_version, '1.1.7') < 0);" + }, + "installer_url": "https://antinote.io/updates/Antinote_1.1.7.dmg", + "install_script_ref": "2f52f766", + "uninstall_script_ref": "2d505ef1", + "sha256": "f0a900697929d981ba2ab1aaa7b538a232d895ff53e38d42e1e6c9b9a769e7e5", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "2d505ef1": "#!/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/Antinote.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.chabomakers.Antinote'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.chabomakers.Antinote'\n", + "2f52f766": "#!/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.chabomakers.Antinote'\nif [ -d \"$APPDIR/Antinote.app\" ]; then\n\tsudo mv \"$APPDIR/Antinote.app\" \"$TMPDIR/Antinote.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Antinote.app\" \"$APPDIR\"\nrelaunch_application 'com.chabomakers.Antinote'\n" + } +} diff --git a/ee/maintained-apps/outputs/anydo/darwin.json b/ee/maintained-apps/outputs/anydo/darwin.json new file mode 100644 index 0000000000..1667195fea --- /dev/null +++ b/ee/maintained-apps/outputs/anydo/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "5.0.68", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.anydo.mac';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.anydo.mac' AND version_compare(bundle_short_version, '5.0.68') < 0);" + }, + "installer_url": "https://electron-app.any.do/Anydo-5.0.68-universal.dmg", + "install_script_ref": "0ff909cc", + "uninstall_script_ref": "f03c6bf3", + "sha256": "3906b4b436d23105988c22a1ba7936f7ede08be9747256a2e622338c1c846c4a", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "0ff909cc": "#!/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.anydo.mac'\nif [ -d \"$APPDIR/Anydo.app\" ]; then\n\tsudo mv \"$APPDIR/Anydo.app\" \"$TMPDIR/Anydo.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Anydo.app\" \"$APPDIR\"\nrelaunch_application 'com.anydo.mac'\n", + "f03c6bf3": "#!/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/Anydo.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/@anydo'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.anydo.mac.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.anydo.mac.savedState'\n" + } +} diff --git a/ee/maintained-apps/outputs/anytype/darwin.json b/ee/maintained-apps/outputs/anytype/darwin.json new file mode 100644 index 0000000000..9025a597d4 --- /dev/null +++ b/ee/maintained-apps/outputs/anytype/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "0.55.5", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.anytype.anytype';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.anytype.anytype' AND version_compare(bundle_short_version, '0.55.5') < 0);" + }, + "installer_url": "https://anytype-release.fra1.cdn.digitaloceanspaces.com/Anytype-0.55.5-mac-arm64.dmg", + "install_script_ref": "0969d326", + "uninstall_script_ref": "9bb6a998", + "sha256": "edfea4e1984e0056f15101158de73176081fcceaf3c5429f7c262b620cca869c", + "default_categories": [ + "Security" + ] + } + ], + "refs": { + "0969d326": "#!/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.anytype.anytype'\nif [ -d \"$APPDIR/Anytype.app\" ]; then\n\tsudo mv \"$APPDIR/Anytype.app\" \"$TMPDIR/Anytype.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Anytype.app\" \"$APPDIR\"\nrelaunch_application 'com.anytype.anytype'\n", + "9bb6a998": "#!/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/Anytype.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/anytype'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Chromium/NativeMessagingHosts/com.anytype.desktop.json'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.anytype.anytype.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Google/Chrome Beta/NativeMessagingHosts/com.anytype.desktop.json'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Google/Chrome Canary/NativeMessagingHosts/com.anytype.desktop.json'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Google/Chrome Dev/NativeMessagingHosts/com.anytype.desktop.json'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Google/Chrome/NativeMessagingHosts/com.anytype.desktop.json'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Microsoft Edge Beta/NativeMessagingHosts/com.anytype.desktop.json'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Microsoft Edge Canary/NativeMessagingHosts/com.anytype.desktop.json'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Microsoft Edge Dev/NativeMessagingHosts/com.anytype.desktop.json'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Microsoft Edge/NativeMessagingHosts/com.anytype.desktop.json'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Mozilla/NativeMessagingHosts/com.anytype.desktop.json'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Vivaldi/NativeMessagingHosts/com.anytype.desktop.json'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.anytype.anytype.plist'\n" + } +} diff --git a/ee/maintained-apps/outputs/apidog/darwin.json b/ee/maintained-apps/outputs/apidog/darwin.json new file mode 100644 index 0000000000..660fc31aa0 --- /dev/null +++ b/ee/maintained-apps/outputs/apidog/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "2.8.33", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.apidog.app';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.apidog.app' AND version_compare(bundle_short_version, '2.8.33') < 0);" + }, + "installer_url": "https://file-assets.apidog.com/download/2.8.33/legacy-Apidog-macOS-arm64-2.8.33.dmg", + "install_script_ref": "164bc8ef", + "uninstall_script_ref": "b51190cf", + "sha256": "515dfd14fa43d997040353f18e501465ad672f1ecf323368d408b296bbb804ab", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "164bc8ef": "#!/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.apidog.app'\nif [ -d \"$APPDIR/Apidog.app\" ]; then\n\tsudo mv \"$APPDIR/Apidog.app\" \"$TMPDIR/Apidog.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Apidog.app\" \"$APPDIR\"\nrelaunch_application 'com.apidog.app'\n", + "b51190cf": "#!/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/Apidog.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/apidog'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.apidog.app.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.apidog.app.savedState'\n" + } +} diff --git a/ee/maintained-apps/outputs/app-fair/darwin.json b/ee/maintained-apps/outputs/app-fair/darwin.json new file mode 100644 index 0000000000..e4f9a4af04 --- /dev/null +++ b/ee/maintained-apps/outputs/app-fair/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "0.8.137", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'app.App-Fair';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'app.App-Fair' AND version_compare(bundle_short_version, '0.8.137') < 0);" + }, + "installer_url": "https://github.com/App-Fair/App/releases/download/0.8.137/App-Fair-macOS.zip", + "install_script_ref": "29c2c125", + "uninstall_script_ref": "576e1f90", + "sha256": "c4a99410058cef2a3c7ac6bb073cf4cac06fb64f7c597140cbf0958e37fe2480", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "29c2c125": "#!/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 'app.App-Fair'\nif [ -d \"$APPDIR/App Fair.app\" ]; then\n\tsudo mv \"$APPDIR/App Fair.app\" \"$TMPDIR/App Fair.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/App Fair.app\" \"$APPDIR\"\nrelaunch_application 'app.App-Fair'\nmkdir -p .\n/bin/ln -h -f -s -- \"$APPDIR/App Fair.app/Contents/MacOS/App Fair\" \"app-fair\"\n", + "576e1f90": "#!/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/App Fair.app\"\nsudo rm -rf 'app-fair'\nsudo rmdir '/Applications/App Fair'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/app.App-Fair'\ntrash $LOGGED_IN_USER '~/Library/Application Support/app.App-Fair'\ntrash $LOGGED_IN_USER '~/Library/Caches/app.App-Fair'\ntrash $LOGGED_IN_USER '~/Library/Containers/app.App-Fair'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/app.App-Fair'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/app.App-Fair.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/Preferences/app.App-Fair.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/app.App-Fair.savedState'\n" + } +} diff --git a/ee/maintained-apps/outputs/appium-inspector/darwin.json b/ee/maintained-apps/outputs/appium-inspector/darwin.json new file mode 100644 index 0000000000..fa66526e80 --- /dev/null +++ b/ee/maintained-apps/outputs/appium-inspector/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "2026.5.1", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'io.appium.inspector';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'io.appium.inspector' AND version_compare(bundle_short_version, '2026.5.1') < 0);" + }, + "installer_url": "https://github.com/appium/appium-inspector/releases/download/v2026.5.1/Appium-Inspector-2026.5.1-mac-arm64.zip", + "install_script_ref": "b2325803", + "uninstall_script_ref": "84d10064", + "sha256": "e374ad5517d1a4dcac445b3aa56ccdacb23039a974834733ed801b3f55c80af0", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "84d10064": "#!/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/Appium Inspector.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/appium-inspector'\ntrash $LOGGED_IN_USER '~/Library/Logs/Appium Inspector'\ntrash $LOGGED_IN_USER '~/Library/Preferences/io.appium.inspector.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/io.appium.inspector.savedState'\n", + "b2325803": "#!/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.appium.inspector'\nif [ -d \"$APPDIR/Appium Inspector.app\" ]; then\n\tsudo mv \"$APPDIR/Appium Inspector.app\" \"$TMPDIR/Appium Inspector.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Appium Inspector.app\" \"$APPDIR\"\nrelaunch_application 'io.appium.inspector'\n" + } +} diff --git a/ee/maintained-apps/outputs/applite/darwin.json b/ee/maintained-apps/outputs/applite/darwin.json new file mode 100644 index 0000000000..d244698d5e --- /dev/null +++ b/ee/maintained-apps/outputs/applite/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "1.3.1", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'dev.aerolite.Applite';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'dev.aerolite.Applite' AND version_compare(bundle_short_version, '1.3.1') < 0);" + }, + "installer_url": "https://github.com/milanvarady/Applite/releases/download/v1.3.1/Applite.dmg", + "install_script_ref": "35c015ed", + "uninstall_script_ref": "ef83f643", + "sha256": "7c2972f21f373c1f64518212098a76604f14b05bd56eb7e56f84c25f4c9c8da2", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "35c015ed": "#!/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 'dev.aerolite.Applite'\nif [ -d \"$APPDIR/Applite.app\" ]; then\n\tsudo mv \"$APPDIR/Applite.app\" \"$TMPDIR/Applite.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Applite.app\" \"$APPDIR\"\nrelaunch_application 'dev.aerolite.Applite'\n", + "ef83f643": "#!/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/Applite.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Applite'\ntrash $LOGGED_IN_USER '~/Library/Application Support/dev.aerolite.Applite'\ntrash $LOGGED_IN_USER '~/Library/Caches/Applite'\ntrash $LOGGED_IN_USER '~/Library/Caches/dev.aerolite.Applite'\ntrash $LOGGED_IN_USER '~/Library/Containers/dev.aerolite.Applite'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/dev.aerolite.Applite'\ntrash $LOGGED_IN_USER '~/Library/Preferences/dev.aerolite.Applite.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/dev.aerolite.Applite.savedState'\n" + } +} diff --git a/ee/maintained-apps/outputs/apps.json b/ee/maintained-apps/outputs/apps.json index 228902acd2..13feba289c 100644 --- a/ee/maintained-apps/outputs/apps.json +++ b/ee/maintained-apps/outputs/apps.json @@ -85,6 +85,13 @@ "unique_identifier": "8x8 Work", "description": "8x8 Work is a communications application with voice, video, chat, and web conferencing." }, + { + "name": "A Better Finder Rename", + "slug": "a-better-finder-rename/darwin", + "platform": "darwin", + "unique_identifier": "net.publicspace.abfr12", + "description": "A Better Finder Rename is a batch renaming tool for files, music, and photos." + }, { "name": "Ableton Live Suite", "slug": "ableton-live-suite/darwin", @@ -99,6 +106,48 @@ "unique_identifier": "com.elasticprojects.abstract-desktop", "description": "Abstract is a collaborative design tool with support for Sketch files." }, + { + "name": "Acorn", + "slug": "acorn/darwin", + "platform": "darwin", + "unique_identifier": "com.flyingmeat.Acorn8", + "description": "Acorn is an image editor focused on simplicity." + }, + { + "name": "ActiveDock", + "slug": "activedock/darwin", + "platform": "darwin", + "unique_identifier": "com.sergey-gerasimenko.ActiveDock-2", + "description": "ActiveDock is a customizable dock and application launcher that replaces the macOS Dock." + }, + { + "name": "ActivityWatch", + "slug": "activitywatch/darwin", + "platform": "darwin", + "unique_identifier": "net.activitywatch.ActivityWatch", + "description": "ActivityWatch is a time tracker." + }, + { + "name": "Actual", + "slug": "actual/darwin", + "platform": "darwin", + "unique_identifier": "com.actualbudget.actual", + "description": "Actual is a privacy-focused app for managing your finances." + }, + { + "name": "AdGuard", + "slug": "adguard/darwin", + "platform": "darwin", + "unique_identifier": "com.adguard.mac.adguard", + "description": "AdGuard is a standalone ad blocker." + }, + { + "name": "AdLock", + "slug": "adlock/darwin", + "platform": "darwin", + "unique_identifier": "com.hankuper.adlock.desktop", + "description": "AdLock is a proxy-based ad blocking tool." + }, { "name": "Adobe Acrobat Pro", "slug": "adobe-acrobat-pro/darwin", @@ -155,6 +204,55 @@ "unique_identifier": "com.adobe.DNGConverter", "description": "Adobe DNG Conver is a DNG file converter." }, + { + "name": "Advanced Renamer", + "slug": "advanced-renamer/darwin", + "platform": "darwin", + "unique_identifier": "com.HulubuluSoftware.AdvancedRenamer", + "description": "Advanced Renamer is a batch file renaming utility." + }, + { + "name": "Affinity Designer 2", + "slug": "affinity-designer/darwin", + "platform": "darwin", + "unique_identifier": "com.seriflabs.affinitydesigner2", + "description": "Affinity Designer 2 is a graphic design application." + }, + { + "name": "Affinity Designer", + "slug": "affinity-designer@1/darwin", + "platform": "darwin", + "unique_identifier": "com.seriflabs.affinitydesigner", + "description": "Affinity Designer is a graphic design application." + }, + { + "name": "Affinity Photo 2", + "slug": "affinity-photo/darwin", + "platform": "darwin", + "unique_identifier": "com.seriflabs.affinityphoto2", + "description": "Affinity Photo 2 is a photo editing application." + }, + { + "name": "Affinity Photo", + "slug": "affinity-photo@1/darwin", + "platform": "darwin", + "unique_identifier": "com.seriflabs.affinityphoto", + "description": "Affinity Photo is a photo editing application." + }, + { + "name": "Affinity Publisher 2", + "slug": "affinity-publisher/darwin", + "platform": "darwin", + "unique_identifier": "com.seriflabs.affinitypublisher2", + "description": "Affinity Publisher 2 is a desktop publishing application." + }, + { + "name": "Affinity Publisher", + "slug": "affinity-publisher@1/darwin", + "platform": "darwin", + "unique_identifier": "com.seriflabs.affinitypublisher", + "description": "Affinity Publisher is a desktop publishing application." + }, { "name": "Affinity", "slug": "affinity/darwin", @@ -169,6 +267,13 @@ "unique_identifier": "Affinity", "description": "Affinity is an image editing and design software." }, + { + "name": "AirBuddy", + "slug": "airbuddy/darwin", + "platform": "darwin", + "unique_identifier": "codes.rambo.AirBuddy", + "description": "AirBuddy is an AirPods companion app." + }, { "name": "Aircall", "slug": "aircall/darwin", @@ -183,6 +288,34 @@ "unique_identifier": "Aircall", "description": "Aircall is cloud-based call center and phone system software." }, + { + "name": "AirDroid", + "slug": "airdroid/darwin", + "platform": "darwin", + "unique_identifier": "com.sandstudio.airdroid", + "description": "AirDroid is a mobile device management suite." + }, + { + "name": "AirParrot", + "slug": "airparrot/darwin", + "platform": "darwin", + "unique_identifier": "com.squirrels.AirParrot-3", + "description": "AirParrot is a tool to wirelessly mirror the screen or stream media files." + }, + { + "name": "AirServer", + "slug": "airserver/darwin", + "platform": "darwin", + "unique_identifier": "com.pratikkumar.airserver-mac", + "description": "AirServer is a screen mirroring receiver." + }, + { + "name": "Airtable", + "slug": "airtable/darwin", + "platform": "darwin", + "unique_identifier": "com.FormaGrid.Airtable", + "description": "Airtable is a spreadsheet-database hybrid for cloud collaboration." + }, { "name": "Airtame", "slug": "airtame/darwin", @@ -197,6 +330,69 @@ "unique_identifier": "Airtame 4.15.0", "description": "Airtame is an app that makes shared screens easy to use - for screen sharing, conferencing, digital signage, and alerts." }, + { + "name": "Airy", + "slug": "airy/darwin", + "platform": "darwin", + "unique_identifier": "com.eltima.Airy", + "description": "Airy is a YouTube video and MP3 downloader." + }, + { + "name": "Akiflow", + "slug": "akiflow/darwin", + "platform": "darwin", + "unique_identifier": "com.akiflow.akiflow", + "description": "Akiflow is a time blocking and productivity platform." + }, + { + "name": "Alcove", + "slug": "alcove/darwin", + "platform": "darwin", + "unique_identifier": "com.henrikruscon.Alcove", + "description": "Alcove is a utility that adds Dynamic Island-like features to the notch area." + }, + { + "name": "AlDente", + "slug": "aldente/darwin", + "platform": "darwin", + "unique_identifier": "com.apphousekitchen.aldente-pro", + "description": "AlDente is a menu bar tool to limit the maximum charging percentage." + }, + { + "name": "Alloy", + "slug": "alloy/darwin", + "platform": "darwin", + "unique_identifier": "org.alloytools.alloy", + "description": "Alloy is a programming language for software modelling." + }, + { + "name": "AltTab", + "slug": "alt-tab/darwin", + "platform": "darwin", + "unique_identifier": "com.lwouis.alt-tab-macos", + "description": "AltTab is a tool that brings Windows-like alt-tab window switching to macOS." + }, + { + "name": "Altair GraphQL Client", + "slug": "altair-graphql-client/darwin", + "platform": "darwin", + "unique_identifier": "com.xkoji.altair", + "description": "Altair GraphQL Client is a GraphQL client." + }, + { + "name": "Amadeus Pro", + "slug": "amadeus-pro/darwin", + "platform": "darwin", + "unique_identifier": "com.HairerSoft.AmadeusPro", + "description": "Amadeus Pro is a multi-purpose audio recorder, editor, and converter." + }, + { + "name": "Amadine", + "slug": "amadine/darwin", + "platform": "darwin", + "unique_identifier": "com.belightsoft.Amadine", + "description": "Amadine is a vector graphics and illustration application." + }, { "name": "Amazon Chime", "slug": "amazon-chime/darwin", @@ -267,6 +463,20 @@ "unique_identifier": "Amazon WorkSpaces", "description": "Amazon WorkSpaces is an app that provides secure, managed virtual desktop infrastructure (VDI) in the cloud." }, + { + "name": "Amethyst", + "slug": "amethyst/darwin", + "platform": "darwin", + "unique_identifier": "com.amethyst.Amethyst", + "description": "Amethyst is an automatic tiling window manager similar to xmonad." + }, + { + "name": "Amie", + "slug": "amie/darwin", + "platform": "darwin", + "unique_identifier": "so.amie.electron-app", + "description": "Amie is a calendar and task manager." + }, { "name": "Android Studio", "slug": "android-studio/darwin", @@ -281,6 +491,13 @@ "unique_identifier": "Android Studio", "description": "Android Studio is the official integrated development environment for Android app development, based on IntelliJ IDEA." }, + { + "name": "Angry IP Scanner", + "slug": "angry-ip-scanner/darwin", + "platform": "darwin", + "unique_identifier": "net.azib.ipscan", + "description": "Angry IP Scanner is a network scanner." + }, { "name": "Anka", "slug": "anka-virtualization/darwin", @@ -323,6 +540,13 @@ "unique_identifier": "com.google.antigravity", "description": "Google Antigravity is an agent orchestration platform." }, + { + "name": "Antinote", + "slug": "antinote/darwin", + "platform": "darwin", + "unique_identifier": "com.chabomakers.Antinote", + "description": "Antinote is a temporary notes app with calculations and extensible features." + }, { "name": "AnyDesk", "slug": "anydesk/darwin", @@ -330,6 +554,34 @@ "unique_identifier": "com.philandro.anydesk", "description": "AnyDesk is an app that allows connection to a computer remotely." }, + { + "name": "Any.do", + "slug": "anydo/darwin", + "platform": "darwin", + "unique_identifier": "com.anydo.mac", + "description": "Any.do is a reminder, planner, and calendar app." + }, + { + "name": "Anytype", + "slug": "anytype/darwin", + "platform": "darwin", + "unique_identifier": "com.anytype.anytype", + "description": "Anytype is a local-first and end-to-end encrypted notes app." + }, + { + "name": "Apidog", + "slug": "apidog/darwin", + "platform": "darwin", + "unique_identifier": "com.apidog.app", + "description": "Apidog is an API development platform." + }, + { + "name": "App Fair", + "slug": "app-fair/darwin", + "platform": "darwin", + "unique_identifier": "app.App-Fair", + "description": "App Fair is a catalogue of free and commercial native desktop applications." + }, { "name": "Apparency", "slug": "apparency/darwin", @@ -344,6 +596,20 @@ "unique_identifier": "net.freemacsoft.AppCleaner", "description": "AppCleaner is an application uninstaller." }, + { + "name": "Appium Inspector GUI", + "slug": "appium-inspector/darwin", + "platform": "darwin", + "unique_identifier": "io.appium.inspector", + "description": "Appium Inspector GUI is a GUI inspector for mobile apps." + }, + { + "name": "Applite", + "slug": "applite/darwin", + "platform": "darwin", + "unique_identifier": "dev.aerolite.Applite", + "description": "Applite is a user-friendly GUI for Homebrew." + }, { "name": "Arc", "slug": "arc/darwin", @@ -393,6 +659,20 @@ "unique_identifier": "Asana", "description": "Asana is an app to manage team projects and tasks." }, + { + "name": "Asset Catalog Tinkerer", + "slug": "asset-catalog-tinkerer/darwin", + "platform": "darwin", + "unique_identifier": "br.com.guilhermerambo.Asset-Catalog-Tinkerer", + "description": "Asset Catalog Tinkerer is an app to browse and extract images from .car files." + }, + { + "name": "aText", + "slug": "atext/darwin", + "platform": "darwin", + "unique_identifier": "com.trankynam.aText", + "description": "aText is a tool that replaces abbreviations while typing." + }, { "name": "Audacity", "slug": "audacity/darwin", @@ -407,6 +687,13 @@ "unique_identifier": "Audacity", "description": "Audacity is a multi-track audio editor and recorder." }, + { + "name": "Audio Hijack", + "slug": "audio-hijack/darwin", + "platform": "darwin", + "unique_identifier": "com.rogueamoeba.audiohijack", + "description": "Audio Hijack is an app that records audio from any application." + }, { "name": "Avast Secure Browser", "slug": "avast-secure-browser/darwin", @@ -414,6 +701,13 @@ "unique_identifier": "com.avast.AvastSecureBrowser", "description": "Avast Secure Browser is a web browser focusing on privacy." }, + { + "name": "Aviatrix VPN Client", + "slug": "aviatrix-vpn-client/darwin", + "platform": "darwin", + "unique_identifier": "org.pythonmac.unspecified.AviatrixVPNClient", + "description": "Aviatrix VPN Client is a VPN client that provides SAML authentication." + }, { "name": "AWS Command Line Interface v2", "slug": "aws-cli/windows", @@ -435,6 +729,13 @@ "unique_identifier": "AWS VPN Client", "description": "AWS Client VPN is a managed client-based VPN service to securely access AWS resources." }, + { + "name": "Axure RP", + "slug": "axure-rp/darwin", + "platform": "darwin", + "unique_identifier": "com.axure.AxureRP11", + "description": "Axure RP is a planning and prototyping tool for developers." + }, { "name": "Azul Zulu JDK 25", "slug": "azul-zulu-25-jdk/windows", diff --git a/ee/maintained-apps/outputs/asset-catalog-tinkerer/darwin.json b/ee/maintained-apps/outputs/asset-catalog-tinkerer/darwin.json new file mode 100644 index 0000000000..470637865b --- /dev/null +++ b/ee/maintained-apps/outputs/asset-catalog-tinkerer/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "2.9", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'br.com.guilhermerambo.Asset-Catalog-Tinkerer';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'br.com.guilhermerambo.Asset-Catalog-Tinkerer' AND version_compare(bundle_short_version, '2.9') < 0);" + }, + "installer_url": "https://github.com/insidegui/AssetCatalogTinkerer/releases/download/2.9/AssetCatalogTinkerer_v2.9-290.zip", + "install_script_ref": "2eb59a7f", + "uninstall_script_ref": "32f47cd3", + "sha256": "ab18ece5d597960f9002c84cc800b61b2b22f4f61a63d6695dac378340ded5c0", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "2eb59a7f": "#!/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 'br.com.guilhermerambo.Asset-Catalog-Tinkerer'\nif [ -d \"$APPDIR/Asset Catalog Tinkerer.app\" ]; then\n\tsudo mv \"$APPDIR/Asset Catalog Tinkerer.app\" \"$TMPDIR/Asset Catalog Tinkerer.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Asset Catalog Tinkerer.app\" \"$APPDIR\"\nrelaunch_application 'br.com.guilhermerambo.Asset-Catalog-Tinkerer'\n", + "32f47cd3": "#!/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/Asset Catalog Tinkerer.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/br.com.guilhermerambo.asset-catalog-tinkerer.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Preferences/br.com.guilhermerambo.Asset-Catalog-Tinkerer.plist'\n" + } +} diff --git a/ee/maintained-apps/outputs/atext/darwin.json b/ee/maintained-apps/outputs/atext/darwin.json new file mode 100644 index 0000000000..e2b79ced2c --- /dev/null +++ b/ee/maintained-apps/outputs/atext/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "3.21", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.trankynam.aText';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.trankynam.aText' AND version_compare(bundle_short_version, '3.21') < 0);" + }, + "installer_url": "https://www.trankynam.com/atext/downloads/aText.dmg", + "install_script_ref": "5d9d0a57", + "uninstall_script_ref": "6f097dc3", + "sha256": "no_check", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "5d9d0a57": "#!/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.trankynam.aText'\nif [ -d \"$APPDIR/aText.app\" ]; then\n\tsudo mv \"$APPDIR/aText.app\" \"$TMPDIR/aText.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/aText.app\" \"$APPDIR\"\nrelaunch_application 'com.trankynam.aText'\n", + "6f097dc3": "#!/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/aText.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.trankynam.aText'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.trankynam.aText'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.trankynam.aText'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.trankynam.aText'\ntrash $LOGGED_IN_USER '~/Library/Cookies/com.trankynam.aText.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.trankynam.aText'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.trankynam.aText.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.trankynam.aText.savedState'\ntrash $LOGGED_IN_USER '~/Library/WebKit/com.trankynam.aText'\n" + } +} diff --git a/ee/maintained-apps/outputs/audio-hijack/darwin.json b/ee/maintained-apps/outputs/audio-hijack/darwin.json new file mode 100644 index 0000000000..c75a230939 --- /dev/null +++ b/ee/maintained-apps/outputs/audio-hijack/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "4.5.9", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.rogueamoeba.audiohijack';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.rogueamoeba.audiohijack' AND version_compare(bundle_short_version, '4.5.9') < 0);" + }, + "installer_url": "https://cdn.rogueamoeba.com/audiohijack/download/AudioHijack.zip", + "install_script_ref": "c5a91be7", + "uninstall_script_ref": "746e467f", + "sha256": "no_check", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "746e467f": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nquit_application 'com.rogueamoeba.audiohijack'\nsudo rm -rf \"$APPDIR/Audio Hijack.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Audio Hijack 4'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.rogueamoeba.audiohijack'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.rogueamoeba.audiohijack'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.rogueamoeba.audiohijack.plist'\ntrash $LOGGED_IN_USER '~/Library/WebKit/com.rogueamoeba.audiohijack'\n", + "c5a91be7": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_and_track_application 'com.rogueamoeba.audiohijack'\nif [ -d \"$APPDIR/Audio Hijack.app\" ]; then\n\tsudo mv \"$APPDIR/Audio Hijack.app\" \"$TMPDIR/Audio Hijack.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Audio Hijack.app\" \"$APPDIR\"\nrelaunch_application 'com.rogueamoeba.audiohijack'\n" + } +} diff --git a/ee/maintained-apps/outputs/aviatrix-vpn-client/darwin.json b/ee/maintained-apps/outputs/aviatrix-vpn-client/darwin.json new file mode 100644 index 0000000000..d3f436a3ee --- /dev/null +++ b/ee/maintained-apps/outputs/aviatrix-vpn-client/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "2.17.7", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'org.pythonmac.unspecified.AviatrixVPNClient';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'org.pythonmac.unspecified.AviatrixVPNClient' AND version_compare(bundle_short_version, '2.17.7') < 0);" + }, + "installer_url": "https://aviatrix-download.s3.amazonaws.com/AviatrixVPNClient/AVPNC_mac.pkg", + "install_script_ref": "717ae1f5", + "uninstall_script_ref": "4ad80bc8", + "sha256": "no_check", + "default_categories": [ + "Security" + ] + } + ], + "refs": { + "4ad80bc8": "#!/bin/bash\n\n# variables\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nexpand_pkgid_and_map() {\n local PKGID=\"$1\"\n local FUNC=\"$2\"\n if [[ \"$PKGID\" == *\"*\" ]]; then\n local prefix=\"${PKGID%\\*}\"\n echo \"Expanding wildcard for PKGID: $PKGID\"\n for receipt in $(pkgutil --pkgs | grep \"^${prefix}\"); do\n echo \"Processing $receipt\"\n \"$FUNC\" \"$receipt\"\n done\n else\n \"$FUNC\" \"$PKGID\"\n fi\n}\n\nforget_pkg() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" forget_receipt\n}\n\nforget_receipt() {\n local PKGID=\"$1\"\n sudo pkgutil --forget \"$PKGID\"\n}\n\nremove_launchctl_service() {\n local service=\"$1\"\n local booleans=(\"true\" \"false\")\n local plist_status\n local paths\n local should_sudo\n\n echo \"Removing launchctl service ${service}\"\n\n for should_sudo in \"${booleans[@]}\"; do\n plist_status=$(launchctl list \"${service}\" 2>/dev/null)\n\n if [[ $plist_status == \\{* ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo launchctl remove \"${service}\"\n else\n launchctl remove \"${service}\"\n fi\n sleep 1\n fi\n\n paths=(\n \"/Library/LaunchAgents/${service}.plist\"\n \"/Library/LaunchDaemons/${service}.plist\"\n )\n\n # if not using sudo, prepend the home directory to the paths\n if [[ $should_sudo == \"false\" ]]; then\n for i in \"${!paths[@]}\"; do\n paths[i]=\"${HOME}${paths[i]}\"\n done\n fi\n\n for path in \"${paths[@]}\"; do\n if [[ -e \"$path\" ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo rm -f -- \"$path\"\n else\n rm -f -- \"$path\"\n fi\n fi\n done\n done\n}\n\nremove_pkg_files() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" remove_receipt_files\n}\n\nremove_receipt_files() {\n local PKGID=\"$1\"\n local PKGINFO VOLUME INSTALL_LOCATION FULL_INSTALL_LOCATION\n\n echo \"pkgutil --pkg-info-plist \\\"$PKGID\\\"\"\n PKGINFO=$(pkgutil --pkg-info-plist \"$PKGID\")\n VOLUME=$(echo \"$PKGINFO\" | awk '/volume<\\/key>/ {getline; gsub(/.*|<\\/string>.*/, \"\"); print}')\n INSTALL_LOCATION=$(echo \"$PKGINFO\" | awk '/install-location<\\/key>/ {getline; gsub(/.*|<\\/string>.*/, \"\"); print}')\n\n if [ -z \"$INSTALL_LOCATION\" ] || [ \"$INSTALL_LOCATION\" = \"/\" ]; then\n FULL_INSTALL_LOCATION=\"$VOLUME\"\n else\n FULL_INSTALL_LOCATION=\"$VOLUME/$INSTALL_LOCATION\"\n FULL_INSTALL_LOCATION=$(echo \"$FULL_INSTALL_LOCATION\" | sed 's|//|/|g')\n fi\n\n echo \"sudo pkgutil --only-files --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-files --files \"$PKGID\" | sed \"s|^|/${INSTALL_LOCATION}/|\" | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n echo \"sudo pkgutil --only-dirs --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | grep '\\\\.app$' | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-dirs --files \"$PKGID\" | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" | grep '\\.app$' | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n root_app_dir=$(\n sudo pkgutil --only-dirs --files \"$PKGID\" \\\n | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" \\\n | grep 'Applications' \\\n | awk '{ print length, $0 }' \\\n | sort -n \\\n | head -n1 \\\n | cut -d' ' -f2-\n )\n if [ -n \"$root_app_dir\" ]; then\n echo \"sudo rmdir -p \\\"$root_app_dir\\\" 2>/dev/null || :\"\n sudo rmdir -p \"$root_app_dir\" 2>/dev/null || :\n fi\n}\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nremove_launchctl_service 'aviatrix.vpn.client.rp.plist'\nremove_pkg_files 'com.Aviatrix.VPNClient'\nforget_pkg 'com.Aviatrix.VPNClient'\nsudo rm -rf '/Applications/Aviatrix VPN Client.app'\ntrash $LOGGED_IN_USER '~/Library/Aviatrix'\ntrash $LOGGED_IN_USER '~/Library/Logs/AviatrixVPNC'\ntrash $LOGGED_IN_USER '~/Library/Preferences/org.pythonmac.unspecified.AviatrixVPNClient.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/org.pythonmac.unspecified.AviatrixVPNClient.savedState'\n", + "717ae1f5": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# install pkg files\nquit_and_track_application 'org.pythonmac.unspecified.AviatrixVPNClient'\nsudo installer -pkg \"$TMPDIR/AVPNC_mac.pkg\" -target /\nrelaunch_application 'org.pythonmac.unspecified.AviatrixVPNClient'\n" + } +} diff --git a/ee/maintained-apps/outputs/axure-rp/darwin.json b/ee/maintained-apps/outputs/axure-rp/darwin.json new file mode 100644 index 0000000000..7537adec6d --- /dev/null +++ b/ee/maintained-apps/outputs/axure-rp/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "11.0.0.4137", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.axure.AxureRP11';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.axure.AxureRP11' AND version_compare(bundle_short_version, '11.0.0.4137') < 0);" + }, + "installer_url": "https://axure.cachefly.net/versions/11-0/AxureRP-Setup-4137.dmg", + "install_script_ref": "deabbdfe", + "uninstall_script_ref": "0f552577", + "sha256": "fc9a4b3e46b835bab9f4450a382f8fea0e4e4bd2dd2602886f36da38ff9571b4", + "default_categories": [ + "Developer tools" + ] + } + ], + "refs": { + "0f552577": "#!/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/Axure RP 11.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.axure.axurerp#*.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.axure.AxureRP#*.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.axure.AxureRP#*.savedState'\n", + "deabbdfe": "#!/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.axure.AxureRP11'\nif [ -d \"$APPDIR/Axure RP 11.app\" ]; then\n\tsudo mv \"$APPDIR/Axure RP 11.app\" \"$TMPDIR/Axure RP 11.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Axure RP 11.app\" \"$APPDIR\"\nrelaunch_application 'com.axure.AxureRP11'\n" + } +} diff --git a/frontend/pages/SoftwarePage/components/icons/ABetterFinderRename.tsx b/frontend/pages/SoftwarePage/components/icons/ABetterFinderRename.tsx new file mode 100644 index 0000000000..04ef1f466f --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/ABetterFinderRename.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const ABetterFinderRename = (props: SVGProps) => ( + + + +); +export default ABetterFinderRename; diff --git a/frontend/pages/SoftwarePage/components/icons/Acorn.tsx b/frontend/pages/SoftwarePage/components/icons/Acorn.tsx new file mode 100644 index 0000000000..c31d08c72c --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Acorn.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Acorn = (props: SVGProps) => ( + + + +); +export default Acorn; diff --git a/frontend/pages/SoftwarePage/components/icons/Activedock.tsx b/frontend/pages/SoftwarePage/components/icons/Activedock.tsx new file mode 100644 index 0000000000..56981691ee --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Activedock.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Activedock = (props: SVGProps) => ( + + + +); +export default Activedock; diff --git a/frontend/pages/SoftwarePage/components/icons/Activitywatch.tsx b/frontend/pages/SoftwarePage/components/icons/Activitywatch.tsx new file mode 100644 index 0000000000..9452578c98 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Activitywatch.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Activitywatch = (props: SVGProps) => ( + + + +); +export default Activitywatch; diff --git a/frontend/pages/SoftwarePage/components/icons/Actual.tsx b/frontend/pages/SoftwarePage/components/icons/Actual.tsx new file mode 100644 index 0000000000..095a98429c --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Actual.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Actual = (props: SVGProps) => ( + + + +); +export default Actual; diff --git a/frontend/pages/SoftwarePage/components/icons/Adguard.tsx b/frontend/pages/SoftwarePage/components/icons/Adguard.tsx new file mode 100644 index 0000000000..088f82e0f8 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Adguard.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Adguard = (props: SVGProps) => ( + + + +); +export default Adguard; diff --git a/frontend/pages/SoftwarePage/components/icons/Adlock.tsx b/frontend/pages/SoftwarePage/components/icons/Adlock.tsx new file mode 100644 index 0000000000..d18098b626 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Adlock.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Adlock = (props: SVGProps) => ( + + + +); +export default Adlock; diff --git a/frontend/pages/SoftwarePage/components/icons/AdvancedRenamer.tsx b/frontend/pages/SoftwarePage/components/icons/AdvancedRenamer.tsx new file mode 100644 index 0000000000..65f9321dd4 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/AdvancedRenamer.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const AdvancedRenamer = (props: SVGProps) => ( + + + +); +export default AdvancedRenamer; diff --git a/frontend/pages/SoftwarePage/components/icons/AffinityDesigner.tsx b/frontend/pages/SoftwarePage/components/icons/AffinityDesigner.tsx new file mode 100644 index 0000000000..81f7372db7 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/AffinityDesigner.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const AffinityDesigner = (props: SVGProps) => ( + + + +); +export default AffinityDesigner; diff --git a/frontend/pages/SoftwarePage/components/icons/AffinityDesigner1.tsx b/frontend/pages/SoftwarePage/components/icons/AffinityDesigner1.tsx new file mode 100644 index 0000000000..14614c168e --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/AffinityDesigner1.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const AffinityDesigner1 = (props: SVGProps) => ( + + + +); +export default AffinityDesigner1; diff --git a/frontend/pages/SoftwarePage/components/icons/AffinityPhoto.tsx b/frontend/pages/SoftwarePage/components/icons/AffinityPhoto.tsx new file mode 100644 index 0000000000..61ad53c3f9 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/AffinityPhoto.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const AffinityPhoto = (props: SVGProps) => ( + + + +); +export default AffinityPhoto; diff --git a/frontend/pages/SoftwarePage/components/icons/AffinityPhoto1.tsx b/frontend/pages/SoftwarePage/components/icons/AffinityPhoto1.tsx new file mode 100644 index 0000000000..fc843ab647 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/AffinityPhoto1.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const AffinityPhoto1 = (props: SVGProps) => ( + + + +); +export default AffinityPhoto1; diff --git a/frontend/pages/SoftwarePage/components/icons/AffinityPublisher.tsx b/frontend/pages/SoftwarePage/components/icons/AffinityPublisher.tsx new file mode 100644 index 0000000000..d08f742e5a --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/AffinityPublisher.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const AffinityPublisher = (props: SVGProps) => ( + + + +); +export default AffinityPublisher; diff --git a/frontend/pages/SoftwarePage/components/icons/AffinityPublisher1.tsx b/frontend/pages/SoftwarePage/components/icons/AffinityPublisher1.tsx new file mode 100644 index 0000000000..3602887c39 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/AffinityPublisher1.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const AffinityPublisher1 = (props: SVGProps) => ( + + + +); +export default AffinityPublisher1; diff --git a/frontend/pages/SoftwarePage/components/icons/Airbuddy.tsx b/frontend/pages/SoftwarePage/components/icons/Airbuddy.tsx new file mode 100644 index 0000000000..fe39883271 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Airbuddy.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Airbuddy = (props: SVGProps) => ( + + + +); +export default Airbuddy; diff --git a/frontend/pages/SoftwarePage/components/icons/Airdroid.tsx b/frontend/pages/SoftwarePage/components/icons/Airdroid.tsx new file mode 100644 index 0000000000..2266f3fe63 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Airdroid.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Airdroid = (props: SVGProps) => ( + + + +); +export default Airdroid; diff --git a/frontend/pages/SoftwarePage/components/icons/Airparrot.tsx b/frontend/pages/SoftwarePage/components/icons/Airparrot.tsx new file mode 100644 index 0000000000..08e1b7075d --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Airparrot.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Airparrot = (props: SVGProps) => ( + + + +); +export default Airparrot; diff --git a/frontend/pages/SoftwarePage/components/icons/Airserver.tsx b/frontend/pages/SoftwarePage/components/icons/Airserver.tsx new file mode 100644 index 0000000000..2ab5c8e469 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Airserver.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Airserver = (props: SVGProps) => ( + + + +); +export default Airserver; diff --git a/frontend/pages/SoftwarePage/components/icons/Airtable.tsx b/frontend/pages/SoftwarePage/components/icons/Airtable.tsx new file mode 100644 index 0000000000..332feb4624 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Airtable.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Airtable = (props: SVGProps) => ( + + + +); +export default Airtable; diff --git a/frontend/pages/SoftwarePage/components/icons/Airy.tsx b/frontend/pages/SoftwarePage/components/icons/Airy.tsx new file mode 100644 index 0000000000..e71647eea2 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Airy.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Airy = (props: SVGProps) => ( + + + +); +export default Airy; diff --git a/frontend/pages/SoftwarePage/components/icons/Akiflow.tsx b/frontend/pages/SoftwarePage/components/icons/Akiflow.tsx new file mode 100644 index 0000000000..7e7cc47a8f --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Akiflow.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Akiflow = (props: SVGProps) => ( + + + +); +export default Akiflow; diff --git a/frontend/pages/SoftwarePage/components/icons/Alcove.tsx b/frontend/pages/SoftwarePage/components/icons/Alcove.tsx new file mode 100644 index 0000000000..58c73b24d4 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Alcove.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Alcove = (props: SVGProps) => ( + + + +); +export default Alcove; diff --git a/frontend/pages/SoftwarePage/components/icons/Aldente.tsx b/frontend/pages/SoftwarePage/components/icons/Aldente.tsx new file mode 100644 index 0000000000..19d1baa938 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Aldente.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Aldente = (props: SVGProps) => ( + + + +); +export default Aldente; diff --git a/frontend/pages/SoftwarePage/components/icons/Alloy.tsx b/frontend/pages/SoftwarePage/components/icons/Alloy.tsx new file mode 100644 index 0000000000..e648569c0a --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Alloy.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Alloy = (props: SVGProps) => ( + + + +); +export default Alloy; diff --git a/frontend/pages/SoftwarePage/components/icons/AltTab.tsx b/frontend/pages/SoftwarePage/components/icons/AltTab.tsx new file mode 100644 index 0000000000..c8d41722af --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/AltTab.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const AltTab = (props: SVGProps) => ( + + + +); +export default AltTab; diff --git a/frontend/pages/SoftwarePage/components/icons/AltairGraphqlClient.tsx b/frontend/pages/SoftwarePage/components/icons/AltairGraphqlClient.tsx new file mode 100644 index 0000000000..35aac4aebd --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/AltairGraphqlClient.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const AltairGraphqlClient = (props: SVGProps) => ( + + + +); +export default AltairGraphqlClient; diff --git a/frontend/pages/SoftwarePage/components/icons/AmadeusPro.tsx b/frontend/pages/SoftwarePage/components/icons/AmadeusPro.tsx new file mode 100644 index 0000000000..20c32fe003 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/AmadeusPro.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const AmadeusPro = (props: SVGProps) => ( + + + +); +export default AmadeusPro; diff --git a/frontend/pages/SoftwarePage/components/icons/Amadine.tsx b/frontend/pages/SoftwarePage/components/icons/Amadine.tsx new file mode 100644 index 0000000000..147d813357 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Amadine.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Amadine = (props: SVGProps) => ( + + + +); +export default Amadine; diff --git a/frontend/pages/SoftwarePage/components/icons/Amethyst.tsx b/frontend/pages/SoftwarePage/components/icons/Amethyst.tsx new file mode 100644 index 0000000000..9eb4698445 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Amethyst.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Amethyst = (props: SVGProps) => ( + + + +); +export default Amethyst; diff --git a/frontend/pages/SoftwarePage/components/icons/Amie.tsx b/frontend/pages/SoftwarePage/components/icons/Amie.tsx new file mode 100644 index 0000000000..59fe43d56c --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Amie.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Amie = (props: SVGProps) => ( + + + +); +export default Amie; diff --git a/frontend/pages/SoftwarePage/components/icons/AngryIpScanner.tsx b/frontend/pages/SoftwarePage/components/icons/AngryIpScanner.tsx new file mode 100644 index 0000000000..40237b8a56 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/AngryIpScanner.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const AngryIpScanner = (props: SVGProps) => ( + + + +); +export default AngryIpScanner; diff --git a/frontend/pages/SoftwarePage/components/icons/Antinote.tsx b/frontend/pages/SoftwarePage/components/icons/Antinote.tsx new file mode 100644 index 0000000000..97547625fd --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Antinote.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Antinote = (props: SVGProps) => ( + + + +); +export default Antinote; diff --git a/frontend/pages/SoftwarePage/components/icons/Anydo.tsx b/frontend/pages/SoftwarePage/components/icons/Anydo.tsx new file mode 100644 index 0000000000..22f007e0ea --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Anydo.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Anydo = (props: SVGProps) => ( + + + +); +export default Anydo; diff --git a/frontend/pages/SoftwarePage/components/icons/Anytype.tsx b/frontend/pages/SoftwarePage/components/icons/Anytype.tsx new file mode 100644 index 0000000000..cddbe5aa74 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Anytype.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Anytype = (props: SVGProps) => ( + + + +); +export default Anytype; diff --git a/frontend/pages/SoftwarePage/components/icons/Apidog.tsx b/frontend/pages/SoftwarePage/components/icons/Apidog.tsx new file mode 100644 index 0000000000..9a4bd4b237 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Apidog.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Apidog = (props: SVGProps) => ( + + + +); +export default Apidog; diff --git a/frontend/pages/SoftwarePage/components/icons/AppFair.tsx b/frontend/pages/SoftwarePage/components/icons/AppFair.tsx new file mode 100644 index 0000000000..b9380acd9e --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/AppFair.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const AppFair = (props: SVGProps) => ( + + + +); +export default AppFair; diff --git a/frontend/pages/SoftwarePage/components/icons/AppiumInspector.tsx b/frontend/pages/SoftwarePage/components/icons/AppiumInspector.tsx new file mode 100644 index 0000000000..135be1ae67 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/AppiumInspector.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const AppiumInspector = (props: SVGProps) => ( + + + +); +export default AppiumInspector; diff --git a/frontend/pages/SoftwarePage/components/icons/Applite.tsx b/frontend/pages/SoftwarePage/components/icons/Applite.tsx new file mode 100644 index 0000000000..3c05f28c3d --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Applite.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Applite = (props: SVGProps) => ( + + + +); +export default Applite; diff --git a/frontend/pages/SoftwarePage/components/icons/AssetCatalogTinkerer.tsx b/frontend/pages/SoftwarePage/components/icons/AssetCatalogTinkerer.tsx new file mode 100644 index 0000000000..609824b933 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/AssetCatalogTinkerer.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const AssetCatalogTinkerer = (props: SVGProps) => ( + + + +); +export default AssetCatalogTinkerer; diff --git a/frontend/pages/SoftwarePage/components/icons/Atext.tsx b/frontend/pages/SoftwarePage/components/icons/Atext.tsx new file mode 100644 index 0000000000..4e72052408 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Atext.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Atext = (props: SVGProps) => ( + + + +); +export default Atext; diff --git a/frontend/pages/SoftwarePage/components/icons/AudioHijack.tsx b/frontend/pages/SoftwarePage/components/icons/AudioHijack.tsx new file mode 100644 index 0000000000..88f25ef305 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/AudioHijack.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const AudioHijack = (props: SVGProps) => ( + + + +); +export default AudioHijack; diff --git a/frontend/pages/SoftwarePage/components/icons/AviatrixVpnClient.tsx b/frontend/pages/SoftwarePage/components/icons/AviatrixVpnClient.tsx new file mode 100644 index 0000000000..fbd9921aa4 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/AviatrixVpnClient.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const AviatrixVpnClient = (props: SVGProps) => ( + + + +); +export default AviatrixVpnClient; diff --git a/frontend/pages/SoftwarePage/components/icons/AxureRp.tsx b/frontend/pages/SoftwarePage/components/icons/AxureRp.tsx new file mode 100644 index 0000000000..e13c0bdef6 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/AxureRp.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const AxureRp = (props: SVGProps) => ( + + + +); +export default AxureRp; diff --git a/frontend/pages/SoftwarePage/components/icons/index.ts b/frontend/pages/SoftwarePage/components/icons/index.ts index f0c4b9c93c..a7cdc5f33b 100644 --- a/frontend/pages/SoftwarePage/components/icons/index.ts +++ b/frontend/pages/SoftwarePage/components/icons/index.ts @@ -5,14 +5,42 @@ import { HOST_LINUX_PLATFORMS } from "interfaces/platform"; import { ISoftware } from "interfaces/software"; import { matchLoosePrefixToKey } from "utilities/strings/stringUtils"; +import ABetterFinderRename from "./ABetterFinderRename"; import AbletonLive12Suite from "./AbletonLive12Suite"; import Abstract from "./Abstract"; +import Acorn from "./Acorn"; import AcrobatReader from "./AcrobatReader"; +import Activedock from "./Activedock"; +import Activitywatch from "./Activitywatch"; +import Actual from "./Actual"; +import Adguard from "./Adguard"; +import Adlock from "./Adlock"; import AdobeDigitalEditions45 from "./AdobeDigitalEditions45"; import AdobeDngConverter from "./AdobeDngConverter"; +import AdvancedRenamer from "./AdvancedRenamer"; import Affinity from "./Affinity"; +import AffinityDesigner from "./AffinityDesigner"; +import AffinityDesigner1 from "./AffinityDesigner1"; +import AffinityPhoto from "./AffinityPhoto"; +import AffinityPhoto1 from "./AffinityPhoto1"; +import AffinityPublisher from "./AffinityPublisher"; +import AffinityPublisher1 from "./AffinityPublisher1"; +import Airbuddy from "./Airbuddy"; import Aircall from "./Aircall"; +import Airdroid from "./Airdroid"; +import Airparrot from "./Airparrot"; +import Airserver from "./Airserver"; +import Airtable from "./Airtable"; import Airtame from "./Airtame"; +import Airy from "./Airy"; +import Akiflow from "./Akiflow"; +import Alcove from "./Alcove"; +import Aldente from "./Aldente"; +import Alloy from "./Alloy"; +import AltairGraphqlClient from "./AltairGraphqlClient"; +import AltTab from "./AltTab"; +import AmadeusPro from "./AmadeusPro"; +import Amadine from "./Amadine"; import AmazonChime from "./AmazonChime"; import AmazonCorretto21 from "./AmazonCorretto21"; import AmazonCorretto24 from "./AmazonCorretto24"; @@ -20,26 +48,41 @@ import AmazonCorretto25 from "./AmazonCorretto25"; import AmazonCorretto26 from "./AmazonCorretto26"; import AmazonDCV from "./AmazonDCV"; import AmazonWorkspaces from "./AmazonWorkspaces"; +import Amethyst from "./Amethyst"; +import Amie from "./Amie"; import AndroidApp from "./AndroidApp"; import AndroidOS from "./AndroidOS"; import AndroidPlayStore from "./AndroidPlayStore"; import AndroidStudio from "./AndroidStudio"; +import AngryIpScanner from "./AngryIpScanner"; import Anka from "./Anka"; import AnotherRedisDesktopManager from "./AnotherRedisDesktopManager"; import Antigravity from "./Antigravity"; import AntigravityIde from "./AntigravityIde"; +import Antinote from "./Antinote"; import AnyDesk from "./AnyDesk"; +import Anydo from "./Anydo"; +import Anytype from "./Anytype"; +import Apidog from "./Apidog"; import Apparency from "./Apparency"; import AppCleaner from "./AppCleaner"; +import AppFair from "./AppFair"; +import AppiumInspector from "./AppiumInspector"; import AppleApp from "./AppleApp"; import AppleAppStore from "./AppleAppStore"; +import Applite from "./Applite"; import Arc from "./Arc"; import Archaeology from "./Archaeology"; import ArduinoIde from "./ArduinoIde"; import Asana from "./Asana"; +import AssetCatalogTinkerer from "./AssetCatalogTinkerer"; +import Atext from "./Atext"; import Audacity from "./Audacity"; +import AudioHijack from "./AudioHijack"; import AvastSecureBrowser from "./AvastSecureBrowser"; +import AviatrixVpnClient from "./AviatrixVpnClient"; import AwsVpnClient from "./AwsVpnClient"; +import AxureRp from "./AxureRp"; import AzulZulu25Jdk from "./AzulZulu25Jdk"; import AzulZulu25Jre from "./AzulZulu25Jre"; import Backblaze from "./Backblaze"; @@ -961,16 +1004,44 @@ export const SOFTWARE_NAME_TO_ICON_MAP = { "7 zip": SevenZip, "7-zip": SevenZip, "8x8 work": EightXEightWork, + "a better finder rename": ABetterFinderRename, "ableton live suite": AbletonLive12Suite, abstract: Abstract, + acorn: Acorn, + activedock: Activedock, + activitywatch: Activitywatch, + actual: Actual, + adguard: Adguard, + adlock: Adlock, "adobe acrobat": AcrobatReader, "adobe acrobat reader": AcrobatReader, "adobe creative cloud": CreativeCloud, "adobe digital editions": AdobeDigitalEditions45, "adobe dng converter": AdobeDngConverter, + "advanced renamer": AdvancedRenamer, affinity: Affinity, + "affinity designer": AffinityDesigner1, + "affinity designer 2": AffinityDesigner, + "affinity photo": AffinityPhoto1, + "affinity photo 2": AffinityPhoto, + "affinity publisher": AffinityPublisher1, + "affinity publisher 2": AffinityPublisher, + airbuddy: Airbuddy, aircall: Aircall, + airdroid: Airdroid, + airparrot: Airparrot, + airserver: Airserver, + airtable: Airtable, airtame: Airtame, + airy: Airy, + akiflow: Akiflow, + alcove: Alcove, + aldente: Aldente, + alloy: Alloy, + "altair graphql client": AltairGraphqlClient, + alttab: AltTab, + "amadeus pro": AmadeusPro, + amadine: Amadine, "amazon chime": AmazonChime, "amazon corretto 21": AmazonCorretto21, "amazon corretto 24": AmazonCorretto24, @@ -978,24 +1049,39 @@ export const SOFTWARE_NAME_TO_ICON_MAP = { "amazon corretto 26": AmazonCorretto26, "amazon dcv": AmazonDCV, "amazon workspaces": AmazonWorkspaces, + amethyst: Amethyst, + amie: Amie, "android studio": AndroidStudio, androidPlayStore: AndroidPlayStore, + "angry ip scanner": AngryIpScanner, anka: Anka, "another redis desktop manager": AnotherRedisDesktopManager, antigravity: Antigravity, "antigravity ide": AntigravityIde, + antinote: Antinote, + "any.do": Anydo, anydesk: AnyDesk, + anytype: Anytype, + apidog: Apidog, + "app fair": AppFair, apparency: Apparency, appcleaner: AppCleaner, + "appium inspector gui": AppiumInspector, appleAppStore: AppleAppStore, + applite: Applite, arc: Arc, archaeology: Archaeology, "arduino ide": ArduinoIde, asana: Asana, + "asset catalog tinkerer": AssetCatalogTinkerer, + atext: Atext, audacity: Audacity, + "audio hijack": AudioHijack, avast: AvastSecureBrowser, + "aviatrix vpn client": AviatrixVpnClient, "aws client vpn": AwsVpnClient, "aws vpn client": AwsVpnClient, + "axure rp": AxureRp, "azul zulu 25 jdk": AzulZulu25Jdk, "azul zulu 25 jre": AzulZulu25Jre, backblaze: Backblaze, diff --git a/website/assets/images/app-icon-a-better-finder-rename-60x60@2x.png b/website/assets/images/app-icon-a-better-finder-rename-60x60@2x.png new file mode 100644 index 0000000000..518b6128bc Binary files /dev/null and b/website/assets/images/app-icon-a-better-finder-rename-60x60@2x.png differ diff --git a/website/assets/images/app-icon-acorn-60x60@2x.png b/website/assets/images/app-icon-acorn-60x60@2x.png new file mode 100644 index 0000000000..7bdf62b7d6 Binary files /dev/null and b/website/assets/images/app-icon-acorn-60x60@2x.png differ diff --git a/website/assets/images/app-icon-activedock-60x60@2x.png b/website/assets/images/app-icon-activedock-60x60@2x.png new file mode 100644 index 0000000000..eda1a6e311 Binary files /dev/null and b/website/assets/images/app-icon-activedock-60x60@2x.png differ diff --git a/website/assets/images/app-icon-activitywatch-60x60@2x.png b/website/assets/images/app-icon-activitywatch-60x60@2x.png new file mode 100644 index 0000000000..11750486cf Binary files /dev/null and b/website/assets/images/app-icon-activitywatch-60x60@2x.png differ diff --git a/website/assets/images/app-icon-actual-60x60@2x.png b/website/assets/images/app-icon-actual-60x60@2x.png new file mode 100644 index 0000000000..79d66e8b1e Binary files /dev/null and b/website/assets/images/app-icon-actual-60x60@2x.png differ diff --git a/website/assets/images/app-icon-adguard-60x60@2x.png b/website/assets/images/app-icon-adguard-60x60@2x.png new file mode 100644 index 0000000000..76fc44351b Binary files /dev/null and b/website/assets/images/app-icon-adguard-60x60@2x.png differ diff --git a/website/assets/images/app-icon-adlock-60x60@2x.png b/website/assets/images/app-icon-adlock-60x60@2x.png new file mode 100644 index 0000000000..38d32bba90 Binary files /dev/null and b/website/assets/images/app-icon-adlock-60x60@2x.png differ diff --git a/website/assets/images/app-icon-advanced-renamer-60x60@2x.png b/website/assets/images/app-icon-advanced-renamer-60x60@2x.png new file mode 100644 index 0000000000..6e7799827a Binary files /dev/null and b/website/assets/images/app-icon-advanced-renamer-60x60@2x.png differ diff --git a/website/assets/images/app-icon-affinity-designer-60x60@2x.png b/website/assets/images/app-icon-affinity-designer-60x60@2x.png new file mode 100644 index 0000000000..c367cf0472 Binary files /dev/null and b/website/assets/images/app-icon-affinity-designer-60x60@2x.png differ diff --git a/website/assets/images/app-icon-affinity-designer@1-60x60@2x.png b/website/assets/images/app-icon-affinity-designer@1-60x60@2x.png new file mode 100644 index 0000000000..0205730133 Binary files /dev/null and b/website/assets/images/app-icon-affinity-designer@1-60x60@2x.png differ diff --git a/website/assets/images/app-icon-affinity-photo-60x60@2x.png b/website/assets/images/app-icon-affinity-photo-60x60@2x.png new file mode 100644 index 0000000000..35e66fba61 Binary files /dev/null and b/website/assets/images/app-icon-affinity-photo-60x60@2x.png differ diff --git a/website/assets/images/app-icon-affinity-photo@1-60x60@2x.png b/website/assets/images/app-icon-affinity-photo@1-60x60@2x.png new file mode 100644 index 0000000000..36cf495900 Binary files /dev/null and b/website/assets/images/app-icon-affinity-photo@1-60x60@2x.png differ diff --git a/website/assets/images/app-icon-affinity-publisher-60x60@2x.png b/website/assets/images/app-icon-affinity-publisher-60x60@2x.png new file mode 100644 index 0000000000..33b318f73b Binary files /dev/null and b/website/assets/images/app-icon-affinity-publisher-60x60@2x.png differ diff --git a/website/assets/images/app-icon-affinity-publisher@1-60x60@2x.png b/website/assets/images/app-icon-affinity-publisher@1-60x60@2x.png new file mode 100644 index 0000000000..aee1a24268 Binary files /dev/null and b/website/assets/images/app-icon-affinity-publisher@1-60x60@2x.png differ diff --git a/website/assets/images/app-icon-airbuddy-60x60@2x.png b/website/assets/images/app-icon-airbuddy-60x60@2x.png new file mode 100644 index 0000000000..01eeb111bc Binary files /dev/null and b/website/assets/images/app-icon-airbuddy-60x60@2x.png differ diff --git a/website/assets/images/app-icon-airdroid-60x60@2x.png b/website/assets/images/app-icon-airdroid-60x60@2x.png new file mode 100644 index 0000000000..00164f6717 Binary files /dev/null and b/website/assets/images/app-icon-airdroid-60x60@2x.png differ diff --git a/website/assets/images/app-icon-airparrot-60x60@2x.png b/website/assets/images/app-icon-airparrot-60x60@2x.png new file mode 100644 index 0000000000..789dbefd78 Binary files /dev/null and b/website/assets/images/app-icon-airparrot-60x60@2x.png differ diff --git a/website/assets/images/app-icon-airserver-60x60@2x.png b/website/assets/images/app-icon-airserver-60x60@2x.png new file mode 100644 index 0000000000..a7ae2768c3 Binary files /dev/null and b/website/assets/images/app-icon-airserver-60x60@2x.png differ diff --git a/website/assets/images/app-icon-airtable-60x60@2x.png b/website/assets/images/app-icon-airtable-60x60@2x.png new file mode 100644 index 0000000000..397797f58c Binary files /dev/null and b/website/assets/images/app-icon-airtable-60x60@2x.png differ diff --git a/website/assets/images/app-icon-airy-60x60@2x.png b/website/assets/images/app-icon-airy-60x60@2x.png new file mode 100644 index 0000000000..eabd024ccf Binary files /dev/null and b/website/assets/images/app-icon-airy-60x60@2x.png differ diff --git a/website/assets/images/app-icon-akiflow-60x60@2x.png b/website/assets/images/app-icon-akiflow-60x60@2x.png new file mode 100644 index 0000000000..a1a3180b88 Binary files /dev/null and b/website/assets/images/app-icon-akiflow-60x60@2x.png differ diff --git a/website/assets/images/app-icon-alcove-60x60@2x.png b/website/assets/images/app-icon-alcove-60x60@2x.png new file mode 100644 index 0000000000..c7236d16cb Binary files /dev/null and b/website/assets/images/app-icon-alcove-60x60@2x.png differ diff --git a/website/assets/images/app-icon-aldente-60x60@2x.png b/website/assets/images/app-icon-aldente-60x60@2x.png new file mode 100644 index 0000000000..a203a091b5 Binary files /dev/null and b/website/assets/images/app-icon-aldente-60x60@2x.png differ diff --git a/website/assets/images/app-icon-alloy-60x60@2x.png b/website/assets/images/app-icon-alloy-60x60@2x.png new file mode 100644 index 0000000000..778eb4faa4 Binary files /dev/null and b/website/assets/images/app-icon-alloy-60x60@2x.png differ diff --git a/website/assets/images/app-icon-alt-tab-60x60@2x.png b/website/assets/images/app-icon-alt-tab-60x60@2x.png new file mode 100644 index 0000000000..eedca1335c Binary files /dev/null and b/website/assets/images/app-icon-alt-tab-60x60@2x.png differ diff --git a/website/assets/images/app-icon-altair-graphql-client-60x60@2x.png b/website/assets/images/app-icon-altair-graphql-client-60x60@2x.png new file mode 100644 index 0000000000..916871d29b Binary files /dev/null and b/website/assets/images/app-icon-altair-graphql-client-60x60@2x.png differ diff --git a/website/assets/images/app-icon-amadeus-pro-60x60@2x.png b/website/assets/images/app-icon-amadeus-pro-60x60@2x.png new file mode 100644 index 0000000000..b8486ecbec Binary files /dev/null and b/website/assets/images/app-icon-amadeus-pro-60x60@2x.png differ diff --git a/website/assets/images/app-icon-amadine-60x60@2x.png b/website/assets/images/app-icon-amadine-60x60@2x.png new file mode 100644 index 0000000000..7c4237719e Binary files /dev/null and b/website/assets/images/app-icon-amadine-60x60@2x.png differ diff --git a/website/assets/images/app-icon-amethyst-60x60@2x.png b/website/assets/images/app-icon-amethyst-60x60@2x.png new file mode 100644 index 0000000000..f3b33ab8f3 Binary files /dev/null and b/website/assets/images/app-icon-amethyst-60x60@2x.png differ diff --git a/website/assets/images/app-icon-amie-60x60@2x.png b/website/assets/images/app-icon-amie-60x60@2x.png new file mode 100644 index 0000000000..bfbe24a046 Binary files /dev/null and b/website/assets/images/app-icon-amie-60x60@2x.png differ diff --git a/website/assets/images/app-icon-angry-ip-scanner-60x60@2x.png b/website/assets/images/app-icon-angry-ip-scanner-60x60@2x.png new file mode 100644 index 0000000000..4ffb1e5d02 Binary files /dev/null and b/website/assets/images/app-icon-angry-ip-scanner-60x60@2x.png differ diff --git a/website/assets/images/app-icon-antinote-60x60@2x.png b/website/assets/images/app-icon-antinote-60x60@2x.png new file mode 100644 index 0000000000..3c7b3327c8 Binary files /dev/null and b/website/assets/images/app-icon-antinote-60x60@2x.png differ diff --git a/website/assets/images/app-icon-anydo-60x60@2x.png b/website/assets/images/app-icon-anydo-60x60@2x.png new file mode 100644 index 0000000000..963985f15a Binary files /dev/null and b/website/assets/images/app-icon-anydo-60x60@2x.png differ diff --git a/website/assets/images/app-icon-anytype-60x60@2x.png b/website/assets/images/app-icon-anytype-60x60@2x.png new file mode 100644 index 0000000000..97ac4a99dd Binary files /dev/null and b/website/assets/images/app-icon-anytype-60x60@2x.png differ diff --git a/website/assets/images/app-icon-apidog-60x60@2x.png b/website/assets/images/app-icon-apidog-60x60@2x.png new file mode 100644 index 0000000000..c94947e189 Binary files /dev/null and b/website/assets/images/app-icon-apidog-60x60@2x.png differ diff --git a/website/assets/images/app-icon-app-fair-60x60@2x.png b/website/assets/images/app-icon-app-fair-60x60@2x.png new file mode 100644 index 0000000000..9c936850e4 Binary files /dev/null and b/website/assets/images/app-icon-app-fair-60x60@2x.png differ diff --git a/website/assets/images/app-icon-appium-inspector-60x60@2x.png b/website/assets/images/app-icon-appium-inspector-60x60@2x.png new file mode 100644 index 0000000000..aaf083c8c5 Binary files /dev/null and b/website/assets/images/app-icon-appium-inspector-60x60@2x.png differ diff --git a/website/assets/images/app-icon-applite-60x60@2x.png b/website/assets/images/app-icon-applite-60x60@2x.png new file mode 100644 index 0000000000..7d51336c60 Binary files /dev/null and b/website/assets/images/app-icon-applite-60x60@2x.png differ diff --git a/website/assets/images/app-icon-asset-catalog-tinkerer-60x60@2x.png b/website/assets/images/app-icon-asset-catalog-tinkerer-60x60@2x.png new file mode 100644 index 0000000000..0ce8235f36 Binary files /dev/null and b/website/assets/images/app-icon-asset-catalog-tinkerer-60x60@2x.png differ diff --git a/website/assets/images/app-icon-atext-60x60@2x.png b/website/assets/images/app-icon-atext-60x60@2x.png new file mode 100644 index 0000000000..6730ad00cc Binary files /dev/null and b/website/assets/images/app-icon-atext-60x60@2x.png differ diff --git a/website/assets/images/app-icon-audio-hijack-60x60@2x.png b/website/assets/images/app-icon-audio-hijack-60x60@2x.png new file mode 100644 index 0000000000..4de6d08a1e Binary files /dev/null and b/website/assets/images/app-icon-audio-hijack-60x60@2x.png differ diff --git a/website/assets/images/app-icon-aviatrix-vpn-client-60x60@2x.png b/website/assets/images/app-icon-aviatrix-vpn-client-60x60@2x.png new file mode 100644 index 0000000000..ae35cafff6 Binary files /dev/null and b/website/assets/images/app-icon-aviatrix-vpn-client-60x60@2x.png differ diff --git a/website/assets/images/app-icon-axure-rp-60x60@2x.png b/website/assets/images/app-icon-axure-rp-60x60@2x.png new file mode 100644 index 0000000000..628c8cb3a3 Binary files /dev/null and b/website/assets/images/app-icon-axure-rp-60x60@2x.png differ