diff options
author | Casey Lee <cplee@nektos.com> | 2023-01-15 11:30:41 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-15 11:30:41 +0100 |
commit | 93907931df737bdd21ecc624f4983fb1b365357a (patch) | |
tree | af0ca16d1ba83d70fbc67d45b3a383105710ff45 /cmd | |
parent | Input (#1524) (diff) | |
download | forgejo-act-93907931df737bdd21ecc624f4983fb1b365357a.tar.xz forgejo-act-93907931df737bdd21ecc624f4983fb1b365357a.zip |
feat: add check for newer versions (#1562)
* feat: add check for newer versions
* fix: support JSON logger and rever updates to go.mod
* fix: keep version updated in source code
* fix: lint errors
* fix: revert go.*
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/notices.go | 90 | ||||
-rw-r--r-- | cmd/root.go | 32 |
2 files changed, 111 insertions, 11 deletions
diff --git a/cmd/notices.go b/cmd/notices.go new file mode 100644 index 0000000..4ad32d7 --- /dev/null +++ b/cmd/notices.go @@ -0,0 +1,90 @@ +package cmd + +import ( + "encoding/json" + "fmt" + "net/http" + "net/url" + "os" + "runtime" + "time" + + log "github.com/sirupsen/logrus" +) + +type Notice struct { + Level string `json:"level"` + Message string `json:"message"` +} + +func displayNotices(input *Input) { + select { + case notices := <-noticesLoaded: + if len(notices) > 0 { + noticeLogger := log.New() + if input.jsonLogger { + noticeLogger.SetFormatter(&log.JSONFormatter{}) + } else { + noticeLogger.SetFormatter(&log.TextFormatter{ + DisableQuote: true, + DisableTimestamp: true, + PadLevelText: true, + }) + } + + fmt.Printf("\n") + for _, notice := range notices { + level, err := log.ParseLevel(notice.Level) + if err != nil { + level = log.InfoLevel + } + noticeLogger.Log(level, notice.Message) + } + } + case <-time.After(time.Second * 1): + log.Debugf("Timeout waiting for notices") + } +} + +var noticesLoaded = make(chan []Notice) + +func loadVersionNotices(version string) { + go func() { + noticesLoaded <- getVersionNotices(version) + }() +} + +const NoticeURL = "https://api.nektosact.com/notices" + +func getVersionNotices(version string) []Notice { + if os.Getenv("ACT_DISABLE_VERSION_CHECK") == "1" { + return nil + } + + noticeURL, err := url.Parse(NoticeURL) + if err != nil { + log.Error(err) + return nil + } + query := noticeURL.Query() + query.Add("os", runtime.GOOS) + query.Add("arch", runtime.GOARCH) + query.Add("version", version) + + noticeURL.RawQuery = query.Encode() + + resp, err := http.Get(noticeURL.String()) + if err != nil { + log.Debug(err) + return nil + } + + defer resp.Body.Close() + notices := []Notice{} + if err := json.NewDecoder(resp.Body).Decode(¬ices); err != nil { + log.Debug(err) + return nil + } + + return notices +} diff --git a/cmd/root.go b/cmd/root.go index 0aa56e7..1d153ab 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -30,13 +30,14 @@ import ( func Execute(ctx context.Context, version string) { input := new(Input) var rootCmd = &cobra.Command{ - Use: "act [event name to run] [flags]\n\nIf no event name passed, will default to \"on: push\"\nIf actions handles only one event it will be used as default instead of \"on: push\"", - Short: "Run GitHub actions locally by specifying the event name (e.g. `push`) or an action name directly.", - Args: cobra.MaximumNArgs(1), - RunE: newRunCommand(ctx, input), - PersistentPreRun: setupLogging, - Version: version, - SilenceUsage: true, + Use: "act [event name to run] [flags]\n\nIf no event name passed, will default to \"on: push\"\nIf actions handles only one event it will be used as default instead of \"on: push\"", + Short: "Run GitHub actions locally by specifying the event name (e.g. `push`) or an action name directly.", + Args: cobra.MaximumNArgs(1), + RunE: newRunCommand(ctx, input), + PersistentPreRun: setup(input), + PersistentPostRun: cleanup(input), + Version: version, + SilenceUsage: true, } rootCmd.Flags().BoolP("watch", "w", false, "watch the contents of the local repo and run when files change") rootCmd.Flags().BoolP("list", "l", false, "list workflows") @@ -244,10 +245,19 @@ func readArgsFile(file string, split bool) []string { return args } -func setupLogging(cmd *cobra.Command, _ []string) { - verbose, _ := cmd.Flags().GetBool("verbose") - if verbose { - log.SetLevel(log.DebugLevel) +func setup(inputs *Input) func(*cobra.Command, []string) { + return func(cmd *cobra.Command, _ []string) { + verbose, _ := cmd.Flags().GetBool("verbose") + if verbose { + log.SetLevel(log.DebugLevel) + } + loadVersionNotices(cmd.Version) + } +} + +func cleanup(inputs *Input) func(*cobra.Command, []string) { + return func(cmd *cobra.Command, _ []string) { + displayNotices(inputs) } } |