package main import ( "encoding/json" "fmt" "os" "github.com/spf13/cobra" "gitea.oblak.solutions/dimitar/gitFlow/internal/app" "gitea.oblak.solutions/dimitar/gitFlow/internal/config" "gitea.oblak.solutions/dimitar/gitFlow/pkg/status" ) // newScanCmd runs a single scan pass and renders the result. func newScanCmd() *cobra.Command { cmd := &cobra.Command{ Use: "scan", Short: "Scan repositories under a directory once", Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, _ []string) error { cfg, err := config.Load(cmd.Flags()) if err != nil { return err } // The README asks for the parent directory interactively; // prompt only when nothing was provided and stdin is a TTY. if !cmd.Flags().Changed("dir") && isTerminal(os.Stdin) { if d, err := promptDir(cfg.Dir); err == nil { cfg.Dir = d } } ctx, stop := signalContext() defer stop() a, err := app.New(cfg) if err != nil { return err } result, err := a.ScanOnce(ctx) if err != nil { return err } // Interim rendering; phase 3 routes this through the // presenter package (table/json/compact). switch cfg.Format { case "json": return renderJSON(result) default: renderTableLines(result) return nil } }, } config.RegisterFlags(cmd.Flags()) return cmd } // newConfigCmd prints the effective configuration. func newConfigCmd() *cobra.Command { cmd := &cobra.Command{ Use: "config", Short: "Show the effective configuration", Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, _ []string) error { cfg, err := config.Load(cmd.Flags()) if err != nil { return err } out, err := cfg.Dump() if err != nil { return err } fmt.Print(out) return nil }, } config.RegisterFlags(cmd.Flags()) return cmd } // renderTableLines is the interim text renderer (replaced in phase 3). func renderTableLines(result status.ScanResult) { for _, repo := range result.Repos { mark := "ok" if repo.Status.NeedsAttention() { mark = "!!" } fmt.Fprintf(os.Stdout, "%2s %-10s %s (branch %s)\n", mark, repo.Status, repo.Path, repo.Branch) } s := result.Summary() fmt.Fprintf(os.Stdout, "\n%d repos | %d clean | %d need attention | %d errors\n", s.Total, s.Clean, s.Attention, s.Errored) } // renderJSON serializes the scan result as indented JSON. func renderJSON(result status.ScanResult) error { enc := json.NewEncoder(os.Stdout) enc.SetIndent("", " ") return enc.Encode(result) }