50 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 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
 | |
| }
 | 
