|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
"os/exec"
|
|
|
|
|
|
|
|
"github.com/alecthomas/kong"
|
|
|
|
"github.com/mickael-menu/zk/cmd"
|
|
|
|
executil "github.com/mickael-menu/zk/util/exec"
|
|
|
|
)
|
|
|
|
|
|
|
|
var Version = "dev"
|
|
|
|
var Build = "dev"
|
|
|
|
|
|
|
|
var cli struct {
|
|
|
|
Index cmd.Index `cmd help:"Index the notes in the given directory to be searchable"`
|
|
|
|
Init cmd.Init `cmd help:"Create a slip box in the given directory"`
|
|
|
|
List cmd.List `cmd help:"List notes matching given criteria"`
|
|
|
|
Edit cmd.Edit `cmd help:"Edit notes matching given criteria"`
|
|
|
|
New cmd.New `cmd help:"Create a new note in the given slip box directory"`
|
|
|
|
NoInput NoInput `help:"Never prompt or ask for confirmation"`
|
|
|
|
Version kong.VersionFlag `help:"Print zk version"`
|
|
|
|
}
|
|
|
|
|
|
|
|
// NoInput is a flag preventing any user prompt when enabled.
|
|
|
|
type NoInput bool
|
|
|
|
|
|
|
|
func (f NoInput) BeforeApply(container *cmd.Container) error {
|
|
|
|
container.Terminal.NoInput = true
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
// Create the dependency graph.
|
|
|
|
container := cmd.NewContainer()
|
|
|
|
|
|
|
|
indexZk(container)
|
|
|
|
|
|
|
|
if isAlias, err := runAlias(container, os.Args[1:]); isAlias {
|
|
|
|
fatalIfError(err)
|
|
|
|
|
|
|
|
} else {
|
|
|
|
ctx := kong.Parse(&cli,
|
|
|
|
kong.Bind(container),
|
|
|
|
kong.Name("zk"),
|
|
|
|
kong.Vars{
|
|
|
|
"version": Version,
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
err := ctx.Run(container)
|
|
|
|
ctx.FatalIfErrorf(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func fatalIfError(err error) {
|
|
|
|
if err != nil {
|
|
|
|
fmt.Fprintf(os.Stderr, "zk: error: %v\n", err)
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// indexZk will index any slip box in the working directory.
|
|
|
|
func indexZk(container *cmd.Container) {
|
|
|
|
if len(os.Args) > 1 && os.Args[1] != "index" {
|
|
|
|
(&cmd.Index{Quiet: true}).Run(container)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// runAlias will execute a user alias if the command is one of them.
|
|
|
|
func runAlias(container *cmd.Container, args []string) (bool, error) {
|
|
|
|
if zk, err := container.OpenZk(); err == nil && len(args) >= 1 {
|
|
|
|
for alias, cmdStr := range zk.Config.Aliases {
|
|
|
|
if alias != args[0] {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
cmd := executil.CommandFromString(cmdStr, args...)
|
|
|
|
cmd.Stdin = os.Stdin
|
|
|
|
cmd.Stdout = os.Stdout
|
|
|
|
cmd.Stderr = os.Stderr
|
|
|
|
err := cmd.Run()
|
|
|
|
if err != nil {
|
|
|
|
if err, ok := err.(*exec.ExitError); ok {
|
|
|
|
os.Exit(err.ExitCode())
|
|
|
|
return true, nil
|
|
|
|
} else {
|
|
|
|
return true, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false, nil
|
|
|
|
}
|