From 544fd09199211fe292296a37749c3e02f56589e5 Mon Sep 17 00:00:00 2001 From: Mathis Maquenne <124215603+mathismqn@users.noreply.github.com> Date: Thu, 30 Jul 2026 10:35:37 +0200 Subject: [PATCH] feat: notify when a new version is available --- cmd/download.go | 5 ++-- cmd/root.go | 64 +++++++++++++++++++++++++++++++++++++++++++++++++ main.go | 2 +- 3 files changed, 68 insertions(+), 3 deletions(-) diff --git a/cmd/download.go b/cmd/download.go index f47940e..2284d41 100644 --- a/cmd/download.go +++ b/cmd/download.go @@ -19,8 +19,9 @@ const appConfigKey contextKey = "appConfig" var opts downloader.Options var downloadCmd = &cobra.Command{ - Use: "download", - Short: "Download songs from Deezer", + Use: "download", + Short: "Download songs from Deezer", + Annotations: map[string]string{updateNoticeAnnotation: "true"}, } func init() { diff --git a/cmd/root.go b/cmd/root.go index 46dd93b..f3a41f2 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -1,11 +1,75 @@ package cmd import ( + "context" + "fmt" + "os" + "slices" + + "github.com/mathismqn/godeez/internal/buildinfo" + "github.com/mathismqn/godeez/internal/updater" "github.com/spf13/cobra" + "golang.org/x/term" ) +const updateNoticeAnnotation = "godeez:update-notice" + var RootCmd = &cobra.Command{ Use: "godeez", Short: "GoDeez is a tool to download music from Deezer", SilenceUsage: true, } + +func Execute(ctx context.Context) error { + var notice <-chan string + if wantsUpdateNotice() { + notice = updater.StartCheck(ctx) + } + + err := RootCmd.ExecuteContext(ctx) + + printUpdateNotice(notice) + + return err +} + +func wantsUpdateNotice() bool { + if !term.IsTerminal(int(os.Stderr.Fd())) { + return false + } + + args := os.Args[1:] + if slices.Contains(args, "-h") || slices.Contains(args, "--help") { + return false + } + + target, _, err := RootCmd.Find(args) + if err != nil || target == nil { + return false + } + + if target.Run == nil && target.RunE == nil { + return false + } + + for cmd := target; cmd != nil; cmd = cmd.Parent() { + if cmd.Annotations[updateNoticeAnnotation] == "true" { + return true + } + } + + return false +} + +func printUpdateNotice(notice <-chan string) { + select { + case latest := <-notice: + if latest == "" { + return + } + + fmt.Fprintf(os.Stderr, "\n ┌ Update available: %s → %s\n └ Run `godeez update` to install\n", + buildinfo.Version(), latest) + default: + } +} diff --git a/main.go b/main.go index 1aceb72..8adfa46 100644 --- a/main.go +++ b/main.go @@ -12,7 +12,7 @@ func main() { ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt) defer stop() - if err := cmd.RootCmd.ExecuteContext(ctx); err != nil { + if err := cmd.Execute(ctx); err != nil { stop() os.Exit(1) }