diff --git a/CHANGELOG.md b/CHANGELOG.md index 846df589..0ac21a66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,8 +34,10 @@ Making a new release? Simply add the new header with the version and date undern * Fixed `$path` values that point outside the project folder failing to match `syncRule`s on Windows, which broke `rojo sourcemap` with a "could not be turned into a Roblox Instance" error. ([#1290]) * Fixed `rojo serve` silently stopping syncing file changes on Windows when the served project path was a verbatim (`\\?\`) path, because tree paths and file-watcher event paths were canonicalized to different forms. ([#1290]) * Fixed `rojo sourcemap --absolute` emitting verbatim (`\\?\`) paths on Windows, which broke require types in luau-lsp. ([#1290]) +* The plugin now disables the `Check for Updates` setting if you block access to `api.github.com`. ([#1297]) [#1290]: https://github.com/rojo-rbx/rojo/pull/1290 +[#1297]: https://github.com/rojo-rbx/rojo/pull/1297 ## [7.7.0] (July 1st, 2026) diff --git a/plugin/src/App/StatusPages/Settings/init.lua b/plugin/src/App/StatusPages/Settings/init.lua index b63d30e5..b93eba3e 100644 --- a/plugin/src/App/StatusPages/Settings/init.lua +++ b/plugin/src/App/StatusPages/Settings/init.lua @@ -8,6 +8,7 @@ local Log = require(Packages.Log) local Assets = require(Plugin.Assets) local Settings = require(Plugin.Settings) local Theme = require(Plugin.App.Theme) +local Version = require(Plugin.Version) local IconButton = require(Plugin.App.Components.IconButton) local ScrollingFrame = require(Plugin.App.Components.ScrollingFrame) @@ -193,6 +194,8 @@ function SettingsPage:render() id = "checkForUpdates", name = "Check For Updates", description = "Notify about newer compatible Rojo releases", + locked = Version.isApiBlocked(), + lockedTooltip = "(HTTP requests to api.github.com are blocked, Rojo cannot fetch what the latest version is.)", transparency = self.props.transparency, layoutOrder = layoutIncrement(), }), diff --git a/plugin/src/Version.lua b/plugin/src/Version.lua index 197de133..40b4870c 100644 --- a/plugin/src/Version.lua +++ b/plugin/src/Version.lua @@ -111,6 +111,24 @@ Version._cachedLatestCompatible = nil :: { timestamp: number, }? +--[[ + A user may choose to reject requests to api.github.com. If they do, we want + to disable the setting for checking for updates to indicate that it does + nothing. +]] +Version._apiBlocked = nil :: boolean? + +function Version.isApiBlocked(): boolean + if Version._apiBlocked == nil then + local isLocalInstall = string.find(debug.traceback(), "\n[^\n]-user_.-$") ~= nil + Version.retrieveLatestCompatible({ + version = Config.version, + includePrereleases = isLocalInstall and Settings:get("checkForPrereleases"), + }) + end + return Version._apiBlocked +end + function Version.retrieveLatestCompatible(options: { version: { number }, includePrereleases: boolean?, @@ -136,8 +154,13 @@ function Version.retrieveLatestCompatible(options: { :await() if success == false or type(releases) ~= "table" or next(releases) ~= 1 then + -- Roblox's HTTP errors are weird! + if string.find(tostring(releases), "^Unknown HTTP error: HttpService permission denied") then + Version._apiBlocked = true + end return nil end + Version._apiBlocked = false -- Iterate through releases, looking for the latest compatible version local latestCompatible: LatestReleaseInfo? = nil