mirror of https://github.com/gogits/gogs.git
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...)) |
|
}
|
|
|