2
0

root.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package commands
  2. import (
  3. "context"
  4. "fmt"
  5. "os"
  6. "runtime"
  7. "strings"
  8. "time"
  9. "github.com/Masterminds/semver/v3"
  10. "github.com/fatih/color"
  11. "github.com/google/go-github/v41/github"
  12. cfg "github.com/porter-dev/porter/cli/cmd/config"
  13. "k8s.io/client-go/util/homedir"
  14. )
  15. var home = homedir.HomeDir()
  16. // Execute adds all child commands to the root command and sets flags appropriately.
  17. // This is called by main.main(). It only needs to happen once to the rootCmd.
  18. func Execute(ctx context.Context) error {
  19. if cfg.Version != "dev" {
  20. ghClient := github.NewClient(nil)
  21. ctx, cancel := context.WithTimeout(ctx, 2*time.Second)
  22. defer cancel()
  23. release, _, err := ghClient.Repositories.GetLatestRelease(ctx, "porter-dev", "porter")
  24. if err == nil {
  25. release.GetURL()
  26. // we do not care for an error here because we do not want to block the user here
  27. constraint, err := semver.NewConstraint(fmt.Sprintf("> %s", strings.TrimPrefix(cfg.Version, "v")))
  28. if err == nil {
  29. latestRelease, err := semver.NewVersion(strings.TrimPrefix(release.GetTagName(), "v"))
  30. if err == nil {
  31. if constraint.Check(latestRelease) {
  32. color.New(color.FgYellow).Fprint(os.Stderr, "A new version of the porter CLI is available. Run the following to update: ")
  33. if runtime.GOOS == "darwin" {
  34. color.New(color.FgYellow, color.Bold).Fprintln(os.Stderr, "brew install porter-dev/porter/porter")
  35. } else {
  36. color.New(color.FgYellow, color.Bold).Fprintln(os.Stderr, "/bin/bash -c \"$(curl -fsSL https://install.porter.run)\"")
  37. }
  38. color.New(color.FgYellow).Fprintf(os.Stderr, "View CLI installation and upgrade docs at https://docs.porter.run/cli/installation\n\n")
  39. }
  40. }
  41. }
  42. }
  43. }
  44. rootCmd, err := RegisterCommands()
  45. if err != nil {
  46. return fmt.Errorf("error setting up commands")
  47. }
  48. if err := rootCmd.Execute(); err != nil {
  49. color.New(color.FgRed).Println(err)
  50. os.Exit(1)
  51. }
  52. return nil
  53. }