github.com/defang-io/defang/src@v0.0.0-20240505002154-bdf411911834/cmd/cli/command/version.go (about)

     1  package command
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  	"errors"
     7  	"net/http"
     8  
     9  	"golang.org/x/mod/semver"
    10  )
    11  
    12  var httpClient = http.DefaultClient
    13  
    14  func GetCurrentVersion() string {
    15  	version := RootCmd.Version
    16  	if v := semver.Canonical("v" + version); v != "" {
    17  		return v
    18  	}
    19  	return version
    20  }
    21  
    22  func GetLatestVersion(ctx context.Context) (string, error) {
    23  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, "https://api.github.com/repos/defang-io/defang/releases/latest", nil)
    24  	if err != nil {
    25  		return "", err
    26  	}
    27  	resp, err := httpClient.Do(req)
    28  	if err != nil {
    29  		return "", err
    30  	}
    31  	defer resp.Body.Close()
    32  	if resp.StatusCode != http.StatusOK {
    33  		// The primary rate limit for unauthenticated requests is 60 requests per hour, per IP.
    34  		return "", errors.New(resp.Status)
    35  	}
    36  	var release struct {
    37  		TagName string `json:"tag_name"`
    38  	}
    39  	if err = json.NewDecoder(resp.Body).Decode(&release); err != nil {
    40  		return "", err
    41  	}
    42  	return semver.Canonical(release.TagName), nil
    43  }