1package tui
2
3import (
4 "os"
5 "path/filepath"
6 "smoothie/git"
7 "smoothie/tui/bubbles/commits"
8 "smoothie/tui/bubbles/selection"
9
10 tea "github.com/charmbracelet/bubbletea"
11 gg "github.com/go-git/go-git/v5"
12 "github.com/go-git/go-git/v5/plumbing/object"
13)
14
15type windowMsg struct{}
16type errMsg struct{ err error }
17
18func (e errMsg) Error() string {
19 return e.err.Error()
20}
21
22func (b *Bubble) windowChangesCmd() tea.Msg {
23 w := <-b.windowChanges
24 b.width = w.Width
25 b.height = w.Height
26 return windowMsg{}
27}
28
29func (b *Bubble) loadGitCmd() tea.Msg {
30 cn := "config"
31 err := b.repoSource.LoadRepos()
32 cr, err := b.repoSource.GetRepo(cn)
33 if err == git.ErrMissingRepo {
34 cr, err = b.repoSource.InitRepo(cn, false)
35 if err != nil {
36 return errMsg{err}
37 }
38
39 // Add default README and config
40 rp := filepath.Join(b.repoSource.Path, cn, "README.md")
41 rf, err := os.Create(rp)
42 if err != nil {
43 return errMsg{err}
44 }
45 defer rf.Close()
46 _, err = rf.WriteString(defaultReadme)
47 if err != nil {
48 return errMsg{err}
49 }
50 err = rf.Sync()
51 if err != nil {
52 return errMsg{err}
53 }
54 cp := filepath.Join(b.repoSource.Path, cn, "config.json")
55 cf, err := os.Create(cp)
56 if err != nil {
57 return errMsg{err}
58 }
59 defer cf.Close()
60 _, err = cf.WriteString(defaultConfig)
61 if err != nil {
62 return errMsg{err}
63 }
64 err = cf.Sync()
65 if err != nil {
66 return errMsg{err}
67 }
68 wt, err := cr.Repository.Worktree()
69 if err != nil {
70 return errMsg{err}
71 }
72 _, err = wt.Add("README.md")
73 if err != nil {
74 return errMsg{err}
75 }
76 _, err = wt.Add("config.json")
77 if err != nil {
78 return errMsg{err}
79 }
80 _, err = wt.Commit("Default init", &gg.CommitOptions{
81 All: true,
82 Author: &object.Signature{
83 Name: "Smoothie Server",
84 Email: "vt100@charm.sh",
85 },
86 })
87 if err != nil {
88 return errMsg{err}
89 }
90 err = b.repoSource.LoadRepos()
91 if err != nil {
92 return errMsg{err}
93 }
94 } else if err != nil {
95 return errMsg{err}
96 }
97 b.repos = b.repoSource.AllRepos()
98
99 rs := make([]string, 0)
100 for _, r := range b.repos {
101 rs = append(rs, r.Name)
102 }
103 b.repoSelect = selection.NewBubble(rs)
104 b.boxes[0] = b.repoSelect
105 b.commitsLog = commits.NewBubble(
106 b.height-verticalPadding-2,
107 boxRightWidth-horizontalPadding-2,
108 b.repoSource.GetCommits(200),
109 )
110 b.boxes[1] = b.commitsLog
111 b.activeBox = 0
112 b.state = loadedState
113 return nil
114}
115
116func (b *Bubble) getRepoCmd(name string) tea.Cmd {
117 return func() tea.Msg {
118 r, err := b.repoSource.GetRepo(name)
119 if err != nil {
120 return errMsg{err}
121 }
122 b.readmeViewport.Viewport.GotoTop()
123 b.readmeViewport.Viewport.Height = b.height - verticalPadding - viewportHeightConstant
124 b.readmeViewport.Viewport.Width = boxLeftWidth - 2
125 b.readmeViewport.Viewport.SetContent(r.Readme)
126 b.boxes[1] = b.readmeViewport
127 b.activeBox = 1
128 return nil
129 }
130}