From 4023acbcf0d9956f311ff076219ce854e87ac1ae Mon Sep 17 00:00:00 2001 From: snowdamiz Date: Fri, 29 May 2026 15:27:46 -0700 Subject: [PATCH] re-enable x86 macos --- .../crates/xero-cli/src/update_cli.rs | 55 +++++++++--- landing/app/download/[target]/route.ts | 6 -- landing/app/download/route.ts | 8 -- .../download/unsupported/macos-intel/page.tsx | 89 ------------------- .../components/landing/structured-data.tsx | 2 +- landing/lib/download-targets.ts | 26 ++---- landing/public/install.sh | 2 +- 7 files changed, 49 insertions(+), 139 deletions(-) delete mode 100644 landing/app/download/unsupported/macos-intel/page.tsx diff --git a/client/src-tauri/crates/xero-cli/src/update_cli.rs b/client/src-tauri/crates/xero-cli/src/update_cli.rs index 7213e09e..2183b1ef 100644 --- a/client/src-tauri/crates/xero-cli/src/update_cli.rs +++ b/client/src-tauri/crates/xero-cli/src/update_cli.rs @@ -847,10 +847,7 @@ fn platform_key() -> Result<&'static str, CliError> { } #[cfg(all(target_os = "macos", target_arch = "x86_64"))] { - return Err(CliError::user_fixable( - "xero_macos_intel_unsupported", - "Xero no longer publishes macOS Intel builds. Use an Apple silicon Mac, Windows, or Linux build.", - )); + return Ok("x86_64-apple-darwin"); } #[cfg(all(target_os = "linux", target_arch = "x86_64"))] { @@ -971,16 +968,28 @@ mod tests { version: version.into(), notes: Some("notes".into()), pub_date: Some("2026-05-23T00:00:00Z".into()), - assets: BTreeMap::from([( - "x86_64-unknown-linux-gnu".into(), - UpdateAsset { - url: "xero-x86_64-unknown-linux-gnu.tar.gz".into(), - sha256: "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - .into(), - binary: Some("xero".into()), - archive: None, - }, - )]), + assets: BTreeMap::from([ + ( + "x86_64-unknown-linux-gnu".into(), + UpdateAsset { + url: "xero-x86_64-unknown-linux-gnu.tar.gz".into(), + sha256: "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" + .into(), + binary: Some("xero".into()), + archive: None, + }, + ), + ( + "x86_64-apple-darwin".into(), + UpdateAsset { + url: "xero-x86_64-apple-darwin.tar.gz".into(), + sha256: "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789" + .into(), + binary: Some("xero".into()), + archive: None, + }, + ), + ]), } } @@ -1018,6 +1027,24 @@ mod tests { assert_eq!(asset.binary, "xero"); } + #[test] + fn manifest_check_resolves_macos_intel_asset_url() { + let check = check_from_manifest( + &manifest("99.0.0"), + "https://xeroshell.com/downloads/tui/latest/manifest.json", + "x86_64-apple-darwin", + ) + .expect("check manifest"); + let asset = check.asset.expect("asset"); + + assert!(check.update_available); + assert_eq!( + asset.url, + "https://xeroshell.com/downloads/tui/latest/xero-x86_64-apple-darwin.tar.gz" + ); + assert_eq!(asset.binary, "xero"); + } + #[test] fn manifest_check_reports_no_asset_for_unsupported_platform() { let check = check_from_manifest( diff --git a/landing/app/download/[target]/route.ts b/landing/app/download/[target]/route.ts index 301abea2..e95f12ba 100644 --- a/landing/app/download/[target]/route.ts +++ b/landing/app/download/[target]/route.ts @@ -1,10 +1,8 @@ import { NextResponse } from "next/server" import { isDownloadTarget, - isUnsupportedDownloadTarget, releasePageUrl, resolveDownloadUrl, - unsupportedDownloadUrls, } from "@/lib/download-targets" export const revalidate = 300 @@ -26,10 +24,6 @@ export async function GET( return redirectTo(request, releasePageUrl) } - if (isUnsupportedDownloadTarget(target)) { - return redirectTo(request, unsupportedDownloadUrls[target]) - } - if (!isDownloadTarget(target)) { return NextResponse.json({ error: "Unknown download target" }, { status: 404 }) } diff --git a/landing/app/download/route.ts b/landing/app/download/route.ts index 20faa50a..2fd61bb7 100644 --- a/landing/app/download/route.ts +++ b/landing/app/download/route.ts @@ -1,9 +1,7 @@ import { NextResponse } from "next/server" import { detectDownloadTarget, - detectUnsupportedDownloadTarget, resolveDownloadUrl, - unsupportedDownloadUrls, } from "@/lib/download-targets" export const revalidate = 300 @@ -16,11 +14,5 @@ function redirectTo(request: Request, url: string) { } export async function GET(request: Request) { - const unsupportedTarget = detectUnsupportedDownloadTarget(request.headers) - - if (unsupportedTarget) { - return redirectTo(request, unsupportedDownloadUrls[unsupportedTarget]) - } - return redirectTo(request, await resolveDownloadUrl(detectDownloadTarget(request.headers))) } diff --git a/landing/app/download/unsupported/macos-intel/page.tsx b/landing/app/download/unsupported/macos-intel/page.tsx deleted file mode 100644 index 0bcafeb5..00000000 --- a/landing/app/download/unsupported/macos-intel/page.tsx +++ /dev/null @@ -1,89 +0,0 @@ -import type { Metadata } from "next" -import Link from "next/link" -import { AlertTriangle, ArrowLeft, Cpu, Download } from "lucide-react" -import { SiteFooter } from "@/components/landing/site-footer" -import { SiteHeader } from "@/components/landing/site-header" -import { Button } from "@/components/ui/button" -import { mailto } from "@/lib/site" - -export const metadata: Metadata = { - title: "macOS Intel support", - description: - "Xero for macOS is published for Apple silicon Macs. Intel Mac visitors are warned before downloading.", - alternates: { - canonical: "/download/unsupported/macos-intel", - }, -} - -export default function MacosIntelUnsupportedPage() { - return ( -
- -
-
-
-
-
-
- -
-

