selfupdate: add Check to see the newest release without installing
CI / test (push) Successful in 1m41s
CI / test (push) Successful in 1m41s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
416b921d71
commit
122fade954
2 files changed
+60
-14
No files matched your search
+43
-14
@@ -111,21 +111,9 @@ func CheckOnce(ctx context.Context, cfg Config) (string, error) {
|
||||
if !ok {
|
||||
return "", fmt.Errorf("%q is not a release version", cfg.Current)
|
||||
}
|
||||
var rel struct {
|
||||
Tag string `json:"tag_name"`
|
||||
Prerelease bool `json:"prerelease"`
|
||||
Draft bool `json:"draft"`
|
||||
Assets []struct {
|
||||
Name string `json:"name"`
|
||||
URL string `json:"browser_download_url"`
|
||||
} `json:"assets"`
|
||||
}
|
||||
body, err := get(ctx, cfg.HTTP, cfg.Server+"/api/v1/repos/"+cfg.Repo+"/releases/latest", 1<<20)
|
||||
rel, err := latestRelease(ctx, cfg)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("checking for a new release: %w", err)
|
||||
}
|
||||
if err := json.Unmarshal(body, &rel); err != nil {
|
||||
return "", fmt.Errorf("reading the latest release: %w", err)
|
||||
return "", err
|
||||
}
|
||||
if rel.Prerelease || rel.Draft {
|
||||
return "", nil
|
||||
@@ -208,6 +196,47 @@ func CheckOnce(ctx context.Context, cfg Config) (string, error) {
|
||||
return rel.Tag, nil
|
||||
}
|
||||
|
||||
type release struct {
|
||||
Tag string `json:"tag_name"`
|
||||
Prerelease bool `json:"prerelease"`
|
||||
Draft bool `json:"draft"`
|
||||
Assets []struct {
|
||||
Name string `json:"name"`
|
||||
URL string `json:"browser_download_url"`
|
||||
} `json:"assets"`
|
||||
}
|
||||
|
||||
func latestRelease(ctx context.Context, cfg Config) (release, error) {
|
||||
var rel release
|
||||
body, err := get(ctx, cfg.HTTP, cfg.Server+"/api/v1/repos/"+cfg.Repo+"/releases/latest", 1<<20)
|
||||
if err != nil {
|
||||
return rel, fmt.Errorf("checking for a new release: %w", err)
|
||||
}
|
||||
if err := json.Unmarshal(body, &rel); err != nil {
|
||||
return rel, fmt.Errorf("reading the latest release: %w", err)
|
||||
}
|
||||
return rel, nil
|
||||
}
|
||||
|
||||
// Check reports the newest full release and whether it is newer than cfg.Current, without
|
||||
// installing anything. A development build (a Current that isn't vX.Y.Z) is never "newer".
|
||||
func Check(ctx context.Context, cfg Config) (latest string, newer bool, err error) {
|
||||
cfg.defaults()
|
||||
rel, err := latestRelease(ctx, cfg)
|
||||
if err != nil {
|
||||
return "", false, err
|
||||
}
|
||||
if rel.Prerelease || rel.Draft {
|
||||
return "", false, nil
|
||||
}
|
||||
l, ok := parseVersion(rel.Tag)
|
||||
if !ok {
|
||||
return rel.Tag, false, nil
|
||||
}
|
||||
cur, ok := parseVersion(cfg.Current)
|
||||
return rel.Tag, ok && l.newerThan(cur), nil
|
||||
}
|
||||
|
||||
func get(ctx context.Context, c *http.Client, url string, max int64) ([]byte, error) {
|
||||
req, err := http.NewRequestWithContext(ctx, "GET", url, nil)
|
||||
if err != nil {
|
||||
|
||||
Reference in new issue
Block a user