This commit moves a huge chunk of the code to go. The TODO.md document indicates what is left to be done.
46 lines
1.2 KiB
Go
46 lines
1.2 KiB
Go
// Package execx defines extensions to the "os/exec" package
|
|
package execx
|
|
|
|
import (
|
|
"os/exec"
|
|
|
|
"github.com/tkw1536/goprogram/stream"
|
|
)
|
|
|
|
// ExecCommandError is returned by Exec when a command could not be executed.
|
|
// This typically hints that the executable cannot be found, but may have other causes.
|
|
const ExecCommandError = 127
|
|
|
|
// Exec executes a system command with the specified input/output streams, working directory, and arguments.
|
|
//
|
|
// If the command executes, it's exit code will be returned.
|
|
// If the command can not be executed, returns [ExecCommandError].
|
|
func Exec(io stream.IOStream, workdir string, exe string, argv ...string) int {
|
|
// setup the command
|
|
cmd := exec.Command(exe, argv...)
|
|
cmd.Dir = workdir
|
|
cmd.Stdin = io.Stdin
|
|
cmd.Stdout = io.Stdout
|
|
cmd.Stderr = io.Stderr
|
|
|
|
// run it
|
|
err := cmd.Run()
|
|
|
|
// non-zero exit
|
|
if err, ok := err.(*exec.ExitError); ok {
|
|
return err.ExitCode()
|
|
}
|
|
|
|
// unknown error
|
|
if err != nil {
|
|
return ExecCommandError
|
|
}
|
|
|
|
// everything is fine!
|
|
return 0
|
|
}
|
|
|
|
// MustExec is like Exec, except that it returns true if the command exited successfully, and else false.
|
|
func MustExec(io stream.IOStream, workdir string, exe string, argv ...string) bool {
|
|
return Exec(io, workdir, exe, argv...) == 0
|
|
}
|