summaryrefslogtreecommitdiffstats
path: root/cmd
diff options
context:
space:
mode:
authorCasey Lee <cplee@nektos.com>2023-01-15 11:30:41 +0100
committerGitHub <noreply@github.com>2023-01-15 11:30:41 +0100
commit93907931df737bdd21ecc624f4983fb1b365357a (patch)
treeaf0ca16d1ba83d70fbc67d45b3a383105710ff45 /cmd
parentInput (#1524) (diff)
downloadforgejo-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.go90
-rw-r--r--cmd/root.go32
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(&notices); 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)
}
}