Home

gitpecker @main - refs - log -
-
https://git.jolheiser.com/gitpecker.git
Woodpecker addon for generic git forge and OIDC
tree log patch
increase logging and add JSON logging option Signed-off-by: jolheiser <git@jolheiser.com>
Signature
-----BEGIN SSH SIGNATURE----- U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAgBTEvCQk6VqUAdN2RuH6bj1dNkY oOpbPWj+jw4ua1B1cAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5 AAAAQKB7MC9zv47L6/2YRSnH5qAyGy2Yx/HYXHYlKDQQqN1z6ZuEgvD+6eEhLNL0zQPtEt /ZUFI4at33Mp2vddON1A0= -----END SSH SIGNATURE-----
jolheiser <git@jolheiser.com>
4 months ago
2 changed files, 39 additions(+), 25 deletions(-)
forge.gomain.go
M forge.go -> forge.go
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
diff --git a/forge.go b/forge.go
index 8348a483e19af29d583059e08d387c503b16cedf..9aa64a99769c5a3b099a76e49bf88c787342f2fc 100644
--- a/forge.go
+++ b/forge.go
@@ -60,7 +60,7 @@ func (c *config) Login(ctx context.Context, r *types.OAuthRequest) (*model.User, string, error) {
 	slog.Info("Login")
 	provider, err := oidc.NewProvider(ctx, c.clientProvider)
 	if err != nil {
-		slog.Error("", slog.Any("err", err))
+		slog.Error("could not create OIDC provider", slog.Any("err", err))
 		return nil, "", err
 	}
 	config := oauth2.Config{
@@ -77,13 +77,13 @@ 	}
 
 	oauthToken, err := config.Exchange(ctx, r.Code)
 	if err != nil {
-		slog.Error("", slog.Any("err", err))
+		slog.Error("could not exchange oauth token", slog.Any("err", err))
 		return nil, redirectURL, err
 	}
 
 	userInfo, err := provider.UserInfo(ctx, oauth2.StaticTokenSource(oauthToken))
 	if err != nil {
-		slog.Error("", slog.Any("err", err))
+		slog.Error("could not get user info", slog.Any("err", err))
 		return nil, redirectURL, err
 	}
 
@@ -109,12 +109,12 @@ func (c *config) Auth(ctx context.Context, token string, secret string) (string, error) {
 	slog.Info("Auth")
 	provider, err := oidc.NewProvider(ctx, c.clientProvider)
 	if err != nil {
-		slog.Error("", slog.Any("err", err))
+		slog.Error("could not create oidc provider", slog.Any("err", err))
 		return "", err
 	}
 	userInfo, err := provider.UserInfo(ctx, oauth2.StaticTokenSource(&oauth2.Token{AccessToken: token}))
 	if err != nil {
-		slog.Error("", slog.Any("err", err))
+		slog.Error("could not get user info", slog.Any("err", err))
 		return "", err
 	}
 
@@ -159,7 +159,7 @@ 		name = string(remoteID)
 	}
 	_, err := c.gitRepo(name)
 	if err != nil {
-		slog.Error("", slog.Any("err", err))
+		slog.Error("could not get git repo", slog.String("repo", name), slog.Any("err", err))
 		return nil, err
 	}
 	return c.toRepo(name), nil
@@ -173,7 +173,7 @@ 		return []*model.Repo{}, nil
 	}
 	entries, err := os.ReadDir(c.repoDir)
 	if err != nil {
-		slog.Error("", slog.Any("err", err))
+		slog.Error("could not read repo dir", slog.Any("err", err))
 		return nil, fmt.Errorf("could not read repo dir: %w", err)
 	}
 	repos := make([]*model.Repo, 0, len(entries))
@@ -181,7 +181,7 @@ 	for _, entry := range entries {
 		if strings.HasSuffix(entry.Name(), ".git") {
 			repo, err := c.Repo(ctx, nil, "", "", strings.TrimSuffix(entry.Name(), ".git"))
 			if err != nil {
-				slog.Error("", slog.Any("err", err))
+				slog.Error("could not get repo", slog.Any("err", err))
 				return nil, err
 			}
 			repos = append(repos, repo)
@@ -196,22 +196,22 @@ func (c *config) File(ctx context.Context, u *model.User, r *model.Repo, b *model.Pipeline, f string) ([]byte, error) {
 	slog.Info("File")
 	repo, err := c.gitRepo(r.Name)
 	if err != nil {
-		slog.Error("", slog.Any("err", err))
+		slog.Error("could not get git repo", slog.Any("err", err))
 		return nil, err
 	}
 	commit, err := repo.CommitObject(plumbing.NewHash(b.Commit))
 	if err != nil {
-		slog.Error("", slog.Any("err", err))
+		slog.Error("could not get commit object", slog.String("commit", b.Commit), slog.String("repo", r.Name), slog.Any("err", err))
 		return nil, fmt.Errorf("could not get commit for %q: %w", b.Commit, err)
 	}
 	file, err := commit.File(f)
 	if err != nil {
-		slog.Error("", slog.Any("err", err))
+		slog.Error("could not get file", slog.Any("err", err))
 		return nil, fmt.Errorf("could not get file %q: %w", f, err)
 	}
 	content, err := file.Contents()
 	if err != nil {
-		slog.Error("", slog.Any("err", err))
+		slog.Error("could not get file contents", slog.Any("err", err))
 		return nil, fmt.Errorf("could not get file contents from %q: %w", f, err)
 	}
 	return []byte(content), nil
@@ -222,17 +222,17 @@ func (c *config) Dir(ctx context.Context, u *model.User, r *model.Repo, b *model.Pipeline, f string) ([]*types.FileMeta, error) {
 	slog.Info("Dir")
 	repo, err := c.gitRepo(r.Name)
 	if err != nil {
-		slog.Error("", slog.Any("err", err))
+		slog.Error("could not get git repo", slog.Any("err", err))
 		return nil, err
 	}
 	commit, err := repo.CommitObject(plumbing.NewHash(b.Commit))
 	if err != nil {
-		slog.Error("", slog.Any("err", err))
+		slog.Error("could not get commit object", slog.String("commit", b.Commit), slog.String("repo", r.Name), slog.Any("err", err))
 		return nil, fmt.Errorf("could not get commit for %q: %w", b.Commit, err)
 	}
 	files, err := commit.Files()
 	if err != nil {
-		slog.Error("", slog.Any("err", err))
+		slog.Error("could not get commit files", slog.Any("err", err))
 		return nil, fmt.Errorf("could not get files for %q: %w", b.Commit, err)
 	}
 	f = path.Clean(f)
@@ -242,7 +242,7 @@ 	if err := files.ForEach(func(fi *object.File) error {
 		if m, _ := filepath.Match(f, fi.Name); m {
 			data, err := c.File(ctx, u, r, b, fi.Name)
 			if err != nil {
-				slog.Error("", slog.Any("err", err))
+				slog.Error("could not get file", slog.Any("err", err))
 				return err
 			}
 			metas = append(metas, &types.FileMeta{
@@ -252,7 +252,7 @@ 			})
 		}
 		return nil
 	}); err != nil {
-		slog.Error("", slog.Any("err", err))
+		slog.Error("could not iterate files", slog.Any("err", err))
 		return nil, fmt.Errorf("problem while iterating over files: %w", err)
 	}
 	return metas, nil
@@ -298,12 +298,12 @@ 		return []string{}, nil
 	}
 	repo, err := c.gitRepo(r.Name)
 	if err != nil {
-		slog.Error("", slog.Any("err", err))
+		slog.Error("could not get git repo", slog.Any("err", err))
 		return nil, err
 	}
 	branches, err := repo.Branches()
 	if err != nil {
-		slog.Error("", slog.Any("err", err))
+		slog.Error("could not get branches", slog.Any("err", err))
 		return nil, fmt.Errorf("could not get branches: %w", err)
 	}
 	result := make([]string, 0)
@@ -311,7 +311,7 @@ 	if err := branches.ForEach(func(r *plumbing.Reference) error {
 		result = append(result, string(r.Name().Short()))
 		return nil
 	}); err != nil {
-		slog.Error("", slog.Any("err", err))
+		slog.Error("could not iterate over branches", slog.Any("err", err))
 		return nil, fmt.Errorf("problem while iterating over branches: %w", err)
 	}
 	return result, nil
@@ -322,12 +322,12 @@ func (c *config) BranchHead(ctx context.Context, u *model.User, r *model.Repo, branch string) (*model.Commit, error) {
 	slog.Info("BranchHead")
 	repo, err := c.gitRepo(r.Name)
 	if err != nil {
-		slog.Error("", slog.Any("err", err))
+		slog.Error("could not get git repo", slog.Any("err", err))
 		return nil, err
 	}
 	ref, err := repo.Reference(plumbing.NewBranchReferenceName(branch), true)
 	if err != nil {
-		slog.Error("", slog.Any("err", err))
+		slog.Error("could not get branch ref", slog.Any("err", err))
 		return nil, fmt.Errorf("could not resolve branch reference for %q: %w", branch, err)
 	}
 	return &model.Commit{
M main.go -> main.go
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
diff --git a/main.go b/main.go
index 2933392f91a3048e241f0da798976069221f9a4c..dd68673c3921d41de88f4aca167023150756b47a 100644
--- a/main.go
+++ b/main.go
@@ -23,6 +23,7 @@ 	clientRedirect   string
 
 	// Misc
 	logFilePath string
+	logJSON     bool
 }
 
 func main() {
@@ -35,7 +36,9 @@ 		clientSecretFile: env("client_secret_file"),
 		clientProvider:   mustEnv("provider"),
 		clientRedirect:   mustEnv("redirect"),
 		logFilePath:      env("log_file"),
+		logJSON:          env("log_json") == "1",
 	}
+
 	if cfg.clientSecretFile != "" {
 		content, err := os.ReadFile(cfg.clientSecretFile)
 		if err != nil {
@@ -46,6 +49,7 @@ 	}
 	if cfg.clientSecret == "" {
 		panic("client secret is required")
 	}
+
 	logLevel := slog.LevelInfo
 	switch env("log_level") {
 	case "debug":
@@ -55,16 +59,26 @@ 		logLevel = slog.LevelWarn
 	case "error":
 		logLevel = slog.LevelError
 	}
-	logFile := os.Stderr
+
+	logOutput := os.Stderr
 	if cfg.logFilePath != "" {
 		fi, err := os.Create(cfg.logFilePath)
 		if err != nil {
 			panic(err)
 		}
 		defer fi.Close()
-		logFile = fi
+		logOutput = fi
 	}
-	slog.SetDefault(slog.New(slog.NewTextHandler(logFile, &slog.HandlerOptions{Level: logLevel})))
+
+	logOpts := &slog.HandlerOptions{Level: logLevel}
+	var logger slog.Handler
+	if cfg.logJSON {
+		logger = slog.NewJSONHandler(logOutput, logOpts)
+	} else {
+		logger = slog.NewTextHandler(logOutput, logOpts)
+	}
+	slog.SetDefault(slog.New(logger))
+
 	defer func() {
 		if r := recover(); r != nil {
 			slog.Info("addon forge panic", slog.Any("message", r))