Skip to content

Commit 233e5ec

Browse files
committed
feat: add tui package and reorganize log output
1 parent 9f35e0f commit 233e5ec

18 files changed

+1642
-168
lines changed

cmd/cmd_server.go

+18-3
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,22 @@ package cmd
22

33
import (
44
"bytes"
5+
"context"
56
"encoding/json"
67
"errors"
78
"fmt"
89
"io"
9-
"log"
1010
"log/slog"
11+
"net"
1112
"net/http"
1213
"strconv"
14+
"time"
1315

1416
"github.com/jippi/scm-engine/pkg/config"
1517
"github.com/jippi/scm-engine/pkg/scm/gitlab"
1618
"github.com/jippi/scm-engine/pkg/state"
1719
"github.com/urfave/cli/v2"
20+
slogctx "github.com/veqryn/slog-context"
1821
)
1922

2023
type Commit struct {
@@ -47,6 +50,8 @@ func errHandler(w http.ResponseWriter, code int, err error) {
4750
}
4851

4952
func Server(cCtx *cli.Context) error { //nolint:unparam
53+
slogctx.Info(cCtx.Context, "Starting HTTP server")
54+
5055
mux := http.NewServeMux()
5156

5257
ourSecret := cCtx.String(FlagWebhookSecret)
@@ -58,6 +63,8 @@ func Server(cCtx *cli.Context) error { //nolint:unparam
5863
}
5964

6065
mux.HandleFunc("POST /gitlab", func(writer http.ResponseWriter, reader *http.Request) {
66+
slogctx.Info(reader.Context(), "Handling /gitlab request")
67+
6168
if len(ourSecret) > 0 {
6269
theirSecret := reader.Header.Get("X-Gitlab-Token")
6370
if ourSecret != theirSecret {
@@ -146,7 +153,15 @@ func Server(cCtx *cli.Context) error { //nolint:unparam
146153
writer.Write([]byte("OK"))
147154
})
148155

149-
log.Fatal(http.ListenAndServe("0.0.0.0:3000", mux)) //nolint:gosec
156+
server := &http.Server{
157+
Addr: "0.0.0.0:3000",
158+
Handler: http.Handler(mux),
159+
ReadTimeout: 5 * time.Second,
160+
WriteTimeout: 5 * time.Second,
161+
BaseContext: func(l net.Listener) context.Context {
162+
return cCtx.Context
163+
},
164+
}
150165

151-
return nil
166+
return server.ListenAndServe()
152167
}

cmd/shared.go

+13-22
Original file line numberDiff line numberDiff line change
@@ -2,55 +2,54 @@ package cmd
22

33
import (
44
"context"
5-
"fmt"
5+
"log/slog"
66
"net/http"
77

88
"github.com/jippi/scm-engine/pkg/config"
99
"github.com/jippi/scm-engine/pkg/scm"
1010
"github.com/jippi/scm-engine/pkg/state"
11+
slogctx "github.com/veqryn/slog-context"
1112
)
1213

1314
func ProcessMR(ctx context.Context, client scm.Client, cfg *config.Config, mr string, event any) error {
1415
ctx = state.ContextWithMergeRequestID(ctx, mr)
1516

1617
// for mr := 900; mr <= 1000; mr++ {
17-
fmt.Println("Processing MR", mr)
18+
slogctx.Info(ctx, "Processing MR")
1819

1920
remoteLabels, err := client.Labels().List(ctx)
2021
if err != nil {
2122
return err
2223
}
2324

24-
fmt.Println("Creating evaluation context")
25+
slogctx.Info(ctx, "Creating evaluation context")
2526

2627
evalContext, err := client.EvalContext(ctx)
2728
if err != nil {
2829
return err
2930
}
3031

3132
if evalContext == nil || !evalContext.IsValid() {
32-
fmt.Println("Evaluating context is empty, does the Merge Request exists?")
33+
slogctx.Warn(ctx, "Evaluating context is empty, does the Merge Request exists?")
3334

3435
return nil
3536
}
3637

3738
evalContext.SetWebhookEvent(event)
3839

39-
fmt.Println("Evaluating context")
40+
slogctx.Info(ctx, "Evaluating context")
4041

4142
labels, actions, err := cfg.Evaluate(evalContext)
4243
if err != nil {
4344
return err
4445
}
4546

46-
fmt.Println("Sync labels")
47+
slogctx.Info(ctx, "Sync labels")
4748

4849
if err := syncLabels(ctx, client, remoteLabels, labels); err != nil {
4950
return err
5051
}
5152

52-
fmt.Println("Done!")
53-
5453
var (
5554
add scm.LabelOptions
5655
remove scm.LabelOptions
@@ -69,22 +68,18 @@ func ProcessMR(ctx context.Context, client scm.Client, cfg *config.Config, mr st
6968
RemoveLabels: &remove,
7069
}
7170

72-
fmt.Println("Applying actions")
71+
slogctx.Info(ctx, "Applying actions")
7372

7473
if err := runActions(ctx, client, update, actions); err != nil {
7574
return err
7675
}
7776

78-
fmt.Println("Done!")
79-
80-
fmt.Println("Updating MR")
77+
slogctx.Info(ctx, "Updating MR")
8178

8279
if err := updateMergeRequest(ctx, client, update); err != nil {
8380
return err
8481
}
8582

86-
fmt.Println("Done!")
87-
8883
return nil
8984
}
9085

@@ -107,7 +102,7 @@ func runActions(ctx context.Context, client scm.Client, update *scm.UpdateMergeR
107102
}
108103

109104
func syncLabels(ctx context.Context, client scm.Client, remote []*scm.Label, required []scm.EvaluationResult) error {
110-
fmt.Println("Going to sync", len(required), "required labels")
105+
slogctx.Info(ctx, "Going to sync required labels", slog.Int("number_of_labels", len(required)))
111106

112107
remoteLabels := map[string]*scm.Label{}
113108
for _, e := range remote {
@@ -120,7 +115,7 @@ func syncLabels(ctx context.Context, client scm.Client, remote []*scm.Label, req
120115
continue
121116
}
122117

123-
fmt.Print("Creating label ", label.Name, ": ")
118+
slogctx.Info(ctx, "Creating label", slog.String("label", label.Name))
124119

125120
_, resp, err := client.Labels().Create(ctx, &scm.CreateLabelOptions{
126121
Name: &label.Name, //nolint:gosec
@@ -131,15 +126,13 @@ func syncLabels(ctx context.Context, client scm.Client, remote []*scm.Label, req
131126
if err != nil {
132127
// Label already exists
133128
if resp.StatusCode == http.StatusConflict {
134-
fmt.Println("Already exists!")
129+
slogctx.Warn(ctx, "Label already exists", slog.String("label", label.Name))
135130

136131
continue
137132
}
138133

139134
return err
140135
}
141-
142-
fmt.Println("OK")
143136
}
144137

145138
// Update
@@ -153,7 +146,7 @@ func syncLabels(ctx context.Context, client scm.Client, remote []*scm.Label, req
153146
continue
154147
}
155148

156-
fmt.Print("Updating label ", label.Name, ": ")
149+
slogctx.Info(ctx, "Updating label", slog.String("label", label.Name))
157150

158151
_, _, err := client.Labels().Update(ctx, &scm.UpdateLabelOptions{
159152
Name: &label.Name, //nolint:gosec
@@ -164,8 +157,6 @@ func syncLabels(ctx context.Context, client scm.Client, remote []*scm.Label, req
164157
if err != nil {
165158
return err
166159
}
167-
168-
fmt.Println("OK")
169160
}
170161

171162
return nil

go.mod

+20
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,23 @@ go 1.22.3
44

55
require (
66
github.com/99designs/gqlgen v0.17.46
7+
github.com/charmbracelet/lipgloss v0.10.0
78
github.com/davecgh/go-spew v1.1.1
89
github.com/expr-lang/expr v1.16.7
910
github.com/fatih/structtag v1.2.0
11+
github.com/golang-cz/devslog v0.0.8
1012
github.com/guregu/null/v5 v5.0.0
1113
github.com/hasura/go-graphql-client v0.12.1
1214
github.com/iancoleman/strcase v0.3.0
15+
github.com/lmittmann/tint v1.0.4
16+
github.com/muesli/termenv v0.15.2
17+
github.com/reugn/pkgslog v0.2.0
18+
github.com/samber/slog-multi v1.0.2
19+
github.com/teacat/noire v1.1.0
1320
github.com/urfave/cli/v2 v2.27.2
1421
github.com/vektah/gqlparser/v2 v2.5.11
22+
github.com/veqryn/slog-context v0.7.0
23+
github.com/veqryn/slog-dedup v0.5.0
1524
github.com/xanzy/go-gitlab v0.104.1
1625
github.com/xhit/go-str2duration/v2 v2.1.0
1726
golang.org/x/oauth2 v0.20.0
@@ -20,18 +29,29 @@ require (
2029

2130
require (
2231
github.com/agnivade/levenshtein v1.1.1 // indirect
32+
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
2333
github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect
34+
github.com/go-logr/logr v1.4.1 // indirect
2435
github.com/google/go-querystring v1.1.0 // indirect
2536
github.com/google/uuid v1.6.0 // indirect
2637
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
2738
github.com/hashicorp/go-retryablehttp v0.7.2 // indirect
39+
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
40+
github.com/mattn/go-isatty v0.0.20 // indirect
41+
github.com/mattn/go-runewidth v0.0.15 // indirect
42+
github.com/muesli/reflow v0.3.0 // indirect
43+
github.com/rivo/uniseg v0.4.7 // indirect
2844
github.com/russross/blackfriday/v2 v2.1.0 // indirect
45+
github.com/samber/lo v1.38.1 // indirect
2946
github.com/sosodev/duration v1.3.0 // indirect
3047
github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 // indirect
48+
golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 // indirect
3149
golang.org/x/mod v0.17.0 // indirect
3250
golang.org/x/sync v0.7.0 // indirect
51+
golang.org/x/sys v0.19.0 // indirect
3352
golang.org/x/text v0.15.0 // indirect
3453
golang.org/x/time v0.3.0 // indirect
3554
golang.org/x/tools v0.20.0 // indirect
55+
modernc.org/b/v2 v2.1.0 // indirect
3656
nhooyr.io/websocket v1.8.11 // indirect
3757
)

go.sum

+54
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,13 @@ github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNg
66
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
77
github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q=
88
github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE=
9+
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
10+
github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
11+
github.com/charmbracelet/lipgloss v0.10.0 h1:KWeXFSexGcfahHX+54URiZGkBFazf70JNMtwg/AFW3s=
12+
github.com/charmbracelet/lipgloss v0.10.0/go.mod h1:Wig9DSfvANsxqkRsqj6x87irdy123SR4dOXlKa91ciE=
913
github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4=
1014
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
15+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
1116
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
1217
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
1318
github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48 h1:fRzb/w+pyskVMQ+UbP35JkH8yB7MYb4q/qhBarqZE6g=
@@ -16,6 +21,10 @@ github.com/expr-lang/expr v1.16.7 h1:gCIiHt5ODA0xIaDbD0DPKyZpM9Drph3b3lolYAYq2Kw
1621
github.com/expr-lang/expr v1.16.7/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4=
1722
github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=
1823
github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=
24+
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
25+
github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
26+
github.com/golang-cz/devslog v0.0.8 h1:53ipA2rC5JzWBWr9qB8EfenvXppenNiF/8DwgtNT5Q4=
27+
github.com/golang-cz/devslog v0.0.8/go.mod h1:bSe5bm0A7Nyfqtijf1OMNgVJHlWEuVSXnkuASiE1vV8=
1928
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
2029
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
2130
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
@@ -39,35 +48,73 @@ github.com/hasura/go-graphql-client v0.12.1 h1:tL+BCoyubkYYyaQ+tJz+oPe/pSxYwOJHw
3948
github.com/hasura/go-graphql-client v0.12.1/go.mod h1:F4N4kR6vY8amio3gEu3tjSZr8GPOXJr3zj72DKixfLE=
4049
github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=
4150
github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
51+
github.com/lmittmann/tint v1.0.4 h1:LeYihpJ9hyGvE0w+K2okPTGUdVLfng1+nDNVR4vWISc=
52+
github.com/lmittmann/tint v1.0.4/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE=
53+
github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
54+
github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
55+
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
56+
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
57+
github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
58+
github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
59+
github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
4260
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
4361
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
62+
github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s=
63+
github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8=
64+
github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo=
65+
github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8=
4466
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
4567
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
68+
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk=
69+
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
70+
github.com/reugn/pkgslog v0.2.0 h1:Kedn37OrnOh+5cBxNNwrUHR7e8175CQLk8QztbPZ+VQ=
71+
github.com/reugn/pkgslog v0.2.0/go.mod h1:Gb0SqIq+BCzAeTeWdHxiVz4S206U30WBd6gSsnjfMxo=
72+
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
73+
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
74+
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
75+
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
4676
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
4777
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
78+
github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM=
79+
github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA=
80+
github.com/samber/slog-multi v1.0.2 h1:6BVH9uHGAsiGkbbtQgAOQJMpKgV8unMrHhhJaw+X1EQ=
81+
github.com/samber/slog-multi v1.0.2/go.mod h1:uLAvHpGqbYgX4FSL0p1ZwoLuveIAJvBECtE07XmYvFo=
4882
github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8=
4983
github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I=
5084
github.com/sosodev/duration v1.3.0 h1:g3E6mto+hFdA2uZXeNDYff8LYeg7v5D4YKP/Ng/NUkE=
5185
github.com/sosodev/duration v1.3.0/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg=
86+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
5287
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
88+
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
5389
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
5490
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
91+
github.com/teacat/noire v1.1.0 h1:5IgJ1H8jodiSSYnrVadV2JjbAnEgCCjYUQxSUuaQ7Sg=
92+
github.com/teacat/noire v1.1.0/go.mod h1:cetGlnqr+9yKJcFgRgYXOWJY66XIrrjUsGBwNlNNtAk=
5593
github.com/urfave/cli/v2 v2.27.2 h1:6e0H+AkS+zDckwPCUrZkKX38mRaau4nL2uipkJpbkcI=
5694
github.com/urfave/cli/v2 v2.27.2/go.mod h1:g0+79LmHHATl7DAcHO99smiR/T7uGLw84w8Y42x+4eM=
5795
github.com/vektah/gqlparser/v2 v2.5.11 h1:JJxLtXIoN7+3x6MBdtIP59TP1RANnY7pXOaDnADQSf8=
5896
github.com/vektah/gqlparser/v2 v2.5.11/go.mod h1:1rCcfwB2ekJofmluGWXMSEnPMZgbxzwj6FaZ/4OT8Cc=
97+
github.com/veqryn/slog-context v0.7.0 h1:Ne7ajlR6Mjs2rQQtpg8k0eO6krR5wzpareh5VpV+V2s=
98+
github.com/veqryn/slog-context v0.7.0/go.mod h1:E+qpdyiQs2YKRxFnX1JjpdFE1z3Ka94Kem2q9ZG6Jjo=
99+
github.com/veqryn/slog-dedup v0.5.0 h1:2pc4va3q8p7Tor1SjVvi1ZbVK/oKNPgsqG15XFEt0iM=
100+
github.com/veqryn/slog-dedup v0.5.0/go.mod h1:/iQU008M3qFa5RovtfiHiODxJFvxZLjWRG/qf/zKFHw=
59101
github.com/xanzy/go-gitlab v0.104.1 h1:g/liXIPJH0jsTwVuzTAUMiKdTf6Qup3u2XZq5Rp90Wc=
60102
github.com/xanzy/go-gitlab v0.104.1/go.mod h1:ETg8tcj4OhrB84UEgeE8dSuV/0h4BBL1uOV/qK0vlyI=
61103
github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc=
62104
github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU=
63105
github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 h1:+qGGcbkzsfDQNPPe9UDgpxAWQrhbbBXOYJFQDq/dtJw=
64106
github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913/go.mod h1:4aEEwZQutDLsQv2Deui4iYQ6DWTxR14g6m8Wv88+Xqk=
107+
golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 h1:3MTrJm4PyNL9NBqvYDSj3DHl46qQakyfqfWo4jgfaEM=
108+
golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE=
65109
golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
66110
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
67111
golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo=
68112
golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
69113
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
70114
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
115+
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
116+
golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o=
117+
golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
71118
golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk=
72119
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
73120
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
@@ -79,7 +126,14 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+
79126
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
80127
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
81128
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
129+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
82130
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
83131
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
132+
modernc.org/b/v2 v2.1.0 h1:kMD/G43EYnsFJI/0qK1F1X659XlSs41bp01MUDidHC0=
133+
modernc.org/b/v2 v2.1.0/go.mod h1:fQhHWDXrchyUSLjQYCslV/4uw04PW1LeiZ25D4SNmeo=
134+
modernc.org/mathutil v1.4.1 h1:ij3fYGe8zBF4Vu+g0oT7mB06r8sqGWKuJu1yXeR4by8=
135+
modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
136+
modernc.org/strutil v1.1.1 h1:xv+J1BXY3Opl2ALrBwyfEikFAj8pmqcpnfmuwUwcozs=
137+
modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw=
84138
nhooyr.io/websocket v1.8.11 h1:f/qXNc2/3DpoSZkHt1DQu6rj4zGC8JmkkLkWss0MgN0=
85139
nhooyr.io/websocket v1.8.11/go.mod h1:rN9OFWIUwuxg4fR5tELlYC04bXYowCP9GX47ivo2l+c=

main.go

+6
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77

88
"github.com/davecgh/go-spew/spew"
99
"github.com/jippi/scm-engine/cmd"
10+
"github.com/jippi/scm-engine/pkg/tui"
1011
"github.com/urfave/cli/v2"
1112
)
1213

@@ -25,6 +26,11 @@ func main() {
2526
Email: "gitlab-engine@jippi.dev",
2627
},
2728
},
29+
Before: func(cCtx *cli.Context) error {
30+
cCtx.Context = tui.NewContext(cCtx.Context, cCtx.App.Writer, cCtx.App.ErrWriter)
31+
32+
return nil
33+
},
2834
Flags: []cli.Flag{
2935
&cli.StringFlag{
3036
Name: cmd.FlagConfigFile,

0 commit comments

Comments
 (0)