Files
aptly/cmd/task_run.go
T
Simon Aquino 72e54aa3d1 Fixed a bug with the context switching
The context switching wasn't really happening. Now the issue is fixed.
2014-08-16 23:32:38 +00:00

152 lines
3.1 KiB
Go

package cmd
import (
"bufio"
"fmt"
"os"
"strings"
"github.com/mattn/go-shellwords"
"github.com/smira/commander"
"github.com/wsxiaoys/terminal/color"
)
func aptlyTaskRun(cmd *commander.Command, args []string) error {
var err error
var cmd_list [][]string
if filename := cmd.Flag.Lookup("filename").Value.Get().(string); filename != "" {
var text string
cmd_args := []string{}
if finfo, err := os.Stat(filename); os.IsNotExist(err) || finfo.IsDir() {
return fmt.Errorf("No such file, %s\n", filename)
}
fmt.Println("Reading file...\n")
file, err := os.Open(filename)
if err != nil {
return err
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
text = strings.TrimSpace(scanner.Text()) + ","
parsed_args, _ := shellwords.Parse(text)
cmd_args = append(cmd_args, parsed_args...)
}
if err = scanner.Err(); err != nil {
return err
}
if len(cmd_args) == 0 {
return fmt.Errorf("The file is empty. Exiting...\n")
}
cmd_list = formatCommands(cmd_args)
} else if len(args) == 0 {
var text string
cmd_args := []string{}
fmt.Println("Please enter one command per line and leave one blank when finished.")
reader := bufio.NewReader(os.Stdin)
for {
fmt.Printf("> ")
text, _ = reader.ReadString('\n')
if text == "\n" {
break
} else {
text = strings.TrimSpace(text) + ","
parsed_args, _ := shellwords.Parse(text)
cmd_args = append(cmd_args, parsed_args...)
}
}
if len(cmd_args) == 0 {
return fmt.Errorf("Nothing entered. Exiting...\n")
}
cmd_list = formatCommands(cmd_args)
} else {
cmd_list = formatCommands(args)
}
switchContext()
for i, command := range cmd_list {
if context == nil || !context.panicked {
color.Printf("@g%d) [Running]: %s@!\n", (i + 1), strings.Join(command, " "))
color.Println("\n@yBegin command output: ----------------------------\n@!")
Run(command, false)
color.Println("\n@yEnd command output: ------------------------------\n@!")
} else {
color.Printf("@r%d) [Skipping]: %s@!\n", (i + 1), strings.Join(command, " "))
}
}
if context.panicked {
err = fmt.Errorf("At least one command has reported an error\n")
}
switchContext()
return err
}
func formatCommands(args []string) [][]string {
var cmd []string
var cmd_array [][]string
for _, s := range args {
if s_trimmed := strings.TrimRight(s, ","); s_trimmed != s {
cmd = append(cmd, s_trimmed)
cmd_array = append(cmd_array, cmd)
cmd = []string{}
} else {
cmd = append(cmd, s)
}
}
if len(cmd) > 0 {
cmd_array = append(cmd_array, cmd)
}
return cmd_array
}
func makeCmdTaskRun() *commander.Command {
cmd := &commander.Command{
Run: aptlyTaskRun,
UsageLine: "run -filename=<filename> | <command1>, <command2>, ...",
Short: "run aptly tasks",
Long: `
Command helps origanise multiple aptly commands in one single aptly task, running as single thread.
Example:
$ aptly task run
> repo create local
> repo add local pkg1
> publish repo local
> serve
>
`,
}
cmd.Flag.String("filename", "", "specifies the filename that contains the commands to run")
return cmd
}