mirror of
https://github.com/Luzifer/git-changerelease.git
synced 2024-12-20 19:11:17 +00:00
Remove old vendoring
Signed-off-by: Knut Ahlers <knut@ahlers.me>
This commit is contained in:
parent
91a6088d35
commit
1c97cf1776
321 changed files with 0 additions and 184055 deletions
60
Gopkg.lock
generated
60
Gopkg.lock
generated
|
@ -1,60 +0,0 @@
|
||||||
# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
|
|
||||||
|
|
||||||
|
|
||||||
[[projects]]
|
|
||||||
name = "github.com/Luzifer/rconfig"
|
|
||||||
packages = ["."]
|
|
||||||
revision = "7aef1d393c1e2d0758901853b59981c7adc67c7e"
|
|
||||||
version = "v1.2.0"
|
|
||||||
|
|
||||||
[[projects]]
|
|
||||||
branch = "master"
|
|
||||||
name = "github.com/mitchellh/go-homedir"
|
|
||||||
packages = ["."]
|
|
||||||
revision = "3864e76763d94a6df2f9960b16a20a33da9f9a66"
|
|
||||||
|
|
||||||
[[projects]]
|
|
||||||
name = "github.com/sirupsen/logrus"
|
|
||||||
packages = ["."]
|
|
||||||
revision = "c155da19408a8799da419ed3eeb0cb5db0ad5dbc"
|
|
||||||
version = "v1.0.5"
|
|
||||||
|
|
||||||
[[projects]]
|
|
||||||
name = "github.com/spf13/pflag"
|
|
||||||
packages = ["."]
|
|
||||||
revision = "583c0c0531f06d5278b7d917446061adc344b5cd"
|
|
||||||
version = "v1.0.1"
|
|
||||||
|
|
||||||
[[projects]]
|
|
||||||
branch = "master"
|
|
||||||
name = "golang.org/x/crypto"
|
|
||||||
packages = ["ssh/terminal"]
|
|
||||||
revision = "a49355c7e3f8fe157a85be2f77e6e269a0f89602"
|
|
||||||
|
|
||||||
[[projects]]
|
|
||||||
branch = "master"
|
|
||||||
name = "golang.org/x/sys"
|
|
||||||
packages = [
|
|
||||||
"unix",
|
|
||||||
"windows"
|
|
||||||
]
|
|
||||||
revision = "7138fd3d9dc8335c567ca206f4333fb75eb05d56"
|
|
||||||
|
|
||||||
[[projects]]
|
|
||||||
branch = "v2"
|
|
||||||
name = "gopkg.in/validator.v2"
|
|
||||||
packages = ["."]
|
|
||||||
revision = "135c24b11c19e52befcae2ec3fca5d9b78c4e98e"
|
|
||||||
|
|
||||||
[[projects]]
|
|
||||||
name = "gopkg.in/yaml.v2"
|
|
||||||
packages = ["."]
|
|
||||||
revision = "5420a8b6744d3b0345ab293f6fcba19c978f1183"
|
|
||||||
version = "v2.2.1"
|
|
||||||
|
|
||||||
[solve-meta]
|
|
||||||
analyzer-name = "dep"
|
|
||||||
analyzer-version = 1
|
|
||||||
inputs-digest = "f1067dd3b049942f099b1581491272b5da14bad7d7d5ad225e72c185ba0a314e"
|
|
||||||
solver-name = "gps-cdcl"
|
|
||||||
solver-version = 1
|
|
47
Gopkg.toml
47
Gopkg.toml
|
@ -1,47 +0,0 @@
|
||||||
# Gopkg.toml example
|
|
||||||
#
|
|
||||||
# Refer to https://golang.github.io/dep/docs/Gopkg.toml.html
|
|
||||||
# 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"
|
|
||||||
#
|
|
||||||
# [prune]
|
|
||||||
# non-go = false
|
|
||||||
# go-tests = true
|
|
||||||
# unused-packages = true
|
|
||||||
|
|
||||||
|
|
||||||
[[constraint]]
|
|
||||||
name = "github.com/Luzifer/rconfig"
|
|
||||||
version = "1.2.0"
|
|
||||||
|
|
||||||
[[constraint]]
|
|
||||||
branch = "master"
|
|
||||||
name = "github.com/mitchellh/go-homedir"
|
|
||||||
|
|
||||||
[[constraint]]
|
|
||||||
name = "github.com/sirupsen/logrus"
|
|
||||||
version = "1.0.5"
|
|
||||||
|
|
||||||
[[constraint]]
|
|
||||||
name = "gopkg.in/yaml.v2"
|
|
||||||
version = "2.2.1"
|
|
||||||
|
|
||||||
[prune]
|
|
||||||
non-go = true
|
|
||||||
go-tests = true
|
|
||||||
unused-packages = true
|
|
13
vendor/github.com/Luzifer/rconfig/LICENSE
generated
vendored
13
vendor/github.com/Luzifer/rconfig/LICENSE
generated
vendored
|
@ -1,13 +0,0 @@
|
||||||
Copyright 2015 Knut Ahlers <knut@ahlers.me>
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
356
vendor/github.com/Luzifer/rconfig/config.go
generated
vendored
356
vendor/github.com/Luzifer/rconfig/config.go
generated
vendored
|
@ -1,356 +0,0 @@
|
||||||
// Package rconfig implements a CLI configuration reader with struct-embedded
|
|
||||||
// defaults, environment variables and posix compatible flag parsing using
|
|
||||||
// the pflag library.
|
|
||||||
package rconfig
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
"reflect"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/spf13/pflag"
|
|
||||||
validator "gopkg.in/validator.v2"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
fs *pflag.FlagSet
|
|
||||||
variableDefaults map[string]string
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
variableDefaults = make(map[string]string)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse takes the pointer to a struct filled with variables which should be read
|
|
||||||
// from ENV, default or flag. The precedence in this is flag > ENV > default. So
|
|
||||||
// if a flag is specified on the CLI it will overwrite the ENV and otherwise ENV
|
|
||||||
// overwrites the default specified.
|
|
||||||
//
|
|
||||||
// For your configuration struct you can use the following struct-tags to control
|
|
||||||
// the behavior of rconfig:
|
|
||||||
//
|
|
||||||
// default: Set a default value
|
|
||||||
// vardefault: Read the default value from the variable defaults
|
|
||||||
// env: Read the value from this environment variable
|
|
||||||
// flag: Flag to read in format "long,short" (for example "listen,l")
|
|
||||||
// description: A help text for Usage output to guide your users
|
|
||||||
//
|
|
||||||
// The format you need to specify those values you can see in the example to this
|
|
||||||
// function.
|
|
||||||
//
|
|
||||||
func Parse(config interface{}) error {
|
|
||||||
return parse(config, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ParseAndValidate works exactly like Parse but implements an additional run of
|
|
||||||
// the go-validator package on the configuration struct. Therefore additonal struct
|
|
||||||
// tags are supported like described in the readme file of the go-validator package:
|
|
||||||
//
|
|
||||||
// https://github.com/go-validator/validator/tree/v2#usage
|
|
||||||
func ParseAndValidate(config interface{}) error {
|
|
||||||
return parseAndValidate(config, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Args returns the non-flag command-line arguments.
|
|
||||||
func Args() []string {
|
|
||||||
return fs.Args()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Usage prints a basic usage with the corresponding defaults for the flags to
|
|
||||||
// os.Stdout. The defaults are derived from the `default` struct-tag and the ENV.
|
|
||||||
func Usage() {
|
|
||||||
if fs != nil && fs.Parsed() {
|
|
||||||
fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
|
|
||||||
fs.PrintDefaults()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetVariableDefaults presets the parser with a map of default values to be used
|
|
||||||
// when specifying the vardefault tag
|
|
||||||
func SetVariableDefaults(defaults map[string]string) {
|
|
||||||
variableDefaults = defaults
|
|
||||||
}
|
|
||||||
|
|
||||||
func parseAndValidate(in interface{}, args []string) error {
|
|
||||||
if err := parse(in, args); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return validator.Validate(in)
|
|
||||||
}
|
|
||||||
|
|
||||||
func parse(in interface{}, args []string) error {
|
|
||||||
if args == nil {
|
|
||||||
args = os.Args
|
|
||||||
}
|
|
||||||
|
|
||||||
fs = pflag.NewFlagSet(os.Args[0], pflag.ExitOnError)
|
|
||||||
if err := execTags(in, fs); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return fs.Parse(args)
|
|
||||||
}
|
|
||||||
|
|
||||||
func execTags(in interface{}, fs *pflag.FlagSet) error {
|
|
||||||
if reflect.TypeOf(in).Kind() != reflect.Ptr {
|
|
||||||
return errors.New("Calling parser with non-pointer")
|
|
||||||
}
|
|
||||||
|
|
||||||
if reflect.ValueOf(in).Elem().Kind() != reflect.Struct {
|
|
||||||
return errors.New("Calling parser with pointer to non-struct")
|
|
||||||
}
|
|
||||||
|
|
||||||
st := reflect.ValueOf(in).Elem()
|
|
||||||
for i := 0; i < st.NumField(); i++ {
|
|
||||||
valField := st.Field(i)
|
|
||||||
typeField := st.Type().Field(i)
|
|
||||||
|
|
||||||
if typeField.Tag.Get("default") == "" && typeField.Tag.Get("env") == "" && typeField.Tag.Get("flag") == "" && typeField.Type.Kind() != reflect.Struct {
|
|
||||||
// None of our supported tags is present and it's not a sub-struct
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
value := varDefault(typeField.Tag.Get("vardefault"), typeField.Tag.Get("default"))
|
|
||||||
value = envDefault(typeField.Tag.Get("env"), value)
|
|
||||||
parts := strings.Split(typeField.Tag.Get("flag"), ",")
|
|
||||||
|
|
||||||
switch typeField.Type {
|
|
||||||
case reflect.TypeOf(time.Duration(0)):
|
|
||||||
v, err := time.ParseDuration(value)
|
|
||||||
if err != nil {
|
|
||||||
if value == "" {
|
|
||||||
v = time.Duration(0)
|
|
||||||
} else {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if typeField.Tag.Get("flag") != "" {
|
|
||||||
if len(parts) == 1 {
|
|
||||||
fs.DurationVar(valField.Addr().Interface().(*time.Duration), parts[0], v, typeField.Tag.Get("description"))
|
|
||||||
} else {
|
|
||||||
fs.DurationVarP(valField.Addr().Interface().(*time.Duration), parts[0], parts[1], v, typeField.Tag.Get("description"))
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
valField.Set(reflect.ValueOf(v))
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
switch typeField.Type.Kind() {
|
|
||||||
case reflect.String:
|
|
||||||
if typeField.Tag.Get("flag") != "" {
|
|
||||||
if len(parts) == 1 {
|
|
||||||
fs.StringVar(valField.Addr().Interface().(*string), parts[0], value, typeField.Tag.Get("description"))
|
|
||||||
} else {
|
|
||||||
fs.StringVarP(valField.Addr().Interface().(*string), parts[0], parts[1], value, typeField.Tag.Get("description"))
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
valField.SetString(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
case reflect.Bool:
|
|
||||||
v := value == "true"
|
|
||||||
if typeField.Tag.Get("flag") != "" {
|
|
||||||
if len(parts) == 1 {
|
|
||||||
fs.BoolVar(valField.Addr().Interface().(*bool), parts[0], v, typeField.Tag.Get("description"))
|
|
||||||
} else {
|
|
||||||
fs.BoolVarP(valField.Addr().Interface().(*bool), parts[0], parts[1], v, typeField.Tag.Get("description"))
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
valField.SetBool(v)
|
|
||||||
}
|
|
||||||
|
|
||||||
case reflect.Int, reflect.Int8, reflect.Int32, reflect.Int64:
|
|
||||||
vt, err := strconv.ParseInt(value, 10, 64)
|
|
||||||
if err != nil {
|
|
||||||
if value == "" {
|
|
||||||
vt = 0
|
|
||||||
} else {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if typeField.Tag.Get("flag") != "" {
|
|
||||||
registerFlagInt(typeField.Type.Kind(), fs, valField.Addr().Interface(), parts, vt, typeField.Tag.Get("description"))
|
|
||||||
} else {
|
|
||||||
valField.SetInt(vt)
|
|
||||||
}
|
|
||||||
|
|
||||||
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
|
|
||||||
vt, err := strconv.ParseUint(value, 10, 64)
|
|
||||||
if err != nil {
|
|
||||||
if value == "" {
|
|
||||||
vt = 0
|
|
||||||
} else {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if typeField.Tag.Get("flag") != "" {
|
|
||||||
registerFlagUint(typeField.Type.Kind(), fs, valField.Addr().Interface(), parts, vt, typeField.Tag.Get("description"))
|
|
||||||
} else {
|
|
||||||
valField.SetUint(vt)
|
|
||||||
}
|
|
||||||
|
|
||||||
case reflect.Float32, reflect.Float64:
|
|
||||||
vt, err := strconv.ParseFloat(value, 64)
|
|
||||||
if err != nil {
|
|
||||||
if value == "" {
|
|
||||||
vt = 0.0
|
|
||||||
} else {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if typeField.Tag.Get("flag") != "" {
|
|
||||||
registerFlagFloat(typeField.Type.Kind(), fs, valField.Addr().Interface(), parts, vt, typeField.Tag.Get("description"))
|
|
||||||
} else {
|
|
||||||
valField.SetFloat(vt)
|
|
||||||
}
|
|
||||||
|
|
||||||
case reflect.Struct:
|
|
||||||
if err := execTags(valField.Addr().Interface(), fs); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
case reflect.Slice:
|
|
||||||
switch typeField.Type.Elem().Kind() {
|
|
||||||
case reflect.Int:
|
|
||||||
def := []int{}
|
|
||||||
for _, v := range strings.Split(value, ",") {
|
|
||||||
it, err := strconv.ParseInt(strings.TrimSpace(v), 10, 64)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
def = append(def, int(it))
|
|
||||||
}
|
|
||||||
if len(parts) == 1 {
|
|
||||||
fs.IntSliceVar(valField.Addr().Interface().(*[]int), parts[0], def, typeField.Tag.Get("description"))
|
|
||||||
} else {
|
|
||||||
fs.IntSliceVarP(valField.Addr().Interface().(*[]int), parts[0], parts[1], def, typeField.Tag.Get("description"))
|
|
||||||
}
|
|
||||||
case reflect.String:
|
|
||||||
del := typeField.Tag.Get("delimiter")
|
|
||||||
if len(del) == 0 {
|
|
||||||
del = ","
|
|
||||||
}
|
|
||||||
def := strings.Split(value, del)
|
|
||||||
if len(parts) == 1 {
|
|
||||||
fs.StringSliceVar(valField.Addr().Interface().(*[]string), parts[0], def, typeField.Tag.Get("description"))
|
|
||||||
} else {
|
|
||||||
fs.StringSliceVarP(valField.Addr().Interface().(*[]string), parts[0], parts[1], def, typeField.Tag.Get("description"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func registerFlagFloat(t reflect.Kind, fs *pflag.FlagSet, field interface{}, parts []string, vt float64, desc string) {
|
|
||||||
switch t {
|
|
||||||
case reflect.Float32:
|
|
||||||
if len(parts) == 1 {
|
|
||||||
fs.Float32Var(field.(*float32), parts[0], float32(vt), desc)
|
|
||||||
} else {
|
|
||||||
fs.Float32VarP(field.(*float32), parts[0], parts[1], float32(vt), desc)
|
|
||||||
}
|
|
||||||
case reflect.Float64:
|
|
||||||
if len(parts) == 1 {
|
|
||||||
fs.Float64Var(field.(*float64), parts[0], float64(vt), desc)
|
|
||||||
} else {
|
|
||||||
fs.Float64VarP(field.(*float64), parts[0], parts[1], float64(vt), desc)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func registerFlagInt(t reflect.Kind, fs *pflag.FlagSet, field interface{}, parts []string, vt int64, desc string) {
|
|
||||||
switch t {
|
|
||||||
case reflect.Int:
|
|
||||||
if len(parts) == 1 {
|
|
||||||
fs.IntVar(field.(*int), parts[0], int(vt), desc)
|
|
||||||
} else {
|
|
||||||
fs.IntVarP(field.(*int), parts[0], parts[1], int(vt), desc)
|
|
||||||
}
|
|
||||||
case reflect.Int8:
|
|
||||||
if len(parts) == 1 {
|
|
||||||
fs.Int8Var(field.(*int8), parts[0], int8(vt), desc)
|
|
||||||
} else {
|
|
||||||
fs.Int8VarP(field.(*int8), parts[0], parts[1], int8(vt), desc)
|
|
||||||
}
|
|
||||||
case reflect.Int32:
|
|
||||||
if len(parts) == 1 {
|
|
||||||
fs.Int32Var(field.(*int32), parts[0], int32(vt), desc)
|
|
||||||
} else {
|
|
||||||
fs.Int32VarP(field.(*int32), parts[0], parts[1], int32(vt), desc)
|
|
||||||
}
|
|
||||||
case reflect.Int64:
|
|
||||||
if len(parts) == 1 {
|
|
||||||
fs.Int64Var(field.(*int64), parts[0], int64(vt), desc)
|
|
||||||
} else {
|
|
||||||
fs.Int64VarP(field.(*int64), parts[0], parts[1], int64(vt), desc)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func registerFlagUint(t reflect.Kind, fs *pflag.FlagSet, field interface{}, parts []string, vt uint64, desc string) {
|
|
||||||
switch t {
|
|
||||||
case reflect.Uint:
|
|
||||||
if len(parts) == 1 {
|
|
||||||
fs.UintVar(field.(*uint), parts[0], uint(vt), desc)
|
|
||||||
} else {
|
|
||||||
fs.UintVarP(field.(*uint), parts[0], parts[1], uint(vt), desc)
|
|
||||||
}
|
|
||||||
case reflect.Uint8:
|
|
||||||
if len(parts) == 1 {
|
|
||||||
fs.Uint8Var(field.(*uint8), parts[0], uint8(vt), desc)
|
|
||||||
} else {
|
|
||||||
fs.Uint8VarP(field.(*uint8), parts[0], parts[1], uint8(vt), desc)
|
|
||||||
}
|
|
||||||
case reflect.Uint16:
|
|
||||||
if len(parts) == 1 {
|
|
||||||
fs.Uint16Var(field.(*uint16), parts[0], uint16(vt), desc)
|
|
||||||
} else {
|
|
||||||
fs.Uint16VarP(field.(*uint16), parts[0], parts[1], uint16(vt), desc)
|
|
||||||
}
|
|
||||||
case reflect.Uint32:
|
|
||||||
if len(parts) == 1 {
|
|
||||||
fs.Uint32Var(field.(*uint32), parts[0], uint32(vt), desc)
|
|
||||||
} else {
|
|
||||||
fs.Uint32VarP(field.(*uint32), parts[0], parts[1], uint32(vt), desc)
|
|
||||||
}
|
|
||||||
case reflect.Uint64:
|
|
||||||
if len(parts) == 1 {
|
|
||||||
fs.Uint64Var(field.(*uint64), parts[0], uint64(vt), desc)
|
|
||||||
} else {
|
|
||||||
fs.Uint64VarP(field.(*uint64), parts[0], parts[1], uint64(vt), desc)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func envDefault(env, def string) string {
|
|
||||||
value := def
|
|
||||||
|
|
||||||
if env != "" {
|
|
||||||
if e := os.Getenv(env); e != "" {
|
|
||||||
value = e
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return value
|
|
||||||
}
|
|
||||||
|
|
||||||
func varDefault(name, def string) string {
|
|
||||||
value := def
|
|
||||||
|
|
||||||
if name != "" {
|
|
||||||
if v, ok := variableDefaults[name]; ok {
|
|
||||||
value = v
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return value
|
|
||||||
}
|
|
27
vendor/github.com/Luzifer/rconfig/vardefault_providers.go
generated
vendored
27
vendor/github.com/Luzifer/rconfig/vardefault_providers.go
generated
vendored
|
@ -1,27 +0,0 @@
|
||||||
package rconfig
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io/ioutil"
|
|
||||||
|
|
||||||
"gopkg.in/yaml.v2"
|
|
||||||
)
|
|
||||||
|
|
||||||
// VarDefaultsFromYAMLFile reads contents of a file and calls VarDefaultsFromYAML
|
|
||||||
func VarDefaultsFromYAMLFile(filename string) map[string]string {
|
|
||||||
data, err := ioutil.ReadFile(filename)
|
|
||||||
if err != nil {
|
|
||||||
return make(map[string]string)
|
|
||||||
}
|
|
||||||
|
|
||||||
return VarDefaultsFromYAML(data)
|
|
||||||
}
|
|
||||||
|
|
||||||
// VarDefaultsFromYAML creates a vardefaults map from YAML raw data
|
|
||||||
func VarDefaultsFromYAML(in []byte) map[string]string {
|
|
||||||
out := make(map[string]string)
|
|
||||||
err := yaml.Unmarshal(in, &out)
|
|
||||||
if err != nil {
|
|
||||||
return make(map[string]string)
|
|
||||||
}
|
|
||||||
return out
|
|
||||||
}
|
|
21
vendor/github.com/mitchellh/go-homedir/LICENSE
generated
vendored
21
vendor/github.com/mitchellh/go-homedir/LICENSE
generated
vendored
|
@ -1,21 +0,0 @@
|
||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2013 Mitchell Hashimoto
|
|
||||||
|
|
||||||
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.
|
|
155
vendor/github.com/mitchellh/go-homedir/homedir.go
generated
vendored
155
vendor/github.com/mitchellh/go-homedir/homedir.go
generated
vendored
|
@ -1,155 +0,0 @@
|
||||||
package homedir
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"errors"
|
|
||||||
"os"
|
|
||||||
"os/exec"
|
|
||||||
"path/filepath"
|
|
||||||
"runtime"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"sync"
|
|
||||||
)
|
|
||||||
|
|
||||||
// DisableCache will disable caching of the home directory. Caching is enabled
|
|
||||||
// by default.
|
|
||||||
var DisableCache bool
|
|
||||||
|
|
||||||
var homedirCache string
|
|
||||||
var cacheLock sync.RWMutex
|
|
||||||
|
|
||||||
// Dir returns the home directory for the executing user.
|
|
||||||
//
|
|
||||||
// This uses an OS-specific method for discovering the home directory.
|
|
||||||
// An error is returned if a home directory cannot be detected.
|
|
||||||
func Dir() (string, error) {
|
|
||||||
if !DisableCache {
|
|
||||||
cacheLock.RLock()
|
|
||||||
cached := homedirCache
|
|
||||||
cacheLock.RUnlock()
|
|
||||||
if cached != "" {
|
|
||||||
return cached, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cacheLock.Lock()
|
|
||||||
defer cacheLock.Unlock()
|
|
||||||
|
|
||||||
var result string
|
|
||||||
var err error
|
|
||||||
if runtime.GOOS == "windows" {
|
|
||||||
result, err = dirWindows()
|
|
||||||
} else {
|
|
||||||
// Unix-like system, so just assume Unix
|
|
||||||
result, err = dirUnix()
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
homedirCache = result
|
|
||||||
return result, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Expand expands the path to include the home directory if the path
|
|
||||||
// is prefixed with `~`. If it isn't prefixed with `~`, the path is
|
|
||||||
// returned as-is.
|
|
||||||
func Expand(path string) (string, error) {
|
|
||||||
if len(path) == 0 {
|
|
||||||
return path, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if path[0] != '~' {
|
|
||||||
return path, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(path) > 1 && path[1] != '/' && path[1] != '\\' {
|
|
||||||
return "", errors.New("cannot expand user-specific home dir")
|
|
||||||
}
|
|
||||||
|
|
||||||
dir, err := Dir()
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
return filepath.Join(dir, path[1:]), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func dirUnix() (string, error) {
|
|
||||||
homeEnv := "HOME"
|
|
||||||
if runtime.GOOS == "plan9" {
|
|
||||||
// On plan9, env vars are lowercase.
|
|
||||||
homeEnv = "home"
|
|
||||||
}
|
|
||||||
|
|
||||||
// First prefer the HOME environmental variable
|
|
||||||
if home := os.Getenv(homeEnv); home != "" {
|
|
||||||
return home, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
var stdout bytes.Buffer
|
|
||||||
|
|
||||||
// If that fails, try OS specific commands
|
|
||||||
if runtime.GOOS == "darwin" {
|
|
||||||
cmd := exec.Command("sh", "-c", `dscl -q . -read /Users/"$(whoami)" NFSHomeDirectory | sed 's/^[^ ]*: //'`)
|
|
||||||
cmd.Stdout = &stdout
|
|
||||||
if err := cmd.Run(); err == nil {
|
|
||||||
result := strings.TrimSpace(stdout.String())
|
|
||||||
if result != "" {
|
|
||||||
return result, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
cmd := exec.Command("getent", "passwd", strconv.Itoa(os.Getuid()))
|
|
||||||
cmd.Stdout = &stdout
|
|
||||||
if err := cmd.Run(); err != nil {
|
|
||||||
// If the error is ErrNotFound, we ignore it. Otherwise, return it.
|
|
||||||
if err != exec.ErrNotFound {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if passwd := strings.TrimSpace(stdout.String()); passwd != "" {
|
|
||||||
// username:password:uid:gid:gecos:home:shell
|
|
||||||
passwdParts := strings.SplitN(passwd, ":", 7)
|
|
||||||
if len(passwdParts) > 5 {
|
|
||||||
return passwdParts[5], nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If all else fails, try the shell
|
|
||||||
stdout.Reset()
|
|
||||||
cmd := exec.Command("sh", "-c", "cd && pwd")
|
|
||||||
cmd.Stdout = &stdout
|
|
||||||
if err := cmd.Run(); err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
result := strings.TrimSpace(stdout.String())
|
|
||||||
if result == "" {
|
|
||||||
return "", errors.New("blank output when reading home directory")
|
|
||||||
}
|
|
||||||
|
|
||||||
return result, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func dirWindows() (string, error) {
|
|
||||||
// First prefer the HOME environmental variable
|
|
||||||
if home := os.Getenv("HOME"); home != "" {
|
|
||||||
return home, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
drive := os.Getenv("HOMEDRIVE")
|
|
||||||
path := os.Getenv("HOMEPATH")
|
|
||||||
home := drive + path
|
|
||||||
if drive == "" || path == "" {
|
|
||||||
home = os.Getenv("USERPROFILE")
|
|
||||||
}
|
|
||||||
if home == "" {
|
|
||||||
return "", errors.New("HOMEDRIVE, HOMEPATH, and USERPROFILE are blank")
|
|
||||||
}
|
|
||||||
|
|
||||||
return home, nil
|
|
||||||
}
|
|
21
vendor/github.com/sirupsen/logrus/LICENSE
generated
vendored
21
vendor/github.com/sirupsen/logrus/LICENSE
generated
vendored
|
@ -1,21 +0,0 @@
|
||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2014 Simon Eskildsen
|
|
||||||
|
|
||||||
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.
|
|
64
vendor/github.com/sirupsen/logrus/alt_exit.go
generated
vendored
64
vendor/github.com/sirupsen/logrus/alt_exit.go
generated
vendored
|
@ -1,64 +0,0 @@
|
||||||
package logrus
|
|
||||||
|
|
||||||
// The following code was sourced and modified from the
|
|
||||||
// https://github.com/tebeka/atexit package governed by the following license:
|
|
||||||
//
|
|
||||||
// Copyright (c) 2012 Miki Tebeka <miki.tebeka@gmail.com>.
|
|
||||||
//
|
|
||||||
// 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.
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
)
|
|
||||||
|
|
||||||
var handlers = []func(){}
|
|
||||||
|
|
||||||
func runHandler(handler func()) {
|
|
||||||
defer func() {
|
|
||||||
if err := recover(); err != nil {
|
|
||||||
fmt.Fprintln(os.Stderr, "Error: Logrus exit handler error:", err)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
handler()
|
|
||||||
}
|
|
||||||
|
|
||||||
func runHandlers() {
|
|
||||||
for _, handler := range handlers {
|
|
||||||
runHandler(handler)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Exit runs all the Logrus atexit handlers and then terminates the program using os.Exit(code)
|
|
||||||
func Exit(code int) {
|
|
||||||
runHandlers()
|
|
||||||
os.Exit(code)
|
|
||||||
}
|
|
||||||
|
|
||||||
// RegisterExitHandler adds a Logrus Exit handler, call logrus.Exit to invoke
|
|
||||||
// all handlers. The handlers will also be invoked when any Fatal log entry is
|
|
||||||
// made.
|
|
||||||
//
|
|
||||||
// This method is useful when a caller wishes to use logrus to log a fatal
|
|
||||||
// message but also needs to gracefully shutdown. An example usecase could be
|
|
||||||
// closing database connections, or sending a alert that the application is
|
|
||||||
// closing.
|
|
||||||
func RegisterExitHandler(handler func()) {
|
|
||||||
handlers = append(handlers, handler)
|
|
||||||
}
|
|
26
vendor/github.com/sirupsen/logrus/doc.go
generated
vendored
26
vendor/github.com/sirupsen/logrus/doc.go
generated
vendored
|
@ -1,26 +0,0 @@
|
||||||
/*
|
|
||||||
Package logrus is a structured logger for Go, completely API compatible with the standard library logger.
|
|
||||||
|
|
||||||
|
|
||||||
The simplest way to use Logrus is simply the package-level exported logger:
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
log.WithFields(log.Fields{
|
|
||||||
"animal": "walrus",
|
|
||||||
"number": 1,
|
|
||||||
"size": 10,
|
|
||||||
}).Info("A walrus appears")
|
|
||||||
}
|
|
||||||
|
|
||||||
Output:
|
|
||||||
time="2015-09-07T08:48:33Z" level=info msg="A walrus appears" animal=walrus number=1 size=10
|
|
||||||
|
|
||||||
For a full guide visit https://github.com/sirupsen/logrus
|
|
||||||
*/
|
|
||||||
package logrus
|
|
288
vendor/github.com/sirupsen/logrus/entry.go
generated
vendored
288
vendor/github.com/sirupsen/logrus/entry.go
generated
vendored
|
@ -1,288 +0,0 @@
|
||||||
package logrus
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
"sync"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
var bufferPool *sync.Pool
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
bufferPool = &sync.Pool{
|
|
||||||
New: func() interface{} {
|
|
||||||
return new(bytes.Buffer)
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Defines the key when adding errors using WithError.
|
|
||||||
var ErrorKey = "error"
|
|
||||||
|
|
||||||
// An entry is the final or intermediate Logrus logging entry. It contains all
|
|
||||||
// the fields passed with WithField{,s}. It's finally logged when Debug, Info,
|
|
||||||
// Warn, Error, Fatal or Panic is called on it. These objects can be reused and
|
|
||||||
// passed around as much as you wish to avoid field duplication.
|
|
||||||
type Entry struct {
|
|
||||||
Logger *Logger
|
|
||||||
|
|
||||||
// Contains all the fields set by the user.
|
|
||||||
Data Fields
|
|
||||||
|
|
||||||
// Time at which the log entry was created
|
|
||||||
Time time.Time
|
|
||||||
|
|
||||||
// Level the log entry was logged at: Debug, Info, Warn, Error, Fatal or Panic
|
|
||||||
// This field will be set on entry firing and the value will be equal to the one in Logger struct field.
|
|
||||||
Level Level
|
|
||||||
|
|
||||||
// Message passed to Debug, Info, Warn, Error, Fatal or Panic
|
|
||||||
Message string
|
|
||||||
|
|
||||||
// When formatter is called in entry.log(), an Buffer may be set to entry
|
|
||||||
Buffer *bytes.Buffer
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewEntry(logger *Logger) *Entry {
|
|
||||||
return &Entry{
|
|
||||||
Logger: logger,
|
|
||||||
// Default is three fields, give a little extra room
|
|
||||||
Data: make(Fields, 5),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns the string representation from the reader and ultimately the
|
|
||||||
// formatter.
|
|
||||||
func (entry *Entry) String() (string, error) {
|
|
||||||
serialized, err := entry.Logger.Formatter.Format(entry)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
str := string(serialized)
|
|
||||||
return str, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add an error as single field (using the key defined in ErrorKey) to the Entry.
|
|
||||||
func (entry *Entry) WithError(err error) *Entry {
|
|
||||||
return entry.WithField(ErrorKey, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add a single field to the Entry.
|
|
||||||
func (entry *Entry) WithField(key string, value interface{}) *Entry {
|
|
||||||
return entry.WithFields(Fields{key: value})
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add a map of fields to the Entry.
|
|
||||||
func (entry *Entry) WithFields(fields Fields) *Entry {
|
|
||||||
data := make(Fields, len(entry.Data)+len(fields))
|
|
||||||
for k, v := range entry.Data {
|
|
||||||
data[k] = v
|
|
||||||
}
|
|
||||||
for k, v := range fields {
|
|
||||||
data[k] = v
|
|
||||||
}
|
|
||||||
return &Entry{Logger: entry.Logger, Data: data}
|
|
||||||
}
|
|
||||||
|
|
||||||
// This function is not declared with a pointer value because otherwise
|
|
||||||
// race conditions will occur when using multiple goroutines
|
|
||||||
func (entry Entry) log(level Level, msg string) {
|
|
||||||
var buffer *bytes.Buffer
|
|
||||||
entry.Time = time.Now()
|
|
||||||
entry.Level = level
|
|
||||||
entry.Message = msg
|
|
||||||
|
|
||||||
entry.fireHooks()
|
|
||||||
|
|
||||||
buffer = bufferPool.Get().(*bytes.Buffer)
|
|
||||||
buffer.Reset()
|
|
||||||
defer bufferPool.Put(buffer)
|
|
||||||
entry.Buffer = buffer
|
|
||||||
|
|
||||||
entry.write()
|
|
||||||
|
|
||||||
entry.Buffer = nil
|
|
||||||
|
|
||||||
// To avoid Entry#log() returning a value that only would make sense for
|
|
||||||
// panic() to use in Entry#Panic(), we avoid the allocation by checking
|
|
||||||
// directly here.
|
|
||||||
if level <= PanicLevel {
|
|
||||||
panic(&entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// This function is not declared with a pointer value because otherwise
|
|
||||||
// race conditions will occur when using multiple goroutines
|
|
||||||
func (entry Entry) fireHooks() {
|
|
||||||
entry.Logger.mu.Lock()
|
|
||||||
defer entry.Logger.mu.Unlock()
|
|
||||||
err := entry.Logger.Hooks.Fire(entry.Level, &entry)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Fprintf(os.Stderr, "Failed to fire hook: %v\n", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) write() {
|
|
||||||
serialized, err := entry.Logger.Formatter.Format(entry)
|
|
||||||
entry.Logger.mu.Lock()
|
|
||||||
defer entry.Logger.mu.Unlock()
|
|
||||||
if err != nil {
|
|
||||||
fmt.Fprintf(os.Stderr, "Failed to obtain reader, %v\n", err)
|
|
||||||
} else {
|
|
||||||
_, err = entry.Logger.Out.Write(serialized)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Fprintf(os.Stderr, "Failed to write to log, %v\n", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Debug(args ...interface{}) {
|
|
||||||
if entry.Logger.level() >= DebugLevel {
|
|
||||||
entry.log(DebugLevel, fmt.Sprint(args...))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Print(args ...interface{}) {
|
|
||||||
entry.Info(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Info(args ...interface{}) {
|
|
||||||
if entry.Logger.level() >= InfoLevel {
|
|
||||||
entry.log(InfoLevel, fmt.Sprint(args...))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Warn(args ...interface{}) {
|
|
||||||
if entry.Logger.level() >= WarnLevel {
|
|
||||||
entry.log(WarnLevel, fmt.Sprint(args...))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Warning(args ...interface{}) {
|
|
||||||
entry.Warn(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Error(args ...interface{}) {
|
|
||||||
if entry.Logger.level() >= ErrorLevel {
|
|
||||||
entry.log(ErrorLevel, fmt.Sprint(args...))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Fatal(args ...interface{}) {
|
|
||||||
if entry.Logger.level() >= FatalLevel {
|
|
||||||
entry.log(FatalLevel, fmt.Sprint(args...))
|
|
||||||
}
|
|
||||||
Exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Panic(args ...interface{}) {
|
|
||||||
if entry.Logger.level() >= PanicLevel {
|
|
||||||
entry.log(PanicLevel, fmt.Sprint(args...))
|
|
||||||
}
|
|
||||||
panic(fmt.Sprint(args...))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Entry Printf family functions
|
|
||||||
|
|
||||||
func (entry *Entry) Debugf(format string, args ...interface{}) {
|
|
||||||
if entry.Logger.level() >= DebugLevel {
|
|
||||||
entry.Debug(fmt.Sprintf(format, args...))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Infof(format string, args ...interface{}) {
|
|
||||||
if entry.Logger.level() >= InfoLevel {
|
|
||||||
entry.Info(fmt.Sprintf(format, args...))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Printf(format string, args ...interface{}) {
|
|
||||||
entry.Infof(format, args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Warnf(format string, args ...interface{}) {
|
|
||||||
if entry.Logger.level() >= WarnLevel {
|
|
||||||
entry.Warn(fmt.Sprintf(format, args...))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Warningf(format string, args ...interface{}) {
|
|
||||||
entry.Warnf(format, args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Errorf(format string, args ...interface{}) {
|
|
||||||
if entry.Logger.level() >= ErrorLevel {
|
|
||||||
entry.Error(fmt.Sprintf(format, args...))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Fatalf(format string, args ...interface{}) {
|
|
||||||
if entry.Logger.level() >= FatalLevel {
|
|
||||||
entry.Fatal(fmt.Sprintf(format, args...))
|
|
||||||
}
|
|
||||||
Exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Panicf(format string, args ...interface{}) {
|
|
||||||
if entry.Logger.level() >= PanicLevel {
|
|
||||||
entry.Panic(fmt.Sprintf(format, args...))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Entry Println family functions
|
|
||||||
|
|
||||||
func (entry *Entry) Debugln(args ...interface{}) {
|
|
||||||
if entry.Logger.level() >= DebugLevel {
|
|
||||||
entry.Debug(entry.sprintlnn(args...))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Infoln(args ...interface{}) {
|
|
||||||
if entry.Logger.level() >= InfoLevel {
|
|
||||||
entry.Info(entry.sprintlnn(args...))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Println(args ...interface{}) {
|
|
||||||
entry.Infoln(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Warnln(args ...interface{}) {
|
|
||||||
if entry.Logger.level() >= WarnLevel {
|
|
||||||
entry.Warn(entry.sprintlnn(args...))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Warningln(args ...interface{}) {
|
|
||||||
entry.Warnln(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Errorln(args ...interface{}) {
|
|
||||||
if entry.Logger.level() >= ErrorLevel {
|
|
||||||
entry.Error(entry.sprintlnn(args...))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Fatalln(args ...interface{}) {
|
|
||||||
if entry.Logger.level() >= FatalLevel {
|
|
||||||
entry.Fatal(entry.sprintlnn(args...))
|
|
||||||
}
|
|
||||||
Exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Panicln(args ...interface{}) {
|
|
||||||
if entry.Logger.level() >= PanicLevel {
|
|
||||||
entry.Panic(entry.sprintlnn(args...))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sprintlnn => Sprint no newline. This is to get the behavior of how
|
|
||||||
// fmt.Sprintln where spaces are always added between operands, regardless of
|
|
||||||
// their type. Instead of vendoring the Sprintln implementation to spare a
|
|
||||||
// string allocation, we do the simplest thing.
|
|
||||||
func (entry *Entry) sprintlnn(args ...interface{}) string {
|
|
||||||
msg := fmt.Sprintln(args...)
|
|
||||||
return msg[:len(msg)-1]
|
|
||||||
}
|
|
193
vendor/github.com/sirupsen/logrus/exported.go
generated
vendored
193
vendor/github.com/sirupsen/logrus/exported.go
generated
vendored
|
@ -1,193 +0,0 @@
|
||||||
package logrus
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
// std is the name of the standard logger in stdlib `log`
|
|
||||||
std = New()
|
|
||||||
)
|
|
||||||
|
|
||||||
func StandardLogger() *Logger {
|
|
||||||
return std
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetOutput sets the standard logger output.
|
|
||||||
func SetOutput(out io.Writer) {
|
|
||||||
std.mu.Lock()
|
|
||||||
defer std.mu.Unlock()
|
|
||||||
std.Out = out
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetFormatter sets the standard logger formatter.
|
|
||||||
func SetFormatter(formatter Formatter) {
|
|
||||||
std.mu.Lock()
|
|
||||||
defer std.mu.Unlock()
|
|
||||||
std.Formatter = formatter
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetLevel sets the standard logger level.
|
|
||||||
func SetLevel(level Level) {
|
|
||||||
std.mu.Lock()
|
|
||||||
defer std.mu.Unlock()
|
|
||||||
std.SetLevel(level)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetLevel returns the standard logger level.
|
|
||||||
func GetLevel() Level {
|
|
||||||
std.mu.Lock()
|
|
||||||
defer std.mu.Unlock()
|
|
||||||
return std.level()
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddHook adds a hook to the standard logger hooks.
|
|
||||||
func AddHook(hook Hook) {
|
|
||||||
std.mu.Lock()
|
|
||||||
defer std.mu.Unlock()
|
|
||||||
std.Hooks.Add(hook)
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithError creates an entry from the standard logger and adds an error to it, using the value defined in ErrorKey as key.
|
|
||||||
func WithError(err error) *Entry {
|
|
||||||
return std.WithField(ErrorKey, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithField creates an entry from the standard logger and adds a field to
|
|
||||||
// it. If you want multiple fields, use `WithFields`.
|
|
||||||
//
|
|
||||||
// Note that it doesn't log until you call Debug, Print, Info, Warn, Fatal
|
|
||||||
// or Panic on the Entry it returns.
|
|
||||||
func WithField(key string, value interface{}) *Entry {
|
|
||||||
return std.WithField(key, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithFields creates an entry from the standard logger and adds multiple
|
|
||||||
// fields to it. This is simply a helper for `WithField`, invoking it
|
|
||||||
// once for each field.
|
|
||||||
//
|
|
||||||
// Note that it doesn't log until you call Debug, Print, Info, Warn, Fatal
|
|
||||||
// or Panic on the Entry it returns.
|
|
||||||
func WithFields(fields Fields) *Entry {
|
|
||||||
return std.WithFields(fields)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Debug logs a message at level Debug on the standard logger.
|
|
||||||
func Debug(args ...interface{}) {
|
|
||||||
std.Debug(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Print logs a message at level Info on the standard logger.
|
|
||||||
func Print(args ...interface{}) {
|
|
||||||
std.Print(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Info logs a message at level Info on the standard logger.
|
|
||||||
func Info(args ...interface{}) {
|
|
||||||
std.Info(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Warn logs a message at level Warn on the standard logger.
|
|
||||||
func Warn(args ...interface{}) {
|
|
||||||
std.Warn(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Warning logs a message at level Warn on the standard logger.
|
|
||||||
func Warning(args ...interface{}) {
|
|
||||||
std.Warning(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Error logs a message at level Error on the standard logger.
|
|
||||||
func Error(args ...interface{}) {
|
|
||||||
std.Error(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Panic logs a message at level Panic on the standard logger.
|
|
||||||
func Panic(args ...interface{}) {
|
|
||||||
std.Panic(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fatal logs a message at level Fatal on the standard logger.
|
|
||||||
func Fatal(args ...interface{}) {
|
|
||||||
std.Fatal(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Debugf logs a message at level Debug on the standard logger.
|
|
||||||
func Debugf(format string, args ...interface{}) {
|
|
||||||
std.Debugf(format, args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Printf logs a message at level Info on the standard logger.
|
|
||||||
func Printf(format string, args ...interface{}) {
|
|
||||||
std.Printf(format, args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Infof logs a message at level Info on the standard logger.
|
|
||||||
func Infof(format string, args ...interface{}) {
|
|
||||||
std.Infof(format, args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Warnf logs a message at level Warn on the standard logger.
|
|
||||||
func Warnf(format string, args ...interface{}) {
|
|
||||||
std.Warnf(format, args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Warningf logs a message at level Warn on the standard logger.
|
|
||||||
func Warningf(format string, args ...interface{}) {
|
|
||||||
std.Warningf(format, args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Errorf logs a message at level Error on the standard logger.
|
|
||||||
func Errorf(format string, args ...interface{}) {
|
|
||||||
std.Errorf(format, args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Panicf logs a message at level Panic on the standard logger.
|
|
||||||
func Panicf(format string, args ...interface{}) {
|
|
||||||
std.Panicf(format, args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fatalf logs a message at level Fatal on the standard logger.
|
|
||||||
func Fatalf(format string, args ...interface{}) {
|
|
||||||
std.Fatalf(format, args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Debugln logs a message at level Debug on the standard logger.
|
|
||||||
func Debugln(args ...interface{}) {
|
|
||||||
std.Debugln(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Println logs a message at level Info on the standard logger.
|
|
||||||
func Println(args ...interface{}) {
|
|
||||||
std.Println(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Infoln logs a message at level Info on the standard logger.
|
|
||||||
func Infoln(args ...interface{}) {
|
|
||||||
std.Infoln(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Warnln logs a message at level Warn on the standard logger.
|
|
||||||
func Warnln(args ...interface{}) {
|
|
||||||
std.Warnln(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Warningln logs a message at level Warn on the standard logger.
|
|
||||||
func Warningln(args ...interface{}) {
|
|
||||||
std.Warningln(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Errorln logs a message at level Error on the standard logger.
|
|
||||||
func Errorln(args ...interface{}) {
|
|
||||||
std.Errorln(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Panicln logs a message at level Panic on the standard logger.
|
|
||||||
func Panicln(args ...interface{}) {
|
|
||||||
std.Panicln(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fatalln logs a message at level Fatal on the standard logger.
|
|
||||||
func Fatalln(args ...interface{}) {
|
|
||||||
std.Fatalln(args...)
|
|
||||||
}
|
|
45
vendor/github.com/sirupsen/logrus/formatter.go
generated
vendored
45
vendor/github.com/sirupsen/logrus/formatter.go
generated
vendored
|
@ -1,45 +0,0 @@
|
||||||
package logrus
|
|
||||||
|
|
||||||
import "time"
|
|
||||||
|
|
||||||
const defaultTimestampFormat = time.RFC3339
|
|
||||||
|
|
||||||
// The Formatter interface is used to implement a custom Formatter. It takes an
|
|
||||||
// `Entry`. It exposes all the fields, including the default ones:
|
|
||||||
//
|
|
||||||
// * `entry.Data["msg"]`. The message passed from Info, Warn, Error ..
|
|
||||||
// * `entry.Data["time"]`. The timestamp.
|
|
||||||
// * `entry.Data["level"]. The level the entry was logged at.
|
|
||||||
//
|
|
||||||
// Any additional fields added with `WithField` or `WithFields` are also in
|
|
||||||
// `entry.Data`. Format is expected to return an array of bytes which are then
|
|
||||||
// logged to `logger.Out`.
|
|
||||||
type Formatter interface {
|
|
||||||
Format(*Entry) ([]byte, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
// This is to not silently overwrite `time`, `msg` and `level` fields when
|
|
||||||
// dumping it. If this code wasn't there doing:
|
|
||||||
//
|
|
||||||
// logrus.WithField("level", 1).Info("hello")
|
|
||||||
//
|
|
||||||
// Would just silently drop the user provided level. Instead with this code
|
|
||||||
// it'll logged as:
|
|
||||||
//
|
|
||||||
// {"level": "info", "fields.level": 1, "msg": "hello", "time": "..."}
|
|
||||||
//
|
|
||||||
// It's not exported because it's still using Data in an opinionated way. It's to
|
|
||||||
// avoid code duplication between the two default formatters.
|
|
||||||
func prefixFieldClashes(data Fields) {
|
|
||||||
if t, ok := data["time"]; ok {
|
|
||||||
data["fields.time"] = t
|
|
||||||
}
|
|
||||||
|
|
||||||
if m, ok := data["msg"]; ok {
|
|
||||||
data["fields.msg"] = m
|
|
||||||
}
|
|
||||||
|
|
||||||
if l, ok := data["level"]; ok {
|
|
||||||
data["fields.level"] = l
|
|
||||||
}
|
|
||||||
}
|
|
34
vendor/github.com/sirupsen/logrus/hooks.go
generated
vendored
34
vendor/github.com/sirupsen/logrus/hooks.go
generated
vendored
|
@ -1,34 +0,0 @@
|
||||||
package logrus
|
|
||||||
|
|
||||||
// A hook to be fired when logging on the logging levels returned from
|
|
||||||
// `Levels()` on your implementation of the interface. Note that this is not
|
|
||||||
// fired in a goroutine or a channel with workers, you should handle such
|
|
||||||
// functionality yourself if your call is non-blocking and you don't wish for
|
|
||||||
// the logging calls for levels returned from `Levels()` to block.
|
|
||||||
type Hook interface {
|
|
||||||
Levels() []Level
|
|
||||||
Fire(*Entry) error
|
|
||||||
}
|
|
||||||
|
|
||||||
// Internal type for storing the hooks on a logger instance.
|
|
||||||
type LevelHooks map[Level][]Hook
|
|
||||||
|
|
||||||
// Add a hook to an instance of logger. This is called with
|
|
||||||
// `log.Hooks.Add(new(MyHook))` where `MyHook` implements the `Hook` interface.
|
|
||||||
func (hooks LevelHooks) Add(hook Hook) {
|
|
||||||
for _, level := range hook.Levels() {
|
|
||||||
hooks[level] = append(hooks[level], hook)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fire all the hooks for the passed level. Used by `entry.log` to fire
|
|
||||||
// appropriate hooks for a log entry.
|
|
||||||
func (hooks LevelHooks) Fire(level Level, entry *Entry) error {
|
|
||||||
for _, hook := range hooks[level] {
|
|
||||||
if err := hook.Fire(entry); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
79
vendor/github.com/sirupsen/logrus/json_formatter.go
generated
vendored
79
vendor/github.com/sirupsen/logrus/json_formatter.go
generated
vendored
|
@ -1,79 +0,0 @@
|
||||||
package logrus
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
)
|
|
||||||
|
|
||||||
type fieldKey string
|
|
||||||
|
|
||||||
// FieldMap allows customization of the key names for default fields.
|
|
||||||
type FieldMap map[fieldKey]string
|
|
||||||
|
|
||||||
// Default key names for the default fields
|
|
||||||
const (
|
|
||||||
FieldKeyMsg = "msg"
|
|
||||||
FieldKeyLevel = "level"
|
|
||||||
FieldKeyTime = "time"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (f FieldMap) resolve(key fieldKey) string {
|
|
||||||
if k, ok := f[key]; ok {
|
|
||||||
return k
|
|
||||||
}
|
|
||||||
|
|
||||||
return string(key)
|
|
||||||
}
|
|
||||||
|
|
||||||
// JSONFormatter formats logs into parsable json
|
|
||||||
type JSONFormatter struct {
|
|
||||||
// TimestampFormat sets the format used for marshaling timestamps.
|
|
||||||
TimestampFormat string
|
|
||||||
|
|
||||||
// DisableTimestamp allows disabling automatic timestamps in output
|
|
||||||
DisableTimestamp bool
|
|
||||||
|
|
||||||
// FieldMap allows users to customize the names of keys for default fields.
|
|
||||||
// As an example:
|
|
||||||
// formatter := &JSONFormatter{
|
|
||||||
// FieldMap: FieldMap{
|
|
||||||
// FieldKeyTime: "@timestamp",
|
|
||||||
// FieldKeyLevel: "@level",
|
|
||||||
// FieldKeyMsg: "@message",
|
|
||||||
// },
|
|
||||||
// }
|
|
||||||
FieldMap FieldMap
|
|
||||||
}
|
|
||||||
|
|
||||||
// Format renders a single log entry
|
|
||||||
func (f *JSONFormatter) Format(entry *Entry) ([]byte, error) {
|
|
||||||
data := make(Fields, len(entry.Data)+3)
|
|
||||||
for k, v := range entry.Data {
|
|
||||||
switch v := v.(type) {
|
|
||||||
case error:
|
|
||||||
// Otherwise errors are ignored by `encoding/json`
|
|
||||||
// https://github.com/sirupsen/logrus/issues/137
|
|
||||||
data[k] = v.Error()
|
|
||||||
default:
|
|
||||||
data[k] = v
|
|
||||||
}
|
|
||||||
}
|
|
||||||
prefixFieldClashes(data)
|
|
||||||
|
|
||||||
timestampFormat := f.TimestampFormat
|
|
||||||
if timestampFormat == "" {
|
|
||||||
timestampFormat = defaultTimestampFormat
|
|
||||||
}
|
|
||||||
|
|
||||||
if !f.DisableTimestamp {
|
|
||||||
data[f.FieldMap.resolve(FieldKeyTime)] = entry.Time.Format(timestampFormat)
|
|
||||||
}
|
|
||||||
data[f.FieldMap.resolve(FieldKeyMsg)] = entry.Message
|
|
||||||
data[f.FieldMap.resolve(FieldKeyLevel)] = entry.Level.String()
|
|
||||||
|
|
||||||
serialized, err := json.Marshal(data)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("Failed to marshal fields to JSON, %v", err)
|
|
||||||
}
|
|
||||||
return append(serialized, '\n'), nil
|
|
||||||
}
|
|
323
vendor/github.com/sirupsen/logrus/logger.go
generated
vendored
323
vendor/github.com/sirupsen/logrus/logger.go
generated
vendored
|
@ -1,323 +0,0 @@
|
||||||
package logrus
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
"os"
|
|
||||||
"sync"
|
|
||||||
"sync/atomic"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Logger struct {
|
|
||||||
// The logs are `io.Copy`'d to this in a mutex. It's common to set this to a
|
|
||||||
// file, or leave it default which is `os.Stderr`. You can also set this to
|
|
||||||
// something more adventorous, such as logging to Kafka.
|
|
||||||
Out io.Writer
|
|
||||||
// Hooks for the logger instance. These allow firing events based on logging
|
|
||||||
// levels and log entries. For example, to send errors to an error tracking
|
|
||||||
// service, log to StatsD or dump the core on fatal errors.
|
|
||||||
Hooks LevelHooks
|
|
||||||
// All log entries pass through the formatter before logged to Out. The
|
|
||||||
// included formatters are `TextFormatter` and `JSONFormatter` for which
|
|
||||||
// TextFormatter is the default. In development (when a TTY is attached) it
|
|
||||||
// logs with colors, but to a file it wouldn't. You can easily implement your
|
|
||||||
// own that implements the `Formatter` interface, see the `README` or included
|
|
||||||
// formatters for examples.
|
|
||||||
Formatter Formatter
|
|
||||||
// The logging level the logger should log at. This is typically (and defaults
|
|
||||||
// to) `logrus.Info`, which allows Info(), Warn(), Error() and Fatal() to be
|
|
||||||
// logged.
|
|
||||||
Level Level
|
|
||||||
// Used to sync writing to the log. Locking is enabled by Default
|
|
||||||
mu MutexWrap
|
|
||||||
// Reusable empty entry
|
|
||||||
entryPool sync.Pool
|
|
||||||
}
|
|
||||||
|
|
||||||
type MutexWrap struct {
|
|
||||||
lock sync.Mutex
|
|
||||||
disabled bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func (mw *MutexWrap) Lock() {
|
|
||||||
if !mw.disabled {
|
|
||||||
mw.lock.Lock()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (mw *MutexWrap) Unlock() {
|
|
||||||
if !mw.disabled {
|
|
||||||
mw.lock.Unlock()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (mw *MutexWrap) Disable() {
|
|
||||||
mw.disabled = true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Creates a new logger. Configuration should be set by changing `Formatter`,
|
|
||||||
// `Out` and `Hooks` directly on the default logger instance. You can also just
|
|
||||||
// instantiate your own:
|
|
||||||
//
|
|
||||||
// var log = &Logger{
|
|
||||||
// Out: os.Stderr,
|
|
||||||
// Formatter: new(JSONFormatter),
|
|
||||||
// Hooks: make(LevelHooks),
|
|
||||||
// Level: logrus.DebugLevel,
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// It's recommended to make this a global instance called `log`.
|
|
||||||
func New() *Logger {
|
|
||||||
return &Logger{
|
|
||||||
Out: os.Stderr,
|
|
||||||
Formatter: new(TextFormatter),
|
|
||||||
Hooks: make(LevelHooks),
|
|
||||||
Level: InfoLevel,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) newEntry() *Entry {
|
|
||||||
entry, ok := logger.entryPool.Get().(*Entry)
|
|
||||||
if ok {
|
|
||||||
return entry
|
|
||||||
}
|
|
||||||
return NewEntry(logger)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) releaseEntry(entry *Entry) {
|
|
||||||
logger.entryPool.Put(entry)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Adds a field to the log entry, note that it doesn't log until you call
|
|
||||||
// Debug, Print, Info, Warn, Fatal or Panic. It only creates a log entry.
|
|
||||||
// If you want multiple fields, use `WithFields`.
|
|
||||||
func (logger *Logger) WithField(key string, value interface{}) *Entry {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
defer logger.releaseEntry(entry)
|
|
||||||
return entry.WithField(key, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Adds a struct of fields to the log entry. All it does is call `WithField` for
|
|
||||||
// each `Field`.
|
|
||||||
func (logger *Logger) WithFields(fields Fields) *Entry {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
defer logger.releaseEntry(entry)
|
|
||||||
return entry.WithFields(fields)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add an error as single field to the log entry. All it does is call
|
|
||||||
// `WithError` for the given `error`.
|
|
||||||
func (logger *Logger) WithError(err error) *Entry {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
defer logger.releaseEntry(entry)
|
|
||||||
return entry.WithError(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Debugf(format string, args ...interface{}) {
|
|
||||||
if logger.level() >= DebugLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Debugf(format, args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Infof(format string, args ...interface{}) {
|
|
||||||
if logger.level() >= InfoLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Infof(format, args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Printf(format string, args ...interface{}) {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Printf(format, args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Warnf(format string, args ...interface{}) {
|
|
||||||
if logger.level() >= WarnLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Warnf(format, args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Warningf(format string, args ...interface{}) {
|
|
||||||
if logger.level() >= WarnLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Warnf(format, args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Errorf(format string, args ...interface{}) {
|
|
||||||
if logger.level() >= ErrorLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Errorf(format, args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Fatalf(format string, args ...interface{}) {
|
|
||||||
if logger.level() >= FatalLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Fatalf(format, args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
Exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Panicf(format string, args ...interface{}) {
|
|
||||||
if logger.level() >= PanicLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Panicf(format, args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Debug(args ...interface{}) {
|
|
||||||
if logger.level() >= DebugLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Debug(args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Info(args ...interface{}) {
|
|
||||||
if logger.level() >= InfoLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Info(args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Print(args ...interface{}) {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Info(args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Warn(args ...interface{}) {
|
|
||||||
if logger.level() >= WarnLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Warn(args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Warning(args ...interface{}) {
|
|
||||||
if logger.level() >= WarnLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Warn(args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Error(args ...interface{}) {
|
|
||||||
if logger.level() >= ErrorLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Error(args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Fatal(args ...interface{}) {
|
|
||||||
if logger.level() >= FatalLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Fatal(args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
Exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Panic(args ...interface{}) {
|
|
||||||
if logger.level() >= PanicLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Panic(args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Debugln(args ...interface{}) {
|
|
||||||
if logger.level() >= DebugLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Debugln(args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Infoln(args ...interface{}) {
|
|
||||||
if logger.level() >= InfoLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Infoln(args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Println(args ...interface{}) {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Println(args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Warnln(args ...interface{}) {
|
|
||||||
if logger.level() >= WarnLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Warnln(args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Warningln(args ...interface{}) {
|
|
||||||
if logger.level() >= WarnLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Warnln(args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Errorln(args ...interface{}) {
|
|
||||||
if logger.level() >= ErrorLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Errorln(args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Fatalln(args ...interface{}) {
|
|
||||||
if logger.level() >= FatalLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Fatalln(args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
Exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) Panicln(args ...interface{}) {
|
|
||||||
if logger.level() >= PanicLevel {
|
|
||||||
entry := logger.newEntry()
|
|
||||||
entry.Panicln(args...)
|
|
||||||
logger.releaseEntry(entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//When file is opened with appending mode, it's safe to
|
|
||||||
//write concurrently to a file (within 4k message on Linux).
|
|
||||||
//In these cases user can choose to disable the lock.
|
|
||||||
func (logger *Logger) SetNoLock() {
|
|
||||||
logger.mu.Disable()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) level() Level {
|
|
||||||
return Level(atomic.LoadUint32((*uint32)(&logger.Level)))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) SetLevel(level Level) {
|
|
||||||
atomic.StoreUint32((*uint32)(&logger.Level), uint32(level))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) AddHook(hook Hook) {
|
|
||||||
logger.mu.Lock()
|
|
||||||
defer logger.mu.Unlock()
|
|
||||||
logger.Hooks.Add(hook)
|
|
||||||
}
|
|
143
vendor/github.com/sirupsen/logrus/logrus.go
generated
vendored
143
vendor/github.com/sirupsen/logrus/logrus.go
generated
vendored
|
@ -1,143 +0,0 @@
|
||||||
package logrus
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"log"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Fields type, used to pass to `WithFields`.
|
|
||||||
type Fields map[string]interface{}
|
|
||||||
|
|
||||||
// Level type
|
|
||||||
type Level uint32
|
|
||||||
|
|
||||||
// Convert the Level to a string. E.g. PanicLevel becomes "panic".
|
|
||||||
func (level Level) String() string {
|
|
||||||
switch level {
|
|
||||||
case DebugLevel:
|
|
||||||
return "debug"
|
|
||||||
case InfoLevel:
|
|
||||||
return "info"
|
|
||||||
case WarnLevel:
|
|
||||||
return "warning"
|
|
||||||
case ErrorLevel:
|
|
||||||
return "error"
|
|
||||||
case FatalLevel:
|
|
||||||
return "fatal"
|
|
||||||
case PanicLevel:
|
|
||||||
return "panic"
|
|
||||||
}
|
|
||||||
|
|
||||||
return "unknown"
|
|
||||||
}
|
|
||||||
|
|
||||||
// ParseLevel takes a string level and returns the Logrus log level constant.
|
|
||||||
func ParseLevel(lvl string) (Level, error) {
|
|
||||||
switch strings.ToLower(lvl) {
|
|
||||||
case "panic":
|
|
||||||
return PanicLevel, nil
|
|
||||||
case "fatal":
|
|
||||||
return FatalLevel, nil
|
|
||||||
case "error":
|
|
||||||
return ErrorLevel, nil
|
|
||||||
case "warn", "warning":
|
|
||||||
return WarnLevel, nil
|
|
||||||
case "info":
|
|
||||||
return InfoLevel, nil
|
|
||||||
case "debug":
|
|
||||||
return DebugLevel, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
var l Level
|
|
||||||
return l, fmt.Errorf("not a valid logrus Level: %q", lvl)
|
|
||||||
}
|
|
||||||
|
|
||||||
// A constant exposing all logging levels
|
|
||||||
var AllLevels = []Level{
|
|
||||||
PanicLevel,
|
|
||||||
FatalLevel,
|
|
||||||
ErrorLevel,
|
|
||||||
WarnLevel,
|
|
||||||
InfoLevel,
|
|
||||||
DebugLevel,
|
|
||||||
}
|
|
||||||
|
|
||||||
// These are the different logging levels. You can set the logging level to log
|
|
||||||
// on your instance of logger, obtained with `logrus.New()`.
|
|
||||||
const (
|
|
||||||
// PanicLevel level, highest level of severity. Logs and then calls panic with the
|
|
||||||
// message passed to Debug, Info, ...
|
|
||||||
PanicLevel Level = iota
|
|
||||||
// FatalLevel level. Logs and then calls `os.Exit(1)`. It will exit even if the
|
|
||||||
// logging level is set to Panic.
|
|
||||||
FatalLevel
|
|
||||||
// ErrorLevel level. Logs. Used for errors that should definitely be noted.
|
|
||||||
// Commonly used for hooks to send errors to an error tracking service.
|
|
||||||
ErrorLevel
|
|
||||||
// WarnLevel level. Non-critical entries that deserve eyes.
|
|
||||||
WarnLevel
|
|
||||||
// InfoLevel level. General operational entries about what's going on inside the
|
|
||||||
// application.
|
|
||||||
InfoLevel
|
|
||||||
// DebugLevel level. Usually only enabled when debugging. Very verbose logging.
|
|
||||||
DebugLevel
|
|
||||||
)
|
|
||||||
|
|
||||||
// Won't compile if StdLogger can't be realized by a log.Logger
|
|
||||||
var (
|
|
||||||
_ StdLogger = &log.Logger{}
|
|
||||||
_ StdLogger = &Entry{}
|
|
||||||
_ StdLogger = &Logger{}
|
|
||||||
)
|
|
||||||
|
|
||||||
// StdLogger is what your logrus-enabled library should take, that way
|
|
||||||
// it'll accept a stdlib logger and a logrus logger. There's no standard
|
|
||||||
// interface, this is the closest we get, unfortunately.
|
|
||||||
type StdLogger interface {
|
|
||||||
Print(...interface{})
|
|
||||||
Printf(string, ...interface{})
|
|
||||||
Println(...interface{})
|
|
||||||
|
|
||||||
Fatal(...interface{})
|
|
||||||
Fatalf(string, ...interface{})
|
|
||||||
Fatalln(...interface{})
|
|
||||||
|
|
||||||
Panic(...interface{})
|
|
||||||
Panicf(string, ...interface{})
|
|
||||||
Panicln(...interface{})
|
|
||||||
}
|
|
||||||
|
|
||||||
// The FieldLogger interface generalizes the Entry and Logger types
|
|
||||||
type FieldLogger interface {
|
|
||||||
WithField(key string, value interface{}) *Entry
|
|
||||||
WithFields(fields Fields) *Entry
|
|
||||||
WithError(err error) *Entry
|
|
||||||
|
|
||||||
Debugf(format string, args ...interface{})
|
|
||||||
Infof(format string, args ...interface{})
|
|
||||||
Printf(format string, args ...interface{})
|
|
||||||
Warnf(format string, args ...interface{})
|
|
||||||
Warningf(format string, args ...interface{})
|
|
||||||
Errorf(format string, args ...interface{})
|
|
||||||
Fatalf(format string, args ...interface{})
|
|
||||||
Panicf(format string, args ...interface{})
|
|
||||||
|
|
||||||
Debug(args ...interface{})
|
|
||||||
Info(args ...interface{})
|
|
||||||
Print(args ...interface{})
|
|
||||||
Warn(args ...interface{})
|
|
||||||
Warning(args ...interface{})
|
|
||||||
Error(args ...interface{})
|
|
||||||
Fatal(args ...interface{})
|
|
||||||
Panic(args ...interface{})
|
|
||||||
|
|
||||||
Debugln(args ...interface{})
|
|
||||||
Infoln(args ...interface{})
|
|
||||||
Println(args ...interface{})
|
|
||||||
Warnln(args ...interface{})
|
|
||||||
Warningln(args ...interface{})
|
|
||||||
Errorln(args ...interface{})
|
|
||||||
Fatalln(args ...interface{})
|
|
||||||
Panicln(args ...interface{})
|
|
||||||
}
|
|
10
vendor/github.com/sirupsen/logrus/terminal_bsd.go
generated
vendored
10
vendor/github.com/sirupsen/logrus/terminal_bsd.go
generated
vendored
|
@ -1,10 +0,0 @@
|
||||||
// +build darwin freebsd openbsd netbsd dragonfly
|
|
||||||
// +build !appengine,!gopherjs
|
|
||||||
|
|
||||||
package logrus
|
|
||||||
|
|
||||||
import "golang.org/x/sys/unix"
|
|
||||||
|
|
||||||
const ioctlReadTermios = unix.TIOCGETA
|
|
||||||
|
|
||||||
type Termios unix.Termios
|
|
11
vendor/github.com/sirupsen/logrus/terminal_check_appengine.go
generated
vendored
11
vendor/github.com/sirupsen/logrus/terminal_check_appengine.go
generated
vendored
|
@ -1,11 +0,0 @@
|
||||||
// +build appengine gopherjs
|
|
||||||
|
|
||||||
package logrus
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
)
|
|
||||||
|
|
||||||
func checkIfTerminal(w io.Writer) bool {
|
|
||||||
return true
|
|
||||||
}
|
|
19
vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go
generated
vendored
19
vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go
generated
vendored
|
@ -1,19 +0,0 @@
|
||||||
// +build !appengine,!gopherjs
|
|
||||||
|
|
||||||
package logrus
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"golang.org/x/crypto/ssh/terminal"
|
|
||||||
)
|
|
||||||
|
|
||||||
func checkIfTerminal(w io.Writer) bool {
|
|
||||||
switch v := w.(type) {
|
|
||||||
case *os.File:
|
|
||||||
return terminal.IsTerminal(int(v.Fd()))
|
|
||||||
default:
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
14
vendor/github.com/sirupsen/logrus/terminal_linux.go
generated
vendored
14
vendor/github.com/sirupsen/logrus/terminal_linux.go
generated
vendored
|
@ -1,14 +0,0 @@
|
||||||
// Based on ssh/terminal:
|
|
||||||
// Copyright 2013 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build !appengine,!gopherjs
|
|
||||||
|
|
||||||
package logrus
|
|
||||||
|
|
||||||
import "golang.org/x/sys/unix"
|
|
||||||
|
|
||||||
const ioctlReadTermios = unix.TCGETS
|
|
||||||
|
|
||||||
type Termios unix.Termios
|
|
178
vendor/github.com/sirupsen/logrus/text_formatter.go
generated
vendored
178
vendor/github.com/sirupsen/logrus/text_formatter.go
generated
vendored
|
@ -1,178 +0,0 @@
|
||||||
package logrus
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"fmt"
|
|
||||||
"sort"
|
|
||||||
"strings"
|
|
||||||
"sync"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
nocolor = 0
|
|
||||||
red = 31
|
|
||||||
green = 32
|
|
||||||
yellow = 33
|
|
||||||
blue = 36
|
|
||||||
gray = 37
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
baseTimestamp time.Time
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
baseTimestamp = time.Now()
|
|
||||||
}
|
|
||||||
|
|
||||||
// TextFormatter formats logs into text
|
|
||||||
type TextFormatter struct {
|
|
||||||
// Set to true to bypass checking for a TTY before outputting colors.
|
|
||||||
ForceColors bool
|
|
||||||
|
|
||||||
// Force disabling colors.
|
|
||||||
DisableColors bool
|
|
||||||
|
|
||||||
// Disable timestamp logging. useful when output is redirected to logging
|
|
||||||
// system that already adds timestamps.
|
|
||||||
DisableTimestamp bool
|
|
||||||
|
|
||||||
// Enable logging the full timestamp when a TTY is attached instead of just
|
|
||||||
// the time passed since beginning of execution.
|
|
||||||
FullTimestamp bool
|
|
||||||
|
|
||||||
// TimestampFormat to use for display when a full timestamp is printed
|
|
||||||
TimestampFormat string
|
|
||||||
|
|
||||||
// The fields are sorted by default for a consistent output. For applications
|
|
||||||
// that log extremely frequently and don't use the JSON formatter this may not
|
|
||||||
// be desired.
|
|
||||||
DisableSorting bool
|
|
||||||
|
|
||||||
// QuoteEmptyFields will wrap empty fields in quotes if true
|
|
||||||
QuoteEmptyFields bool
|
|
||||||
|
|
||||||
// Whether the logger's out is to a terminal
|
|
||||||
isTerminal bool
|
|
||||||
|
|
||||||
sync.Once
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *TextFormatter) init(entry *Entry) {
|
|
||||||
if entry.Logger != nil {
|
|
||||||
f.isTerminal = checkIfTerminal(entry.Logger.Out)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Format renders a single log entry
|
|
||||||
func (f *TextFormatter) Format(entry *Entry) ([]byte, error) {
|
|
||||||
var b *bytes.Buffer
|
|
||||||
keys := make([]string, 0, len(entry.Data))
|
|
||||||
for k := range entry.Data {
|
|
||||||
keys = append(keys, k)
|
|
||||||
}
|
|
||||||
|
|
||||||
if !f.DisableSorting {
|
|
||||||
sort.Strings(keys)
|
|
||||||
}
|
|
||||||
if entry.Buffer != nil {
|
|
||||||
b = entry.Buffer
|
|
||||||
} else {
|
|
||||||
b = &bytes.Buffer{}
|
|
||||||
}
|
|
||||||
|
|
||||||
prefixFieldClashes(entry.Data)
|
|
||||||
|
|
||||||
f.Do(func() { f.init(entry) })
|
|
||||||
|
|
||||||
isColored := (f.ForceColors || f.isTerminal) && !f.DisableColors
|
|
||||||
|
|
||||||
timestampFormat := f.TimestampFormat
|
|
||||||
if timestampFormat == "" {
|
|
||||||
timestampFormat = defaultTimestampFormat
|
|
||||||
}
|
|
||||||
if isColored {
|
|
||||||
f.printColored(b, entry, keys, timestampFormat)
|
|
||||||
} else {
|
|
||||||
if !f.DisableTimestamp {
|
|
||||||
f.appendKeyValue(b, "time", entry.Time.Format(timestampFormat))
|
|
||||||
}
|
|
||||||
f.appendKeyValue(b, "level", entry.Level.String())
|
|
||||||
if entry.Message != "" {
|
|
||||||
f.appendKeyValue(b, "msg", entry.Message)
|
|
||||||
}
|
|
||||||
for _, key := range keys {
|
|
||||||
f.appendKeyValue(b, key, entry.Data[key])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
b.WriteByte('\n')
|
|
||||||
return b.Bytes(), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *TextFormatter) printColored(b *bytes.Buffer, entry *Entry, keys []string, timestampFormat string) {
|
|
||||||
var levelColor int
|
|
||||||
switch entry.Level {
|
|
||||||
case DebugLevel:
|
|
||||||
levelColor = gray
|
|
||||||
case WarnLevel:
|
|
||||||
levelColor = yellow
|
|
||||||
case ErrorLevel, FatalLevel, PanicLevel:
|
|
||||||
levelColor = red
|
|
||||||
default:
|
|
||||||
levelColor = blue
|
|
||||||
}
|
|
||||||
|
|
||||||
levelText := strings.ToUpper(entry.Level.String())[0:4]
|
|
||||||
|
|
||||||
if f.DisableTimestamp {
|
|
||||||
fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m %-44s ", levelColor, levelText, entry.Message)
|
|
||||||
} else if !f.FullTimestamp {
|
|
||||||
fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%04d] %-44s ", levelColor, levelText, int(entry.Time.Sub(baseTimestamp)/time.Second), entry.Message)
|
|
||||||
} else {
|
|
||||||
fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%s] %-44s ", levelColor, levelText, entry.Time.Format(timestampFormat), entry.Message)
|
|
||||||
}
|
|
||||||
for _, k := range keys {
|
|
||||||
v := entry.Data[k]
|
|
||||||
fmt.Fprintf(b, " \x1b[%dm%s\x1b[0m=", levelColor, k)
|
|
||||||
f.appendValue(b, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *TextFormatter) needsQuoting(text string) bool {
|
|
||||||
if f.QuoteEmptyFields && len(text) == 0 {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
for _, ch := range text {
|
|
||||||
if !((ch >= 'a' && ch <= 'z') ||
|
|
||||||
(ch >= 'A' && ch <= 'Z') ||
|
|
||||||
(ch >= '0' && ch <= '9') ||
|
|
||||||
ch == '-' || ch == '.' || ch == '_' || ch == '/' || ch == '@' || ch == '^' || ch == '+') {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *TextFormatter) appendKeyValue(b *bytes.Buffer, key string, value interface{}) {
|
|
||||||
if b.Len() > 0 {
|
|
||||||
b.WriteByte(' ')
|
|
||||||
}
|
|
||||||
b.WriteString(key)
|
|
||||||
b.WriteByte('=')
|
|
||||||
f.appendValue(b, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *TextFormatter) appendValue(b *bytes.Buffer, value interface{}) {
|
|
||||||
stringVal, ok := value.(string)
|
|
||||||
if !ok {
|
|
||||||
stringVal = fmt.Sprint(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
if !f.needsQuoting(stringVal) {
|
|
||||||
b.WriteString(stringVal)
|
|
||||||
} else {
|
|
||||||
b.WriteString(fmt.Sprintf("%q", stringVal))
|
|
||||||
}
|
|
||||||
}
|
|
62
vendor/github.com/sirupsen/logrus/writer.go
generated
vendored
62
vendor/github.com/sirupsen/logrus/writer.go
generated
vendored
|
@ -1,62 +0,0 @@
|
||||||
package logrus
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bufio"
|
|
||||||
"io"
|
|
||||||
"runtime"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (logger *Logger) Writer() *io.PipeWriter {
|
|
||||||
return logger.WriterLevel(InfoLevel)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (logger *Logger) WriterLevel(level Level) *io.PipeWriter {
|
|
||||||
return NewEntry(logger).WriterLevel(level)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) Writer() *io.PipeWriter {
|
|
||||||
return entry.WriterLevel(InfoLevel)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) WriterLevel(level Level) *io.PipeWriter {
|
|
||||||
reader, writer := io.Pipe()
|
|
||||||
|
|
||||||
var printFunc func(args ...interface{})
|
|
||||||
|
|
||||||
switch level {
|
|
||||||
case DebugLevel:
|
|
||||||
printFunc = entry.Debug
|
|
||||||
case InfoLevel:
|
|
||||||
printFunc = entry.Info
|
|
||||||
case WarnLevel:
|
|
||||||
printFunc = entry.Warn
|
|
||||||
case ErrorLevel:
|
|
||||||
printFunc = entry.Error
|
|
||||||
case FatalLevel:
|
|
||||||
printFunc = entry.Fatal
|
|
||||||
case PanicLevel:
|
|
||||||
printFunc = entry.Panic
|
|
||||||
default:
|
|
||||||
printFunc = entry.Print
|
|
||||||
}
|
|
||||||
|
|
||||||
go entry.writerScanner(reader, printFunc)
|
|
||||||
runtime.SetFinalizer(writer, writerFinalizer)
|
|
||||||
|
|
||||||
return writer
|
|
||||||
}
|
|
||||||
|
|
||||||
func (entry *Entry) writerScanner(reader *io.PipeReader, printFunc func(args ...interface{})) {
|
|
||||||
scanner := bufio.NewScanner(reader)
|
|
||||||
for scanner.Scan() {
|
|
||||||
printFunc(scanner.Text())
|
|
||||||
}
|
|
||||||
if err := scanner.Err(); err != nil {
|
|
||||||
entry.Errorf("Error while reading from Writer: %s", err)
|
|
||||||
}
|
|
||||||
reader.Close()
|
|
||||||
}
|
|
||||||
|
|
||||||
func writerFinalizer(writer *io.PipeWriter) {
|
|
||||||
writer.Close()
|
|
||||||
}
|
|
28
vendor/github.com/spf13/pflag/LICENSE
generated
vendored
28
vendor/github.com/spf13/pflag/LICENSE
generated
vendored
|
@ -1,28 +0,0 @@
|
||||||
Copyright (c) 2012 Alex Ogier. All rights reserved.
|
|
||||||
Copyright (c) 2012 The Go Authors. All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
* Redistributions in binary form must reproduce the above
|
|
||||||
copyright notice, this list of conditions and the following disclaimer
|
|
||||||
in the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
* Neither the name of Google Inc. nor the names of its
|
|
||||||
contributors may be used to endorse or promote products derived from
|
|
||||||
this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
94
vendor/github.com/spf13/pflag/bool.go
generated
vendored
94
vendor/github.com/spf13/pflag/bool.go
generated
vendored
|
@ -1,94 +0,0 @@
|
||||||
package pflag
|
|
||||||
|
|
||||||
import "strconv"
|
|
||||||
|
|
||||||
// optional interface to indicate boolean flags that can be
|
|
||||||
// supplied without "=value" text
|
|
||||||
type boolFlag interface {
|
|
||||||
Value
|
|
||||||
IsBoolFlag() bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// -- bool Value
|
|
||||||
type boolValue bool
|
|
||||||
|
|
||||||
func newBoolValue(val bool, p *bool) *boolValue {
|
|
||||||
*p = val
|
|
||||||
return (*boolValue)(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *boolValue) Set(s string) error {
|
|
||||||
v, err := strconv.ParseBool(s)
|
|
||||||
*b = boolValue(v)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *boolValue) Type() string {
|
|
||||||
return "bool"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *boolValue) String() string { return strconv.FormatBool(bool(*b)) }
|
|
||||||
|
|
||||||
func (b *boolValue) IsBoolFlag() bool { return true }
|
|
||||||
|
|
||||||
func boolConv(sval string) (interface{}, error) {
|
|
||||||
return strconv.ParseBool(sval)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetBool return the bool value of a flag with the given name
|
|
||||||
func (f *FlagSet) GetBool(name string) (bool, error) {
|
|
||||||
val, err := f.getFlagType(name, "bool", boolConv)
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
return val.(bool), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// BoolVar defines a bool flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a bool variable in which to store the value of the flag.
|
|
||||||
func (f *FlagSet) BoolVar(p *bool, name string, value bool, usage string) {
|
|
||||||
f.BoolVarP(p, name, "", value, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// BoolVarP is like BoolVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) BoolVarP(p *bool, name, shorthand string, value bool, usage string) {
|
|
||||||
flag := f.VarPF(newBoolValue(value, p), name, shorthand, usage)
|
|
||||||
flag.NoOptDefVal = "true"
|
|
||||||
}
|
|
||||||
|
|
||||||
// BoolVar defines a bool flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a bool variable in which to store the value of the flag.
|
|
||||||
func BoolVar(p *bool, name string, value bool, usage string) {
|
|
||||||
BoolVarP(p, name, "", value, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// BoolVarP is like BoolVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func BoolVarP(p *bool, name, shorthand string, value bool, usage string) {
|
|
||||||
flag := CommandLine.VarPF(newBoolValue(value, p), name, shorthand, usage)
|
|
||||||
flag.NoOptDefVal = "true"
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bool defines a bool flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a bool variable that stores the value of the flag.
|
|
||||||
func (f *FlagSet) Bool(name string, value bool, usage string) *bool {
|
|
||||||
return f.BoolP(name, "", value, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// BoolP is like Bool, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) BoolP(name, shorthand string, value bool, usage string) *bool {
|
|
||||||
p := new(bool)
|
|
||||||
f.BoolVarP(p, name, shorthand, value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bool defines a bool flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a bool variable that stores the value of the flag.
|
|
||||||
func Bool(name string, value bool, usage string) *bool {
|
|
||||||
return BoolP(name, "", value, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// BoolP is like Bool, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func BoolP(name, shorthand string, value bool, usage string) *bool {
|
|
||||||
b := CommandLine.BoolP(name, shorthand, value, usage)
|
|
||||||
return b
|
|
||||||
}
|
|
147
vendor/github.com/spf13/pflag/bool_slice.go
generated
vendored
147
vendor/github.com/spf13/pflag/bool_slice.go
generated
vendored
|
@ -1,147 +0,0 @@
|
||||||
package pflag
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// -- boolSlice Value
|
|
||||||
type boolSliceValue struct {
|
|
||||||
value *[]bool
|
|
||||||
changed bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func newBoolSliceValue(val []bool, p *[]bool) *boolSliceValue {
|
|
||||||
bsv := new(boolSliceValue)
|
|
||||||
bsv.value = p
|
|
||||||
*bsv.value = val
|
|
||||||
return bsv
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set converts, and assigns, the comma-separated boolean argument string representation as the []bool value of this flag.
|
|
||||||
// If Set is called on a flag that already has a []bool assigned, the newly converted values will be appended.
|
|
||||||
func (s *boolSliceValue) Set(val string) error {
|
|
||||||
|
|
||||||
// remove all quote characters
|
|
||||||
rmQuote := strings.NewReplacer(`"`, "", `'`, "", "`", "")
|
|
||||||
|
|
||||||
// read flag arguments with CSV parser
|
|
||||||
boolStrSlice, err := readAsCSV(rmQuote.Replace(val))
|
|
||||||
if err != nil && err != io.EOF {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// parse boolean values into slice
|
|
||||||
out := make([]bool, 0, len(boolStrSlice))
|
|
||||||
for _, boolStr := range boolStrSlice {
|
|
||||||
b, err := strconv.ParseBool(strings.TrimSpace(boolStr))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
out = append(out, b)
|
|
||||||
}
|
|
||||||
|
|
||||||
if !s.changed {
|
|
||||||
*s.value = out
|
|
||||||
} else {
|
|
||||||
*s.value = append(*s.value, out...)
|
|
||||||
}
|
|
||||||
|
|
||||||
s.changed = true
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Type returns a string that uniquely represents this flag's type.
|
|
||||||
func (s *boolSliceValue) Type() string {
|
|
||||||
return "boolSlice"
|
|
||||||
}
|
|
||||||
|
|
||||||
// String defines a "native" format for this boolean slice flag value.
|
|
||||||
func (s *boolSliceValue) String() string {
|
|
||||||
|
|
||||||
boolStrSlice := make([]string, len(*s.value))
|
|
||||||
for i, b := range *s.value {
|
|
||||||
boolStrSlice[i] = strconv.FormatBool(b)
|
|
||||||
}
|
|
||||||
|
|
||||||
out, _ := writeAsCSV(boolStrSlice)
|
|
||||||
|
|
||||||
return "[" + out + "]"
|
|
||||||
}
|
|
||||||
|
|
||||||
func boolSliceConv(val string) (interface{}, error) {
|
|
||||||
val = strings.Trim(val, "[]")
|
|
||||||
// Empty string would cause a slice with one (empty) entry
|
|
||||||
if len(val) == 0 {
|
|
||||||
return []bool{}, nil
|
|
||||||
}
|
|
||||||
ss := strings.Split(val, ",")
|
|
||||||
out := make([]bool, len(ss))
|
|
||||||
for i, t := range ss {
|
|
||||||
var err error
|
|
||||||
out[i], err = strconv.ParseBool(t)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return out, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetBoolSlice returns the []bool value of a flag with the given name.
|
|
||||||
func (f *FlagSet) GetBoolSlice(name string) ([]bool, error) {
|
|
||||||
val, err := f.getFlagType(name, "boolSlice", boolSliceConv)
|
|
||||||
if err != nil {
|
|
||||||
return []bool{}, err
|
|
||||||
}
|
|
||||||
return val.([]bool), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// BoolSliceVar defines a boolSlice flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a []bool variable in which to store the value of the flag.
|
|
||||||
func (f *FlagSet) BoolSliceVar(p *[]bool, name string, value []bool, usage string) {
|
|
||||||
f.VarP(newBoolSliceValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// BoolSliceVarP is like BoolSliceVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) BoolSliceVarP(p *[]bool, name, shorthand string, value []bool, usage string) {
|
|
||||||
f.VarP(newBoolSliceValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// BoolSliceVar defines a []bool flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a []bool variable in which to store the value of the flag.
|
|
||||||
func BoolSliceVar(p *[]bool, name string, value []bool, usage string) {
|
|
||||||
CommandLine.VarP(newBoolSliceValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// BoolSliceVarP is like BoolSliceVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func BoolSliceVarP(p *[]bool, name, shorthand string, value []bool, usage string) {
|
|
||||||
CommandLine.VarP(newBoolSliceValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// BoolSlice defines a []bool flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a []bool variable that stores the value of the flag.
|
|
||||||
func (f *FlagSet) BoolSlice(name string, value []bool, usage string) *[]bool {
|
|
||||||
p := []bool{}
|
|
||||||
f.BoolSliceVarP(&p, name, "", value, usage)
|
|
||||||
return &p
|
|
||||||
}
|
|
||||||
|
|
||||||
// BoolSliceP is like BoolSlice, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) BoolSliceP(name, shorthand string, value []bool, usage string) *[]bool {
|
|
||||||
p := []bool{}
|
|
||||||
f.BoolSliceVarP(&p, name, shorthand, value, usage)
|
|
||||||
return &p
|
|
||||||
}
|
|
||||||
|
|
||||||
// BoolSlice defines a []bool flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a []bool variable that stores the value of the flag.
|
|
||||||
func BoolSlice(name string, value []bool, usage string) *[]bool {
|
|
||||||
return CommandLine.BoolSliceP(name, "", value, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// BoolSliceP is like BoolSlice, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func BoolSliceP(name, shorthand string, value []bool, usage string) *[]bool {
|
|
||||||
return CommandLine.BoolSliceP(name, shorthand, value, usage)
|
|
||||||
}
|
|
105
vendor/github.com/spf13/pflag/bytes.go
generated
vendored
105
vendor/github.com/spf13/pflag/bytes.go
generated
vendored
|
@ -1,105 +0,0 @@
|
||||||
package pflag
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/hex"
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// BytesHex adapts []byte for use as a flag. Value of flag is HEX encoded
|
|
||||||
type bytesHexValue []byte
|
|
||||||
|
|
||||||
func (bytesHex bytesHexValue) String() string {
|
|
||||||
return fmt.Sprintf("%X", []byte(bytesHex))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (bytesHex *bytesHexValue) Set(value string) error {
|
|
||||||
bin, err := hex.DecodeString(strings.TrimSpace(value))
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
*bytesHex = bin
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (*bytesHexValue) Type() string {
|
|
||||||
return "bytesHex"
|
|
||||||
}
|
|
||||||
|
|
||||||
func newBytesHexValue(val []byte, p *[]byte) *bytesHexValue {
|
|
||||||
*p = val
|
|
||||||
return (*bytesHexValue)(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
func bytesHexConv(sval string) (interface{}, error) {
|
|
||||||
|
|
||||||
bin, err := hex.DecodeString(sval)
|
|
||||||
|
|
||||||
if err == nil {
|
|
||||||
return bin, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil, fmt.Errorf("invalid string being converted to Bytes: %s %s", sval, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetBytesHex return the []byte value of a flag with the given name
|
|
||||||
func (f *FlagSet) GetBytesHex(name string) ([]byte, error) {
|
|
||||||
val, err := f.getFlagType(name, "bytesHex", bytesHexConv)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return []byte{}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return val.([]byte), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// BytesHexVar defines an []byte flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to an []byte variable in which to store the value of the flag.
|
|
||||||
func (f *FlagSet) BytesHexVar(p *[]byte, name string, value []byte, usage string) {
|
|
||||||
f.VarP(newBytesHexValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// BytesHexVarP is like BytesHexVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) BytesHexVarP(p *[]byte, name, shorthand string, value []byte, usage string) {
|
|
||||||
f.VarP(newBytesHexValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// BytesHexVar defines an []byte flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to an []byte variable in which to store the value of the flag.
|
|
||||||
func BytesHexVar(p *[]byte, name string, value []byte, usage string) {
|
|
||||||
CommandLine.VarP(newBytesHexValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// BytesHexVarP is like BytesHexVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func BytesHexVarP(p *[]byte, name, shorthand string, value []byte, usage string) {
|
|
||||||
CommandLine.VarP(newBytesHexValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// BytesHex defines an []byte flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of an []byte variable that stores the value of the flag.
|
|
||||||
func (f *FlagSet) BytesHex(name string, value []byte, usage string) *[]byte {
|
|
||||||
p := new([]byte)
|
|
||||||
f.BytesHexVarP(p, name, "", value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// BytesHexP is like BytesHex, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) BytesHexP(name, shorthand string, value []byte, usage string) *[]byte {
|
|
||||||
p := new([]byte)
|
|
||||||
f.BytesHexVarP(p, name, shorthand, value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// BytesHex defines an []byte flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of an []byte variable that stores the value of the flag.
|
|
||||||
func BytesHex(name string, value []byte, usage string) *[]byte {
|
|
||||||
return CommandLine.BytesHexP(name, "", value, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// BytesHexP is like BytesHex, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func BytesHexP(name, shorthand string, value []byte, usage string) *[]byte {
|
|
||||||
return CommandLine.BytesHexP(name, shorthand, value, usage)
|
|
||||||
}
|
|
96
vendor/github.com/spf13/pflag/count.go
generated
vendored
96
vendor/github.com/spf13/pflag/count.go
generated
vendored
|
@ -1,96 +0,0 @@
|
||||||
package pflag
|
|
||||||
|
|
||||||
import "strconv"
|
|
||||||
|
|
||||||
// -- count Value
|
|
||||||
type countValue int
|
|
||||||
|
|
||||||
func newCountValue(val int, p *int) *countValue {
|
|
||||||
*p = val
|
|
||||||
return (*countValue)(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *countValue) Set(s string) error {
|
|
||||||
// "+1" means that no specific value was passed, so increment
|
|
||||||
if s == "+1" {
|
|
||||||
*i = countValue(*i + 1)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
v, err := strconv.ParseInt(s, 0, 0)
|
|
||||||
*i = countValue(v)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *countValue) Type() string {
|
|
||||||
return "count"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *countValue) String() string { return strconv.Itoa(int(*i)) }
|
|
||||||
|
|
||||||
func countConv(sval string) (interface{}, error) {
|
|
||||||
i, err := strconv.Atoi(sval)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return i, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetCount return the int value of a flag with the given name
|
|
||||||
func (f *FlagSet) GetCount(name string) (int, error) {
|
|
||||||
val, err := f.getFlagType(name, "count", countConv)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return val.(int), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CountVar defines a count flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to an int variable in which to store the value of the flag.
|
|
||||||
// A count flag will add 1 to its value evey time it is found on the command line
|
|
||||||
func (f *FlagSet) CountVar(p *int, name string, usage string) {
|
|
||||||
f.CountVarP(p, name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CountVarP is like CountVar only take a shorthand for the flag name.
|
|
||||||
func (f *FlagSet) CountVarP(p *int, name, shorthand string, usage string) {
|
|
||||||
flag := f.VarPF(newCountValue(0, p), name, shorthand, usage)
|
|
||||||
flag.NoOptDefVal = "+1"
|
|
||||||
}
|
|
||||||
|
|
||||||
// CountVar like CountVar only the flag is placed on the CommandLine instead of a given flag set
|
|
||||||
func CountVar(p *int, name string, usage string) {
|
|
||||||
CommandLine.CountVar(p, name, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CountVarP is like CountVar only take a shorthand for the flag name.
|
|
||||||
func CountVarP(p *int, name, shorthand string, usage string) {
|
|
||||||
CommandLine.CountVarP(p, name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Count defines a count flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of an int variable that stores the value of the flag.
|
|
||||||
// A count flag will add 1 to its value evey time it is found on the command line
|
|
||||||
func (f *FlagSet) Count(name string, usage string) *int {
|
|
||||||
p := new(int)
|
|
||||||
f.CountVarP(p, name, "", usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// CountP is like Count only takes a shorthand for the flag name.
|
|
||||||
func (f *FlagSet) CountP(name, shorthand string, usage string) *int {
|
|
||||||
p := new(int)
|
|
||||||
f.CountVarP(p, name, shorthand, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// Count defines a count flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of an int variable that stores the value of the flag.
|
|
||||||
// A count flag will add 1 to its value evey time it is found on the command line
|
|
||||||
func Count(name string, usage string) *int {
|
|
||||||
return CommandLine.CountP(name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CountP is like Count only takes a shorthand for the flag name.
|
|
||||||
func CountP(name, shorthand string, usage string) *int {
|
|
||||||
return CommandLine.CountP(name, shorthand, usage)
|
|
||||||
}
|
|
86
vendor/github.com/spf13/pflag/duration.go
generated
vendored
86
vendor/github.com/spf13/pflag/duration.go
generated
vendored
|
@ -1,86 +0,0 @@
|
||||||
package pflag
|
|
||||||
|
|
||||||
import (
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// -- time.Duration Value
|
|
||||||
type durationValue time.Duration
|
|
||||||
|
|
||||||
func newDurationValue(val time.Duration, p *time.Duration) *durationValue {
|
|
||||||
*p = val
|
|
||||||
return (*durationValue)(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *durationValue) Set(s string) error {
|
|
||||||
v, err := time.ParseDuration(s)
|
|
||||||
*d = durationValue(v)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *durationValue) Type() string {
|
|
||||||
return "duration"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *durationValue) String() string { return (*time.Duration)(d).String() }
|
|
||||||
|
|
||||||
func durationConv(sval string) (interface{}, error) {
|
|
||||||
return time.ParseDuration(sval)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetDuration return the duration value of a flag with the given name
|
|
||||||
func (f *FlagSet) GetDuration(name string) (time.Duration, error) {
|
|
||||||
val, err := f.getFlagType(name, "duration", durationConv)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return val.(time.Duration), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DurationVar defines a time.Duration flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a time.Duration variable in which to store the value of the flag.
|
|
||||||
func (f *FlagSet) DurationVar(p *time.Duration, name string, value time.Duration, usage string) {
|
|
||||||
f.VarP(newDurationValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// DurationVarP is like DurationVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) DurationVarP(p *time.Duration, name, shorthand string, value time.Duration, usage string) {
|
|
||||||
f.VarP(newDurationValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// DurationVar defines a time.Duration flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a time.Duration variable in which to store the value of the flag.
|
|
||||||
func DurationVar(p *time.Duration, name string, value time.Duration, usage string) {
|
|
||||||
CommandLine.VarP(newDurationValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// DurationVarP is like DurationVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func DurationVarP(p *time.Duration, name, shorthand string, value time.Duration, usage string) {
|
|
||||||
CommandLine.VarP(newDurationValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Duration defines a time.Duration flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a time.Duration variable that stores the value of the flag.
|
|
||||||
func (f *FlagSet) Duration(name string, value time.Duration, usage string) *time.Duration {
|
|
||||||
p := new(time.Duration)
|
|
||||||
f.DurationVarP(p, name, "", value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// DurationP is like Duration, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) DurationP(name, shorthand string, value time.Duration, usage string) *time.Duration {
|
|
||||||
p := new(time.Duration)
|
|
||||||
f.DurationVarP(p, name, shorthand, value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// Duration defines a time.Duration flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a time.Duration variable that stores the value of the flag.
|
|
||||||
func Duration(name string, value time.Duration, usage string) *time.Duration {
|
|
||||||
return CommandLine.DurationP(name, "", value, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// DurationP is like Duration, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func DurationP(name, shorthand string, value time.Duration, usage string) *time.Duration {
|
|
||||||
return CommandLine.DurationP(name, shorthand, value, usage)
|
|
||||||
}
|
|
128
vendor/github.com/spf13/pflag/duration_slice.go
generated
vendored
128
vendor/github.com/spf13/pflag/duration_slice.go
generated
vendored
|
@ -1,128 +0,0 @@
|
||||||
package pflag
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// -- durationSlice Value
|
|
||||||
type durationSliceValue struct {
|
|
||||||
value *[]time.Duration
|
|
||||||
changed bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func newDurationSliceValue(val []time.Duration, p *[]time.Duration) *durationSliceValue {
|
|
||||||
dsv := new(durationSliceValue)
|
|
||||||
dsv.value = p
|
|
||||||
*dsv.value = val
|
|
||||||
return dsv
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *durationSliceValue) Set(val string) error {
|
|
||||||
ss := strings.Split(val, ",")
|
|
||||||
out := make([]time.Duration, len(ss))
|
|
||||||
for i, d := range ss {
|
|
||||||
var err error
|
|
||||||
out[i], err = time.ParseDuration(d)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
if !s.changed {
|
|
||||||
*s.value = out
|
|
||||||
} else {
|
|
||||||
*s.value = append(*s.value, out...)
|
|
||||||
}
|
|
||||||
s.changed = true
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *durationSliceValue) Type() string {
|
|
||||||
return "durationSlice"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *durationSliceValue) String() string {
|
|
||||||
out := make([]string, len(*s.value))
|
|
||||||
for i, d := range *s.value {
|
|
||||||
out[i] = fmt.Sprintf("%s", d)
|
|
||||||
}
|
|
||||||
return "[" + strings.Join(out, ",") + "]"
|
|
||||||
}
|
|
||||||
|
|
||||||
func durationSliceConv(val string) (interface{}, error) {
|
|
||||||
val = strings.Trim(val, "[]")
|
|
||||||
// Empty string would cause a slice with one (empty) entry
|
|
||||||
if len(val) == 0 {
|
|
||||||
return []time.Duration{}, nil
|
|
||||||
}
|
|
||||||
ss := strings.Split(val, ",")
|
|
||||||
out := make([]time.Duration, len(ss))
|
|
||||||
for i, d := range ss {
|
|
||||||
var err error
|
|
||||||
out[i], err = time.ParseDuration(d)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
return out, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetDurationSlice returns the []time.Duration value of a flag with the given name
|
|
||||||
func (f *FlagSet) GetDurationSlice(name string) ([]time.Duration, error) {
|
|
||||||
val, err := f.getFlagType(name, "durationSlice", durationSliceConv)
|
|
||||||
if err != nil {
|
|
||||||
return []time.Duration{}, err
|
|
||||||
}
|
|
||||||
return val.([]time.Duration), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DurationSliceVar defines a durationSlice flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a []time.Duration variable in which to store the value of the flag.
|
|
||||||
func (f *FlagSet) DurationSliceVar(p *[]time.Duration, name string, value []time.Duration, usage string) {
|
|
||||||
f.VarP(newDurationSliceValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// DurationSliceVarP is like DurationSliceVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) DurationSliceVarP(p *[]time.Duration, name, shorthand string, value []time.Duration, usage string) {
|
|
||||||
f.VarP(newDurationSliceValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// DurationSliceVar defines a duration[] flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a duration[] variable in which to store the value of the flag.
|
|
||||||
func DurationSliceVar(p *[]time.Duration, name string, value []time.Duration, usage string) {
|
|
||||||
CommandLine.VarP(newDurationSliceValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// DurationSliceVarP is like DurationSliceVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func DurationSliceVarP(p *[]time.Duration, name, shorthand string, value []time.Duration, usage string) {
|
|
||||||
CommandLine.VarP(newDurationSliceValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// DurationSlice defines a []time.Duration flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a []time.Duration variable that stores the value of the flag.
|
|
||||||
func (f *FlagSet) DurationSlice(name string, value []time.Duration, usage string) *[]time.Duration {
|
|
||||||
p := []time.Duration{}
|
|
||||||
f.DurationSliceVarP(&p, name, "", value, usage)
|
|
||||||
return &p
|
|
||||||
}
|
|
||||||
|
|
||||||
// DurationSliceP is like DurationSlice, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) DurationSliceP(name, shorthand string, value []time.Duration, usage string) *[]time.Duration {
|
|
||||||
p := []time.Duration{}
|
|
||||||
f.DurationSliceVarP(&p, name, shorthand, value, usage)
|
|
||||||
return &p
|
|
||||||
}
|
|
||||||
|
|
||||||
// DurationSlice defines a []time.Duration flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a []time.Duration variable that stores the value of the flag.
|
|
||||||
func DurationSlice(name string, value []time.Duration, usage string) *[]time.Duration {
|
|
||||||
return CommandLine.DurationSliceP(name, "", value, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// DurationSliceP is like DurationSlice, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func DurationSliceP(name, shorthand string, value []time.Duration, usage string) *[]time.Duration {
|
|
||||||
return CommandLine.DurationSliceP(name, shorthand, value, usage)
|
|
||||||
}
|
|
1223
vendor/github.com/spf13/pflag/flag.go
generated
vendored
1223
vendor/github.com/spf13/pflag/flag.go
generated
vendored
File diff suppressed because it is too large
Load diff
88
vendor/github.com/spf13/pflag/float32.go
generated
vendored
88
vendor/github.com/spf13/pflag/float32.go
generated
vendored
|
@ -1,88 +0,0 @@
|
||||||
package pflag
|
|
||||||
|
|
||||||
import "strconv"
|
|
||||||
|
|
||||||
// -- float32 Value
|
|
||||||
type float32Value float32
|
|
||||||
|
|
||||||
func newFloat32Value(val float32, p *float32) *float32Value {
|
|
||||||
*p = val
|
|
||||||
return (*float32Value)(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *float32Value) Set(s string) error {
|
|
||||||
v, err := strconv.ParseFloat(s, 32)
|
|
||||||
*f = float32Value(v)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *float32Value) Type() string {
|
|
||||||
return "float32"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *float32Value) String() string { return strconv.FormatFloat(float64(*f), 'g', -1, 32) }
|
|
||||||
|
|
||||||
func float32Conv(sval string) (interface{}, error) {
|
|
||||||
v, err := strconv.ParseFloat(sval, 32)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return float32(v), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetFloat32 return the float32 value of a flag with the given name
|
|
||||||
func (f *FlagSet) GetFloat32(name string) (float32, error) {
|
|
||||||
val, err := f.getFlagType(name, "float32", float32Conv)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return val.(float32), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float32Var defines a float32 flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a float32 variable in which to store the value of the flag.
|
|
||||||
func (f *FlagSet) Float32Var(p *float32, name string, value float32, usage string) {
|
|
||||||
f.VarP(newFloat32Value(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float32VarP is like Float32Var, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) Float32VarP(p *float32, name, shorthand string, value float32, usage string) {
|
|
||||||
f.VarP(newFloat32Value(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float32Var defines a float32 flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a float32 variable in which to store the value of the flag.
|
|
||||||
func Float32Var(p *float32, name string, value float32, usage string) {
|
|
||||||
CommandLine.VarP(newFloat32Value(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float32VarP is like Float32Var, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func Float32VarP(p *float32, name, shorthand string, value float32, usage string) {
|
|
||||||
CommandLine.VarP(newFloat32Value(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float32 defines a float32 flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a float32 variable that stores the value of the flag.
|
|
||||||
func (f *FlagSet) Float32(name string, value float32, usage string) *float32 {
|
|
||||||
p := new(float32)
|
|
||||||
f.Float32VarP(p, name, "", value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float32P is like Float32, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) Float32P(name, shorthand string, value float32, usage string) *float32 {
|
|
||||||
p := new(float32)
|
|
||||||
f.Float32VarP(p, name, shorthand, value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float32 defines a float32 flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a float32 variable that stores the value of the flag.
|
|
||||||
func Float32(name string, value float32, usage string) *float32 {
|
|
||||||
return CommandLine.Float32P(name, "", value, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float32P is like Float32, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func Float32P(name, shorthand string, value float32, usage string) *float32 {
|
|
||||||
return CommandLine.Float32P(name, shorthand, value, usage)
|
|
||||||
}
|
|
84
vendor/github.com/spf13/pflag/float64.go
generated
vendored
84
vendor/github.com/spf13/pflag/float64.go
generated
vendored
|
@ -1,84 +0,0 @@
|
||||||
package pflag
|
|
||||||
|
|
||||||
import "strconv"
|
|
||||||
|
|
||||||
// -- float64 Value
|
|
||||||
type float64Value float64
|
|
||||||
|
|
||||||
func newFloat64Value(val float64, p *float64) *float64Value {
|
|
||||||
*p = val
|
|
||||||
return (*float64Value)(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *float64Value) Set(s string) error {
|
|
||||||
v, err := strconv.ParseFloat(s, 64)
|
|
||||||
*f = float64Value(v)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *float64Value) Type() string {
|
|
||||||
return "float64"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *float64Value) String() string { return strconv.FormatFloat(float64(*f), 'g', -1, 64) }
|
|
||||||
|
|
||||||
func float64Conv(sval string) (interface{}, error) {
|
|
||||||
return strconv.ParseFloat(sval, 64)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetFloat64 return the float64 value of a flag with the given name
|
|
||||||
func (f *FlagSet) GetFloat64(name string) (float64, error) {
|
|
||||||
val, err := f.getFlagType(name, "float64", float64Conv)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return val.(float64), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float64Var defines a float64 flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a float64 variable in which to store the value of the flag.
|
|
||||||
func (f *FlagSet) Float64Var(p *float64, name string, value float64, usage string) {
|
|
||||||
f.VarP(newFloat64Value(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float64VarP is like Float64Var, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) Float64VarP(p *float64, name, shorthand string, value float64, usage string) {
|
|
||||||
f.VarP(newFloat64Value(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float64Var defines a float64 flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a float64 variable in which to store the value of the flag.
|
|
||||||
func Float64Var(p *float64, name string, value float64, usage string) {
|
|
||||||
CommandLine.VarP(newFloat64Value(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float64VarP is like Float64Var, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func Float64VarP(p *float64, name, shorthand string, value float64, usage string) {
|
|
||||||
CommandLine.VarP(newFloat64Value(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float64 defines a float64 flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a float64 variable that stores the value of the flag.
|
|
||||||
func (f *FlagSet) Float64(name string, value float64, usage string) *float64 {
|
|
||||||
p := new(float64)
|
|
||||||
f.Float64VarP(p, name, "", value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float64P is like Float64, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) Float64P(name, shorthand string, value float64, usage string) *float64 {
|
|
||||||
p := new(float64)
|
|
||||||
f.Float64VarP(p, name, shorthand, value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float64 defines a float64 flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a float64 variable that stores the value of the flag.
|
|
||||||
func Float64(name string, value float64, usage string) *float64 {
|
|
||||||
return CommandLine.Float64P(name, "", value, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float64P is like Float64, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func Float64P(name, shorthand string, value float64, usage string) *float64 {
|
|
||||||
return CommandLine.Float64P(name, shorthand, value, usage)
|
|
||||||
}
|
|
105
vendor/github.com/spf13/pflag/golangflag.go
generated
vendored
105
vendor/github.com/spf13/pflag/golangflag.go
generated
vendored
|
@ -1,105 +0,0 @@
|
||||||
// Copyright 2009 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package pflag
|
|
||||||
|
|
||||||
import (
|
|
||||||
goflag "flag"
|
|
||||||
"reflect"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// flagValueWrapper implements pflag.Value around a flag.Value. The main
|
|
||||||
// difference here is the addition of the Type method that returns a string
|
|
||||||
// name of the type. As this is generally unknown, we approximate that with
|
|
||||||
// reflection.
|
|
||||||
type flagValueWrapper struct {
|
|
||||||
inner goflag.Value
|
|
||||||
flagType string
|
|
||||||
}
|
|
||||||
|
|
||||||
// We are just copying the boolFlag interface out of goflag as that is what
|
|
||||||
// they use to decide if a flag should get "true" when no arg is given.
|
|
||||||
type goBoolFlag interface {
|
|
||||||
goflag.Value
|
|
||||||
IsBoolFlag() bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func wrapFlagValue(v goflag.Value) Value {
|
|
||||||
// If the flag.Value happens to also be a pflag.Value, just use it directly.
|
|
||||||
if pv, ok := v.(Value); ok {
|
|
||||||
return pv
|
|
||||||
}
|
|
||||||
|
|
||||||
pv := &flagValueWrapper{
|
|
||||||
inner: v,
|
|
||||||
}
|
|
||||||
|
|
||||||
t := reflect.TypeOf(v)
|
|
||||||
if t.Kind() == reflect.Interface || t.Kind() == reflect.Ptr {
|
|
||||||
t = t.Elem()
|
|
||||||
}
|
|
||||||
|
|
||||||
pv.flagType = strings.TrimSuffix(t.Name(), "Value")
|
|
||||||
return pv
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *flagValueWrapper) String() string {
|
|
||||||
return v.inner.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *flagValueWrapper) Set(s string) error {
|
|
||||||
return v.inner.Set(s)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *flagValueWrapper) Type() string {
|
|
||||||
return v.flagType
|
|
||||||
}
|
|
||||||
|
|
||||||
// PFlagFromGoFlag will return a *pflag.Flag given a *flag.Flag
|
|
||||||
// If the *flag.Flag.Name was a single character (ex: `v`) it will be accessiblei
|
|
||||||
// with both `-v` and `--v` in flags. If the golang flag was more than a single
|
|
||||||
// character (ex: `verbose`) it will only be accessible via `--verbose`
|
|
||||||
func PFlagFromGoFlag(goflag *goflag.Flag) *Flag {
|
|
||||||
// Remember the default value as a string; it won't change.
|
|
||||||
flag := &Flag{
|
|
||||||
Name: goflag.Name,
|
|
||||||
Usage: goflag.Usage,
|
|
||||||
Value: wrapFlagValue(goflag.Value),
|
|
||||||
// Looks like golang flags don't set DefValue correctly :-(
|
|
||||||
//DefValue: goflag.DefValue,
|
|
||||||
DefValue: goflag.Value.String(),
|
|
||||||
}
|
|
||||||
// Ex: if the golang flag was -v, allow both -v and --v to work
|
|
||||||
if len(flag.Name) == 1 {
|
|
||||||
flag.Shorthand = flag.Name
|
|
||||||
}
|
|
||||||
if fv, ok := goflag.Value.(goBoolFlag); ok && fv.IsBoolFlag() {
|
|
||||||
flag.NoOptDefVal = "true"
|
|
||||||
}
|
|
||||||
return flag
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddGoFlag will add the given *flag.Flag to the pflag.FlagSet
|
|
||||||
func (f *FlagSet) AddGoFlag(goflag *goflag.Flag) {
|
|
||||||
if f.Lookup(goflag.Name) != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
newflag := PFlagFromGoFlag(goflag)
|
|
||||||
f.AddFlag(newflag)
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddGoFlagSet will add the given *flag.FlagSet to the pflag.FlagSet
|
|
||||||
func (f *FlagSet) AddGoFlagSet(newSet *goflag.FlagSet) {
|
|
||||||
if newSet == nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
newSet.VisitAll(func(goflag *goflag.Flag) {
|
|
||||||
f.AddGoFlag(goflag)
|
|
||||||
})
|
|
||||||
if f.addedGoFlagSets == nil {
|
|
||||||
f.addedGoFlagSets = make([]*goflag.FlagSet, 0)
|
|
||||||
}
|
|
||||||
f.addedGoFlagSets = append(f.addedGoFlagSets, newSet)
|
|
||||||
}
|
|
84
vendor/github.com/spf13/pflag/int.go
generated
vendored
84
vendor/github.com/spf13/pflag/int.go
generated
vendored
|
@ -1,84 +0,0 @@
|
||||||
package pflag
|
|
||||||
|
|
||||||
import "strconv"
|
|
||||||
|
|
||||||
// -- int Value
|
|
||||||
type intValue int
|
|
||||||
|
|
||||||
func newIntValue(val int, p *int) *intValue {
|
|
||||||
*p = val
|
|
||||||
return (*intValue)(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *intValue) Set(s string) error {
|
|
||||||
v, err := strconv.ParseInt(s, 0, 64)
|
|
||||||
*i = intValue(v)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *intValue) Type() string {
|
|
||||||
return "int"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *intValue) String() string { return strconv.Itoa(int(*i)) }
|
|
||||||
|
|
||||||
func intConv(sval string) (interface{}, error) {
|
|
||||||
return strconv.Atoi(sval)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetInt return the int value of a flag with the given name
|
|
||||||
func (f *FlagSet) GetInt(name string) (int, error) {
|
|
||||||
val, err := f.getFlagType(name, "int", intConv)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return val.(int), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// IntVar defines an int flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to an int variable in which to store the value of the flag.
|
|
||||||
func (f *FlagSet) IntVar(p *int, name string, value int, usage string) {
|
|
||||||
f.VarP(newIntValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IntVarP is like IntVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) IntVarP(p *int, name, shorthand string, value int, usage string) {
|
|
||||||
f.VarP(newIntValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IntVar defines an int flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to an int variable in which to store the value of the flag.
|
|
||||||
func IntVar(p *int, name string, value int, usage string) {
|
|
||||||
CommandLine.VarP(newIntValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IntVarP is like IntVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func IntVarP(p *int, name, shorthand string, value int, usage string) {
|
|
||||||
CommandLine.VarP(newIntValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int defines an int flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of an int variable that stores the value of the flag.
|
|
||||||
func (f *FlagSet) Int(name string, value int, usage string) *int {
|
|
||||||
p := new(int)
|
|
||||||
f.IntVarP(p, name, "", value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// IntP is like Int, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) IntP(name, shorthand string, value int, usage string) *int {
|
|
||||||
p := new(int)
|
|
||||||
f.IntVarP(p, name, shorthand, value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int defines an int flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of an int variable that stores the value of the flag.
|
|
||||||
func Int(name string, value int, usage string) *int {
|
|
||||||
return CommandLine.IntP(name, "", value, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IntP is like Int, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func IntP(name, shorthand string, value int, usage string) *int {
|
|
||||||
return CommandLine.IntP(name, shorthand, value, usage)
|
|
||||||
}
|
|
88
vendor/github.com/spf13/pflag/int16.go
generated
vendored
88
vendor/github.com/spf13/pflag/int16.go
generated
vendored
|
@ -1,88 +0,0 @@
|
||||||
package pflag
|
|
||||||
|
|
||||||
import "strconv"
|
|
||||||
|
|
||||||
// -- int16 Value
|
|
||||||
type int16Value int16
|
|
||||||
|
|
||||||
func newInt16Value(val int16, p *int16) *int16Value {
|
|
||||||
*p = val
|
|
||||||
return (*int16Value)(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *int16Value) Set(s string) error {
|
|
||||||
v, err := strconv.ParseInt(s, 0, 16)
|
|
||||||
*i = int16Value(v)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *int16Value) Type() string {
|
|
||||||
return "int16"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *int16Value) String() string { return strconv.FormatInt(int64(*i), 10) }
|
|
||||||
|
|
||||||
func int16Conv(sval string) (interface{}, error) {
|
|
||||||
v, err := strconv.ParseInt(sval, 0, 16)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return int16(v), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetInt16 returns the int16 value of a flag with the given name
|
|
||||||
func (f *FlagSet) GetInt16(name string) (int16, error) {
|
|
||||||
val, err := f.getFlagType(name, "int16", int16Conv)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return val.(int16), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int16Var defines an int16 flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to an int16 variable in which to store the value of the flag.
|
|
||||||
func (f *FlagSet) Int16Var(p *int16, name string, value int16, usage string) {
|
|
||||||
f.VarP(newInt16Value(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int16VarP is like Int16Var, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) Int16VarP(p *int16, name, shorthand string, value int16, usage string) {
|
|
||||||
f.VarP(newInt16Value(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int16Var defines an int16 flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to an int16 variable in which to store the value of the flag.
|
|
||||||
func Int16Var(p *int16, name string, value int16, usage string) {
|
|
||||||
CommandLine.VarP(newInt16Value(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int16VarP is like Int16Var, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func Int16VarP(p *int16, name, shorthand string, value int16, usage string) {
|
|
||||||
CommandLine.VarP(newInt16Value(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int16 defines an int16 flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of an int16 variable that stores the value of the flag.
|
|
||||||
func (f *FlagSet) Int16(name string, value int16, usage string) *int16 {
|
|
||||||
p := new(int16)
|
|
||||||
f.Int16VarP(p, name, "", value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int16P is like Int16, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) Int16P(name, shorthand string, value int16, usage string) *int16 {
|
|
||||||
p := new(int16)
|
|
||||||
f.Int16VarP(p, name, shorthand, value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int16 defines an int16 flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of an int16 variable that stores the value of the flag.
|
|
||||||
func Int16(name string, value int16, usage string) *int16 {
|
|
||||||
return CommandLine.Int16P(name, "", value, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int16P is like Int16, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func Int16P(name, shorthand string, value int16, usage string) *int16 {
|
|
||||||
return CommandLine.Int16P(name, shorthand, value, usage)
|
|
||||||
}
|
|
88
vendor/github.com/spf13/pflag/int32.go
generated
vendored
88
vendor/github.com/spf13/pflag/int32.go
generated
vendored
|
@ -1,88 +0,0 @@
|
||||||
package pflag
|
|
||||||
|
|
||||||
import "strconv"
|
|
||||||
|
|
||||||
// -- int32 Value
|
|
||||||
type int32Value int32
|
|
||||||
|
|
||||||
func newInt32Value(val int32, p *int32) *int32Value {
|
|
||||||
*p = val
|
|
||||||
return (*int32Value)(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *int32Value) Set(s string) error {
|
|
||||||
v, err := strconv.ParseInt(s, 0, 32)
|
|
||||||
*i = int32Value(v)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *int32Value) Type() string {
|
|
||||||
return "int32"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *int32Value) String() string { return strconv.FormatInt(int64(*i), 10) }
|
|
||||||
|
|
||||||
func int32Conv(sval string) (interface{}, error) {
|
|
||||||
v, err := strconv.ParseInt(sval, 0, 32)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return int32(v), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetInt32 return the int32 value of a flag with the given name
|
|
||||||
func (f *FlagSet) GetInt32(name string) (int32, error) {
|
|
||||||
val, err := f.getFlagType(name, "int32", int32Conv)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return val.(int32), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int32Var defines an int32 flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to an int32 variable in which to store the value of the flag.
|
|
||||||
func (f *FlagSet) Int32Var(p *int32, name string, value int32, usage string) {
|
|
||||||
f.VarP(newInt32Value(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int32VarP is like Int32Var, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) Int32VarP(p *int32, name, shorthand string, value int32, usage string) {
|
|
||||||
f.VarP(newInt32Value(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int32Var defines an int32 flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to an int32 variable in which to store the value of the flag.
|
|
||||||
func Int32Var(p *int32, name string, value int32, usage string) {
|
|
||||||
CommandLine.VarP(newInt32Value(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int32VarP is like Int32Var, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func Int32VarP(p *int32, name, shorthand string, value int32, usage string) {
|
|
||||||
CommandLine.VarP(newInt32Value(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int32 defines an int32 flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of an int32 variable that stores the value of the flag.
|
|
||||||
func (f *FlagSet) Int32(name string, value int32, usage string) *int32 {
|
|
||||||
p := new(int32)
|
|
||||||
f.Int32VarP(p, name, "", value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int32P is like Int32, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) Int32P(name, shorthand string, value int32, usage string) *int32 {
|
|
||||||
p := new(int32)
|
|
||||||
f.Int32VarP(p, name, shorthand, value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int32 defines an int32 flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of an int32 variable that stores the value of the flag.
|
|
||||||
func Int32(name string, value int32, usage string) *int32 {
|
|
||||||
return CommandLine.Int32P(name, "", value, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int32P is like Int32, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func Int32P(name, shorthand string, value int32, usage string) *int32 {
|
|
||||||
return CommandLine.Int32P(name, shorthand, value, usage)
|
|
||||||
}
|
|
84
vendor/github.com/spf13/pflag/int64.go
generated
vendored
84
vendor/github.com/spf13/pflag/int64.go
generated
vendored
|
@ -1,84 +0,0 @@
|
||||||
package pflag
|
|
||||||
|
|
||||||
import "strconv"
|
|
||||||
|
|
||||||
// -- int64 Value
|
|
||||||
type int64Value int64
|
|
||||||
|
|
||||||
func newInt64Value(val int64, p *int64) *int64Value {
|
|
||||||
*p = val
|
|
||||||
return (*int64Value)(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *int64Value) Set(s string) error {
|
|
||||||
v, err := strconv.ParseInt(s, 0, 64)
|
|
||||||
*i = int64Value(v)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *int64Value) Type() string {
|
|
||||||
return "int64"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *int64Value) String() string { return strconv.FormatInt(int64(*i), 10) }
|
|
||||||
|
|
||||||
func int64Conv(sval string) (interface{}, error) {
|
|
||||||
return strconv.ParseInt(sval, 0, 64)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetInt64 return the int64 value of a flag with the given name
|
|
||||||
func (f *FlagSet) GetInt64(name string) (int64, error) {
|
|
||||||
val, err := f.getFlagType(name, "int64", int64Conv)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return val.(int64), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int64Var defines an int64 flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to an int64 variable in which to store the value of the flag.
|
|
||||||
func (f *FlagSet) Int64Var(p *int64, name string, value int64, usage string) {
|
|
||||||
f.VarP(newInt64Value(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int64VarP is like Int64Var, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) Int64VarP(p *int64, name, shorthand string, value int64, usage string) {
|
|
||||||
f.VarP(newInt64Value(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int64Var defines an int64 flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to an int64 variable in which to store the value of the flag.
|
|
||||||
func Int64Var(p *int64, name string, value int64, usage string) {
|
|
||||||
CommandLine.VarP(newInt64Value(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int64VarP is like Int64Var, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func Int64VarP(p *int64, name, shorthand string, value int64, usage string) {
|
|
||||||
CommandLine.VarP(newInt64Value(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int64 defines an int64 flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of an int64 variable that stores the value of the flag.
|
|
||||||
func (f *FlagSet) Int64(name string, value int64, usage string) *int64 {
|
|
||||||
p := new(int64)
|
|
||||||
f.Int64VarP(p, name, "", value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int64P is like Int64, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) Int64P(name, shorthand string, value int64, usage string) *int64 {
|
|
||||||
p := new(int64)
|
|
||||||
f.Int64VarP(p, name, shorthand, value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int64 defines an int64 flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of an int64 variable that stores the value of the flag.
|
|
||||||
func Int64(name string, value int64, usage string) *int64 {
|
|
||||||
return CommandLine.Int64P(name, "", value, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int64P is like Int64, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func Int64P(name, shorthand string, value int64, usage string) *int64 {
|
|
||||||
return CommandLine.Int64P(name, shorthand, value, usage)
|
|
||||||
}
|
|
88
vendor/github.com/spf13/pflag/int8.go
generated
vendored
88
vendor/github.com/spf13/pflag/int8.go
generated
vendored
|
@ -1,88 +0,0 @@
|
||||||
package pflag
|
|
||||||
|
|
||||||
import "strconv"
|
|
||||||
|
|
||||||
// -- int8 Value
|
|
||||||
type int8Value int8
|
|
||||||
|
|
||||||
func newInt8Value(val int8, p *int8) *int8Value {
|
|
||||||
*p = val
|
|
||||||
return (*int8Value)(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *int8Value) Set(s string) error {
|
|
||||||
v, err := strconv.ParseInt(s, 0, 8)
|
|
||||||
*i = int8Value(v)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *int8Value) Type() string {
|
|
||||||
return "int8"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *int8Value) String() string { return strconv.FormatInt(int64(*i), 10) }
|
|
||||||
|
|
||||||
func int8Conv(sval string) (interface{}, error) {
|
|
||||||
v, err := strconv.ParseInt(sval, 0, 8)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return int8(v), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetInt8 return the int8 value of a flag with the given name
|
|
||||||
func (f *FlagSet) GetInt8(name string) (int8, error) {
|
|
||||||
val, err := f.getFlagType(name, "int8", int8Conv)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return val.(int8), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int8Var defines an int8 flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to an int8 variable in which to store the value of the flag.
|
|
||||||
func (f *FlagSet) Int8Var(p *int8, name string, value int8, usage string) {
|
|
||||||
f.VarP(newInt8Value(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int8VarP is like Int8Var, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) Int8VarP(p *int8, name, shorthand string, value int8, usage string) {
|
|
||||||
f.VarP(newInt8Value(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int8Var defines an int8 flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to an int8 variable in which to store the value of the flag.
|
|
||||||
func Int8Var(p *int8, name string, value int8, usage string) {
|
|
||||||
CommandLine.VarP(newInt8Value(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int8VarP is like Int8Var, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func Int8VarP(p *int8, name, shorthand string, value int8, usage string) {
|
|
||||||
CommandLine.VarP(newInt8Value(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int8 defines an int8 flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of an int8 variable that stores the value of the flag.
|
|
||||||
func (f *FlagSet) Int8(name string, value int8, usage string) *int8 {
|
|
||||||
p := new(int8)
|
|
||||||
f.Int8VarP(p, name, "", value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int8P is like Int8, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) Int8P(name, shorthand string, value int8, usage string) *int8 {
|
|
||||||
p := new(int8)
|
|
||||||
f.Int8VarP(p, name, shorthand, value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int8 defines an int8 flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of an int8 variable that stores the value of the flag.
|
|
||||||
func Int8(name string, value int8, usage string) *int8 {
|
|
||||||
return CommandLine.Int8P(name, "", value, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int8P is like Int8, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func Int8P(name, shorthand string, value int8, usage string) *int8 {
|
|
||||||
return CommandLine.Int8P(name, shorthand, value, usage)
|
|
||||||
}
|
|
128
vendor/github.com/spf13/pflag/int_slice.go
generated
vendored
128
vendor/github.com/spf13/pflag/int_slice.go
generated
vendored
|
@ -1,128 +0,0 @@
|
||||||
package pflag
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// -- intSlice Value
|
|
||||||
type intSliceValue struct {
|
|
||||||
value *[]int
|
|
||||||
changed bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func newIntSliceValue(val []int, p *[]int) *intSliceValue {
|
|
||||||
isv := new(intSliceValue)
|
|
||||||
isv.value = p
|
|
||||||
*isv.value = val
|
|
||||||
return isv
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *intSliceValue) Set(val string) error {
|
|
||||||
ss := strings.Split(val, ",")
|
|
||||||
out := make([]int, len(ss))
|
|
||||||
for i, d := range ss {
|
|
||||||
var err error
|
|
||||||
out[i], err = strconv.Atoi(d)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
if !s.changed {
|
|
||||||
*s.value = out
|
|
||||||
} else {
|
|
||||||
*s.value = append(*s.value, out...)
|
|
||||||
}
|
|
||||||
s.changed = true
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *intSliceValue) Type() string {
|
|
||||||
return "intSlice"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *intSliceValue) String() string {
|
|
||||||
out := make([]string, len(*s.value))
|
|
||||||
for i, d := range *s.value {
|
|
||||||
out[i] = fmt.Sprintf("%d", d)
|
|
||||||
}
|
|
||||||
return "[" + strings.Join(out, ",") + "]"
|
|
||||||
}
|
|
||||||
|
|
||||||
func intSliceConv(val string) (interface{}, error) {
|
|
||||||
val = strings.Trim(val, "[]")
|
|
||||||
// Empty string would cause a slice with one (empty) entry
|
|
||||||
if len(val) == 0 {
|
|
||||||
return []int{}, nil
|
|
||||||
}
|
|
||||||
ss := strings.Split(val, ",")
|
|
||||||
out := make([]int, len(ss))
|
|
||||||
for i, d := range ss {
|
|
||||||
var err error
|
|
||||||
out[i], err = strconv.Atoi(d)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
return out, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetIntSlice return the []int value of a flag with the given name
|
|
||||||
func (f *FlagSet) GetIntSlice(name string) ([]int, error) {
|
|
||||||
val, err := f.getFlagType(name, "intSlice", intSliceConv)
|
|
||||||
if err != nil {
|
|
||||||
return []int{}, err
|
|
||||||
}
|
|
||||||
return val.([]int), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// IntSliceVar defines a intSlice flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a []int variable in which to store the value of the flag.
|
|
||||||
func (f *FlagSet) IntSliceVar(p *[]int, name string, value []int, usage string) {
|
|
||||||
f.VarP(newIntSliceValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IntSliceVarP is like IntSliceVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) IntSliceVarP(p *[]int, name, shorthand string, value []int, usage string) {
|
|
||||||
f.VarP(newIntSliceValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IntSliceVar defines a int[] flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a int[] variable in which to store the value of the flag.
|
|
||||||
func IntSliceVar(p *[]int, name string, value []int, usage string) {
|
|
||||||
CommandLine.VarP(newIntSliceValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IntSliceVarP is like IntSliceVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func IntSliceVarP(p *[]int, name, shorthand string, value []int, usage string) {
|
|
||||||
CommandLine.VarP(newIntSliceValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IntSlice defines a []int flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a []int variable that stores the value of the flag.
|
|
||||||
func (f *FlagSet) IntSlice(name string, value []int, usage string) *[]int {
|
|
||||||
p := []int{}
|
|
||||||
f.IntSliceVarP(&p, name, "", value, usage)
|
|
||||||
return &p
|
|
||||||
}
|
|
||||||
|
|
||||||
// IntSliceP is like IntSlice, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) IntSliceP(name, shorthand string, value []int, usage string) *[]int {
|
|
||||||
p := []int{}
|
|
||||||
f.IntSliceVarP(&p, name, shorthand, value, usage)
|
|
||||||
return &p
|
|
||||||
}
|
|
||||||
|
|
||||||
// IntSlice defines a []int flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a []int variable that stores the value of the flag.
|
|
||||||
func IntSlice(name string, value []int, usage string) *[]int {
|
|
||||||
return CommandLine.IntSliceP(name, "", value, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IntSliceP is like IntSlice, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func IntSliceP(name, shorthand string, value []int, usage string) *[]int {
|
|
||||||
return CommandLine.IntSliceP(name, shorthand, value, usage)
|
|
||||||
}
|
|
94
vendor/github.com/spf13/pflag/ip.go
generated
vendored
94
vendor/github.com/spf13/pflag/ip.go
generated
vendored
|
@ -1,94 +0,0 @@
|
||||||
package pflag
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"net"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// -- net.IP value
|
|
||||||
type ipValue net.IP
|
|
||||||
|
|
||||||
func newIPValue(val net.IP, p *net.IP) *ipValue {
|
|
||||||
*p = val
|
|
||||||
return (*ipValue)(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *ipValue) String() string { return net.IP(*i).String() }
|
|
||||||
func (i *ipValue) Set(s string) error {
|
|
||||||
ip := net.ParseIP(strings.TrimSpace(s))
|
|
||||||
if ip == nil {
|
|
||||||
return fmt.Errorf("failed to parse IP: %q", s)
|
|
||||||
}
|
|
||||||
*i = ipValue(ip)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *ipValue) Type() string {
|
|
||||||
return "ip"
|
|
||||||
}
|
|
||||||
|
|
||||||
func ipConv(sval string) (interface{}, error) {
|
|
||||||
ip := net.ParseIP(sval)
|
|
||||||
if ip != nil {
|
|
||||||
return ip, nil
|
|
||||||
}
|
|
||||||
return nil, fmt.Errorf("invalid string being converted to IP address: %s", sval)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetIP return the net.IP value of a flag with the given name
|
|
||||||
func (f *FlagSet) GetIP(name string) (net.IP, error) {
|
|
||||||
val, err := f.getFlagType(name, "ip", ipConv)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return val.(net.IP), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPVar defines an net.IP flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to an net.IP variable in which to store the value of the flag.
|
|
||||||
func (f *FlagSet) IPVar(p *net.IP, name string, value net.IP, usage string) {
|
|
||||||
f.VarP(newIPValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPVarP is like IPVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) IPVarP(p *net.IP, name, shorthand string, value net.IP, usage string) {
|
|
||||||
f.VarP(newIPValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPVar defines an net.IP flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to an net.IP variable in which to store the value of the flag.
|
|
||||||
func IPVar(p *net.IP, name string, value net.IP, usage string) {
|
|
||||||
CommandLine.VarP(newIPValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPVarP is like IPVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func IPVarP(p *net.IP, name, shorthand string, value net.IP, usage string) {
|
|
||||||
CommandLine.VarP(newIPValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IP defines an net.IP flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of an net.IP variable that stores the value of the flag.
|
|
||||||
func (f *FlagSet) IP(name string, value net.IP, usage string) *net.IP {
|
|
||||||
p := new(net.IP)
|
|
||||||
f.IPVarP(p, name, "", value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPP is like IP, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) IPP(name, shorthand string, value net.IP, usage string) *net.IP {
|
|
||||||
p := new(net.IP)
|
|
||||||
f.IPVarP(p, name, shorthand, value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// IP defines an net.IP flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of an net.IP variable that stores the value of the flag.
|
|
||||||
func IP(name string, value net.IP, usage string) *net.IP {
|
|
||||||
return CommandLine.IPP(name, "", value, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPP is like IP, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func IPP(name, shorthand string, value net.IP, usage string) *net.IP {
|
|
||||||
return CommandLine.IPP(name, shorthand, value, usage)
|
|
||||||
}
|
|
148
vendor/github.com/spf13/pflag/ip_slice.go
generated
vendored
148
vendor/github.com/spf13/pflag/ip_slice.go
generated
vendored
|
@ -1,148 +0,0 @@
|
||||||
package pflag
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"net"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// -- ipSlice Value
|
|
||||||
type ipSliceValue struct {
|
|
||||||
value *[]net.IP
|
|
||||||
changed bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func newIPSliceValue(val []net.IP, p *[]net.IP) *ipSliceValue {
|
|
||||||
ipsv := new(ipSliceValue)
|
|
||||||
ipsv.value = p
|
|
||||||
*ipsv.value = val
|
|
||||||
return ipsv
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set converts, and assigns, the comma-separated IP argument string representation as the []net.IP value of this flag.
|
|
||||||
// If Set is called on a flag that already has a []net.IP assigned, the newly converted values will be appended.
|
|
||||||
func (s *ipSliceValue) Set(val string) error {
|
|
||||||
|
|
||||||
// remove all quote characters
|
|
||||||
rmQuote := strings.NewReplacer(`"`, "", `'`, "", "`", "")
|
|
||||||
|
|
||||||
// read flag arguments with CSV parser
|
|
||||||
ipStrSlice, err := readAsCSV(rmQuote.Replace(val))
|
|
||||||
if err != nil && err != io.EOF {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// parse ip values into slice
|
|
||||||
out := make([]net.IP, 0, len(ipStrSlice))
|
|
||||||
for _, ipStr := range ipStrSlice {
|
|
||||||
ip := net.ParseIP(strings.TrimSpace(ipStr))
|
|
||||||
if ip == nil {
|
|
||||||
return fmt.Errorf("invalid string being converted to IP address: %s", ipStr)
|
|
||||||
}
|
|
||||||
out = append(out, ip)
|
|
||||||
}
|
|
||||||
|
|
||||||
if !s.changed {
|
|
||||||
*s.value = out
|
|
||||||
} else {
|
|
||||||
*s.value = append(*s.value, out...)
|
|
||||||
}
|
|
||||||
|
|
||||||
s.changed = true
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Type returns a string that uniquely represents this flag's type.
|
|
||||||
func (s *ipSliceValue) Type() string {
|
|
||||||
return "ipSlice"
|
|
||||||
}
|
|
||||||
|
|
||||||
// String defines a "native" format for this net.IP slice flag value.
|
|
||||||
func (s *ipSliceValue) String() string {
|
|
||||||
|
|
||||||
ipStrSlice := make([]string, len(*s.value))
|
|
||||||
for i, ip := range *s.value {
|
|
||||||
ipStrSlice[i] = ip.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
out, _ := writeAsCSV(ipStrSlice)
|
|
||||||
|
|
||||||
return "[" + out + "]"
|
|
||||||
}
|
|
||||||
|
|
||||||
func ipSliceConv(val string) (interface{}, error) {
|
|
||||||
val = strings.Trim(val, "[]")
|
|
||||||
// Emtpy string would cause a slice with one (empty) entry
|
|
||||||
if len(val) == 0 {
|
|
||||||
return []net.IP{}, nil
|
|
||||||
}
|
|
||||||
ss := strings.Split(val, ",")
|
|
||||||
out := make([]net.IP, len(ss))
|
|
||||||
for i, sval := range ss {
|
|
||||||
ip := net.ParseIP(strings.TrimSpace(sval))
|
|
||||||
if ip == nil {
|
|
||||||
return nil, fmt.Errorf("invalid string being converted to IP address: %s", sval)
|
|
||||||
}
|
|
||||||
out[i] = ip
|
|
||||||
}
|
|
||||||
return out, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetIPSlice returns the []net.IP value of a flag with the given name
|
|
||||||
func (f *FlagSet) GetIPSlice(name string) ([]net.IP, error) {
|
|
||||||
val, err := f.getFlagType(name, "ipSlice", ipSliceConv)
|
|
||||||
if err != nil {
|
|
||||||
return []net.IP{}, err
|
|
||||||
}
|
|
||||||
return val.([]net.IP), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPSliceVar defines a ipSlice flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a []net.IP variable in which to store the value of the flag.
|
|
||||||
func (f *FlagSet) IPSliceVar(p *[]net.IP, name string, value []net.IP, usage string) {
|
|
||||||
f.VarP(newIPSliceValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPSliceVarP is like IPSliceVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) IPSliceVarP(p *[]net.IP, name, shorthand string, value []net.IP, usage string) {
|
|
||||||
f.VarP(newIPSliceValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPSliceVar defines a []net.IP flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a []net.IP variable in which to store the value of the flag.
|
|
||||||
func IPSliceVar(p *[]net.IP, name string, value []net.IP, usage string) {
|
|
||||||
CommandLine.VarP(newIPSliceValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPSliceVarP is like IPSliceVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func IPSliceVarP(p *[]net.IP, name, shorthand string, value []net.IP, usage string) {
|
|
||||||
CommandLine.VarP(newIPSliceValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPSlice defines a []net.IP flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a []net.IP variable that stores the value of that flag.
|
|
||||||
func (f *FlagSet) IPSlice(name string, value []net.IP, usage string) *[]net.IP {
|
|
||||||
p := []net.IP{}
|
|
||||||
f.IPSliceVarP(&p, name, "", value, usage)
|
|
||||||
return &p
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPSliceP is like IPSlice, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) IPSliceP(name, shorthand string, value []net.IP, usage string) *[]net.IP {
|
|
||||||
p := []net.IP{}
|
|
||||||
f.IPSliceVarP(&p, name, shorthand, value, usage)
|
|
||||||
return &p
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPSlice defines a []net.IP flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a []net.IP variable that stores the value of the flag.
|
|
||||||
func IPSlice(name string, value []net.IP, usage string) *[]net.IP {
|
|
||||||
return CommandLine.IPSliceP(name, "", value, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPSliceP is like IPSlice, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func IPSliceP(name, shorthand string, value []net.IP, usage string) *[]net.IP {
|
|
||||||
return CommandLine.IPSliceP(name, shorthand, value, usage)
|
|
||||||
}
|
|
122
vendor/github.com/spf13/pflag/ipmask.go
generated
vendored
122
vendor/github.com/spf13/pflag/ipmask.go
generated
vendored
|
@ -1,122 +0,0 @@
|
||||||
package pflag
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"net"
|
|
||||||
"strconv"
|
|
||||||
)
|
|
||||||
|
|
||||||
// -- net.IPMask value
|
|
||||||
type ipMaskValue net.IPMask
|
|
||||||
|
|
||||||
func newIPMaskValue(val net.IPMask, p *net.IPMask) *ipMaskValue {
|
|
||||||
*p = val
|
|
||||||
return (*ipMaskValue)(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *ipMaskValue) String() string { return net.IPMask(*i).String() }
|
|
||||||
func (i *ipMaskValue) Set(s string) error {
|
|
||||||
ip := ParseIPv4Mask(s)
|
|
||||||
if ip == nil {
|
|
||||||
return fmt.Errorf("failed to parse IP mask: %q", s)
|
|
||||||
}
|
|
||||||
*i = ipMaskValue(ip)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *ipMaskValue) Type() string {
|
|
||||||
return "ipMask"
|
|
||||||
}
|
|
||||||
|
|
||||||
// ParseIPv4Mask written in IP form (e.g. 255.255.255.0).
|
|
||||||
// This function should really belong to the net package.
|
|
||||||
func ParseIPv4Mask(s string) net.IPMask {
|
|
||||||
mask := net.ParseIP(s)
|
|
||||||
if mask == nil {
|
|
||||||
if len(s) != 8 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
// net.IPMask.String() actually outputs things like ffffff00
|
|
||||||
// so write a horrible parser for that as well :-(
|
|
||||||
m := []int{}
|
|
||||||
for i := 0; i < 4; i++ {
|
|
||||||
b := "0x" + s[2*i:2*i+2]
|
|
||||||
d, err := strconv.ParseInt(b, 0, 0)
|
|
||||||
if err != nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
m = append(m, int(d))
|
|
||||||
}
|
|
||||||
s := fmt.Sprintf("%d.%d.%d.%d", m[0], m[1], m[2], m[3])
|
|
||||||
mask = net.ParseIP(s)
|
|
||||||
if mask == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return net.IPv4Mask(mask[12], mask[13], mask[14], mask[15])
|
|
||||||
}
|
|
||||||
|
|
||||||
func parseIPv4Mask(sval string) (interface{}, error) {
|
|
||||||
mask := ParseIPv4Mask(sval)
|
|
||||||
if mask == nil {
|
|
||||||
return nil, fmt.Errorf("unable to parse %s as net.IPMask", sval)
|
|
||||||
}
|
|
||||||
return mask, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetIPv4Mask return the net.IPv4Mask value of a flag with the given name
|
|
||||||
func (f *FlagSet) GetIPv4Mask(name string) (net.IPMask, error) {
|
|
||||||
val, err := f.getFlagType(name, "ipMask", parseIPv4Mask)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return val.(net.IPMask), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPMaskVar defines an net.IPMask flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to an net.IPMask variable in which to store the value of the flag.
|
|
||||||
func (f *FlagSet) IPMaskVar(p *net.IPMask, name string, value net.IPMask, usage string) {
|
|
||||||
f.VarP(newIPMaskValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPMaskVarP is like IPMaskVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) IPMaskVarP(p *net.IPMask, name, shorthand string, value net.IPMask, usage string) {
|
|
||||||
f.VarP(newIPMaskValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPMaskVar defines an net.IPMask flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to an net.IPMask variable in which to store the value of the flag.
|
|
||||||
func IPMaskVar(p *net.IPMask, name string, value net.IPMask, usage string) {
|
|
||||||
CommandLine.VarP(newIPMaskValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPMaskVarP is like IPMaskVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func IPMaskVarP(p *net.IPMask, name, shorthand string, value net.IPMask, usage string) {
|
|
||||||
CommandLine.VarP(newIPMaskValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPMask defines an net.IPMask flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of an net.IPMask variable that stores the value of the flag.
|
|
||||||
func (f *FlagSet) IPMask(name string, value net.IPMask, usage string) *net.IPMask {
|
|
||||||
p := new(net.IPMask)
|
|
||||||
f.IPMaskVarP(p, name, "", value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPMaskP is like IPMask, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) IPMaskP(name, shorthand string, value net.IPMask, usage string) *net.IPMask {
|
|
||||||
p := new(net.IPMask)
|
|
||||||
f.IPMaskVarP(p, name, shorthand, value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPMask defines an net.IPMask flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of an net.IPMask variable that stores the value of the flag.
|
|
||||||
func IPMask(name string, value net.IPMask, usage string) *net.IPMask {
|
|
||||||
return CommandLine.IPMaskP(name, "", value, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPMaskP is like IP, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func IPMaskP(name, shorthand string, value net.IPMask, usage string) *net.IPMask {
|
|
||||||
return CommandLine.IPMaskP(name, shorthand, value, usage)
|
|
||||||
}
|
|
98
vendor/github.com/spf13/pflag/ipnet.go
generated
vendored
98
vendor/github.com/spf13/pflag/ipnet.go
generated
vendored
|
@ -1,98 +0,0 @@
|
||||||
package pflag
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"net"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// IPNet adapts net.IPNet for use as a flag.
|
|
||||||
type ipNetValue net.IPNet
|
|
||||||
|
|
||||||
func (ipnet ipNetValue) String() string {
|
|
||||||
n := net.IPNet(ipnet)
|
|
||||||
return n.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ipnet *ipNetValue) Set(value string) error {
|
|
||||||
_, n, err := net.ParseCIDR(strings.TrimSpace(value))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
*ipnet = ipNetValue(*n)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (*ipNetValue) Type() string {
|
|
||||||
return "ipNet"
|
|
||||||
}
|
|
||||||
|
|
||||||
func newIPNetValue(val net.IPNet, p *net.IPNet) *ipNetValue {
|
|
||||||
*p = val
|
|
||||||
return (*ipNetValue)(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
func ipNetConv(sval string) (interface{}, error) {
|
|
||||||
_, n, err := net.ParseCIDR(strings.TrimSpace(sval))
|
|
||||||
if err == nil {
|
|
||||||
return *n, nil
|
|
||||||
}
|
|
||||||
return nil, fmt.Errorf("invalid string being converted to IPNet: %s", sval)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetIPNet return the net.IPNet value of a flag with the given name
|
|
||||||
func (f *FlagSet) GetIPNet(name string) (net.IPNet, error) {
|
|
||||||
val, err := f.getFlagType(name, "ipNet", ipNetConv)
|
|
||||||
if err != nil {
|
|
||||||
return net.IPNet{}, err
|
|
||||||
}
|
|
||||||
return val.(net.IPNet), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPNetVar defines an net.IPNet flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to an net.IPNet variable in which to store the value of the flag.
|
|
||||||
func (f *FlagSet) IPNetVar(p *net.IPNet, name string, value net.IPNet, usage string) {
|
|
||||||
f.VarP(newIPNetValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPNetVarP is like IPNetVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) IPNetVarP(p *net.IPNet, name, shorthand string, value net.IPNet, usage string) {
|
|
||||||
f.VarP(newIPNetValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPNetVar defines an net.IPNet flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to an net.IPNet variable in which to store the value of the flag.
|
|
||||||
func IPNetVar(p *net.IPNet, name string, value net.IPNet, usage string) {
|
|
||||||
CommandLine.VarP(newIPNetValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPNetVarP is like IPNetVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func IPNetVarP(p *net.IPNet, name, shorthand string, value net.IPNet, usage string) {
|
|
||||||
CommandLine.VarP(newIPNetValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPNet defines an net.IPNet flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of an net.IPNet variable that stores the value of the flag.
|
|
||||||
func (f *FlagSet) IPNet(name string, value net.IPNet, usage string) *net.IPNet {
|
|
||||||
p := new(net.IPNet)
|
|
||||||
f.IPNetVarP(p, name, "", value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPNetP is like IPNet, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) IPNetP(name, shorthand string, value net.IPNet, usage string) *net.IPNet {
|
|
||||||
p := new(net.IPNet)
|
|
||||||
f.IPNetVarP(p, name, shorthand, value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPNet defines an net.IPNet flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of an net.IPNet variable that stores the value of the flag.
|
|
||||||
func IPNet(name string, value net.IPNet, usage string) *net.IPNet {
|
|
||||||
return CommandLine.IPNetP(name, "", value, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IPNetP is like IPNet, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func IPNetP(name, shorthand string, value net.IPNet, usage string) *net.IPNet {
|
|
||||||
return CommandLine.IPNetP(name, shorthand, value, usage)
|
|
||||||
}
|
|
80
vendor/github.com/spf13/pflag/string.go
generated
vendored
80
vendor/github.com/spf13/pflag/string.go
generated
vendored
|
@ -1,80 +0,0 @@
|
||||||
package pflag
|
|
||||||
|
|
||||||
// -- string Value
|
|
||||||
type stringValue string
|
|
||||||
|
|
||||||
func newStringValue(val string, p *string) *stringValue {
|
|
||||||
*p = val
|
|
||||||
return (*stringValue)(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *stringValue) Set(val string) error {
|
|
||||||
*s = stringValue(val)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
func (s *stringValue) Type() string {
|
|
||||||
return "string"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *stringValue) String() string { return string(*s) }
|
|
||||||
|
|
||||||
func stringConv(sval string) (interface{}, error) {
|
|
||||||
return sval, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetString return the string value of a flag with the given name
|
|
||||||
func (f *FlagSet) GetString(name string) (string, error) {
|
|
||||||
val, err := f.getFlagType(name, "string", stringConv)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return val.(string), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringVar defines a string flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a string variable in which to store the value of the flag.
|
|
||||||
func (f *FlagSet) StringVar(p *string, name string, value string, usage string) {
|
|
||||||
f.VarP(newStringValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringVarP is like StringVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) StringVarP(p *string, name, shorthand string, value string, usage string) {
|
|
||||||
f.VarP(newStringValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringVar defines a string flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a string variable in which to store the value of the flag.
|
|
||||||
func StringVar(p *string, name string, value string, usage string) {
|
|
||||||
CommandLine.VarP(newStringValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringVarP is like StringVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func StringVarP(p *string, name, shorthand string, value string, usage string) {
|
|
||||||
CommandLine.VarP(newStringValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// String defines a string flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a string variable that stores the value of the flag.
|
|
||||||
func (f *FlagSet) String(name string, value string, usage string) *string {
|
|
||||||
p := new(string)
|
|
||||||
f.StringVarP(p, name, "", value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringP is like String, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) StringP(name, shorthand string, value string, usage string) *string {
|
|
||||||
p := new(string)
|
|
||||||
f.StringVarP(p, name, shorthand, value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// String defines a string flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a string variable that stores the value of the flag.
|
|
||||||
func String(name string, value string, usage string) *string {
|
|
||||||
return CommandLine.StringP(name, "", value, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringP is like String, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func StringP(name, shorthand string, value string, usage string) *string {
|
|
||||||
return CommandLine.StringP(name, shorthand, value, usage)
|
|
||||||
}
|
|
103
vendor/github.com/spf13/pflag/string_array.go
generated
vendored
103
vendor/github.com/spf13/pflag/string_array.go
generated
vendored
|
@ -1,103 +0,0 @@
|
||||||
package pflag
|
|
||||||
|
|
||||||
// -- stringArray Value
|
|
||||||
type stringArrayValue struct {
|
|
||||||
value *[]string
|
|
||||||
changed bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func newStringArrayValue(val []string, p *[]string) *stringArrayValue {
|
|
||||||
ssv := new(stringArrayValue)
|
|
||||||
ssv.value = p
|
|
||||||
*ssv.value = val
|
|
||||||
return ssv
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *stringArrayValue) Set(val string) error {
|
|
||||||
if !s.changed {
|
|
||||||
*s.value = []string{val}
|
|
||||||
s.changed = true
|
|
||||||
} else {
|
|
||||||
*s.value = append(*s.value, val)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *stringArrayValue) Type() string {
|
|
||||||
return "stringArray"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *stringArrayValue) String() string {
|
|
||||||
str, _ := writeAsCSV(*s.value)
|
|
||||||
return "[" + str + "]"
|
|
||||||
}
|
|
||||||
|
|
||||||
func stringArrayConv(sval string) (interface{}, error) {
|
|
||||||
sval = sval[1 : len(sval)-1]
|
|
||||||
// An empty string would cause a array with one (empty) string
|
|
||||||
if len(sval) == 0 {
|
|
||||||
return []string{}, nil
|
|
||||||
}
|
|
||||||
return readAsCSV(sval)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetStringArray return the []string value of a flag with the given name
|
|
||||||
func (f *FlagSet) GetStringArray(name string) ([]string, error) {
|
|
||||||
val, err := f.getFlagType(name, "stringArray", stringArrayConv)
|
|
||||||
if err != nil {
|
|
||||||
return []string{}, err
|
|
||||||
}
|
|
||||||
return val.([]string), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringArrayVar defines a string flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a []string variable in which to store the values of the multiple flags.
|
|
||||||
// The value of each argument will not try to be separated by comma. Use a StringSlice for that.
|
|
||||||
func (f *FlagSet) StringArrayVar(p *[]string, name string, value []string, usage string) {
|
|
||||||
f.VarP(newStringArrayValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringArrayVarP is like StringArrayVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) StringArrayVarP(p *[]string, name, shorthand string, value []string, usage string) {
|
|
||||||
f.VarP(newStringArrayValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringArrayVar defines a string flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a []string variable in which to store the value of the flag.
|
|
||||||
// The value of each argument will not try to be separated by comma. Use a StringSlice for that.
|
|
||||||
func StringArrayVar(p *[]string, name string, value []string, usage string) {
|
|
||||||
CommandLine.VarP(newStringArrayValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringArrayVarP is like StringArrayVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func StringArrayVarP(p *[]string, name, shorthand string, value []string, usage string) {
|
|
||||||
CommandLine.VarP(newStringArrayValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringArray defines a string flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a []string variable that stores the value of the flag.
|
|
||||||
// The value of each argument will not try to be separated by comma. Use a StringSlice for that.
|
|
||||||
func (f *FlagSet) StringArray(name string, value []string, usage string) *[]string {
|
|
||||||
p := []string{}
|
|
||||||
f.StringArrayVarP(&p, name, "", value, usage)
|
|
||||||
return &p
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringArrayP is like StringArray, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) StringArrayP(name, shorthand string, value []string, usage string) *[]string {
|
|
||||||
p := []string{}
|
|
||||||
f.StringArrayVarP(&p, name, shorthand, value, usage)
|
|
||||||
return &p
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringArray defines a string flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a []string variable that stores the value of the flag.
|
|
||||||
// The value of each argument will not try to be separated by comma. Use a StringSlice for that.
|
|
||||||
func StringArray(name string, value []string, usage string) *[]string {
|
|
||||||
return CommandLine.StringArrayP(name, "", value, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringArrayP is like StringArray, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func StringArrayP(name, shorthand string, value []string, usage string) *[]string {
|
|
||||||
return CommandLine.StringArrayP(name, shorthand, value, usage)
|
|
||||||
}
|
|
149
vendor/github.com/spf13/pflag/string_slice.go
generated
vendored
149
vendor/github.com/spf13/pflag/string_slice.go
generated
vendored
|
@ -1,149 +0,0 @@
|
||||||
package pflag
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/csv"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// -- stringSlice Value
|
|
||||||
type stringSliceValue struct {
|
|
||||||
value *[]string
|
|
||||||
changed bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func newStringSliceValue(val []string, p *[]string) *stringSliceValue {
|
|
||||||
ssv := new(stringSliceValue)
|
|
||||||
ssv.value = p
|
|
||||||
*ssv.value = val
|
|
||||||
return ssv
|
|
||||||
}
|
|
||||||
|
|
||||||
func readAsCSV(val string) ([]string, error) {
|
|
||||||
if val == "" {
|
|
||||||
return []string{}, nil
|
|
||||||
}
|
|
||||||
stringReader := strings.NewReader(val)
|
|
||||||
csvReader := csv.NewReader(stringReader)
|
|
||||||
return csvReader.Read()
|
|
||||||
}
|
|
||||||
|
|
||||||
func writeAsCSV(vals []string) (string, error) {
|
|
||||||
b := &bytes.Buffer{}
|
|
||||||
w := csv.NewWriter(b)
|
|
||||||
err := w.Write(vals)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
w.Flush()
|
|
||||||
return strings.TrimSuffix(b.String(), "\n"), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *stringSliceValue) Set(val string) error {
|
|
||||||
v, err := readAsCSV(val)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if !s.changed {
|
|
||||||
*s.value = v
|
|
||||||
} else {
|
|
||||||
*s.value = append(*s.value, v...)
|
|
||||||
}
|
|
||||||
s.changed = true
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *stringSliceValue) Type() string {
|
|
||||||
return "stringSlice"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *stringSliceValue) String() string {
|
|
||||||
str, _ := writeAsCSV(*s.value)
|
|
||||||
return "[" + str + "]"
|
|
||||||
}
|
|
||||||
|
|
||||||
func stringSliceConv(sval string) (interface{}, error) {
|
|
||||||
sval = sval[1 : len(sval)-1]
|
|
||||||
// An empty string would cause a slice with one (empty) string
|
|
||||||
if len(sval) == 0 {
|
|
||||||
return []string{}, nil
|
|
||||||
}
|
|
||||||
return readAsCSV(sval)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetStringSlice return the []string value of a flag with the given name
|
|
||||||
func (f *FlagSet) GetStringSlice(name string) ([]string, error) {
|
|
||||||
val, err := f.getFlagType(name, "stringSlice", stringSliceConv)
|
|
||||||
if err != nil {
|
|
||||||
return []string{}, err
|
|
||||||
}
|
|
||||||
return val.([]string), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringSliceVar defines a string flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a []string variable in which to store the value of the flag.
|
|
||||||
// Compared to StringArray flags, StringSlice flags take comma-separated value as arguments and split them accordingly.
|
|
||||||
// For example:
|
|
||||||
// --ss="v1,v2" -ss="v3"
|
|
||||||
// will result in
|
|
||||||
// []string{"v1", "v2", "v3"}
|
|
||||||
func (f *FlagSet) StringSliceVar(p *[]string, name string, value []string, usage string) {
|
|
||||||
f.VarP(newStringSliceValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringSliceVarP is like StringSliceVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) StringSliceVarP(p *[]string, name, shorthand string, value []string, usage string) {
|
|
||||||
f.VarP(newStringSliceValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringSliceVar defines a string flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a []string variable in which to store the value of the flag.
|
|
||||||
// Compared to StringArray flags, StringSlice flags take comma-separated value as arguments and split them accordingly.
|
|
||||||
// For example:
|
|
||||||
// --ss="v1,v2" -ss="v3"
|
|
||||||
// will result in
|
|
||||||
// []string{"v1", "v2", "v3"}
|
|
||||||
func StringSliceVar(p *[]string, name string, value []string, usage string) {
|
|
||||||
CommandLine.VarP(newStringSliceValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringSliceVarP is like StringSliceVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func StringSliceVarP(p *[]string, name, shorthand string, value []string, usage string) {
|
|
||||||
CommandLine.VarP(newStringSliceValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringSlice defines a string flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a []string variable that stores the value of the flag.
|
|
||||||
// Compared to StringArray flags, StringSlice flags take comma-separated value as arguments and split them accordingly.
|
|
||||||
// For example:
|
|
||||||
// --ss="v1,v2" -ss="v3"
|
|
||||||
// will result in
|
|
||||||
// []string{"v1", "v2", "v3"}
|
|
||||||
func (f *FlagSet) StringSlice(name string, value []string, usage string) *[]string {
|
|
||||||
p := []string{}
|
|
||||||
f.StringSliceVarP(&p, name, "", value, usage)
|
|
||||||
return &p
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringSliceP is like StringSlice, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) StringSliceP(name, shorthand string, value []string, usage string) *[]string {
|
|
||||||
p := []string{}
|
|
||||||
f.StringSliceVarP(&p, name, shorthand, value, usage)
|
|
||||||
return &p
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringSlice defines a string flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a []string variable that stores the value of the flag.
|
|
||||||
// Compared to StringArray flags, StringSlice flags take comma-separated value as arguments and split them accordingly.
|
|
||||||
// For example:
|
|
||||||
// --ss="v1,v2" -ss="v3"
|
|
||||||
// will result in
|
|
||||||
// []string{"v1", "v2", "v3"}
|
|
||||||
func StringSlice(name string, value []string, usage string) *[]string {
|
|
||||||
return CommandLine.StringSliceP(name, "", value, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringSliceP is like StringSlice, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func StringSliceP(name, shorthand string, value []string, usage string) *[]string {
|
|
||||||
return CommandLine.StringSliceP(name, shorthand, value, usage)
|
|
||||||
}
|
|
88
vendor/github.com/spf13/pflag/uint.go
generated
vendored
88
vendor/github.com/spf13/pflag/uint.go
generated
vendored
|
@ -1,88 +0,0 @@
|
||||||
package pflag
|
|
||||||
|
|
||||||
import "strconv"
|
|
||||||
|
|
||||||
// -- uint Value
|
|
||||||
type uintValue uint
|
|
||||||
|
|
||||||
func newUintValue(val uint, p *uint) *uintValue {
|
|
||||||
*p = val
|
|
||||||
return (*uintValue)(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *uintValue) Set(s string) error {
|
|
||||||
v, err := strconv.ParseUint(s, 0, 64)
|
|
||||||
*i = uintValue(v)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *uintValue) Type() string {
|
|
||||||
return "uint"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *uintValue) String() string { return strconv.FormatUint(uint64(*i), 10) }
|
|
||||||
|
|
||||||
func uintConv(sval string) (interface{}, error) {
|
|
||||||
v, err := strconv.ParseUint(sval, 0, 0)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return uint(v), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetUint return the uint value of a flag with the given name
|
|
||||||
func (f *FlagSet) GetUint(name string) (uint, error) {
|
|
||||||
val, err := f.getFlagType(name, "uint", uintConv)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return val.(uint), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UintVar defines a uint flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a uint variable in which to store the value of the flag.
|
|
||||||
func (f *FlagSet) UintVar(p *uint, name string, value uint, usage string) {
|
|
||||||
f.VarP(newUintValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// UintVarP is like UintVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) UintVarP(p *uint, name, shorthand string, value uint, usage string) {
|
|
||||||
f.VarP(newUintValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// UintVar defines a uint flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a uint variable in which to store the value of the flag.
|
|
||||||
func UintVar(p *uint, name string, value uint, usage string) {
|
|
||||||
CommandLine.VarP(newUintValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// UintVarP is like UintVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func UintVarP(p *uint, name, shorthand string, value uint, usage string) {
|
|
||||||
CommandLine.VarP(newUintValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint defines a uint flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a uint variable that stores the value of the flag.
|
|
||||||
func (f *FlagSet) Uint(name string, value uint, usage string) *uint {
|
|
||||||
p := new(uint)
|
|
||||||
f.UintVarP(p, name, "", value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// UintP is like Uint, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) UintP(name, shorthand string, value uint, usage string) *uint {
|
|
||||||
p := new(uint)
|
|
||||||
f.UintVarP(p, name, shorthand, value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint defines a uint flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a uint variable that stores the value of the flag.
|
|
||||||
func Uint(name string, value uint, usage string) *uint {
|
|
||||||
return CommandLine.UintP(name, "", value, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// UintP is like Uint, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func UintP(name, shorthand string, value uint, usage string) *uint {
|
|
||||||
return CommandLine.UintP(name, shorthand, value, usage)
|
|
||||||
}
|
|
88
vendor/github.com/spf13/pflag/uint16.go
generated
vendored
88
vendor/github.com/spf13/pflag/uint16.go
generated
vendored
|
@ -1,88 +0,0 @@
|
||||||
package pflag
|
|
||||||
|
|
||||||
import "strconv"
|
|
||||||
|
|
||||||
// -- uint16 value
|
|
||||||
type uint16Value uint16
|
|
||||||
|
|
||||||
func newUint16Value(val uint16, p *uint16) *uint16Value {
|
|
||||||
*p = val
|
|
||||||
return (*uint16Value)(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *uint16Value) Set(s string) error {
|
|
||||||
v, err := strconv.ParseUint(s, 0, 16)
|
|
||||||
*i = uint16Value(v)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *uint16Value) Type() string {
|
|
||||||
return "uint16"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *uint16Value) String() string { return strconv.FormatUint(uint64(*i), 10) }
|
|
||||||
|
|
||||||
func uint16Conv(sval string) (interface{}, error) {
|
|
||||||
v, err := strconv.ParseUint(sval, 0, 16)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return uint16(v), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetUint16 return the uint16 value of a flag with the given name
|
|
||||||
func (f *FlagSet) GetUint16(name string) (uint16, error) {
|
|
||||||
val, err := f.getFlagType(name, "uint16", uint16Conv)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return val.(uint16), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint16Var defines a uint flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a uint variable in which to store the value of the flag.
|
|
||||||
func (f *FlagSet) Uint16Var(p *uint16, name string, value uint16, usage string) {
|
|
||||||
f.VarP(newUint16Value(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint16VarP is like Uint16Var, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) Uint16VarP(p *uint16, name, shorthand string, value uint16, usage string) {
|
|
||||||
f.VarP(newUint16Value(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint16Var defines a uint flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a uint variable in which to store the value of the flag.
|
|
||||||
func Uint16Var(p *uint16, name string, value uint16, usage string) {
|
|
||||||
CommandLine.VarP(newUint16Value(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint16VarP is like Uint16Var, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func Uint16VarP(p *uint16, name, shorthand string, value uint16, usage string) {
|
|
||||||
CommandLine.VarP(newUint16Value(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint16 defines a uint flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a uint variable that stores the value of the flag.
|
|
||||||
func (f *FlagSet) Uint16(name string, value uint16, usage string) *uint16 {
|
|
||||||
p := new(uint16)
|
|
||||||
f.Uint16VarP(p, name, "", value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint16P is like Uint16, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) Uint16P(name, shorthand string, value uint16, usage string) *uint16 {
|
|
||||||
p := new(uint16)
|
|
||||||
f.Uint16VarP(p, name, shorthand, value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint16 defines a uint flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a uint variable that stores the value of the flag.
|
|
||||||
func Uint16(name string, value uint16, usage string) *uint16 {
|
|
||||||
return CommandLine.Uint16P(name, "", value, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint16P is like Uint16, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func Uint16P(name, shorthand string, value uint16, usage string) *uint16 {
|
|
||||||
return CommandLine.Uint16P(name, shorthand, value, usage)
|
|
||||||
}
|
|
88
vendor/github.com/spf13/pflag/uint32.go
generated
vendored
88
vendor/github.com/spf13/pflag/uint32.go
generated
vendored
|
@ -1,88 +0,0 @@
|
||||||
package pflag
|
|
||||||
|
|
||||||
import "strconv"
|
|
||||||
|
|
||||||
// -- uint32 value
|
|
||||||
type uint32Value uint32
|
|
||||||
|
|
||||||
func newUint32Value(val uint32, p *uint32) *uint32Value {
|
|
||||||
*p = val
|
|
||||||
return (*uint32Value)(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *uint32Value) Set(s string) error {
|
|
||||||
v, err := strconv.ParseUint(s, 0, 32)
|
|
||||||
*i = uint32Value(v)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *uint32Value) Type() string {
|
|
||||||
return "uint32"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *uint32Value) String() string { return strconv.FormatUint(uint64(*i), 10) }
|
|
||||||
|
|
||||||
func uint32Conv(sval string) (interface{}, error) {
|
|
||||||
v, err := strconv.ParseUint(sval, 0, 32)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return uint32(v), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetUint32 return the uint32 value of a flag with the given name
|
|
||||||
func (f *FlagSet) GetUint32(name string) (uint32, error) {
|
|
||||||
val, err := f.getFlagType(name, "uint32", uint32Conv)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return val.(uint32), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint32Var defines a uint32 flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a uint32 variable in which to store the value of the flag.
|
|
||||||
func (f *FlagSet) Uint32Var(p *uint32, name string, value uint32, usage string) {
|
|
||||||
f.VarP(newUint32Value(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint32VarP is like Uint32Var, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) Uint32VarP(p *uint32, name, shorthand string, value uint32, usage string) {
|
|
||||||
f.VarP(newUint32Value(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint32Var defines a uint32 flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a uint32 variable in which to store the value of the flag.
|
|
||||||
func Uint32Var(p *uint32, name string, value uint32, usage string) {
|
|
||||||
CommandLine.VarP(newUint32Value(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint32VarP is like Uint32Var, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func Uint32VarP(p *uint32, name, shorthand string, value uint32, usage string) {
|
|
||||||
CommandLine.VarP(newUint32Value(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint32 defines a uint32 flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a uint32 variable that stores the value of the flag.
|
|
||||||
func (f *FlagSet) Uint32(name string, value uint32, usage string) *uint32 {
|
|
||||||
p := new(uint32)
|
|
||||||
f.Uint32VarP(p, name, "", value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint32P is like Uint32, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) Uint32P(name, shorthand string, value uint32, usage string) *uint32 {
|
|
||||||
p := new(uint32)
|
|
||||||
f.Uint32VarP(p, name, shorthand, value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint32 defines a uint32 flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a uint32 variable that stores the value of the flag.
|
|
||||||
func Uint32(name string, value uint32, usage string) *uint32 {
|
|
||||||
return CommandLine.Uint32P(name, "", value, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint32P is like Uint32, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func Uint32P(name, shorthand string, value uint32, usage string) *uint32 {
|
|
||||||
return CommandLine.Uint32P(name, shorthand, value, usage)
|
|
||||||
}
|
|
88
vendor/github.com/spf13/pflag/uint64.go
generated
vendored
88
vendor/github.com/spf13/pflag/uint64.go
generated
vendored
|
@ -1,88 +0,0 @@
|
||||||
package pflag
|
|
||||||
|
|
||||||
import "strconv"
|
|
||||||
|
|
||||||
// -- uint64 Value
|
|
||||||
type uint64Value uint64
|
|
||||||
|
|
||||||
func newUint64Value(val uint64, p *uint64) *uint64Value {
|
|
||||||
*p = val
|
|
||||||
return (*uint64Value)(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *uint64Value) Set(s string) error {
|
|
||||||
v, err := strconv.ParseUint(s, 0, 64)
|
|
||||||
*i = uint64Value(v)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *uint64Value) Type() string {
|
|
||||||
return "uint64"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *uint64Value) String() string { return strconv.FormatUint(uint64(*i), 10) }
|
|
||||||
|
|
||||||
func uint64Conv(sval string) (interface{}, error) {
|
|
||||||
v, err := strconv.ParseUint(sval, 0, 64)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return uint64(v), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetUint64 return the uint64 value of a flag with the given name
|
|
||||||
func (f *FlagSet) GetUint64(name string) (uint64, error) {
|
|
||||||
val, err := f.getFlagType(name, "uint64", uint64Conv)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return val.(uint64), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint64Var defines a uint64 flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a uint64 variable in which to store the value of the flag.
|
|
||||||
func (f *FlagSet) Uint64Var(p *uint64, name string, value uint64, usage string) {
|
|
||||||
f.VarP(newUint64Value(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint64VarP is like Uint64Var, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) Uint64VarP(p *uint64, name, shorthand string, value uint64, usage string) {
|
|
||||||
f.VarP(newUint64Value(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint64Var defines a uint64 flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a uint64 variable in which to store the value of the flag.
|
|
||||||
func Uint64Var(p *uint64, name string, value uint64, usage string) {
|
|
||||||
CommandLine.VarP(newUint64Value(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint64VarP is like Uint64Var, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func Uint64VarP(p *uint64, name, shorthand string, value uint64, usage string) {
|
|
||||||
CommandLine.VarP(newUint64Value(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint64 defines a uint64 flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a uint64 variable that stores the value of the flag.
|
|
||||||
func (f *FlagSet) Uint64(name string, value uint64, usage string) *uint64 {
|
|
||||||
p := new(uint64)
|
|
||||||
f.Uint64VarP(p, name, "", value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint64P is like Uint64, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) Uint64P(name, shorthand string, value uint64, usage string) *uint64 {
|
|
||||||
p := new(uint64)
|
|
||||||
f.Uint64VarP(p, name, shorthand, value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint64 defines a uint64 flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a uint64 variable that stores the value of the flag.
|
|
||||||
func Uint64(name string, value uint64, usage string) *uint64 {
|
|
||||||
return CommandLine.Uint64P(name, "", value, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint64P is like Uint64, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func Uint64P(name, shorthand string, value uint64, usage string) *uint64 {
|
|
||||||
return CommandLine.Uint64P(name, shorthand, value, usage)
|
|
||||||
}
|
|
88
vendor/github.com/spf13/pflag/uint8.go
generated
vendored
88
vendor/github.com/spf13/pflag/uint8.go
generated
vendored
|
@ -1,88 +0,0 @@
|
||||||
package pflag
|
|
||||||
|
|
||||||
import "strconv"
|
|
||||||
|
|
||||||
// -- uint8 Value
|
|
||||||
type uint8Value uint8
|
|
||||||
|
|
||||||
func newUint8Value(val uint8, p *uint8) *uint8Value {
|
|
||||||
*p = val
|
|
||||||
return (*uint8Value)(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *uint8Value) Set(s string) error {
|
|
||||||
v, err := strconv.ParseUint(s, 0, 8)
|
|
||||||
*i = uint8Value(v)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *uint8Value) Type() string {
|
|
||||||
return "uint8"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i *uint8Value) String() string { return strconv.FormatUint(uint64(*i), 10) }
|
|
||||||
|
|
||||||
func uint8Conv(sval string) (interface{}, error) {
|
|
||||||
v, err := strconv.ParseUint(sval, 0, 8)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return uint8(v), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetUint8 return the uint8 value of a flag with the given name
|
|
||||||
func (f *FlagSet) GetUint8(name string) (uint8, error) {
|
|
||||||
val, err := f.getFlagType(name, "uint8", uint8Conv)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return val.(uint8), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint8Var defines a uint8 flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a uint8 variable in which to store the value of the flag.
|
|
||||||
func (f *FlagSet) Uint8Var(p *uint8, name string, value uint8, usage string) {
|
|
||||||
f.VarP(newUint8Value(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint8VarP is like Uint8Var, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) Uint8VarP(p *uint8, name, shorthand string, value uint8, usage string) {
|
|
||||||
f.VarP(newUint8Value(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint8Var defines a uint8 flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a uint8 variable in which to store the value of the flag.
|
|
||||||
func Uint8Var(p *uint8, name string, value uint8, usage string) {
|
|
||||||
CommandLine.VarP(newUint8Value(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint8VarP is like Uint8Var, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func Uint8VarP(p *uint8, name, shorthand string, value uint8, usage string) {
|
|
||||||
CommandLine.VarP(newUint8Value(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint8 defines a uint8 flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a uint8 variable that stores the value of the flag.
|
|
||||||
func (f *FlagSet) Uint8(name string, value uint8, usage string) *uint8 {
|
|
||||||
p := new(uint8)
|
|
||||||
f.Uint8VarP(p, name, "", value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint8P is like Uint8, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) Uint8P(name, shorthand string, value uint8, usage string) *uint8 {
|
|
||||||
p := new(uint8)
|
|
||||||
f.Uint8VarP(p, name, shorthand, value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint8 defines a uint8 flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a uint8 variable that stores the value of the flag.
|
|
||||||
func Uint8(name string, value uint8, usage string) *uint8 {
|
|
||||||
return CommandLine.Uint8P(name, "", value, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint8P is like Uint8, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func Uint8P(name, shorthand string, value uint8, usage string) *uint8 {
|
|
||||||
return CommandLine.Uint8P(name, shorthand, value, usage)
|
|
||||||
}
|
|
126
vendor/github.com/spf13/pflag/uint_slice.go
generated
vendored
126
vendor/github.com/spf13/pflag/uint_slice.go
generated
vendored
|
@ -1,126 +0,0 @@
|
||||||
package pflag
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// -- uintSlice Value
|
|
||||||
type uintSliceValue struct {
|
|
||||||
value *[]uint
|
|
||||||
changed bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func newUintSliceValue(val []uint, p *[]uint) *uintSliceValue {
|
|
||||||
uisv := new(uintSliceValue)
|
|
||||||
uisv.value = p
|
|
||||||
*uisv.value = val
|
|
||||||
return uisv
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *uintSliceValue) Set(val string) error {
|
|
||||||
ss := strings.Split(val, ",")
|
|
||||||
out := make([]uint, len(ss))
|
|
||||||
for i, d := range ss {
|
|
||||||
u, err := strconv.ParseUint(d, 10, 0)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
out[i] = uint(u)
|
|
||||||
}
|
|
||||||
if !s.changed {
|
|
||||||
*s.value = out
|
|
||||||
} else {
|
|
||||||
*s.value = append(*s.value, out...)
|
|
||||||
}
|
|
||||||
s.changed = true
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *uintSliceValue) Type() string {
|
|
||||||
return "uintSlice"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *uintSliceValue) String() string {
|
|
||||||
out := make([]string, len(*s.value))
|
|
||||||
for i, d := range *s.value {
|
|
||||||
out[i] = fmt.Sprintf("%d", d)
|
|
||||||
}
|
|
||||||
return "[" + strings.Join(out, ",") + "]"
|
|
||||||
}
|
|
||||||
|
|
||||||
func uintSliceConv(val string) (interface{}, error) {
|
|
||||||
val = strings.Trim(val, "[]")
|
|
||||||
// Empty string would cause a slice with one (empty) entry
|
|
||||||
if len(val) == 0 {
|
|
||||||
return []uint{}, nil
|
|
||||||
}
|
|
||||||
ss := strings.Split(val, ",")
|
|
||||||
out := make([]uint, len(ss))
|
|
||||||
for i, d := range ss {
|
|
||||||
u, err := strconv.ParseUint(d, 10, 0)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
out[i] = uint(u)
|
|
||||||
}
|
|
||||||
return out, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetUintSlice returns the []uint value of a flag with the given name.
|
|
||||||
func (f *FlagSet) GetUintSlice(name string) ([]uint, error) {
|
|
||||||
val, err := f.getFlagType(name, "uintSlice", uintSliceConv)
|
|
||||||
if err != nil {
|
|
||||||
return []uint{}, err
|
|
||||||
}
|
|
||||||
return val.([]uint), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UintSliceVar defines a uintSlice flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a []uint variable in which to store the value of the flag.
|
|
||||||
func (f *FlagSet) UintSliceVar(p *[]uint, name string, value []uint, usage string) {
|
|
||||||
f.VarP(newUintSliceValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// UintSliceVarP is like UintSliceVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) UintSliceVarP(p *[]uint, name, shorthand string, value []uint, usage string) {
|
|
||||||
f.VarP(newUintSliceValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// UintSliceVar defines a uint[] flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a uint[] variable in which to store the value of the flag.
|
|
||||||
func UintSliceVar(p *[]uint, name string, value []uint, usage string) {
|
|
||||||
CommandLine.VarP(newUintSliceValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// UintSliceVarP is like the UintSliceVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func UintSliceVarP(p *[]uint, name, shorthand string, value []uint, usage string) {
|
|
||||||
CommandLine.VarP(newUintSliceValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// UintSlice defines a []uint flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a []uint variable that stores the value of the flag.
|
|
||||||
func (f *FlagSet) UintSlice(name string, value []uint, usage string) *[]uint {
|
|
||||||
p := []uint{}
|
|
||||||
f.UintSliceVarP(&p, name, "", value, usage)
|
|
||||||
return &p
|
|
||||||
}
|
|
||||||
|
|
||||||
// UintSliceP is like UintSlice, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) UintSliceP(name, shorthand string, value []uint, usage string) *[]uint {
|
|
||||||
p := []uint{}
|
|
||||||
f.UintSliceVarP(&p, name, shorthand, value, usage)
|
|
||||||
return &p
|
|
||||||
}
|
|
||||||
|
|
||||||
// UintSlice defines a []uint flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a []uint variable that stores the value of the flag.
|
|
||||||
func UintSlice(name string, value []uint, usage string) *[]uint {
|
|
||||||
return CommandLine.UintSliceP(name, "", value, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// UintSliceP is like UintSlice, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func UintSliceP(name, shorthand string, value []uint, usage string) *[]uint {
|
|
||||||
return CommandLine.UintSliceP(name, shorthand, value, usage)
|
|
||||||
}
|
|
3
vendor/golang.org/x/crypto/AUTHORS
generated
vendored
3
vendor/golang.org/x/crypto/AUTHORS
generated
vendored
|
@ -1,3 +0,0 @@
|
||||||
# This source code refers to The Go Authors for copyright purposes.
|
|
||||||
# The master list of authors is in the main Go distribution,
|
|
||||||
# visible at https://tip.golang.org/AUTHORS.
|
|
3
vendor/golang.org/x/crypto/CONTRIBUTORS
generated
vendored
3
vendor/golang.org/x/crypto/CONTRIBUTORS
generated
vendored
|
@ -1,3 +0,0 @@
|
||||||
# This source code was written by the Go contributors.
|
|
||||||
# The master list of contributors is in the main Go distribution,
|
|
||||||
# visible at https://tip.golang.org/CONTRIBUTORS.
|
|
27
vendor/golang.org/x/crypto/LICENSE
generated
vendored
27
vendor/golang.org/x/crypto/LICENSE
generated
vendored
|
@ -1,27 +0,0 @@
|
||||||
Copyright (c) 2009 The Go Authors. All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
* Redistributions in binary form must reproduce the above
|
|
||||||
copyright notice, this list of conditions and the following disclaimer
|
|
||||||
in the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
* Neither the name of Google Inc. nor the names of its
|
|
||||||
contributors may be used to endorse or promote products derived from
|
|
||||||
this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
22
vendor/golang.org/x/crypto/PATENTS
generated
vendored
22
vendor/golang.org/x/crypto/PATENTS
generated
vendored
|
@ -1,22 +0,0 @@
|
||||||
Additional IP Rights Grant (Patents)
|
|
||||||
|
|
||||||
"This implementation" means the copyrightable works distributed by
|
|
||||||
Google as part of the Go project.
|
|
||||||
|
|
||||||
Google hereby grants to You a perpetual, worldwide, non-exclusive,
|
|
||||||
no-charge, royalty-free, irrevocable (except as stated in this section)
|
|
||||||
patent license to make, have made, use, offer to sell, sell, import,
|
|
||||||
transfer and otherwise run, modify and propagate the contents of this
|
|
||||||
implementation of Go, where such license applies only to those patent
|
|
||||||
claims, both currently owned or controlled by Google and acquired in
|
|
||||||
the future, licensable by Google that are necessarily infringed by this
|
|
||||||
implementation of Go. This grant does not include claims that would be
|
|
||||||
infringed only as a consequence of further modification of this
|
|
||||||
implementation. If you or your agent or exclusive licensee institute or
|
|
||||||
order or agree to the institution of patent litigation against any
|
|
||||||
entity (including a cross-claim or counterclaim in a lawsuit) alleging
|
|
||||||
that this implementation of Go or any code incorporated within this
|
|
||||||
implementation of Go constitutes direct or contributory patent
|
|
||||||
infringement, or inducement of patent infringement, then any patent
|
|
||||||
rights granted to you under this License for this implementation of Go
|
|
||||||
shall terminate as of the date such litigation is filed.
|
|
951
vendor/golang.org/x/crypto/ssh/terminal/terminal.go
generated
vendored
951
vendor/golang.org/x/crypto/ssh/terminal/terminal.go
generated
vendored
|
@ -1,951 +0,0 @@
|
||||||
// Copyright 2011 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package terminal
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"io"
|
|
||||||
"sync"
|
|
||||||
"unicode/utf8"
|
|
||||||
)
|
|
||||||
|
|
||||||
// EscapeCodes contains escape sequences that can be written to the terminal in
|
|
||||||
// order to achieve different styles of text.
|
|
||||||
type EscapeCodes struct {
|
|
||||||
// Foreground colors
|
|
||||||
Black, Red, Green, Yellow, Blue, Magenta, Cyan, White []byte
|
|
||||||
|
|
||||||
// Reset all attributes
|
|
||||||
Reset []byte
|
|
||||||
}
|
|
||||||
|
|
||||||
var vt100EscapeCodes = EscapeCodes{
|
|
||||||
Black: []byte{keyEscape, '[', '3', '0', 'm'},
|
|
||||||
Red: []byte{keyEscape, '[', '3', '1', 'm'},
|
|
||||||
Green: []byte{keyEscape, '[', '3', '2', 'm'},
|
|
||||||
Yellow: []byte{keyEscape, '[', '3', '3', 'm'},
|
|
||||||
Blue: []byte{keyEscape, '[', '3', '4', 'm'},
|
|
||||||
Magenta: []byte{keyEscape, '[', '3', '5', 'm'},
|
|
||||||
Cyan: []byte{keyEscape, '[', '3', '6', 'm'},
|
|
||||||
White: []byte{keyEscape, '[', '3', '7', 'm'},
|
|
||||||
|
|
||||||
Reset: []byte{keyEscape, '[', '0', 'm'},
|
|
||||||
}
|
|
||||||
|
|
||||||
// Terminal contains the state for running a VT100 terminal that is capable of
|
|
||||||
// reading lines of input.
|
|
||||||
type Terminal struct {
|
|
||||||
// AutoCompleteCallback, if non-null, is called for each keypress with
|
|
||||||
// the full input line and the current position of the cursor (in
|
|
||||||
// bytes, as an index into |line|). If it returns ok=false, the key
|
|
||||||
// press is processed normally. Otherwise it returns a replacement line
|
|
||||||
// and the new cursor position.
|
|
||||||
AutoCompleteCallback func(line string, pos int, key rune) (newLine string, newPos int, ok bool)
|
|
||||||
|
|
||||||
// Escape contains a pointer to the escape codes for this terminal.
|
|
||||||
// It's always a valid pointer, although the escape codes themselves
|
|
||||||
// may be empty if the terminal doesn't support them.
|
|
||||||
Escape *EscapeCodes
|
|
||||||
|
|
||||||
// lock protects the terminal and the state in this object from
|
|
||||||
// concurrent processing of a key press and a Write() call.
|
|
||||||
lock sync.Mutex
|
|
||||||
|
|
||||||
c io.ReadWriter
|
|
||||||
prompt []rune
|
|
||||||
|
|
||||||
// line is the current line being entered.
|
|
||||||
line []rune
|
|
||||||
// pos is the logical position of the cursor in line
|
|
||||||
pos int
|
|
||||||
// echo is true if local echo is enabled
|
|
||||||
echo bool
|
|
||||||
// pasteActive is true iff there is a bracketed paste operation in
|
|
||||||
// progress.
|
|
||||||
pasteActive bool
|
|
||||||
|
|
||||||
// cursorX contains the current X value of the cursor where the left
|
|
||||||
// edge is 0. cursorY contains the row number where the first row of
|
|
||||||
// the current line is 0.
|
|
||||||
cursorX, cursorY int
|
|
||||||
// maxLine is the greatest value of cursorY so far.
|
|
||||||
maxLine int
|
|
||||||
|
|
||||||
termWidth, termHeight int
|
|
||||||
|
|
||||||
// outBuf contains the terminal data to be sent.
|
|
||||||
outBuf []byte
|
|
||||||
// remainder contains the remainder of any partial key sequences after
|
|
||||||
// a read. It aliases into inBuf.
|
|
||||||
remainder []byte
|
|
||||||
inBuf [256]byte
|
|
||||||
|
|
||||||
// history contains previously entered commands so that they can be
|
|
||||||
// accessed with the up and down keys.
|
|
||||||
history stRingBuffer
|
|
||||||
// historyIndex stores the currently accessed history entry, where zero
|
|
||||||
// means the immediately previous entry.
|
|
||||||
historyIndex int
|
|
||||||
// When navigating up and down the history it's possible to return to
|
|
||||||
// the incomplete, initial line. That value is stored in
|
|
||||||
// historyPending.
|
|
||||||
historyPending string
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewTerminal runs a VT100 terminal on the given ReadWriter. If the ReadWriter is
|
|
||||||
// a local terminal, that terminal must first have been put into raw mode.
|
|
||||||
// prompt is a string that is written at the start of each input line (i.e.
|
|
||||||
// "> ").
|
|
||||||
func NewTerminal(c io.ReadWriter, prompt string) *Terminal {
|
|
||||||
return &Terminal{
|
|
||||||
Escape: &vt100EscapeCodes,
|
|
||||||
c: c,
|
|
||||||
prompt: []rune(prompt),
|
|
||||||
termWidth: 80,
|
|
||||||
termHeight: 24,
|
|
||||||
echo: true,
|
|
||||||
historyIndex: -1,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const (
|
|
||||||
keyCtrlD = 4
|
|
||||||
keyCtrlU = 21
|
|
||||||
keyEnter = '\r'
|
|
||||||
keyEscape = 27
|
|
||||||
keyBackspace = 127
|
|
||||||
keyUnknown = 0xd800 /* UTF-16 surrogate area */ + iota
|
|
||||||
keyUp
|
|
||||||
keyDown
|
|
||||||
keyLeft
|
|
||||||
keyRight
|
|
||||||
keyAltLeft
|
|
||||||
keyAltRight
|
|
||||||
keyHome
|
|
||||||
keyEnd
|
|
||||||
keyDeleteWord
|
|
||||||
keyDeleteLine
|
|
||||||
keyClearScreen
|
|
||||||
keyPasteStart
|
|
||||||
keyPasteEnd
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
crlf = []byte{'\r', '\n'}
|
|
||||||
pasteStart = []byte{keyEscape, '[', '2', '0', '0', '~'}
|
|
||||||
pasteEnd = []byte{keyEscape, '[', '2', '0', '1', '~'}
|
|
||||||
)
|
|
||||||
|
|
||||||
// bytesToKey tries to parse a key sequence from b. If successful, it returns
|
|
||||||
// the key and the remainder of the input. Otherwise it returns utf8.RuneError.
|
|
||||||
func bytesToKey(b []byte, pasteActive bool) (rune, []byte) {
|
|
||||||
if len(b) == 0 {
|
|
||||||
return utf8.RuneError, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if !pasteActive {
|
|
||||||
switch b[0] {
|
|
||||||
case 1: // ^A
|
|
||||||
return keyHome, b[1:]
|
|
||||||
case 5: // ^E
|
|
||||||
return keyEnd, b[1:]
|
|
||||||
case 8: // ^H
|
|
||||||
return keyBackspace, b[1:]
|
|
||||||
case 11: // ^K
|
|
||||||
return keyDeleteLine, b[1:]
|
|
||||||
case 12: // ^L
|
|
||||||
return keyClearScreen, b[1:]
|
|
||||||
case 23: // ^W
|
|
||||||
return keyDeleteWord, b[1:]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if b[0] != keyEscape {
|
|
||||||
if !utf8.FullRune(b) {
|
|
||||||
return utf8.RuneError, b
|
|
||||||
}
|
|
||||||
r, l := utf8.DecodeRune(b)
|
|
||||||
return r, b[l:]
|
|
||||||
}
|
|
||||||
|
|
||||||
if !pasteActive && len(b) >= 3 && b[0] == keyEscape && b[1] == '[' {
|
|
||||||
switch b[2] {
|
|
||||||
case 'A':
|
|
||||||
return keyUp, b[3:]
|
|
||||||
case 'B':
|
|
||||||
return keyDown, b[3:]
|
|
||||||
case 'C':
|
|
||||||
return keyRight, b[3:]
|
|
||||||
case 'D':
|
|
||||||
return keyLeft, b[3:]
|
|
||||||
case 'H':
|
|
||||||
return keyHome, b[3:]
|
|
||||||
case 'F':
|
|
||||||
return keyEnd, b[3:]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if !pasteActive && len(b) >= 6 && b[0] == keyEscape && b[1] == '[' && b[2] == '1' && b[3] == ';' && b[4] == '3' {
|
|
||||||
switch b[5] {
|
|
||||||
case 'C':
|
|
||||||
return keyAltRight, b[6:]
|
|
||||||
case 'D':
|
|
||||||
return keyAltLeft, b[6:]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if !pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteStart) {
|
|
||||||
return keyPasteStart, b[6:]
|
|
||||||
}
|
|
||||||
|
|
||||||
if pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteEnd) {
|
|
||||||
return keyPasteEnd, b[6:]
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we get here then we have a key that we don't recognise, or a
|
|
||||||
// partial sequence. It's not clear how one should find the end of a
|
|
||||||
// sequence without knowing them all, but it seems that [a-zA-Z~] only
|
|
||||||
// appears at the end of a sequence.
|
|
||||||
for i, c := range b[0:] {
|
|
||||||
if c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '~' {
|
|
||||||
return keyUnknown, b[i+1:]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return utf8.RuneError, b
|
|
||||||
}
|
|
||||||
|
|
||||||
// queue appends data to the end of t.outBuf
|
|
||||||
func (t *Terminal) queue(data []rune) {
|
|
||||||
t.outBuf = append(t.outBuf, []byte(string(data))...)
|
|
||||||
}
|
|
||||||
|
|
||||||
var eraseUnderCursor = []rune{' ', keyEscape, '[', 'D'}
|
|
||||||
var space = []rune{' '}
|
|
||||||
|
|
||||||
func isPrintable(key rune) bool {
|
|
||||||
isInSurrogateArea := key >= 0xd800 && key <= 0xdbff
|
|
||||||
return key >= 32 && !isInSurrogateArea
|
|
||||||
}
|
|
||||||
|
|
||||||
// moveCursorToPos appends data to t.outBuf which will move the cursor to the
|
|
||||||
// given, logical position in the text.
|
|
||||||
func (t *Terminal) moveCursorToPos(pos int) {
|
|
||||||
if !t.echo {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
x := visualLength(t.prompt) + pos
|
|
||||||
y := x / t.termWidth
|
|
||||||
x = x % t.termWidth
|
|
||||||
|
|
||||||
up := 0
|
|
||||||
if y < t.cursorY {
|
|
||||||
up = t.cursorY - y
|
|
||||||
}
|
|
||||||
|
|
||||||
down := 0
|
|
||||||
if y > t.cursorY {
|
|
||||||
down = y - t.cursorY
|
|
||||||
}
|
|
||||||
|
|
||||||
left := 0
|
|
||||||
if x < t.cursorX {
|
|
||||||
left = t.cursorX - x
|
|
||||||
}
|
|
||||||
|
|
||||||
right := 0
|
|
||||||
if x > t.cursorX {
|
|
||||||
right = x - t.cursorX
|
|
||||||
}
|
|
||||||
|
|
||||||
t.cursorX = x
|
|
||||||
t.cursorY = y
|
|
||||||
t.move(up, down, left, right)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *Terminal) move(up, down, left, right int) {
|
|
||||||
movement := make([]rune, 3*(up+down+left+right))
|
|
||||||
m := movement
|
|
||||||
for i := 0; i < up; i++ {
|
|
||||||
m[0] = keyEscape
|
|
||||||
m[1] = '['
|
|
||||||
m[2] = 'A'
|
|
||||||
m = m[3:]
|
|
||||||
}
|
|
||||||
for i := 0; i < down; i++ {
|
|
||||||
m[0] = keyEscape
|
|
||||||
m[1] = '['
|
|
||||||
m[2] = 'B'
|
|
||||||
m = m[3:]
|
|
||||||
}
|
|
||||||
for i := 0; i < left; i++ {
|
|
||||||
m[0] = keyEscape
|
|
||||||
m[1] = '['
|
|
||||||
m[2] = 'D'
|
|
||||||
m = m[3:]
|
|
||||||
}
|
|
||||||
for i := 0; i < right; i++ {
|
|
||||||
m[0] = keyEscape
|
|
||||||
m[1] = '['
|
|
||||||
m[2] = 'C'
|
|
||||||
m = m[3:]
|
|
||||||
}
|
|
||||||
|
|
||||||
t.queue(movement)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *Terminal) clearLineToRight() {
|
|
||||||
op := []rune{keyEscape, '[', 'K'}
|
|
||||||
t.queue(op)
|
|
||||||
}
|
|
||||||
|
|
||||||
const maxLineLength = 4096
|
|
||||||
|
|
||||||
func (t *Terminal) setLine(newLine []rune, newPos int) {
|
|
||||||
if t.echo {
|
|
||||||
t.moveCursorToPos(0)
|
|
||||||
t.writeLine(newLine)
|
|
||||||
for i := len(newLine); i < len(t.line); i++ {
|
|
||||||
t.writeLine(space)
|
|
||||||
}
|
|
||||||
t.moveCursorToPos(newPos)
|
|
||||||
}
|
|
||||||
t.line = newLine
|
|
||||||
t.pos = newPos
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *Terminal) advanceCursor(places int) {
|
|
||||||
t.cursorX += places
|
|
||||||
t.cursorY += t.cursorX / t.termWidth
|
|
||||||
if t.cursorY > t.maxLine {
|
|
||||||
t.maxLine = t.cursorY
|
|
||||||
}
|
|
||||||
t.cursorX = t.cursorX % t.termWidth
|
|
||||||
|
|
||||||
if places > 0 && t.cursorX == 0 {
|
|
||||||
// Normally terminals will advance the current position
|
|
||||||
// when writing a character. But that doesn't happen
|
|
||||||
// for the last character in a line. However, when
|
|
||||||
// writing a character (except a new line) that causes
|
|
||||||
// a line wrap, the position will be advanced two
|
|
||||||
// places.
|
|
||||||
//
|
|
||||||
// So, if we are stopping at the end of a line, we
|
|
||||||
// need to write a newline so that our cursor can be
|
|
||||||
// advanced to the next line.
|
|
||||||
t.outBuf = append(t.outBuf, '\r', '\n')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *Terminal) eraseNPreviousChars(n int) {
|
|
||||||
if n == 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if t.pos < n {
|
|
||||||
n = t.pos
|
|
||||||
}
|
|
||||||
t.pos -= n
|
|
||||||
t.moveCursorToPos(t.pos)
|
|
||||||
|
|
||||||
copy(t.line[t.pos:], t.line[n+t.pos:])
|
|
||||||
t.line = t.line[:len(t.line)-n]
|
|
||||||
if t.echo {
|
|
||||||
t.writeLine(t.line[t.pos:])
|
|
||||||
for i := 0; i < n; i++ {
|
|
||||||
t.queue(space)
|
|
||||||
}
|
|
||||||
t.advanceCursor(n)
|
|
||||||
t.moveCursorToPos(t.pos)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// countToLeftWord returns then number of characters from the cursor to the
|
|
||||||
// start of the previous word.
|
|
||||||
func (t *Terminal) countToLeftWord() int {
|
|
||||||
if t.pos == 0 {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
pos := t.pos - 1
|
|
||||||
for pos > 0 {
|
|
||||||
if t.line[pos] != ' ' {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
pos--
|
|
||||||
}
|
|
||||||
for pos > 0 {
|
|
||||||
if t.line[pos] == ' ' {
|
|
||||||
pos++
|
|
||||||
break
|
|
||||||
}
|
|
||||||
pos--
|
|
||||||
}
|
|
||||||
|
|
||||||
return t.pos - pos
|
|
||||||
}
|
|
||||||
|
|
||||||
// countToRightWord returns then number of characters from the cursor to the
|
|
||||||
// start of the next word.
|
|
||||||
func (t *Terminal) countToRightWord() int {
|
|
||||||
pos := t.pos
|
|
||||||
for pos < len(t.line) {
|
|
||||||
if t.line[pos] == ' ' {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
pos++
|
|
||||||
}
|
|
||||||
for pos < len(t.line) {
|
|
||||||
if t.line[pos] != ' ' {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
pos++
|
|
||||||
}
|
|
||||||
return pos - t.pos
|
|
||||||
}
|
|
||||||
|
|
||||||
// visualLength returns the number of visible glyphs in s.
|
|
||||||
func visualLength(runes []rune) int {
|
|
||||||
inEscapeSeq := false
|
|
||||||
length := 0
|
|
||||||
|
|
||||||
for _, r := range runes {
|
|
||||||
switch {
|
|
||||||
case inEscapeSeq:
|
|
||||||
if (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z') {
|
|
||||||
inEscapeSeq = false
|
|
||||||
}
|
|
||||||
case r == '\x1b':
|
|
||||||
inEscapeSeq = true
|
|
||||||
default:
|
|
||||||
length++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return length
|
|
||||||
}
|
|
||||||
|
|
||||||
// handleKey processes the given key and, optionally, returns a line of text
|
|
||||||
// that the user has entered.
|
|
||||||
func (t *Terminal) handleKey(key rune) (line string, ok bool) {
|
|
||||||
if t.pasteActive && key != keyEnter {
|
|
||||||
t.addKeyToLine(key)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
switch key {
|
|
||||||
case keyBackspace:
|
|
||||||
if t.pos == 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
t.eraseNPreviousChars(1)
|
|
||||||
case keyAltLeft:
|
|
||||||
// move left by a word.
|
|
||||||
t.pos -= t.countToLeftWord()
|
|
||||||
t.moveCursorToPos(t.pos)
|
|
||||||
case keyAltRight:
|
|
||||||
// move right by a word.
|
|
||||||
t.pos += t.countToRightWord()
|
|
||||||
t.moveCursorToPos(t.pos)
|
|
||||||
case keyLeft:
|
|
||||||
if t.pos == 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
t.pos--
|
|
||||||
t.moveCursorToPos(t.pos)
|
|
||||||
case keyRight:
|
|
||||||
if t.pos == len(t.line) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
t.pos++
|
|
||||||
t.moveCursorToPos(t.pos)
|
|
||||||
case keyHome:
|
|
||||||
if t.pos == 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
t.pos = 0
|
|
||||||
t.moveCursorToPos(t.pos)
|
|
||||||
case keyEnd:
|
|
||||||
if t.pos == len(t.line) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
t.pos = len(t.line)
|
|
||||||
t.moveCursorToPos(t.pos)
|
|
||||||
case keyUp:
|
|
||||||
entry, ok := t.history.NthPreviousEntry(t.historyIndex + 1)
|
|
||||||
if !ok {
|
|
||||||
return "", false
|
|
||||||
}
|
|
||||||
if t.historyIndex == -1 {
|
|
||||||
t.historyPending = string(t.line)
|
|
||||||
}
|
|
||||||
t.historyIndex++
|
|
||||||
runes := []rune(entry)
|
|
||||||
t.setLine(runes, len(runes))
|
|
||||||
case keyDown:
|
|
||||||
switch t.historyIndex {
|
|
||||||
case -1:
|
|
||||||
return
|
|
||||||
case 0:
|
|
||||||
runes := []rune(t.historyPending)
|
|
||||||
t.setLine(runes, len(runes))
|
|
||||||
t.historyIndex--
|
|
||||||
default:
|
|
||||||
entry, ok := t.history.NthPreviousEntry(t.historyIndex - 1)
|
|
||||||
if ok {
|
|
||||||
t.historyIndex--
|
|
||||||
runes := []rune(entry)
|
|
||||||
t.setLine(runes, len(runes))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case keyEnter:
|
|
||||||
t.moveCursorToPos(len(t.line))
|
|
||||||
t.queue([]rune("\r\n"))
|
|
||||||
line = string(t.line)
|
|
||||||
ok = true
|
|
||||||
t.line = t.line[:0]
|
|
||||||
t.pos = 0
|
|
||||||
t.cursorX = 0
|
|
||||||
t.cursorY = 0
|
|
||||||
t.maxLine = 0
|
|
||||||
case keyDeleteWord:
|
|
||||||
// Delete zero or more spaces and then one or more characters.
|
|
||||||
t.eraseNPreviousChars(t.countToLeftWord())
|
|
||||||
case keyDeleteLine:
|
|
||||||
// Delete everything from the current cursor position to the
|
|
||||||
// end of line.
|
|
||||||
for i := t.pos; i < len(t.line); i++ {
|
|
||||||
t.queue(space)
|
|
||||||
t.advanceCursor(1)
|
|
||||||
}
|
|
||||||
t.line = t.line[:t.pos]
|
|
||||||
t.moveCursorToPos(t.pos)
|
|
||||||
case keyCtrlD:
|
|
||||||
// Erase the character under the current position.
|
|
||||||
// The EOF case when the line is empty is handled in
|
|
||||||
// readLine().
|
|
||||||
if t.pos < len(t.line) {
|
|
||||||
t.pos++
|
|
||||||
t.eraseNPreviousChars(1)
|
|
||||||
}
|
|
||||||
case keyCtrlU:
|
|
||||||
t.eraseNPreviousChars(t.pos)
|
|
||||||
case keyClearScreen:
|
|
||||||
// Erases the screen and moves the cursor to the home position.
|
|
||||||
t.queue([]rune("\x1b[2J\x1b[H"))
|
|
||||||
t.queue(t.prompt)
|
|
||||||
t.cursorX, t.cursorY = 0, 0
|
|
||||||
t.advanceCursor(visualLength(t.prompt))
|
|
||||||
t.setLine(t.line, t.pos)
|
|
||||||
default:
|
|
||||||
if t.AutoCompleteCallback != nil {
|
|
||||||
prefix := string(t.line[:t.pos])
|
|
||||||
suffix := string(t.line[t.pos:])
|
|
||||||
|
|
||||||
t.lock.Unlock()
|
|
||||||
newLine, newPos, completeOk := t.AutoCompleteCallback(prefix+suffix, len(prefix), key)
|
|
||||||
t.lock.Lock()
|
|
||||||
|
|
||||||
if completeOk {
|
|
||||||
t.setLine([]rune(newLine), utf8.RuneCount([]byte(newLine)[:newPos]))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if !isPrintable(key) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if len(t.line) == maxLineLength {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
t.addKeyToLine(key)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// addKeyToLine inserts the given key at the current position in the current
|
|
||||||
// line.
|
|
||||||
func (t *Terminal) addKeyToLine(key rune) {
|
|
||||||
if len(t.line) == cap(t.line) {
|
|
||||||
newLine := make([]rune, len(t.line), 2*(1+len(t.line)))
|
|
||||||
copy(newLine, t.line)
|
|
||||||
t.line = newLine
|
|
||||||
}
|
|
||||||
t.line = t.line[:len(t.line)+1]
|
|
||||||
copy(t.line[t.pos+1:], t.line[t.pos:])
|
|
||||||
t.line[t.pos] = key
|
|
||||||
if t.echo {
|
|
||||||
t.writeLine(t.line[t.pos:])
|
|
||||||
}
|
|
||||||
t.pos++
|
|
||||||
t.moveCursorToPos(t.pos)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *Terminal) writeLine(line []rune) {
|
|
||||||
for len(line) != 0 {
|
|
||||||
remainingOnLine := t.termWidth - t.cursorX
|
|
||||||
todo := len(line)
|
|
||||||
if todo > remainingOnLine {
|
|
||||||
todo = remainingOnLine
|
|
||||||
}
|
|
||||||
t.queue(line[:todo])
|
|
||||||
t.advanceCursor(visualLength(line[:todo]))
|
|
||||||
line = line[todo:]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// writeWithCRLF writes buf to w but replaces all occurrences of \n with \r\n.
|
|
||||||
func writeWithCRLF(w io.Writer, buf []byte) (n int, err error) {
|
|
||||||
for len(buf) > 0 {
|
|
||||||
i := bytes.IndexByte(buf, '\n')
|
|
||||||
todo := len(buf)
|
|
||||||
if i >= 0 {
|
|
||||||
todo = i
|
|
||||||
}
|
|
||||||
|
|
||||||
var nn int
|
|
||||||
nn, err = w.Write(buf[:todo])
|
|
||||||
n += nn
|
|
||||||
if err != nil {
|
|
||||||
return n, err
|
|
||||||
}
|
|
||||||
buf = buf[todo:]
|
|
||||||
|
|
||||||
if i >= 0 {
|
|
||||||
if _, err = w.Write(crlf); err != nil {
|
|
||||||
return n, err
|
|
||||||
}
|
|
||||||
n++
|
|
||||||
buf = buf[1:]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return n, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *Terminal) Write(buf []byte) (n int, err error) {
|
|
||||||
t.lock.Lock()
|
|
||||||
defer t.lock.Unlock()
|
|
||||||
|
|
||||||
if t.cursorX == 0 && t.cursorY == 0 {
|
|
||||||
// This is the easy case: there's nothing on the screen that we
|
|
||||||
// have to move out of the way.
|
|
||||||
return writeWithCRLF(t.c, buf)
|
|
||||||
}
|
|
||||||
|
|
||||||
// We have a prompt and possibly user input on the screen. We
|
|
||||||
// have to clear it first.
|
|
||||||
t.move(0 /* up */, 0 /* down */, t.cursorX /* left */, 0 /* right */)
|
|
||||||
t.cursorX = 0
|
|
||||||
t.clearLineToRight()
|
|
||||||
|
|
||||||
for t.cursorY > 0 {
|
|
||||||
t.move(1 /* up */, 0, 0, 0)
|
|
||||||
t.cursorY--
|
|
||||||
t.clearLineToRight()
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err = t.c.Write(t.outBuf); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
t.outBuf = t.outBuf[:0]
|
|
||||||
|
|
||||||
if n, err = writeWithCRLF(t.c, buf); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
t.writeLine(t.prompt)
|
|
||||||
if t.echo {
|
|
||||||
t.writeLine(t.line)
|
|
||||||
}
|
|
||||||
|
|
||||||
t.moveCursorToPos(t.pos)
|
|
||||||
|
|
||||||
if _, err = t.c.Write(t.outBuf); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
t.outBuf = t.outBuf[:0]
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// ReadPassword temporarily changes the prompt and reads a password, without
|
|
||||||
// echo, from the terminal.
|
|
||||||
func (t *Terminal) ReadPassword(prompt string) (line string, err error) {
|
|
||||||
t.lock.Lock()
|
|
||||||
defer t.lock.Unlock()
|
|
||||||
|
|
||||||
oldPrompt := t.prompt
|
|
||||||
t.prompt = []rune(prompt)
|
|
||||||
t.echo = false
|
|
||||||
|
|
||||||
line, err = t.readLine()
|
|
||||||
|
|
||||||
t.prompt = oldPrompt
|
|
||||||
t.echo = true
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// ReadLine returns a line of input from the terminal.
|
|
||||||
func (t *Terminal) ReadLine() (line string, err error) {
|
|
||||||
t.lock.Lock()
|
|
||||||
defer t.lock.Unlock()
|
|
||||||
|
|
||||||
return t.readLine()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *Terminal) readLine() (line string, err error) {
|
|
||||||
// t.lock must be held at this point
|
|
||||||
|
|
||||||
if t.cursorX == 0 && t.cursorY == 0 {
|
|
||||||
t.writeLine(t.prompt)
|
|
||||||
t.c.Write(t.outBuf)
|
|
||||||
t.outBuf = t.outBuf[:0]
|
|
||||||
}
|
|
||||||
|
|
||||||
lineIsPasted := t.pasteActive
|
|
||||||
|
|
||||||
for {
|
|
||||||
rest := t.remainder
|
|
||||||
lineOk := false
|
|
||||||
for !lineOk {
|
|
||||||
var key rune
|
|
||||||
key, rest = bytesToKey(rest, t.pasteActive)
|
|
||||||
if key == utf8.RuneError {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
if !t.pasteActive {
|
|
||||||
if key == keyCtrlD {
|
|
||||||
if len(t.line) == 0 {
|
|
||||||
return "", io.EOF
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if key == keyPasteStart {
|
|
||||||
t.pasteActive = true
|
|
||||||
if len(t.line) == 0 {
|
|
||||||
lineIsPasted = true
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
} else if key == keyPasteEnd {
|
|
||||||
t.pasteActive = false
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if !t.pasteActive {
|
|
||||||
lineIsPasted = false
|
|
||||||
}
|
|
||||||
line, lineOk = t.handleKey(key)
|
|
||||||
}
|
|
||||||
if len(rest) > 0 {
|
|
||||||
n := copy(t.inBuf[:], rest)
|
|
||||||
t.remainder = t.inBuf[:n]
|
|
||||||
} else {
|
|
||||||
t.remainder = nil
|
|
||||||
}
|
|
||||||
t.c.Write(t.outBuf)
|
|
||||||
t.outBuf = t.outBuf[:0]
|
|
||||||
if lineOk {
|
|
||||||
if t.echo {
|
|
||||||
t.historyIndex = -1
|
|
||||||
t.history.Add(line)
|
|
||||||
}
|
|
||||||
if lineIsPasted {
|
|
||||||
err = ErrPasteIndicator
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// t.remainder is a slice at the beginning of t.inBuf
|
|
||||||
// containing a partial key sequence
|
|
||||||
readBuf := t.inBuf[len(t.remainder):]
|
|
||||||
var n int
|
|
||||||
|
|
||||||
t.lock.Unlock()
|
|
||||||
n, err = t.c.Read(readBuf)
|
|
||||||
t.lock.Lock()
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
t.remainder = t.inBuf[:n+len(t.remainder)]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetPrompt sets the prompt to be used when reading subsequent lines.
|
|
||||||
func (t *Terminal) SetPrompt(prompt string) {
|
|
||||||
t.lock.Lock()
|
|
||||||
defer t.lock.Unlock()
|
|
||||||
|
|
||||||
t.prompt = []rune(prompt)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *Terminal) clearAndRepaintLinePlusNPrevious(numPrevLines int) {
|
|
||||||
// Move cursor to column zero at the start of the line.
|
|
||||||
t.move(t.cursorY, 0, t.cursorX, 0)
|
|
||||||
t.cursorX, t.cursorY = 0, 0
|
|
||||||
t.clearLineToRight()
|
|
||||||
for t.cursorY < numPrevLines {
|
|
||||||
// Move down a line
|
|
||||||
t.move(0, 1, 0, 0)
|
|
||||||
t.cursorY++
|
|
||||||
t.clearLineToRight()
|
|
||||||
}
|
|
||||||
// Move back to beginning.
|
|
||||||
t.move(t.cursorY, 0, 0, 0)
|
|
||||||
t.cursorX, t.cursorY = 0, 0
|
|
||||||
|
|
||||||
t.queue(t.prompt)
|
|
||||||
t.advanceCursor(visualLength(t.prompt))
|
|
||||||
t.writeLine(t.line)
|
|
||||||
t.moveCursorToPos(t.pos)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *Terminal) SetSize(width, height int) error {
|
|
||||||
t.lock.Lock()
|
|
||||||
defer t.lock.Unlock()
|
|
||||||
|
|
||||||
if width == 0 {
|
|
||||||
width = 1
|
|
||||||
}
|
|
||||||
|
|
||||||
oldWidth := t.termWidth
|
|
||||||
t.termWidth, t.termHeight = width, height
|
|
||||||
|
|
||||||
switch {
|
|
||||||
case width == oldWidth:
|
|
||||||
// If the width didn't change then nothing else needs to be
|
|
||||||
// done.
|
|
||||||
return nil
|
|
||||||
case len(t.line) == 0 && t.cursorX == 0 && t.cursorY == 0:
|
|
||||||
// If there is nothing on current line and no prompt printed,
|
|
||||||
// just do nothing
|
|
||||||
return nil
|
|
||||||
case width < oldWidth:
|
|
||||||
// Some terminals (e.g. xterm) will truncate lines that were
|
|
||||||
// too long when shinking. Others, (e.g. gnome-terminal) will
|
|
||||||
// attempt to wrap them. For the former, repainting t.maxLine
|
|
||||||
// works great, but that behaviour goes badly wrong in the case
|
|
||||||
// of the latter because they have doubled every full line.
|
|
||||||
|
|
||||||
// We assume that we are working on a terminal that wraps lines
|
|
||||||
// and adjust the cursor position based on every previous line
|
|
||||||
// wrapping and turning into two. This causes the prompt on
|
|
||||||
// xterms to move upwards, which isn't great, but it avoids a
|
|
||||||
// huge mess with gnome-terminal.
|
|
||||||
if t.cursorX >= t.termWidth {
|
|
||||||
t.cursorX = t.termWidth - 1
|
|
||||||
}
|
|
||||||
t.cursorY *= 2
|
|
||||||
t.clearAndRepaintLinePlusNPrevious(t.maxLine * 2)
|
|
||||||
case width > oldWidth:
|
|
||||||
// If the terminal expands then our position calculations will
|
|
||||||
// be wrong in the future because we think the cursor is
|
|
||||||
// |t.pos| chars into the string, but there will be a gap at
|
|
||||||
// the end of any wrapped line.
|
|
||||||
//
|
|
||||||
// But the position will actually be correct until we move, so
|
|
||||||
// we can move back to the beginning and repaint everything.
|
|
||||||
t.clearAndRepaintLinePlusNPrevious(t.maxLine)
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err := t.c.Write(t.outBuf)
|
|
||||||
t.outBuf = t.outBuf[:0]
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
type pasteIndicatorError struct{}
|
|
||||||
|
|
||||||
func (pasteIndicatorError) Error() string {
|
|
||||||
return "terminal: ErrPasteIndicator not correctly handled"
|
|
||||||
}
|
|
||||||
|
|
||||||
// ErrPasteIndicator may be returned from ReadLine as the error, in addition
|
|
||||||
// to valid line data. It indicates that bracketed paste mode is enabled and
|
|
||||||
// that the returned line consists only of pasted data. Programs may wish to
|
|
||||||
// interpret pasted data more literally than typed data.
|
|
||||||
var ErrPasteIndicator = pasteIndicatorError{}
|
|
||||||
|
|
||||||
// SetBracketedPasteMode requests that the terminal bracket paste operations
|
|
||||||
// with markers. Not all terminals support this but, if it is supported, then
|
|
||||||
// enabling this mode will stop any autocomplete callback from running due to
|
|
||||||
// pastes. Additionally, any lines that are completely pasted will be returned
|
|
||||||
// from ReadLine with the error set to ErrPasteIndicator.
|
|
||||||
func (t *Terminal) SetBracketedPasteMode(on bool) {
|
|
||||||
if on {
|
|
||||||
io.WriteString(t.c, "\x1b[?2004h")
|
|
||||||
} else {
|
|
||||||
io.WriteString(t.c, "\x1b[?2004l")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// stRingBuffer is a ring buffer of strings.
|
|
||||||
type stRingBuffer struct {
|
|
||||||
// entries contains max elements.
|
|
||||||
entries []string
|
|
||||||
max int
|
|
||||||
// head contains the index of the element most recently added to the ring.
|
|
||||||
head int
|
|
||||||
// size contains the number of elements in the ring.
|
|
||||||
size int
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *stRingBuffer) Add(a string) {
|
|
||||||
if s.entries == nil {
|
|
||||||
const defaultNumEntries = 100
|
|
||||||
s.entries = make([]string, defaultNumEntries)
|
|
||||||
s.max = defaultNumEntries
|
|
||||||
}
|
|
||||||
|
|
||||||
s.head = (s.head + 1) % s.max
|
|
||||||
s.entries[s.head] = a
|
|
||||||
if s.size < s.max {
|
|
||||||
s.size++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NthPreviousEntry returns the value passed to the nth previous call to Add.
|
|
||||||
// If n is zero then the immediately prior value is returned, if one, then the
|
|
||||||
// next most recent, and so on. If such an element doesn't exist then ok is
|
|
||||||
// false.
|
|
||||||
func (s *stRingBuffer) NthPreviousEntry(n int) (value string, ok bool) {
|
|
||||||
if n >= s.size {
|
|
||||||
return "", false
|
|
||||||
}
|
|
||||||
index := s.head - n
|
|
||||||
if index < 0 {
|
|
||||||
index += s.max
|
|
||||||
}
|
|
||||||
return s.entries[index], true
|
|
||||||
}
|
|
||||||
|
|
||||||
// readPasswordLine reads from reader until it finds \n or io.EOF.
|
|
||||||
// The slice returned does not include the \n.
|
|
||||||
// readPasswordLine also ignores any \r it finds.
|
|
||||||
func readPasswordLine(reader io.Reader) ([]byte, error) {
|
|
||||||
var buf [1]byte
|
|
||||||
var ret []byte
|
|
||||||
|
|
||||||
for {
|
|
||||||
n, err := reader.Read(buf[:])
|
|
||||||
if n > 0 {
|
|
||||||
switch buf[0] {
|
|
||||||
case '\n':
|
|
||||||
return ret, nil
|
|
||||||
case '\r':
|
|
||||||
// remove \r from passwords on Windows
|
|
||||||
default:
|
|
||||||
ret = append(ret, buf[0])
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
if err == io.EOF && len(ret) > 0 {
|
|
||||||
return ret, nil
|
|
||||||
}
|
|
||||||
return ret, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
114
vendor/golang.org/x/crypto/ssh/terminal/util.go
generated
vendored
114
vendor/golang.org/x/crypto/ssh/terminal/util.go
generated
vendored
|
@ -1,114 +0,0 @@
|
||||||
// Copyright 2011 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build darwin dragonfly freebsd linux,!appengine netbsd openbsd
|
|
||||||
|
|
||||||
// Package terminal provides support functions for dealing with terminals, as
|
|
||||||
// commonly found on UNIX systems.
|
|
||||||
//
|
|
||||||
// Putting a terminal into raw mode is the most common requirement:
|
|
||||||
//
|
|
||||||
// oldState, err := terminal.MakeRaw(0)
|
|
||||||
// if err != nil {
|
|
||||||
// panic(err)
|
|
||||||
// }
|
|
||||||
// defer terminal.Restore(0, oldState)
|
|
||||||
package terminal // import "golang.org/x/crypto/ssh/terminal"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"golang.org/x/sys/unix"
|
|
||||||
)
|
|
||||||
|
|
||||||
// State contains the state of a terminal.
|
|
||||||
type State struct {
|
|
||||||
termios unix.Termios
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsTerminal returns true if the given file descriptor is a terminal.
|
|
||||||
func IsTerminal(fd int) bool {
|
|
||||||
_, err := unix.IoctlGetTermios(fd, ioctlReadTermios)
|
|
||||||
return err == nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// MakeRaw put the terminal connected to the given file descriptor into raw
|
|
||||||
// mode and returns the previous state of the terminal so that it can be
|
|
||||||
// restored.
|
|
||||||
func MakeRaw(fd int) (*State, error) {
|
|
||||||
termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
oldState := State{termios: *termios}
|
|
||||||
|
|
||||||
// This attempts to replicate the behaviour documented for cfmakeraw in
|
|
||||||
// the termios(3) manpage.
|
|
||||||
termios.Iflag &^= unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON
|
|
||||||
termios.Oflag &^= unix.OPOST
|
|
||||||
termios.Lflag &^= unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN
|
|
||||||
termios.Cflag &^= unix.CSIZE | unix.PARENB
|
|
||||||
termios.Cflag |= unix.CS8
|
|
||||||
termios.Cc[unix.VMIN] = 1
|
|
||||||
termios.Cc[unix.VTIME] = 0
|
|
||||||
if err := unix.IoctlSetTermios(fd, ioctlWriteTermios, termios); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &oldState, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetState returns the current state of a terminal which may be useful to
|
|
||||||
// restore the terminal after a signal.
|
|
||||||
func GetState(fd int) (*State, error) {
|
|
||||||
termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &State{termios: *termios}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Restore restores the terminal connected to the given file descriptor to a
|
|
||||||
// previous state.
|
|
||||||
func Restore(fd int, state *State) error {
|
|
||||||
return unix.IoctlSetTermios(fd, ioctlWriteTermios, &state.termios)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetSize returns the dimensions of the given terminal.
|
|
||||||
func GetSize(fd int) (width, height int, err error) {
|
|
||||||
ws, err := unix.IoctlGetWinsize(fd, unix.TIOCGWINSZ)
|
|
||||||
if err != nil {
|
|
||||||
return -1, -1, err
|
|
||||||
}
|
|
||||||
return int(ws.Col), int(ws.Row), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// passwordReader is an io.Reader that reads from a specific file descriptor.
|
|
||||||
type passwordReader int
|
|
||||||
|
|
||||||
func (r passwordReader) Read(buf []byte) (int, error) {
|
|
||||||
return unix.Read(int(r), buf)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ReadPassword reads a line of input from a terminal without local echo. This
|
|
||||||
// is commonly used for inputting passwords and other sensitive data. The slice
|
|
||||||
// returned does not include the \n.
|
|
||||||
func ReadPassword(fd int) ([]byte, error) {
|
|
||||||
termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
newState := *termios
|
|
||||||
newState.Lflag &^= unix.ECHO
|
|
||||||
newState.Lflag |= unix.ICANON | unix.ISIG
|
|
||||||
newState.Iflag |= unix.ICRNL
|
|
||||||
if err := unix.IoctlSetTermios(fd, ioctlWriteTermios, &newState); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer unix.IoctlSetTermios(fd, ioctlWriteTermios, termios)
|
|
||||||
|
|
||||||
return readPasswordLine(passwordReader(fd))
|
|
||||||
}
|
|
12
vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go
generated
vendored
12
vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go
generated
vendored
|
@ -1,12 +0,0 @@
|
||||||
// Copyright 2013 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build darwin dragonfly freebsd netbsd openbsd
|
|
||||||
|
|
||||||
package terminal
|
|
||||||
|
|
||||||
import "golang.org/x/sys/unix"
|
|
||||||
|
|
||||||
const ioctlReadTermios = unix.TIOCGETA
|
|
||||||
const ioctlWriteTermios = unix.TIOCSETA
|
|
10
vendor/golang.org/x/crypto/ssh/terminal/util_linux.go
generated
vendored
10
vendor/golang.org/x/crypto/ssh/terminal/util_linux.go
generated
vendored
|
@ -1,10 +0,0 @@
|
||||||
// Copyright 2013 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package terminal
|
|
||||||
|
|
||||||
import "golang.org/x/sys/unix"
|
|
||||||
|
|
||||||
const ioctlReadTermios = unix.TCGETS
|
|
||||||
const ioctlWriteTermios = unix.TCSETS
|
|
58
vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go
generated
vendored
58
vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go
generated
vendored
|
@ -1,58 +0,0 @@
|
||||||
// Copyright 2016 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// Package terminal provides support functions for dealing with terminals, as
|
|
||||||
// commonly found on UNIX systems.
|
|
||||||
//
|
|
||||||
// Putting a terminal into raw mode is the most common requirement:
|
|
||||||
//
|
|
||||||
// oldState, err := terminal.MakeRaw(0)
|
|
||||||
// if err != nil {
|
|
||||||
// panic(err)
|
|
||||||
// }
|
|
||||||
// defer terminal.Restore(0, oldState)
|
|
||||||
package terminal
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"runtime"
|
|
||||||
)
|
|
||||||
|
|
||||||
type State struct{}
|
|
||||||
|
|
||||||
// IsTerminal returns true if the given file descriptor is a terminal.
|
|
||||||
func IsTerminal(fd int) bool {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// MakeRaw put the terminal connected to the given file descriptor into raw
|
|
||||||
// mode and returns the previous state of the terminal so that it can be
|
|
||||||
// restored.
|
|
||||||
func MakeRaw(fd int) (*State, error) {
|
|
||||||
return nil, fmt.Errorf("terminal: MakeRaw not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetState returns the current state of a terminal which may be useful to
|
|
||||||
// restore the terminal after a signal.
|
|
||||||
func GetState(fd int) (*State, error) {
|
|
||||||
return nil, fmt.Errorf("terminal: GetState not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Restore restores the terminal connected to the given file descriptor to a
|
|
||||||
// previous state.
|
|
||||||
func Restore(fd int, state *State) error {
|
|
||||||
return fmt.Errorf("terminal: Restore not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetSize returns the dimensions of the given terminal.
|
|
||||||
func GetSize(fd int) (width, height int, err error) {
|
|
||||||
return 0, 0, fmt.Errorf("terminal: GetSize not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ReadPassword reads a line of input from a terminal without local echo. This
|
|
||||||
// is commonly used for inputting passwords and other sensitive data. The slice
|
|
||||||
// returned does not include the \n.
|
|
||||||
func ReadPassword(fd int) ([]byte, error) {
|
|
||||||
return nil, fmt.Errorf("terminal: ReadPassword not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
|
|
||||||
}
|
|
124
vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go
generated
vendored
124
vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go
generated
vendored
|
@ -1,124 +0,0 @@
|
||||||
// Copyright 2015 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build solaris
|
|
||||||
|
|
||||||
package terminal // import "golang.org/x/crypto/ssh/terminal"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"golang.org/x/sys/unix"
|
|
||||||
"io"
|
|
||||||
"syscall"
|
|
||||||
)
|
|
||||||
|
|
||||||
// State contains the state of a terminal.
|
|
||||||
type State struct {
|
|
||||||
termios unix.Termios
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsTerminal returns true if the given file descriptor is a terminal.
|
|
||||||
func IsTerminal(fd int) bool {
|
|
||||||
_, err := unix.IoctlGetTermio(fd, unix.TCGETA)
|
|
||||||
return err == nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ReadPassword reads a line of input from a terminal without local echo. This
|
|
||||||
// is commonly used for inputting passwords and other sensitive data. The slice
|
|
||||||
// returned does not include the \n.
|
|
||||||
func ReadPassword(fd int) ([]byte, error) {
|
|
||||||
// see also: http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libast/common/uwin/getpass.c
|
|
||||||
val, err := unix.IoctlGetTermios(fd, unix.TCGETS)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
oldState := *val
|
|
||||||
|
|
||||||
newState := oldState
|
|
||||||
newState.Lflag &^= syscall.ECHO
|
|
||||||
newState.Lflag |= syscall.ICANON | syscall.ISIG
|
|
||||||
newState.Iflag |= syscall.ICRNL
|
|
||||||
err = unix.IoctlSetTermios(fd, unix.TCSETS, &newState)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer unix.IoctlSetTermios(fd, unix.TCSETS, &oldState)
|
|
||||||
|
|
||||||
var buf [16]byte
|
|
||||||
var ret []byte
|
|
||||||
for {
|
|
||||||
n, err := syscall.Read(fd, buf[:])
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if n == 0 {
|
|
||||||
if len(ret) == 0 {
|
|
||||||
return nil, io.EOF
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
if buf[n-1] == '\n' {
|
|
||||||
n--
|
|
||||||
}
|
|
||||||
ret = append(ret, buf[:n]...)
|
|
||||||
if n < len(buf) {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// MakeRaw puts the terminal connected to the given file descriptor into raw
|
|
||||||
// mode and returns the previous state of the terminal so that it can be
|
|
||||||
// restored.
|
|
||||||
// see http://cr.illumos.org/~webrev/andy_js/1060/
|
|
||||||
func MakeRaw(fd int) (*State, error) {
|
|
||||||
termios, err := unix.IoctlGetTermios(fd, unix.TCGETS)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
oldState := State{termios: *termios}
|
|
||||||
|
|
||||||
termios.Iflag &^= unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON
|
|
||||||
termios.Oflag &^= unix.OPOST
|
|
||||||
termios.Lflag &^= unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN
|
|
||||||
termios.Cflag &^= unix.CSIZE | unix.PARENB
|
|
||||||
termios.Cflag |= unix.CS8
|
|
||||||
termios.Cc[unix.VMIN] = 1
|
|
||||||
termios.Cc[unix.VTIME] = 0
|
|
||||||
|
|
||||||
if err := unix.IoctlSetTermios(fd, unix.TCSETS, termios); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &oldState, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Restore restores the terminal connected to the given file descriptor to a
|
|
||||||
// previous state.
|
|
||||||
func Restore(fd int, oldState *State) error {
|
|
||||||
return unix.IoctlSetTermios(fd, unix.TCSETS, &oldState.termios)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetState returns the current state of a terminal which may be useful to
|
|
||||||
// restore the terminal after a signal.
|
|
||||||
func GetState(fd int) (*State, error) {
|
|
||||||
termios, err := unix.IoctlGetTermios(fd, unix.TCGETS)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &State{termios: *termios}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetSize returns the dimensions of the given terminal.
|
|
||||||
func GetSize(fd int) (width, height int, err error) {
|
|
||||||
ws, err := unix.IoctlGetWinsize(fd, unix.TIOCGWINSZ)
|
|
||||||
if err != nil {
|
|
||||||
return 0, 0, err
|
|
||||||
}
|
|
||||||
return int(ws.Col), int(ws.Row), nil
|
|
||||||
}
|
|
103
vendor/golang.org/x/crypto/ssh/terminal/util_windows.go
generated
vendored
103
vendor/golang.org/x/crypto/ssh/terminal/util_windows.go
generated
vendored
|
@ -1,103 +0,0 @@
|
||||||
// Copyright 2011 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build windows
|
|
||||||
|
|
||||||
// Package terminal provides support functions for dealing with terminals, as
|
|
||||||
// commonly found on UNIX systems.
|
|
||||||
//
|
|
||||||
// Putting a terminal into raw mode is the most common requirement:
|
|
||||||
//
|
|
||||||
// oldState, err := terminal.MakeRaw(0)
|
|
||||||
// if err != nil {
|
|
||||||
// panic(err)
|
|
||||||
// }
|
|
||||||
// defer terminal.Restore(0, oldState)
|
|
||||||
package terminal
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"golang.org/x/sys/windows"
|
|
||||||
)
|
|
||||||
|
|
||||||
type State struct {
|
|
||||||
mode uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsTerminal returns true if the given file descriptor is a terminal.
|
|
||||||
func IsTerminal(fd int) bool {
|
|
||||||
var st uint32
|
|
||||||
err := windows.GetConsoleMode(windows.Handle(fd), &st)
|
|
||||||
return err == nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// MakeRaw put the terminal connected to the given file descriptor into raw
|
|
||||||
// mode and returns the previous state of the terminal so that it can be
|
|
||||||
// restored.
|
|
||||||
func MakeRaw(fd int) (*State, error) {
|
|
||||||
var st uint32
|
|
||||||
if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
raw := st &^ (windows.ENABLE_ECHO_INPUT | windows.ENABLE_PROCESSED_INPUT | windows.ENABLE_LINE_INPUT | windows.ENABLE_PROCESSED_OUTPUT)
|
|
||||||
if err := windows.SetConsoleMode(windows.Handle(fd), raw); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &State{st}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetState returns the current state of a terminal which may be useful to
|
|
||||||
// restore the terminal after a signal.
|
|
||||||
func GetState(fd int) (*State, error) {
|
|
||||||
var st uint32
|
|
||||||
if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &State{st}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Restore restores the terminal connected to the given file descriptor to a
|
|
||||||
// previous state.
|
|
||||||
func Restore(fd int, state *State) error {
|
|
||||||
return windows.SetConsoleMode(windows.Handle(fd), state.mode)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetSize returns the dimensions of the given terminal.
|
|
||||||
func GetSize(fd int) (width, height int, err error) {
|
|
||||||
var info windows.ConsoleScreenBufferInfo
|
|
||||||
if err := windows.GetConsoleScreenBufferInfo(windows.Handle(fd), &info); err != nil {
|
|
||||||
return 0, 0, err
|
|
||||||
}
|
|
||||||
return int(info.Size.X), int(info.Size.Y), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ReadPassword reads a line of input from a terminal without local echo. This
|
|
||||||
// is commonly used for inputting passwords and other sensitive data. The slice
|
|
||||||
// returned does not include the \n.
|
|
||||||
func ReadPassword(fd int) ([]byte, error) {
|
|
||||||
var st uint32
|
|
||||||
if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
old := st
|
|
||||||
|
|
||||||
st &^= (windows.ENABLE_ECHO_INPUT)
|
|
||||||
st |= (windows.ENABLE_PROCESSED_INPUT | windows.ENABLE_LINE_INPUT | windows.ENABLE_PROCESSED_OUTPUT)
|
|
||||||
if err := windows.SetConsoleMode(windows.Handle(fd), st); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer windows.SetConsoleMode(windows.Handle(fd), old)
|
|
||||||
|
|
||||||
var h windows.Handle
|
|
||||||
p, _ := windows.GetCurrentProcess()
|
|
||||||
if err := windows.DuplicateHandle(p, windows.Handle(fd), p, &h, 0, false, windows.DUPLICATE_SAME_ACCESS); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
f := os.NewFile(uintptr(h), "stdin")
|
|
||||||
defer f.Close()
|
|
||||||
return readPasswordLine(f)
|
|
||||||
}
|
|
3
vendor/golang.org/x/sys/AUTHORS
generated
vendored
3
vendor/golang.org/x/sys/AUTHORS
generated
vendored
|
@ -1,3 +0,0 @@
|
||||||
# This source code refers to The Go Authors for copyright purposes.
|
|
||||||
# The master list of authors is in the main Go distribution,
|
|
||||||
# visible at http://tip.golang.org/AUTHORS.
|
|
3
vendor/golang.org/x/sys/CONTRIBUTORS
generated
vendored
3
vendor/golang.org/x/sys/CONTRIBUTORS
generated
vendored
|
@ -1,3 +0,0 @@
|
||||||
# This source code was written by the Go contributors.
|
|
||||||
# The master list of contributors is in the main Go distribution,
|
|
||||||
# visible at http://tip.golang.org/CONTRIBUTORS.
|
|
27
vendor/golang.org/x/sys/LICENSE
generated
vendored
27
vendor/golang.org/x/sys/LICENSE
generated
vendored
|
@ -1,27 +0,0 @@
|
||||||
Copyright (c) 2009 The Go Authors. All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
* Redistributions in binary form must reproduce the above
|
|
||||||
copyright notice, this list of conditions and the following disclaimer
|
|
||||||
in the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
* Neither the name of Google Inc. nor the names of its
|
|
||||||
contributors may be used to endorse or promote products derived from
|
|
||||||
this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
22
vendor/golang.org/x/sys/PATENTS
generated
vendored
22
vendor/golang.org/x/sys/PATENTS
generated
vendored
|
@ -1,22 +0,0 @@
|
||||||
Additional IP Rights Grant (Patents)
|
|
||||||
|
|
||||||
"This implementation" means the copyrightable works distributed by
|
|
||||||
Google as part of the Go project.
|
|
||||||
|
|
||||||
Google hereby grants to You a perpetual, worldwide, non-exclusive,
|
|
||||||
no-charge, royalty-free, irrevocable (except as stated in this section)
|
|
||||||
patent license to make, have made, use, offer to sell, sell, import,
|
|
||||||
transfer and otherwise run, modify and propagate the contents of this
|
|
||||||
implementation of Go, where such license applies only to those patent
|
|
||||||
claims, both currently owned or controlled by Google and acquired in
|
|
||||||
the future, licensable by Google that are necessarily infringed by this
|
|
||||||
implementation of Go. This grant does not include claims that would be
|
|
||||||
infringed only as a consequence of further modification of this
|
|
||||||
implementation. If you or your agent or exclusive licensee institute or
|
|
||||||
order or agree to the institution of patent litigation against any
|
|
||||||
entity (including a cross-claim or counterclaim in a lawsuit) alleging
|
|
||||||
that this implementation of Go or any code incorporated within this
|
|
||||||
implementation of Go constitutes direct or contributory patent
|
|
||||||
infringement, or inducement of patent infringement, then any patent
|
|
||||||
rights granted to you under this License for this implementation of Go
|
|
||||||
shall terminate as of the date such litigation is filed.
|
|
124
vendor/golang.org/x/sys/unix/affinity_linux.go
generated
vendored
124
vendor/golang.org/x/sys/unix/affinity_linux.go
generated
vendored
|
@ -1,124 +0,0 @@
|
||||||
// Copyright 2018 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// CPU affinity functions
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import (
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
const cpuSetSize = _CPU_SETSIZE / _NCPUBITS
|
|
||||||
|
|
||||||
// CPUSet represents a CPU affinity mask.
|
|
||||||
type CPUSet [cpuSetSize]cpuMask
|
|
||||||
|
|
||||||
func schedAffinity(trap uintptr, pid int, set *CPUSet) error {
|
|
||||||
_, _, e := RawSyscall(trap, uintptr(pid), uintptr(unsafe.Sizeof(*set)), uintptr(unsafe.Pointer(set)))
|
|
||||||
if e != 0 {
|
|
||||||
return errnoErr(e)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SchedGetaffinity gets the CPU affinity mask of the thread specified by pid.
|
|
||||||
// If pid is 0 the calling thread is used.
|
|
||||||
func SchedGetaffinity(pid int, set *CPUSet) error {
|
|
||||||
return schedAffinity(SYS_SCHED_GETAFFINITY, pid, set)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SchedSetaffinity sets the CPU affinity mask of the thread specified by pid.
|
|
||||||
// If pid is 0 the calling thread is used.
|
|
||||||
func SchedSetaffinity(pid int, set *CPUSet) error {
|
|
||||||
return schedAffinity(SYS_SCHED_SETAFFINITY, pid, set)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Zero clears the set s, so that it contains no CPUs.
|
|
||||||
func (s *CPUSet) Zero() {
|
|
||||||
for i := range s {
|
|
||||||
s[i] = 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func cpuBitsIndex(cpu int) int {
|
|
||||||
return cpu / _NCPUBITS
|
|
||||||
}
|
|
||||||
|
|
||||||
func cpuBitsMask(cpu int) cpuMask {
|
|
||||||
return cpuMask(1 << (uint(cpu) % _NCPUBITS))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set adds cpu to the set s.
|
|
||||||
func (s *CPUSet) Set(cpu int) {
|
|
||||||
i := cpuBitsIndex(cpu)
|
|
||||||
if i < len(s) {
|
|
||||||
s[i] |= cpuBitsMask(cpu)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clear removes cpu from the set s.
|
|
||||||
func (s *CPUSet) Clear(cpu int) {
|
|
||||||
i := cpuBitsIndex(cpu)
|
|
||||||
if i < len(s) {
|
|
||||||
s[i] &^= cpuBitsMask(cpu)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsSet reports whether cpu is in the set s.
|
|
||||||
func (s *CPUSet) IsSet(cpu int) bool {
|
|
||||||
i := cpuBitsIndex(cpu)
|
|
||||||
if i < len(s) {
|
|
||||||
return s[i]&cpuBitsMask(cpu) != 0
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// Count returns the number of CPUs in the set s.
|
|
||||||
func (s *CPUSet) Count() int {
|
|
||||||
c := 0
|
|
||||||
for _, b := range s {
|
|
||||||
c += onesCount64(uint64(b))
|
|
||||||
}
|
|
||||||
return c
|
|
||||||
}
|
|
||||||
|
|
||||||
// onesCount64 is a copy of Go 1.9's math/bits.OnesCount64.
|
|
||||||
// Once this package can require Go 1.9, we can delete this
|
|
||||||
// and update the caller to use bits.OnesCount64.
|
|
||||||
func onesCount64(x uint64) int {
|
|
||||||
const m0 = 0x5555555555555555 // 01010101 ...
|
|
||||||
const m1 = 0x3333333333333333 // 00110011 ...
|
|
||||||
const m2 = 0x0f0f0f0f0f0f0f0f // 00001111 ...
|
|
||||||
const m3 = 0x00ff00ff00ff00ff // etc.
|
|
||||||
const m4 = 0x0000ffff0000ffff
|
|
||||||
|
|
||||||
// Implementation: Parallel summing of adjacent bits.
|
|
||||||
// See "Hacker's Delight", Chap. 5: Counting Bits.
|
|
||||||
// The following pattern shows the general approach:
|
|
||||||
//
|
|
||||||
// x = x>>1&(m0&m) + x&(m0&m)
|
|
||||||
// x = x>>2&(m1&m) + x&(m1&m)
|
|
||||||
// x = x>>4&(m2&m) + x&(m2&m)
|
|
||||||
// x = x>>8&(m3&m) + x&(m3&m)
|
|
||||||
// x = x>>16&(m4&m) + x&(m4&m)
|
|
||||||
// x = x>>32&(m5&m) + x&(m5&m)
|
|
||||||
// return int(x)
|
|
||||||
//
|
|
||||||
// Masking (& operations) can be left away when there's no
|
|
||||||
// danger that a field's sum will carry over into the next
|
|
||||||
// field: Since the result cannot be > 64, 8 bits is enough
|
|
||||||
// and we can ignore the masks for the shifts by 8 and up.
|
|
||||||
// Per "Hacker's Delight", the first line can be simplified
|
|
||||||
// more, but it saves at best one instruction, so we leave
|
|
||||||
// it alone for clarity.
|
|
||||||
const m = 1<<64 - 1
|
|
||||||
x = x>>1&(m0&m) + x&(m0&m)
|
|
||||||
x = x>>2&(m1&m) + x&(m1&m)
|
|
||||||
x = (x>>4 + x) & (m2 & m)
|
|
||||||
x += x >> 8
|
|
||||||
x += x >> 16
|
|
||||||
x += x >> 32
|
|
||||||
return int(x) & (1<<7 - 1)
|
|
||||||
}
|
|
29
vendor/golang.org/x/sys/unix/asm_darwin_386.s
generated
vendored
29
vendor/golang.org/x/sys/unix/asm_darwin_386.s
generated
vendored
|
@ -1,29 +0,0 @@
|
||||||
// Copyright 2009 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System call support for 386, Darwin
|
|
||||||
//
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-28
|
|
||||||
JMP syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-40
|
|
||||||
JMP syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall9(SB),NOSPLIT,$0-52
|
|
||||||
JMP syscall·Syscall9(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-28
|
|
||||||
JMP syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-40
|
|
||||||
JMP syscall·RawSyscall6(SB)
|
|
29
vendor/golang.org/x/sys/unix/asm_darwin_amd64.s
generated
vendored
29
vendor/golang.org/x/sys/unix/asm_darwin_amd64.s
generated
vendored
|
@ -1,29 +0,0 @@
|
||||||
// Copyright 2009 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System call support for AMD64, Darwin
|
|
||||||
//
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-56
|
|
||||||
JMP syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-80
|
|
||||||
JMP syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall9(SB),NOSPLIT,$0-104
|
|
||||||
JMP syscall·Syscall9(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
|
|
||||||
JMP syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
|
|
||||||
JMP syscall·RawSyscall6(SB)
|
|
30
vendor/golang.org/x/sys/unix/asm_darwin_arm.s
generated
vendored
30
vendor/golang.org/x/sys/unix/asm_darwin_arm.s
generated
vendored
|
@ -1,30 +0,0 @@
|
||||||
// Copyright 2015 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build !gccgo
|
|
||||||
// +build arm,darwin
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System call support for ARM, Darwin
|
|
||||||
//
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-28
|
|
||||||
B syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-40
|
|
||||||
B syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall9(SB),NOSPLIT,$0-52
|
|
||||||
B syscall·Syscall9(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-28
|
|
||||||
B syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-40
|
|
||||||
B syscall·RawSyscall6(SB)
|
|
30
vendor/golang.org/x/sys/unix/asm_darwin_arm64.s
generated
vendored
30
vendor/golang.org/x/sys/unix/asm_darwin_arm64.s
generated
vendored
|
@ -1,30 +0,0 @@
|
||||||
// Copyright 2015 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build !gccgo
|
|
||||||
// +build arm64,darwin
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System call support for AMD64, Darwin
|
|
||||||
//
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-56
|
|
||||||
B syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-80
|
|
||||||
B syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall9(SB),NOSPLIT,$0-104
|
|
||||||
B syscall·Syscall9(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
|
|
||||||
B syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
|
|
||||||
B syscall·RawSyscall6(SB)
|
|
29
vendor/golang.org/x/sys/unix/asm_dragonfly_amd64.s
generated
vendored
29
vendor/golang.org/x/sys/unix/asm_dragonfly_amd64.s
generated
vendored
|
@ -1,29 +0,0 @@
|
||||||
// Copyright 2009 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System call support for AMD64, DragonFly
|
|
||||||
//
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-56
|
|
||||||
JMP syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-80
|
|
||||||
JMP syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall9(SB),NOSPLIT,$0-104
|
|
||||||
JMP syscall·Syscall9(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
|
|
||||||
JMP syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
|
|
||||||
JMP syscall·RawSyscall6(SB)
|
|
29
vendor/golang.org/x/sys/unix/asm_freebsd_386.s
generated
vendored
29
vendor/golang.org/x/sys/unix/asm_freebsd_386.s
generated
vendored
|
@ -1,29 +0,0 @@
|
||||||
// Copyright 2009 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System call support for 386, FreeBSD
|
|
||||||
//
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-28
|
|
||||||
JMP syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-40
|
|
||||||
JMP syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall9(SB),NOSPLIT,$0-52
|
|
||||||
JMP syscall·Syscall9(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-28
|
|
||||||
JMP syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-40
|
|
||||||
JMP syscall·RawSyscall6(SB)
|
|
29
vendor/golang.org/x/sys/unix/asm_freebsd_amd64.s
generated
vendored
29
vendor/golang.org/x/sys/unix/asm_freebsd_amd64.s
generated
vendored
|
@ -1,29 +0,0 @@
|
||||||
// Copyright 2009 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System call support for AMD64, FreeBSD
|
|
||||||
//
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-56
|
|
||||||
JMP syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-80
|
|
||||||
JMP syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall9(SB),NOSPLIT,$0-104
|
|
||||||
JMP syscall·Syscall9(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
|
|
||||||
JMP syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
|
|
||||||
JMP syscall·RawSyscall6(SB)
|
|
29
vendor/golang.org/x/sys/unix/asm_freebsd_arm.s
generated
vendored
29
vendor/golang.org/x/sys/unix/asm_freebsd_arm.s
generated
vendored
|
@ -1,29 +0,0 @@
|
||||||
// Copyright 2012 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System call support for ARM, FreeBSD
|
|
||||||
//
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-28
|
|
||||||
B syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-40
|
|
||||||
B syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall9(SB),NOSPLIT,$0-52
|
|
||||||
B syscall·Syscall9(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-28
|
|
||||||
B syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-40
|
|
||||||
B syscall·RawSyscall6(SB)
|
|
65
vendor/golang.org/x/sys/unix/asm_linux_386.s
generated
vendored
65
vendor/golang.org/x/sys/unix/asm_linux_386.s
generated
vendored
|
@ -1,65 +0,0 @@
|
||||||
// Copyright 2009 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System calls for 386, Linux
|
|
||||||
//
|
|
||||||
|
|
||||||
// See ../runtime/sys_linux_386.s for the reason why we always use int 0x80
|
|
||||||
// instead of the glibc-specific "CALL 0x10(GS)".
|
|
||||||
#define INVOKE_SYSCALL INT $0x80
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-28
|
|
||||||
JMP syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-40
|
|
||||||
JMP syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·SyscallNoError(SB),NOSPLIT,$0-24
|
|
||||||
CALL runtime·entersyscall(SB)
|
|
||||||
MOVL trap+0(FP), AX // syscall entry
|
|
||||||
MOVL a1+4(FP), BX
|
|
||||||
MOVL a2+8(FP), CX
|
|
||||||
MOVL a3+12(FP), DX
|
|
||||||
MOVL $0, SI
|
|
||||||
MOVL $0, DI
|
|
||||||
INVOKE_SYSCALL
|
|
||||||
MOVL AX, r1+16(FP)
|
|
||||||
MOVL DX, r2+20(FP)
|
|
||||||
CALL runtime·exitsyscall(SB)
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-28
|
|
||||||
JMP syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-40
|
|
||||||
JMP syscall·RawSyscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-24
|
|
||||||
MOVL trap+0(FP), AX // syscall entry
|
|
||||||
MOVL a1+4(FP), BX
|
|
||||||
MOVL a2+8(FP), CX
|
|
||||||
MOVL a3+12(FP), DX
|
|
||||||
MOVL $0, SI
|
|
||||||
MOVL $0, DI
|
|
||||||
INVOKE_SYSCALL
|
|
||||||
MOVL AX, r1+16(FP)
|
|
||||||
MOVL DX, r2+20(FP)
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT ·socketcall(SB),NOSPLIT,$0-36
|
|
||||||
JMP syscall·socketcall(SB)
|
|
||||||
|
|
||||||
TEXT ·rawsocketcall(SB),NOSPLIT,$0-36
|
|
||||||
JMP syscall·rawsocketcall(SB)
|
|
||||||
|
|
||||||
TEXT ·seek(SB),NOSPLIT,$0-28
|
|
||||||
JMP syscall·seek(SB)
|
|
57
vendor/golang.org/x/sys/unix/asm_linux_amd64.s
generated
vendored
57
vendor/golang.org/x/sys/unix/asm_linux_amd64.s
generated
vendored
|
@ -1,57 +0,0 @@
|
||||||
// Copyright 2009 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System calls for AMD64, Linux
|
|
||||||
//
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-56
|
|
||||||
JMP syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-80
|
|
||||||
JMP syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·SyscallNoError(SB),NOSPLIT,$0-48
|
|
||||||
CALL runtime·entersyscall(SB)
|
|
||||||
MOVQ a1+8(FP), DI
|
|
||||||
MOVQ a2+16(FP), SI
|
|
||||||
MOVQ a3+24(FP), DX
|
|
||||||
MOVQ $0, R10
|
|
||||||
MOVQ $0, R8
|
|
||||||
MOVQ $0, R9
|
|
||||||
MOVQ trap+0(FP), AX // syscall entry
|
|
||||||
SYSCALL
|
|
||||||
MOVQ AX, r1+32(FP)
|
|
||||||
MOVQ DX, r2+40(FP)
|
|
||||||
CALL runtime·exitsyscall(SB)
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
|
|
||||||
JMP syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
|
|
||||||
JMP syscall·RawSyscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48
|
|
||||||
MOVQ a1+8(FP), DI
|
|
||||||
MOVQ a2+16(FP), SI
|
|
||||||
MOVQ a3+24(FP), DX
|
|
||||||
MOVQ $0, R10
|
|
||||||
MOVQ $0, R8
|
|
||||||
MOVQ $0, R9
|
|
||||||
MOVQ trap+0(FP), AX // syscall entry
|
|
||||||
SYSCALL
|
|
||||||
MOVQ AX, r1+32(FP)
|
|
||||||
MOVQ DX, r2+40(FP)
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT ·gettimeofday(SB),NOSPLIT,$0-16
|
|
||||||
JMP syscall·gettimeofday(SB)
|
|
56
vendor/golang.org/x/sys/unix/asm_linux_arm.s
generated
vendored
56
vendor/golang.org/x/sys/unix/asm_linux_arm.s
generated
vendored
|
@ -1,56 +0,0 @@
|
||||||
// Copyright 2009 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System calls for arm, Linux
|
|
||||||
//
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-28
|
|
||||||
B syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-40
|
|
||||||
B syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·SyscallNoError(SB),NOSPLIT,$0-24
|
|
||||||
BL runtime·entersyscall(SB)
|
|
||||||
MOVW trap+0(FP), R7
|
|
||||||
MOVW a1+4(FP), R0
|
|
||||||
MOVW a2+8(FP), R1
|
|
||||||
MOVW a3+12(FP), R2
|
|
||||||
MOVW $0, R3
|
|
||||||
MOVW $0, R4
|
|
||||||
MOVW $0, R5
|
|
||||||
SWI $0
|
|
||||||
MOVW R0, r1+16(FP)
|
|
||||||
MOVW $0, R0
|
|
||||||
MOVW R0, r2+20(FP)
|
|
||||||
BL runtime·exitsyscall(SB)
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-28
|
|
||||||
B syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-40
|
|
||||||
B syscall·RawSyscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-24
|
|
||||||
MOVW trap+0(FP), R7 // syscall entry
|
|
||||||
MOVW a1+4(FP), R0
|
|
||||||
MOVW a2+8(FP), R1
|
|
||||||
MOVW a3+12(FP), R2
|
|
||||||
SWI $0
|
|
||||||
MOVW R0, r1+16(FP)
|
|
||||||
MOVW $0, R0
|
|
||||||
MOVW R0, r2+20(FP)
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT ·seek(SB),NOSPLIT,$0-28
|
|
||||||
B syscall·seek(SB)
|
|
52
vendor/golang.org/x/sys/unix/asm_linux_arm64.s
generated
vendored
52
vendor/golang.org/x/sys/unix/asm_linux_arm64.s
generated
vendored
|
@ -1,52 +0,0 @@
|
||||||
// Copyright 2015 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build linux
|
|
||||||
// +build arm64
|
|
||||||
// +build !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-56
|
|
||||||
B syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-80
|
|
||||||
B syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·SyscallNoError(SB),NOSPLIT,$0-48
|
|
||||||
BL runtime·entersyscall(SB)
|
|
||||||
MOVD a1+8(FP), R0
|
|
||||||
MOVD a2+16(FP), R1
|
|
||||||
MOVD a3+24(FP), R2
|
|
||||||
MOVD $0, R3
|
|
||||||
MOVD $0, R4
|
|
||||||
MOVD $0, R5
|
|
||||||
MOVD trap+0(FP), R8 // syscall entry
|
|
||||||
SVC
|
|
||||||
MOVD R0, r1+32(FP) // r1
|
|
||||||
MOVD R1, r2+40(FP) // r2
|
|
||||||
BL runtime·exitsyscall(SB)
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
|
|
||||||
B syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
|
|
||||||
B syscall·RawSyscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48
|
|
||||||
MOVD a1+8(FP), R0
|
|
||||||
MOVD a2+16(FP), R1
|
|
||||||
MOVD a3+24(FP), R2
|
|
||||||
MOVD $0, R3
|
|
||||||
MOVD $0, R4
|
|
||||||
MOVD $0, R5
|
|
||||||
MOVD trap+0(FP), R8 // syscall entry
|
|
||||||
SVC
|
|
||||||
MOVD R0, r1+32(FP)
|
|
||||||
MOVD R1, r2+40(FP)
|
|
||||||
RET
|
|
56
vendor/golang.org/x/sys/unix/asm_linux_mips64x.s
generated
vendored
56
vendor/golang.org/x/sys/unix/asm_linux_mips64x.s
generated
vendored
|
@ -1,56 +0,0 @@
|
||||||
// Copyright 2015 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build linux
|
|
||||||
// +build mips64 mips64le
|
|
||||||
// +build !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System calls for mips64, Linux
|
|
||||||
//
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-56
|
|
||||||
JMP syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-80
|
|
||||||
JMP syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·SyscallNoError(SB),NOSPLIT,$0-48
|
|
||||||
JAL runtime·entersyscall(SB)
|
|
||||||
MOVV a1+8(FP), R4
|
|
||||||
MOVV a2+16(FP), R5
|
|
||||||
MOVV a3+24(FP), R6
|
|
||||||
MOVV R0, R7
|
|
||||||
MOVV R0, R8
|
|
||||||
MOVV R0, R9
|
|
||||||
MOVV trap+0(FP), R2 // syscall entry
|
|
||||||
SYSCALL
|
|
||||||
MOVV R2, r1+32(FP)
|
|
||||||
MOVV R3, r2+40(FP)
|
|
||||||
JAL runtime·exitsyscall(SB)
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
|
|
||||||
JMP syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
|
|
||||||
JMP syscall·RawSyscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48
|
|
||||||
MOVV a1+8(FP), R4
|
|
||||||
MOVV a2+16(FP), R5
|
|
||||||
MOVV a3+24(FP), R6
|
|
||||||
MOVV R0, R7
|
|
||||||
MOVV R0, R8
|
|
||||||
MOVV R0, R9
|
|
||||||
MOVV trap+0(FP), R2 // syscall entry
|
|
||||||
SYSCALL
|
|
||||||
MOVV R2, r1+32(FP)
|
|
||||||
MOVV R3, r2+40(FP)
|
|
||||||
RET
|
|
54
vendor/golang.org/x/sys/unix/asm_linux_mipsx.s
generated
vendored
54
vendor/golang.org/x/sys/unix/asm_linux_mipsx.s
generated
vendored
|
@ -1,54 +0,0 @@
|
||||||
// Copyright 2016 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build linux
|
|
||||||
// +build mips mipsle
|
|
||||||
// +build !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System calls for mips, Linux
|
|
||||||
//
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-28
|
|
||||||
JMP syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-40
|
|
||||||
JMP syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall9(SB),NOSPLIT,$0-52
|
|
||||||
JMP syscall·Syscall9(SB)
|
|
||||||
|
|
||||||
TEXT ·SyscallNoError(SB),NOSPLIT,$0-24
|
|
||||||
JAL runtime·entersyscall(SB)
|
|
||||||
MOVW a1+4(FP), R4
|
|
||||||
MOVW a2+8(FP), R5
|
|
||||||
MOVW a3+12(FP), R6
|
|
||||||
MOVW R0, R7
|
|
||||||
MOVW trap+0(FP), R2 // syscall entry
|
|
||||||
SYSCALL
|
|
||||||
MOVW R2, r1+16(FP) // r1
|
|
||||||
MOVW R3, r2+20(FP) // r2
|
|
||||||
JAL runtime·exitsyscall(SB)
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-28
|
|
||||||
JMP syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-40
|
|
||||||
JMP syscall·RawSyscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-24
|
|
||||||
MOVW a1+4(FP), R4
|
|
||||||
MOVW a2+8(FP), R5
|
|
||||||
MOVW a3+12(FP), R6
|
|
||||||
MOVW trap+0(FP), R2 // syscall entry
|
|
||||||
SYSCALL
|
|
||||||
MOVW R2, r1+16(FP)
|
|
||||||
MOVW R3, r2+20(FP)
|
|
||||||
RET
|
|
56
vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s
generated
vendored
56
vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s
generated
vendored
|
@ -1,56 +0,0 @@
|
||||||
// Copyright 2014 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build linux
|
|
||||||
// +build ppc64 ppc64le
|
|
||||||
// +build !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System calls for ppc64, Linux
|
|
||||||
//
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-56
|
|
||||||
BR syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-80
|
|
||||||
BR syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·SyscallNoError(SB),NOSPLIT,$0-48
|
|
||||||
BL runtime·entersyscall(SB)
|
|
||||||
MOVD a1+8(FP), R3
|
|
||||||
MOVD a2+16(FP), R4
|
|
||||||
MOVD a3+24(FP), R5
|
|
||||||
MOVD R0, R6
|
|
||||||
MOVD R0, R7
|
|
||||||
MOVD R0, R8
|
|
||||||
MOVD trap+0(FP), R9 // syscall entry
|
|
||||||
SYSCALL R9
|
|
||||||
MOVD R3, r1+32(FP)
|
|
||||||
MOVD R4, r2+40(FP)
|
|
||||||
BL runtime·exitsyscall(SB)
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
|
|
||||||
BR syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
|
|
||||||
BR syscall·RawSyscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48
|
|
||||||
MOVD a1+8(FP), R3
|
|
||||||
MOVD a2+16(FP), R4
|
|
||||||
MOVD a3+24(FP), R5
|
|
||||||
MOVD R0, R6
|
|
||||||
MOVD R0, R7
|
|
||||||
MOVD R0, R8
|
|
||||||
MOVD trap+0(FP), R9 // syscall entry
|
|
||||||
SYSCALL R9
|
|
||||||
MOVD R3, r1+32(FP)
|
|
||||||
MOVD R4, r2+40(FP)
|
|
||||||
RET
|
|
56
vendor/golang.org/x/sys/unix/asm_linux_s390x.s
generated
vendored
56
vendor/golang.org/x/sys/unix/asm_linux_s390x.s
generated
vendored
|
@ -1,56 +0,0 @@
|
||||||
// Copyright 2016 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build s390x
|
|
||||||
// +build linux
|
|
||||||
// +build !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System calls for s390x, Linux
|
|
||||||
//
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-56
|
|
||||||
BR syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-80
|
|
||||||
BR syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·SyscallNoError(SB),NOSPLIT,$0-48
|
|
||||||
BL runtime·entersyscall(SB)
|
|
||||||
MOVD a1+8(FP), R2
|
|
||||||
MOVD a2+16(FP), R3
|
|
||||||
MOVD a3+24(FP), R4
|
|
||||||
MOVD $0, R5
|
|
||||||
MOVD $0, R6
|
|
||||||
MOVD $0, R7
|
|
||||||
MOVD trap+0(FP), R1 // syscall entry
|
|
||||||
SYSCALL
|
|
||||||
MOVD R2, r1+32(FP)
|
|
||||||
MOVD R3, r2+40(FP)
|
|
||||||
BL runtime·exitsyscall(SB)
|
|
||||||
RET
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
|
|
||||||
BR syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
|
|
||||||
BR syscall·RawSyscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48
|
|
||||||
MOVD a1+8(FP), R2
|
|
||||||
MOVD a2+16(FP), R3
|
|
||||||
MOVD a3+24(FP), R4
|
|
||||||
MOVD $0, R5
|
|
||||||
MOVD $0, R6
|
|
||||||
MOVD $0, R7
|
|
||||||
MOVD trap+0(FP), R1 // syscall entry
|
|
||||||
SYSCALL
|
|
||||||
MOVD R2, r1+32(FP)
|
|
||||||
MOVD R3, r2+40(FP)
|
|
||||||
RET
|
|
29
vendor/golang.org/x/sys/unix/asm_netbsd_386.s
generated
vendored
29
vendor/golang.org/x/sys/unix/asm_netbsd_386.s
generated
vendored
|
@ -1,29 +0,0 @@
|
||||||
// Copyright 2009 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System call support for 386, NetBSD
|
|
||||||
//
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-28
|
|
||||||
JMP syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-40
|
|
||||||
JMP syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall9(SB),NOSPLIT,$0-52
|
|
||||||
JMP syscall·Syscall9(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-28
|
|
||||||
JMP syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-40
|
|
||||||
JMP syscall·RawSyscall6(SB)
|
|
29
vendor/golang.org/x/sys/unix/asm_netbsd_amd64.s
generated
vendored
29
vendor/golang.org/x/sys/unix/asm_netbsd_amd64.s
generated
vendored
|
@ -1,29 +0,0 @@
|
||||||
// Copyright 2009 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System call support for AMD64, NetBSD
|
|
||||||
//
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-56
|
|
||||||
JMP syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-80
|
|
||||||
JMP syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall9(SB),NOSPLIT,$0-104
|
|
||||||
JMP syscall·Syscall9(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
|
|
||||||
JMP syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
|
|
||||||
JMP syscall·RawSyscall6(SB)
|
|
29
vendor/golang.org/x/sys/unix/asm_netbsd_arm.s
generated
vendored
29
vendor/golang.org/x/sys/unix/asm_netbsd_arm.s
generated
vendored
|
@ -1,29 +0,0 @@
|
||||||
// Copyright 2013 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System call support for ARM, NetBSD
|
|
||||||
//
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-28
|
|
||||||
B syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-40
|
|
||||||
B syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall9(SB),NOSPLIT,$0-52
|
|
||||||
B syscall·Syscall9(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-28
|
|
||||||
B syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-40
|
|
||||||
B syscall·RawSyscall6(SB)
|
|
29
vendor/golang.org/x/sys/unix/asm_openbsd_386.s
generated
vendored
29
vendor/golang.org/x/sys/unix/asm_openbsd_386.s
generated
vendored
|
@ -1,29 +0,0 @@
|
||||||
// Copyright 2009 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System call support for 386, OpenBSD
|
|
||||||
//
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-28
|
|
||||||
JMP syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-40
|
|
||||||
JMP syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall9(SB),NOSPLIT,$0-52
|
|
||||||
JMP syscall·Syscall9(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-28
|
|
||||||
JMP syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-40
|
|
||||||
JMP syscall·RawSyscall6(SB)
|
|
29
vendor/golang.org/x/sys/unix/asm_openbsd_amd64.s
generated
vendored
29
vendor/golang.org/x/sys/unix/asm_openbsd_amd64.s
generated
vendored
|
@ -1,29 +0,0 @@
|
||||||
// Copyright 2009 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System call support for AMD64, OpenBSD
|
|
||||||
//
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-56
|
|
||||||
JMP syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-80
|
|
||||||
JMP syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall9(SB),NOSPLIT,$0-104
|
|
||||||
JMP syscall·Syscall9(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
|
|
||||||
JMP syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
|
|
||||||
JMP syscall·RawSyscall6(SB)
|
|
29
vendor/golang.org/x/sys/unix/asm_openbsd_arm.s
generated
vendored
29
vendor/golang.org/x/sys/unix/asm_openbsd_arm.s
generated
vendored
|
@ -1,29 +0,0 @@
|
||||||
// Copyright 2017 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System call support for ARM, OpenBSD
|
|
||||||
//
|
|
||||||
|
|
||||||
// Just jump to package syscall's implementation for all these functions.
|
|
||||||
// The runtime may know about them.
|
|
||||||
|
|
||||||
TEXT ·Syscall(SB),NOSPLIT,$0-28
|
|
||||||
B syscall·Syscall(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall6(SB),NOSPLIT,$0-40
|
|
||||||
B syscall·Syscall6(SB)
|
|
||||||
|
|
||||||
TEXT ·Syscall9(SB),NOSPLIT,$0-52
|
|
||||||
B syscall·Syscall9(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall(SB),NOSPLIT,$0-28
|
|
||||||
B syscall·RawSyscall(SB)
|
|
||||||
|
|
||||||
TEXT ·RawSyscall6(SB),NOSPLIT,$0-40
|
|
||||||
B syscall·RawSyscall6(SB)
|
|
17
vendor/golang.org/x/sys/unix/asm_solaris_amd64.s
generated
vendored
17
vendor/golang.org/x/sys/unix/asm_solaris_amd64.s
generated
vendored
|
@ -1,17 +0,0 @@
|
||||||
// Copyright 2014 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build !gccgo
|
|
||||||
|
|
||||||
#include "textflag.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// System calls for amd64, Solaris are implemented in runtime/syscall_solaris.go
|
|
||||||
//
|
|
||||||
|
|
||||||
TEXT ·sysvicall6(SB),NOSPLIT,$0-88
|
|
||||||
JMP syscall·sysvicall6(SB)
|
|
||||||
|
|
||||||
TEXT ·rawSysvicall6(SB),NOSPLIT,$0-88
|
|
||||||
JMP syscall·rawSysvicall6(SB)
|
|
35
vendor/golang.org/x/sys/unix/bluetooth_linux.go
generated
vendored
35
vendor/golang.org/x/sys/unix/bluetooth_linux.go
generated
vendored
|
@ -1,35 +0,0 @@
|
||||||
// Copyright 2016 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// Bluetooth sockets and messages
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
// Bluetooth Protocols
|
|
||||||
const (
|
|
||||||
BTPROTO_L2CAP = 0
|
|
||||||
BTPROTO_HCI = 1
|
|
||||||
BTPROTO_SCO = 2
|
|
||||||
BTPROTO_RFCOMM = 3
|
|
||||||
BTPROTO_BNEP = 4
|
|
||||||
BTPROTO_CMTP = 5
|
|
||||||
BTPROTO_HIDP = 6
|
|
||||||
BTPROTO_AVDTP = 7
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
HCI_CHANNEL_RAW = 0
|
|
||||||
HCI_CHANNEL_USER = 1
|
|
||||||
HCI_CHANNEL_MONITOR = 2
|
|
||||||
HCI_CHANNEL_CONTROL = 3
|
|
||||||
)
|
|
||||||
|
|
||||||
// Socketoption Level
|
|
||||||
const (
|
|
||||||
SOL_BLUETOOTH = 0x112
|
|
||||||
SOL_HCI = 0x0
|
|
||||||
SOL_L2CAP = 0x6
|
|
||||||
SOL_RFCOMM = 0x12
|
|
||||||
SOL_SCO = 0x11
|
|
||||||
)
|
|
195
vendor/golang.org/x/sys/unix/cap_freebsd.go
generated
vendored
195
vendor/golang.org/x/sys/unix/cap_freebsd.go
generated
vendored
|
@ -1,195 +0,0 @@
|
||||||
// Copyright 2017 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build freebsd
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Go implementation of C mostly found in /usr/src/sys/kern/subr_capability.c
|
|
||||||
|
|
||||||
const (
|
|
||||||
// This is the version of CapRights this package understands. See C implementation for parallels.
|
|
||||||
capRightsGoVersion = CAP_RIGHTS_VERSION_00
|
|
||||||
capArSizeMin = CAP_RIGHTS_VERSION_00 + 2
|
|
||||||
capArSizeMax = capRightsGoVersion + 2
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
bit2idx = []int{
|
|
||||||
-1, 0, 1, -1, 2, -1, -1, -1, 3, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
func capidxbit(right uint64) int {
|
|
||||||
return int((right >> 57) & 0x1f)
|
|
||||||
}
|
|
||||||
|
|
||||||
func rightToIndex(right uint64) (int, error) {
|
|
||||||
idx := capidxbit(right)
|
|
||||||
if idx < 0 || idx >= len(bit2idx) {
|
|
||||||
return -2, fmt.Errorf("index for right 0x%x out of range", right)
|
|
||||||
}
|
|
||||||
return bit2idx[idx], nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func caprver(right uint64) int {
|
|
||||||
return int(right >> 62)
|
|
||||||
}
|
|
||||||
|
|
||||||
func capver(rights *CapRights) int {
|
|
||||||
return caprver(rights.Rights[0])
|
|
||||||
}
|
|
||||||
|
|
||||||
func caparsize(rights *CapRights) int {
|
|
||||||
return capver(rights) + 2
|
|
||||||
}
|
|
||||||
|
|
||||||
// CapRightsSet sets the permissions in setrights in rights.
|
|
||||||
func CapRightsSet(rights *CapRights, setrights []uint64) error {
|
|
||||||
// This is essentially a copy of cap_rights_vset()
|
|
||||||
if capver(rights) != CAP_RIGHTS_VERSION_00 {
|
|
||||||
return fmt.Errorf("bad rights version %d", capver(rights))
|
|
||||||
}
|
|
||||||
|
|
||||||
n := caparsize(rights)
|
|
||||||
if n < capArSizeMin || n > capArSizeMax {
|
|
||||||
return errors.New("bad rights size")
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, right := range setrights {
|
|
||||||
if caprver(right) != CAP_RIGHTS_VERSION_00 {
|
|
||||||
return errors.New("bad right version")
|
|
||||||
}
|
|
||||||
i, err := rightToIndex(right)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if i >= n {
|
|
||||||
return errors.New("index overflow")
|
|
||||||
}
|
|
||||||
if capidxbit(rights.Rights[i]) != capidxbit(right) {
|
|
||||||
return errors.New("index mismatch")
|
|
||||||
}
|
|
||||||
rights.Rights[i] |= right
|
|
||||||
if capidxbit(rights.Rights[i]) != capidxbit(right) {
|
|
||||||
return errors.New("index mismatch (after assign)")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CapRightsClear clears the permissions in clearrights from rights.
|
|
||||||
func CapRightsClear(rights *CapRights, clearrights []uint64) error {
|
|
||||||
// This is essentially a copy of cap_rights_vclear()
|
|
||||||
if capver(rights) != CAP_RIGHTS_VERSION_00 {
|
|
||||||
return fmt.Errorf("bad rights version %d", capver(rights))
|
|
||||||
}
|
|
||||||
|
|
||||||
n := caparsize(rights)
|
|
||||||
if n < capArSizeMin || n > capArSizeMax {
|
|
||||||
return errors.New("bad rights size")
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, right := range clearrights {
|
|
||||||
if caprver(right) != CAP_RIGHTS_VERSION_00 {
|
|
||||||
return errors.New("bad right version")
|
|
||||||
}
|
|
||||||
i, err := rightToIndex(right)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if i >= n {
|
|
||||||
return errors.New("index overflow")
|
|
||||||
}
|
|
||||||
if capidxbit(rights.Rights[i]) != capidxbit(right) {
|
|
||||||
return errors.New("index mismatch")
|
|
||||||
}
|
|
||||||
rights.Rights[i] &= ^(right & 0x01FFFFFFFFFFFFFF)
|
|
||||||
if capidxbit(rights.Rights[i]) != capidxbit(right) {
|
|
||||||
return errors.New("index mismatch (after assign)")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CapRightsIsSet checks whether all the permissions in setrights are present in rights.
|
|
||||||
func CapRightsIsSet(rights *CapRights, setrights []uint64) (bool, error) {
|
|
||||||
// This is essentially a copy of cap_rights_is_vset()
|
|
||||||
if capver(rights) != CAP_RIGHTS_VERSION_00 {
|
|
||||||
return false, fmt.Errorf("bad rights version %d", capver(rights))
|
|
||||||
}
|
|
||||||
|
|
||||||
n := caparsize(rights)
|
|
||||||
if n < capArSizeMin || n > capArSizeMax {
|
|
||||||
return false, errors.New("bad rights size")
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, right := range setrights {
|
|
||||||
if caprver(right) != CAP_RIGHTS_VERSION_00 {
|
|
||||||
return false, errors.New("bad right version")
|
|
||||||
}
|
|
||||||
i, err := rightToIndex(right)
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
if i >= n {
|
|
||||||
return false, errors.New("index overflow")
|
|
||||||
}
|
|
||||||
if capidxbit(rights.Rights[i]) != capidxbit(right) {
|
|
||||||
return false, errors.New("index mismatch")
|
|
||||||
}
|
|
||||||
if (rights.Rights[i] & right) != right {
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func capright(idx uint64, bit uint64) uint64 {
|
|
||||||
return ((1 << (57 + idx)) | bit)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CapRightsInit returns a pointer to an initialised CapRights structure filled with rights.
|
|
||||||
// See man cap_rights_init(3) and rights(4).
|
|
||||||
func CapRightsInit(rights []uint64) (*CapRights, error) {
|
|
||||||
var r CapRights
|
|
||||||
r.Rights[0] = (capRightsGoVersion << 62) | capright(0, 0)
|
|
||||||
r.Rights[1] = capright(1, 0)
|
|
||||||
|
|
||||||
err := CapRightsSet(&r, rights)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &r, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CapRightsLimit reduces the operations permitted on fd to at most those contained in rights.
|
|
||||||
// The capability rights on fd can never be increased by CapRightsLimit.
|
|
||||||
// See man cap_rights_limit(2) and rights(4).
|
|
||||||
func CapRightsLimit(fd uintptr, rights *CapRights) error {
|
|
||||||
return capRightsLimit(int(fd), rights)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CapRightsGet returns a CapRights structure containing the operations permitted on fd.
|
|
||||||
// See man cap_rights_get(3) and rights(4).
|
|
||||||
func CapRightsGet(fd uintptr) (*CapRights, error) {
|
|
||||||
r, err := CapRightsInit(nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
err = capRightsGet(capRightsGoVersion, int(fd), r)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return r, nil
|
|
||||||
}
|
|
13
vendor/golang.org/x/sys/unix/constants.go
generated
vendored
13
vendor/golang.org/x/sys/unix/constants.go
generated
vendored
|
@ -1,13 +0,0 @@
|
||||||
// Copyright 2015 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build darwin dragonfly freebsd linux netbsd openbsd solaris
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
const (
|
|
||||||
R_OK = 0x4
|
|
||||||
W_OK = 0x2
|
|
||||||
X_OK = 0x1
|
|
||||||
)
|
|
24
vendor/golang.org/x/sys/unix/dev_darwin.go
generated
vendored
24
vendor/golang.org/x/sys/unix/dev_darwin.go
generated
vendored
|
@ -1,24 +0,0 @@
|
||||||
// Copyright 2017 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// Functions to access/create device major and minor numbers matching the
|
|
||||||
// encoding used in Darwin's sys/types.h header.
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
// Major returns the major component of a Darwin device number.
|
|
||||||
func Major(dev uint64) uint32 {
|
|
||||||
return uint32((dev >> 24) & 0xff)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Minor returns the minor component of a Darwin device number.
|
|
||||||
func Minor(dev uint64) uint32 {
|
|
||||||
return uint32(dev & 0xffffff)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mkdev returns a Darwin device number generated from the given major and minor
|
|
||||||
// components.
|
|
||||||
func Mkdev(major, minor uint32) uint64 {
|
|
||||||
return (uint64(major) << 24) | uint64(minor)
|
|
||||||
}
|
|
30
vendor/golang.org/x/sys/unix/dev_dragonfly.go
generated
vendored
30
vendor/golang.org/x/sys/unix/dev_dragonfly.go
generated
vendored
|
@ -1,30 +0,0 @@
|
||||||
// Copyright 2017 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// Functions to access/create device major and minor numbers matching the
|
|
||||||
// encoding used in Dragonfly's sys/types.h header.
|
|
||||||
//
|
|
||||||
// The information below is extracted and adapted from sys/types.h:
|
|
||||||
//
|
|
||||||
// Minor gives a cookie instead of an index since in order to avoid changing the
|
|
||||||
// meanings of bits 0-15 or wasting time and space shifting bits 16-31 for
|
|
||||||
// devices that don't use them.
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
// Major returns the major component of a DragonFlyBSD device number.
|
|
||||||
func Major(dev uint64) uint32 {
|
|
||||||
return uint32((dev >> 8) & 0xff)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Minor returns the minor component of a DragonFlyBSD device number.
|
|
||||||
func Minor(dev uint64) uint32 {
|
|
||||||
return uint32(dev & 0xffff00ff)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mkdev returns a DragonFlyBSD device number generated from the given major and
|
|
||||||
// minor components.
|
|
||||||
func Mkdev(major, minor uint32) uint64 {
|
|
||||||
return (uint64(major) << 8) | uint64(minor)
|
|
||||||
}
|
|
30
vendor/golang.org/x/sys/unix/dev_freebsd.go
generated
vendored
30
vendor/golang.org/x/sys/unix/dev_freebsd.go
generated
vendored
|
@ -1,30 +0,0 @@
|
||||||
// Copyright 2017 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// Functions to access/create device major and minor numbers matching the
|
|
||||||
// encoding used in FreeBSD's sys/types.h header.
|
|
||||||
//
|
|
||||||
// The information below is extracted and adapted from sys/types.h:
|
|
||||||
//
|
|
||||||
// Minor gives a cookie instead of an index since in order to avoid changing the
|
|
||||||
// meanings of bits 0-15 or wasting time and space shifting bits 16-31 for
|
|
||||||
// devices that don't use them.
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
// Major returns the major component of a FreeBSD device number.
|
|
||||||
func Major(dev uint64) uint32 {
|
|
||||||
return uint32((dev >> 8) & 0xff)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Minor returns the minor component of a FreeBSD device number.
|
|
||||||
func Minor(dev uint64) uint32 {
|
|
||||||
return uint32(dev & 0xffff00ff)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mkdev returns a FreeBSD device number generated from the given major and
|
|
||||||
// minor components.
|
|
||||||
func Mkdev(major, minor uint32) uint64 {
|
|
||||||
return (uint64(major) << 8) | uint64(minor)
|
|
||||||
}
|
|
42
vendor/golang.org/x/sys/unix/dev_linux.go
generated
vendored
42
vendor/golang.org/x/sys/unix/dev_linux.go
generated
vendored
|
@ -1,42 +0,0 @@
|
||||||
// Copyright 2017 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// Functions to access/create device major and minor numbers matching the
|
|
||||||
// encoding used by the Linux kernel and glibc.
|
|
||||||
//
|
|
||||||
// The information below is extracted and adapted from bits/sysmacros.h in the
|
|
||||||
// glibc sources:
|
|
||||||
//
|
|
||||||
// dev_t in glibc is 64-bit, with 32-bit major and minor numbers. glibc's
|
|
||||||
// default encoding is MMMM Mmmm mmmM MMmm, where M is a hex digit of the major
|
|
||||||
// number and m is a hex digit of the minor number. This is backward compatible
|
|
||||||
// with legacy systems where dev_t is 16 bits wide, encoded as MMmm. It is also
|
|
||||||
// backward compatible with the Linux kernel, which for some architectures uses
|
|
||||||
// 32-bit dev_t, encoded as mmmM MMmm.
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
// Major returns the major component of a Linux device number.
|
|
||||||
func Major(dev uint64) uint32 {
|
|
||||||
major := uint32((dev & 0x00000000000fff00) >> 8)
|
|
||||||
major |= uint32((dev & 0xfffff00000000000) >> 32)
|
|
||||||
return major
|
|
||||||
}
|
|
||||||
|
|
||||||
// Minor returns the minor component of a Linux device number.
|
|
||||||
func Minor(dev uint64) uint32 {
|
|
||||||
minor := uint32((dev & 0x00000000000000ff) >> 0)
|
|
||||||
minor |= uint32((dev & 0x00000ffffff00000) >> 12)
|
|
||||||
return minor
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mkdev returns a Linux device number generated from the given major and minor
|
|
||||||
// components.
|
|
||||||
func Mkdev(major, minor uint32) uint64 {
|
|
||||||
dev := (uint64(major) & 0x00000fff) << 8
|
|
||||||
dev |= (uint64(major) & 0xfffff000) << 32
|
|
||||||
dev |= (uint64(minor) & 0x000000ff) << 0
|
|
||||||
dev |= (uint64(minor) & 0xffffff00) << 12
|
|
||||||
return dev
|
|
||||||
}
|
|
29
vendor/golang.org/x/sys/unix/dev_netbsd.go
generated
vendored
29
vendor/golang.org/x/sys/unix/dev_netbsd.go
generated
vendored
|
@ -1,29 +0,0 @@
|
||||||
// Copyright 2017 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// Functions to access/create device major and minor numbers matching the
|
|
||||||
// encoding used in NetBSD's sys/types.h header.
|
|
||||||
|
|
||||||
package unix
|
|
||||||
|
|
||||||
// Major returns the major component of a NetBSD device number.
|
|
||||||
func Major(dev uint64) uint32 {
|
|
||||||
return uint32((dev & 0x000fff00) >> 8)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Minor returns the minor component of a NetBSD device number.
|
|
||||||
func Minor(dev uint64) uint32 {
|
|
||||||
minor := uint32((dev & 0x000000ff) >> 0)
|
|
||||||
minor |= uint32((dev & 0xfff00000) >> 12)
|
|
||||||
return minor
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mkdev returns a NetBSD device number generated from the given major and minor
|
|
||||||
// components.
|
|
||||||
func Mkdev(major, minor uint32) uint64 {
|
|
||||||
dev := (uint64(major) << 8) & 0x000fff00
|
|
||||||
dev |= (uint64(minor) << 12) & 0xfff00000
|
|
||||||
dev |= (uint64(minor) << 0) & 0x000000ff
|
|
||||||
return dev
|
|
||||||
}
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue