Diff
1diff --git a/config/config.go b/config/config.go
2index 3c3ab52d0fa3c3ba6f7f091f656a8dda586cf8f9..580bcb479f53531e5155136e6b973c991e8fa451 100644
3--- a/config/config.go
4+++ b/config/config.go
5@@ -22,13 +22,14 @@ type Config struct {
6 RepoPath string `env:"SOFT_SERVE_REPO_PATH" envDefault:".repos"`
7 InitialAdminKeys []string `env:"SOFT_SERVE_INITIAL_ADMIN_KEY" envSeparator:"\n"`
8 Callbacks Callbacks
9+ ErrorLog *log.Logger
10 }
11
12 // DefaultConfig returns a Config with the values populated with the defaults
13 // or specified environment variables.
14 func DefaultConfig() *Config {
15- var cfg Config
16- if err := env.Parse(&cfg); err != nil {
17+ cfg := &Config{ErrorLog: log.Default()}
18+ if err := env.Parse(cfg); err != nil {
19 log.Fatalln(err)
20 }
21 if cfg.KeyPath == "" {
22@@ -43,3 +44,9 @@ func (c *Config) WithCallbacks(callbacks Callbacks) *Config {
23 c.Callbacks = callbacks
24 return c
25 }
26+
27+// WithErrorLogger sets the error logger for the configuration.
28+func (c *Config) WithErrorLogger(logger *log.Logger) *Config {
29+ c.ErrorLog = logger
30+ return c
31+}
32diff --git a/go.mod b/go.mod
33index 515eae0295bd259da2b86267ba6ee2857a4737f3..6f6ef1df4b09317e733a0b16164bfad1ed0705d7 100644
34--- a/go.mod
35+++ b/go.mod
36@@ -5,10 +5,10 @@ go 1.17
37 require (
38 github.com/caarlos0/env/v6 v6.9.1
39 github.com/charmbracelet/bubbles v0.10.0
40- github.com/charmbracelet/bubbletea v0.19.3
41+ github.com/charmbracelet/bubbletea v0.19.4-0.20220208181305-42cd4c31919c
42 github.com/charmbracelet/glamour v0.4.0
43 github.com/charmbracelet/lipgloss v0.4.0
44- github.com/charmbracelet/wish v0.1.2
45+ github.com/charmbracelet/wish v0.2.1-0.20220208182816-534842b53d2a
46 github.com/dustin/go-humanize v1.0.0
47 github.com/gliderlabs/ssh v0.3.3
48 github.com/go-git/go-billy/v5 v5.3.1
49@@ -42,7 +42,7 @@ require (
50 github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a // indirect
51 github.com/mitchellh/go-homedir v1.1.0 // indirect
52 github.com/muesli/ansi v0.0.0-20211031195517-c9f0611b6c70 // indirect
53- github.com/muesli/termenv v0.9.0 // indirect
54+ github.com/muesli/termenv v0.11.0 // indirect
55 github.com/olekukonko/tablewriter v0.0.5 // indirect
56 github.com/rivo/uniseg v0.2.0 // indirect
57 github.com/sergi/go-diff v1.2.0 // indirect
58diff --git a/go.sum b/go.sum
59index d57c68afdd99e72d61acb01deaa45791f4d883e0..5749f90ecd1569e09abab465c29ff7b08ecad062 100644
60--- a/go.sum
61+++ b/go.sum
62@@ -22,9 +22,9 @@ github.com/caarlos0/env/v6 v6.9.1 h1:zOkkjM0F6ltnQ5eBX6IPI41UP/KDGEK7rRPwGCNos8k
63 github.com/caarlos0/env/v6 v6.9.1/go.mod h1:hvp/ryKXKipEkcuYjs9mI4bBCg+UI0Yhgm5Zu0ddvwc=
64 github.com/charmbracelet/bubbles v0.10.0 h1:ZYqBwnmFGp91HSRRbhxKq5jr6bUPsVUBdkrGGWtv0Wk=
65 github.com/charmbracelet/bubbles v0.10.0/go.mod h1:4tiDrWzH1MTD4t5NnrcthaedmI3MxU0FIutax7//dvk=
66-github.com/charmbracelet/bubbletea v0.19.0/go.mod h1:VuXF2pToRxDUHcBUcPmCRUHRvFATM4Ckb/ql1rBl3KA=
67-github.com/charmbracelet/bubbletea v0.19.3 h1:OKeO/Y13rQQqt4snX+lePB0QrnW80UdrMNolnCcmoAw=
68 github.com/charmbracelet/bubbletea v0.19.3/go.mod h1:VuXF2pToRxDUHcBUcPmCRUHRvFATM4Ckb/ql1rBl3KA=
69+github.com/charmbracelet/bubbletea v0.19.4-0.20220208181305-42cd4c31919c h1:hcS4xdVQwblKo8xuA5gRO/jql+yCVfnBlOwWcZrxOmA=
70+github.com/charmbracelet/bubbletea v0.19.4-0.20220208181305-42cd4c31919c/go.mod h1:5nPeULOIxbAMykb3ggwhw1kruS7nP+Y4Za9yEH4J27U=
71 github.com/charmbracelet/glamour v0.4.0 h1:scR+smyB7WdmrlIaff6IVlm48P48JaNM7JypM/VGl4k=
72 github.com/charmbracelet/glamour v0.4.0/go.mod h1:9ZRtG19AUIzcTm7FGLGbq3D5WKQ5UyZBbQsMQN0XIqc=
73 github.com/charmbracelet/harmonica v0.1.0/go.mod h1:KSri/1RMQOZLbw7AHqgcBycp8pgJnQMYYT8QZRqZ1Ao=
74@@ -33,8 +33,8 @@ github.com/charmbracelet/keygen v0.1.2/go.mod h1:kFQ3Cvop12fXWX1K29vxDxV9x8ujG4w
75 github.com/charmbracelet/lipgloss v0.3.0/go.mod h1:VkhdBS2eNAmRkTwRKLJCFhCOVkjntMusBDxv7TXahuk=
76 github.com/charmbracelet/lipgloss v0.4.0 h1:768h64EFkGUr8V5yAKV7/Ta0NiVceiPaV+PphaW1K9g=
77 github.com/charmbracelet/lipgloss v0.4.0/go.mod h1:vmdkHvce7UzX6xkyf4cca8WlwdQ5RQr8fzta+xl7BOM=
78-github.com/charmbracelet/wish v0.1.2 h1:YoKQYLsC3M6rIIP0PS/tM+5nVQb5ij+6SvGKKedjV6s=
79-github.com/charmbracelet/wish v0.1.2/go.mod h1:tD+sb5aS1SSX0t7hIZXXUonv2YbnFNCnU6qfOolKKUE=
80+github.com/charmbracelet/wish v0.2.1-0.20220208182816-534842b53d2a h1:dDdOcIedpXZ13xGfwFDd1ZlTUXotX945xXtz+7rHBK8=
81+github.com/charmbracelet/wish v0.2.1-0.20220208182816-534842b53d2a/go.mod h1:8O/9uZMnzct6WZP3MgFMlcfwWfd2jfTPIhenfF7KqeE=
82 github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ=
83 github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw=
84 github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U=
85@@ -88,7 +88,6 @@ github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A=
86 github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA=
87 github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
88 github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
89-github.com/mattn/go-isatty v0.0.14-0.20210829144114-504425e14f74/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
90 github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
91 github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
92 github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
93@@ -109,8 +108,9 @@ github.com/muesli/reflow v0.2.1-0.20210115123740-9e1d0d53df68/go.mod h1:Xk+z4oIW
94 github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s=
95 github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8=
96 github.com/muesli/termenv v0.8.1/go.mod h1:kzt/D/4a88RoheZmwfqorY3A+tnsSMA9HJC/fQSFKo0=
97-github.com/muesli/termenv v0.9.0 h1:wnbOaGz+LUR3jNT0zOzinPnyDaCZUQRZj9GxK8eRVl8=
98 github.com/muesli/termenv v0.9.0/go.mod h1:R/LzAKf+suGs4IsO95y7+7DpFHO0KABgnZqtlyx2mBw=
99+github.com/muesli/termenv v0.11.0 h1:fwNUbu2mfWlgicwG7qYzs06aOI8Z/zKPAv8J4uKbT+o=
100+github.com/muesli/termenv v0.11.0/go.mod h1:Bd5NYQ7pd+SrtBSrSNoBBmXlcY8+Xj4BMJgh8qcZrvs=
101 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
102 github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
103 github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
104diff --git a/internal/tui/session.go b/internal/tui/session.go
105index aa1573fd3ecf42f860e1a3afbd53a54005c5d078..c322d01c19d1ef53d6fba06442ffbd692caa6e35 100644
106--- a/internal/tui/session.go
107+++ b/internal/tui/session.go
108@@ -30,6 +30,9 @@ func SessionHandler(cfg *config.Config) func(ssh.Session) (tea.Model, []tea.Prog
109 if cfg.Cfg.Callbacks != nil {
110 cfg.Cfg.Callbacks.Tui("view")
111 }
112- return NewBubble(cfg, scfg), []tea.ProgramOption{tea.WithAltScreen()}
113+ return NewBubble(cfg, scfg), []tea.ProgramOption{
114+ tea.WithAltScreen(),
115+ tea.WithoutCatchPanics(),
116+ }
117 }
118 }
119diff --git a/server/server.go b/server/server.go
120index 0cb2c233ad6514feb2a28a8c2fa4cc316d5d2787..863e6b807daf7cdc05800774ab2c36ce323ab2e3 100644
121--- a/server/server.go
122+++ b/server/server.go
123@@ -13,6 +13,7 @@ import (
124 bm "github.com/charmbracelet/wish/bubbletea"
125 gm "github.com/charmbracelet/wish/git"
126 lm "github.com/charmbracelet/wish/logging"
127+ rm "github.com/charmbracelet/wish/recover"
128 "github.com/gliderlabs/ssh"
129 )
130
131@@ -34,9 +35,12 @@ func NewServer(cfg *config.Config) *Server {
132 log.Fatal(err)
133 }
134 mw := []wish.Middleware{
135- bm.Middleware(tui.SessionHandler(ac)),
136- gm.Middleware(cfg.RepoPath, ac),
137- lm.Middleware(),
138+ rm.MiddlewareWithLogger(
139+ cfg.ErrorLog,
140+ bm.Middleware(tui.SessionHandler(ac)),
141+ gm.Middleware(cfg.RepoPath, ac),
142+ lm.Middleware(),
143+ ),
144 }
145 s, err := wish.NewServer(
146 ssh.PublicKeyAuth(ac.PublicKeyHandler),