| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 | // +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 comimport (	"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...))}
 |