commands.go

  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}