bcbb569536597d35e24007acf2fd5e945c65611d

Author
Toby Padilla <toby@charm.sh>
Committer
Toby Padilla <toby@charm.sh>
Date

Message

Allow for README templates

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 }`