github.com/everdrone/grab@v0.1.7-0.20230416223925-40674b995521/internal/update/check.go (about)

     1  package update
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"strings"
     7  
     8  	"github.com/everdrone/grab/internal/net"
     9  	"golang.org/x/mod/semver"
    10  )
    11  
    12  func CheckForUpdates(current, releaseURL string) (string, error) {
    13  	resp, err := net.Fetch(releaseURL, &net.FetchOptions{
    14  		Headers: map[string]string{
    15  			"Accept": "application/vnd.github+json",
    16  		},
    17  		Timeout: 1000,
    18  		Retries: 1,
    19  	})
    20  
    21  	if err != nil {
    22  		return "", err
    23  	}
    24  
    25  	var decoded map[string]interface{}
    26  	if err = json.Unmarshal([]byte(resp), &decoded); err != nil {
    27  		return "", err
    28  	}
    29  
    30  	tagName := decoded["tag_name"]
    31  	if tagName == "" {
    32  		return "", fmt.Errorf("no tag name")
    33  	}
    34  
    35  	if latest, ok := tagName.(string); ok {
    36  		if !strings.HasPrefix(latest, "v") {
    37  			latest = "v" + latest
    38  		}
    39  
    40  		if !semver.IsValid(latest) {
    41  			return "", fmt.Errorf("invalid version: %s", latest)
    42  		}
    43  
    44  		prefixed := "v" + current
    45  
    46  		if semver.Compare(latest, prefixed) == 1 {
    47  			return strings.TrimPrefix(latest, "v"), nil
    48  		}
    49  	} else {
    50  		return "", fmt.Errorf("invalid tag name")
    51  	}
    52  
    53  	return "", nil
    54  }