You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
zk/internal/cli/cmd/index.go

72 lines
1.6 KiB
Go

package cmd
import (
"fmt"
"os"
"time"
"github.com/mickael-menu/zk/internal/cli"
"github.com/mickael-menu/zk/internal/core"
"github.com/mickael-menu/zk/internal/util/paths"
"github.com/schollz/progressbar/v3"
)
// Index indexes the content of all the notes in the notebook.
type Index struct {
Force bool `short:"f" help:"Force indexing all the notes."`
Verbose bool `short:"v" xor:"print" help:"Print detailed information about the indexing process."`
Quiet bool `short:"q" xor:"print" help:"Do not print statistics nor progress."`
}
func (cmd *Index) Help() string {
return "You usually do not need to run `zk index` manually, as notes are indexed automatically when needed."
}
func (cmd *Index) Run(container *cli.Container) error {
notebook, err := container.CurrentNotebook()
if err != nil {
return err
}
return cmd.RunWithNotebook(container, notebook)
}
func (cmd *Index) RunWithNotebook(container *cli.Container, notebook *core.Notebook) error {
showProgress := container.Terminal.IsInteractive()
var bar *progressbar.ProgressBar
if showProgress {
bar = progressbar.NewOptions(-1,
progressbar.OptionSetWriter(os.Stderr),
progressbar.OptionThrottle(100*time.Millisecond),
progressbar.OptionSpinnerType(14),
)
}
opts := core.NoteIndexOpts{
Force: cmd.Force,
Verbose: cmd.Verbose,
}
stats, err := notebook.IndexWithCallback(opts, func(change paths.DiffChange) {
if showProgress {
bar.Add(1)
bar.Describe(change.String())
}
})
if showProgress {
bar.Clear()
}
if err != nil {
return err
}
if !cmd.Quiet {
fmt.Println(stats)
}
return nil
}