Initial pass for true and false conditionals for tasks

This commit is contained in:
Alex Yatskov 2016-02-13 11:56:01 -08:00
parent 4bda542bd5
commit 29f25892d8
2 changed files with 44 additions and 16 deletions

View File

@ -61,7 +61,7 @@ func findCmdDeps(params []string, conf *config) []string {
return nil
}
func processCmdMacro(macroName string, args []string, conf *config) error {
func processCmdMacro(macroName string, args []string, interact bool, conf *config) error {
m, mn := findCmdMacro(macroName, conf)
if m == nil {
return fmt.Errorf("macro or variant not found: %s", macroName)
@ -75,10 +75,10 @@ func processCmdMacro(macroName string, args []string, conf *config) error {
log.Printf("expanding macro: %s", mn)
}
return processCmd(margs, conf)
return processCmd(margs, interact, conf)
}
func processCmd(params []string, conf *config) error {
func processCmd(params []string, interact bool, conf *config) error {
args := appendExpEnv(nil, params)
if len(args) == 0 {
return fmt.Errorf("invalid command statement")
@ -91,19 +91,28 @@ func processCmd(params []string, conf *config) error {
}
if strings.HasPrefix(cmdName, "@") {
return processCmdMacro(cmdName, cmdArgs, conf)
return processCmdMacro(cmdName, cmdArgs, interact, conf)
}
if conf.flags&flagVerbose != 0 {
log.Printf("executing command: %s %s", cmdName, strings.Join(cmdArgs, " "))
}
return try(func() error {
exec := func() error {
cmd := exec.Command(cmdName, cmdArgs...)
cmd.Dir = conf.dstDir
cmd.Stderr = os.Stderr
cmd.Stdout = os.Stdout
cmd.Stdin = os.Stdin
if interact {
cmd.Stderr = os.Stderr
cmd.Stdout = os.Stdout
cmd.Stdin = os.Stdin
}
return cmd.Run()
})
}
if interact {
return try(exec)
}
return exec()
}

33
task.go
View File

@ -28,10 +28,12 @@ import (
)
type task struct {
Deps []string
Links [][]string
Cmds [][]string
Envs [][]string
Deps []string
Links [][]string
Cmds [][]string
Envs [][]string
IfTrue [][]string
IfFalse [][]string
}
func (t *task) deps(conf *config) []string {
@ -60,10 +62,27 @@ func (t *task) process(conf *config) error {
}
if conf.flags&flagNoCmds == 0 {
for _, currCmd := range t.Cmds {
if err := processCmd(currCmd, conf); err != nil {
return err
CmdLoop:
for {
for _, currCnd := range t.IfTrue {
if err := processCmd(currCnd, false, conf); err != nil {
break CmdLoop
}
}
for _, currCnd := range t.IfFalse {
if err := processCmd(currCnd, false, conf); err == nil {
break CmdLoop
}
}
for _, currCmd := range t.Cmds {
if err := processCmd(currCmd, true, conf); err != nil {
return err
}
}
break
}
}