Skip to content

Commit 8f7b3e9

Browse files
authored
Merge pull request #1 from RedCommand/codex/migrate-from-zerolog-to-slog
Cool experiment with open ai codex, changing the logger is fine (this pr) but doing more complex stuff is still bad.
2 parents 6af6333 + 4b657d0 commit 8f7b3e9

7 files changed

Lines changed: 105 additions & 78 deletions

File tree

flatpak.go

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
package main
22

33
import (
4+
"context"
5+
"os"
46
"os/exec"
57
"slices"
68
"strings"
79
"sync"
810

9-
"github.com/rs/zerolog/log"
1011
"gopkg.in/ini.v1"
1112
)
1213

13-
func getApps() ([]string, error) {
14+
func getApps(ctx context.Context) ([]string, error) {
1415
cmd := exec.Command("flatpak", "list", "--app")
1516
cmd.Dir = "/var/lib/flatpak"
1617

17-
log.Debug().Str("command", cmd.Path+strings.Join(cmd.Args, " ")).Msg("Running command")
18+
log.DebugContext(ctx, "Running command", "command", cmd.Path+" "+strings.Join(cmd.Args, " "))
1819
out, err := cmd.Output()
1920
if err != nil {
2021
return nil, err
@@ -29,29 +30,29 @@ func getApps() ([]string, error) {
2930
}
3031
data := strings.Split(app, "\t")
3132
if len(data) < 2 {
32-
log.Warn().Msgf("Skipping line: %s", app)
33+
log.WarnContext(ctx, "Skipping line", "line", app)
3334
continue
3435
}
3536
appID := strings.TrimSpace(data[1])
3637
if appID == "" {
3738
continue
3839
}
39-
log.Trace().Msgf("AppID: %s", appID)
40+
log.DebugContext(ctx, "AppID found", "appid", appID)
4041
apps = append(apps, appID)
4142
}
4243
return apps, nil
4344
}
4445

45-
func getFlatpakApp(appID string) (Flatpak, error) {
46+
func getFlatpakApp(ctx context.Context, appID string) (Flatpak, error) {
4647
cmd := exec.Command("flatpak", "info", "-m", appID)
4748

48-
log.Debug().Str("command", cmd.Path+strings.Join(cmd.Args, " ")).Str("appID", appID).Msg("Running command")
49+
log.DebugContext(ctx, "Running command", "command", cmd.Path+" "+strings.Join(cmd.Args, " "), "appid", appID)
4950
out, err := cmd.Output()
5051
if err != nil {
5152
return Flatpak{}, err
5253
}
5354

54-
log.Trace().Str("data", string(out)).Msg("Parsing toml")
55+
log.DebugContext(ctx, "Parsing toml", "data", string(out))
5556
var flatpak Flatpak
5657
cfg, err := ini.Load(out)
5758
if err != nil {
@@ -62,15 +63,15 @@ func getFlatpakApp(appID string) (Flatpak, error) {
6263
return Flatpak{}, err
6364
}
6465

65-
flatpak.Application.Command, err = getCommand(&flatpak)
66+
flatpak.Application.Command, err = getCommand(ctx, &flatpak)
6667
if err != nil {
6768
return Flatpak{}, err
6869
}
6970

7071
return flatpak, nil
7172
}
7273

73-
func removeDuplicates(apps []Flatpak) []Flatpak {
74+
func removeDuplicates(ctx context.Context, apps []Flatpak) []Flatpak {
7475
keys := make(map[string]*Flatpak)
7576
list := []Flatpak{}
7677
duplicates := make(map[string][]Flatpak)
@@ -89,35 +90,36 @@ func removeDuplicates(apps []Flatpak) []Flatpak {
8990
return slices.DeleteFunc(list, func(app Flatpak) bool {
9091
apps, ok := duplicates[app.Application.Command]
9192
if ok {
92-
log.Warn().Str("command", app.Application.Command).Interface("apps", apps).Msg("Found duplicates")
93+
log.WarnContext(ctx, "Found duplicates", "command", app.Application.Command, "apps", apps)
9394
}
9495
return ok
9596
})
9697
}
9798

98-
func getAllFlatpakApps() []Flatpak {
99-
appsID, err := getApps()
99+
func getAllFlatpakApps(ctx context.Context) []Flatpak {
100+
appsID, err := getApps(ctx)
100101
if err != nil {
101-
log.Fatal().Err(err).Msg("Error getting apps")
102+
log.ErrorContext(ctx, "Error getting apps", "err", err)
103+
os.Exit(1)
102104
}
103105

104106
apps := make([]Flatpak, len(appsID))
105107
wg := sync.WaitGroup{}
106108
for i, appID := range appsID {
107109
wg.Add(1)
108-
go func(appID string) {
110+
go func(i int, appID string) {
109111
defer wg.Done()
110-
app, err := getFlatpakApp(appID)
112+
app, err := getFlatpakApp(ctx, appID)
111113
if err != nil {
112-
log.Error().Err(err).Str("appID", appID).Msg("Error getting app")
114+
log.ErrorContext(ctx, "Error getting app", "err", err, "appid", appID)
113115
}
114116
// No need to lock since we are writing to different indexes
115117
apps[i] = app
116-
}(appID)
118+
}(i, appID)
117119
}
118120
wg.Wait()
119121

120-
apps = removeDuplicates(apps)
122+
apps = removeDuplicates(ctx, apps)
121123

122124
return apps
123125
}

go.mod

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,8 @@ go 1.23.4
44

55
require (
66
github.com/hbollon/go-edlib v1.6.0
7-
github.com/rs/zerolog v1.33.0
87
gopkg.in/ini.v1 v1.67.0
98
gopkg.in/natefinch/lumberjack.v2 v2.2.1
109
)
1110

12-
require (
13-
github.com/mattn/go-colorable v0.1.13 // indirect
14-
github.com/mattn/go-isatty v0.0.19 // indirect
15-
github.com/stretchr/testify v1.10.0 // indirect
16-
golang.org/x/sys v0.12.0 // indirect
17-
)
11+
require github.com/stretchr/testify v1.10.0 // indirect

go.sum

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,11 @@
1-
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
21
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
32
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
4-
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
53
github.com/hbollon/go-edlib v1.6.0 h1:ga7AwwVIvP8mHm9GsPueC0d71cfRU/52hmPJ7Tprv4E=
64
github.com/hbollon/go-edlib v1.6.0/go.mod h1:wnt6o6EIVEzUfgbUZY7BerzQ2uvzp354qmS2xaLkrhM=
7-
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
8-
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
9-
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
10-
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
11-
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
12-
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
135
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
146
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
15-
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
16-
github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8=
17-
github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
187
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
198
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
20-
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
21-
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
22-
golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o=
23-
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
249
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
2510
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
2611
gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=

logger.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"log/slog"
6+
)
7+
8+
type multiHandler struct {
9+
handlers []slog.Handler
10+
}
11+
12+
func (h multiHandler) Enabled(ctx context.Context, level slog.Level) bool {
13+
for _, handler := range h.handlers {
14+
if handler.Enabled(ctx, level) {
15+
return true
16+
}
17+
}
18+
return false
19+
}
20+
21+
func (h multiHandler) Handle(ctx context.Context, r slog.Record) error {
22+
for _, handler := range h.handlers {
23+
if err := handler.Handle(ctx, r); err != nil {
24+
return err
25+
}
26+
}
27+
return nil
28+
}
29+
30+
func (h multiHandler) WithAttrs(attrs []slog.Attr) slog.Handler {
31+
hs := make([]slog.Handler, len(h.handlers))
32+
for i, handler := range h.handlers {
33+
hs[i] = handler.WithAttrs(attrs)
34+
}
35+
return multiHandler{handlers: hs}
36+
}
37+
38+
func (h multiHandler) WithGroup(name string) slog.Handler {
39+
hs := make([]slog.Handler, len(h.handlers))
40+
for i, handler := range h.handlers {
41+
hs[i] = handler.WithGroup(name)
42+
}
43+
return multiHandler{handlers: hs}
44+
}

main.go

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
package main
22

33
import (
4+
"context"
45
_ "embed"
56
"os"
67
"path"
78
"text/template"
89
"time"
910

10-
"github.com/rs/zerolog"
11-
"github.com/rs/zerolog/log"
1211
"gopkg.in/natefinch/lumberjack.v2"
12+
"log/slog"
1313
)
1414

1515
type Config struct {
@@ -27,6 +27,8 @@ type Flatpak struct {
2727
//go:embed script.gotmpl
2828
var scriptTemplateRaw string
2929

30+
var log *slog.Logger
31+
3032
func parseArgs() Config {
3133
config := Config{}
3234
if len(os.Args) > 1 {
@@ -37,7 +39,7 @@ func parseArgs() Config {
3739
return config
3840
}
3941

40-
func prepare(config *Config) (*template.Template, *lumberjack.Logger) {
42+
func prepare(ctx context.Context, config *Config) (*template.Template, *lumberjack.Logger) {
4143
logFile := &lumberjack.Logger{
4244
Filename: path.Join(config.FlatpakDir, "flatpak-alias.log"), // Path to the log file
4345
MaxSize: 1, // Maximum size in MB before rotation
@@ -46,36 +48,36 @@ func prepare(config *Config) (*template.Template, *lumberjack.Logger) {
4648
Compress: true, // Compress rotated files
4749
}
4850

49-
consoleWriter := zerolog.ConsoleWriter{Out: os.Stdout, TimeFormat: time.RFC3339}
50-
51-
multiWriter := zerolog.MultiLevelWriter(consoleWriter, logFile)
52-
53-
log.Logger = zerolog.New(multiWriter).With().Timestamp().Logger()
54-
55-
zerolog.SetGlobalLevel(zerolog.InfoLevel)
51+
textHandler := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelInfo})
52+
jsonHandler := slog.NewJSONHandler(logFile, &slog.HandlerOptions{Level: slog.LevelInfo})
53+
log = slog.New(multiHandler{handlers: []slog.Handler{textHandler, jsonHandler}})
54+
slog.SetDefault(log)
5655

5756
scriptTemplate, err := template.New("script").Parse(scriptTemplateRaw)
5857
if err != nil {
59-
log.Fatal().Err(err).Msg("Error parsing template")
58+
log.ErrorContext(ctx, "Error parsing template", "err", err)
59+
os.Exit(1)
6060
}
6161

6262
config.FlatpakDir = path.Join(config.FlatpakDir, "aliases")
63-
log.Info().Str("path", config.FlatpakDir).Msg("Writing script")
63+
log.InfoContext(ctx, "Writing script", "path", config.FlatpakDir)
6464
err = os.MkdirAll(config.FlatpakDir, 0755)
6565
if err != nil {
66-
log.Fatal().Err(err).Msg("Error creating directory")
66+
log.ErrorContext(ctx, "Error creating directory", "err", err)
67+
os.Exit(1)
6768
}
6869

6970
return scriptTemplate, logFile
7071
}
7172

7273
func main() {
74+
ctx := context.Background()
7375
config := parseArgs()
74-
scriptTemplate, logFile := prepare(&config)
76+
scriptTemplate, logFile := prepare(ctx, &config)
7577
defer logFile.Close()
76-
log.Info().Msg("Starting flatpak-alias")
77-
log.Info().Str("path", config.FlatpakDir).Any("args", os.Args).Msg("Writing script")
78-
apps := getAllFlatpakApps()
79-
removeOldScripts(config)
80-
generateScripts(apps, scriptTemplate, config)
78+
log.InfoContext(ctx, "Starting flatpak-alias")
79+
log.InfoContext(ctx, "Writing script", "path", config.FlatpakDir, "args", os.Args)
80+
apps := getAllFlatpakApps(ctx)
81+
removeOldScripts(ctx, config)
82+
generateScripts(ctx, apps, scriptTemplate, config)
8183
}

scripts.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,59 @@
11
package main
22

33
import (
4+
"context"
45
"os"
56
"path"
67
"text/template"
78
"time"
8-
9-
"github.com/rs/zerolog/log"
109
)
1110

12-
func removeOldScripts(config Config) {
11+
func removeOldScripts(ctx context.Context, config Config) {
1312
files, err := os.ReadDir(config.FlatpakDir)
1413
if err != nil {
15-
log.Fatal().Err(err).Msg("Error reading output directory")
14+
log.ErrorContext(ctx, "Error reading output directory", "err", err)
15+
os.Exit(1)
1616
}
1717

1818
for _, file := range files {
1919
f, err := os.Open(path.Join(config.FlatpakDir, file.Name()))
2020
if err != nil {
21-
log.Error().Err(err).Str("file", file.Name()).Msg("Error opening file")
21+
log.ErrorContext(ctx, "Error opening file", "err", err, "file", file.Name())
2222
continue
2323
}
2424
content := make([]byte, 30)
2525
i, err := f.ReadAt(content, 14)
2626
if err != nil || i != 30 || string(content) != "**Generated by flatpak-alias**" {
27-
log.Warn().Str("file", file.Name()).Msg("Not a managed file")
27+
log.WarnContext(ctx, "Not a managed file", "file", file.Name())
2828
continue
2929
}
3030

3131
err = os.Remove(path.Join(config.FlatpakDir, file.Name()))
3232
if err != nil {
33-
log.Error().Err(err).Str("file", file.Name()).Msg("Error deleting file")
33+
log.ErrorContext(ctx, "Error deleting file", "err", err, "file", file.Name())
3434
}
3535
}
3636
}
3737

38-
func generateScripts(apps []Flatpak, scriptTemplate *template.Template, config Config) {
38+
func generateScripts(ctx context.Context, apps []Flatpak, scriptTemplate *template.Template, config Config) {
3939
now := time.Now()
4040
for _, app := range apps {
41-
log.Info().Str("name", app.Application.Name).Str("command", app.Application.Command).Msg("Found application")
41+
log.InfoContext(ctx, "Found application", "name", app.Application.Name, "command", app.Application.Command)
4242
app.Timestamp = now
4343

4444
if _, err := os.Stat(path.Join(config.FlatpakDir, app.Application.Command)); err == nil {
45-
log.Warn().Str("command", app.Application.Command).Msg("File already exists")
45+
log.WarnContext(ctx, "File already exists", "command", app.Application.Command)
4646
continue
4747
}
4848

4949
file, err := os.Create(path.Join(config.FlatpakDir, app.Application.Command))
5050
if err != nil {
51-
log.Error().Err(err).Str("command", app.Application.Command).Msg("Error creating file")
51+
log.ErrorContext(ctx, "Error creating file", "err", err, "command", app.Application.Command)
5252
continue
5353
}
5454
err = scriptTemplate.Execute(file, app)
5555
if err != nil {
56-
log.Error().Err(err).Str("command", app.Application.Command).Msg("Error writing template")
56+
log.ErrorContext(ctx, "Error writing template", "err", err, "command", app.Application.Command)
5757
continue
5858
}
5959

0 commit comments

Comments
 (0)