Skip to content

Instantly share code, notes, and snippets.

@mattn
Created March 12, 2015 05:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mattn/c61d414f345be29a9065 to your computer and use it in GitHub Desktop.
Save mattn/c61d414f345be29a9065 to your computer and use it in GitHub Desktop.
package main
import (
"errors"
"io"
"os"
"os/exec"
"runtime"
"syscall"
"github.com/mattn/go-isatty"
"golang.org/x/text/encoding/japanese"
"golang.org/x/text/transform"
)
type Writer struct {
w io.Writer
t transform.Transformer
}
func (w *Writer) Write(b []byte) (int, error) {
bb := make([]byte, len(b)*4/2)
n, _, _ := w.t.Transform(bb, b, false)
_, err := w.w.Write(bb[:n])
return len(b), err
}
func run() int {
var args []string
if runtime.GOOS == "windows" {
args = append([]string{"cmd", "/c"}, os.Args[1:]...)
} else {
args = append([]string{"sh", "-c"}, os.Args[1:]...)
}
cmd := exec.Command(args[0], args[1:]...)
if isatty.IsTerminal(os.Stdout.Fd()) {
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Stdin = os.Stdin
} else {
cmd.Stdout = &Writer{os.Stdout, japanese.ShiftJIS.NewDecoder()}
cmd.Stderr = &Writer{os.Stderr, japanese.ShiftJIS.NewDecoder()}
cmd.Stdin = os.Stdin
}
if err := cmd.Run(); err != nil {
if err, ok := err.(*exec.ExitError); ok {
if status, ok := err.Sys().(syscall.WaitStatus); ok {
return status.ExitStatus()
} else {
panic(errors.New("Unimplemented for system where exec.ExitError.Sys() is not syscall.WaitStatus."))
}
}
}
return 0
}
func main() {
os.Exit(run())
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment