From 7e7ab2ecbd9f15f2c6c9c3860dabef1f66f65d45 Mon Sep 17 00:00:00 2001 From: Muse Date: Thu, 22 Oct 2026 13:33:08 +0000 Subject: [PATCH] =?UTF-8?q?feat(update):=20=E5=8F=91=E8=A1=8C=20tag=20?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=94=AF=E6=8C=81=20XUI=5FRELEASE=5FLATEST?= =?UTF-8?q?=5FURL=20=E8=A6=86=E7=9B=96=EF=BC=88=E9=95=9C=E5=83=8F/?= =?UTF-8?q?=E6=B2=99=E7=AE=B1=E5=86=92=E5=85=85=E5=8F=91=E8=A1=8C=E6=BA=90?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/selfupdate/selfupdate.go | 14 +++++++++++++- internal/web/service/panel/panel.go | 8 ++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/internal/selfupdate/selfupdate.go b/internal/selfupdate/selfupdate.go index c7d10f5..ad43434 100644 --- a/internal/selfupdate/selfupdate.go +++ b/internal/selfupdate/selfupdate.go @@ -53,12 +53,24 @@ func AssetName(goarch string) (string, error) { } } +// LatestReleaseURLEnv overrides the release-lookup endpoint as a whole +// (mirrors, tests), analogous to BaseURLEnv. +const LatestReleaseURLEnv = "XUI_RELEASE_LATEST_URL" + +// LatestReleaseURL returns the effective release-lookup endpoint. +func LatestReleaseURL() string { + if v := strings.TrimSpace(os.Getenv(LatestReleaseURLEnv)); v != "" { + return v + } + return LatestReleaseAPI +} + // FetchLatestReleaseTag returns the tag_name of the newest release. func FetchLatestReleaseTag(ctx context.Context, client *http.Client) (string, error) { if client == nil { client = http.DefaultClient } - req, err := http.NewRequestWithContext(ctx, http.MethodGet, LatestReleaseAPI, nil) + req, err := http.NewRequestWithContext(ctx, http.MethodGet, LatestReleaseURL(), nil) if err != nil { return "", err } diff --git a/internal/web/service/panel/panel.go b/internal/web/service/panel/panel.go index 55adc64..9a081f1 100644 --- a/internal/web/service/panel/panel.go +++ b/internal/web/service/panel/panel.go @@ -601,7 +601,10 @@ func (s *PanelService) runNativeUpdate(runID int64) { releaseUpdateSlot() } - tag, err := fetchLatestPanelVersion() + client := (&service.SettingService{}).NewProxiedHTTPClient(10 * time.Minute) + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute) + defer cancel() + tag, err := selfupdate.FetchLatestReleaseTag(ctx, client) if err != nil { fail("fetch latest release: %v", err) return @@ -622,9 +625,6 @@ func (s *PanelService) runNativeUpdate(runID int64) { } tmp := filepath.Join(filepath.Dir(exePath), fmt.Sprintf(".x-ui-update-%d", runID)) base := selfupdate.BaseURL() + tag + "/" - client := (&service.SettingService{}).NewProxiedHTTPClient(10 * time.Minute) - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute) - defer cancel() logger.Infof("panel self-update: downloading %s (%s)", tag, asset) if err := selfupdate.DownloadVerified(ctx, client, base+asset, base+asset+".sha256", tmp); err != nil { _ = os.Remove(tmp)