diff --git a/cmd/ugitd/args.go b/cmd/ugitd/args.go index 24109585663c4b7156f95becaddbb4609d543d39..eda11a02b5210d1a38cf672ae870d40b5bd1f1e2 100644 --- a/cmd/ugitd/args.go +++ b/cmd/ugitd/args.go @@ -3,9 +3,9 @@ import ( "flag" "fmt" - "log/slog" "strings" + "github.com/charmbracelet/log" "github.com/peterbourgon/ff/v3" "github.com/peterbourgon/ff/v3/ffyaml" ) @@ -51,7 +51,7 @@ URL string } type logArgs struct { - Level slog.Level + Level log.Level JSON bool } @@ -78,23 +78,14 @@ Title: "ugit", Description: "Minimal git server", }, Log: logArgs{ - Level: slog.LevelError, + Level: log.InfoLevel, }, } fs.Func("log.level", "Logging level", func(s string) error { - var lvl slog.Level - switch strings.ToLower(s) { - case "debug": - lvl = slog.LevelDebug - case "info": - lvl = slog.LevelInfo - case "warn", "warning": - lvl = slog.LevelWarn - case "error": - lvl = slog.LevelError - default: - return fmt.Errorf("unknown log level %q: options are [debug, info, warn, error]", s) + lvl, err := log.ParseLevel(s) + if err != nil { + return err } c.Log.Level = lvl return nil diff --git a/cmd/ugitd/main.go b/cmd/ugitd/main.go index 724a42bbc42624ca3b259a9c688db9b3e5a30371..2219d4d77fd57a27705214fb2f5130277091bdc5 100644 --- a/cmd/ugitd/main.go +++ b/cmd/ugitd/main.go @@ -4,7 +4,6 @@ import ( "errors" "flag" "fmt" - "log" "log/slog" "os" "os/signal" @@ -12,6 +11,7 @@ "path/filepath" "strconv" "strings" + "github.com/charmbracelet/log" "github.com/go-chi/chi/v5/middleware" "github.com/go-chi/httplog/v2" "github.com/go-git/go-git/v5/plumbing/protocol/packp" @@ -39,14 +39,14 @@ if err != nil { panic(err) } - slog.SetLogLoggerLevel(args.Log.Level) + log.SetLevel(args.Log.Level) middleware.DefaultLogger = httplog.RequestLogger(httplog.NewLogger("ugit", httplog.Options{ JSON: args.Log.JSON, LogLevel: slog.Level(args.Log.Level), - Concise: args.Log.Level != slog.LevelDebug, + Concise: args.Log.Level != log.DebugLevel, })) - if args.Log.Level == slog.LevelDebug { + if args.Log.Level == log.DebugLevel { trace.SetTarget(trace.Packet) } else { middleware.DefaultLogger = http.NoopLogger @@ -54,8 +54,7 @@ ssh.DefaultLogger = ssh.NoopLogger } if args.Log.JSON { - logger := slog.New(slog.NewJSONHandler(os.Stderr, nil)) - slog.SetDefault(logger) + log.SetFormatter(log.JSONFormatter) } if err := requiredFS(args.RepoDir); err != nil { @@ -75,7 +74,7 @@ if err != nil { panic(err) } go func() { - log.Printf("SSH listening on ssh://localhost:%d\n", sshSettings.Port) + log.Debugf("SSH listening on ssh://localhost:%d\n", sshSettings.Port) if err := sshSrv.ListenAndServe(); err != nil { panic(err) } @@ -103,7 +102,7 @@ } if args.HTTP.Enable { httpSrv := http.New(httpSettings) go func() { - log.Printf("HTTP listening on http://localhost:%d\n", httpSettings.Port) + log.Debugf("HTTP listening on http://localhost:%d\n", httpSettings.Port) if err := httpSrv.ListenAndServe(); err != nil { panic(err) } diff --git a/go.mod b/go.mod index f45ce70ff5c7efe470b6fded5ac5ef5a926033ec..63dd23ddd4e1da0dfbb15f888458f3d46182ae0b 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ toolchain go1.23.3 require ( github.com/alecthomas/chroma/v2 v2.15.0 + github.com/charmbracelet/log v0.4.0 github.com/charmbracelet/ssh v0.0.0-20241211182756-4fe22b0f1b7c github.com/charmbracelet/wish v1.4.4 github.com/dustin/go-humanize v1.0.1 @@ -30,7 +31,6 @@ github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/charmbracelet/bubbletea v1.2.4 // indirect github.com/charmbracelet/keygen v0.5.1 // indirect github.com/charmbracelet/lipgloss v1.0.0 // indirect - github.com/charmbracelet/log v0.4.0 // indirect github.com/charmbracelet/x/ansi v0.6.0 // indirect github.com/charmbracelet/x/conpty v0.1.0 // indirect github.com/charmbracelet/x/errors v0.0.0-20250107110353-48b574af22a5 // indirect diff --git a/internal/http/httperr/httperr.go b/internal/http/httperr/httperr.go index 4911305d7d852b8f36fbb544be481ce97b59beed..de1dfa46db9d956bad4f2e4a29a9d5d397713431 100644 --- a/internal/http/httperr/httperr.go +++ b/internal/http/httperr/httperr.go @@ -2,8 +2,9 @@ package httperr import ( "errors" - "log/slog" "net/http" + + "github.com/charmbracelet/log" ) type httpError struct { @@ -40,7 +41,7 @@ if errors.As(err, &httpErr) { status = httpErr.status } - slog.Error("httperr Handler error", "error", err) + log.Error(err) http.Error(w, http.StatusText(status), status) } } diff --git a/internal/ssh/ssh.go b/internal/ssh/ssh.go index a6dec7bb45c58d5296809093af2ade15913736d9..31c49eb29bb3d509f412a4542eedc8a0d2aefb00 100644 --- a/internal/ssh/ssh.go +++ b/internal/ssh/ssh.go @@ -2,8 +2,8 @@ package ssh import ( "fmt" - "log" + "github.com/charmbracelet/log" "github.com/charmbracelet/ssh" "github.com/charmbracelet/wish" "github.com/charmbracelet/wish/logging" @@ -42,7 +42,7 @@ func (a hooks) Push(_ string, _ ssh.PublicKey) {} func (a hooks) Fetch(_ string, _ ssh.PublicKey) {} var ( - DefaultLogger logging.Logger = log.Default() + DefaultLogger logging.Logger = log.StandardLog() NoopLogger logging.Logger = noopLogger{} ) diff --git a/internal/ssh/wish.go b/internal/ssh/wish.go index bdf504b0e0a2f14a4d7105dd1e9353f57b8fe807..7f4ae5943ee758a2cbc0a63ec1fdc32bedd66cc5 100644 --- a/internal/ssh/wish.go +++ b/internal/ssh/wish.go @@ -5,7 +5,6 @@ "context" "errors" "fmt" "io/fs" - "log/slog" "os" "path/filepath" "strings" @@ -13,6 +12,7 @@ "text/tabwriter" "go.jolheiser.com/ugit/internal/git" + "github.com/charmbracelet/log" "github.com/charmbracelet/ssh" "github.com/charmbracelet/wish" ) @@ -91,7 +91,7 @@ if err := gitPack(sess, gc, repoDir, repo); err != nil { if errors.Is(err, ErrInvalidRepo) { Fatal(s, ErrInvalidRepo) } - slog.Error("unknown git error", "error", err) + log.Error("unknown git error", "error", err) Fatal(s, ErrSystemMalfunction) } gh.Fetch(repo, pk) @@ -103,7 +103,7 @@ // Repo list if len(cmd) == 0 { des, err := os.ReadDir(repoDir) if err != nil && err != fs.ErrNotExist { - slog.Error("invalid repository", "error", err) + log.Error("invalid repository", "error", err) } tw := tabwriter.NewWriter(s, 0, 0, 1, ' ', 0) for _, de := range des {