162 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			162 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Go
		
	
	
	
// +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...))
 | 
						|
}
 |