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 }