authorgravatar for noah@wts.devNoah Gregory <noah@wts.dev> 2026-04-09 21:27:24-04:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-04-09 18:27:24-07:00
log5d9eb183123466fdf4b972fe33a4823d089370d3
treea86e7082dd92fa30cf6b93ed6418b24f46d7d8ab
parentabb84c09e3051db4745ba19a65e5d88319d473d2
signature Signed by PGP key B5690EEEBB952194

fix: don't let un-updateable builds check for an update (#1808)

Co-authored-by: Julius Marminge <julius0216@outlook.com>

3 files changed, 50 insertions(+), 11 deletions(-)

apps/desktop/src/main.ts+17-11
...@@ -700,12 +700,15 @@ function dispatchMenuAction(action: string): void {...@@ -700,12 +700,15 @@ function dispatchMenuAction(action: string): void {
700}700}
701701
702function handleCheckForUpdatesMenuClick(): void {702function handleCheckForUpdatesMenuClick(): void {
703 const hasUpdateFeedConfig =
704 readAppUpdateYml() !== null || Boolean(process.env.T3CODE_DESKTOP_MOCK_UPDATES);
703 const disabledReason = getAutoUpdateDisabledReason({705 const disabledReason = getAutoUpdateDisabledReason({
704 isDevelopment,706 isDevelopment,
705 isPackaged: app.isPackaged,707 isPackaged: app.isPackaged,
706 platform: process.platform,708 platform: process.platform,
707 appImage: process.env.APPIMAGE,709 appImage: process.env.APPIMAGE,
708 disabledByEnv: process.env.T3CODE_DISABLE_AUTO_UPDATE === "1",710 disabledByEnv: process.env.T3CODE_DISABLE_AUTO_UPDATE === "1",
711 hasUpdateFeedConfig,
709 });712 });
710 if (disabledReason) {713 if (disabledReason) {
711 console.info("[desktop-updater] Manual update check requested, but updates are disabled.");714 console.info("[desktop-updater] Manual update check requested, but updates are disabled.");
...@@ -942,6 +945,8 @@ function setUpdateState(patch: Partial<DesktopUpdateState>): void {...@@ -942,6 +945,8 @@ function setUpdateState(patch: Partial<DesktopUpdateState>): void {
942}945}
943946
944function shouldEnableAutoUpdates(): boolean {947function shouldEnableAutoUpdates(): boolean {
948 const hasUpdateFeedConfig =
949 readAppUpdateYml() !== null || Boolean(process.env.T3CODE_DESKTOP_MOCK_UPDATES);
945 return (950 return (
946 getAutoUpdateDisabledReason({951 getAutoUpdateDisabledReason({
947 isDevelopment,952 isDevelopment,
...@@ -949,6 +954,7 @@ function shouldEnableAutoUpdates(): boolean {...@@ -949,6 +954,7 @@ function shouldEnableAutoUpdates(): boolean {
949 platform: process.platform,954 platform: process.platform,
950 appImage: process.env.APPIMAGE,955 appImage: process.env.APPIMAGE,
951 disabledByEnv: process.env.T3CODE_DISABLE_AUTO_UPDATE === "1",956 disabledByEnv: process.env.T3CODE_DISABLE_AUTO_UPDATE === "1",
957 hasUpdateFeedConfig,
952 }) === null958 }) === null
953 );959 );
954}960}
...@@ -1032,17 +1038,6 @@ async function installDownloadedUpdate(): Promise<{ accepted: boolean; completed...@@ -1032,17 +1038,6 @@ async function installDownloadedUpdate(): Promise<{ accepted: boolean; completed
1032}1038}
10331039
1034function configureAutoUpdater(): void {1040function configureAutoUpdater(): void {
1035 const enabled = shouldEnableAutoUpdates();
1036 setUpdateState({
1037 ...createInitialDesktopUpdateState(app.getVersion(), desktopRuntimeInfo),
1038 enabled,
1039 status: enabled ? "idle" : "disabled",
1040 });
1041 if (!enabled) {
1042 return;
1043 }
1044 updaterConfigured = true;
1045
1046 const githubToken =1041 const githubToken =
1047 process.env.T3CODE_DESKTOP_UPDATE_GITHUB_TOKEN?.trim() || process.env.GH_TOKEN?.trim() || "";1042 process.env.T3CODE_DESKTOP_UPDATE_GITHUB_TOKEN?.trim() || process.env.GH_TOKEN?.trim() || "";
1048 if (githubToken) {1043 if (githubToken) {
...@@ -1067,6 +1062,17 @@ function configureAutoUpdater(): void {...@@ -1067,6 +1062,17 @@ function configureAutoUpdater(): void {
1067 });1062 });
1068 }1063 }
10691064
1065 const enabled = shouldEnableAutoUpdates();
1066 setUpdateState({
1067 ...createInitialDesktopUpdateState(app.getVersion(), desktopRuntimeInfo),
1068 enabled,
1069 status: enabled ? "idle" : "disabled",
1070 });
1071 if (!enabled) {
1072 return;
1073 }
1074 updaterConfigured = true;
1075
1070 autoUpdater.autoDownload = false;1076 autoUpdater.autoDownload = false;
1071 autoUpdater.autoInstallOnAppQuit = false;1077 autoUpdater.autoInstallOnAppQuit = false;
1072 // Keep alpha branding, but force all installs onto the stable update track.1078 // Keep alpha branding, but force all installs onto the stable update track.
apps/desktop/src/updateState.test.ts+29
...@@ -71,10 +71,37 @@ describe("getAutoUpdateDisabledReason", () => {...@@ -71,10 +71,37 @@ describe("getAutoUpdateDisabledReason", () => {
71 platform: "darwin",71 platform: "darwin",
72 appImage: undefined,72 appImage: undefined,
73 disabledByEnv: false,73 disabledByEnv: false,
74 hasUpdateFeedConfig: true,
74 }),75 }),
75 ).toContain("packaged production builds");76 ).toContain("packaged production builds");
76 });77 });
7778
79 it("reports packaged local builds without an update feed as disabled", () => {
80 expect(
81 getAutoUpdateDisabledReason({
82 isDevelopment: false,
83 isPackaged: true,
84 platform: "darwin",
85 appImage: undefined,
86 disabledByEnv: false,
87 hasUpdateFeedConfig: false,
88 }),
89 ).toContain("no update feed");
90 });
91
92 it("allows packaged builds with an update feed", () => {
93 expect(
94 getAutoUpdateDisabledReason({
95 isDevelopment: false,
96 isPackaged: true,
97 platform: "darwin",
98 appImage: undefined,
99 disabledByEnv: false,
100 hasUpdateFeedConfig: true,
101 }),
102 ).toBeNull();
103 });
104
78 it("reports env-disabled auto updates", () => {105 it("reports env-disabled auto updates", () => {
79 expect(106 expect(
80 getAutoUpdateDisabledReason({107 getAutoUpdateDisabledReason({
...@@ -83,6 +110,7 @@ describe("getAutoUpdateDisabledReason", () => {...@@ -83,6 +110,7 @@ describe("getAutoUpdateDisabledReason", () => {
83 platform: "darwin",110 platform: "darwin",
84 appImage: undefined,111 appImage: undefined,
85 disabledByEnv: true,112 disabledByEnv: true,
113 hasUpdateFeedConfig: true,
86 }),114 }),
87 ).toContain("T3CODE_DISABLE_AUTO_UPDATE");115 ).toContain("T3CODE_DISABLE_AUTO_UPDATE");
88 });116 });
...@@ -95,6 +123,7 @@ describe("getAutoUpdateDisabledReason", () => {...@@ -95,6 +123,7 @@ describe("getAutoUpdateDisabledReason", () => {
95 platform: "linux",123 platform: "linux",
96 appImage: undefined,124 appImage: undefined,
97 disabledByEnv: false,125 disabledByEnv: false,
126 hasUpdateFeedConfig: true,
98 }),127 }),
99 ).toContain("AppImage");128 ).toContain("AppImage");
100 });129 });
apps/desktop/src/updateState.ts+4
...@@ -34,7 +34,11 @@ export function getAutoUpdateDisabledReason(args: {...@@ -34,7 +34,11 @@ export function getAutoUpdateDisabledReason(args: {
34 platform: NodeJS.Platform;34 platform: NodeJS.Platform;
35 appImage?: string | undefined;35 appImage?: string | undefined;
36 disabledByEnv: boolean;36 disabledByEnv: boolean;
37 hasUpdateFeedConfig: boolean;
37}): string | null {38}): string | null {
39 if (!args.hasUpdateFeedConfig) {
40 return "Automatic updates are not available because no update feed is configured.";
41 }
38 if (args.isDevelopment || !args.isPackaged) {42 if (args.isDevelopment || !args.isPackaged) {
39 return "Automatic updates are only available in packaged production builds.";43 return "Automatic updates are only available in packaged production builds.";
40 }44 }