func Ops()

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
}