chenhg5/cc-connect · error
no release found
Error message
no release found
What it means
fetchLatestStableRelease discovers the latest stable version purely from the Location header of a 302 redirect (redirects are disabled). This error means the redirect response carried no Location header, so the latest tag could not be determined.
Source
Thrown at cmd/cc-connect/update.go:278
}
// Fallback: follow redirect from /releases/latest to extract tag
latestURL := "https://github.com/" + githubRepo + "/releases/latest"
noRedirect := &http.Client{
Timeout: 15 * time.Second,
CheckRedirect: func(req *http.Request, via []*http.Request) error {
return http.ErrUseLastResponse
},
}
resp2, err := noRedirect.Get(latestURL)
if err != nil {
return nil, fmt.Errorf("request failed: %w", err)
}
defer resp2.Body.Close()
loc := resp2.Header.Get("Location")
if loc == "" {
return nil, fmt.Errorf("no release found")
}
parts := strings.Split(loc, "/tag/")
if len(parts) != 2 {
return nil, fmt.Errorf("unexpected redirect: %s", loc)
}
return &githubRelease{TagName: parts[1], HTMLURL: loc}, nil
}
func binaryAssetName(tag string) string {
goos := runtime.GOOS
goarch := runtime.GOARCH
name := fmt.Sprintf("cc-connect-%s-%s-%s", tag, goos, goarch)
if goos == "windows" {
name += ".exe"
}
return name
}
View on GitHub (pinned to 4000b2338a)
Solutions
- Confirm the repo has at least one published release (a 404 from /releases/latest means zero releases)
- Bypass any intercepting proxy that may strip Location headers (test with curl -v and look for the 302 + Location line)
- Fall back to the /releases list endpoint (fetchLatestPreRelease path) which returns tags in the JSON body instead of headers
- Check repo visibility/token — a private repo without credentials yields no redirect
Example fix
// before
loc := resp2.Header.Get("Location")
if loc == "" {
return nil, fmt.Errorf("no release found")
}
// after
loc := resp2.Header.Get("Location")
if loc == "" {
return nil, fmt.Errorf("no release found (HTTP %d, no Location header)", resp2.StatusCode)
} Defensive patterns
Strategy: fallback
Validate before calling
// check the latest-release URL returns a 302 with Location before parsing:
client := &http.Client{CheckRedirect: func(*http.Request, []*http.Request) error { return http.ErrUseLastResponse }}
resp, err := client.Get("https://github.com/<owner>/<repo>/releases/latest")
if err == nil && resp.StatusCode == 404 {
return errors.New("repo has no latest release (404)")
} Try / catch
// Go: fall back to the releases list endpoint when the redirect probe fails
rel, err := fetchLatestStableRelease()
if err != nil {
if strings.Contains(err.Error(), "no release found") {
rel, err = fetchLatestPreRelease() // JSON body carries the tag
}
if err != nil { return err }
} Prevention
- Don't rely solely on header-based version discovery; prefer the JSON API's tag_name
- Check repo visibility and credentials — private repos 404 without auth
- Test through the same proxy/VPN the production host uses
- Log response status alongside the missing header for faster diagnosis
When it happens
Trigger: resp2.Header.Get("Location") is "": the server answered without a redirect (e.g. 200 page or 404 instead of 302), typically because /releases/latest has nothing to redirect to.
Common situations: Repository has no published releases (GitHub returns 404 without Location); a transparent proxy strips or rewrites the 302; repo is private and returns 404 without credentials; GitHub endpoint behavior differs from expected.
Related errors
- unexpected redirect: %s
- request failed: %w
- GitHub API returned HTTP %d
- no releases found
- parse releases: %w
AI-assisted analysis of chenhg5/cc-connect@4000b2338a (2026-09-06).
Data as JSON: /api/errors/fe672a3731dc502a.
Report an issue: GitHub.