package github import ( "encoding/json" "fmt" "io" "net/http" "time" ) const endpoint = "https://api.github.com/repos/golangci/golangci-lint/releases/latest" type releaseInfo struct { TagName string `json:"tag_name"` } // GetLatestVersion gets latest release information. func GetLatestVersion() (string, error) { //nolint:noctx // request timeout handled by the client req, err := http.NewRequest(http.MethodGet, endpoint, http.NoBody) if err != nil { return "", fmt.Errorf("prepare a HTTP request: %w", err) } req.Header.Set("Accept", "application/vnd.github.v3+json") client := &http.Client{Timeout: 2 * time.Second} resp, err := client.Do(req) if err != nil { return "", fmt.Errorf("get HTTP response for the latest tag: %w", err) } defer resp.Body.Close() body, err := io.ReadAll(resp.Body) if err != nil { return "", fmt.Errorf("read a body for the latest tag: %w", err) } release := releaseInfo{} err = json.Unmarshal(body, &release) if err != nil { return "", fmt.Errorf("unmarshal the body for the latest tag: %w", err) } return release.TagName, nil }