You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							161 lines
						
					
					
						
							4.8 KiB
						
					
					
				
			
		
		
	
	
							161 lines
						
					
					
						
							4.8 KiB
						
					
					
				| // +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...))
 | |
| }
 | |
| 
 |