{"record":{"id":"e7bdb9a489887271","repo":"gitbutlerapp/gitbutler","slug":"install-function-not-available","errorCode":null,"errorMessage":"Install function not available.","messagePattern":"Install function not available\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"apps/desktop/src/lib/updater/updater.ts","lineNumber":171,"sourceCode":"\t\t} finally {\n\t\t\tthis.loading.set(false);\n\t\t}\n\t}\n\n\tprivate async download() {\n\t\tif (!this.backendDownload) {\n\t\t\tthrow new Error(\"Download function not available.\");\n\t\t}\n\t\tthis.setStatus(\"Downloading\");\n\t\tawait this.backendDownload((progress: DownloadEvent) => {\n\t\t\tthis.setStatus(downloadStatusMap[progress.event]);\n\t\t});\n\t\tthis.setStatus(\"Downloaded\");\n\t}\n\n\tprivate async install() {\n\t\tif (!this.backendInstall) {\n\t\t\tthrow new Error(\"Install function not available.\");\n\t\t}\n\t\tthis.setStatus(\"Installing\");\n\t\tawait this.backendInstall();\n\t\tthis.setStatus(\"Done\");\n\t}\n\n\tprivate setStatus(status: InstallStatus) {\n\t\tthis.update.update((update) => {\n\t\t\treturn { ...update, status };\n\t\t});\n\t}\n\n\tasync relaunchApp() {\n\t\ttry {\n\t\t\tawait this.backend.relaunch();\n\t\t} catch (err: unknown) {\n\t\t\thandleError(err, true);\n\t\t}","sourceCodeStart":153,"sourceCodeEnd":189,"githubUrl":"https://github.com/gitbutlerapp/gitbutler/blob/58e5313667b857ef39a730e380af31816a7b1768/apps/desktop/src/lib/updater/updater.ts#L153-L189","documentation":"Thrown by the updater's private install() when this.backendInstall is unset. Like backendDownload, the backend install function is only registered when a real, downloadable update exists and the platform supports installation. Installing without it is an invalid updater state.","triggerScenarios":"downloadAndInstall() reaching the install step when backendInstall was never set — i.e. install invoked without a prepared update (updater unavailable, dev mode, no checked update).","commonSituations":"Same as error 25: dev builds, missing Tauri updater plugin configuration, unsupported platform, or calling install out of sequence.","solutions":["Ensure downloadAndInstall is only invoked after a successful update check.","Gate the update action on updater availability state in the UI.","Check that the Tauri updater plugin and its signing/public-key configuration are present in a packaged build."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"if (!updater.isUpdateAvailable()) return; // install only after download is prepared","typeGuard":null,"tryCatchPattern":"try {\n  await updater.downloadAndInstall();\n} catch (e) {\n  showToast('Update installation is not available');\n}","preventionTips":["Never call install steps out of sequence — always via downloadAndInstall after check()","Verify Tauri updater plugin config and signing keys in packaged builds"],"tags":["updater","initialization","desktop"],"backgroundTag":"feature-not-enabled","analyzedSha":"58e5313667b857ef39a730e380af31816a7b1768","analyzedAt":"2026-09-18T06:50:32.052Z","contentChangedAt":"2026-09-18T06:50:32.052Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}