Start looking for local files the moment Glow starts

This commit is contained in:
Christian Rocha 2020-07-15 14:18:46 -04:00 committed by Christian Muehlhaeuser
parent 1200b86729
commit d4f192487c
2 changed files with 83 additions and 85 deletions

View file

@ -18,7 +18,6 @@ import (
"github.com/charmbracelet/charm/ui/common"
"github.com/dustin/go-humanize"
runewidth "github.com/mattn/go-runewidth"
"github.com/muesli/gitcha"
te "github.com/muesli/termenv"
)
@ -36,12 +35,6 @@ type gotStashMsg []*charm.Markdown
type gotNewsMsg []*charm.Markdown
type fetchedMarkdownMsg *markdown
type deletedStashedItemMsg int
type initLocalFileSearchMsg struct {
cwd string
ch chan string
}
type foundLocalFileMsg string
type localFileSearchFinished struct{}
// MODEL
@ -117,7 +110,6 @@ type stashModel struct {
loaded stashLoadedState // what's loaded? we find out with bitmasking
loading bool // are we currently loading something?
fullyLoaded bool // Have we loaded everything from the server?
cwd string // working directory where glow is running
hasStash bool // do we have stashed files to show?
hasLocalFiles bool // do we have local files to show?
hasNews bool // do we have news to show?
@ -136,10 +128,6 @@ type stashModel struct {
// than we can display at a time so we can paginate locally without having
// to fetch every time.
page int
// github.com/muesli/gitcha channel that receives paths to local markdown
// files.
localFileFinder chan string
}
func (m *stashModel) setSize(width, height int) {
@ -181,7 +169,7 @@ func (m *stashModel) addMarkdowns(mds ...*markdown) {
// INIT
func stashInit(cc *charm.Client) (stashModel, tea.Cmd) {
func newStashModel() stashModel {
s := spinner.NewModel()
s.Frames = spinner.Dot
s.ForegroundColor = common.SpinnerColor
@ -197,19 +185,13 @@ func stashInit(cc *charm.Client) (stashModel, tea.Cmd) {
ni.Focus()
m := stashModel{
cc: cc,
spinner: s,
noteInput: ni,
page: 1,
paginator: p,
}
return m, tea.Batch(
loadLocalFiles,
loadStash(m),
loadNews(m),
spinner.Tick(s),
)
return m
}
// UPDATE
@ -222,21 +204,6 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) {
switch msg := msg.(type) {
// We've started looking for local files
case initLocalFileSearchMsg:
m.localFileFinder = msg.ch
m.cwd = msg.cwd
cmds = append(cmds, findNextLocalFile(m))
// We found a local file
case foundLocalFileMsg:
pathStr, err := localFileToMarkdown(m.cwd, string(msg))
if err == nil {
m.hasLocalFiles = true
m.addMarkdowns(pathStr)
}
cmds = append(cmds, findNextLocalFile(m))
// We're finished searching for local files
case localFileSearchFinished:
m.loaded |= loadedLocalFiles
@ -588,51 +555,6 @@ func stashHelpView(m stashModel) string {
// CMD
func loadLocalFiles() tea.Msg {
cwd, err := os.Getwd()
if err != nil {
return errMsg(err)
}
ch := gitcha.FindFileFromList(cwd, []string{"*.md"})
return initLocalFileSearchMsg{
ch: ch,
cwd: cwd,
}
}
func findNextLocalFile(m stashModel) tea.Cmd {
return func() tea.Msg {
pathStr, ok := <-m.localFileFinder
if ok {
// Okay now find the next one
return foundLocalFileMsg(pathStr)
}
// We're done
return localFileSearchFinished{}
}
}
func loadStash(m stashModel) tea.Cmd {
return func() tea.Msg {
stash, err := m.cc.GetStash(m.page)
if err != nil {
return errMsg(err)
}
return gotStashMsg(stash)
}
}
func loadNews(m stashModel) tea.Cmd {
return func() tea.Msg {
news, err := m.cc.GetNews(1) // just fetch the first page
if err != nil {
return errMsg(err)
}
return gotNewsMsg(news)
}
}
func loadRemoteMarkdown(cc *charm.Client, id int, t markdownType) tea.Cmd {
return func() tea.Msg {
var (

View file

@ -4,6 +4,7 @@ import (
"errors"
"fmt"
"log"
"os"
"strings"
"github.com/charmbracelet/bubbles/spinner"
@ -11,6 +12,7 @@ import (
"github.com/charmbracelet/charm"
"github.com/charmbracelet/charm/ui/common"
"github.com/charmbracelet/charm/ui/keygen"
"github.com/muesli/gitcha"
te "github.com/muesli/termenv"
)
@ -47,6 +49,12 @@ func NewProgram(style string, cfg UIConfig) *tea.Program {
type errMsg error
type newCharmClientMsg *charm.Client
type sshAuthErrMsg struct{}
type initLocalFileSearchMsg struct {
cwd string
ch chan string
}
type foundLocalFileMsg string
type localFileSearchFinished struct{}
// MODEL
@ -83,6 +91,11 @@ type model struct {
pager pagerModel
terminalWidth int
terminalHeight int
cwd string // directory from which we're running Glow
// Channel that receives paths to local markdown files
// (via the github.com/muesli/gitcha package)
localFileFinder chan string
}
func (m *model) unloadDocument() {
@ -111,9 +124,11 @@ func initialize(style string) func() (tea.Model, tea.Cmd) {
return model{
spinner: s,
stash: newStashModel(),
pager: newPagerModel(style),
state: stateInitCharmClient,
}, tea.Batch(
findLocalFiles,
newCharmClient,
spinner.Tick(s),
)
@ -194,6 +209,7 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) {
m.err = msg
return m, nil
// Window size is received when starting up and on every resize
case tea.WindowSizeMsg:
m.terminalWidth = msg.Width
m.terminalHeight = msg.Height
@ -203,6 +219,21 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) {
// TODO: load more stash pages if we've resized, are on the last page,
// and haven't loaded more pages yet.
// We've started looking for local files
case initLocalFileSearchMsg:
m.localFileFinder = msg.ch
m.cwd = msg.cwd
cmds = append(cmds, findNextLocalFile(m))
// We found a local file
case foundLocalFileMsg:
pathStr, err := localFileToMarkdown(m.cwd, string(msg))
if err == nil {
m.stash.hasLocalFiles = true
m.stash.addMarkdowns(pathStr)
}
cmds = append(cmds, findNextLocalFile(m))
case sshAuthErrMsg:
// If we haven't run the keygen yet, do that
if m.state != stateKeygenFinished {
@ -223,6 +254,7 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) {
cmds = append(cmds, cmd)
case keygen.DoneMsg:
// The keygen's done, so let's try initializing the charm client again
m.state = stateKeygenFinished
cmds = append(cmds, newCharmClient)
@ -236,10 +268,9 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) {
case newCharmClientMsg:
m.cc = msg
m.state = stateShowStash
m.stash, cmd = stashInit(msg)
m.stash.setSize(m.terminalWidth, m.terminalHeight)
m.stash.cc = msg
m.pager.cc = msg
cmds = append(cmds, cmd)
cmds = append(cmds, loadStash(m.stash), loadNews(m.stash))
case fetchedMarkdownMsg:
m.pager.currentDocument = msg
@ -321,6 +352,31 @@ func errorView(err error) string {
// COMMANDS
func findLocalFiles() tea.Msg {
cwd, err := os.Getwd()
if err != nil {
return errMsg(err)
}
ch := gitcha.FindFileFromList(cwd, []string{"*.md"})
return initLocalFileSearchMsg{
ch: ch,
cwd: cwd,
}
}
func findNextLocalFile(m model) tea.Cmd {
return func() tea.Msg {
pathStr, ok := <-m.localFileFinder
if ok {
// Okay now find the next one
return foundLocalFileMsg(pathStr)
}
// We're done
return localFileSearchFinished{}
}
}
func newCharmClient() tea.Msg {
cfg, err := charm.ConfigFromEnv()
if err != nil {
@ -337,6 +393,28 @@ func newCharmClient() tea.Msg {
return newCharmClientMsg(cc)
}
func loadStash(m stashModel) tea.Cmd {
return func() tea.Msg {
stash, err := m.cc.GetStash(m.page)
if err != nil {
return errMsg(err)
}
return gotStashMsg(stash)
}
}
func loadNews(m stashModel) tea.Cmd {
return func() tea.Msg {
news, err := m.cc.GetNews(1) // just fetch the first page
if err != nil {
return errMsg(err)
}
return gotNewsMsg(news)
}
}
// ETC
func indent(s string, n int) string {
if n <= 0 || s == "" {
return s
@ -350,8 +428,6 @@ func indent(s string, n int) string {
return b.String()
}
// ETC
func min(a, b int) int {
if a < b {
return a