bcbb569536597d35e24007acf2fd5e945c65611d
- Author
- Toby Padilla <toby@charm.sh>
- Committer
- Toby Padilla <toby@charm.sh>
- Date
Message
Diff
This diff is truncated to protect this page.
1diff --git a/git/git.go b/git/git.go
2index 5858e9c30e10d333cb4cd20489e7274d2c5794b5..6de0807075ea653b9b89c033788e4d14fcf9d105 100644
3--- a/git/git.go
4+++ b/git/git.go
5@@ -28,8 +28,6 @@ type RepoCommit struct {
6
7 type CommitLog []RepoCommit
8
9-type ReadmeTransform func(string) string
10-
11 func (cl CommitLog) Len() int { return len(cl) }
12 func (cl CommitLog) Swap(i, j int) { cl[i], cl[j] = cl[j], cl[i] }
13 func (cl CommitLog) Less(i, j int) bool {
14@@ -37,19 +35,18 @@ func (cl CommitLog) Less(i, j int) bool {
15 }
16
17 type RepoSource struct {
18- Path string
19- mtx sync.Mutex
20- repos []*Repo
21- commits CommitLog
22- readmeTransform ReadmeTransform
23+ Path string
24+ mtx sync.Mutex
25+ repos []*Repo
26+ commits CommitLog
27 }
28
29-func NewRepoSource(repoPath string, rf ReadmeTransform) *RepoSource {
30+func NewRepoSource(repoPath string) *RepoSource {
31 err := os.MkdirAll(repoPath, os.ModeDir|os.FileMode(0700))
32 if err != nil {
33 log.Fatal(err)
34 }
35- rs := &RepoSource{Path: repoPath, readmeTransform: rf}
36+ rs := &RepoSource{Path: repoPath}
37 return rs
38 }
39
40@@ -129,7 +126,7 @@ func (rs *RepoSource) loadRepo(name string, rg *git.Repository) (*Repo, error) {
41 if err == nil {
42 rmd, err := rf.Contents()
43 if err == nil {
44- r.Readme = rs.readmeTransform(rmd)
45+ r.Readme = rmd
46 }
47 }
48 }
49diff --git a/tui/bubble.go b/tui/bubble.go
50index f6f1c021ea4c0c9a5d5cbc78ac2abc8eaa5a7d62..51109f08b1f5b99a14298d08cff1df132ecafd42 100644
51--- a/tui/bubble.go
52+++ b/tui/bubble.go
53@@ -9,9 +9,7 @@ import (
54 "smoothie/tui/bubbles/selection"
55 "time"
56
57- "github.com/charmbracelet/bubbles/viewport"
58 tea "github.com/charmbracelet/bubbletea"
59- "github.com/charmbracelet/glamour"
60 "github.com/charmbracelet/lipgloss"
61 "github.com/gliderlabs/ssh"
62 )
63@@ -28,6 +26,7 @@ const (
64
65 type MenuEntry struct {
66 Name string `json:"name"`
67+ Note string `json:"note"`
68 Repo string `json:"repo"`
69 }
70
71@@ -45,20 +44,19 @@ type SessionConfig struct {
72 }
73
74 type Bubble struct {
75- config *Config
76- state sessionState
77- error string
78- width int
79- height int
80- windowChanges <-chan ssh.Window
81- repoSource *git.RepoSource
82- repoMenu []MenuEntry
83- repos []*git.Repo
84- boxes []tea.Model
85- activeBox int
86- repoSelect *selection.Bubble
87- commitsLog *commits.Bubble
88- readmeViewport *ViewportBubble
89+ config *Config
90+ state sessionState
91+ error string
92+ width int
93+ height int
94+ windowChanges <-chan ssh.Window
95+ repoSource *git.RepoSource
96+ repoMenu []MenuEntry
97+ repos []*git.Repo
98+ boxes []tea.Model
99+ activeBox int
100+ repoSelect *selection.Bubble
101+ commitsLog *commits.Bubble
102 }
103
104 func NewBubble(cfg *Config, sCfg *SessionConfig) *Bubble {
105@@ -69,12 +67,6 @@ func NewBubble(cfg *Config, sCfg *SessionConfig) *Bubble {
106 windowChanges: sCfg.WindowChanges,
107 repoSource: cfg.RepoSource,
108 boxes: make([]tea.Model, 2),
109- readmeViewport: &ViewportBubble{
110- Viewport: &viewport.Model{
111- Width: boxRightWidth - horizontalPadding - 2,
112- Height: sCfg.Height - verticalPadding - viewportHeightConstant,
113- },
114- },
115 }
116 b.state = startState
117 return b
118@@ -149,21 +141,6 @@ func (b *Bubble) View() string {
119 return appBoxStyle.Render(content)
120 }
121
122-func glamourReadme(md string) string {
123- tr, err := glamour.NewTermRenderer(
124- glamour.WithAutoStyle(),
125- glamour.WithWordWrap(boxRightWidth-2),
126- )
127- if err != nil {
128- log.Fatal(err)
129- }
130- mdt, err := tr.Render(md)
131- if err != nil {
132- return md
133- }
134- return mdt
135-}
136-
137 func loadConfig(rs *git.RepoSource) (*Config, error) {
138 cfg := &Config{}
139 cfg.RepoSource = rs
140@@ -183,7 +160,7 @@ func loadConfig(rs *git.RepoSource) (*Config, error) {
141 }
142
143 func SessionHandler(reposPath string, repoPoll time.Duration) func(ssh.Session) (tea.Model, []tea.ProgramOption) {
144- rs := git.NewRepoSource(reposPath, glamourReadme)
145+ rs := git.NewRepoSource(reposPath)
146 err := createDefaultConfigRepo(rs)
147 if err != nil {
148 if err != nil {
149diff --git a/tui/bubbles/repo/bubble.go b/tui/bubbles/repo/bubble.go
150index 3d1f22da4d48b41eaa832b5e738084d9f0c87d3a..417ffc9b4b44dea31f59c7c84cd3a09ddb0ff8b1 100644
151--- a/tui/bubbles/repo/bubble.go
152+++ b/tui/bubbles/repo/bubble.go
153@@ -1,22 +1,95 @@
154 package repo
155
156 import (
157+ "bytes"
158+ "smoothie/git"
159+ "text/template"
160+
161+ "github.com/charmbracelet/bubbles/viewport"
162 tea "github.com/charmbracelet/bubbletea"
163- "github.com/go-git/go-git/v5"
164+ "github.com/charmbracelet/glamour"
165 )
166
167+type ErrMsg struct {
168+ Error error
169+}
170+
171 type Bubble struct {
172- repo *git.Repository
173+ templateObject interface{}
174+ repoSource *git.RepoSource
175+ name string
176+ repo *git.Repo
177+ readmeViewport *ViewportBubble
178+}
179+
180+func NewBubble(rs *git.RepoSource, name string, width int, height int, tmp interface{}) *Bubble {
181+ return &Bubble{
182+ templateObject: tmp,
183+ repoSource: rs,
184+ name: name,
185+ readmeViewport: &ViewportBubble{
186+ Viewport: &viewport.Model{
187+ Width: width,
188+ Height: height,
189+ },
190+ },
191+ }
192 }
193
194 func (b *Bubble) Init() tea.Cmd {
195- return nil
196+ return b.setupCmd
197 }
198
199-func (b *Bubble) Update(tea.Msg) (tea.Model, tea.Cmd) {
200- return nil, nil
201+func (b *Bubble) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
202+ return b.readmeViewport.Update(msg)
203 }
204
205 func (b *Bubble) View() string {
206- return "repo"
207+ return b.readmeViewport.View()
208+}
209+
210+func (b *Bubble) setupCmd() tea.Msg {
211+ r, err := b.repoSource.GetRepo(b.name)
212+ if err != nil {
213+ return ErrMsg{err}
214+ }
215+ md := r.Readme
216+ if b.templateObject != nil {
217+ t, err := template.New("readme").Parse(md)
218+ if err != nil {
219+ return ErrMsg{err}
220+ }
221+ buf := &bytes.Buffer{}
222+ err = t.Execute(buf, b.templateObject)
223+ if err != nil {
224+ return ErrMsg{err}
225+ }
226+ md = buf.String()
227+ }
228+ md, err = b.glamourize(md)
229+ if err != nil {
230+ return ErrMsg{err}
231+ }
232+ b.readmeViewport.Viewport.GotoTop()
233+ b.readmeViewport.Viewport.SetContent(md)
234+ return nil
235+}
236+
237+func (b *Bubble) templatize(t string) (string, error) {
238+ return "", nil
239+}
240+
241+func (b *Bubble) glamourize(md string) (string, error) {
242+ tr, err := glamour.NewTermRenderer(
243+ glamour.WithAutoStyle(),
244+ glamour.WithWordWrap(b.readmeViewport.Viewport.Width),
245+ )
246+ if err != nil {
247+ return "", err
248+ }
249+ mdt, err := tr.Render(md)
250+ if err != nil {
251+ return "", err
252+ }
253diff --git a/tui/viewport_patch.go b/tui/bubbles/repo/viewport_patch.go
254rename from tui/viewport_patch.go
255rename to tui/bubbles/repo/viewport_patch.go
256index b924145a069d6c7765a15540d7c06b55e990084e..df176ebebe429decac912802b7e98c21476a8d64 100644
257--- a/tui/viewport_patch.go
258+++ b/tui/bubbles/repo/viewport_patch.go
259@@ -1,4 +1,4 @@
260-package tui
261+package repo
262
263 import (
264 "github.com/charmbracelet/bubbles/viewport"
265diff --git a/tui/commands.go b/tui/commands.go
266index 0018e2b49b102348ff9fe287fc44cf4ab4d894cf..e82f2a0cb7082ac3aa86afe10c3c525b7774984f 100644
267--- a/tui/commands.go
268+++ b/tui/commands.go
269@@ -2,6 +2,7 @@ package tui
270
271 import (
272 "smoothie/tui/bubbles/commits"
273+ "smoothie/tui/bubbles/repo"
274 "smoothie/tui/bubbles/selection"
275
276 tea "github.com/charmbracelet/bubbletea"
277@@ -57,16 +58,13 @@ func (b *Bubble) loadGitCmd() tea.Msg {
278 }
279
280 func (b *Bubble) getRepoCmd(name string) tea.Cmd {
281- return func() tea.Msg {
282- r, err := b.repoSource.GetRepo(name)
283- if err != nil {
284- return errMsg{err}
285- }
286- b.readmeViewport.Viewport.GotoTop()
287- b.readmeViewport.Viewport.Height = b.height - verticalPadding - viewportHeightConstant
288- b.readmeViewport.Viewport.Width = boxLeftWidth - 2
289- b.readmeViewport.Viewport.SetContent(r.Readme)
290- b.boxes[1] = b.readmeViewport
291- return nil
292+ var tmplConfig *Config
293+ if name == "config" {
294+ tmplConfig = b.config
295 }
296+ h := b.height - verticalPadding - viewportHeightConstant
297+ w := boxRightWidth - 2
298+ rb := repo.NewBubble(b.repoSource, name, w, h, tmplConfig)
299+ b.boxes[1] = rb
300+ return rb.Init()
301 }
302diff --git a/tui/defaults.go b/tui/defaults.go
303index b69c4bb99d1b96835abed8a20c7c017ea6ccf767..4d31c6c5157f4578bee167bfe94802f76493c521 100644
304--- a/tui/defaults.go
305+++ b/tui/defaults.go
306@@ -17,7 +17,8 @@ const defaultConfig = `{
307 "menu": [
308 {
309 "name": "Home",
310- "repo": "config"
311+ "repo": "config",
312+ "note": "Configuration and content repo"
313 }
314 ]
315 }`