From 3228574a8c169ec8ac795b75210d50b317c79068 Mon Sep 17 00:00:00 2001 From: ryan Date: Fri, 12 Jun 2026 15:32:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=BC=E5=AE=B9=E5=8C=85=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/apps/admin/updater/logics.go | 30 +++++++++++++--- internal/apps/admin/updater/logics_test.go | 41 +++++++++++++++++++++- 2 files changed, 66 insertions(+), 5 deletions(-) diff --git a/internal/apps/admin/updater/logics.go b/internal/apps/admin/updater/logics.go index b0abe5fc..88d79297 100644 --- a/internal/apps/admin/updater/logics.go +++ b/internal/apps/admin/updater/logics.go @@ -133,7 +133,22 @@ func expectedAssetName(tag string) string { return fmt.Sprintf("wavelet_%s_%s_%s.%s", tag, runtime.GOOS, runtime.GOARCH, extension) } -func selectLatestRelease(releases []githubRelease) (githubRelease, releaseAsset, error) { +func expectedAssetNames(repository, tag string) []string { + names := []string{expectedAssetName(tag)} + if parts := strings.Split(repository, "/"); len(parts) == repositoryParts { + repoName := parts[1] + if repoName != "wavelet" { + extension := "tar.gz" + if runtime.GOOS == windowsOS { + extension = "zip" + } + names = append(names, fmt.Sprintf("%s_%s_%s_%s.%s", repoName, tag, runtime.GOOS, runtime.GOARCH, extension)) + } + } + return names +} + +func selectLatestRelease(repository string, releases []githubRelease) (githubRelease, releaseAsset, error) { var selected githubRelease var selectedAsset releaseAsset selectedVersion := "" @@ -143,9 +158,16 @@ func selectLatestRelease(releases []githubRelease) (githubRelease, releaseAsset, if release.Draft || version == "" { continue } - expectedName := expectedAssetName(release.TagName) + expectedNames := expectedAssetNames(repository, release.TagName) for _, asset := range release.Assets { - if asset.Name != expectedName || asset.BrowserDownloadURL == "" || asset.State != "uploaded" { + matched := false + for _, name := range expectedNames { + if asset.Name == name { + matched = true + break + } + } + if !matched || asset.BrowserDownloadURL == "" || asset.State != "uploaded" { continue } if selectedVersion == "" || semver.Compare(version, selectedVersion) > 0 { @@ -194,7 +216,7 @@ func (m *manager) fetchRelease(ctx context.Context, repository string) (githubRe return githubRelease{}, releaseAsset{}, fmt.Errorf("%s: %w", errReleaseResponseInvalid, err) } - release, asset, err := selectLatestRelease(releases) + release, asset, err := selectLatestRelease(repository, releases) if err != nil { return githubRelease{}, releaseAsset{}, err } diff --git a/internal/apps/admin/updater/logics_test.go b/internal/apps/admin/updater/logics_test.go index f12dfa19..b6fe09f0 100644 --- a/internal/apps/admin/updater/logics_test.go +++ b/internal/apps/admin/updater/logics_test.go @@ -67,7 +67,7 @@ func TestSelectLatestRelease(t *testing.T) { }, } - release, asset, err := selectLatestRelease(releases) + release, asset, err := selectLatestRelease("Rain-kl/Wavelet", releases) if err != nil { t.Fatalf("selectLatestRelease() error = %v", err) } @@ -79,6 +79,45 @@ func TestSelectLatestRelease(t *testing.T) { } } +func TestSelectLatestReleaseWithCustomRepo(t *testing.T) { + extension := "tar.gz" + if runtime.GOOS == "windows" { + extension = "zip" + } + releases := []githubRelease{ + { + TagName: "v1.0.0", + Published: time.Date(2026, time.June, 1, 0, 0, 0, 0, time.UTC), + Assets: []releaseAsset{{ + Name: "wavelet_v1.0.0_" + runtime.GOOS + "_" + runtime.GOARCH + "." + extension, + BrowserDownloadURL: "https://example.com/v1", + State: "uploaded", + }}, + }, + { + TagName: "v2.0.0", + Published: time.Date(2026, time.June, 2, 0, 0, 0, 0, time.UTC), + Assets: []releaseAsset{{ + Name: "PixezSync_v2.0.0_" + runtime.GOOS + "_" + runtime.GOARCH + "." + extension, + BrowserDownloadURL: "https://example.com/v2", + State: "uploaded", + }}, + }, + } + + release, asset, err := selectLatestRelease("Rain-kl/PixezSync", releases) + if err != nil { + t.Fatalf("selectLatestRelease() error = %v", err) + } + if release.TagName != "v2.0.0" { + t.Errorf("selectLatestRelease() tag = %q, want %q", release.TagName, "v2.0.0") + } + expectedName := "PixezSync_v2.0.0_" + runtime.GOOS + "_" + runtime.GOARCH + "." + extension + if asset.Name != expectedName { + t.Errorf("selectLatestRelease() asset = %q, want %q", asset.Name, expectedName) + } +} + func TestExpectedAssetName(t *testing.T) { extension := "tar.gz" if runtime.GOOS == "windows" {