{"record":{"id":"4f7642975c59bd3e","repo":"siyuan-note/siyuan","slug":"no-release-is-available-for-the-update-channel","errorCode":null,"errorMessage":"no release is available for the update channel","messagePattern":"no release is available for the update channel","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"kernel/model/updater_release.go","lineNumber":168,"sourceCode":"func getStablePackageURLs(version, pkgName string) []string {\n\tb3logURL := \"https://release.b3log.org/siyuan/\" + pkgName\n\tliuyunURL := \"https://release.liuyun.io/siyuan/\" + pkgName\n\tgithubURL := \"https://github.com/siyuan-note/siyuan/releases/download/v\" + strings.TrimPrefix(version, \"v\") + \"/\" + pkgName\n\tghproxyURL := \"https://ghfast.top/\" + githubURL\n\tif util.IsChinaCloud() {\n\t\treturn []string{b3logURL, liuyunURL, ghproxyURL, githubURL}\n\t}\n\treturn []string{b3logURL, liuyunURL, githubURL, ghproxyURL}\n}\n\nfunc getGitHubUpdateRelease(channel string, force bool) (*updateRelease, error) {\n\treleases, err := getGitHubReleases(context.TODO(), force)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tselected := selectGitHubRelease(releases, channel)\n\tif nil == selected {\n\t\treturn nil, errors.New(\"no release is available for the update channel\")\n\t}\n\n\tversion := strings.TrimPrefix(normalizeReleaseVersion(selected.TagName), \"v\")\n\trelease := &updateRelease{\n\t\tVersion:    version,\n\t\tReleaseURL: selected.HTMLURL,\n\t\tPackages:   map[string]*updatePackage{},\n\t}\n\tif \"\" == release.ReleaseURL {\n\t\trelease.ReleaseURL = githubReleaseURLPrefix + version\n\t}\n\n\tpkgName := currentInstallPackageName(version)\n\tif \"\" == pkgName {\n\t\treturn release, nil\n\t}\n\tasset := findGitHubReleaseAsset(selected, pkgName)\n\tif nil == asset || \"uploaded\" != asset.State || \"\" == asset.BrowserDownloadURL {","sourceCodeStart":150,"sourceCodeEnd":186,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/9f775e8a12daef8255556097396f9b2739078892/kernel/model/updater_release.go#L150-L186","documentation":"On a non-stable channel, getGitHubUpdateRelease fetches all GitHub releases and uses selectGitHubRelease to pick the highest non-draft release whose tag matches the channel's prerelease rules (isReleaseAllowed). If no release in the list qualifies — e.g. the channel expects a prerelease tag that does not exist, or only invalid tags are present — this error is returned.","triggerScenarios":"CheckUpdate on a preview channel when the siyuan-note/siyuan repo currently has no published (non-draft) release matching that channel's prerelease convention; GitHub API returns releases but all are drafts, have invalid semver tags, or are filtered out by isReleaseAllowed.","commonSituations":"Monitoring a preview channel right after the maintainer unpublished a prerelease or before publishing the first one; GitHub releases temporarily marked draft; cached release list (6h cache) lacking newly expected tags.","solutions":["Retry with force=true to bypass the 6-hour GitHub releases cache and get the current list","Verify on https://github.com/siyuan-note/siyuan/releases that a non-draft release with the expected prerelease tag exists; if not, wait or switch to the stable channel","Confirm the configured channel is the one you intend (see 'update channel is invalid' for config issues)","If GitHub is returning the list but tags are malformed, report/await maintainer fix; the channel matcher cannot select anything"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":"releases, err := getGitHubReleases(ctx, force)\nif err == nil && selectGitHubRelease(releases, channel) == nil {\n    logging.LogWarnf(\"no release matches channel %s; falling back to stable\", channel)\n}","typeGuard":null,"tryCatchPattern":"rel, err := getUpdateRelease(force)\nif err != nil {\n    // fall back to the stable channel or cached release info\n    rel, err = getStableUpdateRelease(false)\n}","preventionTips":["Force-refresh (bypass the 6h cache) before concluding no release exists","Check the GitHub releases page for non-draft releases matching the channel before debugging code","Offer a UI fallback to the stable channel when a preview channel has no candidates","Remember drafts and invalid tags are intentionally filtered out"],"tags":["github-api","update-channel","release-selection"],"backgroundTag":"empty-result-set","analyzedSha":"9f775e8a12daef8255556097396f9b2739078892","analyzedAt":"2026-09-19T03:17:15.984Z","contentChangedAt":"2026-09-19T03:17:15.984Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}