Skip to content

Upgrade notice

Currently, the upgrade notice works only for GitHub releases.

The upgrade notice is disabled by default. You can easily enable it based on your usage:

  • Printer

    p := printer.New(
        printer.WithUpgradeNotice("mszostok", "codeowners-validator", upgradeOpts...),
    )
    

    It prints the notice to the standard error channel (stderr). As a result, output processing, such as executing <cli> -ojson | jq .gitCommit, works properly even if the upgrade notice is displayed.

  • Cobra CLI

    extension.NewVersionCobraCmd(
        // 2. Explicit turn on upgrade notice
        extension.WithUpgradeNotice("mszostok", "codeowners-validator"),
    ),
    

    It prints the notice on standard error channel (stderr). As a result, output processing, such as executing <cli> version -ojson | jq .gitCommit, works properly even if the upgrade notice is displayed.

  • Standalone

    notice := upgrade.NewGitHubDetector("mszostok", "codeowners-validator")
    err := notice.PrintIfFoundGreater(os.Stderr, "0.5.4")
    

Once enabled, each execution checks for new releases. If a newer version has been found, it displays an upgrade notice for each output format to the standard error channel (stderr).

You can customize almost all aspects of the upgrade check:

  • Set maximum duration time for the update check operation (default: 10s):

    upgrade.WithUpdateCheckTimeout(30*time.Second)
    
  • Set a custom function to compare release versions (default: SemVer check):

    upgrade.WithIsVersionGreater(func(current string, new string) bool {
          //.. compare current with new ..
          return true
    })
    
  • Set the minimum time that must elapse before checking for a new release (default: 0min):

    upgrade.WithMinElapseTimeForRecheck(time.Second)
    
  • Change formatting:

    upgrade.WithFormatting(&style.Formatting{
          Header: style.Header{},
          Key:    style.Key{},
          Val:    style.Val{},
          Date:   style.Date{},
      })
    
  • Change layout:

    upgrade.WithLayout(&style.Layout{
              GoTemplate: forBoxLayoutGoTpl,
          })
    
  • Change both formatting and layout:

    upgrade.WithStyle(&style.Config{})
    
  • Define a custom renderer:

    upgrade.WithRenderer(func(in *upgrade.Info, isSmartTerminal bool) (string, error) {
      return fmt.Sprintf(`
          Version             %q
          New Version         %q
      `, in.Version, in.NewVersion), nil
    })
    
  • Add a post-render hook:

    upgrade.WithPostRenderHook(func(body string, isSmartTerminal bool) (string, error) {
      return body + "\ncustom footer", nil
    })
    
  • Change config directory where cache is stored:

    upgrade.WithConfigDir("~/.config"),
    
  • Change file name for state file:

    upgrade.WithStateFileName("foo-upgrade-state.yaml")
    
Back to top