Skip to content

Commit

Permalink
feat: added init command, make command posible to write over stdin, m…
Browse files Browse the repository at this point in the history
…ake variable values as any useable
  • Loading branch information
Fabian Simon committed Jan 4, 2023
1 parent 988d6b0 commit f5f02ed
Show file tree
Hide file tree
Showing 5 changed files with 76 additions and 16 deletions.
5 changes: 3 additions & 2 deletions Readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,13 @@ USAGE:
COMMANDS:
autocomplete Set Autocomplete helper stuff to current shell session
init Crate a starter gomake.yml to current dir
ls List all commands described at gomake yaml file
run Run commands from gomake yml file
run Run commands from gomake.yml file
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--makefile value, -f value gomake file to use (default: "./gomake.yml") [$GOMAKE_MAKEFILE]
--makefile value, -f value gomake file to use (default: "gomake.yml") [$GOMAKE_MAKEFILE]
--executer value, --sh value Shell to execute gomakefile config (default: "/bin/sh") [$GOMAKE_EXECUTER]
--help, -h show help (default: false)
```
Expand Down
10 changes: 7 additions & 3 deletions command/commands.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,16 @@ func (c *CommandHandler) registerStandardHandler() {
})
}

func (c *CommandHandler) ExecuteVariablesCommands(variabels map[string]string) (map[string]string, error) {
func (c *CommandHandler) ExecuteVariablesCommands(variabels map[string]any) (map[string]any, error) {
res := variabels
for k, v := range variabels {
prefix := fmt.Sprintf("__%s_", c.appName)
if strings.HasPrefix(v, prefix) {
command := strings.SplitN(strings.TrimLeft(v, prefix), "=", 2)
vstr, ok := v.(string)
if !ok {
continue
}
if strings.HasPrefix(vstr, prefix) {
command := strings.SplitN(strings.TrimLeft(vstr, prefix), "=", 2)
if len(command) > 2 {
log.Println("Problem wtf")
}
Expand Down
22 changes: 22 additions & 0 deletions gomake_ini.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
variables:
a: b
b: c
---

echoA:
script:
- echo {{.Var.a}}

echoB:
script:
- echo {{.Var.b}}
- exit 1
on_failure:
- echo "Something exit with not 0"

run:
script:
{{include "echoA"}}
{{include "echoB"}}
on_failure:
{{include "echoB"}}
15 changes: 8 additions & 7 deletions interpreter/interpreter.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import (
)

type TemplateData struct {
Var map[string]string
Var map[string]any
Env map[string]string
}

Expand Down Expand Up @@ -47,7 +47,7 @@ func NewInterpreter(appName, executeCommand, executer string, dryRun bool, cmdHa
}

func (r *Interpreter) GetMakeScripts() (command.MakeStruct, error) {
explizitMakeFile, _, err := r.GetExecuteTemplate(string(r.commandFile), make(map[string]string))
explizitMakeFile, _, err := r.GetExecuteTemplate(string(r.commandFile), make(map[string]any))
if err != nil {
return nil, err
}
Expand All @@ -59,7 +59,7 @@ func (r *Interpreter) getMakeScripts(yamlFileData []byte) (command.MakeStruct, e
return c1, err
}

func (r *Interpreter) GetExecuteTemplate(file string, extraVariables map[string]string) ([]byte, map[string]map[string]string, error) {
func (r *Interpreter) GetExecuteTemplate(file string, extraVariables map[string]any) ([]byte, map[string]map[string]any, error) {
varCommandArr := strings.Split(file, "---")
if len(varCommandArr) == 1 {
varCommandArr = strings.Split("variables:\n---\n"+file, "---")
Expand All @@ -73,7 +73,7 @@ func (r *Interpreter) GetExecuteTemplate(file string, extraVariables map[string]
pair := strings.Split(e, "=")
env[pair[0]] = pair[1]
}
tempVar := make(map[string]string)
tempVar := make(map[string]any)
for k, v := range r.ExtraVariables {
tempVar[k] = v
}
Expand All @@ -89,7 +89,7 @@ func (r *Interpreter) GetExecuteTemplate(file string, extraVariables map[string]
if err != nil {
return nil, nil, err
}
var variables map[string]map[string]string
var variables map[string]map[string]any
err = yaml.Unmarshal(varStr, &variables)
if err != nil {
return []byte{}, nil, err
Expand All @@ -114,12 +114,12 @@ func (r *Interpreter) GetExecuteTemplate(file string, extraVariables map[string]
}

type DryRunOutput struct {
Variables map[string]string
Variables map[string]any
ExecutedCommand command.Operation
}

func (r *Interpreter) Run() error {
explizitMakeFile, variables, err := r.GetExecuteTemplate(string(r.commandFile), make(map[string]string))
explizitMakeFile, variables, err := r.GetExecuteTemplate(string(r.commandFile), make(map[string]any))
if err != nil {
return err
}
Expand Down Expand Up @@ -162,6 +162,7 @@ func (r *Interpreter) Run() error {

func (r *Interpreter) execCmd(command string) error {
cmd := exec.Command(r.executer, "-c", command)
cmd.Stdin = os.Stdin
cmd.Stdout = log.Writer()
cmd.Stderr = log.Writer()
return cmd.Run()
Expand Down
40 changes: 36 additions & 4 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ const (
PersistAutocompleteCli = "persist"
)

const (
GomakeDefaultFile = "gomake.yml"
)

func getFlagEnvByFlagName(flagName string) string {
return fmt.Sprintf("%s_%s", App, strings.ToUpper(flagName))
}
Expand All @@ -38,6 +42,9 @@ func init() {
//go:embed autocomplete/*
var autocompleteFiles embed.FS

//go:embed gomake_ini.yml
var gomakeIni []byte

func main() {
runner := Runner{
cmdHandler: command.NewCommandHandler(App),
Expand All @@ -52,7 +59,7 @@ func main() {
Name: MakeFileCli,
Aliases: []string{"f"},
EnvVars: []string{getFlagEnvByFlagName(MakeFileCli)},
Value: "gomake.yml",
Value: GomakeDefaultFile,
Usage: "gomake file to use",
},
&cli.StringFlag{
Expand All @@ -63,7 +70,6 @@ func main() {
Usage: "Shell to execute gomakefile config",
},
},
Before: runner.Before,
Commands: []*cli.Command{
{
Name: "autocomplete",
Expand All @@ -83,22 +89,28 @@ func main() {
},
},
},
{
Name: "init",
Usage: fmt.Sprintf("Crate a starter %s to current dir", GomakeDefaultFile),
Action: runner.Init,
},
{
Name: "ls",
Usage: "List all commands described at gomake yaml file",
Action: runner.List,
Before: runner.Before,
},
{
ArgsUsage: "{executed command name}",
Name: "run",
Usage: "Run commands from gomake yml file",
Usage: fmt.Sprintf("Run commands from %s file", GomakeDefaultFile),
BashComplete: runner.RunBashComplete,
Flags: []cli.Flag{
&cli.BoolFlag{
Name: DryRunCli,
EnvVars: []string{getFlagEnvByFlagName(DryRunCli)},
Value: false,
Usage: "Only show template paresed gomake.yml but not execute it",
Usage: fmt.Sprintf("Only show template paresed %s but not execute it", GomakeDefaultFile),
},
&cli.StringSliceFlag{
Name: VarsCli,
Expand Down Expand Up @@ -135,6 +147,7 @@ func (r *Runner) ExtraVariables(ctx *cli.Context, s []string) error {
}

func (r *Runner) RunBefore(c *cli.Context) error {
r.Before(c)
neededCommand := c.Args().Get(0)
dryRun := c.Bool(DryRunCli)
if neededCommand == "" {
Expand Down Expand Up @@ -265,6 +278,25 @@ func (r *Runner) Run(c *cli.Context) error {
return r.interpreter.Run()
}

func (r *Runner) Init(c *cli.Context) error {
_, err := os.Stat(GomakeDefaultFile)
if err != nil {
f, err := os.Create(GomakeDefaultFile)
defer f.Close()
if err != nil {
return err
}
_, err = f.Write(gomakeIni)
if err != nil {
return err
}
fmt.Printf("%s was created\nyou can execute with \ngomake run run", GomakeDefaultFile)
return nil
}
return fmt.Errorf("%s already exist", GomakeDefaultFile)

}

func (r *Runner) List(c *cli.Context) error {
list, err := r.interpreter.GetMakeScripts()
if err != nil {
Expand Down

0 comments on commit f5f02ed

Please sign in to comment.