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 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...))
- }
|