// +build go1.2 // Copyright 2013 com authors // // Licensed under the Apache License, Version 2.0 (the "License"): you may // not use this file except in compliance with the License. You may obtain // a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations // under the License. // Package com is an open source project for commonly used functions for the Go programming language. package com import ( "bytes" "fmt" "os/exec" "runtime" "strings" ) // ExecCmdDirBytes executes system command in given directory // and return stdout, stderr in bytes type, along with possible error. func ExecCmdDirBytes(dir, cmdName string, args ...string) ([]byte, []byte, error) { bufOut := new(bytes.Buffer) bufErr := new(bytes.Buffer) cmd := exec.Command(cmdName, args...) cmd.Dir = dir cmd.Stdout = bufOut cmd.Stderr = bufErr err := cmd.Run() return bufOut.Bytes(), bufErr.Bytes(), err } // ExecCmdBytes executes system command // and return stdout, stderr in bytes type, along with possible error. func ExecCmdBytes(cmdName string, args ...string) ([]byte, []byte, error) { return ExecCmdDirBytes("", cmdName, args...) } // ExecCmdDir executes system command in given directory // and return stdout, stderr in string type, along with possible error. func ExecCmdDir(dir, cmdName string, args ...string) (string, string, error) { bufOut, bufErr, err := ExecCmdDirBytes(dir, cmdName, args...) return string(bufOut), string(bufErr), err } // ExecCmd executes system command // and return stdout, stderr in string type, along with possible error. func ExecCmd(cmdName string, args ...string) (string, string, error) { return ExecCmdDir("", cmdName, args...) } // _________ .__ .____ // \_ ___ \ ____ | | ___________ | | ____ ____ // / \ \/ / _ \| | / _ \_ __ \ | | / _ \ / ___\ // \ \___( <_> ) |_( <_> ) | \/ | |__( <_> ) /_/ > // \______ /\____/|____/\____/|__| |_______ \____/\___ / // \/ \/ /_____/ // Color number constants. const ( Gray = uint8(iota + 90) Red Green Yellow Blue Magenta //NRed = uint8(31) // Normal EndColor = "\033[0m" ) // getColorLevel returns colored level string by given level. func getColorLevel(level string) string { level = strings.ToUpper(level) switch level { case "TRAC": return fmt.Sprintf("\033[%dm%s\033[0m", Blue, level) case "ERRO": return fmt.Sprintf("\033[%dm%s\033[0m", Red, level) case "WARN": return fmt.Sprintf("\033[%dm%s\033[0m", Magenta, level) case "SUCC": return fmt.Sprintf("\033[%dm%s\033[0m", Green, level) default: return level } } // ColorLogS colors log and return colored content. // Log format: <level> <content [highlight][path]> [ error ]. // Level: TRAC -> blue; ERRO -> red; WARN -> Magenta; SUCC -> green; others -> default. // Content: default; path: yellow; error -> red. // Level has to be surrounded by "[" and "]". // Highlights have to be surrounded by "# " and " #"(space), "#" will be deleted. // Paths have to be surrounded by "( " and " )"(space). // Errors have to be surrounded by "[ " and " ]"(space). // Note: it hasn't support windows yet, contribute is welcome. func ColorLogS(format string, a ...interface{}) string { log := fmt.Sprintf(format, a...) var clog string if runtime.GOOS != "windows" { // Level. i := strings.Index(log, "]") if log[0] == '[' && i > -1 { clog += "[" + getColorLevel(log[1:i]) + "]" } log = log[i+1:] // Error. log = strings.Replace(log, "[ ", fmt.Sprintf("[\033[%dm", Red), -1) log = strings.Replace(log, " ]", EndColor+"]", -1) // Path. log = strings.Replace(log, "( ", fmt.Sprintf("(\033[%dm", Yellow), -1) log = strings.Replace(log, " )", EndColor+")", -1) // Highlights. log = strings.Replace(log, "# ", fmt.Sprintf("\033[%dm", Gray), -1) log = strings.Replace(log, " #", EndColor, -1) } else { // Level. i := strings.Index(log, "]") if log[0] == '[' && i > -1 { clog += "[" + log[1:i] + "]" } log = log[i+1:] // Error. log = strings.Replace(log, "[ ", "[", -1) log = strings.Replace(log, " ]", "]", -1) // Path. log = strings.Replace(log, "( ", "(", -1) log = strings.Replace(log, " )", ")", -1) // Highlights. log = strings.Replace(log, "# ", "", -1) log = strings.Replace(log, " #", "", -1) } return clog + log } // ColorLog prints colored log to stdout. // See color rules in function 'ColorLogS'. func ColorLog(format string, a ...interface{}) { fmt.Print(ColorLogS(format, a...)) }