You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.0 KiB
Go
58 lines
1.0 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"os/exec"
|
|
"strings"
|
|
)
|
|
|
|
type ShellError struct {
|
|
Command string
|
|
Err error
|
|
}
|
|
|
|
func (e *ShellError) Error() string {
|
|
return fmt.Sprintf("Cannot run %q. Error %v", e.Command, e.Err)
|
|
}
|
|
|
|
type Commander interface {
|
|
Exec(cmd *exec.Cmd) (string, error)
|
|
ExecSilently(cmd *exec.Cmd) error
|
|
}
|
|
|
|
type DefaultCommander struct {
|
|
logger *log.Logger
|
|
}
|
|
|
|
func (c DefaultCommander) Exec(cmd *exec.Cmd) (string, error) {
|
|
if c.logger != nil {
|
|
c.logger.Println(strings.Join(cmd.Args, " "))
|
|
}
|
|
|
|
output, err := cmd.CombinedOutput()
|
|
if err != nil {
|
|
if c.logger != nil {
|
|
c.logger.Println(err)
|
|
}
|
|
return "", &ShellError{strings.Join(cmd.Args, " "), err}
|
|
}
|
|
|
|
return strings.TrimSuffix(string(output), "\n"), nil
|
|
}
|
|
|
|
func (c DefaultCommander) ExecSilently(cmd *exec.Cmd) error {
|
|
if c.logger != nil {
|
|
c.logger.Println(strings.Join(cmd.Args, " "))
|
|
}
|
|
|
|
err := cmd.Run()
|
|
if err != nil {
|
|
if c.logger != nil {
|
|
c.logger.Println(err)
|
|
}
|
|
return &ShellError{strings.Join(cmd.Args, " "), err}
|
|
}
|
|
return nil
|
|
}
|