fix update channel defaults and by-tag inference

This commit is contained in:
Virgil 2026-04-01 05:23:37 +00:00
parent 333857cb3a
commit 00f30708ac
5 changed files with 75 additions and 4 deletions

View file

@ -50,7 +50,7 @@ type githubClient struct{}
var NewAuthenticatedClient = func(ctx context.Context) *http.Client { var NewAuthenticatedClient = func(ctx context.Context) *http.Client {
token := os.Getenv("GITHUB_TOKEN") token := os.Getenv("GITHUB_TOKEN")
if token == "" { if token == "" {
return NewHTTPClient() return http.DefaultClient
} }
ts := oauth2.StaticTokenSource( ts := oauth2.StaticTokenSource(

View file

@ -82,6 +82,54 @@ func TestDetermineChannel_Good(t *testing.T) {
} }
} }
func TestCheckForUpdatesByTag_UsesCurrentVersionChannel(t *testing.T) {
originalVersion := Version
originalCheckForUpdates := CheckForUpdates
defer func() {
Version = originalVersion
CheckForUpdates = originalCheckForUpdates
}()
var gotChannel string
CheckForUpdates = func(owner, repo, channel string, forceSemVerPrefix bool, releaseURLFormat string) error {
gotChannel = channel
return nil
}
Version = "v2.0.0-rc.1"
if err := CheckForUpdatesByTag("owner", "repo"); err != nil {
t.Fatalf("unexpected error: %v", err)
}
if gotChannel != "beta" {
t.Fatalf("expected beta channel, got %q", gotChannel)
}
}
func TestCheckOnlyByTag_UsesCurrentVersionChannel(t *testing.T) {
originalVersion := Version
originalCheckOnly := CheckOnly
defer func() {
Version = originalVersion
CheckOnly = originalCheckOnly
}()
var gotChannel string
CheckOnly = func(owner, repo, channel string, forceSemVerPrefix bool, releaseURLFormat string) error {
gotChannel = channel
return nil
}
Version = "v2.0.0-alpha.1"
if err := CheckOnlyByTag("owner", "repo"); err != nil {
t.Fatalf("unexpected error: %v", err)
}
if gotChannel != "alpha" {
t.Fatalf("expected alpha channel, got %q", gotChannel)
}
}
func TestGetDownloadURL_Good(t *testing.T) { func TestGetDownloadURL_Good(t *testing.T) {
osName := runtime.GOOS osName := runtime.GOOS
archName := runtime.GOARCH archName := runtime.GOARCH

View file

@ -63,6 +63,7 @@ func NewUpdateService(config UpdateServiceConfig) (*UpdateService, error) {
var err error var err error
if isGitHub { if isGitHub {
config.Channel = normaliseGitHubChannel(config.Channel)
owner, repo, err = ParseRepoURL(config.RepoURL) owner, repo, err = ParseRepoURL(config.RepoURL)
if err != nil { if err != nil {
return nil, coreerr.E("NewUpdateService", "failed to parse GitHub repo URL", err) return nil, coreerr.E("NewUpdateService", "failed to parse GitHub repo URL", err)
@ -127,3 +128,11 @@ func ParseRepoURL(repoURL string) (owner string, repo string, err error) {
} }
return parts[0], parts[1], nil return parts[0], parts[1], nil
} }
func normaliseGitHubChannel(channel string) string {
channel = strings.ToLower(strings.TrimSpace(channel))
if channel == "" {
return "stable"
}
return channel
}

View file

@ -12,13 +12,15 @@ func TestNewUpdateService(t *testing.T) {
config UpdateServiceConfig config UpdateServiceConfig
expectError bool expectError bool
isGitHub bool isGitHub bool
wantChannel string
}{ }{
{ {
name: "Valid GitHub URL", name: "Valid GitHub URL",
config: UpdateServiceConfig{ config: UpdateServiceConfig{
RepoURL: "https://github.com/owner/repo", RepoURL: "https://github.com/owner/repo",
}, },
isGitHub: true, isGitHub: true,
wantChannel: "stable",
}, },
{ {
name: "Valid non-GitHub URL", name: "Valid non-GitHub URL",
@ -27,6 +29,15 @@ func TestNewUpdateService(t *testing.T) {
}, },
isGitHub: false, isGitHub: false,
}, },
{
name: "GitHub channel is normalised",
config: UpdateServiceConfig{
RepoURL: "https://github.com/owner/repo",
Channel: " Beta ",
},
isGitHub: true,
wantChannel: "beta",
},
{ {
name: "Invalid GitHub URL", name: "Invalid GitHub URL",
config: UpdateServiceConfig{ config: UpdateServiceConfig{
@ -45,6 +56,9 @@ func TestNewUpdateService(t *testing.T) {
if err == nil && service.isGitHub != tc.isGitHub { if err == nil && service.isGitHub != tc.isGitHub {
t.Errorf("Expected isGitHub: %v, got: %v", tc.isGitHub, service.isGitHub) t.Errorf("Expected isGitHub: %v, got: %v", tc.isGitHub, service.isGitHub)
} }
if err == nil && tc.wantChannel != "" && service.config.Channel != tc.wantChannel {
t.Errorf("Expected GitHub channel %q, got %q", tc.wantChannel, service.config.Channel)
}
}) })
} }
} }

View file

@ -145,14 +145,14 @@ var CheckOnly = func(owner, repo, channel string, forceSemVerPrefix bool, releas
// CheckForUpdatesByTag checks for and applies updates from GitHub based on the channel // CheckForUpdatesByTag checks for and applies updates from GitHub based on the channel
// determined by the current application's version tag (e.g., 'stable' or 'prerelease'). // determined by the current application's version tag (e.g., 'stable' or 'prerelease').
var CheckForUpdatesByTag = func(owner, repo string) error { var CheckForUpdatesByTag = func(owner, repo string) error {
channel := determineChannel(Version, false) // isPreRelease is false for current version channel := determineChannel(Version, semver.Prerelease(formatVersionForComparison(Version)) != "")
return CheckForUpdates(owner, repo, channel, true, "") return CheckForUpdates(owner, repo, channel, true, "")
} }
// CheckOnlyByTag checks for updates from GitHub based on the channel determined by the // CheckOnlyByTag checks for updates from GitHub based on the channel determined by the
// current version tag, without applying them. // current version tag, without applying them.
var CheckOnlyByTag = func(owner, repo string) error { var CheckOnlyByTag = func(owner, repo string) error {
channel := determineChannel(Version, false) // isPreRelease is false for current version channel := determineChannel(Version, semver.Prerelease(formatVersionForComparison(Version)) != "")
return CheckOnly(owner, repo, channel, true, "") return CheckOnly(owner, repo, channel, true, "")
} }