mirror of
				https://github.com/k3s-io/kubernetes.git
				synced 2025-11-04 07:49:35 +00:00 
			
		
		
		
	vendor gotest.tools/gotestsum
This commit is contained in:
		
							
								
								
									
										5
									
								
								vendor/github.com/fatih/color/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								vendor/github.com/fatih/color/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
language: go
 | 
			
		||||
go: 
 | 
			
		||||
 - 1.8.x
 | 
			
		||||
 - tip
 | 
			
		||||
 | 
			
		||||
@@ -2,11 +2,17 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library")
 | 
			
		||||
 | 
			
		||||
go_library(
 | 
			
		||||
    name = "go_default_library",
 | 
			
		||||
    srcs = ["formatter.go"],
 | 
			
		||||
    importmap = "k8s.io/kubernetes/vendor/github.com/jstemmer/go-junit-report/formatter",
 | 
			
		||||
    importpath = "github.com/jstemmer/go-junit-report/formatter",
 | 
			
		||||
    srcs = [
 | 
			
		||||
        "color.go",
 | 
			
		||||
        "doc.go",
 | 
			
		||||
    ],
 | 
			
		||||
    importmap = "k8s.io/kubernetes/vendor/github.com/fatih/color",
 | 
			
		||||
    importpath = "github.com/fatih/color",
 | 
			
		||||
    visibility = ["//visibility:public"],
 | 
			
		||||
    deps = ["//vendor/github.com/jstemmer/go-junit-report/parser:go_default_library"],
 | 
			
		||||
    deps = [
 | 
			
		||||
        "//vendor/github.com/mattn/go-colorable:go_default_library",
 | 
			
		||||
        "//vendor/github.com/mattn/go-isatty:go_default_library",
 | 
			
		||||
    ],
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
filegroup(
 | 
			
		||||
							
								
								
									
										27
									
								
								vendor/github.com/fatih/color/Gopkg.lock
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								vendor/github.com/fatih/color/Gopkg.lock
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
			
		||||
# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
[[projects]]
 | 
			
		||||
  name = "github.com/mattn/go-colorable"
 | 
			
		||||
  packages = ["."]
 | 
			
		||||
  revision = "167de6bfdfba052fa6b2d3664c8f5272e23c9072"
 | 
			
		||||
  version = "v0.0.9"
 | 
			
		||||
 | 
			
		||||
[[projects]]
 | 
			
		||||
  name = "github.com/mattn/go-isatty"
 | 
			
		||||
  packages = ["."]
 | 
			
		||||
  revision = "0360b2af4f38e8d38c7fce2a9f4e702702d73a39"
 | 
			
		||||
  version = "v0.0.3"
 | 
			
		||||
 | 
			
		||||
[[projects]]
 | 
			
		||||
  branch = "master"
 | 
			
		||||
  name = "golang.org/x/sys"
 | 
			
		||||
  packages = ["unix"]
 | 
			
		||||
  revision = "37707fdb30a5b38865cfb95e5aab41707daec7fd"
 | 
			
		||||
 | 
			
		||||
[solve-meta]
 | 
			
		||||
  analyzer-name = "dep"
 | 
			
		||||
  analyzer-version = 1
 | 
			
		||||
  inputs-digest = "e8a50671c3cb93ea935bf210b1cd20702876b9d9226129be581ef646d1565cdc"
 | 
			
		||||
  solver-name = "gps-cdcl"
 | 
			
		||||
  solver-version = 1
 | 
			
		||||
							
								
								
									
										30
									
								
								vendor/github.com/fatih/color/Gopkg.toml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								vendor/github.com/fatih/color/Gopkg.toml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
			
		||||
 | 
			
		||||
# Gopkg.toml example
 | 
			
		||||
#
 | 
			
		||||
# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md
 | 
			
		||||
# for detailed Gopkg.toml documentation.
 | 
			
		||||
#
 | 
			
		||||
# required = ["github.com/user/thing/cmd/thing"]
 | 
			
		||||
# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
 | 
			
		||||
#
 | 
			
		||||
# [[constraint]]
 | 
			
		||||
#   name = "github.com/user/project"
 | 
			
		||||
#   version = "1.0.0"
 | 
			
		||||
#
 | 
			
		||||
# [[constraint]]
 | 
			
		||||
#   name = "github.com/user/project2"
 | 
			
		||||
#   branch = "dev"
 | 
			
		||||
#   source = "github.com/myfork/project2"
 | 
			
		||||
#
 | 
			
		||||
# [[override]]
 | 
			
		||||
#  name = "github.com/x/y"
 | 
			
		||||
#  version = "2.4.0"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
[[constraint]]
 | 
			
		||||
  name = "github.com/mattn/go-colorable"
 | 
			
		||||
  version = "0.0.9"
 | 
			
		||||
 | 
			
		||||
[[constraint]]
 | 
			
		||||
  name = "github.com/mattn/go-isatty"
 | 
			
		||||
  version = "0.0.3"
 | 
			
		||||
							
								
								
									
										20
									
								
								vendor/github.com/fatih/color/LICENSE.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								vendor/github.com/fatih/color/LICENSE.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
The MIT License (MIT)
 | 
			
		||||
 | 
			
		||||
Copyright (c) 2013 Fatih Arslan
 | 
			
		||||
 | 
			
		||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
 | 
			
		||||
this software and associated documentation files (the "Software"), to deal in
 | 
			
		||||
the Software without restriction, including without limitation the rights to
 | 
			
		||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 | 
			
		||||
the Software, and to permit persons to whom the Software is furnished to do so,
 | 
			
		||||
subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
The above copyright notice and this permission notice shall be included in all
 | 
			
		||||
copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 | 
			
		||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 | 
			
		||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 | 
			
		||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
			
		||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
							
								
								
									
										179
									
								
								vendor/github.com/fatih/color/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										179
									
								
								vendor/github.com/fatih/color/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,179 @@
 | 
			
		||||
# Color [](https://godoc.org/github.com/fatih/color) [](https://travis-ci.org/fatih/color)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Color lets you use colorized outputs in terms of [ANSI Escape
 | 
			
		||||
Codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors) in Go (Golang). It
 | 
			
		||||
has support for Windows too! The API can be used in several ways, pick one that
 | 
			
		||||
suits you.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## Install
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
go get github.com/fatih/color
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Note that the `vendor` folder is here for stability. Remove the folder if you
 | 
			
		||||
already have the dependencies in your GOPATH.
 | 
			
		||||
 | 
			
		||||
## Examples
 | 
			
		||||
 | 
			
		||||
### Standard colors
 | 
			
		||||
 | 
			
		||||
```go
 | 
			
		||||
// Print with default helper functions
 | 
			
		||||
color.Cyan("Prints text in cyan.")
 | 
			
		||||
 | 
			
		||||
// A newline will be appended automatically
 | 
			
		||||
color.Blue("Prints %s in blue.", "text")
 | 
			
		||||
 | 
			
		||||
// These are using the default foreground colors
 | 
			
		||||
color.Red("We have red")
 | 
			
		||||
color.Magenta("And many others ..")
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Mix and reuse colors
 | 
			
		||||
 | 
			
		||||
```go
 | 
			
		||||
// Create a new color object
 | 
			
		||||
c := color.New(color.FgCyan).Add(color.Underline)
 | 
			
		||||
c.Println("Prints cyan text with an underline.")
 | 
			
		||||
 | 
			
		||||
// Or just add them to New()
 | 
			
		||||
d := color.New(color.FgCyan, color.Bold)
 | 
			
		||||
d.Printf("This prints bold cyan %s\n", "too!.")
 | 
			
		||||
 | 
			
		||||
// Mix up foreground and background colors, create new mixes!
 | 
			
		||||
red := color.New(color.FgRed)
 | 
			
		||||
 | 
			
		||||
boldRed := red.Add(color.Bold)
 | 
			
		||||
boldRed.Println("This will print text in bold red.")
 | 
			
		||||
 | 
			
		||||
whiteBackground := red.Add(color.BgWhite)
 | 
			
		||||
whiteBackground.Println("Red text with white background.")
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Use your own output (io.Writer)
 | 
			
		||||
 | 
			
		||||
```go
 | 
			
		||||
// Use your own io.Writer output
 | 
			
		||||
color.New(color.FgBlue).Fprintln(myWriter, "blue color!")
 | 
			
		||||
 | 
			
		||||
blue := color.New(color.FgBlue)
 | 
			
		||||
blue.Fprint(writer, "This will print text in blue.")
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Custom print functions (PrintFunc)
 | 
			
		||||
 | 
			
		||||
```go
 | 
			
		||||
// Create a custom print function for convenience
 | 
			
		||||
red := color.New(color.FgRed).PrintfFunc()
 | 
			
		||||
red("Warning")
 | 
			
		||||
red("Error: %s", err)
 | 
			
		||||
 | 
			
		||||
// Mix up multiple attributes
 | 
			
		||||
notice := color.New(color.Bold, color.FgGreen).PrintlnFunc()
 | 
			
		||||
notice("Don't forget this...")
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Custom fprint functions (FprintFunc)
 | 
			
		||||
 | 
			
		||||
```go
 | 
			
		||||
blue := color.New(FgBlue).FprintfFunc()
 | 
			
		||||
blue(myWriter, "important notice: %s", stars)
 | 
			
		||||
 | 
			
		||||
// Mix up with multiple attributes
 | 
			
		||||
success := color.New(color.Bold, color.FgGreen).FprintlnFunc()
 | 
			
		||||
success(myWriter, "Don't forget this...")
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Insert into noncolor strings (SprintFunc)
 | 
			
		||||
 | 
			
		||||
```go
 | 
			
		||||
// Create SprintXxx functions to mix strings with other non-colorized strings:
 | 
			
		||||
yellow := color.New(color.FgYellow).SprintFunc()
 | 
			
		||||
red := color.New(color.FgRed).SprintFunc()
 | 
			
		||||
fmt.Printf("This is a %s and this is %s.\n", yellow("warning"), red("error"))
 | 
			
		||||
 | 
			
		||||
info := color.New(color.FgWhite, color.BgGreen).SprintFunc()
 | 
			
		||||
fmt.Printf("This %s rocks!\n", info("package"))
 | 
			
		||||
 | 
			
		||||
// Use helper functions
 | 
			
		||||
fmt.Println("This", color.RedString("warning"), "should be not neglected.")
 | 
			
		||||
fmt.Printf("%v %v\n", color.GreenString("Info:"), "an important message.")
 | 
			
		||||
 | 
			
		||||
// Windows supported too! Just don't forget to change the output to color.Output
 | 
			
		||||
fmt.Fprintf(color.Output, "Windows support: %s", color.GreenString("PASS"))
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Plug into existing code
 | 
			
		||||
 | 
			
		||||
```go
 | 
			
		||||
// Use handy standard colors
 | 
			
		||||
color.Set(color.FgYellow)
 | 
			
		||||
 | 
			
		||||
fmt.Println("Existing text will now be in yellow")
 | 
			
		||||
fmt.Printf("This one %s\n", "too")
 | 
			
		||||
 | 
			
		||||
color.Unset() // Don't forget to unset
 | 
			
		||||
 | 
			
		||||
// You can mix up parameters
 | 
			
		||||
color.Set(color.FgMagenta, color.Bold)
 | 
			
		||||
defer color.Unset() // Use it in your function
 | 
			
		||||
 | 
			
		||||
fmt.Println("All text will now be bold magenta.")
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Disable/Enable color
 | 
			
		||||
 
 | 
			
		||||
There might be a case where you want to explicitly disable/enable color output. the 
 | 
			
		||||
`go-isatty` package will automatically disable color output for non-tty output streams 
 | 
			
		||||
(for example if the output were piped directly to `less`)
 | 
			
		||||
 | 
			
		||||
`Color` has support to disable/enable colors both globally and for single color 
 | 
			
		||||
definitions. For example suppose you have a CLI app and a `--no-color` bool flag. You 
 | 
			
		||||
can easily disable the color output with:
 | 
			
		||||
 | 
			
		||||
```go
 | 
			
		||||
 | 
			
		||||
var flagNoColor = flag.Bool("no-color", false, "Disable color output")
 | 
			
		||||
 | 
			
		||||
if *flagNoColor {
 | 
			
		||||
	color.NoColor = true // disables colorized output
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
It also has support for single color definitions (local). You can
 | 
			
		||||
disable/enable color output on the fly:
 | 
			
		||||
 | 
			
		||||
```go
 | 
			
		||||
c := color.New(color.FgCyan)
 | 
			
		||||
c.Println("Prints cyan text")
 | 
			
		||||
 | 
			
		||||
c.DisableColor()
 | 
			
		||||
c.Println("This is printed without any color")
 | 
			
		||||
 | 
			
		||||
c.EnableColor()
 | 
			
		||||
c.Println("This prints again cyan...")
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Todo
 | 
			
		||||
 | 
			
		||||
* Save/Return previous values
 | 
			
		||||
* Evaluate fmt.Formatter interface
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## Credits
 | 
			
		||||
 | 
			
		||||
 * [Fatih Arslan](https://github.com/fatih)
 | 
			
		||||
 * Windows support via @mattn: [colorable](https://github.com/mattn/go-colorable)
 | 
			
		||||
 | 
			
		||||
## License
 | 
			
		||||
 | 
			
		||||
The MIT License (MIT) - see [`LICENSE.md`](https://github.com/fatih/color/blob/master/LICENSE.md) for more details
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										600
									
								
								vendor/github.com/fatih/color/color.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										600
									
								
								vendor/github.com/fatih/color/color.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,600 @@
 | 
			
		||||
package color
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"os"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"sync"
 | 
			
		||||
 | 
			
		||||
	"github.com/mattn/go-colorable"
 | 
			
		||||
	"github.com/mattn/go-isatty"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	// NoColor defines if the output is colorized or not. It's dynamically set to
 | 
			
		||||
	// false or true based on the stdout's file descriptor referring to a terminal
 | 
			
		||||
	// or not. This is a global option and affects all colors. For more control
 | 
			
		||||
	// over each color block use the methods DisableColor() individually.
 | 
			
		||||
	NoColor = os.Getenv("TERM") == "dumb" ||
 | 
			
		||||
		(!isatty.IsTerminal(os.Stdout.Fd()) && !isatty.IsCygwinTerminal(os.Stdout.Fd()))
 | 
			
		||||
 | 
			
		||||
	// Output defines the standard output of the print functions. By default
 | 
			
		||||
	// os.Stdout is used.
 | 
			
		||||
	Output = colorable.NewColorableStdout()
 | 
			
		||||
 | 
			
		||||
	// colorsCache is used to reduce the count of created Color objects and
 | 
			
		||||
	// allows to reuse already created objects with required Attribute.
 | 
			
		||||
	colorsCache   = make(map[Attribute]*Color)
 | 
			
		||||
	colorsCacheMu sync.Mutex // protects colorsCache
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Color defines a custom color object which is defined by SGR parameters.
 | 
			
		||||
type Color struct {
 | 
			
		||||
	params  []Attribute
 | 
			
		||||
	noColor *bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Attribute defines a single SGR Code
 | 
			
		||||
type Attribute int
 | 
			
		||||
 | 
			
		||||
const escape = "\x1b"
 | 
			
		||||
 | 
			
		||||
// Base attributes
 | 
			
		||||
const (
 | 
			
		||||
	Reset Attribute = iota
 | 
			
		||||
	Bold
 | 
			
		||||
	Faint
 | 
			
		||||
	Italic
 | 
			
		||||
	Underline
 | 
			
		||||
	BlinkSlow
 | 
			
		||||
	BlinkRapid
 | 
			
		||||
	ReverseVideo
 | 
			
		||||
	Concealed
 | 
			
		||||
	CrossedOut
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Foreground text colors
 | 
			
		||||
const (
 | 
			
		||||
	FgBlack Attribute = iota + 30
 | 
			
		||||
	FgRed
 | 
			
		||||
	FgGreen
 | 
			
		||||
	FgYellow
 | 
			
		||||
	FgBlue
 | 
			
		||||
	FgMagenta
 | 
			
		||||
	FgCyan
 | 
			
		||||
	FgWhite
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Foreground Hi-Intensity text colors
 | 
			
		||||
const (
 | 
			
		||||
	FgHiBlack Attribute = iota + 90
 | 
			
		||||
	FgHiRed
 | 
			
		||||
	FgHiGreen
 | 
			
		||||
	FgHiYellow
 | 
			
		||||
	FgHiBlue
 | 
			
		||||
	FgHiMagenta
 | 
			
		||||
	FgHiCyan
 | 
			
		||||
	FgHiWhite
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Background text colors
 | 
			
		||||
const (
 | 
			
		||||
	BgBlack Attribute = iota + 40
 | 
			
		||||
	BgRed
 | 
			
		||||
	BgGreen
 | 
			
		||||
	BgYellow
 | 
			
		||||
	BgBlue
 | 
			
		||||
	BgMagenta
 | 
			
		||||
	BgCyan
 | 
			
		||||
	BgWhite
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Background Hi-Intensity text colors
 | 
			
		||||
const (
 | 
			
		||||
	BgHiBlack Attribute = iota + 100
 | 
			
		||||
	BgHiRed
 | 
			
		||||
	BgHiGreen
 | 
			
		||||
	BgHiYellow
 | 
			
		||||
	BgHiBlue
 | 
			
		||||
	BgHiMagenta
 | 
			
		||||
	BgHiCyan
 | 
			
		||||
	BgHiWhite
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// New returns a newly created color object.
 | 
			
		||||
func New(value ...Attribute) *Color {
 | 
			
		||||
	c := &Color{params: make([]Attribute, 0)}
 | 
			
		||||
	c.Add(value...)
 | 
			
		||||
	return c
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Set sets the given parameters immediately. It will change the color of
 | 
			
		||||
// output with the given SGR parameters until color.Unset() is called.
 | 
			
		||||
func Set(p ...Attribute) *Color {
 | 
			
		||||
	c := New(p...)
 | 
			
		||||
	c.Set()
 | 
			
		||||
	return c
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Unset resets all escape attributes and clears the output. Usually should
 | 
			
		||||
// be called after Set().
 | 
			
		||||
func Unset() {
 | 
			
		||||
	if NoColor {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fmt.Fprintf(Output, "%s[%dm", escape, Reset)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Set sets the SGR sequence.
 | 
			
		||||
func (c *Color) Set() *Color {
 | 
			
		||||
	if c.isNoColorSet() {
 | 
			
		||||
		return c
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fmt.Fprintf(Output, c.format())
 | 
			
		||||
	return c
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Color) unset() {
 | 
			
		||||
	if c.isNoColorSet() {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	Unset()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Color) setWriter(w io.Writer) *Color {
 | 
			
		||||
	if c.isNoColorSet() {
 | 
			
		||||
		return c
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fmt.Fprintf(w, c.format())
 | 
			
		||||
	return c
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Color) unsetWriter(w io.Writer) {
 | 
			
		||||
	if c.isNoColorSet() {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if NoColor {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fmt.Fprintf(w, "%s[%dm", escape, Reset)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Add is used to chain SGR parameters. Use as many as parameters to combine
 | 
			
		||||
// and create custom color objects. Example: Add(color.FgRed, color.Underline).
 | 
			
		||||
func (c *Color) Add(value ...Attribute) *Color {
 | 
			
		||||
	c.params = append(c.params, value...)
 | 
			
		||||
	return c
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Color) prepend(value Attribute) {
 | 
			
		||||
	c.params = append(c.params, 0)
 | 
			
		||||
	copy(c.params[1:], c.params[0:])
 | 
			
		||||
	c.params[0] = value
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Fprint formats using the default formats for its operands and writes to w.
 | 
			
		||||
// Spaces are added between operands when neither is a string.
 | 
			
		||||
// It returns the number of bytes written and any write error encountered.
 | 
			
		||||
// On Windows, users should wrap w with colorable.NewColorable() if w is of
 | 
			
		||||
// type *os.File.
 | 
			
		||||
func (c *Color) Fprint(w io.Writer, a ...interface{}) (n int, err error) {
 | 
			
		||||
	c.setWriter(w)
 | 
			
		||||
	defer c.unsetWriter(w)
 | 
			
		||||
 | 
			
		||||
	return fmt.Fprint(w, a...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Print formats using the default formats for its operands and writes to
 | 
			
		||||
// standard output. Spaces are added between operands when neither is a
 | 
			
		||||
// string. It returns the number of bytes written and any write error
 | 
			
		||||
// encountered. This is the standard fmt.Print() method wrapped with the given
 | 
			
		||||
// color.
 | 
			
		||||
func (c *Color) Print(a ...interface{}) (n int, err error) {
 | 
			
		||||
	c.Set()
 | 
			
		||||
	defer c.unset()
 | 
			
		||||
 | 
			
		||||
	return fmt.Fprint(Output, a...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Fprintf formats according to a format specifier and writes to w.
 | 
			
		||||
// It returns the number of bytes written and any write error encountered.
 | 
			
		||||
// On Windows, users should wrap w with colorable.NewColorable() if w is of
 | 
			
		||||
// type *os.File.
 | 
			
		||||
func (c *Color) Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) {
 | 
			
		||||
	c.setWriter(w)
 | 
			
		||||
	defer c.unsetWriter(w)
 | 
			
		||||
 | 
			
		||||
	return fmt.Fprintf(w, format, a...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Printf formats according to a format specifier and writes to standard output.
 | 
			
		||||
// It returns the number of bytes written and any write error encountered.
 | 
			
		||||
// This is the standard fmt.Printf() method wrapped with the given color.
 | 
			
		||||
func (c *Color) Printf(format string, a ...interface{}) (n int, err error) {
 | 
			
		||||
	c.Set()
 | 
			
		||||
	defer c.unset()
 | 
			
		||||
 | 
			
		||||
	return fmt.Fprintf(Output, format, a...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Fprintln formats using the default formats for its operands and writes to w.
 | 
			
		||||
// Spaces are always added between operands and a newline is appended.
 | 
			
		||||
// On Windows, users should wrap w with colorable.NewColorable() if w is of
 | 
			
		||||
// type *os.File.
 | 
			
		||||
func (c *Color) Fprintln(w io.Writer, a ...interface{}) (n int, err error) {
 | 
			
		||||
	c.setWriter(w)
 | 
			
		||||
	defer c.unsetWriter(w)
 | 
			
		||||
 | 
			
		||||
	return fmt.Fprintln(w, a...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Println formats using the default formats for its operands and writes to
 | 
			
		||||
// standard output. Spaces are always added between operands and a newline is
 | 
			
		||||
// appended. It returns the number of bytes written and any write error
 | 
			
		||||
// encountered. This is the standard fmt.Print() method wrapped with the given
 | 
			
		||||
// color.
 | 
			
		||||
func (c *Color) Println(a ...interface{}) (n int, err error) {
 | 
			
		||||
	c.Set()
 | 
			
		||||
	defer c.unset()
 | 
			
		||||
 | 
			
		||||
	return fmt.Fprintln(Output, a...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Sprint is just like Print, but returns a string instead of printing it.
 | 
			
		||||
func (c *Color) Sprint(a ...interface{}) string {
 | 
			
		||||
	return c.wrap(fmt.Sprint(a...))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Sprintln is just like Println, but returns a string instead of printing it.
 | 
			
		||||
func (c *Color) Sprintln(a ...interface{}) string {
 | 
			
		||||
	return c.wrap(fmt.Sprintln(a...))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Sprintf is just like Printf, but returns a string instead of printing it.
 | 
			
		||||
func (c *Color) Sprintf(format string, a ...interface{}) string {
 | 
			
		||||
	return c.wrap(fmt.Sprintf(format, a...))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FprintFunc returns a new function that prints the passed arguments as
 | 
			
		||||
// colorized with color.Fprint().
 | 
			
		||||
func (c *Color) FprintFunc() func(w io.Writer, a ...interface{}) {
 | 
			
		||||
	return func(w io.Writer, a ...interface{}) {
 | 
			
		||||
		c.Fprint(w, a...)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PrintFunc returns a new function that prints the passed arguments as
 | 
			
		||||
// colorized with color.Print().
 | 
			
		||||
func (c *Color) PrintFunc() func(a ...interface{}) {
 | 
			
		||||
	return func(a ...interface{}) {
 | 
			
		||||
		c.Print(a...)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FprintfFunc returns a new function that prints the passed arguments as
 | 
			
		||||
// colorized with color.Fprintf().
 | 
			
		||||
func (c *Color) FprintfFunc() func(w io.Writer, format string, a ...interface{}) {
 | 
			
		||||
	return func(w io.Writer, format string, a ...interface{}) {
 | 
			
		||||
		c.Fprintf(w, format, a...)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PrintfFunc returns a new function that prints the passed arguments as
 | 
			
		||||
// colorized with color.Printf().
 | 
			
		||||
func (c *Color) PrintfFunc() func(format string, a ...interface{}) {
 | 
			
		||||
	return func(format string, a ...interface{}) {
 | 
			
		||||
		c.Printf(format, a...)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FprintlnFunc returns a new function that prints the passed arguments as
 | 
			
		||||
// colorized with color.Fprintln().
 | 
			
		||||
func (c *Color) FprintlnFunc() func(w io.Writer, a ...interface{}) {
 | 
			
		||||
	return func(w io.Writer, a ...interface{}) {
 | 
			
		||||
		c.Fprintln(w, a...)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PrintlnFunc returns a new function that prints the passed arguments as
 | 
			
		||||
// colorized with color.Println().
 | 
			
		||||
func (c *Color) PrintlnFunc() func(a ...interface{}) {
 | 
			
		||||
	return func(a ...interface{}) {
 | 
			
		||||
		c.Println(a...)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SprintFunc returns a new function that returns colorized strings for the
 | 
			
		||||
// given arguments with fmt.Sprint(). Useful to put into or mix into other
 | 
			
		||||
// string. Windows users should use this in conjunction with color.Output, example:
 | 
			
		||||
//
 | 
			
		||||
//	put := New(FgYellow).SprintFunc()
 | 
			
		||||
//	fmt.Fprintf(color.Output, "This is a %s", put("warning"))
 | 
			
		||||
func (c *Color) SprintFunc() func(a ...interface{}) string {
 | 
			
		||||
	return func(a ...interface{}) string {
 | 
			
		||||
		return c.wrap(fmt.Sprint(a...))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SprintfFunc returns a new function that returns colorized strings for the
 | 
			
		||||
// given arguments with fmt.Sprintf(). Useful to put into or mix into other
 | 
			
		||||
// string. Windows users should use this in conjunction with color.Output.
 | 
			
		||||
func (c *Color) SprintfFunc() func(format string, a ...interface{}) string {
 | 
			
		||||
	return func(format string, a ...interface{}) string {
 | 
			
		||||
		return c.wrap(fmt.Sprintf(format, a...))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SprintlnFunc returns a new function that returns colorized strings for the
 | 
			
		||||
// given arguments with fmt.Sprintln(). Useful to put into or mix into other
 | 
			
		||||
// string. Windows users should use this in conjunction with color.Output.
 | 
			
		||||
func (c *Color) SprintlnFunc() func(a ...interface{}) string {
 | 
			
		||||
	return func(a ...interface{}) string {
 | 
			
		||||
		return c.wrap(fmt.Sprintln(a...))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// sequence returns a formatted SGR sequence to be plugged into a "\x1b[...m"
 | 
			
		||||
// an example output might be: "1;36" -> bold cyan
 | 
			
		||||
func (c *Color) sequence() string {
 | 
			
		||||
	format := make([]string, len(c.params))
 | 
			
		||||
	for i, v := range c.params {
 | 
			
		||||
		format[i] = strconv.Itoa(int(v))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return strings.Join(format, ";")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// wrap wraps the s string with the colors attributes. The string is ready to
 | 
			
		||||
// be printed.
 | 
			
		||||
func (c *Color) wrap(s string) string {
 | 
			
		||||
	if c.isNoColorSet() {
 | 
			
		||||
		return s
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return c.format() + s + c.unformat()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Color) format() string {
 | 
			
		||||
	return fmt.Sprintf("%s[%sm", escape, c.sequence())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Color) unformat() string {
 | 
			
		||||
	return fmt.Sprintf("%s[%dm", escape, Reset)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DisableColor disables the color output. Useful to not change any existing
 | 
			
		||||
// code and still being able to output. Can be used for flags like
 | 
			
		||||
// "--no-color". To enable back use EnableColor() method.
 | 
			
		||||
func (c *Color) DisableColor() {
 | 
			
		||||
	c.noColor = boolPtr(true)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EnableColor enables the color output. Use it in conjunction with
 | 
			
		||||
// DisableColor(). Otherwise this method has no side effects.
 | 
			
		||||
func (c *Color) EnableColor() {
 | 
			
		||||
	c.noColor = boolPtr(false)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Color) isNoColorSet() bool {
 | 
			
		||||
	// check first if we have user setted action
 | 
			
		||||
	if c.noColor != nil {
 | 
			
		||||
		return *c.noColor
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// if not return the global option, which is disabled by default
 | 
			
		||||
	return NoColor
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Equals returns a boolean value indicating whether two colors are equal.
 | 
			
		||||
func (c *Color) Equals(c2 *Color) bool {
 | 
			
		||||
	if len(c.params) != len(c2.params) {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, attr := range c.params {
 | 
			
		||||
		if !c2.attrExists(attr) {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Color) attrExists(a Attribute) bool {
 | 
			
		||||
	for _, attr := range c.params {
 | 
			
		||||
		if attr == a {
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func boolPtr(v bool) *bool {
 | 
			
		||||
	return &v
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getCachedColor(p Attribute) *Color {
 | 
			
		||||
	colorsCacheMu.Lock()
 | 
			
		||||
	defer colorsCacheMu.Unlock()
 | 
			
		||||
 | 
			
		||||
	c, ok := colorsCache[p]
 | 
			
		||||
	if !ok {
 | 
			
		||||
		c = New(p)
 | 
			
		||||
		colorsCache[p] = c
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return c
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func colorPrint(format string, p Attribute, a ...interface{}) {
 | 
			
		||||
	c := getCachedColor(p)
 | 
			
		||||
 | 
			
		||||
	if !strings.HasSuffix(format, "\n") {
 | 
			
		||||
		format += "\n"
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(a) == 0 {
 | 
			
		||||
		c.Print(format)
 | 
			
		||||
	} else {
 | 
			
		||||
		c.Printf(format, a...)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func colorString(format string, p Attribute, a ...interface{}) string {
 | 
			
		||||
	c := getCachedColor(p)
 | 
			
		||||
 | 
			
		||||
	if len(a) == 0 {
 | 
			
		||||
		return c.SprintFunc()(format)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return c.SprintfFunc()(format, a...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Black is a convenient helper function to print with black foreground. A
 | 
			
		||||
// newline is appended to format by default.
 | 
			
		||||
func Black(format string, a ...interface{}) { colorPrint(format, FgBlack, a...) }
 | 
			
		||||
 | 
			
		||||
// Red is a convenient helper function to print with red foreground. A
 | 
			
		||||
// newline is appended to format by default.
 | 
			
		||||
func Red(format string, a ...interface{}) { colorPrint(format, FgRed, a...) }
 | 
			
		||||
 | 
			
		||||
// Green is a convenient helper function to print with green foreground. A
 | 
			
		||||
// newline is appended to format by default.
 | 
			
		||||
func Green(format string, a ...interface{}) { colorPrint(format, FgGreen, a...) }
 | 
			
		||||
 | 
			
		||||
// Yellow is a convenient helper function to print with yellow foreground.
 | 
			
		||||
// A newline is appended to format by default.
 | 
			
		||||
func Yellow(format string, a ...interface{}) { colorPrint(format, FgYellow, a...) }
 | 
			
		||||
 | 
			
		||||
// Blue is a convenient helper function to print with blue foreground. A
 | 
			
		||||
// newline is appended to format by default.
 | 
			
		||||
func Blue(format string, a ...interface{}) { colorPrint(format, FgBlue, a...) }
 | 
			
		||||
 | 
			
		||||
// Magenta is a convenient helper function to print with magenta foreground.
 | 
			
		||||
// A newline is appended to format by default.
 | 
			
		||||
func Magenta(format string, a ...interface{}) { colorPrint(format, FgMagenta, a...) }
 | 
			
		||||
 | 
			
		||||
// Cyan is a convenient helper function to print with cyan foreground. A
 | 
			
		||||
// newline is appended to format by default.
 | 
			
		||||
func Cyan(format string, a ...interface{}) { colorPrint(format, FgCyan, a...) }
 | 
			
		||||
 | 
			
		||||
// White is a convenient helper function to print with white foreground. A
 | 
			
		||||
// newline is appended to format by default.
 | 
			
		||||
func White(format string, a ...interface{}) { colorPrint(format, FgWhite, a...) }
 | 
			
		||||
 | 
			
		||||
// BlackString is a convenient helper function to return a string with black
 | 
			
		||||
// foreground.
 | 
			
		||||
func BlackString(format string, a ...interface{}) string { return colorString(format, FgBlack, a...) }
 | 
			
		||||
 | 
			
		||||
// RedString is a convenient helper function to return a string with red
 | 
			
		||||
// foreground.
 | 
			
		||||
func RedString(format string, a ...interface{}) string { return colorString(format, FgRed, a...) }
 | 
			
		||||
 | 
			
		||||
// GreenString is a convenient helper function to return a string with green
 | 
			
		||||
// foreground.
 | 
			
		||||
func GreenString(format string, a ...interface{}) string { return colorString(format, FgGreen, a...) }
 | 
			
		||||
 | 
			
		||||
// YellowString is a convenient helper function to return a string with yellow
 | 
			
		||||
// foreground.
 | 
			
		||||
func YellowString(format string, a ...interface{}) string { return colorString(format, FgYellow, a...) }
 | 
			
		||||
 | 
			
		||||
// BlueString is a convenient helper function to return a string with blue
 | 
			
		||||
// foreground.
 | 
			
		||||
func BlueString(format string, a ...interface{}) string { return colorString(format, FgBlue, a...) }
 | 
			
		||||
 | 
			
		||||
// MagentaString is a convenient helper function to return a string with magenta
 | 
			
		||||
// foreground.
 | 
			
		||||
func MagentaString(format string, a ...interface{}) string {
 | 
			
		||||
	return colorString(format, FgMagenta, a...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CyanString is a convenient helper function to return a string with cyan
 | 
			
		||||
// foreground.
 | 
			
		||||
func CyanString(format string, a ...interface{}) string { return colorString(format, FgCyan, a...) }
 | 
			
		||||
 | 
			
		||||
// WhiteString is a convenient helper function to return a string with white
 | 
			
		||||
// foreground.
 | 
			
		||||
func WhiteString(format string, a ...interface{}) string { return colorString(format, FgWhite, a...) }
 | 
			
		||||
 | 
			
		||||
// HiBlack is a convenient helper function to print with hi-intensity black foreground. A
 | 
			
		||||
// newline is appended to format by default.
 | 
			
		||||
func HiBlack(format string, a ...interface{}) { colorPrint(format, FgHiBlack, a...) }
 | 
			
		||||
 | 
			
		||||
// HiRed is a convenient helper function to print with hi-intensity red foreground. A
 | 
			
		||||
// newline is appended to format by default.
 | 
			
		||||
func HiRed(format string, a ...interface{}) { colorPrint(format, FgHiRed, a...) }
 | 
			
		||||
 | 
			
		||||
// HiGreen is a convenient helper function to print with hi-intensity green foreground. A
 | 
			
		||||
// newline is appended to format by default.
 | 
			
		||||
func HiGreen(format string, a ...interface{}) { colorPrint(format, FgHiGreen, a...) }
 | 
			
		||||
 | 
			
		||||
// HiYellow is a convenient helper function to print with hi-intensity yellow foreground.
 | 
			
		||||
// A newline is appended to format by default.
 | 
			
		||||
func HiYellow(format string, a ...interface{}) { colorPrint(format, FgHiYellow, a...) }
 | 
			
		||||
 | 
			
		||||
// HiBlue is a convenient helper function to print with hi-intensity blue foreground. A
 | 
			
		||||
// newline is appended to format by default.
 | 
			
		||||
func HiBlue(format string, a ...interface{}) { colorPrint(format, FgHiBlue, a...) }
 | 
			
		||||
 | 
			
		||||
// HiMagenta is a convenient helper function to print with hi-intensity magenta foreground.
 | 
			
		||||
// A newline is appended to format by default.
 | 
			
		||||
func HiMagenta(format string, a ...interface{}) { colorPrint(format, FgHiMagenta, a...) }
 | 
			
		||||
 | 
			
		||||
// HiCyan is a convenient helper function to print with hi-intensity cyan foreground. A
 | 
			
		||||
// newline is appended to format by default.
 | 
			
		||||
func HiCyan(format string, a ...interface{}) { colorPrint(format, FgHiCyan, a...) }
 | 
			
		||||
 | 
			
		||||
// HiWhite is a convenient helper function to print with hi-intensity white foreground. A
 | 
			
		||||
// newline is appended to format by default.
 | 
			
		||||
func HiWhite(format string, a ...interface{}) { colorPrint(format, FgHiWhite, a...) }
 | 
			
		||||
 | 
			
		||||
// HiBlackString is a convenient helper function to return a string with hi-intensity black
 | 
			
		||||
// foreground.
 | 
			
		||||
func HiBlackString(format string, a ...interface{}) string {
 | 
			
		||||
	return colorString(format, FgHiBlack, a...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HiRedString is a convenient helper function to return a string with hi-intensity red
 | 
			
		||||
// foreground.
 | 
			
		||||
func HiRedString(format string, a ...interface{}) string { return colorString(format, FgHiRed, a...) }
 | 
			
		||||
 | 
			
		||||
// HiGreenString is a convenient helper function to return a string with hi-intensity green
 | 
			
		||||
// foreground.
 | 
			
		||||
func HiGreenString(format string, a ...interface{}) string {
 | 
			
		||||
	return colorString(format, FgHiGreen, a...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HiYellowString is a convenient helper function to return a string with hi-intensity yellow
 | 
			
		||||
// foreground.
 | 
			
		||||
func HiYellowString(format string, a ...interface{}) string {
 | 
			
		||||
	return colorString(format, FgHiYellow, a...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HiBlueString is a convenient helper function to return a string with hi-intensity blue
 | 
			
		||||
// foreground.
 | 
			
		||||
func HiBlueString(format string, a ...interface{}) string { return colorString(format, FgHiBlue, a...) }
 | 
			
		||||
 | 
			
		||||
// HiMagentaString is a convenient helper function to return a string with hi-intensity magenta
 | 
			
		||||
// foreground.
 | 
			
		||||
func HiMagentaString(format string, a ...interface{}) string {
 | 
			
		||||
	return colorString(format, FgHiMagenta, a...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HiCyanString is a convenient helper function to return a string with hi-intensity cyan
 | 
			
		||||
// foreground.
 | 
			
		||||
func HiCyanString(format string, a ...interface{}) string { return colorString(format, FgHiCyan, a...) }
 | 
			
		||||
 | 
			
		||||
// HiWhiteString is a convenient helper function to return a string with hi-intensity white
 | 
			
		||||
// foreground.
 | 
			
		||||
func HiWhiteString(format string, a ...interface{}) string {
 | 
			
		||||
	return colorString(format, FgHiWhite, a...)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										133
									
								
								vendor/github.com/fatih/color/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										133
									
								
								vendor/github.com/fatih/color/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,133 @@
 | 
			
		||||
/*
 | 
			
		||||
Package color is an ANSI color package to output colorized or SGR defined
 | 
			
		||||
output to the standard output. The API can be used in several way, pick one
 | 
			
		||||
that suits you.
 | 
			
		||||
 | 
			
		||||
Use simple and default helper functions with predefined foreground colors:
 | 
			
		||||
 | 
			
		||||
    color.Cyan("Prints text in cyan.")
 | 
			
		||||
 | 
			
		||||
    // a newline will be appended automatically
 | 
			
		||||
    color.Blue("Prints %s in blue.", "text")
 | 
			
		||||
 | 
			
		||||
    // More default foreground colors..
 | 
			
		||||
    color.Red("We have red")
 | 
			
		||||
    color.Yellow("Yellow color too!")
 | 
			
		||||
    color.Magenta("And many others ..")
 | 
			
		||||
 | 
			
		||||
    // Hi-intensity colors
 | 
			
		||||
    color.HiGreen("Bright green color.")
 | 
			
		||||
    color.HiBlack("Bright black means gray..")
 | 
			
		||||
    color.HiWhite("Shiny white color!")
 | 
			
		||||
 | 
			
		||||
However there are times where custom color mixes are required. Below are some
 | 
			
		||||
examples to create custom color objects and use the print functions of each
 | 
			
		||||
separate color object.
 | 
			
		||||
 | 
			
		||||
    // Create a new color object
 | 
			
		||||
    c := color.New(color.FgCyan).Add(color.Underline)
 | 
			
		||||
    c.Println("Prints cyan text with an underline.")
 | 
			
		||||
 | 
			
		||||
    // Or just add them to New()
 | 
			
		||||
    d := color.New(color.FgCyan, color.Bold)
 | 
			
		||||
    d.Printf("This prints bold cyan %s\n", "too!.")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    // Mix up foreground and background colors, create new mixes!
 | 
			
		||||
    red := color.New(color.FgRed)
 | 
			
		||||
 | 
			
		||||
    boldRed := red.Add(color.Bold)
 | 
			
		||||
    boldRed.Println("This will print text in bold red.")
 | 
			
		||||
 | 
			
		||||
    whiteBackground := red.Add(color.BgWhite)
 | 
			
		||||
    whiteBackground.Println("Red text with White background.")
 | 
			
		||||
 | 
			
		||||
    // Use your own io.Writer output
 | 
			
		||||
    color.New(color.FgBlue).Fprintln(myWriter, "blue color!")
 | 
			
		||||
 | 
			
		||||
    blue := color.New(color.FgBlue)
 | 
			
		||||
    blue.Fprint(myWriter, "This will print text in blue.")
 | 
			
		||||
 | 
			
		||||
You can create PrintXxx functions to simplify even more:
 | 
			
		||||
 | 
			
		||||
    // Create a custom print function for convenient
 | 
			
		||||
    red := color.New(color.FgRed).PrintfFunc()
 | 
			
		||||
    red("warning")
 | 
			
		||||
    red("error: %s", err)
 | 
			
		||||
 | 
			
		||||
    // Mix up multiple attributes
 | 
			
		||||
    notice := color.New(color.Bold, color.FgGreen).PrintlnFunc()
 | 
			
		||||
    notice("don't forget this...")
 | 
			
		||||
 | 
			
		||||
You can also FprintXxx functions to pass your own io.Writer:
 | 
			
		||||
 | 
			
		||||
    blue := color.New(FgBlue).FprintfFunc()
 | 
			
		||||
    blue(myWriter, "important notice: %s", stars)
 | 
			
		||||
 | 
			
		||||
    // Mix up with multiple attributes
 | 
			
		||||
    success := color.New(color.Bold, color.FgGreen).FprintlnFunc()
 | 
			
		||||
    success(myWriter, don't forget this...")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Or create SprintXxx functions to mix strings with other non-colorized strings:
 | 
			
		||||
 | 
			
		||||
    yellow := New(FgYellow).SprintFunc()
 | 
			
		||||
    red := New(FgRed).SprintFunc()
 | 
			
		||||
 | 
			
		||||
    fmt.Printf("this is a %s and this is %s.\n", yellow("warning"), red("error"))
 | 
			
		||||
 | 
			
		||||
    info := New(FgWhite, BgGreen).SprintFunc()
 | 
			
		||||
    fmt.Printf("this %s rocks!\n", info("package"))
 | 
			
		||||
 | 
			
		||||
Windows support is enabled by default. All Print functions work as intended.
 | 
			
		||||
However only for color.SprintXXX functions, user should use fmt.FprintXXX and
 | 
			
		||||
set the output to color.Output:
 | 
			
		||||
 | 
			
		||||
    fmt.Fprintf(color.Output, "Windows support: %s", color.GreenString("PASS"))
 | 
			
		||||
 | 
			
		||||
    info := New(FgWhite, BgGreen).SprintFunc()
 | 
			
		||||
    fmt.Fprintf(color.Output, "this %s rocks!\n", info("package"))
 | 
			
		||||
 | 
			
		||||
Using with existing code is possible. Just use the Set() method to set the
 | 
			
		||||
standard output to the given parameters. That way a rewrite of an existing
 | 
			
		||||
code is not required.
 | 
			
		||||
 | 
			
		||||
    // Use handy standard colors.
 | 
			
		||||
    color.Set(color.FgYellow)
 | 
			
		||||
 | 
			
		||||
    fmt.Println("Existing text will be now in Yellow")
 | 
			
		||||
    fmt.Printf("This one %s\n", "too")
 | 
			
		||||
 | 
			
		||||
    color.Unset() // don't forget to unset
 | 
			
		||||
 | 
			
		||||
    // You can mix up parameters
 | 
			
		||||
    color.Set(color.FgMagenta, color.Bold)
 | 
			
		||||
    defer color.Unset() // use it in your function
 | 
			
		||||
 | 
			
		||||
    fmt.Println("All text will be now bold magenta.")
 | 
			
		||||
 | 
			
		||||
There might be a case where you want to disable color output (for example to
 | 
			
		||||
pipe the standard output of your app to somewhere else). `Color` has support to
 | 
			
		||||
disable colors both globally and for single color definition. For example
 | 
			
		||||
suppose you have a CLI app and a `--no-color` bool flag. You can easily disable
 | 
			
		||||
the color output with:
 | 
			
		||||
 | 
			
		||||
    var flagNoColor = flag.Bool("no-color", false, "Disable color output")
 | 
			
		||||
 | 
			
		||||
    if *flagNoColor {
 | 
			
		||||
    	color.NoColor = true // disables colorized output
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
It also has support for single color definitions (local). You can
 | 
			
		||||
disable/enable color output on the fly:
 | 
			
		||||
 | 
			
		||||
     c := color.New(color.FgCyan)
 | 
			
		||||
     c.Println("Prints cyan text")
 | 
			
		||||
 | 
			
		||||
     c.DisableColor()
 | 
			
		||||
     c.Println("This is printed without any color")
 | 
			
		||||
 | 
			
		||||
     c.EnableColor()
 | 
			
		||||
     c.Println("This prints again cyan...")
 | 
			
		||||
*/
 | 
			
		||||
package color
 | 
			
		||||
							
								
								
									
										1
									
								
								vendor/github.com/jstemmer/go-junit-report/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/jstemmer/go-junit-report/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1 +0,0 @@
 | 
			
		||||
go-junit-report
 | 
			
		||||
							
								
								
									
										13
									
								
								vendor/github.com/jstemmer/go-junit-report/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								vendor/github.com/jstemmer/go-junit-report/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,13 +0,0 @@
 | 
			
		||||
language: go
 | 
			
		||||
 | 
			
		||||
go:
 | 
			
		||||
  - tip
 | 
			
		||||
  - "1.10.x"
 | 
			
		||||
  - "1.9.x"
 | 
			
		||||
  - "1.8.x"
 | 
			
		||||
  - "1.7.x"
 | 
			
		||||
  - "1.6.x"
 | 
			
		||||
  - "1.5.x"
 | 
			
		||||
  - "1.4.x"
 | 
			
		||||
  - "1.3.x"
 | 
			
		||||
  - "1.2.x"
 | 
			
		||||
							
								
								
									
										38
									
								
								vendor/github.com/jstemmer/go-junit-report/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										38
									
								
								vendor/github.com/jstemmer/go-junit-report/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,38 +0,0 @@
 | 
			
		||||
load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")
 | 
			
		||||
 | 
			
		||||
go_library(
 | 
			
		||||
    name = "go_default_library",
 | 
			
		||||
    srcs = ["go-junit-report.go"],
 | 
			
		||||
    importmap = "k8s.io/kubernetes/vendor/github.com/jstemmer/go-junit-report",
 | 
			
		||||
    importpath = "github.com/jstemmer/go-junit-report",
 | 
			
		||||
    visibility = ["//visibility:private"],
 | 
			
		||||
    deps = [
 | 
			
		||||
        "//vendor/github.com/jstemmer/go-junit-report/formatter:go_default_library",
 | 
			
		||||
        "//vendor/github.com/jstemmer/go-junit-report/parser:go_default_library",
 | 
			
		||||
    ],
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
go_binary(
 | 
			
		||||
    name = "go-junit-report",
 | 
			
		||||
    embed = [":go_default_library"],
 | 
			
		||||
    tags = ["manual"],
 | 
			
		||||
    visibility = ["//visibility:public"],
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
filegroup(
 | 
			
		||||
    name = "package-srcs",
 | 
			
		||||
    srcs = glob(["**"]),
 | 
			
		||||
    tags = ["automanaged"],
 | 
			
		||||
    visibility = ["//visibility:private"],
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
filegroup(
 | 
			
		||||
    name = "all-srcs",
 | 
			
		||||
    srcs = [
 | 
			
		||||
        ":package-srcs",
 | 
			
		||||
        "//vendor/github.com/jstemmer/go-junit-report/formatter:all-srcs",
 | 
			
		||||
        "//vendor/github.com/jstemmer/go-junit-report/parser:all-srcs",
 | 
			
		||||
    ],
 | 
			
		||||
    tags = ["automanaged"],
 | 
			
		||||
    visibility = ["//visibility:public"],
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										20
									
								
								vendor/github.com/jstemmer/go-junit-report/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								vendor/github.com/jstemmer/go-junit-report/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,20 +0,0 @@
 | 
			
		||||
Copyright (c) 2012 Joel Stemmer
 | 
			
		||||
 | 
			
		||||
Permission is hereby granted, free of charge, to any person obtaining
 | 
			
		||||
a copy of this software and associated documentation files (the
 | 
			
		||||
"Software"), to deal in the Software without restriction, including
 | 
			
		||||
without limitation the rights to use, copy, modify, merge, publish,
 | 
			
		||||
distribute, sublicense, and/or sell copies of the Software, and to
 | 
			
		||||
permit persons to whom the Software is furnished to do so, subject to
 | 
			
		||||
the following conditions:
 | 
			
		||||
 | 
			
		||||
The above copyright notice and this permission notice shall be
 | 
			
		||||
included in all copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 | 
			
		||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 | 
			
		||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 | 
			
		||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
 | 
			
		||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 | 
			
		||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 | 
			
		||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
							
								
								
									
										46
									
								
								vendor/github.com/jstemmer/go-junit-report/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										46
									
								
								vendor/github.com/jstemmer/go-junit-report/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,46 +0,0 @@
 | 
			
		||||
# go-junit-report
 | 
			
		||||
 | 
			
		||||
Converts `go test` output to an xml report, suitable for applications that
 | 
			
		||||
expect junit xml reports (e.g. [Jenkins](http://jenkins-ci.org)).
 | 
			
		||||
 | 
			
		||||
[![Build Status][travis-badge]][travis-link]
 | 
			
		||||
[![Report Card][report-badge]][report-link]
 | 
			
		||||
 | 
			
		||||
## Installation
 | 
			
		||||
 | 
			
		||||
Go version 1.1 or higher is required. Install or update using the `go get`
 | 
			
		||||
command:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
go get -u github.com/jstemmer/go-junit-report
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Contribution
 | 
			
		||||
 | 
			
		||||
Create an Issue and discuss the fix or feature, then fork the package.
 | 
			
		||||
Clone to github.com/jstemmer/go-junit-report.  This is necessary because go import uses this path.
 | 
			
		||||
Fix or implement feature. Test and then commit change.
 | 
			
		||||
Specify #Issue and describe change in the commit message.
 | 
			
		||||
Create Pull Request. It can be merged by owner or administrator then.
 | 
			
		||||
 | 
			
		||||
## Run Tests
 | 
			
		||||
go test
 | 
			
		||||
 | 
			
		||||
## Usage
 | 
			
		||||
 | 
			
		||||
go-junit-report reads the `go test` verbose output from standard in and writes
 | 
			
		||||
junit compatible XML to standard out.
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
go test -v 2>&1 | go-junit-report > report.xml
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Note that it also can parse benchmark output with `-bench` flag:
 | 
			
		||||
```bash
 | 
			
		||||
go test -v -bench . -count 5 2>&1 | go-junit-report > report.xml
 | 
			
		||||
 ```
 | 
			
		||||
 | 
			
		||||
[travis-badge]: https://travis-ci.org/jstemmer/go-junit-report.svg
 | 
			
		||||
[travis-link]: https://travis-ci.org/jstemmer/go-junit-report
 | 
			
		||||
[report-badge]: https://goreportcard.com/badge/github.com/jstemmer/go-junit-report
 | 
			
		||||
[report-link]: https://goreportcard.com/report/github.com/jstemmer/go-junit-report
 | 
			
		||||
							
								
								
									
										182
									
								
								vendor/github.com/jstemmer/go-junit-report/formatter/formatter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										182
									
								
								vendor/github.com/jstemmer/go-junit-report/formatter/formatter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,182 +0,0 @@
 | 
			
		||||
package formatter
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bufio"
 | 
			
		||||
	"encoding/xml"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"runtime"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/jstemmer/go-junit-report/parser"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// JUnitTestSuites is a collection of JUnit test suites.
 | 
			
		||||
type JUnitTestSuites struct {
 | 
			
		||||
	XMLName xml.Name `xml:"testsuites"`
 | 
			
		||||
	Suites  []JUnitTestSuite
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// JUnitTestSuite is a single JUnit test suite which may contain many
 | 
			
		||||
// testcases.
 | 
			
		||||
type JUnitTestSuite struct {
 | 
			
		||||
	XMLName    xml.Name        `xml:"testsuite"`
 | 
			
		||||
	Tests      int             `xml:"tests,attr"`
 | 
			
		||||
	Failures   int             `xml:"failures,attr"`
 | 
			
		||||
	Time       string          `xml:"time,attr"`
 | 
			
		||||
	Name       string          `xml:"name,attr"`
 | 
			
		||||
	Properties []JUnitProperty `xml:"properties>property,omitempty"`
 | 
			
		||||
	TestCases  []JUnitTestCase
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// JUnitTestCase is a single test case with its result.
 | 
			
		||||
type JUnitTestCase struct {
 | 
			
		||||
	XMLName     xml.Name          `xml:"testcase"`
 | 
			
		||||
	Classname   string            `xml:"classname,attr"`
 | 
			
		||||
	Name        string            `xml:"name,attr"`
 | 
			
		||||
	Time        string            `xml:"time,attr"`
 | 
			
		||||
	SkipMessage *JUnitSkipMessage `xml:"skipped,omitempty"`
 | 
			
		||||
	Failure     *JUnitFailure     `xml:"failure,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// JUnitSkipMessage contains the reason why a testcase was skipped.
 | 
			
		||||
type JUnitSkipMessage struct {
 | 
			
		||||
	Message string `xml:"message,attr"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// JUnitProperty represents a key/value pair used to define properties.
 | 
			
		||||
type JUnitProperty struct {
 | 
			
		||||
	Name  string `xml:"name,attr"`
 | 
			
		||||
	Value string `xml:"value,attr"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// JUnitFailure contains data related to a failed test.
 | 
			
		||||
type JUnitFailure struct {
 | 
			
		||||
	Message  string `xml:"message,attr"`
 | 
			
		||||
	Type     string `xml:"type,attr"`
 | 
			
		||||
	Contents string `xml:",chardata"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// JUnitReportXML writes a JUnit xml representation of the given report to w
 | 
			
		||||
// in the format described at http://windyroad.org/dl/Open%20Source/JUnit.xsd
 | 
			
		||||
func JUnitReportXML(report *parser.Report, noXMLHeader bool, goVersion string, w io.Writer) error {
 | 
			
		||||
	suites := JUnitTestSuites{}
 | 
			
		||||
 | 
			
		||||
	// convert Report to JUnit test suites
 | 
			
		||||
	for _, pkg := range report.Packages {
 | 
			
		||||
		pkg.Benchmarks = mergeBenchmarks(pkg.Benchmarks)
 | 
			
		||||
		ts := JUnitTestSuite{
 | 
			
		||||
			Tests:      len(pkg.Tests) + len(pkg.Benchmarks),
 | 
			
		||||
			Failures:   0,
 | 
			
		||||
			Time:       formatTime(pkg.Duration),
 | 
			
		||||
			Name:       pkg.Name,
 | 
			
		||||
			Properties: []JUnitProperty{},
 | 
			
		||||
			TestCases:  []JUnitTestCase{},
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		classname := pkg.Name
 | 
			
		||||
		if idx := strings.LastIndex(classname, "/"); idx > -1 && idx < len(pkg.Name) {
 | 
			
		||||
			classname = pkg.Name[idx+1:]
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// properties
 | 
			
		||||
		if goVersion == "" {
 | 
			
		||||
			// if goVersion was not specified as a flag, fall back to version reported by runtime
 | 
			
		||||
			goVersion = runtime.Version()
 | 
			
		||||
		}
 | 
			
		||||
		ts.Properties = append(ts.Properties, JUnitProperty{"go.version", goVersion})
 | 
			
		||||
		if pkg.CoveragePct != "" {
 | 
			
		||||
			ts.Properties = append(ts.Properties, JUnitProperty{"coverage.statements.pct", pkg.CoveragePct})
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// individual test cases
 | 
			
		||||
		for _, test := range pkg.Tests {
 | 
			
		||||
			testCase := JUnitTestCase{
 | 
			
		||||
				Classname: classname,
 | 
			
		||||
				Name:      test.Name,
 | 
			
		||||
				Time:      formatTime(test.Duration),
 | 
			
		||||
				Failure:   nil,
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if test.Result == parser.FAIL {
 | 
			
		||||
				ts.Failures++
 | 
			
		||||
				testCase.Failure = &JUnitFailure{
 | 
			
		||||
					Message:  "Failed",
 | 
			
		||||
					Type:     "",
 | 
			
		||||
					Contents: strings.Join(test.Output, "\n"),
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if test.Result == parser.SKIP {
 | 
			
		||||
				testCase.SkipMessage = &JUnitSkipMessage{strings.Join(test.Output, "\n")}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			ts.TestCases = append(ts.TestCases, testCase)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// individual benchmarks
 | 
			
		||||
		for _, benchmark := range pkg.Benchmarks {
 | 
			
		||||
			benchmarkCase := JUnitTestCase{
 | 
			
		||||
				Classname: classname,
 | 
			
		||||
				Name:      benchmark.Name,
 | 
			
		||||
				Time:      formatBenchmarkTime(benchmark.Duration),
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			ts.TestCases = append(ts.TestCases, benchmarkCase)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		suites.Suites = append(suites.Suites, ts)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// to xml
 | 
			
		||||
	bytes, err := xml.MarshalIndent(suites, "", "\t")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	writer := bufio.NewWriter(w)
 | 
			
		||||
 | 
			
		||||
	if !noXMLHeader {
 | 
			
		||||
		writer.WriteString(xml.Header)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	writer.Write(bytes)
 | 
			
		||||
	writer.WriteByte('\n')
 | 
			
		||||
	writer.Flush()
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func mergeBenchmarks(benchmarks []*parser.Benchmark) []*parser.Benchmark {
 | 
			
		||||
	var merged []*parser.Benchmark
 | 
			
		||||
	benchmap := make(map[string][]*parser.Benchmark)
 | 
			
		||||
	for _, bm := range benchmarks {
 | 
			
		||||
		if _, ok := benchmap[bm.Name]; !ok {
 | 
			
		||||
			merged = append(merged, &parser.Benchmark{Name: bm.Name})
 | 
			
		||||
		}
 | 
			
		||||
		benchmap[bm.Name] = append(benchmap[bm.Name], bm)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, bm := range merged {
 | 
			
		||||
		for _, b := range benchmap[bm.Name] {
 | 
			
		||||
			bm.Allocs += b.Allocs
 | 
			
		||||
			bm.Bytes += b.Bytes
 | 
			
		||||
			bm.Duration += b.Duration
 | 
			
		||||
		}
 | 
			
		||||
		n := len(benchmap[bm.Name])
 | 
			
		||||
		bm.Allocs /= n
 | 
			
		||||
		bm.Bytes /= n
 | 
			
		||||
		bm.Duration /= time.Duration(n)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return merged
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func formatTime(d time.Duration) string {
 | 
			
		||||
	return fmt.Sprintf("%.3f", d.Seconds())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func formatBenchmarkTime(d time.Duration) string {
 | 
			
		||||
	return fmt.Sprintf("%.9f", d.Seconds())
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										51
									
								
								vendor/github.com/jstemmer/go-junit-report/go-junit-report.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										51
									
								
								vendor/github.com/jstemmer/go-junit-report/go-junit-report.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,51 +0,0 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"flag"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"os"
 | 
			
		||||
 | 
			
		||||
	"github.com/jstemmer/go-junit-report/formatter"
 | 
			
		||||
	"github.com/jstemmer/go-junit-report/parser"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	noXMLHeader   bool
 | 
			
		||||
	packageName   string
 | 
			
		||||
	goVersionFlag string
 | 
			
		||||
	setExitCode   bool
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	flag.BoolVar(&noXMLHeader, "no-xml-header", false, "do not print xml header")
 | 
			
		||||
	flag.StringVar(&packageName, "package-name", "", "specify a package name (compiled test have no package name in output)")
 | 
			
		||||
	flag.StringVar(&goVersionFlag, "go-version", "", "specify the value to use for the go.version property in the generated XML")
 | 
			
		||||
	flag.BoolVar(&setExitCode, "set-exit-code", false, "set exit code to 1 if tests failed")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	flag.Parse()
 | 
			
		||||
 | 
			
		||||
	if flag.NArg() != 0 {
 | 
			
		||||
		fmt.Println("go-junit-report does not accept positional arguments")
 | 
			
		||||
		os.Exit(1)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Read input
 | 
			
		||||
	report, err := parser.Parse(os.Stdin, packageName)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Printf("Error reading input: %s\n", err)
 | 
			
		||||
		os.Exit(1)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Write xml
 | 
			
		||||
	err = formatter.JUnitReportXML(report, noXMLHeader, goVersionFlag, os.Stdout)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Printf("Error writing XML: %s\n", err)
 | 
			
		||||
		os.Exit(1)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if setExitCode && report.Failures() > 0 {
 | 
			
		||||
		os.Exit(1)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										23
									
								
								vendor/github.com/jstemmer/go-junit-report/parser/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										23
									
								
								vendor/github.com/jstemmer/go-junit-report/parser/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,23 +0,0 @@
 | 
			
		||||
load("@io_bazel_rules_go//go:def.bzl", "go_library")
 | 
			
		||||
 | 
			
		||||
go_library(
 | 
			
		||||
    name = "go_default_library",
 | 
			
		||||
    srcs = ["parser.go"],
 | 
			
		||||
    importmap = "k8s.io/kubernetes/vendor/github.com/jstemmer/go-junit-report/parser",
 | 
			
		||||
    importpath = "github.com/jstemmer/go-junit-report/parser",
 | 
			
		||||
    visibility = ["//visibility:public"],
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
filegroup(
 | 
			
		||||
    name = "package-srcs",
 | 
			
		||||
    srcs = glob(["**"]),
 | 
			
		||||
    tags = ["automanaged"],
 | 
			
		||||
    visibility = ["//visibility:private"],
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
filegroup(
 | 
			
		||||
    name = "all-srcs",
 | 
			
		||||
    srcs = [":package-srcs"],
 | 
			
		||||
    tags = ["automanaged"],
 | 
			
		||||
    visibility = ["//visibility:public"],
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										303
									
								
								vendor/github.com/jstemmer/go-junit-report/parser/parser.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										303
									
								
								vendor/github.com/jstemmer/go-junit-report/parser/parser.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,303 +0,0 @@
 | 
			
		||||
package parser
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bufio"
 | 
			
		||||
	"io"
 | 
			
		||||
	"regexp"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Result represents a test result.
 | 
			
		||||
type Result int
 | 
			
		||||
 | 
			
		||||
// Test result constants
 | 
			
		||||
const (
 | 
			
		||||
	PASS Result = iota
 | 
			
		||||
	FAIL
 | 
			
		||||
	SKIP
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Report is a collection of package tests.
 | 
			
		||||
type Report struct {
 | 
			
		||||
	Packages []Package
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Package contains the test results of a single package.
 | 
			
		||||
type Package struct {
 | 
			
		||||
	Name        string
 | 
			
		||||
	Duration    time.Duration
 | 
			
		||||
	Tests       []*Test
 | 
			
		||||
	Benchmarks  []*Benchmark
 | 
			
		||||
	CoveragePct string
 | 
			
		||||
 | 
			
		||||
	// Time is deprecated, use Duration instead.
 | 
			
		||||
	Time int // in milliseconds
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Test contains the results of a single test.
 | 
			
		||||
type Test struct {
 | 
			
		||||
	Name     string
 | 
			
		||||
	Duration time.Duration
 | 
			
		||||
	Result   Result
 | 
			
		||||
	Output   []string
 | 
			
		||||
 | 
			
		||||
	SubtestIndent string
 | 
			
		||||
 | 
			
		||||
	// Time is deprecated, use Duration instead.
 | 
			
		||||
	Time int // in milliseconds
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Benchmark contains the results of a single benchmark.
 | 
			
		||||
type Benchmark struct {
 | 
			
		||||
	Name     string
 | 
			
		||||
	Duration time.Duration
 | 
			
		||||
	// number of B/op
 | 
			
		||||
	Bytes int
 | 
			
		||||
	// number of allocs/op
 | 
			
		||||
	Allocs int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	regexStatus   = regexp.MustCompile(`--- (PASS|FAIL|SKIP): (.+) \((\d+\.\d+)(?: seconds|s)\)`)
 | 
			
		||||
	regexIndent   = regexp.MustCompile(`^([ \t]+)---`)
 | 
			
		||||
	regexCoverage = regexp.MustCompile(`^coverage:\s+(\d+\.\d+)%\s+of\s+statements(?:\sin\s.+)?$`)
 | 
			
		||||
	regexResult   = regexp.MustCompile(`^(ok|FAIL)\s+([^ ]+)\s+(?:(\d+\.\d+)s|\(cached\)|(\[\w+ failed]))(?:\s+coverage:\s+(\d+\.\d+)%\sof\sstatements(?:\sin\s.+)?)?$`)
 | 
			
		||||
	// regexBenchmark captures 3-5 groups: benchmark name, number of times ran, ns/op (with or without decimal), B/op (optional), and allocs/op (optional).
 | 
			
		||||
	regexBenchmark = regexp.MustCompile(`^(Benchmark[^ -]+)(?:-\d+\s+|\s+)(\d+)\s+(\d+|\d+\.\d+)\sns/op(?:\s+(\d+)\sB/op)?(?:\s+(\d+)\sallocs/op)?`)
 | 
			
		||||
	regexOutput    = regexp.MustCompile(`(    )*\t(.*)`)
 | 
			
		||||
	regexSummary   = regexp.MustCompile(`^(PASS|FAIL|SKIP)$`)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Parse parses go test output from reader r and returns a report with the
 | 
			
		||||
// results. An optional pkgName can be given, which is used in case a package
 | 
			
		||||
// result line is missing.
 | 
			
		||||
func Parse(r io.Reader, pkgName string) (*Report, error) {
 | 
			
		||||
	reader := bufio.NewReader(r)
 | 
			
		||||
 | 
			
		||||
	report := &Report{make([]Package, 0)}
 | 
			
		||||
 | 
			
		||||
	// keep track of tests we find
 | 
			
		||||
	var tests []*Test
 | 
			
		||||
 | 
			
		||||
	// keep track of benchmarks we find
 | 
			
		||||
	var benchmarks []*Benchmark
 | 
			
		||||
 | 
			
		||||
	// sum of tests' time, use this if current test has no result line (when it is compiled test)
 | 
			
		||||
	var testsTime time.Duration
 | 
			
		||||
 | 
			
		||||
	// current test
 | 
			
		||||
	var cur string
 | 
			
		||||
 | 
			
		||||
	// keep track if we've already seen a summary for the current test
 | 
			
		||||
	var seenSummary bool
 | 
			
		||||
 | 
			
		||||
	// coverage percentage report for current package
 | 
			
		||||
	var coveragePct string
 | 
			
		||||
 | 
			
		||||
	// stores mapping between package name and output of build failures
 | 
			
		||||
	var packageCaptures = map[string][]string{}
 | 
			
		||||
 | 
			
		||||
	// the name of the package which it's build failure output is being captured
 | 
			
		||||
	var capturedPackage string
 | 
			
		||||
 | 
			
		||||
	// capture any non-test output
 | 
			
		||||
	var buffers = map[string][]string{}
 | 
			
		||||
 | 
			
		||||
	// parse lines
 | 
			
		||||
	for {
 | 
			
		||||
		l, _, err := reader.ReadLine()
 | 
			
		||||
		if err != nil && err == io.EOF {
 | 
			
		||||
			break
 | 
			
		||||
		} else if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		line := string(l)
 | 
			
		||||
 | 
			
		||||
		if strings.HasPrefix(line, "=== RUN ") {
 | 
			
		||||
			// new test
 | 
			
		||||
			cur = strings.TrimSpace(line[8:])
 | 
			
		||||
			tests = append(tests, &Test{
 | 
			
		||||
				Name:   cur,
 | 
			
		||||
				Result: FAIL,
 | 
			
		||||
				Output: make([]string, 0),
 | 
			
		||||
			})
 | 
			
		||||
 | 
			
		||||
			// clear the current build package, so output lines won't be added to that build
 | 
			
		||||
			capturedPackage = ""
 | 
			
		||||
			seenSummary = false
 | 
			
		||||
		} else if matches := regexBenchmark.FindStringSubmatch(line); len(matches) == 6 {
 | 
			
		||||
			bytes, _ := strconv.Atoi(matches[4])
 | 
			
		||||
			allocs, _ := strconv.Atoi(matches[5])
 | 
			
		||||
 | 
			
		||||
			benchmarks = append(benchmarks, &Benchmark{
 | 
			
		||||
				Name:     matches[1],
 | 
			
		||||
				Duration: parseNanoseconds(matches[3]),
 | 
			
		||||
				Bytes:    bytes,
 | 
			
		||||
				Allocs:   allocs,
 | 
			
		||||
			})
 | 
			
		||||
		} else if strings.HasPrefix(line, "=== PAUSE ") {
 | 
			
		||||
			continue
 | 
			
		||||
		} else if strings.HasPrefix(line, "=== CONT ") {
 | 
			
		||||
			cur = strings.TrimSpace(line[8:])
 | 
			
		||||
			continue
 | 
			
		||||
		} else if matches := regexResult.FindStringSubmatch(line); len(matches) == 6 {
 | 
			
		||||
			if matches[5] != "" {
 | 
			
		||||
				coveragePct = matches[5]
 | 
			
		||||
			}
 | 
			
		||||
			if strings.HasSuffix(matches[4], "failed]") {
 | 
			
		||||
				// the build of the package failed, inject a dummy test into the package
 | 
			
		||||
				// which indicate about the failure and contain the failure description.
 | 
			
		||||
				tests = append(tests, &Test{
 | 
			
		||||
					Name:   matches[4],
 | 
			
		||||
					Result: FAIL,
 | 
			
		||||
					Output: packageCaptures[matches[2]],
 | 
			
		||||
				})
 | 
			
		||||
			} else if matches[1] == "FAIL" && len(tests) == 0 && len(buffers[cur]) > 0 {
 | 
			
		||||
				// This package didn't have any tests, but it failed with some
 | 
			
		||||
				// output. Create a dummy test with the output.
 | 
			
		||||
				tests = append(tests, &Test{
 | 
			
		||||
					Name:   "Failure",
 | 
			
		||||
					Result: FAIL,
 | 
			
		||||
					Output: buffers[cur],
 | 
			
		||||
				})
 | 
			
		||||
				buffers[cur] = buffers[cur][0:0]
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// all tests in this package are finished
 | 
			
		||||
			report.Packages = append(report.Packages, Package{
 | 
			
		||||
				Name:        matches[2],
 | 
			
		||||
				Duration:    parseSeconds(matches[3]),
 | 
			
		||||
				Tests:       tests,
 | 
			
		||||
				Benchmarks:  benchmarks,
 | 
			
		||||
				CoveragePct: coveragePct,
 | 
			
		||||
 | 
			
		||||
				Time: int(parseSeconds(matches[3]) / time.Millisecond), // deprecated
 | 
			
		||||
			})
 | 
			
		||||
 | 
			
		||||
			buffers[cur] = buffers[cur][0:0]
 | 
			
		||||
			tests = make([]*Test, 0)
 | 
			
		||||
			benchmarks = make([]*Benchmark, 0)
 | 
			
		||||
			coveragePct = ""
 | 
			
		||||
			cur = ""
 | 
			
		||||
			testsTime = 0
 | 
			
		||||
		} else if matches := regexStatus.FindStringSubmatch(line); len(matches) == 4 {
 | 
			
		||||
			cur = matches[2]
 | 
			
		||||
			test := findTest(tests, cur)
 | 
			
		||||
			if test == nil {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// test status
 | 
			
		||||
			if matches[1] == "PASS" {
 | 
			
		||||
				test.Result = PASS
 | 
			
		||||
			} else if matches[1] == "SKIP" {
 | 
			
		||||
				test.Result = SKIP
 | 
			
		||||
			} else {
 | 
			
		||||
				test.Result = FAIL
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if matches := regexIndent.FindStringSubmatch(line); len(matches) == 2 {
 | 
			
		||||
				test.SubtestIndent = matches[1]
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			test.Output = buffers[cur]
 | 
			
		||||
 | 
			
		||||
			test.Name = matches[2]
 | 
			
		||||
			test.Duration = parseSeconds(matches[3])
 | 
			
		||||
			testsTime += test.Duration
 | 
			
		||||
 | 
			
		||||
			test.Time = int(test.Duration / time.Millisecond) // deprecated
 | 
			
		||||
		} else if matches := regexCoverage.FindStringSubmatch(line); len(matches) == 2 {
 | 
			
		||||
			coveragePct = matches[1]
 | 
			
		||||
		} else if matches := regexOutput.FindStringSubmatch(line); capturedPackage == "" && len(matches) == 3 {
 | 
			
		||||
			// Sub-tests start with one or more series of 4-space indents, followed by a hard tab,
 | 
			
		||||
			// followed by the test output
 | 
			
		||||
			// Top-level tests start with a hard tab.
 | 
			
		||||
			test := findTest(tests, cur)
 | 
			
		||||
			if test == nil {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			test.Output = append(test.Output, matches[2])
 | 
			
		||||
		} else if strings.HasPrefix(line, "# ") {
 | 
			
		||||
			// indicates a capture of build output of a package. set the current build package.
 | 
			
		||||
			capturedPackage = line[2:]
 | 
			
		||||
		} else if capturedPackage != "" {
 | 
			
		||||
			// current line is build failure capture for the current built package
 | 
			
		||||
			packageCaptures[capturedPackage] = append(packageCaptures[capturedPackage], line)
 | 
			
		||||
		} else if regexSummary.MatchString(line) {
 | 
			
		||||
			// don't store any output after the summary
 | 
			
		||||
			seenSummary = true
 | 
			
		||||
		} else if !seenSummary {
 | 
			
		||||
			// buffer anything else that we didn't recognize
 | 
			
		||||
			buffers[cur] = append(buffers[cur], line)
 | 
			
		||||
 | 
			
		||||
			// if we have a current test, also append to its output
 | 
			
		||||
			test := findTest(tests, cur)
 | 
			
		||||
			if test != nil {
 | 
			
		||||
				if strings.HasPrefix(line, test.SubtestIndent+"    ") {
 | 
			
		||||
					test.Output = append(test.Output, strings.TrimPrefix(line, test.SubtestIndent+"    "))
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(tests) > 0 {
 | 
			
		||||
		// no result line found
 | 
			
		||||
		report.Packages = append(report.Packages, Package{
 | 
			
		||||
			Name:        pkgName,
 | 
			
		||||
			Duration:    testsTime,
 | 
			
		||||
			Time:        int(testsTime / time.Millisecond),
 | 
			
		||||
			Tests:       tests,
 | 
			
		||||
			Benchmarks:  benchmarks,
 | 
			
		||||
			CoveragePct: coveragePct,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return report, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func parseSeconds(t string) time.Duration {
 | 
			
		||||
	if t == "" {
 | 
			
		||||
		return time.Duration(0)
 | 
			
		||||
	}
 | 
			
		||||
	// ignore error
 | 
			
		||||
	d, _ := time.ParseDuration(t + "s")
 | 
			
		||||
	return d
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func parseNanoseconds(t string) time.Duration {
 | 
			
		||||
	// note: if input < 1 ns precision, result will be 0s.
 | 
			
		||||
	if t == "" {
 | 
			
		||||
		return time.Duration(0)
 | 
			
		||||
	}
 | 
			
		||||
	// ignore error
 | 
			
		||||
	d, _ := time.ParseDuration(t + "ns")
 | 
			
		||||
	return d
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func findTest(tests []*Test, name string) *Test {
 | 
			
		||||
	for i := len(tests) - 1; i >= 0; i-- {
 | 
			
		||||
		if tests[i].Name == name {
 | 
			
		||||
			return tests[i]
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Failures counts the number of failed tests in this report
 | 
			
		||||
func (r *Report) Failures() int {
 | 
			
		||||
	count := 0
 | 
			
		||||
 | 
			
		||||
	for _, p := range r.Packages {
 | 
			
		||||
		for _, t := range p.Tests {
 | 
			
		||||
			if t.Result == FAIL {
 | 
			
		||||
				count++
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return count
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										9
									
								
								vendor/github.com/mattn/go-colorable/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								vendor/github.com/mattn/go-colorable/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
language: go
 | 
			
		||||
go:
 | 
			
		||||
  - tip
 | 
			
		||||
 | 
			
		||||
before_install:
 | 
			
		||||
  - go get github.com/mattn/goveralls
 | 
			
		||||
  - go get golang.org/x/tools/cmd/cover
 | 
			
		||||
script:
 | 
			
		||||
  - $HOME/gopath/bin/goveralls -repotoken xnXqRGwgW3SXIguzxf90ZSK1GPYZPaGrw
 | 
			
		||||
							
								
								
									
										63
									
								
								vendor/github.com/mattn/go-colorable/BUILD
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								vendor/github.com/mattn/go-colorable/BUILD
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,63 @@
 | 
			
		||||
load("@io_bazel_rules_go//go:def.bzl", "go_library")
 | 
			
		||||
 | 
			
		||||
go_library(
 | 
			
		||||
    name = "go_default_library",
 | 
			
		||||
    srcs = [
 | 
			
		||||
        "colorable_others.go",
 | 
			
		||||
        "colorable_windows.go",
 | 
			
		||||
        "noncolorable.go",
 | 
			
		||||
    ],
 | 
			
		||||
    importmap = "k8s.io/kubernetes/vendor/github.com/mattn/go-colorable",
 | 
			
		||||
    importpath = "github.com/mattn/go-colorable",
 | 
			
		||||
    visibility = ["//visibility:public"],
 | 
			
		||||
    deps = select({
 | 
			
		||||
        "@io_bazel_rules_go//go/platform:android": [
 | 
			
		||||
            "//vendor/github.com/mattn/go-isatty:go_default_library",
 | 
			
		||||
        ],
 | 
			
		||||
        "@io_bazel_rules_go//go/platform:darwin": [
 | 
			
		||||
            "//vendor/github.com/mattn/go-isatty:go_default_library",
 | 
			
		||||
        ],
 | 
			
		||||
        "@io_bazel_rules_go//go/platform:dragonfly": [
 | 
			
		||||
            "//vendor/github.com/mattn/go-isatty:go_default_library",
 | 
			
		||||
        ],
 | 
			
		||||
        "@io_bazel_rules_go//go/platform:freebsd": [
 | 
			
		||||
            "//vendor/github.com/mattn/go-isatty:go_default_library",
 | 
			
		||||
        ],
 | 
			
		||||
        "@io_bazel_rules_go//go/platform:linux": [
 | 
			
		||||
            "//vendor/github.com/mattn/go-isatty:go_default_library",
 | 
			
		||||
        ],
 | 
			
		||||
        "@io_bazel_rules_go//go/platform:nacl": [
 | 
			
		||||
            "//vendor/github.com/mattn/go-isatty:go_default_library",
 | 
			
		||||
        ],
 | 
			
		||||
        "@io_bazel_rules_go//go/platform:netbsd": [
 | 
			
		||||
            "//vendor/github.com/mattn/go-isatty:go_default_library",
 | 
			
		||||
        ],
 | 
			
		||||
        "@io_bazel_rules_go//go/platform:openbsd": [
 | 
			
		||||
            "//vendor/github.com/mattn/go-isatty:go_default_library",
 | 
			
		||||
        ],
 | 
			
		||||
        "@io_bazel_rules_go//go/platform:plan9": [
 | 
			
		||||
            "//vendor/github.com/mattn/go-isatty:go_default_library",
 | 
			
		||||
        ],
 | 
			
		||||
        "@io_bazel_rules_go//go/platform:solaris": [
 | 
			
		||||
            "//vendor/github.com/mattn/go-isatty:go_default_library",
 | 
			
		||||
        ],
 | 
			
		||||
        "@io_bazel_rules_go//go/platform:windows": [
 | 
			
		||||
            "//vendor/github.com/mattn/go-isatty:go_default_library",
 | 
			
		||||
        ],
 | 
			
		||||
        "//conditions:default": [],
 | 
			
		||||
    }),
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
filegroup(
 | 
			
		||||
    name = "package-srcs",
 | 
			
		||||
    srcs = glob(["**"]),
 | 
			
		||||
    tags = ["automanaged"],
 | 
			
		||||
    visibility = ["//visibility:private"],
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
filegroup(
 | 
			
		||||
    name = "all-srcs",
 | 
			
		||||
    srcs = [":package-srcs"],
 | 
			
		||||
    tags = ["automanaged"],
 | 
			
		||||
    visibility = ["//visibility:public"],
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										21
									
								
								vendor/github.com/mattn/go-colorable/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								vendor/github.com/mattn/go-colorable/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
			
		||||
The MIT License (MIT)
 | 
			
		||||
 | 
			
		||||
Copyright (c) 2016 Yasuhiro Matsumoto
 | 
			
		||||
 | 
			
		||||
Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
of this software and associated documentation files (the "Software"), to deal
 | 
			
		||||
in the Software without restriction, including without limitation the rights
 | 
			
		||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
			
		||||
copies of the Software, and to permit persons to whom the Software is
 | 
			
		||||
furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
The above copyright notice and this permission notice shall be included in all
 | 
			
		||||
copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
			
		||||
SOFTWARE.
 | 
			
		||||
							
								
								
									
										48
									
								
								vendor/github.com/mattn/go-colorable/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								vendor/github.com/mattn/go-colorable/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,48 @@
 | 
			
		||||
# go-colorable
 | 
			
		||||
 | 
			
		||||
[](http://godoc.org/github.com/mattn/go-colorable)
 | 
			
		||||
[](https://travis-ci.org/mattn/go-colorable)
 | 
			
		||||
[](https://coveralls.io/github/mattn/go-colorable?branch=master)
 | 
			
		||||
[](https://goreportcard.com/report/mattn/go-colorable)
 | 
			
		||||
 | 
			
		||||
Colorable writer for windows.
 | 
			
		||||
 | 
			
		||||
For example, most of logger packages doesn't show colors on windows. (I know we can do it with ansicon. But I don't want.)
 | 
			
		||||
This package is possible to handle escape sequence for ansi color on windows.
 | 
			
		||||
 | 
			
		||||
## Too Bad!
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## So Good!
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
## Usage
 | 
			
		||||
 | 
			
		||||
```go
 | 
			
		||||
logrus.SetFormatter(&logrus.TextFormatter{ForceColors: true})
 | 
			
		||||
logrus.SetOutput(colorable.NewColorableStdout())
 | 
			
		||||
 | 
			
		||||
logrus.Info("succeeded")
 | 
			
		||||
logrus.Warn("not correct")
 | 
			
		||||
logrus.Error("something error")
 | 
			
		||||
logrus.Fatal("panic")
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
You can compile above code on non-windows OSs.
 | 
			
		||||
 | 
			
		||||
## Installation
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
$ go get github.com/mattn/go-colorable
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
# License
 | 
			
		||||
 | 
			
		||||
MIT
 | 
			
		||||
 | 
			
		||||
# Author
 | 
			
		||||
 | 
			
		||||
Yasuhiro Matsumoto (a.k.a mattn)
 | 
			
		||||
							
								
								
									
										29
									
								
								vendor/github.com/mattn/go-colorable/colorable_appengine.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								vendor/github.com/mattn/go-colorable/colorable_appengine.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
			
		||||
// +build appengine
 | 
			
		||||
 | 
			
		||||
package colorable
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"io"
 | 
			
		||||
	"os"
 | 
			
		||||
 | 
			
		||||
	_ "github.com/mattn/go-isatty"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// NewColorable return new instance of Writer which handle escape sequence.
 | 
			
		||||
func NewColorable(file *os.File) io.Writer {
 | 
			
		||||
	if file == nil {
 | 
			
		||||
		panic("nil passed instead of *os.File to NewColorable()")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return file
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewColorableStdout return new instance of Writer which handle escape sequence for stdout.
 | 
			
		||||
func NewColorableStdout() io.Writer {
 | 
			
		||||
	return os.Stdout
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewColorableStderr return new instance of Writer which handle escape sequence for stderr.
 | 
			
		||||
func NewColorableStderr() io.Writer {
 | 
			
		||||
	return os.Stderr
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										30
									
								
								vendor/github.com/mattn/go-colorable/colorable_others.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								vendor/github.com/mattn/go-colorable/colorable_others.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
			
		||||
// +build !windows
 | 
			
		||||
// +build !appengine
 | 
			
		||||
 | 
			
		||||
package colorable
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"io"
 | 
			
		||||
	"os"
 | 
			
		||||
 | 
			
		||||
	_ "github.com/mattn/go-isatty"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// NewColorable return new instance of Writer which handle escape sequence.
 | 
			
		||||
func NewColorable(file *os.File) io.Writer {
 | 
			
		||||
	if file == nil {
 | 
			
		||||
		panic("nil passed instead of *os.File to NewColorable()")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return file
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewColorableStdout return new instance of Writer which handle escape sequence for stdout.
 | 
			
		||||
func NewColorableStdout() io.Writer {
 | 
			
		||||
	return os.Stdout
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewColorableStderr return new instance of Writer which handle escape sequence for stderr.
 | 
			
		||||
func NewColorableStderr() io.Writer {
 | 
			
		||||
	return os.Stderr
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										884
									
								
								vendor/github.com/mattn/go-colorable/colorable_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										884
									
								
								vendor/github.com/mattn/go-colorable/colorable_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,884 @@
 | 
			
		||||
// +build windows
 | 
			
		||||
// +build !appengine
 | 
			
		||||
 | 
			
		||||
package colorable
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"io"
 | 
			
		||||
	"math"
 | 
			
		||||
	"os"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"syscall"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
 | 
			
		||||
	"github.com/mattn/go-isatty"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	foregroundBlue      = 0x1
 | 
			
		||||
	foregroundGreen     = 0x2
 | 
			
		||||
	foregroundRed       = 0x4
 | 
			
		||||
	foregroundIntensity = 0x8
 | 
			
		||||
	foregroundMask      = (foregroundRed | foregroundBlue | foregroundGreen | foregroundIntensity)
 | 
			
		||||
	backgroundBlue      = 0x10
 | 
			
		||||
	backgroundGreen     = 0x20
 | 
			
		||||
	backgroundRed       = 0x40
 | 
			
		||||
	backgroundIntensity = 0x80
 | 
			
		||||
	backgroundMask      = (backgroundRed | backgroundBlue | backgroundGreen | backgroundIntensity)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type wchar uint16
 | 
			
		||||
type short int16
 | 
			
		||||
type dword uint32
 | 
			
		||||
type word uint16
 | 
			
		||||
 | 
			
		||||
type coord struct {
 | 
			
		||||
	x short
 | 
			
		||||
	y short
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type smallRect struct {
 | 
			
		||||
	left   short
 | 
			
		||||
	top    short
 | 
			
		||||
	right  short
 | 
			
		||||
	bottom short
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type consoleScreenBufferInfo struct {
 | 
			
		||||
	size              coord
 | 
			
		||||
	cursorPosition    coord
 | 
			
		||||
	attributes        word
 | 
			
		||||
	window            smallRect
 | 
			
		||||
	maximumWindowSize coord
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type consoleCursorInfo struct {
 | 
			
		||||
	size    dword
 | 
			
		||||
	visible int32
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	kernel32                       = syscall.NewLazyDLL("kernel32.dll")
 | 
			
		||||
	procGetConsoleScreenBufferInfo = kernel32.NewProc("GetConsoleScreenBufferInfo")
 | 
			
		||||
	procSetConsoleTextAttribute    = kernel32.NewProc("SetConsoleTextAttribute")
 | 
			
		||||
	procSetConsoleCursorPosition   = kernel32.NewProc("SetConsoleCursorPosition")
 | 
			
		||||
	procFillConsoleOutputCharacter = kernel32.NewProc("FillConsoleOutputCharacterW")
 | 
			
		||||
	procFillConsoleOutputAttribute = kernel32.NewProc("FillConsoleOutputAttribute")
 | 
			
		||||
	procGetConsoleCursorInfo       = kernel32.NewProc("GetConsoleCursorInfo")
 | 
			
		||||
	procSetConsoleCursorInfo       = kernel32.NewProc("SetConsoleCursorInfo")
 | 
			
		||||
	procSetConsoleTitle            = kernel32.NewProc("SetConsoleTitleW")
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Writer provide colorable Writer to the console
 | 
			
		||||
type Writer struct {
 | 
			
		||||
	out     io.Writer
 | 
			
		||||
	handle  syscall.Handle
 | 
			
		||||
	oldattr word
 | 
			
		||||
	oldpos  coord
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewColorable return new instance of Writer which handle escape sequence from File.
 | 
			
		||||
func NewColorable(file *os.File) io.Writer {
 | 
			
		||||
	if file == nil {
 | 
			
		||||
		panic("nil passed instead of *os.File to NewColorable()")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if isatty.IsTerminal(file.Fd()) {
 | 
			
		||||
		var csbi consoleScreenBufferInfo
 | 
			
		||||
		handle := syscall.Handle(file.Fd())
 | 
			
		||||
		procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi)))
 | 
			
		||||
		return &Writer{out: file, handle: handle, oldattr: csbi.attributes, oldpos: coord{0, 0}}
 | 
			
		||||
	}
 | 
			
		||||
	return file
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewColorableStdout return new instance of Writer which handle escape sequence for stdout.
 | 
			
		||||
func NewColorableStdout() io.Writer {
 | 
			
		||||
	return NewColorable(os.Stdout)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewColorableStderr return new instance of Writer which handle escape sequence for stderr.
 | 
			
		||||
func NewColorableStderr() io.Writer {
 | 
			
		||||
	return NewColorable(os.Stderr)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var color256 = map[int]int{
 | 
			
		||||
	0:   0x000000,
 | 
			
		||||
	1:   0x800000,
 | 
			
		||||
	2:   0x008000,
 | 
			
		||||
	3:   0x808000,
 | 
			
		||||
	4:   0x000080,
 | 
			
		||||
	5:   0x800080,
 | 
			
		||||
	6:   0x008080,
 | 
			
		||||
	7:   0xc0c0c0,
 | 
			
		||||
	8:   0x808080,
 | 
			
		||||
	9:   0xff0000,
 | 
			
		||||
	10:  0x00ff00,
 | 
			
		||||
	11:  0xffff00,
 | 
			
		||||
	12:  0x0000ff,
 | 
			
		||||
	13:  0xff00ff,
 | 
			
		||||
	14:  0x00ffff,
 | 
			
		||||
	15:  0xffffff,
 | 
			
		||||
	16:  0x000000,
 | 
			
		||||
	17:  0x00005f,
 | 
			
		||||
	18:  0x000087,
 | 
			
		||||
	19:  0x0000af,
 | 
			
		||||
	20:  0x0000d7,
 | 
			
		||||
	21:  0x0000ff,
 | 
			
		||||
	22:  0x005f00,
 | 
			
		||||
	23:  0x005f5f,
 | 
			
		||||
	24:  0x005f87,
 | 
			
		||||
	25:  0x005faf,
 | 
			
		||||
	26:  0x005fd7,
 | 
			
		||||
	27:  0x005fff,
 | 
			
		||||
	28:  0x008700,
 | 
			
		||||
	29:  0x00875f,
 | 
			
		||||
	30:  0x008787,
 | 
			
		||||
	31:  0x0087af,
 | 
			
		||||
	32:  0x0087d7,
 | 
			
		||||
	33:  0x0087ff,
 | 
			
		||||
	34:  0x00af00,
 | 
			
		||||
	35:  0x00af5f,
 | 
			
		||||
	36:  0x00af87,
 | 
			
		||||
	37:  0x00afaf,
 | 
			
		||||
	38:  0x00afd7,
 | 
			
		||||
	39:  0x00afff,
 | 
			
		||||
	40:  0x00d700,
 | 
			
		||||
	41:  0x00d75f,
 | 
			
		||||
	42:  0x00d787,
 | 
			
		||||
	43:  0x00d7af,
 | 
			
		||||
	44:  0x00d7d7,
 | 
			
		||||
	45:  0x00d7ff,
 | 
			
		||||
	46:  0x00ff00,
 | 
			
		||||
	47:  0x00ff5f,
 | 
			
		||||
	48:  0x00ff87,
 | 
			
		||||
	49:  0x00ffaf,
 | 
			
		||||
	50:  0x00ffd7,
 | 
			
		||||
	51:  0x00ffff,
 | 
			
		||||
	52:  0x5f0000,
 | 
			
		||||
	53:  0x5f005f,
 | 
			
		||||
	54:  0x5f0087,
 | 
			
		||||
	55:  0x5f00af,
 | 
			
		||||
	56:  0x5f00d7,
 | 
			
		||||
	57:  0x5f00ff,
 | 
			
		||||
	58:  0x5f5f00,
 | 
			
		||||
	59:  0x5f5f5f,
 | 
			
		||||
	60:  0x5f5f87,
 | 
			
		||||
	61:  0x5f5faf,
 | 
			
		||||
	62:  0x5f5fd7,
 | 
			
		||||
	63:  0x5f5fff,
 | 
			
		||||
	64:  0x5f8700,
 | 
			
		||||
	65:  0x5f875f,
 | 
			
		||||
	66:  0x5f8787,
 | 
			
		||||
	67:  0x5f87af,
 | 
			
		||||
	68:  0x5f87d7,
 | 
			
		||||
	69:  0x5f87ff,
 | 
			
		||||
	70:  0x5faf00,
 | 
			
		||||
	71:  0x5faf5f,
 | 
			
		||||
	72:  0x5faf87,
 | 
			
		||||
	73:  0x5fafaf,
 | 
			
		||||
	74:  0x5fafd7,
 | 
			
		||||
	75:  0x5fafff,
 | 
			
		||||
	76:  0x5fd700,
 | 
			
		||||
	77:  0x5fd75f,
 | 
			
		||||
	78:  0x5fd787,
 | 
			
		||||
	79:  0x5fd7af,
 | 
			
		||||
	80:  0x5fd7d7,
 | 
			
		||||
	81:  0x5fd7ff,
 | 
			
		||||
	82:  0x5fff00,
 | 
			
		||||
	83:  0x5fff5f,
 | 
			
		||||
	84:  0x5fff87,
 | 
			
		||||
	85:  0x5fffaf,
 | 
			
		||||
	86:  0x5fffd7,
 | 
			
		||||
	87:  0x5fffff,
 | 
			
		||||
	88:  0x870000,
 | 
			
		||||
	89:  0x87005f,
 | 
			
		||||
	90:  0x870087,
 | 
			
		||||
	91:  0x8700af,
 | 
			
		||||
	92:  0x8700d7,
 | 
			
		||||
	93:  0x8700ff,
 | 
			
		||||
	94:  0x875f00,
 | 
			
		||||
	95:  0x875f5f,
 | 
			
		||||
	96:  0x875f87,
 | 
			
		||||
	97:  0x875faf,
 | 
			
		||||
	98:  0x875fd7,
 | 
			
		||||
	99:  0x875fff,
 | 
			
		||||
	100: 0x878700,
 | 
			
		||||
	101: 0x87875f,
 | 
			
		||||
	102: 0x878787,
 | 
			
		||||
	103: 0x8787af,
 | 
			
		||||
	104: 0x8787d7,
 | 
			
		||||
	105: 0x8787ff,
 | 
			
		||||
	106: 0x87af00,
 | 
			
		||||
	107: 0x87af5f,
 | 
			
		||||
	108: 0x87af87,
 | 
			
		||||
	109: 0x87afaf,
 | 
			
		||||
	110: 0x87afd7,
 | 
			
		||||
	111: 0x87afff,
 | 
			
		||||
	112: 0x87d700,
 | 
			
		||||
	113: 0x87d75f,
 | 
			
		||||
	114: 0x87d787,
 | 
			
		||||
	115: 0x87d7af,
 | 
			
		||||
	116: 0x87d7d7,
 | 
			
		||||
	117: 0x87d7ff,
 | 
			
		||||
	118: 0x87ff00,
 | 
			
		||||
	119: 0x87ff5f,
 | 
			
		||||
	120: 0x87ff87,
 | 
			
		||||
	121: 0x87ffaf,
 | 
			
		||||
	122: 0x87ffd7,
 | 
			
		||||
	123: 0x87ffff,
 | 
			
		||||
	124: 0xaf0000,
 | 
			
		||||
	125: 0xaf005f,
 | 
			
		||||
	126: 0xaf0087,
 | 
			
		||||
	127: 0xaf00af,
 | 
			
		||||
	128: 0xaf00d7,
 | 
			
		||||
	129: 0xaf00ff,
 | 
			
		||||
	130: 0xaf5f00,
 | 
			
		||||
	131: 0xaf5f5f,
 | 
			
		||||
	132: 0xaf5f87,
 | 
			
		||||
	133: 0xaf5faf,
 | 
			
		||||
	134: 0xaf5fd7,
 | 
			
		||||
	135: 0xaf5fff,
 | 
			
		||||
	136: 0xaf8700,
 | 
			
		||||
	137: 0xaf875f,
 | 
			
		||||
	138: 0xaf8787,
 | 
			
		||||
	139: 0xaf87af,
 | 
			
		||||
	140: 0xaf87d7,
 | 
			
		||||
	141: 0xaf87ff,
 | 
			
		||||
	142: 0xafaf00,
 | 
			
		||||
	143: 0xafaf5f,
 | 
			
		||||
	144: 0xafaf87,
 | 
			
		||||
	145: 0xafafaf,
 | 
			
		||||
	146: 0xafafd7,
 | 
			
		||||
	147: 0xafafff,
 | 
			
		||||
	148: 0xafd700,
 | 
			
		||||
	149: 0xafd75f,
 | 
			
		||||
	150: 0xafd787,
 | 
			
		||||
	151: 0xafd7af,
 | 
			
		||||
	152: 0xafd7d7,
 | 
			
		||||
	153: 0xafd7ff,
 | 
			
		||||
	154: 0xafff00,
 | 
			
		||||
	155: 0xafff5f,
 | 
			
		||||
	156: 0xafff87,
 | 
			
		||||
	157: 0xafffaf,
 | 
			
		||||
	158: 0xafffd7,
 | 
			
		||||
	159: 0xafffff,
 | 
			
		||||
	160: 0xd70000,
 | 
			
		||||
	161: 0xd7005f,
 | 
			
		||||
	162: 0xd70087,
 | 
			
		||||
	163: 0xd700af,
 | 
			
		||||
	164: 0xd700d7,
 | 
			
		||||
	165: 0xd700ff,
 | 
			
		||||
	166: 0xd75f00,
 | 
			
		||||
	167: 0xd75f5f,
 | 
			
		||||
	168: 0xd75f87,
 | 
			
		||||
	169: 0xd75faf,
 | 
			
		||||
	170: 0xd75fd7,
 | 
			
		||||
	171: 0xd75fff,
 | 
			
		||||
	172: 0xd78700,
 | 
			
		||||
	173: 0xd7875f,
 | 
			
		||||
	174: 0xd78787,
 | 
			
		||||
	175: 0xd787af,
 | 
			
		||||
	176: 0xd787d7,
 | 
			
		||||
	177: 0xd787ff,
 | 
			
		||||
	178: 0xd7af00,
 | 
			
		||||
	179: 0xd7af5f,
 | 
			
		||||
	180: 0xd7af87,
 | 
			
		||||
	181: 0xd7afaf,
 | 
			
		||||
	182: 0xd7afd7,
 | 
			
		||||
	183: 0xd7afff,
 | 
			
		||||
	184: 0xd7d700,
 | 
			
		||||
	185: 0xd7d75f,
 | 
			
		||||
	186: 0xd7d787,
 | 
			
		||||
	187: 0xd7d7af,
 | 
			
		||||
	188: 0xd7d7d7,
 | 
			
		||||
	189: 0xd7d7ff,
 | 
			
		||||
	190: 0xd7ff00,
 | 
			
		||||
	191: 0xd7ff5f,
 | 
			
		||||
	192: 0xd7ff87,
 | 
			
		||||
	193: 0xd7ffaf,
 | 
			
		||||
	194: 0xd7ffd7,
 | 
			
		||||
	195: 0xd7ffff,
 | 
			
		||||
	196: 0xff0000,
 | 
			
		||||
	197: 0xff005f,
 | 
			
		||||
	198: 0xff0087,
 | 
			
		||||
	199: 0xff00af,
 | 
			
		||||
	200: 0xff00d7,
 | 
			
		||||
	201: 0xff00ff,
 | 
			
		||||
	202: 0xff5f00,
 | 
			
		||||
	203: 0xff5f5f,
 | 
			
		||||
	204: 0xff5f87,
 | 
			
		||||
	205: 0xff5faf,
 | 
			
		||||
	206: 0xff5fd7,
 | 
			
		||||
	207: 0xff5fff,
 | 
			
		||||
	208: 0xff8700,
 | 
			
		||||
	209: 0xff875f,
 | 
			
		||||
	210: 0xff8787,
 | 
			
		||||
	211: 0xff87af,
 | 
			
		||||
	212: 0xff87d7,
 | 
			
		||||
	213: 0xff87ff,
 | 
			
		||||
	214: 0xffaf00,
 | 
			
		||||
	215: 0xffaf5f,
 | 
			
		||||
	216: 0xffaf87,
 | 
			
		||||
	217: 0xffafaf,
 | 
			
		||||
	218: 0xffafd7,
 | 
			
		||||
	219: 0xffafff,
 | 
			
		||||
	220: 0xffd700,
 | 
			
		||||
	221: 0xffd75f,
 | 
			
		||||
	222: 0xffd787,
 | 
			
		||||
	223: 0xffd7af,
 | 
			
		||||
	224: 0xffd7d7,
 | 
			
		||||
	225: 0xffd7ff,
 | 
			
		||||
	226: 0xffff00,
 | 
			
		||||
	227: 0xffff5f,
 | 
			
		||||
	228: 0xffff87,
 | 
			
		||||
	229: 0xffffaf,
 | 
			
		||||
	230: 0xffffd7,
 | 
			
		||||
	231: 0xffffff,
 | 
			
		||||
	232: 0x080808,
 | 
			
		||||
	233: 0x121212,
 | 
			
		||||
	234: 0x1c1c1c,
 | 
			
		||||
	235: 0x262626,
 | 
			
		||||
	236: 0x303030,
 | 
			
		||||
	237: 0x3a3a3a,
 | 
			
		||||
	238: 0x444444,
 | 
			
		||||
	239: 0x4e4e4e,
 | 
			
		||||
	240: 0x585858,
 | 
			
		||||
	241: 0x626262,
 | 
			
		||||
	242: 0x6c6c6c,
 | 
			
		||||
	243: 0x767676,
 | 
			
		||||
	244: 0x808080,
 | 
			
		||||
	245: 0x8a8a8a,
 | 
			
		||||
	246: 0x949494,
 | 
			
		||||
	247: 0x9e9e9e,
 | 
			
		||||
	248: 0xa8a8a8,
 | 
			
		||||
	249: 0xb2b2b2,
 | 
			
		||||
	250: 0xbcbcbc,
 | 
			
		||||
	251: 0xc6c6c6,
 | 
			
		||||
	252: 0xd0d0d0,
 | 
			
		||||
	253: 0xdadada,
 | 
			
		||||
	254: 0xe4e4e4,
 | 
			
		||||
	255: 0xeeeeee,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// `\033]0;TITLESTR\007`
 | 
			
		||||
func doTitleSequence(er *bytes.Reader) error {
 | 
			
		||||
	var c byte
 | 
			
		||||
	var err error
 | 
			
		||||
 | 
			
		||||
	c, err = er.ReadByte()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if c != '0' && c != '2' {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	c, err = er.ReadByte()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if c != ';' {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	title := make([]byte, 0, 80)
 | 
			
		||||
	for {
 | 
			
		||||
		c, err = er.ReadByte()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		if c == 0x07 || c == '\n' {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		title = append(title, c)
 | 
			
		||||
	}
 | 
			
		||||
	if len(title) > 0 {
 | 
			
		||||
		title8, err := syscall.UTF16PtrFromString(string(title))
 | 
			
		||||
		if err == nil {
 | 
			
		||||
			procSetConsoleTitle.Call(uintptr(unsafe.Pointer(title8)))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Write write data on console
 | 
			
		||||
func (w *Writer) Write(data []byte) (n int, err error) {
 | 
			
		||||
	var csbi consoleScreenBufferInfo
 | 
			
		||||
	procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))
 | 
			
		||||
 | 
			
		||||
	er := bytes.NewReader(data)
 | 
			
		||||
	var bw [1]byte
 | 
			
		||||
loop:
 | 
			
		||||
	for {
 | 
			
		||||
		c1, err := er.ReadByte()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			break loop
 | 
			
		||||
		}
 | 
			
		||||
		if c1 != 0x1b {
 | 
			
		||||
			bw[0] = c1
 | 
			
		||||
			w.out.Write(bw[:])
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		c2, err := er.ReadByte()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			break loop
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if c2 == ']' {
 | 
			
		||||
			if err := doTitleSequence(er); err != nil {
 | 
			
		||||
				break loop
 | 
			
		||||
			}
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		if c2 != 0x5b {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		var buf bytes.Buffer
 | 
			
		||||
		var m byte
 | 
			
		||||
		for {
 | 
			
		||||
			c, err := er.ReadByte()
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				break loop
 | 
			
		||||
			}
 | 
			
		||||
			if ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '@' {
 | 
			
		||||
				m = c
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
			buf.Write([]byte(string(c)))
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		switch m {
 | 
			
		||||
		case 'A':
 | 
			
		||||
			n, err = strconv.Atoi(buf.String())
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))
 | 
			
		||||
			csbi.cursorPosition.y -= short(n)
 | 
			
		||||
			procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition)))
 | 
			
		||||
		case 'B':
 | 
			
		||||
			n, err = strconv.Atoi(buf.String())
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))
 | 
			
		||||
			csbi.cursorPosition.y += short(n)
 | 
			
		||||
			procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition)))
 | 
			
		||||
		case 'C':
 | 
			
		||||
			n, err = strconv.Atoi(buf.String())
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))
 | 
			
		||||
			csbi.cursorPosition.x += short(n)
 | 
			
		||||
			procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition)))
 | 
			
		||||
		case 'D':
 | 
			
		||||
			n, err = strconv.Atoi(buf.String())
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))
 | 
			
		||||
			csbi.cursorPosition.x -= short(n)
 | 
			
		||||
			procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition)))
 | 
			
		||||
		case 'E':
 | 
			
		||||
			n, err = strconv.Atoi(buf.String())
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))
 | 
			
		||||
			csbi.cursorPosition.x = 0
 | 
			
		||||
			csbi.cursorPosition.y += short(n)
 | 
			
		||||
			procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition)))
 | 
			
		||||
		case 'F':
 | 
			
		||||
			n, err = strconv.Atoi(buf.String())
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))
 | 
			
		||||
			csbi.cursorPosition.x = 0
 | 
			
		||||
			csbi.cursorPosition.y -= short(n)
 | 
			
		||||
			procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition)))
 | 
			
		||||
		case 'G':
 | 
			
		||||
			n, err = strconv.Atoi(buf.String())
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))
 | 
			
		||||
			csbi.cursorPosition.x = short(n - 1)
 | 
			
		||||
			procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition)))
 | 
			
		||||
		case 'H', 'f':
 | 
			
		||||
			procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))
 | 
			
		||||
			if buf.Len() > 0 {
 | 
			
		||||
				token := strings.Split(buf.String(), ";")
 | 
			
		||||
				switch len(token) {
 | 
			
		||||
				case 1:
 | 
			
		||||
					n1, err := strconv.Atoi(token[0])
 | 
			
		||||
					if err != nil {
 | 
			
		||||
						continue
 | 
			
		||||
					}
 | 
			
		||||
					csbi.cursorPosition.y = short(n1 - 1)
 | 
			
		||||
				case 2:
 | 
			
		||||
					n1, err := strconv.Atoi(token[0])
 | 
			
		||||
					if err != nil {
 | 
			
		||||
						continue
 | 
			
		||||
					}
 | 
			
		||||
					n2, err := strconv.Atoi(token[1])
 | 
			
		||||
					if err != nil {
 | 
			
		||||
						continue
 | 
			
		||||
					}
 | 
			
		||||
					csbi.cursorPosition.x = short(n2 - 1)
 | 
			
		||||
					csbi.cursorPosition.y = short(n1 - 1)
 | 
			
		||||
				}
 | 
			
		||||
			} else {
 | 
			
		||||
				csbi.cursorPosition.y = 0
 | 
			
		||||
			}
 | 
			
		||||
			procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition)))
 | 
			
		||||
		case 'J':
 | 
			
		||||
			n := 0
 | 
			
		||||
			if buf.Len() > 0 {
 | 
			
		||||
				n, err = strconv.Atoi(buf.String())
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			var count, written dword
 | 
			
		||||
			var cursor coord
 | 
			
		||||
			procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))
 | 
			
		||||
			switch n {
 | 
			
		||||
			case 0:
 | 
			
		||||
				cursor = coord{x: csbi.cursorPosition.x, y: csbi.cursorPosition.y}
 | 
			
		||||
				count = dword(csbi.size.x - csbi.cursorPosition.x + (csbi.size.y-csbi.cursorPosition.y)*csbi.size.x)
 | 
			
		||||
			case 1:
 | 
			
		||||
				cursor = coord{x: csbi.window.left, y: csbi.window.top}
 | 
			
		||||
				count = dword(csbi.size.x - csbi.cursorPosition.x + (csbi.window.top-csbi.cursorPosition.y)*csbi.size.x)
 | 
			
		||||
			case 2:
 | 
			
		||||
				cursor = coord{x: csbi.window.left, y: csbi.window.top}
 | 
			
		||||
				count = dword(csbi.size.x - csbi.cursorPosition.x + (csbi.size.y-csbi.cursorPosition.y)*csbi.size.x)
 | 
			
		||||
			}
 | 
			
		||||
			procFillConsoleOutputCharacter.Call(uintptr(w.handle), uintptr(' '), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written)))
 | 
			
		||||
			procFillConsoleOutputAttribute.Call(uintptr(w.handle), uintptr(csbi.attributes), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written)))
 | 
			
		||||
		case 'K':
 | 
			
		||||
			n := 0
 | 
			
		||||
			if buf.Len() > 0 {
 | 
			
		||||
				n, err = strconv.Atoi(buf.String())
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))
 | 
			
		||||
			var cursor coord
 | 
			
		||||
			var count, written dword
 | 
			
		||||
			switch n {
 | 
			
		||||
			case 0:
 | 
			
		||||
				cursor = coord{x: csbi.cursorPosition.x + 1, y: csbi.cursorPosition.y}
 | 
			
		||||
				count = dword(csbi.size.x - csbi.cursorPosition.x - 1)
 | 
			
		||||
			case 1:
 | 
			
		||||
				cursor = coord{x: csbi.window.left, y: csbi.window.top + csbi.cursorPosition.y}
 | 
			
		||||
				count = dword(csbi.size.x - csbi.cursorPosition.x)
 | 
			
		||||
			case 2:
 | 
			
		||||
				cursor = coord{x: csbi.window.left, y: csbi.window.top + csbi.cursorPosition.y}
 | 
			
		||||
				count = dword(csbi.size.x)
 | 
			
		||||
			}
 | 
			
		||||
			procFillConsoleOutputCharacter.Call(uintptr(w.handle), uintptr(' '), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written)))
 | 
			
		||||
			procFillConsoleOutputAttribute.Call(uintptr(w.handle), uintptr(csbi.attributes), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written)))
 | 
			
		||||
		case 'm':
 | 
			
		||||
			procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))
 | 
			
		||||
			attr := csbi.attributes
 | 
			
		||||
			cs := buf.String()
 | 
			
		||||
			if cs == "" {
 | 
			
		||||
				procSetConsoleTextAttribute.Call(uintptr(w.handle), uintptr(w.oldattr))
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			token := strings.Split(cs, ";")
 | 
			
		||||
			for i := 0; i < len(token); i++ {
 | 
			
		||||
				ns := token[i]
 | 
			
		||||
				if n, err = strconv.Atoi(ns); err == nil {
 | 
			
		||||
					switch {
 | 
			
		||||
					case n == 0 || n == 100:
 | 
			
		||||
						attr = w.oldattr
 | 
			
		||||
					case 1 <= n && n <= 5:
 | 
			
		||||
						attr |= foregroundIntensity
 | 
			
		||||
					case n == 7:
 | 
			
		||||
						attr = ((attr & foregroundMask) << 4) | ((attr & backgroundMask) >> 4)
 | 
			
		||||
					case n == 22 || n == 25:
 | 
			
		||||
						attr |= foregroundIntensity
 | 
			
		||||
					case n == 27:
 | 
			
		||||
						attr = ((attr & foregroundMask) << 4) | ((attr & backgroundMask) >> 4)
 | 
			
		||||
					case 30 <= n && n <= 37:
 | 
			
		||||
						attr &= backgroundMask
 | 
			
		||||
						if (n-30)&1 != 0 {
 | 
			
		||||
							attr |= foregroundRed
 | 
			
		||||
						}
 | 
			
		||||
						if (n-30)&2 != 0 {
 | 
			
		||||
							attr |= foregroundGreen
 | 
			
		||||
						}
 | 
			
		||||
						if (n-30)&4 != 0 {
 | 
			
		||||
							attr |= foregroundBlue
 | 
			
		||||
						}
 | 
			
		||||
					case n == 38: // set foreground color.
 | 
			
		||||
						if i < len(token)-2 && (token[i+1] == "5" || token[i+1] == "05") {
 | 
			
		||||
							if n256, err := strconv.Atoi(token[i+2]); err == nil {
 | 
			
		||||
								if n256foreAttr == nil {
 | 
			
		||||
									n256setup()
 | 
			
		||||
								}
 | 
			
		||||
								attr &= backgroundMask
 | 
			
		||||
								attr |= n256foreAttr[n256]
 | 
			
		||||
								i += 2
 | 
			
		||||
							}
 | 
			
		||||
						} else {
 | 
			
		||||
							attr = attr & (w.oldattr & backgroundMask)
 | 
			
		||||
						}
 | 
			
		||||
					case n == 39: // reset foreground color.
 | 
			
		||||
						attr &= backgroundMask
 | 
			
		||||
						attr |= w.oldattr & foregroundMask
 | 
			
		||||
					case 40 <= n && n <= 47:
 | 
			
		||||
						attr &= foregroundMask
 | 
			
		||||
						if (n-40)&1 != 0 {
 | 
			
		||||
							attr |= backgroundRed
 | 
			
		||||
						}
 | 
			
		||||
						if (n-40)&2 != 0 {
 | 
			
		||||
							attr |= backgroundGreen
 | 
			
		||||
						}
 | 
			
		||||
						if (n-40)&4 != 0 {
 | 
			
		||||
							attr |= backgroundBlue
 | 
			
		||||
						}
 | 
			
		||||
					case n == 48: // set background color.
 | 
			
		||||
						if i < len(token)-2 && token[i+1] == "5" {
 | 
			
		||||
							if n256, err := strconv.Atoi(token[i+2]); err == nil {
 | 
			
		||||
								if n256backAttr == nil {
 | 
			
		||||
									n256setup()
 | 
			
		||||
								}
 | 
			
		||||
								attr &= foregroundMask
 | 
			
		||||
								attr |= n256backAttr[n256]
 | 
			
		||||
								i += 2
 | 
			
		||||
							}
 | 
			
		||||
						} else {
 | 
			
		||||
							attr = attr & (w.oldattr & foregroundMask)
 | 
			
		||||
						}
 | 
			
		||||
					case n == 49: // reset foreground color.
 | 
			
		||||
						attr &= foregroundMask
 | 
			
		||||
						attr |= w.oldattr & backgroundMask
 | 
			
		||||
					case 90 <= n && n <= 97:
 | 
			
		||||
						attr = (attr & backgroundMask)
 | 
			
		||||
						attr |= foregroundIntensity
 | 
			
		||||
						if (n-90)&1 != 0 {
 | 
			
		||||
							attr |= foregroundRed
 | 
			
		||||
						}
 | 
			
		||||
						if (n-90)&2 != 0 {
 | 
			
		||||
							attr |= foregroundGreen
 | 
			
		||||
						}
 | 
			
		||||
						if (n-90)&4 != 0 {
 | 
			
		||||
							attr |= foregroundBlue
 | 
			
		||||
						}
 | 
			
		||||
					case 100 <= n && n <= 107:
 | 
			
		||||
						attr = (attr & foregroundMask)
 | 
			
		||||
						attr |= backgroundIntensity
 | 
			
		||||
						if (n-100)&1 != 0 {
 | 
			
		||||
							attr |= backgroundRed
 | 
			
		||||
						}
 | 
			
		||||
						if (n-100)&2 != 0 {
 | 
			
		||||
							attr |= backgroundGreen
 | 
			
		||||
						}
 | 
			
		||||
						if (n-100)&4 != 0 {
 | 
			
		||||
							attr |= backgroundBlue
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
					procSetConsoleTextAttribute.Call(uintptr(w.handle), uintptr(attr))
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		case 'h':
 | 
			
		||||
			var ci consoleCursorInfo
 | 
			
		||||
			cs := buf.String()
 | 
			
		||||
			if cs == "5>" {
 | 
			
		||||
				procGetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci)))
 | 
			
		||||
				ci.visible = 0
 | 
			
		||||
				procSetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci)))
 | 
			
		||||
			} else if cs == "?25" {
 | 
			
		||||
				procGetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci)))
 | 
			
		||||
				ci.visible = 1
 | 
			
		||||
				procSetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci)))
 | 
			
		||||
			}
 | 
			
		||||
		case 'l':
 | 
			
		||||
			var ci consoleCursorInfo
 | 
			
		||||
			cs := buf.String()
 | 
			
		||||
			if cs == "5>" {
 | 
			
		||||
				procGetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci)))
 | 
			
		||||
				ci.visible = 1
 | 
			
		||||
				procSetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci)))
 | 
			
		||||
			} else if cs == "?25" {
 | 
			
		||||
				procGetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci)))
 | 
			
		||||
				ci.visible = 0
 | 
			
		||||
				procSetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci)))
 | 
			
		||||
			}
 | 
			
		||||
		case 's':
 | 
			
		||||
			procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))
 | 
			
		||||
			w.oldpos = csbi.cursorPosition
 | 
			
		||||
		case 'u':
 | 
			
		||||
			procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&w.oldpos)))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return len(data), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type consoleColor struct {
 | 
			
		||||
	rgb       int
 | 
			
		||||
	red       bool
 | 
			
		||||
	green     bool
 | 
			
		||||
	blue      bool
 | 
			
		||||
	intensity bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c consoleColor) foregroundAttr() (attr word) {
 | 
			
		||||
	if c.red {
 | 
			
		||||
		attr |= foregroundRed
 | 
			
		||||
	}
 | 
			
		||||
	if c.green {
 | 
			
		||||
		attr |= foregroundGreen
 | 
			
		||||
	}
 | 
			
		||||
	if c.blue {
 | 
			
		||||
		attr |= foregroundBlue
 | 
			
		||||
	}
 | 
			
		||||
	if c.intensity {
 | 
			
		||||
		attr |= foregroundIntensity
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c consoleColor) backgroundAttr() (attr word) {
 | 
			
		||||
	if c.red {
 | 
			
		||||
		attr |= backgroundRed
 | 
			
		||||
	}
 | 
			
		||||
	if c.green {
 | 
			
		||||
		attr |= backgroundGreen
 | 
			
		||||
	}
 | 
			
		||||
	if c.blue {
 | 
			
		||||
		attr |= backgroundBlue
 | 
			
		||||
	}
 | 
			
		||||
	if c.intensity {
 | 
			
		||||
		attr |= backgroundIntensity
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var color16 = []consoleColor{
 | 
			
		||||
	{0x000000, false, false, false, false},
 | 
			
		||||
	{0x000080, false, false, true, false},
 | 
			
		||||
	{0x008000, false, true, false, false},
 | 
			
		||||
	{0x008080, false, true, true, false},
 | 
			
		||||
	{0x800000, true, false, false, false},
 | 
			
		||||
	{0x800080, true, false, true, false},
 | 
			
		||||
	{0x808000, true, true, false, false},
 | 
			
		||||
	{0xc0c0c0, true, true, true, false},
 | 
			
		||||
	{0x808080, false, false, false, true},
 | 
			
		||||
	{0x0000ff, false, false, true, true},
 | 
			
		||||
	{0x00ff00, false, true, false, true},
 | 
			
		||||
	{0x00ffff, false, true, true, true},
 | 
			
		||||
	{0xff0000, true, false, false, true},
 | 
			
		||||
	{0xff00ff, true, false, true, true},
 | 
			
		||||
	{0xffff00, true, true, false, true},
 | 
			
		||||
	{0xffffff, true, true, true, true},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type hsv struct {
 | 
			
		||||
	h, s, v float32
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (a hsv) dist(b hsv) float32 {
 | 
			
		||||
	dh := a.h - b.h
 | 
			
		||||
	switch {
 | 
			
		||||
	case dh > 0.5:
 | 
			
		||||
		dh = 1 - dh
 | 
			
		||||
	case dh < -0.5:
 | 
			
		||||
		dh = -1 - dh
 | 
			
		||||
	}
 | 
			
		||||
	ds := a.s - b.s
 | 
			
		||||
	dv := a.v - b.v
 | 
			
		||||
	return float32(math.Sqrt(float64(dh*dh + ds*ds + dv*dv)))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func toHSV(rgb int) hsv {
 | 
			
		||||
	r, g, b := float32((rgb&0xFF0000)>>16)/256.0,
 | 
			
		||||
		float32((rgb&0x00FF00)>>8)/256.0,
 | 
			
		||||
		float32(rgb&0x0000FF)/256.0
 | 
			
		||||
	min, max := minmax3f(r, g, b)
 | 
			
		||||
	h := max - min
 | 
			
		||||
	if h > 0 {
 | 
			
		||||
		if max == r {
 | 
			
		||||
			h = (g - b) / h
 | 
			
		||||
			if h < 0 {
 | 
			
		||||
				h += 6
 | 
			
		||||
			}
 | 
			
		||||
		} else if max == g {
 | 
			
		||||
			h = 2 + (b-r)/h
 | 
			
		||||
		} else {
 | 
			
		||||
			h = 4 + (r-g)/h
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	h /= 6.0
 | 
			
		||||
	s := max - min
 | 
			
		||||
	if max != 0 {
 | 
			
		||||
		s /= max
 | 
			
		||||
	}
 | 
			
		||||
	v := max
 | 
			
		||||
	return hsv{h: h, s: s, v: v}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type hsvTable []hsv
 | 
			
		||||
 | 
			
		||||
func toHSVTable(rgbTable []consoleColor) hsvTable {
 | 
			
		||||
	t := make(hsvTable, len(rgbTable))
 | 
			
		||||
	for i, c := range rgbTable {
 | 
			
		||||
		t[i] = toHSV(c.rgb)
 | 
			
		||||
	}
 | 
			
		||||
	return t
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (t hsvTable) find(rgb int) consoleColor {
 | 
			
		||||
	hsv := toHSV(rgb)
 | 
			
		||||
	n := 7
 | 
			
		||||
	l := float32(5.0)
 | 
			
		||||
	for i, p := range t {
 | 
			
		||||
		d := hsv.dist(p)
 | 
			
		||||
		if d < l {
 | 
			
		||||
			l, n = d, i
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return color16[n]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func minmax3f(a, b, c float32) (min, max float32) {
 | 
			
		||||
	if a < b {
 | 
			
		||||
		if b < c {
 | 
			
		||||
			return a, c
 | 
			
		||||
		} else if a < c {
 | 
			
		||||
			return a, b
 | 
			
		||||
		} else {
 | 
			
		||||
			return c, b
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		if a < c {
 | 
			
		||||
			return b, c
 | 
			
		||||
		} else if b < c {
 | 
			
		||||
			return b, a
 | 
			
		||||
		} else {
 | 
			
		||||
			return c, a
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var n256foreAttr []word
 | 
			
		||||
var n256backAttr []word
 | 
			
		||||
 | 
			
		||||
func n256setup() {
 | 
			
		||||
	n256foreAttr = make([]word, 256)
 | 
			
		||||
	n256backAttr = make([]word, 256)
 | 
			
		||||
	t := toHSVTable(color16)
 | 
			
		||||
	for i, rgb := range color256 {
 | 
			
		||||
		c := t.find(rgb)
 | 
			
		||||
		n256foreAttr[i] = c.foregroundAttr()
 | 
			
		||||
		n256backAttr[i] = c.backgroundAttr()
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										55
									
								
								vendor/github.com/mattn/go-colorable/noncolorable.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								vendor/github.com/mattn/go-colorable/noncolorable.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,55 @@
 | 
			
		||||
package colorable
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"io"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// NonColorable hold writer but remove escape sequence.
 | 
			
		||||
type NonColorable struct {
 | 
			
		||||
	out io.Writer
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewNonColorable return new instance of Writer which remove escape sequence from Writer.
 | 
			
		||||
func NewNonColorable(w io.Writer) io.Writer {
 | 
			
		||||
	return &NonColorable{out: w}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Write write data on console
 | 
			
		||||
func (w *NonColorable) Write(data []byte) (n int, err error) {
 | 
			
		||||
	er := bytes.NewReader(data)
 | 
			
		||||
	var bw [1]byte
 | 
			
		||||
loop:
 | 
			
		||||
	for {
 | 
			
		||||
		c1, err := er.ReadByte()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			break loop
 | 
			
		||||
		}
 | 
			
		||||
		if c1 != 0x1b {
 | 
			
		||||
			bw[0] = c1
 | 
			
		||||
			w.out.Write(bw[:])
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		c2, err := er.ReadByte()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			break loop
 | 
			
		||||
		}
 | 
			
		||||
		if c2 != 0x5b {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		var buf bytes.Buffer
 | 
			
		||||
		for {
 | 
			
		||||
			c, err := er.ReadByte()
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				break loop
 | 
			
		||||
			}
 | 
			
		||||
			if ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '@' {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
			buf.Write([]byte(string(c)))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return len(data), nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										9
									
								
								vendor/github.com/mattn/go-isatty/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								vendor/github.com/mattn/go-isatty/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
language: go
 | 
			
		||||
go:
 | 
			
		||||
  - tip
 | 
			
		||||
 | 
			
		||||
before_install:
 | 
			
		||||
  - go get github.com/mattn/goveralls
 | 
			
		||||
  - go get golang.org/x/tools/cmd/cover
 | 
			
		||||
script:
 | 
			
		||||
  - $HOME/gopath/bin/goveralls -repotoken 3gHdORO5k5ziZcWMBxnd9LrMZaJs8m9x5
 | 
			
		||||
							
								
								
									
										43
									
								
								vendor/github.com/mattn/go-isatty/BUILD
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								vendor/github.com/mattn/go-isatty/BUILD
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
			
		||||
load("@io_bazel_rules_go//go:def.bzl", "go_library")
 | 
			
		||||
 | 
			
		||||
go_library(
 | 
			
		||||
    name = "go_default_library",
 | 
			
		||||
    srcs = [
 | 
			
		||||
        "doc.go",
 | 
			
		||||
        "isatty_bsd.go",
 | 
			
		||||
        "isatty_linux.go",
 | 
			
		||||
        "isatty_linux_ppc64x.go",
 | 
			
		||||
        "isatty_others.go",
 | 
			
		||||
        "isatty_solaris.go",
 | 
			
		||||
        "isatty_windows.go",
 | 
			
		||||
    ],
 | 
			
		||||
    importmap = "k8s.io/kubernetes/vendor/github.com/mattn/go-isatty",
 | 
			
		||||
    importpath = "github.com/mattn/go-isatty",
 | 
			
		||||
    visibility = ["//visibility:public"],
 | 
			
		||||
    deps = select({
 | 
			
		||||
        "@io_bazel_rules_go//go/platform:linux_ppc64": [
 | 
			
		||||
            "//vendor/golang.org/x/sys/unix:go_default_library",
 | 
			
		||||
        ],
 | 
			
		||||
        "@io_bazel_rules_go//go/platform:linux_ppc64le": [
 | 
			
		||||
            "//vendor/golang.org/x/sys/unix:go_default_library",
 | 
			
		||||
        ],
 | 
			
		||||
        "@io_bazel_rules_go//go/platform:solaris_amd64": [
 | 
			
		||||
            "//vendor/golang.org/x/sys/unix:go_default_library",
 | 
			
		||||
        ],
 | 
			
		||||
        "//conditions:default": [],
 | 
			
		||||
    }),
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
filegroup(
 | 
			
		||||
    name = "package-srcs",
 | 
			
		||||
    srcs = glob(["**"]),
 | 
			
		||||
    tags = ["automanaged"],
 | 
			
		||||
    visibility = ["//visibility:private"],
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
filegroup(
 | 
			
		||||
    name = "all-srcs",
 | 
			
		||||
    srcs = [":package-srcs"],
 | 
			
		||||
    tags = ["automanaged"],
 | 
			
		||||
    visibility = ["//visibility:public"],
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										9
									
								
								vendor/github.com/mattn/go-isatty/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								vendor/github.com/mattn/go-isatty/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
Copyright (c) Yasuhiro MATSUMOTO <mattn.jp@gmail.com>
 | 
			
		||||
 | 
			
		||||
MIT License (Expat)
 | 
			
		||||
 | 
			
		||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
							
								
								
									
										50
									
								
								vendor/github.com/mattn/go-isatty/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								vendor/github.com/mattn/go-isatty/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,50 @@
 | 
			
		||||
# go-isatty
 | 
			
		||||
 | 
			
		||||
[](http://godoc.org/github.com/mattn/go-isatty)
 | 
			
		||||
[](https://travis-ci.org/mattn/go-isatty)
 | 
			
		||||
[](https://coveralls.io/github/mattn/go-isatty?branch=master)
 | 
			
		||||
[](https://goreportcard.com/report/mattn/go-isatty)
 | 
			
		||||
 | 
			
		||||
isatty for golang
 | 
			
		||||
 | 
			
		||||
## Usage
 | 
			
		||||
 | 
			
		||||
```go
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/mattn/go-isatty"
 | 
			
		||||
	"os"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	if isatty.IsTerminal(os.Stdout.Fd()) {
 | 
			
		||||
		fmt.Println("Is Terminal")
 | 
			
		||||
	} else if isatty.IsCygwinTerminal(os.Stdout.Fd()) {
 | 
			
		||||
		fmt.Println("Is Cygwin/MSYS2 Terminal")
 | 
			
		||||
	} else {
 | 
			
		||||
		fmt.Println("Is Not Terminal")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Installation
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
$ go get github.com/mattn/go-isatty
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## License
 | 
			
		||||
 | 
			
		||||
MIT
 | 
			
		||||
 | 
			
		||||
## Author
 | 
			
		||||
 | 
			
		||||
Yasuhiro Matsumoto (a.k.a mattn)
 | 
			
		||||
 | 
			
		||||
## Thanks
 | 
			
		||||
 | 
			
		||||
* k-takata: base idea for IsCygwinTerminal
 | 
			
		||||
 | 
			
		||||
    https://github.com/k-takata/go-iscygpty
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/github.com/mattn/go-isatty/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/mattn/go-isatty/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
			
		||||
// Package isatty implements interface to isatty
 | 
			
		||||
package isatty
 | 
			
		||||
							
								
								
									
										15
									
								
								vendor/github.com/mattn/go-isatty/isatty_appengine.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								vendor/github.com/mattn/go-isatty/isatty_appengine.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
// +build appengine
 | 
			
		||||
 | 
			
		||||
package isatty
 | 
			
		||||
 | 
			
		||||
// IsTerminal returns true if the file descriptor is terminal which
 | 
			
		||||
// is always false on on appengine classic which is a sandboxed PaaS.
 | 
			
		||||
func IsTerminal(fd uintptr) bool {
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsCygwinTerminal() return true if the file descriptor is a cygwin or msys2
 | 
			
		||||
// terminal. This is also always false on this environment.
 | 
			
		||||
func IsCygwinTerminal(fd uintptr) bool {
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										18
									
								
								vendor/github.com/mattn/go-isatty/isatty_bsd.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								vendor/github.com/mattn/go-isatty/isatty_bsd.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
// +build darwin freebsd openbsd netbsd dragonfly
 | 
			
		||||
// +build !appengine
 | 
			
		||||
 | 
			
		||||
package isatty
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"syscall"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const ioctlReadTermios = syscall.TIOCGETA
 | 
			
		||||
 | 
			
		||||
// IsTerminal return true if the file descriptor is terminal.
 | 
			
		||||
func IsTerminal(fd uintptr) bool {
 | 
			
		||||
	var termios syscall.Termios
 | 
			
		||||
	_, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0)
 | 
			
		||||
	return err == 0
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										18
									
								
								vendor/github.com/mattn/go-isatty/isatty_linux.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								vendor/github.com/mattn/go-isatty/isatty_linux.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
// +build linux
 | 
			
		||||
// +build !appengine,!ppc64,!ppc64le
 | 
			
		||||
 | 
			
		||||
package isatty
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"syscall"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const ioctlReadTermios = syscall.TCGETS
 | 
			
		||||
 | 
			
		||||
// IsTerminal return true if the file descriptor is terminal.
 | 
			
		||||
func IsTerminal(fd uintptr) bool {
 | 
			
		||||
	var termios syscall.Termios
 | 
			
		||||
	_, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0)
 | 
			
		||||
	return err == 0
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										19
									
								
								vendor/github.com/mattn/go-isatty/isatty_linux_ppc64x.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								vendor/github.com/mattn/go-isatty/isatty_linux_ppc64x.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
// +build linux
 | 
			
		||||
// +build ppc64 ppc64le
 | 
			
		||||
 | 
			
		||||
package isatty
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"unsafe"
 | 
			
		||||
 | 
			
		||||
	syscall "golang.org/x/sys/unix"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const ioctlReadTermios = syscall.TCGETS
 | 
			
		||||
 | 
			
		||||
// IsTerminal return true if the file descriptor is terminal.
 | 
			
		||||
func IsTerminal(fd uintptr) bool {
 | 
			
		||||
	var termios syscall.Termios
 | 
			
		||||
	_, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0)
 | 
			
		||||
	return err == 0
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										10
									
								
								vendor/github.com/mattn/go-isatty/isatty_others.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								vendor/github.com/mattn/go-isatty/isatty_others.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
// +build !windows
 | 
			
		||||
// +build !appengine
 | 
			
		||||
 | 
			
		||||
package isatty
 | 
			
		||||
 | 
			
		||||
// IsCygwinTerminal() return true if the file descriptor is a cygwin or msys2
 | 
			
		||||
// terminal. This is also always false on this environment.
 | 
			
		||||
func IsCygwinTerminal(fd uintptr) bool {
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										16
									
								
								vendor/github.com/mattn/go-isatty/isatty_solaris.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/mattn/go-isatty/isatty_solaris.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
			
		||||
// +build solaris
 | 
			
		||||
// +build !appengine
 | 
			
		||||
 | 
			
		||||
package isatty
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"golang.org/x/sys/unix"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// IsTerminal returns true if the given file descriptor is a terminal.
 | 
			
		||||
// see: http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libbc/libc/gen/common/isatty.c
 | 
			
		||||
func IsTerminal(fd uintptr) bool {
 | 
			
		||||
	var termio unix.Termio
 | 
			
		||||
	err := unix.IoctlSetTermio(int(fd), unix.TCGETA, &termio)
 | 
			
		||||
	return err == nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										94
									
								
								vendor/github.com/mattn/go-isatty/isatty_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								vendor/github.com/mattn/go-isatty/isatty_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,94 @@
 | 
			
		||||
// +build windows
 | 
			
		||||
// +build !appengine
 | 
			
		||||
 | 
			
		||||
package isatty
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"strings"
 | 
			
		||||
	"syscall"
 | 
			
		||||
	"unicode/utf16"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	fileNameInfo uintptr = 2
 | 
			
		||||
	fileTypePipe         = 3
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	kernel32                         = syscall.NewLazyDLL("kernel32.dll")
 | 
			
		||||
	procGetConsoleMode               = kernel32.NewProc("GetConsoleMode")
 | 
			
		||||
	procGetFileInformationByHandleEx = kernel32.NewProc("GetFileInformationByHandleEx")
 | 
			
		||||
	procGetFileType                  = kernel32.NewProc("GetFileType")
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	// Check if GetFileInformationByHandleEx is available.
 | 
			
		||||
	if procGetFileInformationByHandleEx.Find() != nil {
 | 
			
		||||
		procGetFileInformationByHandleEx = nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsTerminal return true if the file descriptor is terminal.
 | 
			
		||||
func IsTerminal(fd uintptr) bool {
 | 
			
		||||
	var st uint32
 | 
			
		||||
	r, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, fd, uintptr(unsafe.Pointer(&st)), 0)
 | 
			
		||||
	return r != 0 && e == 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Check pipe name is used for cygwin/msys2 pty.
 | 
			
		||||
// Cygwin/MSYS2 PTY has a name like:
 | 
			
		||||
//   \{cygwin,msys}-XXXXXXXXXXXXXXXX-ptyN-{from,to}-master
 | 
			
		||||
func isCygwinPipeName(name string) bool {
 | 
			
		||||
	token := strings.Split(name, "-")
 | 
			
		||||
	if len(token) < 5 {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if token[0] != `\msys` && token[0] != `\cygwin` {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if token[1] == "" {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !strings.HasPrefix(token[2], "pty") {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if token[3] != `from` && token[3] != `to` {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if token[4] != "master" {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsCygwinTerminal() return true if the file descriptor is a cygwin or msys2
 | 
			
		||||
// terminal.
 | 
			
		||||
func IsCygwinTerminal(fd uintptr) bool {
 | 
			
		||||
	if procGetFileInformationByHandleEx == nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Cygwin/msys's pty is a pipe.
 | 
			
		||||
	ft, _, e := syscall.Syscall(procGetFileType.Addr(), 1, fd, 0, 0)
 | 
			
		||||
	if ft != fileTypePipe || e != 0 {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var buf [2 + syscall.MAX_PATH]uint16
 | 
			
		||||
	r, _, e := syscall.Syscall6(procGetFileInformationByHandleEx.Addr(),
 | 
			
		||||
		4, fd, fileNameInfo, uintptr(unsafe.Pointer(&buf)),
 | 
			
		||||
		uintptr(len(buf)*2), 0, 0)
 | 
			
		||||
	if r == 0 || e != 0 {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	l := *(*uint32)(unsafe.Pointer(&buf))
 | 
			
		||||
	return isCygwinPipeName(string(utf16.Decode(buf[2 : 2+l/2])))
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user