diff options
| author | Paul Buetow <paul@buetow.org> | 2026-03-04 10:50:07 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-03-04 10:50:07 +0200 |
| commit | 97aa8a6f666f5f40859c8a9aa4948bde435cf18f (patch) | |
| tree | 0cb5928cd6a1220607dbf64e234a2522acac2848 /internal/cli/root.go | |
| parent | c25c9002f3214e07b041aefa26d5d13c26757839 (diff) | |
Rename project to timesamurai and release v0.5.0v0.5.0
Diffstat (limited to 'internal/cli/root.go')
| -rw-r--r-- | internal/cli/root.go | 59 |
1 files changed, 55 insertions, 4 deletions
diff --git a/internal/cli/root.go b/internal/cli/root.go index faba592..8b5ad09 100644 --- a/internal/cli/root.go +++ b/internal/cli/root.go @@ -2,10 +2,14 @@ package cli import ( "context" + "errors" "fmt" + "strings" + "time" - timr "codeberg.org/snonux/timr/internal" - "codeberg.org/snonux/timr/internal/config" + timesamurai "codeberg.org/snonux/timesamurai/internal" + "codeberg.org/snonux/timesamurai/internal/config" + "codeberg.org/snonux/timesamurai/internal/worktime" "github.com/spf13/cobra" ) @@ -20,9 +24,10 @@ func Execute() error { func NewRootCmd() *cobra.Command { var configPath string var showVersion bool + var checkDBIntegrity bool cmd := &cobra.Command{ - Use: "timr", + Use: "timesamurai", Short: "Track time from your terminal", SilenceUsage: true, PersistentPreRunE: func(cmd *cobra.Command, args []string) error { @@ -40,15 +45,19 @@ func NewRootCmd() *cobra.Command { }, RunE: func(cmd *cobra.Command, args []string) error { if showVersion { - _, err := fmt.Fprintln(cmd.OutOrStdout(), timr.Version) + _, err := fmt.Fprintln(cmd.OutOrStdout(), timesamurai.Version) return err } + if checkDBIntegrity { + return runDBIntegrityCheck(cmd) + } return cmd.Help() }, } cmd.Flags().BoolVar(&showVersion, "version", false, "Print version and exit") + cmd.Flags().BoolVar(&checkDBIntegrity, "check-db-integrity", false, "Validate worktime database integrity and exit") cmd.PersistentFlags().StringVar(&configPath, "config", "", "Path to config file") cmd.AddCommand(newTimerCmd()) cmd.AddCommand(newWorkCmd()) @@ -81,3 +90,45 @@ func currentConfig(cmd *cobra.Command) config.Config { } return cfg } + +func runDBIntegrityCheck(cmd *cobra.Command) error { + cfg := currentConfig(cmd) + entries, err := worktime.LoadAll(cfg.WorktimeDBDir) + if err != nil { + return err + } + + issues := worktime.CheckEntriesIntegrity(entries, worktime.DefaultMaxSessionSpan) + openSessions := worktime.OpenSessions(entries) + + lines := make([]string, 0, len(issues)+len(openSessions)+2) + if len(issues) == 0 { + lines = append(lines, "Database integrity check passed.") + } else { + lines = append(lines, fmt.Sprintf("Database integrity check found %d issue(s):", len(issues))) + for idx, issue := range issues { + lines = append(lines, fmt.Sprintf("%d. %s", idx+1, issue.String())) + } + } + + if len(openSessions) > 0 { + lines = append(lines, fmt.Sprintf("Warning: currently logged in (%d open session(s)):", len(openSessions))) + for _, session := range openSessions { + lines = append(lines, fmt.Sprintf( + "- category=%s source=%s since=%s", + session.Category, + session.Login.Source, + time.Unix(session.Login.Epoch, 0).Format("2006-01-02 15:04:05"), + )) + } + } + + _, printErr := fmt.Fprintln(cmd.OutOrStdout(), strings.Join(lines, "\n")) + if printErr != nil { + return printErr + } + if len(issues) > 0 { + return errors.New("database integrity check failed") + } + return nil +} |
