From 3d067afb47a161362cade998bf89e9f5b218e7d4 Mon Sep 17 00:00:00 2001 From: Allen Houchins <32207388+allenhouchins@users.noreply.github.com> Date: Tue, 14 Apr 2026 09:57:23 -0500 Subject: [PATCH] Add Linear as a Windows FMA (#43521) Add Windows support for Linear: new winget input (ee/maintained-apps/inputs/winget/linear.json) with installer metadata and category, plus install/uninstall PowerShell scripts. Add output metadata (ee/maintained-apps/outputs/linear/windows.json) including a version entry, installer URL, sha256 and script refs, and register the app in apps.json. Update frontend icon component to reference a new PNG and add the image asset. **Related issue:** Resolves #43501 --- ee/maintained-apps/inputs/winget/linear.json | 13 ++ .../inputs/winget/scripts/linear_install.ps1 | 26 ++++ .../winget/scripts/linear_uninstall.ps1 | 112 ++++++++++++++++++ ee/maintained-apps/outputs/apps.json | 9 +- .../outputs/linear/windows.json | 22 ++++ .../SoftwarePage/components/icons/Linear.tsx | 2 +- .../images/app-icon-linear-60x60@2x.png | Bin 0 -> 19239 bytes 7 files changed, 182 insertions(+), 2 deletions(-) create mode 100644 ee/maintained-apps/inputs/winget/linear.json create mode 100644 ee/maintained-apps/inputs/winget/scripts/linear_install.ps1 create mode 100644 ee/maintained-apps/inputs/winget/scripts/linear_uninstall.ps1 create mode 100644 ee/maintained-apps/outputs/linear/windows.json create mode 100644 website/assets/images/app-icon-linear-60x60@2x.png diff --git a/ee/maintained-apps/inputs/winget/linear.json b/ee/maintained-apps/inputs/winget/linear.json new file mode 100644 index 0000000000..5447cf9022 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/linear.json @@ -0,0 +1,13 @@ +{ + "name": "Linear", + "slug": "linear/windows", + "package_identifier": "LinearOrbit.Linear", + "unique_identifier": "Linear", + "fuzzy_match_name": true, + "installer_arch": "x64", + "installer_type": "exe", + "installer_scope": "machine", + "install_script_path": "ee/maintained-apps/inputs/winget/scripts/linear_install.ps1", + "uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/linear_uninstall.ps1", + "default_categories": ["Productivity"] +} diff --git a/ee/maintained-apps/inputs/winget/scripts/linear_install.ps1 b/ee/maintained-apps/inputs/winget/scripts/linear_install.ps1 new file mode 100644 index 0000000000..21e11360ce --- /dev/null +++ b/ee/maintained-apps/inputs/winget/scripts/linear_install.ps1 @@ -0,0 +1,26 @@ +# Learn more about .exe install scripts: +# http://fleetdm.com/learn-more-about/exe-install-scripts + +$exeFilePath = "${env:INSTALLER_PATH}" + +try { + # Linear uses a Nullsoft installer: + # - /S for silent installation + # - /allusers for machine-scope installs + $processOptions = @{ + FilePath = "$exeFilePath" + ArgumentList = "/S /allusers" + PassThru = $true + Wait = $true + } + + $process = Start-Process @processOptions + $exitCode = $process.ExitCode + + Write-Host "Install exit code: $exitCode" + Exit $exitCode +} +catch { + Write-Host "Error: $_" + Exit 1 +} diff --git a/ee/maintained-apps/inputs/winget/scripts/linear_uninstall.ps1 b/ee/maintained-apps/inputs/winget/scripts/linear_uninstall.ps1 new file mode 100644 index 0000000000..d90c4d9827 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/scripts/linear_uninstall.ps1 @@ -0,0 +1,112 @@ +# Attempts to locate Linear's uninstaller from registry and execute it silently + +$displayName = "Linear" +$productCode = "e614e7b4-b4f2-531a-be3f-ebb7fc898755" + +$paths = @( + 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', + 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall' +) + +$uninstall = $null + +foreach ($p in $paths) { + $codeCandidates = @( + "$p\$productCode", + "$p\{$productCode}" + ) + + foreach ($candidate in $codeCandidates) { + if (Test-Path $candidate) { + $uninstall = Get-ItemProperty -Path $candidate -ErrorAction SilentlyContinue + if ($uninstall) { + break + } + } + } + + if ($uninstall) { + break + } + + $items = Get-ItemProperty "$p\*" -ErrorAction SilentlyContinue | Where-Object { + $_.DisplayName -and ($_.DisplayName -eq $displayName -or $_.DisplayName -like "$displayName*") + } + + if ($items) { + $uninstall = $items | Select-Object -First 1 + break + } +} + +if (-not $uninstall) { + Write-Host "Uninstall entry not found" + Exit 0 +} + +$uninstallString = if ($uninstall.QuietUninstallString) { + $uninstall.QuietUninstallString +} +else { + $uninstall.UninstallString +} + +if (-not $uninstallString) { + Write-Host "Uninstall command not found" + Exit 0 +} + +# Stop the app before uninstalling. +Stop-Process -Name "Linear" -Force -ErrorAction SilentlyContinue + +$exePath = "" +$arguments = "" + +if ($uninstallString -match '^"([^"]+)"(.*)') { + $exePath = $matches[1] + $arguments = $matches[2].Trim() +} +elseif ($uninstallString -match '^([^\s]+)(.*)') { + $exePath = $matches[1] + $arguments = $matches[2].Trim() +} +else { + Write-Host "Error: Could not parse uninstall string: $uninstallString" + Exit 1 +} + +$argumentList = @() +if ($arguments -ne '') { + $argumentList += $arguments -split '\s+' +} + +# NSIS uninstallers require /S for silent mode. +if ($argumentList -notcontains "/S" -and $arguments -notmatch '\b/S\b') { + $argumentList += "/S" +} + +Write-Host "Uninstall executable: $exePath" +Write-Host "Uninstall arguments: $($argumentList -join ' ')" + +try { + $processOptions = @{ + FilePath = $exePath + NoNewWindow = $true + PassThru = $true + Wait = $true + } + + if ($argumentList.Count -gt 0) { + $processOptions.ArgumentList = $argumentList + } + + $process = Start-Process @processOptions + $exitCode = $process.ExitCode + + Write-Host "Uninstall exit code: $exitCode" + Exit $exitCode +} +catch { + Write-Host "Error running uninstaller: $_" + Exit 1 +} diff --git a/ee/maintained-apps/outputs/apps.json b/ee/maintained-apps/outputs/apps.json index b5cd6ce893..538f53f814 100644 --- a/ee/maintained-apps/outputs/apps.json +++ b/ee/maintained-apps/outputs/apps.json @@ -1002,6 +1002,13 @@ "unique_identifier": "com.linear", "description": "Linear is an app to manage software development and track bugs." }, + { + "name": "Linear", + "slug": "linear/windows", + "platform": "windows", + "unique_identifier": "Linear", + "description": "Linear is an app to manage software development and track bugs." + }, { "name": "Little Snitch", "slug": "little-snitch/darwin", @@ -1955,4 +1962,4 @@ "description": "Zotero is a free tool for collecting, organizing, citing, and sharing research." } ] -} +} \ No newline at end of file diff --git a/ee/maintained-apps/outputs/linear/windows.json b/ee/maintained-apps/outputs/linear/windows.json new file mode 100644 index 0000000000..191bd8ceb2 --- /dev/null +++ b/ee/maintained-apps/outputs/linear/windows.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "1.28.13", + "queries": { + "exists": "SELECT 1 FROM programs WHERE name LIKE 'Linear %' AND publisher = 'Linear Orbit, Inc.';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'Linear %' AND publisher = 'Linear Orbit, Inc.' AND version_compare(version, '1.28.13') < 0);" + }, + "installer_url": "https://download.todesktop.com/200315glz2793v6/Linear%20Setup%201.28.13%20-%20Build%20260318pho1bttxr-x64.exe", + "install_script_ref": "166c7345", + "uninstall_script_ref": "b1906016", + "sha256": "6279df1ceab3d4c66ff9185b8a3bb121137d52e0abae80db5a0b9708d0eb2352", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "166c7345": "# Learn more about .exe install scripts:\n# http://fleetdm.com/learn-more-about/exe-install-scripts\n\n$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n # Linear uses a Nullsoft installer:\n # - /S for silent installation\n # - /allusers for machine-scope installs\n $processOptions = @{\n FilePath = \"$exeFilePath\"\n ArgumentList = \"/S /allusers\"\n PassThru = $true\n Wait = $true\n }\n\n $process = Start-Process @processOptions\n $exitCode = $process.ExitCode\n\n Write-Host \"Install exit code: $exitCode\"\n Exit $exitCode\n}\ncatch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n", + "b1906016": "# Attempts to locate Linear's uninstaller from registry and execute it silently\n\n$displayName = \"Linear\"\n$productCode = \"e614e7b4-b4f2-531a-be3f-ebb7fc898755\"\n\n$paths = @(\n 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall',\n 'HKLM:\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall'\n)\n\n$uninstall = $null\n\nforeach ($p in $paths) {\n $codeCandidates = @(\n \"$p\\$productCode\",\n \"$p\\{$productCode}\"\n )\n\n foreach ($candidate in $codeCandidates) {\n if (Test-Path $candidate) {\n $uninstall = Get-ItemProperty -Path $candidate -ErrorAction SilentlyContinue\n if ($uninstall) {\n break\n }\n }\n }\n\n if ($uninstall) {\n break\n }\n\n $items = Get-ItemProperty \"$p\\*\" -ErrorAction SilentlyContinue | Where-Object {\n $_.DisplayName -and ($_.DisplayName -eq $displayName -or $_.DisplayName -like \"$displayName*\")\n }\n\n if ($items) {\n $uninstall = $items | Select-Object -First 1\n break\n }\n}\n\nif (-not $uninstall) {\n Write-Host \"Uninstall entry not found\"\n Exit 0\n}\n\n$uninstallString = if ($uninstall.QuietUninstallString) {\n $uninstall.QuietUninstallString\n}\nelse {\n $uninstall.UninstallString\n}\n\nif (-not $uninstallString) {\n Write-Host \"Uninstall command not found\"\n Exit 0\n}\n\n# Stop the app before uninstalling.\nStop-Process -Name \"Linear\" -Force -ErrorAction SilentlyContinue\n\n$exePath = \"\"\n$arguments = \"\"\n\nif ($uninstallString -match '^\"([^\"]+)\"(.*)') {\n $exePath = $matches[1]\n $arguments = $matches[2].Trim()\n}\nelseif ($uninstallString -match '^([^\\s]+)(.*)') {\n $exePath = $matches[1]\n $arguments = $matches[2].Trim()\n}\nelse {\n Write-Host \"Error: Could not parse uninstall string: $uninstallString\"\n Exit 1\n}\n\n$argumentList = @()\nif ($arguments -ne '') {\n $argumentList += $arguments -split '\\s+'\n}\n\n# NSIS uninstallers require /S for silent mode.\nif ($argumentList -notcontains \"/S\" -and $arguments -notmatch '\\b/S\\b') {\n $argumentList += \"/S\"\n}\n\nWrite-Host \"Uninstall executable: $exePath\"\nWrite-Host \"Uninstall arguments: $($argumentList -join ' ')\"\n\ntry {\n $processOptions = @{\n FilePath = $exePath\n NoNewWindow = $true\n PassThru = $true\n Wait = $true\n }\n\n if ($argumentList.Count -gt 0) {\n $processOptions.ArgumentList = $argumentList\n }\n\n $process = Start-Process @processOptions\n $exitCode = $process.ExitCode\n\n Write-Host \"Uninstall exit code: $exitCode\"\n Exit $exitCode\n}\ncatch {\n Write-Host \"Error running uninstaller: $_\"\n Exit 1\n}\n" + } +} diff --git a/frontend/pages/SoftwarePage/components/icons/Linear.tsx b/frontend/pages/SoftwarePage/components/icons/Linear.tsx index 972c908c4f..9119f80897 100644 --- a/frontend/pages/SoftwarePage/components/icons/Linear.tsx +++ b/frontend/pages/SoftwarePage/components/icons/Linear.tsx @@ -7,7 +7,7 @@ const Linear = (props: SVGProps) => ( ); diff --git a/website/assets/images/app-icon-linear-60x60@2x.png b/website/assets/images/app-icon-linear-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..89e27091a7c0531f925f0f19c313c51faf355f31 GIT binary patch literal 19239 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