in ops.go [207:330]
func Ops(base string, args []string) error {
trace("Ops run in", base, "with", args)
// go down using args as subcommands
err := os.Chdir(base)
debug("Ops chdir", base)
if err != nil {
return err
}
rest := args
isSubCmd := false
err = ensurePrereq(base)
debug("Ops ensurePrereq", err)
if err != nil {
fmt.Println("ERROR: cannot ensure prerequisites: " + err.Error())
os.Exit(1)
}
for _, task := range args {
trace("task name", task)
// skip flags
if strings.HasPrefix(task, "-") {
continue
}
// try to correct name if it's not a flag
pwd, _ := os.Getwd()
taskName, err := validateTaskName(pwd, task)
if err != nil {
return err
}
// if valid, check if it's a folder and move to it
if isDir(taskName) && exists(taskName, OPSFILE) {
if err := os.Chdir(taskName); err != nil {
return err
}
err = ensurePrereq(joinpath(pwd, taskName))
if err != nil {
fmt.Println("ERROR: cannot ensure prerequisites" + err.Error())
os.Exit(1)
}
//remove it from the args
rest = rest[1:]
isSubCmd = true
} else {
// stop when non folder reached
//substitute it with the validated task name
if len(rest) > 0 {
rest[0] = taskName
}
break
}
}
// read docopts and help text
opts, helpMessage := readDocOpts()
// print help
if len(rest) == 0 || rest[0] == "help" {
err := help(helpMessage)
if !isSubCmd {
fmt.Println()
return printPluginsHelp()
}
return err
}
// load saved args
savedArgs := loadSavedArgs()
// parse options if an opts file is available
trace("DOCOPTS:", opts)
if opts != "" {
debug("PREPARSE:", rest)
// parse args
parsedArgs := parseArgs(opts, rest)
trace("DOCOPTS: parsedargs=", parsedArgs)
// append -t optfile.yml to the Task cli
prefix := []string{"-t", OPSFILE}
if len(rest) > 0 && rest[0][0] != '-' {
prefix = append(prefix, rest[0])
}
// parse args
parsedArgs = append(savedArgs, parsedArgs...)
parsedArgs = append(prefix, parsedArgs...)
extra := os.Getenv("EXTRA")
if extra != "" {
trace("EXTRA:", extra)
parsedArgs = append(parsedArgs, strings.Split(extra, " ")...)
}
trace("POSTPARSE:", parsedArgs)
_, err := Task(parsedArgs...)
return err
}
mainTask := rest[0]
// unparsed args - separate variable assignments from extra args
pre := []string{"-t", OPSFILE, mainTask}
pre = append(pre, savedArgs...)
post := []string{"--"}
args1 := rest[1:]
extra := os.Getenv("EXTRA")
if extra != "" {
trace("EXTRA:", extra)
args1 = append(args1, strings.Split(extra, " ")...)
}
for _, s := range args1 {
if strings.Contains(s, "=") {
pre = append(pre, s)
} else {
post = append(post, s)
}
}
taskArgs := append(pre, post...)
debug("task args: ", taskArgs)
_, err = Task(taskArgs...)
return err
}