Complete rewrite and re-architecture Osmedeus Engine in v5

This commit is contained in:
j3ssie
2026-01-18 19:32:24 +08:00
commit 7a2c5a5dc9
743 changed files with 99767 additions and 0 deletions
+84
View File
@@ -0,0 +1,84 @@
package updater
import (
"context"
"fmt"
selfupdate "github.com/creativeprojects/go-selfupdate"
)
// GitHubSource implements Source using go-selfupdate's GitHub backend
type GitHubSource struct {
updater *selfupdate.Updater
allowPrerelease bool
}
// NewGitHubSource creates a new GitHub release source
func NewGitHubSource(allowPrerelease bool) (*GitHubSource, error) {
source, err := selfupdate.NewGitHubSource(selfupdate.GitHubConfig{})
if err != nil {
return nil, fmt.Errorf("failed to create GitHub source: %w", err)
}
updater, err := selfupdate.NewUpdater(selfupdate.Config{
Source: source,
Prerelease: allowPrerelease,
})
if err != nil {
return nil, fmt.Errorf("failed to create updater: %w", err)
}
return &GitHubSource{
updater: updater,
allowPrerelease: allowPrerelease,
}, nil
}
func (g *GitHubSource) DetectLatest(ctx context.Context, owner, repo string) (*Release, error) {
repository := selfupdate.NewRepositorySlug(owner, repo)
rel, found, err := g.updater.DetectLatest(ctx, repository)
if err != nil {
return nil, fmt.Errorf("failed to detect latest release: %w", err)
}
if !found {
return nil, nil
}
return convertSelfupdateRelease(rel), nil
}
func (g *GitHubSource) DetectVersion(ctx context.Context, owner, repo, version string) (*Release, error) {
repository := selfupdate.NewRepositorySlug(owner, repo)
rel, found, err := g.updater.DetectVersion(ctx, repository, version)
if err != nil {
return nil, fmt.Errorf("failed to detect version %s: %w", version, err)
}
if !found {
return nil, nil
}
return convertSelfupdateRelease(rel), nil
}
func (g *GitHubSource) UpdateTo(ctx context.Context, owner, repo string, release *Release) error {
// Get the executable path
exe, err := GetExecutablePath()
if err != nil {
return err
}
// Detect the release again to get the full selfupdate.Release object
repository := selfupdate.NewRepositorySlug(owner, repo)
rel, found, err := g.updater.DetectVersion(ctx, repository, release.Version)
if err != nil {
return fmt.Errorf("failed to detect release for update: %w", err)
}
if !found {
return fmt.Errorf("release %s not found", release.Version)
}
// Perform the update
if err := g.updater.UpdateTo(ctx, rel, exe); err != nil {
return fmt.Errorf("failed to update: %w", err)
}
return nil
}