- Unsupported Mac architecture -

-

- Xero for macOS requires Apple silicon. -

-

- We no longer publish Intel Mac builds. Apple's Mac lineup has moved to Apple - silicon, and our macOS release pipeline now ships the ARM64 desktop app and TUI. -

- -
- -
-

On an Apple silicon Mac?

-

- Continue with the macOS Apple silicon build. If this warning appeared by mistake, - your browser did not report the CPU architecture accurately. -

-
-
- -
- - -
- -

- Need a supported alternative? Use the Windows or Linux builds, or email{" "} - - team@xeroshell.com - - . -

-
-
-
- -
- ) -} diff --git a/landing/components/landing/structured-data.tsx b/landing/components/landing/structured-data.tsx index 8d5fbdad..e91287ab 100644 --- a/landing/components/landing/structured-data.tsx +++ b/landing/components/landing/structured-data.tsx @@ -26,7 +26,7 @@ const jsonLd = { "@id": absoluteUrl("/#software"), name: siteConfig.name, applicationCategory: "DeveloperApplication", - operatingSystem: "macOS (Apple silicon), Windows, Linux", + operatingSystem: "macOS (Apple silicon and Intel), Windows, Linux", softwareVersion: desktopRelease.version, description: siteConfig.description, url: siteConfig.url, diff --git a/landing/lib/download-targets.ts b/landing/lib/download-targets.ts index 57f0b8bb..e7219a54 100644 --- a/landing/lib/download-targets.ts +++ b/landing/lib/download-targets.ts @@ -3,16 +3,12 @@ const releaseApiUrl = "https://api.github.com/repos/hyperpush-org/xero/releases/ const assetPatterns = { "macos-apple-silicon": /^Xero_.*_aarch64_macos-aarch64\.dmg$/, + "macos-intel": /^Xero_.*_(?:x64|x86_64)_macos-x86_64\.dmg$/, windows: /^Xero_.*_x64-setup\.exe$/, linux: /^Xero_.*_amd64\.AppImage$/, } as const export type DownloadTarget = keyof typeof assetPatterns -export type UnsupportedDownloadTarget = "macos-intel" - -export const unsupportedDownloadUrls = { - "macos-intel": "/download/unsupported/macos-intel", -} as const satisfies Record type GitHubRelease = { html_url?: string @@ -46,24 +42,14 @@ export function isDownloadTarget(target: string): target is DownloadTarget { return target in assetPatterns } -export function isUnsupportedDownloadTarget(target: string): target is UnsupportedDownloadTarget { - return target in unsupportedDownloadUrls -} - -export function detectUnsupportedDownloadTarget(headers: Headers): UnsupportedDownloadTarget | null { - const { platform, architecture, userAgent } = getRequestPlatform(headers) - - if (isMacRequest(platform, userAgent) && isIntelArchitecture(architecture)) { - return "macos-intel" - } - - return null -} - export function detectDownloadTarget(headers: Headers): DownloadTarget | null { - const { platform, userAgent } = getRequestPlatform(headers) + const { platform, architecture, userAgent } = getRequestPlatform(headers) if (isMacRequest(platform, userAgent)) { + if (isIntelArchitecture(architecture)) { + return "macos-intel" + } + return "macos-apple-silicon" } diff --git a/landing/public/install.sh b/landing/public/install.sh index 3b2a02f4..c537f499 100644 --- a/landing/public/install.sh +++ b/landing/public/install.sh @@ -45,7 +45,7 @@ target_triple() { printf 'aarch64-apple-darwin' ;; Darwin:x86_64|Darwin:amd64) - fail 'macOS Intel builds are no longer published. Xero for macOS requires Apple silicon; use an Apple silicon Mac, Windows, or Linux build.' + printf 'x86_64-apple-darwin' ;; Linux:x86_64|Linux:amd64) printf 'x86_64-unknown-linux-gnu'