mirror of
https://github.com/Luzifer/password.git
synced 2024-11-09 09:50:07 +00:00
Breaking: Password v2.0.0 (#5)
- Fix broken vendoring for library users (closes #4) - Move command to `cmd/password` subdir - Drop support for Alfred workflow - Add support for Go 1.11+ modules
This commit is contained in:
parent
8e7e05eea1
commit
eed2ae8b08
116 changed files with 3997 additions and 17541 deletions
5
.gitignore
vendored
5
.gitignore
vendored
|
@ -1,6 +1,5 @@
|
||||||
|
cmd/password/.build
|
||||||
|
cmd/password/password
|
||||||
dist
|
dist
|
||||||
frontend/assets/*
|
frontend/assets/*
|
||||||
js/node_modules/*
|
js/node_modules/*
|
||||||
password
|
|
||||||
password_darwin_amd64
|
|
||||||
PasswordGenerator.alfredworkflow
|
|
||||||
|
|
3
.gitmodules
vendored
3
.gitmodules
vendored
|
@ -1,3 +0,0 @@
|
||||||
[submodule "alfred-workflow/lib"]
|
|
||||||
path = alfred-workflow/lib
|
|
||||||
url = https://github.com/deanishe/alfred-workflow.git
|
|
|
@ -1,12 +1,11 @@
|
||||||
---
|
---
|
||||||
|
|
||||||
image: "quay.io/luzifer/repo-runner-image"
|
image: "reporunner/golang-alpine"
|
||||||
checkout_dir: /go/src/github.com/Luzifer/password
|
checkout_dir: /src
|
||||||
|
|
||||||
commands:
|
commands:
|
||||||
- apk --update add zip
|
- make publish
|
||||||
- git submodule update --init --recursive
|
|
||||||
- make publish workflow
|
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
CGO_ENABLED: 0
|
CGO_ENABLED: 0
|
||||||
|
PACKAGES: .
|
||||||
|
|
|
@ -1,11 +1,10 @@
|
||||||
language: go
|
language: go
|
||||||
|
|
||||||
go:
|
go:
|
||||||
- 1.7.x
|
|
||||||
- 1.8.x
|
|
||||||
- 1.9.x
|
|
||||||
- 1.10.x
|
- 1.10.x
|
||||||
- 1.11.x
|
- 1.11.x
|
||||||
|
- 1.12.x
|
||||||
- tip
|
- tip
|
||||||
|
|
||||||
script: go test -v --bench=. github.com/Luzifer/password github.com/Luzifer/password/lib
|
install: go get -v github.com/Luzifer/password/lib
|
||||||
|
script: go test -v --bench=. github.com/Luzifer/password/lib
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
FROM golang:alpine as builder
|
FROM golang:alpine as builder
|
||||||
|
|
||||||
COPY . /go/src/github.com/Luzifer/password
|
COPY . /src/github.com/Luzifer/password
|
||||||
WORKDIR /go/src/github.com/Luzifer/password
|
WORKDIR /src/github.com/Luzifer/password/cmd/password
|
||||||
|
|
||||||
RUN set -ex \
|
RUN set -ex \
|
||||||
&& apk add --update git \
|
&& apk add --update git \
|
||||||
|
|
106
Gopkg.lock
generated
106
Gopkg.lock
generated
|
@ -1,106 +0,0 @@
|
||||||
# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
|
|
||||||
|
|
||||||
|
|
||||||
[[projects]]
|
|
||||||
digest = "1:70792ca3a262117f2135feb54379a0399fc8afb267edc64a16ee278dd431a619"
|
|
||||||
name = "github.com/Luzifer/go_helpers"
|
|
||||||
packages = [
|
|
||||||
"accessLogger",
|
|
||||||
"http",
|
|
||||||
"str",
|
|
||||||
]
|
|
||||||
pruneopts = "NUT"
|
|
||||||
revision = "bbca4398656b348ce285438ca3dffb1fce6a3f4b"
|
|
||||||
version = "v2.8.1"
|
|
||||||
|
|
||||||
[[projects]]
|
|
||||||
digest = "1:c01767916c59f084bb7c41a7d5877c0f3099b1595cfa066e84ec6ad6b084dd89"
|
|
||||||
name = "github.com/gorilla/context"
|
|
||||||
packages = ["."]
|
|
||||||
pruneopts = "NUT"
|
|
||||||
revision = "08b5f424b9271eedf6f9f0ce86cb9396ed337a42"
|
|
||||||
version = "v1.1.1"
|
|
||||||
|
|
||||||
[[projects]]
|
|
||||||
digest = "1:bf5cf1d53d703332e9bd8984c69784645b73a938317bf5ace9aadf20ac49379a"
|
|
||||||
name = "github.com/gorilla/mux"
|
|
||||||
packages = ["."]
|
|
||||||
pruneopts = "NUT"
|
|
||||||
revision = "e3702bed27f0d39777b0b37b664b6280e8ef8fbf"
|
|
||||||
version = "v1.6.2"
|
|
||||||
|
|
||||||
[[projects]]
|
|
||||||
digest = "1:406338ad39ab2e37b7f4452906442a3dbf0eb3379dd1f06aafb5c07e769a5fbb"
|
|
||||||
name = "github.com/inconshreveable/mousetrap"
|
|
||||||
packages = ["."]
|
|
||||||
pruneopts = "NUT"
|
|
||||||
revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75"
|
|
||||||
version = "v1.0"
|
|
||||||
|
|
||||||
[[projects]]
|
|
||||||
digest = "1:14715f705ff5dfe0ffd6571d7d201dd8e921030f8070321a79380d8ca4ec1a24"
|
|
||||||
name = "github.com/pkg/errors"
|
|
||||||
packages = ["."]
|
|
||||||
pruneopts = "NUT"
|
|
||||||
revision = "ba968bfe8b2f7e042a574c888954fccecfa385b4"
|
|
||||||
version = "v0.8.1"
|
|
||||||
|
|
||||||
[[projects]]
|
|
||||||
digest = "1:343d44e06621142ab09ae0c76c1799104cdfddd3ffb445d78b1adf8dc3ffaf3d"
|
|
||||||
name = "github.com/spf13/cobra"
|
|
||||||
packages = ["."]
|
|
||||||
pruneopts = "NUT"
|
|
||||||
revision = "ef82de70bb3f60c65fb8eebacbb2d122ef517385"
|
|
||||||
version = "v0.0.3"
|
|
||||||
|
|
||||||
[[projects]]
|
|
||||||
digest = "1:9d8420bbf131d1618bde6530af37c3799340d3762cc47210c1d9532a4c3a2779"
|
|
||||||
name = "github.com/spf13/pflag"
|
|
||||||
packages = ["."]
|
|
||||||
pruneopts = "NUT"
|
|
||||||
revision = "298182f68c66c05229eb03ac171abe6e309ee79a"
|
|
||||||
version = "v1.0.3"
|
|
||||||
|
|
||||||
[[projects]]
|
|
||||||
branch = "master"
|
|
||||||
digest = "1:e762d2447df27cace4112a07ddc64e7c71dc0bc5d512a59f5d2b98c5133e8e71"
|
|
||||||
name = "github.com/tredoe/osutil"
|
|
||||||
packages = [
|
|
||||||
"user/crypt",
|
|
||||||
"user/crypt/apr1_crypt",
|
|
||||||
"user/crypt/common",
|
|
||||||
"user/crypt/md5_crypt",
|
|
||||||
"user/crypt/sha256_crypt",
|
|
||||||
"user/crypt/sha512_crypt",
|
|
||||||
]
|
|
||||||
pruneopts = "NUT"
|
|
||||||
revision = "7d3ee1afa71c90fd1514c8f557ae6c5f414208eb"
|
|
||||||
|
|
||||||
[[projects]]
|
|
||||||
branch = "master"
|
|
||||||
digest = "1:1ecf2a49df33be51e757d0033d5d51d5f784f35f68e5a38f797b2d3f03357d71"
|
|
||||||
name = "golang.org/x/crypto"
|
|
||||||
packages = [
|
|
||||||
"bcrypt",
|
|
||||||
"blowfish",
|
|
||||||
]
|
|
||||||
pruneopts = "NUT"
|
|
||||||
revision = "505ab145d0a99da450461ae2c1a9f6cd10d1f447"
|
|
||||||
|
|
||||||
[solve-meta]
|
|
||||||
analyzer-name = "dep"
|
|
||||||
analyzer-version = 1
|
|
||||||
input-imports = [
|
|
||||||
"github.com/Luzifer/go_helpers/http",
|
|
||||||
"github.com/Luzifer/go_helpers/str",
|
|
||||||
"github.com/gorilla/mux",
|
|
||||||
"github.com/pkg/errors",
|
|
||||||
"github.com/spf13/cobra",
|
|
||||||
"github.com/tredoe/osutil/user/crypt",
|
|
||||||
"github.com/tredoe/osutil/user/crypt/apr1_crypt",
|
|
||||||
"github.com/tredoe/osutil/user/crypt/sha256_crypt",
|
|
||||||
"github.com/tredoe/osutil/user/crypt/sha512_crypt",
|
|
||||||
"golang.org/x/crypto/bcrypt",
|
|
||||||
]
|
|
||||||
solver-name = "gps-cdcl"
|
|
||||||
solver-version = 1
|
|
51
Gopkg.toml
51
Gopkg.toml
|
@ -1,51 +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/go_helpers"
|
|
||||||
version = "2.8.1"
|
|
||||||
|
|
||||||
[[constraint]]
|
|
||||||
name = "github.com/gorilla/mux"
|
|
||||||
version = "1.6.2"
|
|
||||||
|
|
||||||
[[constraint]]
|
|
||||||
name = "github.com/spf13/cobra"
|
|
||||||
version = "0.0.3"
|
|
||||||
|
|
||||||
[[constraint]]
|
|
||||||
branch = "master"
|
|
||||||
name = "github.com/tredoe/osutil"
|
|
||||||
|
|
||||||
[[constraint]]
|
|
||||||
branch = "master"
|
|
||||||
name = "golang.org/x/crypto"
|
|
||||||
|
|
||||||
[prune]
|
|
||||||
non-go = true
|
|
||||||
go-tests = true
|
|
||||||
unused-packages = true
|
|
11
Makefile
11
Makefile
|
@ -10,16 +10,13 @@ compile_js:
|
||||||
sh -c "yarn && npx webpack"
|
sh -c "yarn && npx webpack"
|
||||||
|
|
||||||
debug:
|
debug:
|
||||||
go-bindata --debug frontend/...
|
go-bindata --debug -o cmd/password/bindata.go --pkg=main frontend/...
|
||||||
go run *.go serve
|
go run *.go serve
|
||||||
|
|
||||||
pack: compile_js
|
pack: compile_js
|
||||||
go-bindata -modtime 1 frontend/...
|
go-bindata -modtime 1 -o cmd/password/bindata.go --pkg=main frontend/...
|
||||||
bash generateXKCDWordList.sh
|
bash generateXKCDWordList.sh
|
||||||
|
|
||||||
publish:
|
publish:
|
||||||
curl -sSLo golang.sh https://raw.githubusercontent.com/Luzifer/github-publish/master/golang.sh
|
curl -sSLo cmd/password/golang.sh https://raw.githubusercontent.com/Luzifer/github-publish/master/golang.sh
|
||||||
bash golang.sh
|
cd cmd/password && bash golang.sh
|
||||||
|
|
||||||
workflow:
|
|
||||||
bash build-workflow.sh
|
|
||||||
|
|
23
README.md
23
README.md
|
@ -20,17 +20,6 @@ For the security of the passwords there are several assertions:
|
||||||
|
|
||||||
My service [Secure Password](https://passwd.fyi/) is powered by this app and will provide you with secure passwords.
|
My service [Secure Password](https://passwd.fyi/) is powered by this app and will provide you with secure passwords.
|
||||||
|
|
||||||
### Via [Alfred](https://www.alfredapp.com/)
|
|
||||||
|
|
||||||
_(No longer actively maintained as I no longer use OSX / Alfred. The current version stays until it gets reported to be broken and will then get removed.)_
|
|
||||||
|
|
||||||
1. Ensure you do have Alfred 3 and have enabled the Powerpack
|
|
||||||
2. Download and open the `PasswordGenerator.alfredworkflow` from [Github releases](https://github.com/Luzifer/password/releases/latest)
|
|
||||||
3. Let Alfred install the workflow
|
|
||||||
4. Generate passwords using `pwd 12`, with special characters `pwd 12 s` or [XKCD style](https://xkcd.com/936/) `pwd 4 x`
|
|
||||||
|
|
||||||
The workflow is set up to automatically check for updates once a day. If you want to check for updates manually open Alfred, enter `pwd workflow:update` and press enter.
|
|
||||||
|
|
||||||
### Via CLI
|
### Via CLI
|
||||||
|
|
||||||
1. Download the compiled binary from [Github releases](https://github.com/Luzifer/password/releases/latest)
|
1. Download the compiled binary from [Github releases](https://github.com/Luzifer/password/releases/latest)
|
||||||
|
@ -95,6 +84,18 @@ $ curl https://passwd.fyi/v1/getPassword?length=20&special=true
|
||||||
0M4L-1[lT:@2&7,p,o-;
|
0M4L-1[lT:@2&7,p,o-;
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### As library in your own code
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import pwd "github.com/Luzifer/password/v2/lib"
|
||||||
|
|
||||||
|
func getPassword() (string, error) {
|
||||||
|
return pwd.NewSecurePassword().GeneratePassword(16, false)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## Benchmark / Test
|
## Benchmark / Test
|
||||||
|
|
||||||
Tests and benchmark are run by Travis CI at every push to this repository:
|
Tests and benchmark are run by Travis CI at every push to this repository:
|
||||||
|
|
1
alfred-workflow/.gitignore
vendored
1
alfred-workflow/.gitignore
vendored
|
@ -1 +0,0 @@
|
||||||
*.pyc
|
|
|
@ -1,75 +0,0 @@
|
||||||
# encoding: utf-8
|
|
||||||
|
|
||||||
import subprocess
|
|
||||||
import sys
|
|
||||||
import json
|
|
||||||
from workflow import Workflow, ICON_WEB, web
|
|
||||||
|
|
||||||
descriptions = {
|
|
||||||
"htpasswd_apr1": "APR1 (htpasswd)",
|
|
||||||
"htpasswd_bcrypt": "bcrypt (htpasswd)",
|
|
||||||
"htpasswd_sha256": "SHA256 (htpasswd)",
|
|
||||||
"htpasswd_sha512": "SHA512 (htpasswd)",
|
|
||||||
"password": "Password",
|
|
||||||
"sha1": "SHA1",
|
|
||||||
"sha256": "SHA256",
|
|
||||||
"sha512": "SHA512",
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def main(wf):
|
|
||||||
password_length = 20
|
|
||||||
use_special = False
|
|
||||||
use_xkcd = False
|
|
||||||
|
|
||||||
if len(wf.args):
|
|
||||||
for arg in wf.args[0].split():
|
|
||||||
if arg.isdigit():
|
|
||||||
password_length = int(arg)
|
|
||||||
elif arg == 's':
|
|
||||||
use_special = True
|
|
||||||
elif arg == 'x':
|
|
||||||
use_xkcd = True
|
|
||||||
|
|
||||||
if password_length < 4 or password_length > 256:
|
|
||||||
wf.add_item(title="Password length out of bounds",
|
|
||||||
subtitle="Please use a reasonable password length between 4 and 256")
|
|
||||||
wf.send_feedback()
|
|
||||||
return 1
|
|
||||||
|
|
||||||
command = ["./password_darwin_amd64",
|
|
||||||
"get", "-j", "-l",
|
|
||||||
str(password_length)]
|
|
||||||
if use_special:
|
|
||||||
command.append("-s")
|
|
||||||
if use_xkcd:
|
|
||||||
command.append("-x")
|
|
||||||
result = json.loads(subprocess.check_output(command).strip())
|
|
||||||
|
|
||||||
hashed = []
|
|
||||||
for key, value in result.iteritems():
|
|
||||||
hashed.append("{}: {}".format(key, value))
|
|
||||||
|
|
||||||
wf.add_item(title=result['password'],
|
|
||||||
subtitle="Press Cmd+C to copy",
|
|
||||||
arg=result['password'],
|
|
||||||
valid=True)
|
|
||||||
wf.add_item(title="Copy hashed versions",
|
|
||||||
subtitle="Press Cmd+C to copy",
|
|
||||||
arg="\n".join(hashed),
|
|
||||||
valid=True)
|
|
||||||
wf.send_feedback()
|
|
||||||
|
|
||||||
return 0
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
wf = Workflow(update_settings={
|
|
||||||
'github_slug': 'Luzifer/password',
|
|
||||||
})
|
|
||||||
|
|
||||||
if wf.update_available:
|
|
||||||
# Download new version and tell Alfred to install it
|
|
||||||
wf.start_update()
|
|
||||||
|
|
||||||
sys.exit(wf.run(main))
|
|
Binary file not shown.
Before Width: | Height: | Size: 13 KiB |
|
@ -1,120 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>bundleid</key>
|
|
||||||
<string>io.luzifer.pwd</string>
|
|
||||||
<key>category</key>
|
|
||||||
<string>Tools</string>
|
|
||||||
<key>connections</key>
|
|
||||||
<dict>
|
|
||||||
<key>F8CBCF9B-3B33-400E-B6AD-6B8500938BA4</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>destinationuid</key>
|
|
||||||
<string>F417810A-4CC7-4844-9B6E-DA2D6B40543C</string>
|
|
||||||
<key>modifiers</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>modifiersubtext</key>
|
|
||||||
<string></string>
|
|
||||||
<key>vitoclose</key>
|
|
||||||
<false/>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
</dict>
|
|
||||||
<key>createdby</key>
|
|
||||||
<string>Knut Ahlers</string>
|
|
||||||
<key>description</key>
|
|
||||||
<string>Generate secure passwords using Luzifer/password tool</string>
|
|
||||||
<key>disabled</key>
|
|
||||||
<false/>
|
|
||||||
<key>name</key>
|
|
||||||
<string>Password Generator</string>
|
|
||||||
<key>objects</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>config</key>
|
|
||||||
<dict>
|
|
||||||
<key>autopaste</key>
|
|
||||||
<false/>
|
|
||||||
<key>clipboardtext</key>
|
|
||||||
<string>{query}</string>
|
|
||||||
<key>transient</key>
|
|
||||||
<false/>
|
|
||||||
</dict>
|
|
||||||
<key>type</key>
|
|
||||||
<string>alfred.workflow.output.clipboard</string>
|
|
||||||
<key>uid</key>
|
|
||||||
<string>F417810A-4CC7-4844-9B6E-DA2D6B40543C</string>
|
|
||||||
<key>version</key>
|
|
||||||
<integer>2</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>config</key>
|
|
||||||
<dict>
|
|
||||||
<key>alfredfiltersresults</key>
|
|
||||||
<false/>
|
|
||||||
<key>argumenttrimmode</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>argumenttype</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>escaping</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>keyword</key>
|
|
||||||
<string>pwd</string>
|
|
||||||
<key>queuedelaycustom</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>queuedelayimmediatelyinitially</key>
|
|
||||||
<false/>
|
|
||||||
<key>queuedelaymode</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>queuemode</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>runningsubtext</key>
|
|
||||||
<string>Generating password...</string>
|
|
||||||
<key>script</key>
|
|
||||||
<string>python exec.py "$1"</string>
|
|
||||||
<key>scriptargtype</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>scriptfile</key>
|
|
||||||
<string></string>
|
|
||||||
<key>subtext</key>
|
|
||||||
<string>Generates a secure password with <n> length</string>
|
|
||||||
<key>title</key>
|
|
||||||
<string>Password Generator</string>
|
|
||||||
<key>type</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>withspace</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
<key>type</key>
|
|
||||||
<string>alfred.workflow.input.scriptfilter</string>
|
|
||||||
<key>uid</key>
|
|
||||||
<string>F8CBCF9B-3B33-400E-B6AD-6B8500938BA4</string>
|
|
||||||
<key>version</key>
|
|
||||||
<integer>2</integer>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>readme</key>
|
|
||||||
<string></string>
|
|
||||||
<key>uidata</key>
|
|
||||||
<dict>
|
|
||||||
<key>F417810A-4CC7-4844-9B6E-DA2D6B40543C</key>
|
|
||||||
<dict>
|
|
||||||
<key>xpos</key>
|
|
||||||
<integer>700</integer>
|
|
||||||
<key>ypos</key>
|
|
||||||
<real>170</real>
|
|
||||||
</dict>
|
|
||||||
<key>F8CBCF9B-3B33-400E-B6AD-6B8500938BA4</key>
|
|
||||||
<dict>
|
|
||||||
<key>xpos</key>
|
|
||||||
<integer>300</integer>
|
|
||||||
<key>ypos</key>
|
|
||||||
<real>170</real>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
|
||||||
<key>webaddress</key>
|
|
||||||
<string>https://github.com/Luzifer/password</string>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
|
@ -1 +0,0 @@
|
||||||
Subproject commit 183a2326cfe4fa11af3c1cd186579a35cef1792b
|
|
|
@ -1,34 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
set -euxo pipefail
|
|
||||||
|
|
||||||
# Check for a publishable version
|
|
||||||
VERSION=$(git describe --tags --exact-match || echo "notag")
|
|
||||||
|
|
||||||
# Collect assets to pack
|
|
||||||
mkdir -p dist
|
|
||||||
unzip ./.build/password_darwin_amd64.zip -d dist
|
|
||||||
cp -r \
|
|
||||||
alfred-workflow/exec.py \
|
|
||||||
alfred-workflow/icon.png \
|
|
||||||
alfred-workflow/info.plist \
|
|
||||||
alfred-workflow/lib/workflow \
|
|
||||||
dist
|
|
||||||
|
|
||||||
# In order to have a valid version number on no tags for testing
|
|
||||||
git describe --tags >dist/version
|
|
||||||
|
|
||||||
# Create ZIP
|
|
||||||
cd dist
|
|
||||||
zip -r -9 ../PasswordGenerator.alfredworkflow *
|
|
||||||
cd -
|
|
||||||
|
|
||||||
# If there is no version tag the artifact is not to be published
|
|
||||||
if (test "${VERSION}" == "notag"); then
|
|
||||||
echo "No exact tag found, no publishing required."
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Upload to Github releases
|
|
||||||
github-release upload --user luzifer --repo password --tag ${VERSION} \
|
|
||||||
--name PasswordGenerator.alfredworkflow \
|
|
||||||
--file PasswordGenerator.alfredworkflow
|
|
|
@ -20193,60 +20193,60 @@ func bindataFrontendAssetsFfcc050b2d92d4b14a4fcb527ee0bcc8woff() (*asset, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
var _bindataFrontendIndexhtml = []byte(
|
var _bindataFrontendIndexhtml = []byte(
|
||||||
"\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xbc\x58\xef\x8e\xdb\xb8\x11\xff\x9e\xa7\x98\x53\x50\xf4\xcb\xc9\x4a\x2e" +
|
"\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xbc\x58\xdb\x8e\xdc\xb8\x11\x7d\xf7\x57\xd4\xca\x08\xf2\xb2\x6a\xd9\x6b" +
|
||||||
"\xc1\xe1\x9a\x4a\x2e\x82\xcd\xb5\xd9\x36\x87\xa4\xd8\x14\x68\x3e\x15\x23\x71\x24\x31\xa6\x48\x81\x1c\xda\xeb\xbe" +
|
"\x63\xb1\x71\xa4\x0e\x8c\x71\x12\x4f\xe2\x85\x1d\x8c\x03\xc4\x4f\x41\x49\xac\x96\xe8\xa6\x48\x81\x2c\x76\x4f\xe7" +
|
||||||
"\x48\x1f\xa8\x2f\x56\x90\x92\xbc\x96\x2d\xdf\x7a\x0f\x45\xf6\x8b\xb9\xe4\x8f\xe4\xfc\xfb\xcd\x0c\x95\x7f\xf7\xee" +
|
"\x47\xf2\x41\xf9\xb1\x80\xd4\x65\xa4\x6e\x4d\xa6\xbd\x08\xd6\x2f\x23\x93\x87\x64\x5d\x4e\x1d\x16\x3b\xff\xee\xdd" +
|
||||||
"\xe3\xcd\xe7\x2f\x9f\x7e\x86\x96\x3b\xb5\x7e\x96\x87\x1f\x50\xa8\x9b\x22\x21\x9d\xac\x9f\x01\xe4\x2d\xa1\x08\x03" +
|
"\xc7\x9b\xcf\x5f\x3e\xfd\x11\x1a\x6e\xd5\xf6\x59\x1e\xfe\x80\x42\x5d\x17\x09\xe9\x64\xfb\x0c\x20\x6f\x08\x45\xf8" +
|
||||||
"\x80\xbc\x23\x46\xa8\x5a\xb4\x8e\xb8\x48\x3c\xd7\xe9\x4f\xc9\xf1\x92\xc6\x8e\x8a\x64\x2b\x69\xd7\x1b\xcb\x09\x54" +
|
"\x00\xc8\x5b\x62\x84\xaa\x41\xeb\x88\x8b\xc4\xf3\x2e\xfd\x29\x99\x4f\x69\x6c\xa9\x48\x0e\x92\x8e\x9d\xb1\x9c\x40" +
|
||||||
"\x46\x33\x69\x2e\x92\x9d\x14\xdc\x16\x82\xb6\xb2\xa2\x34\xfe\xf3\x3d\x48\x2d\x59\xa2\x4a\x5d\x85\x8a\x8a\x97\xdf" +
|
"\x65\x34\x93\xe6\x22\x39\x4a\xc1\x4d\x21\xe8\x20\x2b\x4a\xe3\x7f\xbe\x07\xa9\x25\x4b\x54\xa9\xab\x50\x51\xf1\xf2" +
|
||||||
"\x83\x6b\xad\xd4\x9b\x94\x4d\x5a\x4b\x2e\xb4\x99\x8e\x66\xc9\x8a\xd6\x77\x54\x79\x4b\xf0\x09\x9d\xdb\x19\x2b\xf2" +
|
"\x7b\x70\x8d\x95\x7a\x9f\xb2\x49\x77\x92\x0b\x6d\xc6\xad\x59\xb2\xa2\xed\x1d\x55\xde\x12\x7c\x42\xe7\x8e\xc6\x8a" +
|
||||||
"\x6c\x98\x7e\x36\x60\xbe\x4b\x53\xf8\x60\x50\x00\xf6\x3d\xb8\xca\xca\x9e\x81\xd0\xaa\x3d\xb0\x81\xde\xd2\x96\x34" +
|
"\x3c\xeb\x87\x9f\xf5\x98\xef\xd2\x14\x3e\x18\x14\x80\x5d\x07\xae\xb2\xb2\x63\x20\xb4\xea\x04\x6c\xa0\xb3\x74\x20" +
|
||||||
"\x43\xa9\x50\x6f\xe0\xfd\xe7\x5f\x3e\xc0\x4e\x72\x6b\x3c\x83\xe3\xbd\x92\xba\x81\x34\x1d\x2f\x1b\xf7\x3a\x5b\x15" +
|
"\xcd\x50\x2a\xd4\x7b\x78\xff\xf9\xe7\x0f\x70\x94\xdc\x18\xcf\xe0\xf8\xa4\xa4\xae\x21\x4d\x87\xc3\x86\xb5\xce\x56" +
|
||||||
"\x09\x3a\x47\xec\xb2\xd2\x6b\xa1\x68\xf5\xd5\x25\xeb\x3c\x1b\xd6\xa3\x61\xb2\xc9\x32\x79\x69\xc4\x7e\xdc\xaf\x71" +
|
"\x45\x82\xce\x11\xbb\xac\xf4\x5a\x28\xda\x7c\x75\xc9\x36\xcf\xfa\xf9\x18\x98\x6c\x8c\x4c\x5e\x1a\x71\x1a\xd6\x6b" +
|
||||||
"\x0b\x95\x42\xe7\x8a\x44\xe3\xb6\x44\x0b\xc3\x4f\x4a\xf7\x3d\x6a\x91\xaa\x66\x9a\x50\xb2\x69\x19\xca\x66\x18\x8c" +
|
"\x3c\x40\xa5\xd0\xb9\x22\xd1\x78\x28\xd1\x42\xff\x27\xa5\xfb\x0e\xb5\x48\x55\x3d\x0e\x28\x59\x37\x0c\x65\xdd\x7f" +
|
||||||
"\xca\x02\xe4\x38\xdf\x9f\x96\x16\xb5\x48\xa0\xb5\x54\x17\xc9\xf3\xe4\xdc\x10\x78\xd8\x5a\x7a\x66\xa3\x4f\xf6\xb3" +
|
"\x0c\xce\x02\xe4\xb8\x5c\x9f\x96\x16\xb5\x48\xa0\xb1\xb4\x2b\x92\xe7\xc9\x65\x20\x70\x5a\x5a\x7a\x66\xa3\xcf\xd6" +
|
||||||
"\x69\x1a\x45\x36\x01\xde\xf7\x54\x24\x03\x26\x01\x81\x8c\xe3\x5a\x91\x54\x46\x29\xec\x1d\x4d\xd3\x68\x9b\xe0\xe1" +
|
"\xb3\xa9\x6b\x45\x36\x01\x3e\x75\x54\x24\x3d\x26\x01\x81\x8c\xc3\x5c\x91\x54\x46\x29\xec\x1c\x8d\xc3\x68\xeb\x90" +
|
||||||
"\xe7\xc3\x11\x77\xbe\x0f\xfe\x24\x71\x33\xf8\x33\x01\xb4\x12\xd3\xe0\x5d\x6b\xd4\xe1\xa6\x0b\xb0\x41\x71\x12\x45" +
|
"\xe1\xe7\xfd\x16\x77\xbe\x0b\xf9\x24\x71\xd3\xe7\x33\x01\xb4\x12\xd3\x90\x5d\x6b\xd4\x74\xd2\x23\xb0\xde\x71\x12" +
|
||||||
"\x52\xa3\x0a\x57\xc4\x59\x85\x25\xa9\x22\xf9\x1c\x05\x08\x26\x91\x0d\xb2\x34\xfa\x60\x87\xe0\x8b\x1e\x2f\x28\x93" +
|
"\x45\xb2\x43\x15\x8e\x88\xa3\x0a\x4b\x52\x45\xf2\x39\x1a\x10\x42\x22\x6b\x64\x69\xf4\x14\x87\x90\x8b\x0e\x1f\x71" +
|
||||||
"\xca\x2a\x40\xf3\x2c\x40\x0e\xea\x67\x83\x6e\x63\x4c\x00\xe4\x42\x1e\x9c\x31\x69\x38\x59\xff\x41\x63\x29\x2e\x2a" +
|
"\x26\x95\x55\x80\xe6\x59\x80\x4c\xee\x67\xbd\x6f\x03\x27\x00\x72\x21\xa7\x64\x8c\x1e\x8e\xd1\x7f\xf0\x58\x8a\x47" +
|
||||||
"\x70\x24\x8b\x57\x27\x92\x04\x47\x77\x36\x45\xcf\xe6\x08\x07\x90\x2b\x79\x84\x4c\x25\x53\x37\x5b\x3f\xf1\x70\xaa" +
|
"\x1d\x98\xd9\xe2\xd5\x99\x25\x21\xd1\xad\x4d\xd1\xb3\x99\xe1\x00\x72\x25\x67\xc8\x54\x32\xb5\x8b\xf9\xb3\x0c\xa7" +
|
||||||
"\xa4\xde\x4c\xde\x6d\x99\x7b\xf7\x26\xcb\x1a\xc9\xad\x2f\x57\x95\xe9\xb2\x0f\xfe\xdf\xb2\x26\x9b\xf5\xa3\xbb\x9f" +
|
"\x4a\xea\xfd\x98\xdd\x86\xb9\x73\x6f\xb2\xac\x96\xdc\xf8\x72\x53\x99\x36\xfb\xe0\xff\x25\x77\x64\xb3\x6e\x48\xf7" +
|
||||||
"\x6f\x25\xa6\xa8\x6a\x4b\x22\x59\xbf\x8d\xbf\xf0\xf3\x3d\x93\x76\xd2\xe8\xa3\x58\x18\x0c\xa2\xe4\x37\x17\xad\x97" +
|
"\xf3\x83\xc4\x14\x3b\x99\x6c\xdf\x7e\xba\x85\x77\xa6\xf2\x2d\x69\x8e\xa1\x9b\x31\xa1\x0f\x87\x92\x33\x07\x32\xaf" +
|
||||||
"\xc9\xfa\xed\xa7\x5b\x78\x67\x2a\xdf\x91\xe6\xe8\xd5\x5f\x15\x2c\xcf\xbc\x3a\xf8\xec\x82\xa9\x9f\x6a\xe2\x91\x09" +
|
"\xa6\xc0\x3c\xe2\xcf\xb7\xfa\x31\xd0\x6d\xc9\xab\x61\x4d\xc9\x1a\x4a\xd6\xa9\xa0\x1d\x7a\xc5\x63\xd8\x4b\x3e\xa7" +
|
||||||
"\xf3\x90\x1f\xf7\x94\xac\xa1\x64\x9d\x0a\xaa\xd1\x2b\x9e\x22\xa2\xe4\x53\x56\x74\x46\xa0\x3a\xa5\x84\x23\x66\xa9" +
|
"\x5e\x6b\x04\xaa\x73\xde\x39\x62\x96\xba\x76\x3f\xc7\xc9\xe5\xb1\x00\xf9\x64\xd9\x0e\x1d\xec\x02\x13\xeb\x81\x56" +
|
||||||
"\x1b\xf7\x4b\x5c\x9c\x5f\x0b\x90\x1f\x24\xab\xd1\x41\x1d\x48\xd2\x8c\x11\xdf\x4a\x21\x48\x17\x09\x5b\x4f\x21\x74" +
|
"\x8d\x14\x82\x74\x91\xb0\xf5\x14\xf8\x21\xb7\x70\x37\xec\xb5\xb4\x7d\xe2\xca\xff\x0e\xd8\xf8\x2d\xe4\x61\x28\xf0" +
|
||||||
"\xe5\x1a\xee\xc6\xb3\xe6\xb2\x1f\xc2\xf8\xd7\x0d\x36\x8d\x85\xdc\x8e\xb9\x27\xd3\xb8\x9d\x12\xe2\x2c\xf4\x35\xa3" +
|
"\x4c\xe3\x61\x54\x9d\x05\xbf\x34\xa3\xd4\x64\xa1\xe5\xf4\xf5\x43\x35\xcf\x20\xd6\x1c\xe1\xab\x77\x2c\x77\xa7\x74" +
|
||||||
"\xd4\x64\xa1\xe3\xf4\xf5\x43\xa2\x39\x82\x58\xb3\x83\xaf\xde\xb1\xac\xf7\xe9\x98\xb4\xd3\x4e\xa4\x15\x69\x26\x7b" +
|
"\x50\xc6\xb4\x15\x69\x45\x9a\xc9\xce\xb9\xb6\xa4\x6d\x7a\xef\xd2\x97\x3f\x40\xf8\x72\x6d\xfa\x53\xfc\x68\x45\xfa" +
|
||||||
"\x4c\x83\x39\xa3\xd2\x7b\x97\xbe\xfc\x01\xc2\xc8\x75\xe9\x4f\x71\xd0\x89\xf4\xc7\xe4\xc8\x9d\xf3\x4d\x5f\x7d\x57" +
|
"\x63\x32\x4b\xe7\x72\xd1\x57\xdf\x96\x86\xed\xa2\x98\x22\xa6\x1b\x11\x8a\x50\xc0\xc5\xc1\xfd\xbf\x5b\x38\x4a\xa5" +
|
||||||
"\x1a\xb6\x33\x9e\x47\x4c\x3f\x21\x14\xa1\x80\xb3\x8b\x87\xbf\x5b\xd8\x49\xa5\xa0\x21\x4d\x16\x99\x00\x41\xd3\x0e" +
|
"\xa0\x26\x4d\x16\x99\x00\x41\xd3\x11\x5c\xaf\x3a\x23\x0d\x81\x0e\x64\x4f\xf0\xea\x45\x98\x30\x5a\xb8\x0d\xfc\xc5" +
|
||||||
"\xdc\x90\x10\xa7\x30\x04\xda\x92\xdd\xc3\xab\x17\x61\xc1\x68\xe1\x56\xf0\x57\xef\x18\x2a\x25\xab\x0d\x70\x7b\x84" +
|
"\x3b\x86\x4a\xc9\x6a\x0f\xdc\xcc\x90\x6c\x60\x4f\xd4\xc5\xc1\xca\x5b\x1b\x94\xd8\x68\xda\xc0\x59\x42\xba\x65\x2e" +
|
||||||
"\x64\x03\x1b\xa2\x3e\x4e\x56\xde\xda\x50\x24\x8c\xa6\x15\x9c\x38\xa4\x9f\xfb\x22\x5a\xfc\x82\x82\x15\x5a\x01\x5d" +
|
"\x62\xc4\x1f\x71\xb0\x42\x2b\xa0\x2d\xd3\x57\xe7\x0e\x9e\x61\xd2\xa0\xd0\x2b\x2e\x7e\x31\xde\x4e\x06\x9e\x99\x31" +
|
||||||
"\x99\xbe\x3a\x55\xf0\x04\x93\x86\xe2\xb1\xa0\xe2\x17\xe3\xed\x41\xc0\x13\x31\x0e\x9e\xbe\x78\x68\x28\x44\xe7\x31" +
|
"\x65\xfa\xd1\x4d\x83\xda\x5f\x72\x72\x86\xda\x19\xdb\xa6\xb5\x35\xbe\xbb\x80\x05\xf2\xea\xce\xf3\x02\x3a\x08\xe9" +
|
||||||
"\x79\x84\xaa\x8d\xed\xd2\xc6\x1a\xdf\x9f\xc1\x42\xf0\xea\xde\xf3\x0c\x3a\xe6\xf8\xc9\x21\x31\x59\xd6\xa6\xf2\x8e" +
|
"\x98\x90\xa8\x48\x3b\x53\x79\x47\xe2\x36\x80\x47\xe9\x66\xba\xe7\x04\x0e\xa8\x3c\x15\xc9\x66\xb3\xb9\x34\x62\xc5" +
|
||||||
"\xc4\x6d\x00\x4f\x55\x85\xe9\x9e\x13\xd8\xa2\xf2\x54\x24\xab\xd5\xea\x5c\x88\x05\xe9\xaf\x50\xa8\x36\x66\x29\x10" +
|
"\xfa\x2b\x1c\xda\x19\xb3\x46\x84\x39\xae\xb3\xa6\xb6\xe4\xdc\x9a\x43\x2b\xb0\xb4\x44\x9b\xc4\xcb\x95\x86\xcb\xff" +
|
||||||
"\x8e\x71\xbd\x35\x8d\x25\xe7\x96\x14\x5a\x80\xa5\x25\xda\x24\xd6\x7d\x1a\xfb\x92\x37\xf0\xf2\xc5\x8b\xdf\xfd\x31" +
|
"\x0d\xbc\x7c\xf1\xe2\x37\xbf\x0f\x35\x79\x61\xd0\x75\x86\x3f\x4d\x89\x5f\xc8\x86\x3f\xbd\xfd\xdb\xff\x89\x03\x0f" +
|
||||||
"\x70\xf2\x4c\xa0\xeb\x04\x7f\x3c\x24\x7e\x63\x34\xfc\xf9\xed\xdf\xff\x4f\x31\xf0\x90\x31\x8e\x26\x95\x5c\xe7\x2e" +
|
"\x8a\x31\x1b\x54\x72\x9b\xbb\x50\x8d\xf5\xf6\x9d\x81\x93\xf1\xe0\xd8\x58\x82\xf6\x34\x51\xf0\x0f\x79\x36\x20\xf2" +
|
||||||
"\xb0\xb1\x59\xbf\x33\xb0\x37\x1e\x1c\x1b\x4b\xd0\xed\x0f\x21\xf8\xa7\x3c\x1b\x11\x79\x69\xcf\x8f\xf8\x62\x3c\x08" +
|
"\xd2\x5e\x6e\xf1\xc5\x78\x10\x54\x49\x41\x70\x6c\x64\xd5\x84\xf2\x09\x65\xc5\xb8\x27\x40\x2d\xe0\x48\x7d\xcd\x6a" +
|
||||||
"\xaa\xa4\x20\xd8\xb5\xb2\x6a\x03\x7d\x02\xad\x18\x37\x04\xa8\x05\xec\x68\xe0\xac\x36\x3c\x1e\x8e\x7a\x0f\xa6\x8e" +
|
"\xc3\xc3\xe6\xa8\x4f\x60\x76\xb1\xe6\xc6\x42\x16\xd3\x71\x6e\x03\x9f\x1b\x64\x38\xe2\x29\xda\x53\xa1\x86\x92\xc0" +
|
||||||
"\x9c\x9b\x88\x2c\x0e\xd7\xb9\x15\x7c\x6e\x91\x61\x87\xfb\x28\x4f\x85\x1a\x4a\x02\x17\x08\x6e\xb4\x1a\x26\x37\xda" +
|
"\x85\x02\x37\x5a\xf5\x83\x7b\x6d\x8e\xc3\x71\x53\x29\x47\x70\x63\x1c\x6d\x2e\xdd\x5c\x88\xe7\x9a\xf3\xef\xcd\xa4" +
|
||||||
"\xec\xc6\xeb\x0e\x54\x8e\xe0\xd6\x38\x5a\x9d\xab\x79\x52\x06\xcf\x95\x7f\x6f\x0e\x59\x04\x2d\x05\xd1\xdc\x43\x96" +
|
"\x22\x68\x29\x98\xe6\x1e\x54\xc2\x3d\x11\x82\xb7\x4a\x3d\x60\xe3\xfa\xaa\xa1\x6a\x4f\x02\xb0\x46\xa9\x1d\x03\x82" +
|
||||||
"\x70\x8f\x98\xe0\xad\x52\x0f\xd8\xb8\xbf\x6a\xa9\xda\x90\x00\x6c\x50\x6a\xc7\x80\xe0\x88\x83\xce\xd6\x2b\x72\xc1" +
|
"\x23\x0e\x3e\x5b\xaf\xc8\x85\xf0\x90\x8e\x1e\x71\x43\x27\x10\x86\x5c\x0c\xcf\xa0\xd3\xd0\x21\x33\x59\xed\x06\x17" +
|
||||||
"\x3c\xa4\xa3\x46\xdc\xd2\x1e\x84\x21\x17\xcd\x33\xe6\x69\xe8\x91\x99\xac\x76\xa3\x8a\x3b\xe3\x95\x80\x2e\x18\x54" +
|
"\x8f\xc6\x2b\x01\x6d\x08\xa8\x0c\x9d\xa3\x3b\xc1\xce\x58\x88\x7c\xc6\x36\x6e\x57\x7b\x72\x6e\x21\x6d\xbf\x24\x0a" +
|
||||||
"\x86\xa6\xd6\xed\xa1\x36\x16\x62\x3c\x63\x17\x8f\x6b\x3c\x39\x37\x4b\x6d\xbf\xc5\x0a\x37\xa8\xe1\x16\x6c\xc8\xbf" +
|
"\x37\xa8\xe1\x16\x6c\xd0\xdf\xb0\x95\x33\xde\x56\x04\x95\x11\xf4\x44\x04\x3e\xee\xa0\x32\xde\x3a\x1a\x53\xb6\x81" +
|
||||||
"\xe1\x28\x67\xbc\xad\x08\x2a\x23\xe8\x11\x0b\x7c\xac\xa1\x32\xde\x3a\x9a\x5c\xb6\x82\x5b\xfe\xbd\x83\xde\x97\x4a" +
|
"\x5b\xfe\xad\x83\xce\x97\x4a\xba\x86\x04\x18\x1d\x5a\x8b\xab\x3b\x89\x64\xfb\x67\xc9\xef\x7d\x19\xda\x06\x60\x53" +
|
||||||
"\xba\x96\x04\x18\x1d\x5a\x8b\xab\x3b\x89\x64\xfd\x17\xc9\xef\x7d\x19\xda\x06\x60\xd3\x10\xb7\x64\x63\xcf\x0e\x08" +
|
"\x13\x37\x64\x63\x63\x0c\x08\x4c\x8e\xc1\x79\xc9\xb4\x8c\xe4\x59\x12\x1c\xee\xae\xe4\xc2\xfc\x3a\x1d\x47\x9e\x28" +
|
||||||
"\x4c\x8e\xc1\x79\xc9\x34\xb7\xe4\x89\x13\x1c\xd6\x57\xc6\xc2\x71\x39\x9d\x66\x1e\x21\xf8\x0c\x30\x2b\xc1\x0f\xb8" +
|
"\xf0\x05\x60\x71\x05\x3f\xe0\xe6\x85\x39\x74\x12\x41\x3d\x97\xfd\x03\x58\x13\x74\x48\x48\x54\xa6\x5e\xbd\x9a\xe3" +
|
||||||
"\x63\x62\x8e\x9d\x44\xc8\x9e\xf3\xfe\x01\xac\x09\x79\x48\x48\x54\xa6\x59\x2c\xcd\x71\x6b\x3a\x02\x26\xf8\xd8\x5b" +
|
"\xd2\x74\x00\x8c\xf0\xa1\xb7\x7a\xe4\x66\xee\x97\x54\x17\x9d\xe2\x1a\x6a\x55\x78\xf2\xe6\xf5\x12\x15\x1f\x34\xa1" +
|
||||||
"\x5d\xa8\xcc\xc3\x96\xea\xac\x89\x5d\x42\x2d\x26\x9e\xbc\x7d\x3d\x47\xc5\xb7\x56\x78\x7a\x0c\xb2\xe7\x59\xfb\xfa" +
|
"\xbf\xef\x6d\xcf\xb3\xe6\xf5\x37\x34\x5c\x95\x32\x53\xff\x2e\xa4\x6b\xe5\x2c\x24\x2b\xad\xd1\x7f\xfe\xbd\xde\x02" +
|
||||||
"\x09\x0d\x57\xa5\xcc\xe1\x69\x21\xa4\xeb\xe4\x91\x49\x16\x5a\xa3\xff\xfe\x67\xb9\x05\x3a\xf5\xc9\x99\x2e\x0b\x99" +
|
"\x9d\xe7\xe4\xc2\x97\x15\xe5\xbb\xf2\xee\xcb\x63\xcf\x1f\xea\xaa\x48\x46\x1a\x7d\x20\x5d\x73\xf3\xb1\x8b\xad\xff" +
|
||||||
"\xef\xca\xda\x97\xc7\xe7\x48\xe0\x55\x91\x4c\x61\xf4\x81\x74\xc3\xed\xc7\x3e\xbe\x4a\x8e\x7b\x29\x6b\xd4\xf0\x7c" +
|
"\xbc\x97\xb2\x46\xf5\x6f\x84\x64\x3b\xbe\x74\x40\x45\xf0\x9b\x3c\x8b\x13\x97\x5d\x61\xbc\x58\xfb\xe0\x68\xdf\x96" +
|
||||||
"\x49\xd6\xd3\x23\x0c\x54\x04\xbf\xc9\xb3\xb8\x70\xde\x15\xc6\xc2\x3a\x18\x47\xfb\xae\x0c\xa5\x74\xa1\xcc\x1e\x2a" +
|
"\xe1\x2a\x5d\xb9\x66\xa7\x1b\xf4\x87\x17\x3d\x59\x56\x6d\xf9\xa6\x5b\xf4\x49\xa7\x1f\x6d\x03\x7a\x6b\xa3\x96\x95" +
|
||||||
"\xe8\x0f\x2f\x86\x60\x59\x94\xe5\x49\x55\xf4\x51\xa5\x2f\xb6\x01\x83\xb4\x31\x97\x95\xe6\x7e\x90\xc7\x3b\xba\xeb" +
|
"\xe6\xbe\xb7\xc7\x3b\xba\xeb\xa8\x92\xa8\x46\x5b\xe0\xef\x8e\xc0\xf5\x63\xf1\xfd\x8d\x15\x93\x75\x17\x25\xb6\x72" +
|
||||||
"\xa9\x92\xa8\x26\x59\xe0\x1f\x8e\xc0\x0d\x73\xf1\xd3\x00\x56\x4c\xd6\x9d\x51\x6c\xe1\xae\x6f\x2d\xf9\x3f\xff\x76" +
|
"\xd6\xaf\x6d\xf9\x3f\xfe\x7a\xf3\x6e\x61\xf6\x85\x24\xdd\xef\x2b\x11\x05\xe9\x77\xaf\x7e\xcc\x12\x18\x7b\xfe\x7f" +
|
||||||
"\xf3\x6e\x26\xf6\x59\x4a\xba\xdf\x54\x22\x26\xa4\x3f\xbc\xfa\x31\x4b\x60\xea\xf9\xff\x15\x3f\x1c\x24\xeb\x70\xc0" +
|
"\xc6\xd7\x79\xb2\x0d\x1b\xf4\x9d\xc3\x83\xd6\x9c\xbd\x6c\xae\x77\xf6\x0a\x3e\xaf\x36\x3f\xdf\xf2\xb4\x59\xaf\xb9" +
|
||||||
"\xd0\x39\x3c\xe4\x9a\x93\x97\xcd\xf5\xca\x5e\x11\xcf\x8b\xcd\xcf\x53\x9e\x36\xcb\x9c\x5b\xdf\x04\x3e\x2e\x71\xec" +
|
"\xed\x4d\xa8\xc7\xb5\x1a\xbb\x72\xf7\xce\xca\x16\xed\xa9\x0f\xac\x89\x11\xbd\xc3\x43\xd0\x07\x3c\x84\xdb\x0f\x75" +
|
||||||
"\xca\xd3\x7b\x2b\x3b\xb4\xfb\xc1\xb0\x26\x5a\xf4\x0e\xb7\x21\x3f\xe0\x36\x54\x3f\xd4\x0d\xb9\x2b\x38\xfc\x78\x16" +
|
"\x4d\xee\x8a\x1a\x7e\x5a\x45\xf3\xac\xff\xfd\x22\xcf\xfa\x1f\x81\xfe\x1b\x00\x00\xff\xff\x46\x6e\x97\x23\x15\x12" +
|
||||||
"\xcd\xb3\xe1\xd3\x4a\x9e\x0d\xdf\xa7\xfe\x17\x00\x00\xff\xff\xf5\xdc\xbb\xb3\xb0\x12\x00\x00")
|
"\x00\x00")
|
||||||
|
|
||||||
func bindataFrontendIndexhtmlBytes() ([]byte, error) {
|
func bindataFrontendIndexhtmlBytes() ([]byte, error) {
|
||||||
return bindataRead(
|
return bindataRead(
|
||||||
|
@ -20265,7 +20265,7 @@ func bindataFrontendIndexhtml() (*asset, error) {
|
||||||
|
|
||||||
info := bindataFileInfo{
|
info := bindataFileInfo{
|
||||||
name: "frontend/index.html",
|
name: "frontend/index.html",
|
||||||
size: 4784,
|
size: 4629,
|
||||||
md5checksum: "",
|
md5checksum: "",
|
||||||
mode: os.FileMode(420),
|
mode: os.FileMode(420),
|
||||||
modTime: time.Unix(1, 0),
|
modTime: time.Unix(1, 0),
|
14
cmd/password/go.mod
Normal file
14
cmd/password/go.mod
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
module github.com/Luzifer/password/cmd/password
|
||||||
|
|
||||||
|
go 1.12
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/Luzifer/go_helpers v2.8.1+incompatible
|
||||||
|
github.com/Luzifer/password v1.13.1
|
||||||
|
github.com/gorilla/mux v1.7.0
|
||||||
|
github.com/pkg/errors v0.8.1 // indirect
|
||||||
|
github.com/spf13/cobra v0.0.3
|
||||||
|
github.com/spf13/pflag v1.0.3 // indirect
|
||||||
|
github.com/tredoe/osutil v0.0.0-20161130133508-7d3ee1afa71c // indirect
|
||||||
|
golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25 // indirect
|
||||||
|
)
|
17
cmd/password/go.sum
Normal file
17
cmd/password/go.sum
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
github.com/Luzifer/go_helpers v2.8.1+incompatible h1:9YvrAn7pU2viK5vRpAnI+0gyz+Tw8rxWHVIYHi642zk=
|
||||||
|
github.com/Luzifer/go_helpers v2.8.1+incompatible/go.mod h1:5yUSe0FS7lIx1Uzmt0R3tdPFrSSaPfiCqaIA6u0Zn4Y=
|
||||||
|
github.com/Luzifer/password v1.13.1 h1:peyCOEtIF7bmApaKM9ahJ4+BbN9ZZgzj+19A7aO6988=
|
||||||
|
github.com/Luzifer/password v1.13.1/go.mod h1:F8bbXgwczd/1vyyJ9G8Z6hPvaqtpKR9VZM0E7jkZKJc=
|
||||||
|
github.com/gorilla/mux v1.7.0 h1:tOSd0UKHQd6urX6ApfOn4XdBMY6Sh1MfxV3kmaazO+U=
|
||||||
|
github.com/gorilla/mux v1.7.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||||
|
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
||||||
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/spf13/cobra v0.0.3 h1:ZlrZ4XsMRm04Fr5pSFxBgfND2EBVa1nLpiy1stUsX/8=
|
||||||
|
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
||||||
|
github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
|
||||||
|
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||||
|
github.com/tredoe/osutil v0.0.0-20161130133508-7d3ee1afa71c h1:5q7IHeqvAA4hWR1CfpTOS7RFsTDC36TaSZ8Dvc00bPk=
|
||||||
|
github.com/tredoe/osutil v0.0.0-20161130133508-7d3ee1afa71c/go.mod h1:M/I710pXKQToMdqt/D+mJ4QsnW6WDaajyB6DWFmDXBs=
|
||||||
|
golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25 h1:jsG6UpNLt9iAsb0S2AGW28DveNzzgmbXR+ENoPjUeIU=
|
||||||
|
golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
@ -17,9 +17,6 @@
|
||||||
|
|
||||||
<div class="collapse navbar-collapse" id="navbarSupportedContent">
|
<div class="collapse navbar-collapse" id="navbarSupportedContent">
|
||||||
<ul class="navbar-nav mr-auto">
|
<ul class="navbar-nav mr-auto">
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" href="https://github.com/Luzifer/password#via-alfred">Alfred Extension</a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="https://github.com/Luzifer/password#via-api">API Documentation</a>
|
<a class="nav-link" href="https://github.com/Luzifer/password#via-api">API Documentation</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
version="8744120d"
|
version="19af63af"
|
||||||
source="https://raw.githubusercontent.com/leonardr/olipy/${version}/data/more-corpora/scribblenauts_words.txt"
|
source="https://raw.githubusercontent.com/leonardr/olipy/${version}/olipy/data/corpora-olipy/words/scribblenauts.json"
|
||||||
|
|
||||||
words=$(curl -sL "${source}" | awk '/^[a-z]{4}[a-z]*$/{ print "\""$1"\"," }')
|
words=$(curl -sL "${source}" | jq -r '.nouns | .[]' | sort | awk '/^[a-z]{4}[a-z]*$/{ print "\""$1"\"," }')
|
||||||
|
|
||||||
cat -s <<EOF >lib/xkcd_words.go
|
cat -s <<EOF >lib/xkcd_words.go
|
||||||
package securepassword
|
package securepassword
|
||||||
|
|
8
lib/go.mod
Normal file
8
lib/go.mod
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
module github.com/Luzifer/password/lib/v2
|
||||||
|
|
||||||
|
go 1.12
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/Luzifer/go_helpers/v2 v2.9.0
|
||||||
|
github.com/pkg/errors v0.8.1
|
||||||
|
)
|
|
@ -6,7 +6,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/Luzifer/go_helpers/str"
|
"github.com/Luzifer/go_helpers/v2/str"
|
||||||
)
|
)
|
||||||
|
|
||||||
type XKCD struct{}
|
type XKCD struct{}
|
||||||
|
|
7744
lib/xkcd_words.go
7744
lib/xkcd_words.go
File diff suppressed because it is too large
Load diff
202
vendor/github.com/Luzifer/go_helpers/LICENSE
generated
vendored
202
vendor/github.com/Luzifer/go_helpers/LICENSE
generated
vendored
|
@ -1,202 +0,0 @@
|
||||||
Apache License
|
|
||||||
Version 2.0, January 2004
|
|
||||||
http://www.apache.org/licenses/
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction,
|
|
||||||
and distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by
|
|
||||||
the copyright owner that is granting the License.
|
|
||||||
|
|
||||||
"Legal Entity" shall mean the union of the acting entity and all
|
|
||||||
other entities that control, are controlled by, or are under common
|
|
||||||
control with that entity. For the purposes of this definition,
|
|
||||||
"control" means (i) the power, direct or indirect, to cause the
|
|
||||||
direction or management of such entity, whether by contract or
|
|
||||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity
|
|
||||||
exercising permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications,
|
|
||||||
including but not limited to software source code, documentation
|
|
||||||
source, and configuration files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical
|
|
||||||
transformation or translation of a Source form, including but
|
|
||||||
not limited to compiled object code, generated documentation,
|
|
||||||
and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or
|
|
||||||
Object form, made available under the License, as indicated by a
|
|
||||||
copyright notice that is included in or attached to the work
|
|
||||||
(an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
form, that is based on (or derived from) the Work and for which the
|
|
||||||
editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
of this License, Derivative Works shall not include works that remain
|
|
||||||
separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including
|
|
||||||
the original version of the Work and any modifications or additions
|
|
||||||
to that Work or Derivative Works thereof, that is intentionally
|
|
||||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
||||||
or by an individual or Legal Entity authorized to submit on behalf of
|
|
||||||
the copyright owner. For the purposes of this definition, "submitted"
|
|
||||||
means any form of electronic, verbal, or written communication sent
|
|
||||||
to the Licensor or its representatives, including but not limited to
|
|
||||||
communication on electronic mailing lists, source code control systems,
|
|
||||||
and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
Licensor for the purpose of discussing and improving the Work, but
|
|
||||||
excluding communication that is conspicuously marked or otherwise
|
|
||||||
designated in writing by the copyright owner as "Not a Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
||||||
on behalf of whom a Contribution has been received by Licensor and
|
|
||||||
subsequently incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
publicly display, publicly perform, sublicense, and distribute the
|
|
||||||
Work and such Derivative Works in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor 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, and otherwise transfer the Work,
|
|
||||||
where such license applies only to those patent claims licensable
|
|
||||||
by such Contributor that are necessarily infringed by their
|
|
||||||
Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
with the Work to which such Contribution(s) was submitted. If You
|
|
||||||
institute patent litigation against any entity (including a
|
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
||||||
or a Contribution incorporated within the Work constitutes direct
|
|
||||||
or contributory patent infringement, then any patent licenses
|
|
||||||
granted to You under this License for that Work shall terminate
|
|
||||||
as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution. You may reproduce and distribute copies of the
|
|
||||||
Work or Derivative Works thereof in any medium, with or without
|
|
||||||
modifications, and in Source or Object form, provided that You
|
|
||||||
meet the following conditions:
|
|
||||||
|
|
||||||
(a) You must give any other recipients of the Work or
|
|
||||||
Derivative Works a copy of this License; and
|
|
||||||
|
|
||||||
(b) You must cause any modified files to carry prominent notices
|
|
||||||
stating that You changed the files; and
|
|
||||||
|
|
||||||
(c) You must retain, in the Source form of any Derivative Works
|
|
||||||
that You distribute, all copyright, patent, trademark, and
|
|
||||||
attribution notices from the Source form of the Work,
|
|
||||||
excluding those notices that do not pertain to any part of
|
|
||||||
the Derivative Works; and
|
|
||||||
|
|
||||||
(d) If the Work includes a "NOTICE" text file as part of its
|
|
||||||
distribution, then any Derivative Works that You distribute must
|
|
||||||
include a readable copy of the attribution notices contained
|
|
||||||
within such NOTICE file, excluding those notices that do not
|
|
||||||
pertain to any part of the Derivative Works, in at least one
|
|
||||||
of the following places: within a NOTICE text file distributed
|
|
||||||
as part of the Derivative Works; within the Source form or
|
|
||||||
documentation, if provided along with the Derivative Works; or,
|
|
||||||
within a display generated by the Derivative Works, if and
|
|
||||||
wherever such third-party notices normally appear. The contents
|
|
||||||
of the NOTICE file are for informational purposes only and
|
|
||||||
do not modify the License. You may add Your own attribution
|
|
||||||
notices within Derivative Works that You distribute, alongside
|
|
||||||
or as an addendum to the NOTICE text from the Work, provided
|
|
||||||
that such additional attribution notices cannot be construed
|
|
||||||
as modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and
|
|
||||||
may provide additional or different license terms and conditions
|
|
||||||
for use, reproduction, or distribution of Your modifications, or
|
|
||||||
for any such Derivative Works as a whole, provided Your use,
|
|
||||||
reproduction, and distribution of the Work otherwise complies with
|
|
||||||
the conditions stated in this License.
|
|
||||||
|
|
||||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
||||||
any Contribution intentionally submitted for inclusion in the Work
|
|
||||||
by You to the Licensor shall be under the terms and conditions of
|
|
||||||
this License, without any additional terms or conditions.
|
|
||||||
Notwithstanding the above, nothing herein shall supersede or modify
|
|
||||||
the terms of any separate license agreement you may have executed
|
|
||||||
with Licensor regarding such Contributions.
|
|
||||||
|
|
||||||
6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
except as required for reasonable and customary use in describing the
|
|
||||||
origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
||||||
agreed to in writing, Licensor provides the Work (and each
|
|
||||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
implied, including, without limitation, any warranties or conditions
|
|
||||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
||||||
appropriateness of using or redistributing the Work and assume any
|
|
||||||
risks associated with Your exercise of permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability. In no event and under no legal theory,
|
|
||||||
whether in tort (including negligence), contract, or otherwise,
|
|
||||||
unless required by applicable law (such as deliberate and grossly
|
|
||||||
negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
liable to You for damages, including any direct, indirect, special,
|
|
||||||
incidental, or consequential damages of any character arising as a
|
|
||||||
result of this License or out of the use or inability to use the
|
|
||||||
Work (including but not limited to damages for loss of goodwill,
|
|
||||||
work stoppage, computer failure or malfunction, or any and all
|
|
||||||
other commercial damages or losses), even if such Contributor
|
|
||||||
has been advised of the possibility of such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability. While redistributing
|
|
||||||
the Work or Derivative Works thereof, You may choose to offer,
|
|
||||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
||||||
or other liability obligations and/or rights consistent with this
|
|
||||||
License. However, in accepting such obligations, You may act only
|
|
||||||
on Your own behalf and on Your sole responsibility, not on behalf
|
|
||||||
of any other Contributor, and only if You agree to indemnify,
|
|
||||||
defend, and hold each Contributor harmless for any liability
|
|
||||||
incurred by, or claims asserted against, such Contributor by reason
|
|
||||||
of your accepting any such warranty or additional liability.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
APPENDIX: How to apply the Apache License to your work.
|
|
||||||
|
|
||||||
To apply the Apache License to your work, attach the following
|
|
||||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
||||||
replaced with your own identifying information. (Don't include
|
|
||||||
the brackets!) The text should be enclosed in the appropriate
|
|
||||||
comment syntax for the file format. We also recommend that a
|
|
||||||
file or class name and description of purpose be included on the
|
|
||||||
same "printed page" as the copyright notice for easier
|
|
||||||
identification within third-party archives.
|
|
||||||
|
|
||||||
Copyright 2016- 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.
|
|
||||||
|
|
37
vendor/github.com/Luzifer/go_helpers/accessLogger/accessLogger.go
generated
vendored
37
vendor/github.com/Luzifer/go_helpers/accessLogger/accessLogger.go
generated
vendored
|
@ -1,37 +0,0 @@
|
||||||
package accessLogger
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"net/http"
|
|
||||||
"strconv"
|
|
||||||
)
|
|
||||||
|
|
||||||
type AccessLogResponseWriter struct {
|
|
||||||
StatusCode int
|
|
||||||
Size int
|
|
||||||
|
|
||||||
http.ResponseWriter
|
|
||||||
}
|
|
||||||
|
|
||||||
func New(res http.ResponseWriter) *AccessLogResponseWriter {
|
|
||||||
return &AccessLogResponseWriter{
|
|
||||||
StatusCode: 200,
|
|
||||||
Size: 0,
|
|
||||||
ResponseWriter: res,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *AccessLogResponseWriter) Write(out []byte) (int, error) {
|
|
||||||
s, err := a.ResponseWriter.Write(out)
|
|
||||||
a.Size += s
|
|
||||||
return s, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *AccessLogResponseWriter) WriteHeader(code int) {
|
|
||||||
a.StatusCode = code
|
|
||||||
a.ResponseWriter.WriteHeader(code)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *AccessLogResponseWriter) HTTPResponseType() string {
|
|
||||||
return fmt.Sprintf("%cxx", strconv.FormatInt(int64(a.StatusCode), 10)[0])
|
|
||||||
}
|
|
55
vendor/github.com/Luzifer/go_helpers/http/digest.go
generated
vendored
55
vendor/github.com/Luzifer/go_helpers/http/digest.go
generated
vendored
|
@ -1,55 +0,0 @@
|
||||||
package http
|
|
||||||
|
|
||||||
import (
|
|
||||||
"crypto/md5"
|
|
||||||
"crypto/rand"
|
|
||||||
"encoding/hex"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"net/http"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/Luzifer/go_helpers/str"
|
|
||||||
)
|
|
||||||
|
|
||||||
func GetDigestAuth(resp *http.Response, method, requestPath, user, password string) string {
|
|
||||||
params := map[string]string{}
|
|
||||||
for _, part := range strings.Split(resp.Header.Get("Www-Authenticate"), " ") {
|
|
||||||
if !strings.Contains(part, `="`) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
spl := strings.Split(strings.Trim(part, " ,"), "=")
|
|
||||||
if !str.StringInSlice(spl[0], []string{"nonce", "realm", "qop"}) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
params[spl[0]] = strings.Trim(spl[1], `"`)
|
|
||||||
}
|
|
||||||
|
|
||||||
b := make([]byte, 8)
|
|
||||||
io.ReadFull(rand.Reader, b)
|
|
||||||
|
|
||||||
params["cnonce"] = fmt.Sprintf("%x", b)
|
|
||||||
params["nc"] = "1"
|
|
||||||
params["uri"] = requestPath
|
|
||||||
params["username"] = user
|
|
||||||
params["response"] = getMD5([]string{
|
|
||||||
getMD5([]string{params["username"], params["realm"], password}),
|
|
||||||
params["nonce"],
|
|
||||||
params["nc"],
|
|
||||||
params["cnonce"],
|
|
||||||
params["qop"],
|
|
||||||
getMD5([]string{method, requestPath}),
|
|
||||||
})
|
|
||||||
|
|
||||||
authParts := []string{}
|
|
||||||
for k, v := range params {
|
|
||||||
authParts = append(authParts, fmt.Sprintf("%s=%q", k, v))
|
|
||||||
}
|
|
||||||
return "Digest " + strings.Join(authParts, ", ")
|
|
||||||
}
|
|
||||||
|
|
||||||
func getMD5(in []string) string {
|
|
||||||
h := md5.New()
|
|
||||||
h.Write([]byte(strings.Join(in, ":")))
|
|
||||||
return hex.EncodeToString(h.Sum(nil))
|
|
||||||
}
|
|
47
vendor/github.com/Luzifer/go_helpers/http/gzip.go
generated
vendored
47
vendor/github.com/Luzifer/go_helpers/http/gzip.go
generated
vendored
|
@ -1,47 +0,0 @@
|
||||||
package http
|
|
||||||
|
|
||||||
import (
|
|
||||||
"compress/gzip"
|
|
||||||
"io"
|
|
||||||
"net/http"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
type gzipResponseWriter struct {
|
|
||||||
io.Writer
|
|
||||||
http.ResponseWriter
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w gzipResponseWriter) Write(b []byte) (int, error) {
|
|
||||||
return w.Writer.Write(b)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GzipHandler wraps an http.Handler and gzips responses if the client supports it
|
|
||||||
func GzipHandler(handler http.Handler) http.Handler {
|
|
||||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
||||||
if !strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") {
|
|
||||||
handler.ServeHTTP(w, r)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
w.Header().Set("Content-Encoding", "gzip")
|
|
||||||
gz := gzip.NewWriter(w)
|
|
||||||
defer gz.Close()
|
|
||||||
gzw := gzipResponseWriter{Writer: gz, ResponseWriter: w}
|
|
||||||
handler.ServeHTTP(gzw, r)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// GzipFunc wraps an http.HandlerFunc and gzips responses if the client supports it
|
|
||||||
func GzipFunc(f http.HandlerFunc) http.HandlerFunc {
|
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
|
||||||
if !strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") {
|
|
||||||
f(w, r)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
w.Header().Set("Content-Encoding", "gzip")
|
|
||||||
gz := gzip.NewWriter(w)
|
|
||||||
defer gz.Close()
|
|
||||||
gzw := gzipResponseWriter{Writer: gz, ResponseWriter: w}
|
|
||||||
f(gzw, r)
|
|
||||||
}
|
|
||||||
}
|
|
57
vendor/github.com/Luzifer/go_helpers/http/logHandler.go
generated
vendored
57
vendor/github.com/Luzifer/go_helpers/http/logHandler.go
generated
vendored
|
@ -1,57 +0,0 @@
|
||||||
package http
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log"
|
|
||||||
"net/http"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/Luzifer/go_helpers/accessLogger"
|
|
||||||
)
|
|
||||||
|
|
||||||
type HTTPLogHandler struct {
|
|
||||||
Handler http.Handler
|
|
||||||
TrustedIPHeaders []string
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewHTTPLogHandler(h http.Handler) http.Handler {
|
|
||||||
return HTTPLogHandler{
|
|
||||||
Handler: h,
|
|
||||||
TrustedIPHeaders: []string{"X-Forwarded-For", "RemoteAddr", "X-Real-IP"},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l HTTPLogHandler) ServeHTTP(res http.ResponseWriter, r *http.Request) {
|
|
||||||
start := time.Now()
|
|
||||||
ares := accessLogger.New(res)
|
|
||||||
|
|
||||||
l.Handler.ServeHTTP(ares, r)
|
|
||||||
|
|
||||||
path := r.URL.Path
|
|
||||||
if q := r.URL.Query().Encode(); len(q) > 0 {
|
|
||||||
path = path + "?" + q
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Printf("%s - \"%s %s\" %d %d \"%s\" \"%s\" %s",
|
|
||||||
l.findIP(r),
|
|
||||||
r.Method,
|
|
||||||
path,
|
|
||||||
ares.StatusCode,
|
|
||||||
ares.Size,
|
|
||||||
r.Header.Get("Referer"),
|
|
||||||
r.Header.Get("User-Agent"),
|
|
||||||
time.Since(start),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l HTTPLogHandler) findIP(r *http.Request) string {
|
|
||||||
remoteAddr := strings.SplitN(r.RemoteAddr, ":", 2)[0]
|
|
||||||
|
|
||||||
for _, hdr := range l.TrustedIPHeaders {
|
|
||||||
if value := r.Header.Get(hdr); value != "" {
|
|
||||||
return strings.SplitN(value, ",", 2)[0]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return remoteAddr
|
|
||||||
}
|
|
21
vendor/github.com/Luzifer/go_helpers/str/slice.go
generated
vendored
21
vendor/github.com/Luzifer/go_helpers/str/slice.go
generated
vendored
|
@ -1,21 +0,0 @@
|
||||||
package str
|
|
||||||
|
|
||||||
// AppendIfMissing adds a string to a slice when it's not present yet
|
|
||||||
func AppendIfMissing(slice []string, s string) []string {
|
|
||||||
for _, e := range slice {
|
|
||||||
if e == s {
|
|
||||||
return slice
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return append(slice, s)
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringInSlice checks for the existence of a string in the slice
|
|
||||||
func StringInSlice(a string, list []string) bool {
|
|
||||||
for _, b := range list {
|
|
||||||
if b == a {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
27
vendor/github.com/gorilla/context/LICENSE
generated
vendored
27
vendor/github.com/gorilla/context/LICENSE
generated
vendored
|
@ -1,27 +0,0 @@
|
||||||
Copyright (c) 2012 Rodrigo Moraes. 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.
|
|
143
vendor/github.com/gorilla/context/context.go
generated
vendored
143
vendor/github.com/gorilla/context/context.go
generated
vendored
|
@ -1,143 +0,0 @@
|
||||||
// Copyright 2012 The Gorilla 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 context
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net/http"
|
|
||||||
"sync"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
mutex sync.RWMutex
|
|
||||||
data = make(map[*http.Request]map[interface{}]interface{})
|
|
||||||
datat = make(map[*http.Request]int64)
|
|
||||||
)
|
|
||||||
|
|
||||||
// Set stores a value for a given key in a given request.
|
|
||||||
func Set(r *http.Request, key, val interface{}) {
|
|
||||||
mutex.Lock()
|
|
||||||
if data[r] == nil {
|
|
||||||
data[r] = make(map[interface{}]interface{})
|
|
||||||
datat[r] = time.Now().Unix()
|
|
||||||
}
|
|
||||||
data[r][key] = val
|
|
||||||
mutex.Unlock()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get returns a value stored for a given key in a given request.
|
|
||||||
func Get(r *http.Request, key interface{}) interface{} {
|
|
||||||
mutex.RLock()
|
|
||||||
if ctx := data[r]; ctx != nil {
|
|
||||||
value := ctx[key]
|
|
||||||
mutex.RUnlock()
|
|
||||||
return value
|
|
||||||
}
|
|
||||||
mutex.RUnlock()
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetOk returns stored value and presence state like multi-value return of map access.
|
|
||||||
func GetOk(r *http.Request, key interface{}) (interface{}, bool) {
|
|
||||||
mutex.RLock()
|
|
||||||
if _, ok := data[r]; ok {
|
|
||||||
value, ok := data[r][key]
|
|
||||||
mutex.RUnlock()
|
|
||||||
return value, ok
|
|
||||||
}
|
|
||||||
mutex.RUnlock()
|
|
||||||
return nil, false
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetAll returns all stored values for the request as a map. Nil is returned for invalid requests.
|
|
||||||
func GetAll(r *http.Request) map[interface{}]interface{} {
|
|
||||||
mutex.RLock()
|
|
||||||
if context, ok := data[r]; ok {
|
|
||||||
result := make(map[interface{}]interface{}, len(context))
|
|
||||||
for k, v := range context {
|
|
||||||
result[k] = v
|
|
||||||
}
|
|
||||||
mutex.RUnlock()
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
mutex.RUnlock()
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetAllOk returns all stored values for the request as a map and a boolean value that indicates if
|
|
||||||
// the request was registered.
|
|
||||||
func GetAllOk(r *http.Request) (map[interface{}]interface{}, bool) {
|
|
||||||
mutex.RLock()
|
|
||||||
context, ok := data[r]
|
|
||||||
result := make(map[interface{}]interface{}, len(context))
|
|
||||||
for k, v := range context {
|
|
||||||
result[k] = v
|
|
||||||
}
|
|
||||||
mutex.RUnlock()
|
|
||||||
return result, ok
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delete removes a value stored for a given key in a given request.
|
|
||||||
func Delete(r *http.Request, key interface{}) {
|
|
||||||
mutex.Lock()
|
|
||||||
if data[r] != nil {
|
|
||||||
delete(data[r], key)
|
|
||||||
}
|
|
||||||
mutex.Unlock()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clear removes all values stored for a given request.
|
|
||||||
//
|
|
||||||
// This is usually called by a handler wrapper to clean up request
|
|
||||||
// variables at the end of a request lifetime. See ClearHandler().
|
|
||||||
func Clear(r *http.Request) {
|
|
||||||
mutex.Lock()
|
|
||||||
clear(r)
|
|
||||||
mutex.Unlock()
|
|
||||||
}
|
|
||||||
|
|
||||||
// clear is Clear without the lock.
|
|
||||||
func clear(r *http.Request) {
|
|
||||||
delete(data, r)
|
|
||||||
delete(datat, r)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Purge removes request data stored for longer than maxAge, in seconds.
|
|
||||||
// It returns the amount of requests removed.
|
|
||||||
//
|
|
||||||
// If maxAge <= 0, all request data is removed.
|
|
||||||
//
|
|
||||||
// This is only used for sanity check: in case context cleaning was not
|
|
||||||
// properly set some request data can be kept forever, consuming an increasing
|
|
||||||
// amount of memory. In case this is detected, Purge() must be called
|
|
||||||
// periodically until the problem is fixed.
|
|
||||||
func Purge(maxAge int) int {
|
|
||||||
mutex.Lock()
|
|
||||||
count := 0
|
|
||||||
if maxAge <= 0 {
|
|
||||||
count = len(data)
|
|
||||||
data = make(map[*http.Request]map[interface{}]interface{})
|
|
||||||
datat = make(map[*http.Request]int64)
|
|
||||||
} else {
|
|
||||||
min := time.Now().Unix() - int64(maxAge)
|
|
||||||
for r := range data {
|
|
||||||
if datat[r] < min {
|
|
||||||
clear(r)
|
|
||||||
count++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mutex.Unlock()
|
|
||||||
return count
|
|
||||||
}
|
|
||||||
|
|
||||||
// ClearHandler wraps an http.Handler and clears request values at the end
|
|
||||||
// of a request lifetime.
|
|
||||||
func ClearHandler(h http.Handler) http.Handler {
|
|
||||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
||||||
defer Clear(r)
|
|
||||||
h.ServeHTTP(w, r)
|
|
||||||
})
|
|
||||||
}
|
|
88
vendor/github.com/gorilla/context/doc.go
generated
vendored
88
vendor/github.com/gorilla/context/doc.go
generated
vendored
|
@ -1,88 +0,0 @@
|
||||||
// Copyright 2012 The Gorilla 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 context stores values shared during a request lifetime.
|
|
||||||
|
|
||||||
Note: gorilla/context, having been born well before `context.Context` existed,
|
|
||||||
does not play well > with the shallow copying of the request that
|
|
||||||
[`http.Request.WithContext`](https://golang.org/pkg/net/http/#Request.WithContext)
|
|
||||||
(added to net/http Go 1.7 onwards) performs. You should either use *just*
|
|
||||||
gorilla/context, or moving forward, the new `http.Request.Context()`.
|
|
||||||
|
|
||||||
For example, a router can set variables extracted from the URL and later
|
|
||||||
application handlers can access those values, or it can be used to store
|
|
||||||
sessions values to be saved at the end of a request. There are several
|
|
||||||
others common uses.
|
|
||||||
|
|
||||||
The idea was posted by Brad Fitzpatrick to the go-nuts mailing list:
|
|
||||||
|
|
||||||
http://groups.google.com/group/golang-nuts/msg/e2d679d303aa5d53
|
|
||||||
|
|
||||||
Here's the basic usage: first define the keys that you will need. The key
|
|
||||||
type is interface{} so a key can be of any type that supports equality.
|
|
||||||
Here we define a key using a custom int type to avoid name collisions:
|
|
||||||
|
|
||||||
package foo
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/gorilla/context"
|
|
||||||
)
|
|
||||||
|
|
||||||
type key int
|
|
||||||
|
|
||||||
const MyKey key = 0
|
|
||||||
|
|
||||||
Then set a variable. Variables are bound to an http.Request object, so you
|
|
||||||
need a request instance to set a value:
|
|
||||||
|
|
||||||
context.Set(r, MyKey, "bar")
|
|
||||||
|
|
||||||
The application can later access the variable using the same key you provided:
|
|
||||||
|
|
||||||
func MyHandler(w http.ResponseWriter, r *http.Request) {
|
|
||||||
// val is "bar".
|
|
||||||
val := context.Get(r, foo.MyKey)
|
|
||||||
|
|
||||||
// returns ("bar", true)
|
|
||||||
val, ok := context.GetOk(r, foo.MyKey)
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
|
|
||||||
And that's all about the basic usage. We discuss some other ideas below.
|
|
||||||
|
|
||||||
Any type can be stored in the context. To enforce a given type, make the key
|
|
||||||
private and wrap Get() and Set() to accept and return values of a specific
|
|
||||||
type:
|
|
||||||
|
|
||||||
type key int
|
|
||||||
|
|
||||||
const mykey key = 0
|
|
||||||
|
|
||||||
// GetMyKey returns a value for this package from the request values.
|
|
||||||
func GetMyKey(r *http.Request) SomeType {
|
|
||||||
if rv := context.Get(r, mykey); rv != nil {
|
|
||||||
return rv.(SomeType)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetMyKey sets a value for this package in the request values.
|
|
||||||
func SetMyKey(r *http.Request, val SomeType) {
|
|
||||||
context.Set(r, mykey, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
Variables must be cleared at the end of a request, to remove all values
|
|
||||||
that were stored. This can be done in an http.Handler, after a request was
|
|
||||||
served. Just call Clear() passing the request:
|
|
||||||
|
|
||||||
context.Clear(r)
|
|
||||||
|
|
||||||
...or use ClearHandler(), which conveniently wraps an http.Handler to clear
|
|
||||||
variables at the end of a request lifetime.
|
|
||||||
|
|
||||||
The Routers from the packages gorilla/mux and gorilla/pat call Clear()
|
|
||||||
so if you are using either of them you don't need to clear the context manually.
|
|
||||||
*/
|
|
||||||
package context
|
|
27
vendor/github.com/gorilla/mux/LICENSE
generated
vendored
27
vendor/github.com/gorilla/mux/LICENSE
generated
vendored
|
@ -1,27 +0,0 @@
|
||||||
Copyright (c) 2012 Rodrigo Moraes. 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.
|
|
26
vendor/github.com/gorilla/mux/context_gorilla.go
generated
vendored
26
vendor/github.com/gorilla/mux/context_gorilla.go
generated
vendored
|
@ -1,26 +0,0 @@
|
||||||
// +build !go1.7
|
|
||||||
|
|
||||||
package mux
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"github.com/gorilla/context"
|
|
||||||
)
|
|
||||||
|
|
||||||
func contextGet(r *http.Request, key interface{}) interface{} {
|
|
||||||
return context.Get(r, key)
|
|
||||||
}
|
|
||||||
|
|
||||||
func contextSet(r *http.Request, key, val interface{}) *http.Request {
|
|
||||||
if val == nil {
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
context.Set(r, key, val)
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
func contextClear(r *http.Request) {
|
|
||||||
context.Clear(r)
|
|
||||||
}
|
|
24
vendor/github.com/gorilla/mux/context_native.go
generated
vendored
24
vendor/github.com/gorilla/mux/context_native.go
generated
vendored
|
@ -1,24 +0,0 @@
|
||||||
// +build go1.7
|
|
||||||
|
|
||||||
package mux
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"net/http"
|
|
||||||
)
|
|
||||||
|
|
||||||
func contextGet(r *http.Request, key interface{}) interface{} {
|
|
||||||
return r.Context().Value(key)
|
|
||||||
}
|
|
||||||
|
|
||||||
func contextSet(r *http.Request, key, val interface{}) *http.Request {
|
|
||||||
if val == nil {
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
return r.WithContext(context.WithValue(r.Context(), key, val))
|
|
||||||
}
|
|
||||||
|
|
||||||
func contextClear(r *http.Request) {
|
|
||||||
return
|
|
||||||
}
|
|
306
vendor/github.com/gorilla/mux/doc.go
generated
vendored
306
vendor/github.com/gorilla/mux/doc.go
generated
vendored
|
@ -1,306 +0,0 @@
|
||||||
// Copyright 2012 The Gorilla 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 mux implements a request router and dispatcher.
|
|
||||||
|
|
||||||
The name mux stands for "HTTP request multiplexer". Like the standard
|
|
||||||
http.ServeMux, mux.Router matches incoming requests against a list of
|
|
||||||
registered routes and calls a handler for the route that matches the URL
|
|
||||||
or other conditions. The main features are:
|
|
||||||
|
|
||||||
* Requests can be matched based on URL host, path, path prefix, schemes,
|
|
||||||
header and query values, HTTP methods or using custom matchers.
|
|
||||||
* URL hosts, paths and query values can have variables with an optional
|
|
||||||
regular expression.
|
|
||||||
* Registered URLs can be built, or "reversed", which helps maintaining
|
|
||||||
references to resources.
|
|
||||||
* Routes can be used as subrouters: nested routes are only tested if the
|
|
||||||
parent route matches. This is useful to define groups of routes that
|
|
||||||
share common conditions like a host, a path prefix or other repeated
|
|
||||||
attributes. As a bonus, this optimizes request matching.
|
|
||||||
* It implements the http.Handler interface so it is compatible with the
|
|
||||||
standard http.ServeMux.
|
|
||||||
|
|
||||||
Let's start registering a couple of URL paths and handlers:
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
r := mux.NewRouter()
|
|
||||||
r.HandleFunc("/", HomeHandler)
|
|
||||||
r.HandleFunc("/products", ProductsHandler)
|
|
||||||
r.HandleFunc("/articles", ArticlesHandler)
|
|
||||||
http.Handle("/", r)
|
|
||||||
}
|
|
||||||
|
|
||||||
Here we register three routes mapping URL paths to handlers. This is
|
|
||||||
equivalent to how http.HandleFunc() works: if an incoming request URL matches
|
|
||||||
one of the paths, the corresponding handler is called passing
|
|
||||||
(http.ResponseWriter, *http.Request) as parameters.
|
|
||||||
|
|
||||||
Paths can have variables. They are defined using the format {name} or
|
|
||||||
{name:pattern}. If a regular expression pattern is not defined, the matched
|
|
||||||
variable will be anything until the next slash. For example:
|
|
||||||
|
|
||||||
r := mux.NewRouter()
|
|
||||||
r.HandleFunc("/products/{key}", ProductHandler)
|
|
||||||
r.HandleFunc("/articles/{category}/", ArticlesCategoryHandler)
|
|
||||||
r.HandleFunc("/articles/{category}/{id:[0-9]+}", ArticleHandler)
|
|
||||||
|
|
||||||
Groups can be used inside patterns, as long as they are non-capturing (?:re). For example:
|
|
||||||
|
|
||||||
r.HandleFunc("/articles/{category}/{sort:(?:asc|desc|new)}", ArticlesCategoryHandler)
|
|
||||||
|
|
||||||
The names are used to create a map of route variables which can be retrieved
|
|
||||||
calling mux.Vars():
|
|
||||||
|
|
||||||
vars := mux.Vars(request)
|
|
||||||
category := vars["category"]
|
|
||||||
|
|
||||||
Note that if any capturing groups are present, mux will panic() during parsing. To prevent
|
|
||||||
this, convert any capturing groups to non-capturing, e.g. change "/{sort:(asc|desc)}" to
|
|
||||||
"/{sort:(?:asc|desc)}". This is a change from prior versions which behaved unpredictably
|
|
||||||
when capturing groups were present.
|
|
||||||
|
|
||||||
And this is all you need to know about the basic usage. More advanced options
|
|
||||||
are explained below.
|
|
||||||
|
|
||||||
Routes can also be restricted to a domain or subdomain. Just define a host
|
|
||||||
pattern to be matched. They can also have variables:
|
|
||||||
|
|
||||||
r := mux.NewRouter()
|
|
||||||
// Only matches if domain is "www.example.com".
|
|
||||||
r.Host("www.example.com")
|
|
||||||
// Matches a dynamic subdomain.
|
|
||||||
r.Host("{subdomain:[a-z]+}.domain.com")
|
|
||||||
|
|
||||||
There are several other matchers that can be added. To match path prefixes:
|
|
||||||
|
|
||||||
r.PathPrefix("/products/")
|
|
||||||
|
|
||||||
...or HTTP methods:
|
|
||||||
|
|
||||||
r.Methods("GET", "POST")
|
|
||||||
|
|
||||||
...or URL schemes:
|
|
||||||
|
|
||||||
r.Schemes("https")
|
|
||||||
|
|
||||||
...or header values:
|
|
||||||
|
|
||||||
r.Headers("X-Requested-With", "XMLHttpRequest")
|
|
||||||
|
|
||||||
...or query values:
|
|
||||||
|
|
||||||
r.Queries("key", "value")
|
|
||||||
|
|
||||||
...or to use a custom matcher function:
|
|
||||||
|
|
||||||
r.MatcherFunc(func(r *http.Request, rm *RouteMatch) bool {
|
|
||||||
return r.ProtoMajor == 0
|
|
||||||
})
|
|
||||||
|
|
||||||
...and finally, it is possible to combine several matchers in a single route:
|
|
||||||
|
|
||||||
r.HandleFunc("/products", ProductsHandler).
|
|
||||||
Host("www.example.com").
|
|
||||||
Methods("GET").
|
|
||||||
Schemes("http")
|
|
||||||
|
|
||||||
Setting the same matching conditions again and again can be boring, so we have
|
|
||||||
a way to group several routes that share the same requirements.
|
|
||||||
We call it "subrouting".
|
|
||||||
|
|
||||||
For example, let's say we have several URLs that should only match when the
|
|
||||||
host is "www.example.com". Create a route for that host and get a "subrouter"
|
|
||||||
from it:
|
|
||||||
|
|
||||||
r := mux.NewRouter()
|
|
||||||
s := r.Host("www.example.com").Subrouter()
|
|
||||||
|
|
||||||
Then register routes in the subrouter:
|
|
||||||
|
|
||||||
s.HandleFunc("/products/", ProductsHandler)
|
|
||||||
s.HandleFunc("/products/{key}", ProductHandler)
|
|
||||||
s.HandleFunc("/articles/{category}/{id:[0-9]+}"), ArticleHandler)
|
|
||||||
|
|
||||||
The three URL paths we registered above will only be tested if the domain is
|
|
||||||
"www.example.com", because the subrouter is tested first. This is not
|
|
||||||
only convenient, but also optimizes request matching. You can create
|
|
||||||
subrouters combining any attribute matchers accepted by a route.
|
|
||||||
|
|
||||||
Subrouters can be used to create domain or path "namespaces": you define
|
|
||||||
subrouters in a central place and then parts of the app can register its
|
|
||||||
paths relatively to a given subrouter.
|
|
||||||
|
|
||||||
There's one more thing about subroutes. When a subrouter has a path prefix,
|
|
||||||
the inner routes use it as base for their paths:
|
|
||||||
|
|
||||||
r := mux.NewRouter()
|
|
||||||
s := r.PathPrefix("/products").Subrouter()
|
|
||||||
// "/products/"
|
|
||||||
s.HandleFunc("/", ProductsHandler)
|
|
||||||
// "/products/{key}/"
|
|
||||||
s.HandleFunc("/{key}/", ProductHandler)
|
|
||||||
// "/products/{key}/details"
|
|
||||||
s.HandleFunc("/{key}/details", ProductDetailsHandler)
|
|
||||||
|
|
||||||
Note that the path provided to PathPrefix() represents a "wildcard": calling
|
|
||||||
PathPrefix("/static/").Handler(...) means that the handler will be passed any
|
|
||||||
request that matches "/static/*". This makes it easy to serve static files with mux:
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
var dir string
|
|
||||||
|
|
||||||
flag.StringVar(&dir, "dir", ".", "the directory to serve files from. Defaults to the current dir")
|
|
||||||
flag.Parse()
|
|
||||||
r := mux.NewRouter()
|
|
||||||
|
|
||||||
// This will serve files under http://localhost:8000/static/<filename>
|
|
||||||
r.PathPrefix("/static/").Handler(http.StripPrefix("/static/", http.FileServer(http.Dir(dir))))
|
|
||||||
|
|
||||||
srv := &http.Server{
|
|
||||||
Handler: r,
|
|
||||||
Addr: "127.0.0.1:8000",
|
|
||||||
// Good practice: enforce timeouts for servers you create!
|
|
||||||
WriteTimeout: 15 * time.Second,
|
|
||||||
ReadTimeout: 15 * time.Second,
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Fatal(srv.ListenAndServe())
|
|
||||||
}
|
|
||||||
|
|
||||||
Now let's see how to build registered URLs.
|
|
||||||
|
|
||||||
Routes can be named. All routes that define a name can have their URLs built,
|
|
||||||
or "reversed". We define a name calling Name() on a route. For example:
|
|
||||||
|
|
||||||
r := mux.NewRouter()
|
|
||||||
r.HandleFunc("/articles/{category}/{id:[0-9]+}", ArticleHandler).
|
|
||||||
Name("article")
|
|
||||||
|
|
||||||
To build a URL, get the route and call the URL() method, passing a sequence of
|
|
||||||
key/value pairs for the route variables. For the previous route, we would do:
|
|
||||||
|
|
||||||
url, err := r.Get("article").URL("category", "technology", "id", "42")
|
|
||||||
|
|
||||||
...and the result will be a url.URL with the following path:
|
|
||||||
|
|
||||||
"/articles/technology/42"
|
|
||||||
|
|
||||||
This also works for host and query value variables:
|
|
||||||
|
|
||||||
r := mux.NewRouter()
|
|
||||||
r.Host("{subdomain}.domain.com").
|
|
||||||
Path("/articles/{category}/{id:[0-9]+}").
|
|
||||||
Queries("filter", "{filter}").
|
|
||||||
HandlerFunc(ArticleHandler).
|
|
||||||
Name("article")
|
|
||||||
|
|
||||||
// url.String() will be "http://news.domain.com/articles/technology/42?filter=gorilla"
|
|
||||||
url, err := r.Get("article").URL("subdomain", "news",
|
|
||||||
"category", "technology",
|
|
||||||
"id", "42",
|
|
||||||
"filter", "gorilla")
|
|
||||||
|
|
||||||
All variables defined in the route are required, and their values must
|
|
||||||
conform to the corresponding patterns. These requirements guarantee that a
|
|
||||||
generated URL will always match a registered route -- the only exception is
|
|
||||||
for explicitly defined "build-only" routes which never match.
|
|
||||||
|
|
||||||
Regex support also exists for matching Headers within a route. For example, we could do:
|
|
||||||
|
|
||||||
r.HeadersRegexp("Content-Type", "application/(text|json)")
|
|
||||||
|
|
||||||
...and the route will match both requests with a Content-Type of `application/json` as well as
|
|
||||||
`application/text`
|
|
||||||
|
|
||||||
There's also a way to build only the URL host or path for a route:
|
|
||||||
use the methods URLHost() or URLPath() instead. For the previous route,
|
|
||||||
we would do:
|
|
||||||
|
|
||||||
// "http://news.domain.com/"
|
|
||||||
host, err := r.Get("article").URLHost("subdomain", "news")
|
|
||||||
|
|
||||||
// "/articles/technology/42"
|
|
||||||
path, err := r.Get("article").URLPath("category", "technology", "id", "42")
|
|
||||||
|
|
||||||
And if you use subrouters, host and path defined separately can be built
|
|
||||||
as well:
|
|
||||||
|
|
||||||
r := mux.NewRouter()
|
|
||||||
s := r.Host("{subdomain}.domain.com").Subrouter()
|
|
||||||
s.Path("/articles/{category}/{id:[0-9]+}").
|
|
||||||
HandlerFunc(ArticleHandler).
|
|
||||||
Name("article")
|
|
||||||
|
|
||||||
// "http://news.domain.com/articles/technology/42"
|
|
||||||
url, err := r.Get("article").URL("subdomain", "news",
|
|
||||||
"category", "technology",
|
|
||||||
"id", "42")
|
|
||||||
|
|
||||||
Mux supports the addition of middlewares to a Router, which are executed in the order they are added if a match is found, including its subrouters. Middlewares are (typically) small pieces of code which take one request, do something with it, and pass it down to another middleware or the final handler. Some common use cases for middleware are request logging, header manipulation, or ResponseWriter hijacking.
|
|
||||||
|
|
||||||
type MiddlewareFunc func(http.Handler) http.Handler
|
|
||||||
|
|
||||||
Typically, the returned handler is a closure which does something with the http.ResponseWriter and http.Request passed to it, and then calls the handler passed as parameter to the MiddlewareFunc (closures can access variables from the context where they are created).
|
|
||||||
|
|
||||||
A very basic middleware which logs the URI of the request being handled could be written as:
|
|
||||||
|
|
||||||
func simpleMw(next http.Handler) http.Handler {
|
|
||||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
||||||
// Do stuff here
|
|
||||||
log.Println(r.RequestURI)
|
|
||||||
// Call the next handler, which can be another middleware in the chain, or the final handler.
|
|
||||||
next.ServeHTTP(w, r)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
Middlewares can be added to a router using `Router.Use()`:
|
|
||||||
|
|
||||||
r := mux.NewRouter()
|
|
||||||
r.HandleFunc("/", handler)
|
|
||||||
r.Use(simpleMw)
|
|
||||||
|
|
||||||
A more complex authentication middleware, which maps session token to users, could be written as:
|
|
||||||
|
|
||||||
// Define our struct
|
|
||||||
type authenticationMiddleware struct {
|
|
||||||
tokenUsers map[string]string
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initialize it somewhere
|
|
||||||
func (amw *authenticationMiddleware) Populate() {
|
|
||||||
amw.tokenUsers["00000000"] = "user0"
|
|
||||||
amw.tokenUsers["aaaaaaaa"] = "userA"
|
|
||||||
amw.tokenUsers["05f717e5"] = "randomUser"
|
|
||||||
amw.tokenUsers["deadbeef"] = "user0"
|
|
||||||
}
|
|
||||||
|
|
||||||
// Middleware function, which will be called for each request
|
|
||||||
func (amw *authenticationMiddleware) Middleware(next http.Handler) http.Handler {
|
|
||||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
||||||
token := r.Header.Get("X-Session-Token")
|
|
||||||
|
|
||||||
if user, found := amw.tokenUsers[token]; found {
|
|
||||||
// We found the token in our map
|
|
||||||
log.Printf("Authenticated user %s\n", user)
|
|
||||||
next.ServeHTTP(w, r)
|
|
||||||
} else {
|
|
||||||
http.Error(w, "Forbidden", http.StatusForbidden)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
r := mux.NewRouter()
|
|
||||||
r.HandleFunc("/", handler)
|
|
||||||
|
|
||||||
amw := authenticationMiddleware{}
|
|
||||||
amw.Populate()
|
|
||||||
|
|
||||||
r.Use(amw.Middleware)
|
|
||||||
|
|
||||||
Note: The handler chain will be stopped if your middleware doesn't call `next.ServeHTTP()` with the corresponding parameters. This can be used to abort a request if the middleware writer wants to.
|
|
||||||
|
|
||||||
*/
|
|
||||||
package mux
|
|
72
vendor/github.com/gorilla/mux/middleware.go
generated
vendored
72
vendor/github.com/gorilla/mux/middleware.go
generated
vendored
|
@ -1,72 +0,0 @@
|
||||||
package mux
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net/http"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// MiddlewareFunc is a function which receives an http.Handler and returns another http.Handler.
|
|
||||||
// Typically, the returned handler is a closure which does something with the http.ResponseWriter and http.Request passed
|
|
||||||
// to it, and then calls the handler passed as parameter to the MiddlewareFunc.
|
|
||||||
type MiddlewareFunc func(http.Handler) http.Handler
|
|
||||||
|
|
||||||
// middleware interface is anything which implements a MiddlewareFunc named Middleware.
|
|
||||||
type middleware interface {
|
|
||||||
Middleware(handler http.Handler) http.Handler
|
|
||||||
}
|
|
||||||
|
|
||||||
// Middleware allows MiddlewareFunc to implement the middleware interface.
|
|
||||||
func (mw MiddlewareFunc) Middleware(handler http.Handler) http.Handler {
|
|
||||||
return mw(handler)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Use appends a MiddlewareFunc to the chain. Middleware can be used to intercept or otherwise modify requests and/or responses, and are executed in the order that they are applied to the Router.
|
|
||||||
func (r *Router) Use(mwf ...MiddlewareFunc) {
|
|
||||||
for _, fn := range mwf {
|
|
||||||
r.middlewares = append(r.middlewares, fn)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// useInterface appends a middleware to the chain. Middleware can be used to intercept or otherwise modify requests and/or responses, and are executed in the order that they are applied to the Router.
|
|
||||||
func (r *Router) useInterface(mw middleware) {
|
|
||||||
r.middlewares = append(r.middlewares, mw)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CORSMethodMiddleware sets the Access-Control-Allow-Methods response header
|
|
||||||
// on a request, by matching routes based only on paths. It also handles
|
|
||||||
// OPTIONS requests, by settings Access-Control-Allow-Methods, and then
|
|
||||||
// returning without calling the next http handler.
|
|
||||||
func CORSMethodMiddleware(r *Router) MiddlewareFunc {
|
|
||||||
return func(next http.Handler) http.Handler {
|
|
||||||
return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
|
|
||||||
var allMethods []string
|
|
||||||
|
|
||||||
err := r.Walk(func(route *Route, _ *Router, _ []*Route) error {
|
|
||||||
for _, m := range route.matchers {
|
|
||||||
if _, ok := m.(*routeRegexp); ok {
|
|
||||||
if m.Match(req, &RouteMatch{}) {
|
|
||||||
methods, err := route.GetMethods()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
allMethods = append(allMethods, methods...)
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
|
|
||||||
if err == nil {
|
|
||||||
w.Header().Set("Access-Control-Allow-Methods", strings.Join(append(allMethods, "OPTIONS"), ","))
|
|
||||||
|
|
||||||
if req.Method == "OPTIONS" {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
next.ServeHTTP(w, req)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
588
vendor/github.com/gorilla/mux/mux.go
generated
vendored
588
vendor/github.com/gorilla/mux/mux.go
generated
vendored
|
@ -1,588 +0,0 @@
|
||||||
// Copyright 2012 The Gorilla 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 mux
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"net/http"
|
|
||||||
"path"
|
|
||||||
"regexp"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
// ErrMethodMismatch is returned when the method in the request does not match
|
|
||||||
// the method defined against the route.
|
|
||||||
ErrMethodMismatch = errors.New("method is not allowed")
|
|
||||||
// ErrNotFound is returned when no route match is found.
|
|
||||||
ErrNotFound = errors.New("no matching route was found")
|
|
||||||
)
|
|
||||||
|
|
||||||
// NewRouter returns a new router instance.
|
|
||||||
func NewRouter() *Router {
|
|
||||||
return &Router{namedRoutes: make(map[string]*Route), KeepContext: false}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Router registers routes to be matched and dispatches a handler.
|
|
||||||
//
|
|
||||||
// It implements the http.Handler interface, so it can be registered to serve
|
|
||||||
// requests:
|
|
||||||
//
|
|
||||||
// var router = mux.NewRouter()
|
|
||||||
//
|
|
||||||
// func main() {
|
|
||||||
// http.Handle("/", router)
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Or, for Google App Engine, register it in a init() function:
|
|
||||||
//
|
|
||||||
// func init() {
|
|
||||||
// http.Handle("/", router)
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// This will send all incoming requests to the router.
|
|
||||||
type Router struct {
|
|
||||||
// Configurable Handler to be used when no route matches.
|
|
||||||
NotFoundHandler http.Handler
|
|
||||||
|
|
||||||
// Configurable Handler to be used when the request method does not match the route.
|
|
||||||
MethodNotAllowedHandler http.Handler
|
|
||||||
|
|
||||||
// Parent route, if this is a subrouter.
|
|
||||||
parent parentRoute
|
|
||||||
// Routes to be matched, in order.
|
|
||||||
routes []*Route
|
|
||||||
// Routes by name for URL building.
|
|
||||||
namedRoutes map[string]*Route
|
|
||||||
// See Router.StrictSlash(). This defines the flag for new routes.
|
|
||||||
strictSlash bool
|
|
||||||
// See Router.SkipClean(). This defines the flag for new routes.
|
|
||||||
skipClean bool
|
|
||||||
// If true, do not clear the request context after handling the request.
|
|
||||||
// This has no effect when go1.7+ is used, since the context is stored
|
|
||||||
// on the request itself.
|
|
||||||
KeepContext bool
|
|
||||||
// see Router.UseEncodedPath(). This defines a flag for all routes.
|
|
||||||
useEncodedPath bool
|
|
||||||
// Slice of middlewares to be called after a match is found
|
|
||||||
middlewares []middleware
|
|
||||||
}
|
|
||||||
|
|
||||||
// Match attempts to match the given request against the router's registered routes.
|
|
||||||
//
|
|
||||||
// If the request matches a route of this router or one of its subrouters the Route,
|
|
||||||
// Handler, and Vars fields of the the match argument are filled and this function
|
|
||||||
// returns true.
|
|
||||||
//
|
|
||||||
// If the request does not match any of this router's or its subrouters' routes
|
|
||||||
// then this function returns false. If available, a reason for the match failure
|
|
||||||
// will be filled in the match argument's MatchErr field. If the match failure type
|
|
||||||
// (eg: not found) has a registered handler, the handler is assigned to the Handler
|
|
||||||
// field of the match argument.
|
|
||||||
func (r *Router) Match(req *http.Request, match *RouteMatch) bool {
|
|
||||||
for _, route := range r.routes {
|
|
||||||
if route.Match(req, match) {
|
|
||||||
// Build middleware chain if no error was found
|
|
||||||
if match.MatchErr == nil {
|
|
||||||
for i := len(r.middlewares) - 1; i >= 0; i-- {
|
|
||||||
match.Handler = r.middlewares[i].Middleware(match.Handler)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if match.MatchErr == ErrMethodMismatch {
|
|
||||||
if r.MethodNotAllowedHandler != nil {
|
|
||||||
match.Handler = r.MethodNotAllowedHandler
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// Closest match for a router (includes sub-routers)
|
|
||||||
if r.NotFoundHandler != nil {
|
|
||||||
match.Handler = r.NotFoundHandler
|
|
||||||
match.MatchErr = ErrNotFound
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
match.MatchErr = ErrNotFound
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// ServeHTTP dispatches the handler registered in the matched route.
|
|
||||||
//
|
|
||||||
// When there is a match, the route variables can be retrieved calling
|
|
||||||
// mux.Vars(request).
|
|
||||||
func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
|
||||||
if !r.skipClean {
|
|
||||||
path := req.URL.Path
|
|
||||||
if r.useEncodedPath {
|
|
||||||
path = req.URL.EscapedPath()
|
|
||||||
}
|
|
||||||
// Clean path to canonical form and redirect.
|
|
||||||
if p := cleanPath(path); p != path {
|
|
||||||
|
|
||||||
// Added 3 lines (Philip Schlump) - It was dropping the query string and #whatever from query.
|
|
||||||
// This matches with fix in go 1.2 r.c. 4 for same problem. Go Issue:
|
|
||||||
// http://code.google.com/p/go/issues/detail?id=5252
|
|
||||||
url := *req.URL
|
|
||||||
url.Path = p
|
|
||||||
p = url.String()
|
|
||||||
|
|
||||||
w.Header().Set("Location", p)
|
|
||||||
w.WriteHeader(http.StatusMovedPermanently)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var match RouteMatch
|
|
||||||
var handler http.Handler
|
|
||||||
if r.Match(req, &match) {
|
|
||||||
handler = match.Handler
|
|
||||||
req = setVars(req, match.Vars)
|
|
||||||
req = setCurrentRoute(req, match.Route)
|
|
||||||
}
|
|
||||||
|
|
||||||
if handler == nil && match.MatchErr == ErrMethodMismatch {
|
|
||||||
handler = methodNotAllowedHandler()
|
|
||||||
}
|
|
||||||
|
|
||||||
if handler == nil {
|
|
||||||
handler = http.NotFoundHandler()
|
|
||||||
}
|
|
||||||
|
|
||||||
if !r.KeepContext {
|
|
||||||
defer contextClear(req)
|
|
||||||
}
|
|
||||||
|
|
||||||
handler.ServeHTTP(w, req)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get returns a route registered with the given name.
|
|
||||||
func (r *Router) Get(name string) *Route {
|
|
||||||
return r.getNamedRoutes()[name]
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetRoute returns a route registered with the given name. This method
|
|
||||||
// was renamed to Get() and remains here for backwards compatibility.
|
|
||||||
func (r *Router) GetRoute(name string) *Route {
|
|
||||||
return r.getNamedRoutes()[name]
|
|
||||||
}
|
|
||||||
|
|
||||||
// StrictSlash defines the trailing slash behavior for new routes. The initial
|
|
||||||
// value is false.
|
|
||||||
//
|
|
||||||
// When true, if the route path is "/path/", accessing "/path" will perform a redirect
|
|
||||||
// to the former and vice versa. In other words, your application will always
|
|
||||||
// see the path as specified in the route.
|
|
||||||
//
|
|
||||||
// When false, if the route path is "/path", accessing "/path/" will not match
|
|
||||||
// this route and vice versa.
|
|
||||||
//
|
|
||||||
// The re-direct is a HTTP 301 (Moved Permanently). Note that when this is set for
|
|
||||||
// routes with a non-idempotent method (e.g. POST, PUT), the subsequent re-directed
|
|
||||||
// request will be made as a GET by most clients. Use middleware or client settings
|
|
||||||
// to modify this behaviour as needed.
|
|
||||||
//
|
|
||||||
// Special case: when a route sets a path prefix using the PathPrefix() method,
|
|
||||||
// strict slash is ignored for that route because the redirect behavior can't
|
|
||||||
// be determined from a prefix alone. However, any subrouters created from that
|
|
||||||
// route inherit the original StrictSlash setting.
|
|
||||||
func (r *Router) StrictSlash(value bool) *Router {
|
|
||||||
r.strictSlash = value
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
// SkipClean defines the path cleaning behaviour for new routes. The initial
|
|
||||||
// value is false. Users should be careful about which routes are not cleaned
|
|
||||||
//
|
|
||||||
// When true, if the route path is "/path//to", it will remain with the double
|
|
||||||
// slash. This is helpful if you have a route like: /fetch/http://xkcd.com/534/
|
|
||||||
//
|
|
||||||
// When false, the path will be cleaned, so /fetch/http://xkcd.com/534/ will
|
|
||||||
// become /fetch/http/xkcd.com/534
|
|
||||||
func (r *Router) SkipClean(value bool) *Router {
|
|
||||||
r.skipClean = value
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
// UseEncodedPath tells the router to match the encoded original path
|
|
||||||
// to the routes.
|
|
||||||
// For eg. "/path/foo%2Fbar/to" will match the path "/path/{var}/to".
|
|
||||||
//
|
|
||||||
// If not called, the router will match the unencoded path to the routes.
|
|
||||||
// For eg. "/path/foo%2Fbar/to" will match the path "/path/foo/bar/to"
|
|
||||||
func (r *Router) UseEncodedPath() *Router {
|
|
||||||
r.useEncodedPath = true
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// parentRoute
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
func (r *Router) getBuildScheme() string {
|
|
||||||
if r.parent != nil {
|
|
||||||
return r.parent.getBuildScheme()
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// getNamedRoutes returns the map where named routes are registered.
|
|
||||||
func (r *Router) getNamedRoutes() map[string]*Route {
|
|
||||||
if r.namedRoutes == nil {
|
|
||||||
if r.parent != nil {
|
|
||||||
r.namedRoutes = r.parent.getNamedRoutes()
|
|
||||||
} else {
|
|
||||||
r.namedRoutes = make(map[string]*Route)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return r.namedRoutes
|
|
||||||
}
|
|
||||||
|
|
||||||
// getRegexpGroup returns regexp definitions from the parent route, if any.
|
|
||||||
func (r *Router) getRegexpGroup() *routeRegexpGroup {
|
|
||||||
if r.parent != nil {
|
|
||||||
return r.parent.getRegexpGroup()
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *Router) buildVars(m map[string]string) map[string]string {
|
|
||||||
if r.parent != nil {
|
|
||||||
m = r.parent.buildVars(m)
|
|
||||||
}
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// Route factories
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// NewRoute registers an empty route.
|
|
||||||
func (r *Router) NewRoute() *Route {
|
|
||||||
route := &Route{parent: r, strictSlash: r.strictSlash, skipClean: r.skipClean, useEncodedPath: r.useEncodedPath}
|
|
||||||
r.routes = append(r.routes, route)
|
|
||||||
return route
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle registers a new route with a matcher for the URL path.
|
|
||||||
// See Route.Path() and Route.Handler().
|
|
||||||
func (r *Router) Handle(path string, handler http.Handler) *Route {
|
|
||||||
return r.NewRoute().Path(path).Handler(handler)
|
|
||||||
}
|
|
||||||
|
|
||||||
// HandleFunc registers a new route with a matcher for the URL path.
|
|
||||||
// See Route.Path() and Route.HandlerFunc().
|
|
||||||
func (r *Router) HandleFunc(path string, f func(http.ResponseWriter,
|
|
||||||
*http.Request)) *Route {
|
|
||||||
return r.NewRoute().Path(path).HandlerFunc(f)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Headers registers a new route with a matcher for request header values.
|
|
||||||
// See Route.Headers().
|
|
||||||
func (r *Router) Headers(pairs ...string) *Route {
|
|
||||||
return r.NewRoute().Headers(pairs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Host registers a new route with a matcher for the URL host.
|
|
||||||
// See Route.Host().
|
|
||||||
func (r *Router) Host(tpl string) *Route {
|
|
||||||
return r.NewRoute().Host(tpl)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MatcherFunc registers a new route with a custom matcher function.
|
|
||||||
// See Route.MatcherFunc().
|
|
||||||
func (r *Router) MatcherFunc(f MatcherFunc) *Route {
|
|
||||||
return r.NewRoute().MatcherFunc(f)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Methods registers a new route with a matcher for HTTP methods.
|
|
||||||
// See Route.Methods().
|
|
||||||
func (r *Router) Methods(methods ...string) *Route {
|
|
||||||
return r.NewRoute().Methods(methods...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Path registers a new route with a matcher for the URL path.
|
|
||||||
// See Route.Path().
|
|
||||||
func (r *Router) Path(tpl string) *Route {
|
|
||||||
return r.NewRoute().Path(tpl)
|
|
||||||
}
|
|
||||||
|
|
||||||
// PathPrefix registers a new route with a matcher for the URL path prefix.
|
|
||||||
// See Route.PathPrefix().
|
|
||||||
func (r *Router) PathPrefix(tpl string) *Route {
|
|
||||||
return r.NewRoute().PathPrefix(tpl)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Queries registers a new route with a matcher for URL query values.
|
|
||||||
// See Route.Queries().
|
|
||||||
func (r *Router) Queries(pairs ...string) *Route {
|
|
||||||
return r.NewRoute().Queries(pairs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Schemes registers a new route with a matcher for URL schemes.
|
|
||||||
// See Route.Schemes().
|
|
||||||
func (r *Router) Schemes(schemes ...string) *Route {
|
|
||||||
return r.NewRoute().Schemes(schemes...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// BuildVarsFunc registers a new route with a custom function for modifying
|
|
||||||
// route variables before building a URL.
|
|
||||||
func (r *Router) BuildVarsFunc(f BuildVarsFunc) *Route {
|
|
||||||
return r.NewRoute().BuildVarsFunc(f)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Walk walks the router and all its sub-routers, calling walkFn for each route
|
|
||||||
// in the tree. The routes are walked in the order they were added. Sub-routers
|
|
||||||
// are explored depth-first.
|
|
||||||
func (r *Router) Walk(walkFn WalkFunc) error {
|
|
||||||
return r.walk(walkFn, []*Route{})
|
|
||||||
}
|
|
||||||
|
|
||||||
// SkipRouter is used as a return value from WalkFuncs to indicate that the
|
|
||||||
// router that walk is about to descend down to should be skipped.
|
|
||||||
var SkipRouter = errors.New("skip this router")
|
|
||||||
|
|
||||||
// WalkFunc is the type of the function called for each route visited by Walk.
|
|
||||||
// At every invocation, it is given the current route, and the current router,
|
|
||||||
// and a list of ancestor routes that lead to the current route.
|
|
||||||
type WalkFunc func(route *Route, router *Router, ancestors []*Route) error
|
|
||||||
|
|
||||||
func (r *Router) walk(walkFn WalkFunc, ancestors []*Route) error {
|
|
||||||
for _, t := range r.routes {
|
|
||||||
err := walkFn(t, r, ancestors)
|
|
||||||
if err == SkipRouter {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
for _, sr := range t.matchers {
|
|
||||||
if h, ok := sr.(*Router); ok {
|
|
||||||
ancestors = append(ancestors, t)
|
|
||||||
err := h.walk(walkFn, ancestors)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
ancestors = ancestors[:len(ancestors)-1]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if h, ok := t.handler.(*Router); ok {
|
|
||||||
ancestors = append(ancestors, t)
|
|
||||||
err := h.walk(walkFn, ancestors)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
ancestors = ancestors[:len(ancestors)-1]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// Context
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// RouteMatch stores information about a matched route.
|
|
||||||
type RouteMatch struct {
|
|
||||||
Route *Route
|
|
||||||
Handler http.Handler
|
|
||||||
Vars map[string]string
|
|
||||||
|
|
||||||
// MatchErr is set to appropriate matching error
|
|
||||||
// It is set to ErrMethodMismatch if there is a mismatch in
|
|
||||||
// the request method and route method
|
|
||||||
MatchErr error
|
|
||||||
}
|
|
||||||
|
|
||||||
type contextKey int
|
|
||||||
|
|
||||||
const (
|
|
||||||
varsKey contextKey = iota
|
|
||||||
routeKey
|
|
||||||
)
|
|
||||||
|
|
||||||
// Vars returns the route variables for the current request, if any.
|
|
||||||
func Vars(r *http.Request) map[string]string {
|
|
||||||
if rv := contextGet(r, varsKey); rv != nil {
|
|
||||||
return rv.(map[string]string)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CurrentRoute returns the matched route for the current request, if any.
|
|
||||||
// This only works when called inside the handler of the matched route
|
|
||||||
// because the matched route is stored in the request context which is cleared
|
|
||||||
// after the handler returns, unless the KeepContext option is set on the
|
|
||||||
// Router.
|
|
||||||
func CurrentRoute(r *http.Request) *Route {
|
|
||||||
if rv := contextGet(r, routeKey); rv != nil {
|
|
||||||
return rv.(*Route)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func setVars(r *http.Request, val interface{}) *http.Request {
|
|
||||||
return contextSet(r, varsKey, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
func setCurrentRoute(r *http.Request, val interface{}) *http.Request {
|
|
||||||
return contextSet(r, routeKey, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// Helpers
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// cleanPath returns the canonical path for p, eliminating . and .. elements.
|
|
||||||
// Borrowed from the net/http package.
|
|
||||||
func cleanPath(p string) string {
|
|
||||||
if p == "" {
|
|
||||||
return "/"
|
|
||||||
}
|
|
||||||
if p[0] != '/' {
|
|
||||||
p = "/" + p
|
|
||||||
}
|
|
||||||
np := path.Clean(p)
|
|
||||||
// path.Clean removes trailing slash except for root;
|
|
||||||
// put the trailing slash back if necessary.
|
|
||||||
if p[len(p)-1] == '/' && np != "/" {
|
|
||||||
np += "/"
|
|
||||||
}
|
|
||||||
|
|
||||||
return np
|
|
||||||
}
|
|
||||||
|
|
||||||
// uniqueVars returns an error if two slices contain duplicated strings.
|
|
||||||
func uniqueVars(s1, s2 []string) error {
|
|
||||||
for _, v1 := range s1 {
|
|
||||||
for _, v2 := range s2 {
|
|
||||||
if v1 == v2 {
|
|
||||||
return fmt.Errorf("mux: duplicated route variable %q", v2)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// checkPairs returns the count of strings passed in, and an error if
|
|
||||||
// the count is not an even number.
|
|
||||||
func checkPairs(pairs ...string) (int, error) {
|
|
||||||
length := len(pairs)
|
|
||||||
if length%2 != 0 {
|
|
||||||
return length, fmt.Errorf(
|
|
||||||
"mux: number of parameters must be multiple of 2, got %v", pairs)
|
|
||||||
}
|
|
||||||
return length, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// mapFromPairsToString converts variadic string parameters to a
|
|
||||||
// string to string map.
|
|
||||||
func mapFromPairsToString(pairs ...string) (map[string]string, error) {
|
|
||||||
length, err := checkPairs(pairs...)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
m := make(map[string]string, length/2)
|
|
||||||
for i := 0; i < length; i += 2 {
|
|
||||||
m[pairs[i]] = pairs[i+1]
|
|
||||||
}
|
|
||||||
return m, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// mapFromPairsToRegex converts variadic string parameters to a
|
|
||||||
// string to regex map.
|
|
||||||
func mapFromPairsToRegex(pairs ...string) (map[string]*regexp.Regexp, error) {
|
|
||||||
length, err := checkPairs(pairs...)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
m := make(map[string]*regexp.Regexp, length/2)
|
|
||||||
for i := 0; i < length; i += 2 {
|
|
||||||
regex, err := regexp.Compile(pairs[i+1])
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
m[pairs[i]] = regex
|
|
||||||
}
|
|
||||||
return m, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// matchInArray returns true if the given string value is in the array.
|
|
||||||
func matchInArray(arr []string, value string) bool {
|
|
||||||
for _, v := range arr {
|
|
||||||
if v == value {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// matchMapWithString returns true if the given key/value pairs exist in a given map.
|
|
||||||
func matchMapWithString(toCheck map[string]string, toMatch map[string][]string, canonicalKey bool) bool {
|
|
||||||
for k, v := range toCheck {
|
|
||||||
// Check if key exists.
|
|
||||||
if canonicalKey {
|
|
||||||
k = http.CanonicalHeaderKey(k)
|
|
||||||
}
|
|
||||||
if values := toMatch[k]; values == nil {
|
|
||||||
return false
|
|
||||||
} else if v != "" {
|
|
||||||
// If value was defined as an empty string we only check that the
|
|
||||||
// key exists. Otherwise we also check for equality.
|
|
||||||
valueExists := false
|
|
||||||
for _, value := range values {
|
|
||||||
if v == value {
|
|
||||||
valueExists = true
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if !valueExists {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// matchMapWithRegex returns true if the given key/value pairs exist in a given map compiled against
|
|
||||||
// the given regex
|
|
||||||
func matchMapWithRegex(toCheck map[string]*regexp.Regexp, toMatch map[string][]string, canonicalKey bool) bool {
|
|
||||||
for k, v := range toCheck {
|
|
||||||
// Check if key exists.
|
|
||||||
if canonicalKey {
|
|
||||||
k = http.CanonicalHeaderKey(k)
|
|
||||||
}
|
|
||||||
if values := toMatch[k]; values == nil {
|
|
||||||
return false
|
|
||||||
} else if v != nil {
|
|
||||||
// If value was defined as an empty string we only check that the
|
|
||||||
// key exists. Otherwise we also check for equality.
|
|
||||||
valueExists := false
|
|
||||||
for _, value := range values {
|
|
||||||
if v.MatchString(value) {
|
|
||||||
valueExists = true
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if !valueExists {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// methodNotAllowed replies to the request with an HTTP status code 405.
|
|
||||||
func methodNotAllowed(w http.ResponseWriter, r *http.Request) {
|
|
||||||
w.WriteHeader(http.StatusMethodNotAllowed)
|
|
||||||
}
|
|
||||||
|
|
||||||
// methodNotAllowedHandler returns a simple request handler
|
|
||||||
// that replies to each request with a status code 405.
|
|
||||||
func methodNotAllowedHandler() http.Handler { return http.HandlerFunc(methodNotAllowed) }
|
|
332
vendor/github.com/gorilla/mux/regexp.go
generated
vendored
332
vendor/github.com/gorilla/mux/regexp.go
generated
vendored
|
@ -1,332 +0,0 @@
|
||||||
// Copyright 2012 The Gorilla 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 mux
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"fmt"
|
|
||||||
"net/http"
|
|
||||||
"net/url"
|
|
||||||
"regexp"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
type routeRegexpOptions struct {
|
|
||||||
strictSlash bool
|
|
||||||
useEncodedPath bool
|
|
||||||
}
|
|
||||||
|
|
||||||
type regexpType int
|
|
||||||
|
|
||||||
const (
|
|
||||||
regexpTypePath regexpType = 0
|
|
||||||
regexpTypeHost regexpType = 1
|
|
||||||
regexpTypePrefix regexpType = 2
|
|
||||||
regexpTypeQuery regexpType = 3
|
|
||||||
)
|
|
||||||
|
|
||||||
// newRouteRegexp parses a route template and returns a routeRegexp,
|
|
||||||
// used to match a host, a path or a query string.
|
|
||||||
//
|
|
||||||
// It will extract named variables, assemble a regexp to be matched, create
|
|
||||||
// a "reverse" template to build URLs and compile regexps to validate variable
|
|
||||||
// values used in URL building.
|
|
||||||
//
|
|
||||||
// Previously we accepted only Python-like identifiers for variable
|
|
||||||
// names ([a-zA-Z_][a-zA-Z0-9_]*), but currently the only restriction is that
|
|
||||||
// name and pattern can't be empty, and names can't contain a colon.
|
|
||||||
func newRouteRegexp(tpl string, typ regexpType, options routeRegexpOptions) (*routeRegexp, error) {
|
|
||||||
// Check if it is well-formed.
|
|
||||||
idxs, errBraces := braceIndices(tpl)
|
|
||||||
if errBraces != nil {
|
|
||||||
return nil, errBraces
|
|
||||||
}
|
|
||||||
// Backup the original.
|
|
||||||
template := tpl
|
|
||||||
// Now let's parse it.
|
|
||||||
defaultPattern := "[^/]+"
|
|
||||||
if typ == regexpTypeQuery {
|
|
||||||
defaultPattern = ".*"
|
|
||||||
} else if typ == regexpTypeHost {
|
|
||||||
defaultPattern = "[^.]+"
|
|
||||||
}
|
|
||||||
// Only match strict slash if not matching
|
|
||||||
if typ != regexpTypePath {
|
|
||||||
options.strictSlash = false
|
|
||||||
}
|
|
||||||
// Set a flag for strictSlash.
|
|
||||||
endSlash := false
|
|
||||||
if options.strictSlash && strings.HasSuffix(tpl, "/") {
|
|
||||||
tpl = tpl[:len(tpl)-1]
|
|
||||||
endSlash = true
|
|
||||||
}
|
|
||||||
varsN := make([]string, len(idxs)/2)
|
|
||||||
varsR := make([]*regexp.Regexp, len(idxs)/2)
|
|
||||||
pattern := bytes.NewBufferString("")
|
|
||||||
pattern.WriteByte('^')
|
|
||||||
reverse := bytes.NewBufferString("")
|
|
||||||
var end int
|
|
||||||
var err error
|
|
||||||
for i := 0; i < len(idxs); i += 2 {
|
|
||||||
// Set all values we are interested in.
|
|
||||||
raw := tpl[end:idxs[i]]
|
|
||||||
end = idxs[i+1]
|
|
||||||
parts := strings.SplitN(tpl[idxs[i]+1:end-1], ":", 2)
|
|
||||||
name := parts[0]
|
|
||||||
patt := defaultPattern
|
|
||||||
if len(parts) == 2 {
|
|
||||||
patt = parts[1]
|
|
||||||
}
|
|
||||||
// Name or pattern can't be empty.
|
|
||||||
if name == "" || patt == "" {
|
|
||||||
return nil, fmt.Errorf("mux: missing name or pattern in %q",
|
|
||||||
tpl[idxs[i]:end])
|
|
||||||
}
|
|
||||||
// Build the regexp pattern.
|
|
||||||
fmt.Fprintf(pattern, "%s(?P<%s>%s)", regexp.QuoteMeta(raw), varGroupName(i/2), patt)
|
|
||||||
|
|
||||||
// Build the reverse template.
|
|
||||||
fmt.Fprintf(reverse, "%s%%s", raw)
|
|
||||||
|
|
||||||
// Append variable name and compiled pattern.
|
|
||||||
varsN[i/2] = name
|
|
||||||
varsR[i/2], err = regexp.Compile(fmt.Sprintf("^%s$", patt))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Add the remaining.
|
|
||||||
raw := tpl[end:]
|
|
||||||
pattern.WriteString(regexp.QuoteMeta(raw))
|
|
||||||
if options.strictSlash {
|
|
||||||
pattern.WriteString("[/]?")
|
|
||||||
}
|
|
||||||
if typ == regexpTypeQuery {
|
|
||||||
// Add the default pattern if the query value is empty
|
|
||||||
if queryVal := strings.SplitN(template, "=", 2)[1]; queryVal == "" {
|
|
||||||
pattern.WriteString(defaultPattern)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if typ != regexpTypePrefix {
|
|
||||||
pattern.WriteByte('$')
|
|
||||||
}
|
|
||||||
reverse.WriteString(raw)
|
|
||||||
if endSlash {
|
|
||||||
reverse.WriteByte('/')
|
|
||||||
}
|
|
||||||
// Compile full regexp.
|
|
||||||
reg, errCompile := regexp.Compile(pattern.String())
|
|
||||||
if errCompile != nil {
|
|
||||||
return nil, errCompile
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for capturing groups which used to work in older versions
|
|
||||||
if reg.NumSubexp() != len(idxs)/2 {
|
|
||||||
panic(fmt.Sprintf("route %s contains capture groups in its regexp. ", template) +
|
|
||||||
"Only non-capturing groups are accepted: e.g. (?:pattern) instead of (pattern)")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Done!
|
|
||||||
return &routeRegexp{
|
|
||||||
template: template,
|
|
||||||
regexpType: typ,
|
|
||||||
options: options,
|
|
||||||
regexp: reg,
|
|
||||||
reverse: reverse.String(),
|
|
||||||
varsN: varsN,
|
|
||||||
varsR: varsR,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// routeRegexp stores a regexp to match a host or path and information to
|
|
||||||
// collect and validate route variables.
|
|
||||||
type routeRegexp struct {
|
|
||||||
// The unmodified template.
|
|
||||||
template string
|
|
||||||
// The type of match
|
|
||||||
regexpType regexpType
|
|
||||||
// Options for matching
|
|
||||||
options routeRegexpOptions
|
|
||||||
// Expanded regexp.
|
|
||||||
regexp *regexp.Regexp
|
|
||||||
// Reverse template.
|
|
||||||
reverse string
|
|
||||||
// Variable names.
|
|
||||||
varsN []string
|
|
||||||
// Variable regexps (validators).
|
|
||||||
varsR []*regexp.Regexp
|
|
||||||
}
|
|
||||||
|
|
||||||
// Match matches the regexp against the URL host or path.
|
|
||||||
func (r *routeRegexp) Match(req *http.Request, match *RouteMatch) bool {
|
|
||||||
if r.regexpType != regexpTypeHost {
|
|
||||||
if r.regexpType == regexpTypeQuery {
|
|
||||||
return r.matchQueryString(req)
|
|
||||||
}
|
|
||||||
path := req.URL.Path
|
|
||||||
if r.options.useEncodedPath {
|
|
||||||
path = req.URL.EscapedPath()
|
|
||||||
}
|
|
||||||
return r.regexp.MatchString(path)
|
|
||||||
}
|
|
||||||
|
|
||||||
return r.regexp.MatchString(getHost(req))
|
|
||||||
}
|
|
||||||
|
|
||||||
// url builds a URL part using the given values.
|
|
||||||
func (r *routeRegexp) url(values map[string]string) (string, error) {
|
|
||||||
urlValues := make([]interface{}, len(r.varsN))
|
|
||||||
for k, v := range r.varsN {
|
|
||||||
value, ok := values[v]
|
|
||||||
if !ok {
|
|
||||||
return "", fmt.Errorf("mux: missing route variable %q", v)
|
|
||||||
}
|
|
||||||
if r.regexpType == regexpTypeQuery {
|
|
||||||
value = url.QueryEscape(value)
|
|
||||||
}
|
|
||||||
urlValues[k] = value
|
|
||||||
}
|
|
||||||
rv := fmt.Sprintf(r.reverse, urlValues...)
|
|
||||||
if !r.regexp.MatchString(rv) {
|
|
||||||
// The URL is checked against the full regexp, instead of checking
|
|
||||||
// individual variables. This is faster but to provide a good error
|
|
||||||
// message, we check individual regexps if the URL doesn't match.
|
|
||||||
for k, v := range r.varsN {
|
|
||||||
if !r.varsR[k].MatchString(values[v]) {
|
|
||||||
return "", fmt.Errorf(
|
|
||||||
"mux: variable %q doesn't match, expected %q", values[v],
|
|
||||||
r.varsR[k].String())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return rv, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// getURLQuery returns a single query parameter from a request URL.
|
|
||||||
// For a URL with foo=bar&baz=ding, we return only the relevant key
|
|
||||||
// value pair for the routeRegexp.
|
|
||||||
func (r *routeRegexp) getURLQuery(req *http.Request) string {
|
|
||||||
if r.regexpType != regexpTypeQuery {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
templateKey := strings.SplitN(r.template, "=", 2)[0]
|
|
||||||
for key, vals := range req.URL.Query() {
|
|
||||||
if key == templateKey && len(vals) > 0 {
|
|
||||||
return key + "=" + vals[0]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *routeRegexp) matchQueryString(req *http.Request) bool {
|
|
||||||
return r.regexp.MatchString(r.getURLQuery(req))
|
|
||||||
}
|
|
||||||
|
|
||||||
// braceIndices returns the first level curly brace indices from a string.
|
|
||||||
// It returns an error in case of unbalanced braces.
|
|
||||||
func braceIndices(s string) ([]int, error) {
|
|
||||||
var level, idx int
|
|
||||||
var idxs []int
|
|
||||||
for i := 0; i < len(s); i++ {
|
|
||||||
switch s[i] {
|
|
||||||
case '{':
|
|
||||||
if level++; level == 1 {
|
|
||||||
idx = i
|
|
||||||
}
|
|
||||||
case '}':
|
|
||||||
if level--; level == 0 {
|
|
||||||
idxs = append(idxs, idx, i+1)
|
|
||||||
} else if level < 0 {
|
|
||||||
return nil, fmt.Errorf("mux: unbalanced braces in %q", s)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if level != 0 {
|
|
||||||
return nil, fmt.Errorf("mux: unbalanced braces in %q", s)
|
|
||||||
}
|
|
||||||
return idxs, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// varGroupName builds a capturing group name for the indexed variable.
|
|
||||||
func varGroupName(idx int) string {
|
|
||||||
return "v" + strconv.Itoa(idx)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// routeRegexpGroup
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// routeRegexpGroup groups the route matchers that carry variables.
|
|
||||||
type routeRegexpGroup struct {
|
|
||||||
host *routeRegexp
|
|
||||||
path *routeRegexp
|
|
||||||
queries []*routeRegexp
|
|
||||||
}
|
|
||||||
|
|
||||||
// setMatch extracts the variables from the URL once a route matches.
|
|
||||||
func (v *routeRegexpGroup) setMatch(req *http.Request, m *RouteMatch, r *Route) {
|
|
||||||
// Store host variables.
|
|
||||||
if v.host != nil {
|
|
||||||
host := getHost(req)
|
|
||||||
matches := v.host.regexp.FindStringSubmatchIndex(host)
|
|
||||||
if len(matches) > 0 {
|
|
||||||
extractVars(host, matches, v.host.varsN, m.Vars)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
path := req.URL.Path
|
|
||||||
if r.useEncodedPath {
|
|
||||||
path = req.URL.EscapedPath()
|
|
||||||
}
|
|
||||||
// Store path variables.
|
|
||||||
if v.path != nil {
|
|
||||||
matches := v.path.regexp.FindStringSubmatchIndex(path)
|
|
||||||
if len(matches) > 0 {
|
|
||||||
extractVars(path, matches, v.path.varsN, m.Vars)
|
|
||||||
// Check if we should redirect.
|
|
||||||
if v.path.options.strictSlash {
|
|
||||||
p1 := strings.HasSuffix(path, "/")
|
|
||||||
p2 := strings.HasSuffix(v.path.template, "/")
|
|
||||||
if p1 != p2 {
|
|
||||||
u, _ := url.Parse(req.URL.String())
|
|
||||||
if p1 {
|
|
||||||
u.Path = u.Path[:len(u.Path)-1]
|
|
||||||
} else {
|
|
||||||
u.Path += "/"
|
|
||||||
}
|
|
||||||
m.Handler = http.RedirectHandler(u.String(), 301)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Store query string variables.
|
|
||||||
for _, q := range v.queries {
|
|
||||||
queryURL := q.getURLQuery(req)
|
|
||||||
matches := q.regexp.FindStringSubmatchIndex(queryURL)
|
|
||||||
if len(matches) > 0 {
|
|
||||||
extractVars(queryURL, matches, q.varsN, m.Vars)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// getHost tries its best to return the request host.
|
|
||||||
func getHost(r *http.Request) string {
|
|
||||||
if r.URL.IsAbs() {
|
|
||||||
return r.URL.Host
|
|
||||||
}
|
|
||||||
host := r.Host
|
|
||||||
// Slice off any port information.
|
|
||||||
if i := strings.Index(host, ":"); i != -1 {
|
|
||||||
host = host[:i]
|
|
||||||
}
|
|
||||||
return host
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func extractVars(input string, matches []int, names []string, output map[string]string) {
|
|
||||||
for i, name := range names {
|
|
||||||
output[name] = input[matches[2*i+2]:matches[2*i+3]]
|
|
||||||
}
|
|
||||||
}
|
|
763
vendor/github.com/gorilla/mux/route.go
generated
vendored
763
vendor/github.com/gorilla/mux/route.go
generated
vendored
|
@ -1,763 +0,0 @@
|
||||||
// Copyright 2012 The Gorilla 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 mux
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"net/http"
|
|
||||||
"net/url"
|
|
||||||
"regexp"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Route stores information to match a request and build URLs.
|
|
||||||
type Route struct {
|
|
||||||
// Parent where the route was registered (a Router).
|
|
||||||
parent parentRoute
|
|
||||||
// Request handler for the route.
|
|
||||||
handler http.Handler
|
|
||||||
// List of matchers.
|
|
||||||
matchers []matcher
|
|
||||||
// Manager for the variables from host and path.
|
|
||||||
regexp *routeRegexpGroup
|
|
||||||
// If true, when the path pattern is "/path/", accessing "/path" will
|
|
||||||
// redirect to the former and vice versa.
|
|
||||||
strictSlash bool
|
|
||||||
// If true, when the path pattern is "/path//to", accessing "/path//to"
|
|
||||||
// will not redirect
|
|
||||||
skipClean bool
|
|
||||||
// If true, "/path/foo%2Fbar/to" will match the path "/path/{var}/to"
|
|
||||||
useEncodedPath bool
|
|
||||||
// The scheme used when building URLs.
|
|
||||||
buildScheme string
|
|
||||||
// If true, this route never matches: it is only used to build URLs.
|
|
||||||
buildOnly bool
|
|
||||||
// The name used to build URLs.
|
|
||||||
name string
|
|
||||||
// Error resulted from building a route.
|
|
||||||
err error
|
|
||||||
|
|
||||||
buildVarsFunc BuildVarsFunc
|
|
||||||
}
|
|
||||||
|
|
||||||
// SkipClean reports whether path cleaning is enabled for this route via
|
|
||||||
// Router.SkipClean.
|
|
||||||
func (r *Route) SkipClean() bool {
|
|
||||||
return r.skipClean
|
|
||||||
}
|
|
||||||
|
|
||||||
// Match matches the route against the request.
|
|
||||||
func (r *Route) Match(req *http.Request, match *RouteMatch) bool {
|
|
||||||
if r.buildOnly || r.err != nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
var matchErr error
|
|
||||||
|
|
||||||
// Match everything.
|
|
||||||
for _, m := range r.matchers {
|
|
||||||
if matched := m.Match(req, match); !matched {
|
|
||||||
if _, ok := m.(methodMatcher); ok {
|
|
||||||
matchErr = ErrMethodMismatch
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
matchErr = nil
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if matchErr != nil {
|
|
||||||
match.MatchErr = matchErr
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
if match.MatchErr == ErrMethodMismatch {
|
|
||||||
// We found a route which matches request method, clear MatchErr
|
|
||||||
match.MatchErr = nil
|
|
||||||
// Then override the mis-matched handler
|
|
||||||
match.Handler = r.handler
|
|
||||||
}
|
|
||||||
|
|
||||||
// Yay, we have a match. Let's collect some info about it.
|
|
||||||
if match.Route == nil {
|
|
||||||
match.Route = r
|
|
||||||
}
|
|
||||||
if match.Handler == nil {
|
|
||||||
match.Handler = r.handler
|
|
||||||
}
|
|
||||||
if match.Vars == nil {
|
|
||||||
match.Vars = make(map[string]string)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set variables.
|
|
||||||
if r.regexp != nil {
|
|
||||||
r.regexp.setMatch(req, match, r)
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// Route attributes
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// GetError returns an error resulted from building the route, if any.
|
|
||||||
func (r *Route) GetError() error {
|
|
||||||
return r.err
|
|
||||||
}
|
|
||||||
|
|
||||||
// BuildOnly sets the route to never match: it is only used to build URLs.
|
|
||||||
func (r *Route) BuildOnly() *Route {
|
|
||||||
r.buildOnly = true
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handler --------------------------------------------------------------------
|
|
||||||
|
|
||||||
// Handler sets a handler for the route.
|
|
||||||
func (r *Route) Handler(handler http.Handler) *Route {
|
|
||||||
if r.err == nil {
|
|
||||||
r.handler = handler
|
|
||||||
}
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
// HandlerFunc sets a handler function for the route.
|
|
||||||
func (r *Route) HandlerFunc(f func(http.ResponseWriter, *http.Request)) *Route {
|
|
||||||
return r.Handler(http.HandlerFunc(f))
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetHandler returns the handler for the route, if any.
|
|
||||||
func (r *Route) GetHandler() http.Handler {
|
|
||||||
return r.handler
|
|
||||||
}
|
|
||||||
|
|
||||||
// Name -----------------------------------------------------------------------
|
|
||||||
|
|
||||||
// Name sets the name for the route, used to build URLs.
|
|
||||||
// If the name was registered already it will be overwritten.
|
|
||||||
func (r *Route) Name(name string) *Route {
|
|
||||||
if r.name != "" {
|
|
||||||
r.err = fmt.Errorf("mux: route already has name %q, can't set %q",
|
|
||||||
r.name, name)
|
|
||||||
}
|
|
||||||
if r.err == nil {
|
|
||||||
r.name = name
|
|
||||||
r.getNamedRoutes()[name] = r
|
|
||||||
}
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetName returns the name for the route, if any.
|
|
||||||
func (r *Route) GetName() string {
|
|
||||||
return r.name
|
|
||||||
}
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// Matchers
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// matcher types try to match a request.
|
|
||||||
type matcher interface {
|
|
||||||
Match(*http.Request, *RouteMatch) bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// addMatcher adds a matcher to the route.
|
|
||||||
func (r *Route) addMatcher(m matcher) *Route {
|
|
||||||
if r.err == nil {
|
|
||||||
r.matchers = append(r.matchers, m)
|
|
||||||
}
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
// addRegexpMatcher adds a host or path matcher and builder to a route.
|
|
||||||
func (r *Route) addRegexpMatcher(tpl string, typ regexpType) error {
|
|
||||||
if r.err != nil {
|
|
||||||
return r.err
|
|
||||||
}
|
|
||||||
r.regexp = r.getRegexpGroup()
|
|
||||||
if typ == regexpTypePath || typ == regexpTypePrefix {
|
|
||||||
if len(tpl) > 0 && tpl[0] != '/' {
|
|
||||||
return fmt.Errorf("mux: path must start with a slash, got %q", tpl)
|
|
||||||
}
|
|
||||||
if r.regexp.path != nil {
|
|
||||||
tpl = strings.TrimRight(r.regexp.path.template, "/") + tpl
|
|
||||||
}
|
|
||||||
}
|
|
||||||
rr, err := newRouteRegexp(tpl, typ, routeRegexpOptions{
|
|
||||||
strictSlash: r.strictSlash,
|
|
||||||
useEncodedPath: r.useEncodedPath,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
for _, q := range r.regexp.queries {
|
|
||||||
if err = uniqueVars(rr.varsN, q.varsN); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if typ == regexpTypeHost {
|
|
||||||
if r.regexp.path != nil {
|
|
||||||
if err = uniqueVars(rr.varsN, r.regexp.path.varsN); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
r.regexp.host = rr
|
|
||||||
} else {
|
|
||||||
if r.regexp.host != nil {
|
|
||||||
if err = uniqueVars(rr.varsN, r.regexp.host.varsN); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if typ == regexpTypeQuery {
|
|
||||||
r.regexp.queries = append(r.regexp.queries, rr)
|
|
||||||
} else {
|
|
||||||
r.regexp.path = rr
|
|
||||||
}
|
|
||||||
}
|
|
||||||
r.addMatcher(rr)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Headers --------------------------------------------------------------------
|
|
||||||
|
|
||||||
// headerMatcher matches the request against header values.
|
|
||||||
type headerMatcher map[string]string
|
|
||||||
|
|
||||||
func (m headerMatcher) Match(r *http.Request, match *RouteMatch) bool {
|
|
||||||
return matchMapWithString(m, r.Header, true)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Headers adds a matcher for request header values.
|
|
||||||
// It accepts a sequence of key/value pairs to be matched. For example:
|
|
||||||
//
|
|
||||||
// r := mux.NewRouter()
|
|
||||||
// r.Headers("Content-Type", "application/json",
|
|
||||||
// "X-Requested-With", "XMLHttpRequest")
|
|
||||||
//
|
|
||||||
// The above route will only match if both request header values match.
|
|
||||||
// If the value is an empty string, it will match any value if the key is set.
|
|
||||||
func (r *Route) Headers(pairs ...string) *Route {
|
|
||||||
if r.err == nil {
|
|
||||||
var headers map[string]string
|
|
||||||
headers, r.err = mapFromPairsToString(pairs...)
|
|
||||||
return r.addMatcher(headerMatcher(headers))
|
|
||||||
}
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
// headerRegexMatcher matches the request against the route given a regex for the header
|
|
||||||
type headerRegexMatcher map[string]*regexp.Regexp
|
|
||||||
|
|
||||||
func (m headerRegexMatcher) Match(r *http.Request, match *RouteMatch) bool {
|
|
||||||
return matchMapWithRegex(m, r.Header, true)
|
|
||||||
}
|
|
||||||
|
|
||||||
// HeadersRegexp accepts a sequence of key/value pairs, where the value has regex
|
|
||||||
// support. For example:
|
|
||||||
//
|
|
||||||
// r := mux.NewRouter()
|
|
||||||
// r.HeadersRegexp("Content-Type", "application/(text|json)",
|
|
||||||
// "X-Requested-With", "XMLHttpRequest")
|
|
||||||
//
|
|
||||||
// The above route will only match if both the request header matches both regular expressions.
|
|
||||||
// If the value is an empty string, it will match any value if the key is set.
|
|
||||||
// Use the start and end of string anchors (^ and $) to match an exact value.
|
|
||||||
func (r *Route) HeadersRegexp(pairs ...string) *Route {
|
|
||||||
if r.err == nil {
|
|
||||||
var headers map[string]*regexp.Regexp
|
|
||||||
headers, r.err = mapFromPairsToRegex(pairs...)
|
|
||||||
return r.addMatcher(headerRegexMatcher(headers))
|
|
||||||
}
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
// Host -----------------------------------------------------------------------
|
|
||||||
|
|
||||||
// Host adds a matcher for the URL host.
|
|
||||||
// It accepts a template with zero or more URL variables enclosed by {}.
|
|
||||||
// Variables can define an optional regexp pattern to be matched:
|
|
||||||
//
|
|
||||||
// - {name} matches anything until the next dot.
|
|
||||||
//
|
|
||||||
// - {name:pattern} matches the given regexp pattern.
|
|
||||||
//
|
|
||||||
// For example:
|
|
||||||
//
|
|
||||||
// r := mux.NewRouter()
|
|
||||||
// r.Host("www.example.com")
|
|
||||||
// r.Host("{subdomain}.domain.com")
|
|
||||||
// r.Host("{subdomain:[a-z]+}.domain.com")
|
|
||||||
//
|
|
||||||
// Variable names must be unique in a given route. They can be retrieved
|
|
||||||
// calling mux.Vars(request).
|
|
||||||
func (r *Route) Host(tpl string) *Route {
|
|
||||||
r.err = r.addRegexpMatcher(tpl, regexpTypeHost)
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
// MatcherFunc ----------------------------------------------------------------
|
|
||||||
|
|
||||||
// MatcherFunc is the function signature used by custom matchers.
|
|
||||||
type MatcherFunc func(*http.Request, *RouteMatch) bool
|
|
||||||
|
|
||||||
// Match returns the match for a given request.
|
|
||||||
func (m MatcherFunc) Match(r *http.Request, match *RouteMatch) bool {
|
|
||||||
return m(r, match)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MatcherFunc adds a custom function to be used as request matcher.
|
|
||||||
func (r *Route) MatcherFunc(f MatcherFunc) *Route {
|
|
||||||
return r.addMatcher(f)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Methods --------------------------------------------------------------------
|
|
||||||
|
|
||||||
// methodMatcher matches the request against HTTP methods.
|
|
||||||
type methodMatcher []string
|
|
||||||
|
|
||||||
func (m methodMatcher) Match(r *http.Request, match *RouteMatch) bool {
|
|
||||||
return matchInArray(m, r.Method)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Methods adds a matcher for HTTP methods.
|
|
||||||
// It accepts a sequence of one or more methods to be matched, e.g.:
|
|
||||||
// "GET", "POST", "PUT".
|
|
||||||
func (r *Route) Methods(methods ...string) *Route {
|
|
||||||
for k, v := range methods {
|
|
||||||
methods[k] = strings.ToUpper(v)
|
|
||||||
}
|
|
||||||
return r.addMatcher(methodMatcher(methods))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Path -----------------------------------------------------------------------
|
|
||||||
|
|
||||||
// Path adds a matcher for the URL path.
|
|
||||||
// It accepts a template with zero or more URL variables enclosed by {}. The
|
|
||||||
// template must start with a "/".
|
|
||||||
// Variables can define an optional regexp pattern to be matched:
|
|
||||||
//
|
|
||||||
// - {name} matches anything until the next slash.
|
|
||||||
//
|
|
||||||
// - {name:pattern} matches the given regexp pattern.
|
|
||||||
//
|
|
||||||
// For example:
|
|
||||||
//
|
|
||||||
// r := mux.NewRouter()
|
|
||||||
// r.Path("/products/").Handler(ProductsHandler)
|
|
||||||
// r.Path("/products/{key}").Handler(ProductsHandler)
|
|
||||||
// r.Path("/articles/{category}/{id:[0-9]+}").
|
|
||||||
// Handler(ArticleHandler)
|
|
||||||
//
|
|
||||||
// Variable names must be unique in a given route. They can be retrieved
|
|
||||||
// calling mux.Vars(request).
|
|
||||||
func (r *Route) Path(tpl string) *Route {
|
|
||||||
r.err = r.addRegexpMatcher(tpl, regexpTypePath)
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
// PathPrefix -----------------------------------------------------------------
|
|
||||||
|
|
||||||
// PathPrefix adds a matcher for the URL path prefix. This matches if the given
|
|
||||||
// template is a prefix of the full URL path. See Route.Path() for details on
|
|
||||||
// the tpl argument.
|
|
||||||
//
|
|
||||||
// Note that it does not treat slashes specially ("/foobar/" will be matched by
|
|
||||||
// the prefix "/foo") so you may want to use a trailing slash here.
|
|
||||||
//
|
|
||||||
// Also note that the setting of Router.StrictSlash() has no effect on routes
|
|
||||||
// with a PathPrefix matcher.
|
|
||||||
func (r *Route) PathPrefix(tpl string) *Route {
|
|
||||||
r.err = r.addRegexpMatcher(tpl, regexpTypePrefix)
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
// Query ----------------------------------------------------------------------
|
|
||||||
|
|
||||||
// Queries adds a matcher for URL query values.
|
|
||||||
// It accepts a sequence of key/value pairs. Values may define variables.
|
|
||||||
// For example:
|
|
||||||
//
|
|
||||||
// r := mux.NewRouter()
|
|
||||||
// r.Queries("foo", "bar", "id", "{id:[0-9]+}")
|
|
||||||
//
|
|
||||||
// The above route will only match if the URL contains the defined queries
|
|
||||||
// values, e.g.: ?foo=bar&id=42.
|
|
||||||
//
|
|
||||||
// It the value is an empty string, it will match any value if the key is set.
|
|
||||||
//
|
|
||||||
// Variables can define an optional regexp pattern to be matched:
|
|
||||||
//
|
|
||||||
// - {name} matches anything until the next slash.
|
|
||||||
//
|
|
||||||
// - {name:pattern} matches the given regexp pattern.
|
|
||||||
func (r *Route) Queries(pairs ...string) *Route {
|
|
||||||
length := len(pairs)
|
|
||||||
if length%2 != 0 {
|
|
||||||
r.err = fmt.Errorf(
|
|
||||||
"mux: number of parameters must be multiple of 2, got %v", pairs)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
for i := 0; i < length; i += 2 {
|
|
||||||
if r.err = r.addRegexpMatcher(pairs[i]+"="+pairs[i+1], regexpTypeQuery); r.err != nil {
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
// Schemes --------------------------------------------------------------------
|
|
||||||
|
|
||||||
// schemeMatcher matches the request against URL schemes.
|
|
||||||
type schemeMatcher []string
|
|
||||||
|
|
||||||
func (m schemeMatcher) Match(r *http.Request, match *RouteMatch) bool {
|
|
||||||
return matchInArray(m, r.URL.Scheme)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Schemes adds a matcher for URL schemes.
|
|
||||||
// It accepts a sequence of schemes to be matched, e.g.: "http", "https".
|
|
||||||
func (r *Route) Schemes(schemes ...string) *Route {
|
|
||||||
for k, v := range schemes {
|
|
||||||
schemes[k] = strings.ToLower(v)
|
|
||||||
}
|
|
||||||
if r.buildScheme == "" && len(schemes) > 0 {
|
|
||||||
r.buildScheme = schemes[0]
|
|
||||||
}
|
|
||||||
return r.addMatcher(schemeMatcher(schemes))
|
|
||||||
}
|
|
||||||
|
|
||||||
// BuildVarsFunc --------------------------------------------------------------
|
|
||||||
|
|
||||||
// BuildVarsFunc is the function signature used by custom build variable
|
|
||||||
// functions (which can modify route variables before a route's URL is built).
|
|
||||||
type BuildVarsFunc func(map[string]string) map[string]string
|
|
||||||
|
|
||||||
// BuildVarsFunc adds a custom function to be used to modify build variables
|
|
||||||
// before a route's URL is built.
|
|
||||||
func (r *Route) BuildVarsFunc(f BuildVarsFunc) *Route {
|
|
||||||
r.buildVarsFunc = f
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
// Subrouter ------------------------------------------------------------------
|
|
||||||
|
|
||||||
// Subrouter creates a subrouter for the route.
|
|
||||||
//
|
|
||||||
// It will test the inner routes only if the parent route matched. For example:
|
|
||||||
//
|
|
||||||
// r := mux.NewRouter()
|
|
||||||
// s := r.Host("www.example.com").Subrouter()
|
|
||||||
// s.HandleFunc("/products/", ProductsHandler)
|
|
||||||
// s.HandleFunc("/products/{key}", ProductHandler)
|
|
||||||
// s.HandleFunc("/articles/{category}/{id:[0-9]+}"), ArticleHandler)
|
|
||||||
//
|
|
||||||
// Here, the routes registered in the subrouter won't be tested if the host
|
|
||||||
// doesn't match.
|
|
||||||
func (r *Route) Subrouter() *Router {
|
|
||||||
router := &Router{parent: r, strictSlash: r.strictSlash}
|
|
||||||
r.addMatcher(router)
|
|
||||||
return router
|
|
||||||
}
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// URL building
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// URL builds a URL for the route.
|
|
||||||
//
|
|
||||||
// It accepts a sequence of key/value pairs for the route variables. For
|
|
||||||
// example, given this route:
|
|
||||||
//
|
|
||||||
// r := mux.NewRouter()
|
|
||||||
// r.HandleFunc("/articles/{category}/{id:[0-9]+}", ArticleHandler).
|
|
||||||
// Name("article")
|
|
||||||
//
|
|
||||||
// ...a URL for it can be built using:
|
|
||||||
//
|
|
||||||
// url, err := r.Get("article").URL("category", "technology", "id", "42")
|
|
||||||
//
|
|
||||||
// ...which will return an url.URL with the following path:
|
|
||||||
//
|
|
||||||
// "/articles/technology/42"
|
|
||||||
//
|
|
||||||
// This also works for host variables:
|
|
||||||
//
|
|
||||||
// r := mux.NewRouter()
|
|
||||||
// r.Host("{subdomain}.domain.com").
|
|
||||||
// HandleFunc("/articles/{category}/{id:[0-9]+}", ArticleHandler).
|
|
||||||
// Name("article")
|
|
||||||
//
|
|
||||||
// // url.String() will be "http://news.domain.com/articles/technology/42"
|
|
||||||
// url, err := r.Get("article").URL("subdomain", "news",
|
|
||||||
// "category", "technology",
|
|
||||||
// "id", "42")
|
|
||||||
//
|
|
||||||
// All variables defined in the route are required, and their values must
|
|
||||||
// conform to the corresponding patterns.
|
|
||||||
func (r *Route) URL(pairs ...string) (*url.URL, error) {
|
|
||||||
if r.err != nil {
|
|
||||||
return nil, r.err
|
|
||||||
}
|
|
||||||
if r.regexp == nil {
|
|
||||||
return nil, errors.New("mux: route doesn't have a host or path")
|
|
||||||
}
|
|
||||||
values, err := r.prepareVars(pairs...)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
var scheme, host, path string
|
|
||||||
queries := make([]string, 0, len(r.regexp.queries))
|
|
||||||
if r.regexp.host != nil {
|
|
||||||
if host, err = r.regexp.host.url(values); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
scheme = "http"
|
|
||||||
if s := r.getBuildScheme(); s != "" {
|
|
||||||
scheme = s
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if r.regexp.path != nil {
|
|
||||||
if path, err = r.regexp.path.url(values); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, q := range r.regexp.queries {
|
|
||||||
var query string
|
|
||||||
if query, err = q.url(values); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
queries = append(queries, query)
|
|
||||||
}
|
|
||||||
return &url.URL{
|
|
||||||
Scheme: scheme,
|
|
||||||
Host: host,
|
|
||||||
Path: path,
|
|
||||||
RawQuery: strings.Join(queries, "&"),
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// URLHost builds the host part of the URL for a route. See Route.URL().
|
|
||||||
//
|
|
||||||
// The route must have a host defined.
|
|
||||||
func (r *Route) URLHost(pairs ...string) (*url.URL, error) {
|
|
||||||
if r.err != nil {
|
|
||||||
return nil, r.err
|
|
||||||
}
|
|
||||||
if r.regexp == nil || r.regexp.host == nil {
|
|
||||||
return nil, errors.New("mux: route doesn't have a host")
|
|
||||||
}
|
|
||||||
values, err := r.prepareVars(pairs...)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
host, err := r.regexp.host.url(values)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
u := &url.URL{
|
|
||||||
Scheme: "http",
|
|
||||||
Host: host,
|
|
||||||
}
|
|
||||||
if s := r.getBuildScheme(); s != "" {
|
|
||||||
u.Scheme = s
|
|
||||||
}
|
|
||||||
return u, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// URLPath builds the path part of the URL for a route. See Route.URL().
|
|
||||||
//
|
|
||||||
// The route must have a path defined.
|
|
||||||
func (r *Route) URLPath(pairs ...string) (*url.URL, error) {
|
|
||||||
if r.err != nil {
|
|
||||||
return nil, r.err
|
|
||||||
}
|
|
||||||
if r.regexp == nil || r.regexp.path == nil {
|
|
||||||
return nil, errors.New("mux: route doesn't have a path")
|
|
||||||
}
|
|
||||||
values, err := r.prepareVars(pairs...)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
path, err := r.regexp.path.url(values)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &url.URL{
|
|
||||||
Path: path,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetPathTemplate returns the template used to build the
|
|
||||||
// route match.
|
|
||||||
// This is useful for building simple REST API documentation and for instrumentation
|
|
||||||
// against third-party services.
|
|
||||||
// An error will be returned if the route does not define a path.
|
|
||||||
func (r *Route) GetPathTemplate() (string, error) {
|
|
||||||
if r.err != nil {
|
|
||||||
return "", r.err
|
|
||||||
}
|
|
||||||
if r.regexp == nil || r.regexp.path == nil {
|
|
||||||
return "", errors.New("mux: route doesn't have a path")
|
|
||||||
}
|
|
||||||
return r.regexp.path.template, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetPathRegexp returns the expanded regular expression used to match route path.
|
|
||||||
// This is useful for building simple REST API documentation and for instrumentation
|
|
||||||
// against third-party services.
|
|
||||||
// An error will be returned if the route does not define a path.
|
|
||||||
func (r *Route) GetPathRegexp() (string, error) {
|
|
||||||
if r.err != nil {
|
|
||||||
return "", r.err
|
|
||||||
}
|
|
||||||
if r.regexp == nil || r.regexp.path == nil {
|
|
||||||
return "", errors.New("mux: route does not have a path")
|
|
||||||
}
|
|
||||||
return r.regexp.path.regexp.String(), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetQueriesRegexp returns the expanded regular expressions used to match the
|
|
||||||
// route queries.
|
|
||||||
// This is useful for building simple REST API documentation and for instrumentation
|
|
||||||
// against third-party services.
|
|
||||||
// An error will be returned if the route does not have queries.
|
|
||||||
func (r *Route) GetQueriesRegexp() ([]string, error) {
|
|
||||||
if r.err != nil {
|
|
||||||
return nil, r.err
|
|
||||||
}
|
|
||||||
if r.regexp == nil || r.regexp.queries == nil {
|
|
||||||
return nil, errors.New("mux: route doesn't have queries")
|
|
||||||
}
|
|
||||||
var queries []string
|
|
||||||
for _, query := range r.regexp.queries {
|
|
||||||
queries = append(queries, query.regexp.String())
|
|
||||||
}
|
|
||||||
return queries, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetQueriesTemplates returns the templates used to build the
|
|
||||||
// query matching.
|
|
||||||
// This is useful for building simple REST API documentation and for instrumentation
|
|
||||||
// against third-party services.
|
|
||||||
// An error will be returned if the route does not define queries.
|
|
||||||
func (r *Route) GetQueriesTemplates() ([]string, error) {
|
|
||||||
if r.err != nil {
|
|
||||||
return nil, r.err
|
|
||||||
}
|
|
||||||
if r.regexp == nil || r.regexp.queries == nil {
|
|
||||||
return nil, errors.New("mux: route doesn't have queries")
|
|
||||||
}
|
|
||||||
var queries []string
|
|
||||||
for _, query := range r.regexp.queries {
|
|
||||||
queries = append(queries, query.template)
|
|
||||||
}
|
|
||||||
return queries, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetMethods returns the methods the route matches against
|
|
||||||
// This is useful for building simple REST API documentation and for instrumentation
|
|
||||||
// against third-party services.
|
|
||||||
// An error will be returned if route does not have methods.
|
|
||||||
func (r *Route) GetMethods() ([]string, error) {
|
|
||||||
if r.err != nil {
|
|
||||||
return nil, r.err
|
|
||||||
}
|
|
||||||
for _, m := range r.matchers {
|
|
||||||
if methods, ok := m.(methodMatcher); ok {
|
|
||||||
return []string(methods), nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil, errors.New("mux: route doesn't have methods")
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetHostTemplate returns the template used to build the
|
|
||||||
// route match.
|
|
||||||
// This is useful for building simple REST API documentation and for instrumentation
|
|
||||||
// against third-party services.
|
|
||||||
// An error will be returned if the route does not define a host.
|
|
||||||
func (r *Route) GetHostTemplate() (string, error) {
|
|
||||||
if r.err != nil {
|
|
||||||
return "", r.err
|
|
||||||
}
|
|
||||||
if r.regexp == nil || r.regexp.host == nil {
|
|
||||||
return "", errors.New("mux: route doesn't have a host")
|
|
||||||
}
|
|
||||||
return r.regexp.host.template, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// prepareVars converts the route variable pairs into a map. If the route has a
|
|
||||||
// BuildVarsFunc, it is invoked.
|
|
||||||
func (r *Route) prepareVars(pairs ...string) (map[string]string, error) {
|
|
||||||
m, err := mapFromPairsToString(pairs...)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return r.buildVars(m), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *Route) buildVars(m map[string]string) map[string]string {
|
|
||||||
if r.parent != nil {
|
|
||||||
m = r.parent.buildVars(m)
|
|
||||||
}
|
|
||||||
if r.buildVarsFunc != nil {
|
|
||||||
m = r.buildVarsFunc(m)
|
|
||||||
}
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// parentRoute
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// parentRoute allows routes to know about parent host and path definitions.
|
|
||||||
type parentRoute interface {
|
|
||||||
getBuildScheme() string
|
|
||||||
getNamedRoutes() map[string]*Route
|
|
||||||
getRegexpGroup() *routeRegexpGroup
|
|
||||||
buildVars(map[string]string) map[string]string
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *Route) getBuildScheme() string {
|
|
||||||
if r.buildScheme != "" {
|
|
||||||
return r.buildScheme
|
|
||||||
}
|
|
||||||
if r.parent != nil {
|
|
||||||
return r.parent.getBuildScheme()
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// getNamedRoutes returns the map where named routes are registered.
|
|
||||||
func (r *Route) getNamedRoutes() map[string]*Route {
|
|
||||||
if r.parent == nil {
|
|
||||||
// During tests router is not always set.
|
|
||||||
r.parent = NewRouter()
|
|
||||||
}
|
|
||||||
return r.parent.getNamedRoutes()
|
|
||||||
}
|
|
||||||
|
|
||||||
// getRegexpGroup returns regexp definitions from this route.
|
|
||||||
func (r *Route) getRegexpGroup() *routeRegexpGroup {
|
|
||||||
if r.regexp == nil {
|
|
||||||
if r.parent == nil {
|
|
||||||
// During tests router is not always set.
|
|
||||||
r.parent = NewRouter()
|
|
||||||
}
|
|
||||||
regexp := r.parent.getRegexpGroup()
|
|
||||||
if regexp == nil {
|
|
||||||
r.regexp = new(routeRegexpGroup)
|
|
||||||
} else {
|
|
||||||
// Copy.
|
|
||||||
r.regexp = &routeRegexpGroup{
|
|
||||||
host: regexp.host,
|
|
||||||
path: regexp.path,
|
|
||||||
queries: regexp.queries,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return r.regexp
|
|
||||||
}
|
|
19
vendor/github.com/gorilla/mux/test_helpers.go
generated
vendored
19
vendor/github.com/gorilla/mux/test_helpers.go
generated
vendored
|
@ -1,19 +0,0 @@
|
||||||
// Copyright 2012 The Gorilla 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 mux
|
|
||||||
|
|
||||||
import "net/http"
|
|
||||||
|
|
||||||
// SetURLVars sets the URL variables for the given request, to be accessed via
|
|
||||||
// mux.Vars for testing route behaviour. Arguments are not modified, a shallow
|
|
||||||
// copy is returned.
|
|
||||||
//
|
|
||||||
// This API should only be used for testing purposes; it provides a way to
|
|
||||||
// inject variables into the request context. Alternatively, URL variables
|
|
||||||
// can be set by making a route that captures the required variables,
|
|
||||||
// starting a server and sending the request to that server.
|
|
||||||
func SetURLVars(r *http.Request, val map[string]string) *http.Request {
|
|
||||||
return setVars(r, val)
|
|
||||||
}
|
|
13
vendor/github.com/inconshreveable/mousetrap/LICENSE
generated
vendored
13
vendor/github.com/inconshreveable/mousetrap/LICENSE
generated
vendored
|
@ -1,13 +0,0 @@
|
||||||
Copyright 2014 Alan Shreve
|
|
||||||
|
|
||||||
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.
|
|
15
vendor/github.com/inconshreveable/mousetrap/trap_others.go
generated
vendored
15
vendor/github.com/inconshreveable/mousetrap/trap_others.go
generated
vendored
|
@ -1,15 +0,0 @@
|
||||||
// +build !windows
|
|
||||||
|
|
||||||
package mousetrap
|
|
||||||
|
|
||||||
// StartedByExplorer returns true if the program was invoked by the user
|
|
||||||
// double-clicking on the executable from explorer.exe
|
|
||||||
//
|
|
||||||
// It is conservative and returns false if any of the internal calls fail.
|
|
||||||
// It does not guarantee that the program was run from a terminal. It only can tell you
|
|
||||||
// whether it was launched from explorer.exe
|
|
||||||
//
|
|
||||||
// On non-Windows platforms, it always returns false.
|
|
||||||
func StartedByExplorer() bool {
|
|
||||||
return false
|
|
||||||
}
|
|
98
vendor/github.com/inconshreveable/mousetrap/trap_windows.go
generated
vendored
98
vendor/github.com/inconshreveable/mousetrap/trap_windows.go
generated
vendored
|
@ -1,98 +0,0 @@
|
||||||
// +build windows
|
|
||||||
// +build !go1.4
|
|
||||||
|
|
||||||
package mousetrap
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
// defined by the Win32 API
|
|
||||||
th32cs_snapprocess uintptr = 0x2
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
kernel = syscall.MustLoadDLL("kernel32.dll")
|
|
||||||
CreateToolhelp32Snapshot = kernel.MustFindProc("CreateToolhelp32Snapshot")
|
|
||||||
Process32First = kernel.MustFindProc("Process32FirstW")
|
|
||||||
Process32Next = kernel.MustFindProc("Process32NextW")
|
|
||||||
)
|
|
||||||
|
|
||||||
// ProcessEntry32 structure defined by the Win32 API
|
|
||||||
type processEntry32 struct {
|
|
||||||
dwSize uint32
|
|
||||||
cntUsage uint32
|
|
||||||
th32ProcessID uint32
|
|
||||||
th32DefaultHeapID int
|
|
||||||
th32ModuleID uint32
|
|
||||||
cntThreads uint32
|
|
||||||
th32ParentProcessID uint32
|
|
||||||
pcPriClassBase int32
|
|
||||||
dwFlags uint32
|
|
||||||
szExeFile [syscall.MAX_PATH]uint16
|
|
||||||
}
|
|
||||||
|
|
||||||
func getProcessEntry(pid int) (pe *processEntry32, err error) {
|
|
||||||
snapshot, _, e1 := CreateToolhelp32Snapshot.Call(th32cs_snapprocess, uintptr(0))
|
|
||||||
if snapshot == uintptr(syscall.InvalidHandle) {
|
|
||||||
err = fmt.Errorf("CreateToolhelp32Snapshot: %v", e1)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer syscall.CloseHandle(syscall.Handle(snapshot))
|
|
||||||
|
|
||||||
var processEntry processEntry32
|
|
||||||
processEntry.dwSize = uint32(unsafe.Sizeof(processEntry))
|
|
||||||
ok, _, e1 := Process32First.Call(snapshot, uintptr(unsafe.Pointer(&processEntry)))
|
|
||||||
if ok == 0 {
|
|
||||||
err = fmt.Errorf("Process32First: %v", e1)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
for {
|
|
||||||
if processEntry.th32ProcessID == uint32(pid) {
|
|
||||||
pe = &processEntry
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
ok, _, e1 = Process32Next.Call(snapshot, uintptr(unsafe.Pointer(&processEntry)))
|
|
||||||
if ok == 0 {
|
|
||||||
err = fmt.Errorf("Process32Next: %v", e1)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func getppid() (pid int, err error) {
|
|
||||||
pe, err := getProcessEntry(os.Getpid())
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
pid = int(pe.th32ParentProcessID)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// StartedByExplorer returns true if the program was invoked by the user double-clicking
|
|
||||||
// on the executable from explorer.exe
|
|
||||||
//
|
|
||||||
// It is conservative and returns false if any of the internal calls fail.
|
|
||||||
// It does not guarantee that the program was run from a terminal. It only can tell you
|
|
||||||
// whether it was launched from explorer.exe
|
|
||||||
func StartedByExplorer() bool {
|
|
||||||
ppid, err := getppid()
|
|
||||||
if err != nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
pe, err := getProcessEntry(ppid)
|
|
||||||
if err != nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
name := syscall.UTF16ToString(pe.szExeFile[:])
|
|
||||||
return name == "explorer.exe"
|
|
||||||
}
|
|
46
vendor/github.com/inconshreveable/mousetrap/trap_windows_1.4.go
generated
vendored
46
vendor/github.com/inconshreveable/mousetrap/trap_windows_1.4.go
generated
vendored
|
@ -1,46 +0,0 @@
|
||||||
// +build windows
|
|
||||||
// +build go1.4
|
|
||||||
|
|
||||||
package mousetrap
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
func getProcessEntry(pid int) (*syscall.ProcessEntry32, error) {
|
|
||||||
snapshot, err := syscall.CreateToolhelp32Snapshot(syscall.TH32CS_SNAPPROCESS, 0)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
defer syscall.CloseHandle(snapshot)
|
|
||||||
var procEntry syscall.ProcessEntry32
|
|
||||||
procEntry.Size = uint32(unsafe.Sizeof(procEntry))
|
|
||||||
if err = syscall.Process32First(snapshot, &procEntry); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
for {
|
|
||||||
if procEntry.ProcessID == uint32(pid) {
|
|
||||||
return &procEntry, nil
|
|
||||||
}
|
|
||||||
err = syscall.Process32Next(snapshot, &procEntry)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// StartedByExplorer returns true if the program was invoked by the user double-clicking
|
|
||||||
// on the executable from explorer.exe
|
|
||||||
//
|
|
||||||
// It is conservative and returns false if any of the internal calls fail.
|
|
||||||
// It does not guarantee that the program was run from a terminal. It only can tell you
|
|
||||||
// whether it was launched from explorer.exe
|
|
||||||
func StartedByExplorer() bool {
|
|
||||||
pe, err := getProcessEntry(os.Getppid())
|
|
||||||
if err != nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return "explorer.exe" == syscall.UTF16ToString(pe.ExeFile[:])
|
|
||||||
}
|
|
23
vendor/github.com/pkg/errors/LICENSE
generated
vendored
23
vendor/github.com/pkg/errors/LICENSE
generated
vendored
|
@ -1,23 +0,0 @@
|
||||||
Copyright (c) 2015, Dave Cheney <dave@cheney.net>
|
|
||||||
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.
|
|
||||||
|
|
||||||
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 HOLDER 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.
|
|
282
vendor/github.com/pkg/errors/errors.go
generated
vendored
282
vendor/github.com/pkg/errors/errors.go
generated
vendored
|
@ -1,282 +0,0 @@
|
||||||
// Package errors provides simple error handling primitives.
|
|
||||||
//
|
|
||||||
// The traditional error handling idiom in Go is roughly akin to
|
|
||||||
//
|
|
||||||
// if err != nil {
|
|
||||||
// return err
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// which when applied recursively up the call stack results in error reports
|
|
||||||
// without context or debugging information. The errors package allows
|
|
||||||
// programmers to add context to the failure path in their code in a way
|
|
||||||
// that does not destroy the original value of the error.
|
|
||||||
//
|
|
||||||
// Adding context to an error
|
|
||||||
//
|
|
||||||
// The errors.Wrap function returns a new error that adds context to the
|
|
||||||
// original error by recording a stack trace at the point Wrap is called,
|
|
||||||
// together with the supplied message. For example
|
|
||||||
//
|
|
||||||
// _, err := ioutil.ReadAll(r)
|
|
||||||
// if err != nil {
|
|
||||||
// return errors.Wrap(err, "read failed")
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// If additional control is required, the errors.WithStack and
|
|
||||||
// errors.WithMessage functions destructure errors.Wrap into its component
|
|
||||||
// operations: annotating an error with a stack trace and with a message,
|
|
||||||
// respectively.
|
|
||||||
//
|
|
||||||
// Retrieving the cause of an error
|
|
||||||
//
|
|
||||||
// Using errors.Wrap constructs a stack of errors, adding context to the
|
|
||||||
// preceding error. Depending on the nature of the error it may be necessary
|
|
||||||
// to reverse the operation of errors.Wrap to retrieve the original error
|
|
||||||
// for inspection. Any error value which implements this interface
|
|
||||||
//
|
|
||||||
// type causer interface {
|
|
||||||
// Cause() error
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// can be inspected by errors.Cause. errors.Cause will recursively retrieve
|
|
||||||
// the topmost error that does not implement causer, which is assumed to be
|
|
||||||
// the original cause. For example:
|
|
||||||
//
|
|
||||||
// switch err := errors.Cause(err).(type) {
|
|
||||||
// case *MyError:
|
|
||||||
// // handle specifically
|
|
||||||
// default:
|
|
||||||
// // unknown error
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Although the causer interface is not exported by this package, it is
|
|
||||||
// considered a part of its stable public interface.
|
|
||||||
//
|
|
||||||
// Formatted printing of errors
|
|
||||||
//
|
|
||||||
// All error values returned from this package implement fmt.Formatter and can
|
|
||||||
// be formatted by the fmt package. The following verbs are supported:
|
|
||||||
//
|
|
||||||
// %s print the error. If the error has a Cause it will be
|
|
||||||
// printed recursively.
|
|
||||||
// %v see %s
|
|
||||||
// %+v extended format. Each Frame of the error's StackTrace will
|
|
||||||
// be printed in detail.
|
|
||||||
//
|
|
||||||
// Retrieving the stack trace of an error or wrapper
|
|
||||||
//
|
|
||||||
// New, Errorf, Wrap, and Wrapf record a stack trace at the point they are
|
|
||||||
// invoked. This information can be retrieved with the following interface:
|
|
||||||
//
|
|
||||||
// type stackTracer interface {
|
|
||||||
// StackTrace() errors.StackTrace
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// The returned errors.StackTrace type is defined as
|
|
||||||
//
|
|
||||||
// type StackTrace []Frame
|
|
||||||
//
|
|
||||||
// The Frame type represents a call site in the stack trace. Frame supports
|
|
||||||
// the fmt.Formatter interface that can be used for printing information about
|
|
||||||
// the stack trace of this error. For example:
|
|
||||||
//
|
|
||||||
// if err, ok := err.(stackTracer); ok {
|
|
||||||
// for _, f := range err.StackTrace() {
|
|
||||||
// fmt.Printf("%+s:%d", f)
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Although the stackTracer interface is not exported by this package, it is
|
|
||||||
// considered a part of its stable public interface.
|
|
||||||
//
|
|
||||||
// See the documentation for Frame.Format for more details.
|
|
||||||
package errors
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
)
|
|
||||||
|
|
||||||
// New returns an error with the supplied message.
|
|
||||||
// New also records the stack trace at the point it was called.
|
|
||||||
func New(message string) error {
|
|
||||||
return &fundamental{
|
|
||||||
msg: message,
|
|
||||||
stack: callers(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Errorf formats according to a format specifier and returns the string
|
|
||||||
// as a value that satisfies error.
|
|
||||||
// Errorf also records the stack trace at the point it was called.
|
|
||||||
func Errorf(format string, args ...interface{}) error {
|
|
||||||
return &fundamental{
|
|
||||||
msg: fmt.Sprintf(format, args...),
|
|
||||||
stack: callers(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// fundamental is an error that has a message and a stack, but no caller.
|
|
||||||
type fundamental struct {
|
|
||||||
msg string
|
|
||||||
*stack
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *fundamental) Error() string { return f.msg }
|
|
||||||
|
|
||||||
func (f *fundamental) Format(s fmt.State, verb rune) {
|
|
||||||
switch verb {
|
|
||||||
case 'v':
|
|
||||||
if s.Flag('+') {
|
|
||||||
io.WriteString(s, f.msg)
|
|
||||||
f.stack.Format(s, verb)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
fallthrough
|
|
||||||
case 's':
|
|
||||||
io.WriteString(s, f.msg)
|
|
||||||
case 'q':
|
|
||||||
fmt.Fprintf(s, "%q", f.msg)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithStack annotates err with a stack trace at the point WithStack was called.
|
|
||||||
// If err is nil, WithStack returns nil.
|
|
||||||
func WithStack(err error) error {
|
|
||||||
if err == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return &withStack{
|
|
||||||
err,
|
|
||||||
callers(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type withStack struct {
|
|
||||||
error
|
|
||||||
*stack
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *withStack) Cause() error { return w.error }
|
|
||||||
|
|
||||||
func (w *withStack) Format(s fmt.State, verb rune) {
|
|
||||||
switch verb {
|
|
||||||
case 'v':
|
|
||||||
if s.Flag('+') {
|
|
||||||
fmt.Fprintf(s, "%+v", w.Cause())
|
|
||||||
w.stack.Format(s, verb)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
fallthrough
|
|
||||||
case 's':
|
|
||||||
io.WriteString(s, w.Error())
|
|
||||||
case 'q':
|
|
||||||
fmt.Fprintf(s, "%q", w.Error())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wrap returns an error annotating err with a stack trace
|
|
||||||
// at the point Wrap is called, and the supplied message.
|
|
||||||
// If err is nil, Wrap returns nil.
|
|
||||||
func Wrap(err error, message string) error {
|
|
||||||
if err == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
err = &withMessage{
|
|
||||||
cause: err,
|
|
||||||
msg: message,
|
|
||||||
}
|
|
||||||
return &withStack{
|
|
||||||
err,
|
|
||||||
callers(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wrapf returns an error annotating err with a stack trace
|
|
||||||
// at the point Wrapf is called, and the format specifier.
|
|
||||||
// If err is nil, Wrapf returns nil.
|
|
||||||
func Wrapf(err error, format string, args ...interface{}) error {
|
|
||||||
if err == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
err = &withMessage{
|
|
||||||
cause: err,
|
|
||||||
msg: fmt.Sprintf(format, args...),
|
|
||||||
}
|
|
||||||
return &withStack{
|
|
||||||
err,
|
|
||||||
callers(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMessage annotates err with a new message.
|
|
||||||
// If err is nil, WithMessage returns nil.
|
|
||||||
func WithMessage(err error, message string) error {
|
|
||||||
if err == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return &withMessage{
|
|
||||||
cause: err,
|
|
||||||
msg: message,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMessagef annotates err with the format specifier.
|
|
||||||
// If err is nil, WithMessagef returns nil.
|
|
||||||
func WithMessagef(err error, format string, args ...interface{}) error {
|
|
||||||
if err == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return &withMessage{
|
|
||||||
cause: err,
|
|
||||||
msg: fmt.Sprintf(format, args...),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type withMessage struct {
|
|
||||||
cause error
|
|
||||||
msg string
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *withMessage) Error() string { return w.msg + ": " + w.cause.Error() }
|
|
||||||
func (w *withMessage) Cause() error { return w.cause }
|
|
||||||
|
|
||||||
func (w *withMessage) Format(s fmt.State, verb rune) {
|
|
||||||
switch verb {
|
|
||||||
case 'v':
|
|
||||||
if s.Flag('+') {
|
|
||||||
fmt.Fprintf(s, "%+v\n", w.Cause())
|
|
||||||
io.WriteString(s, w.msg)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
fallthrough
|
|
||||||
case 's', 'q':
|
|
||||||
io.WriteString(s, w.Error())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Cause returns the underlying cause of the error, if possible.
|
|
||||||
// An error value has a cause if it implements the following
|
|
||||||
// interface:
|
|
||||||
//
|
|
||||||
// type causer interface {
|
|
||||||
// Cause() error
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// If the error does not implement Cause, the original error will
|
|
||||||
// be returned. If the error is nil, nil will be returned without further
|
|
||||||
// investigation.
|
|
||||||
func Cause(err error) error {
|
|
||||||
type causer interface {
|
|
||||||
Cause() error
|
|
||||||
}
|
|
||||||
|
|
||||||
for err != nil {
|
|
||||||
cause, ok := err.(causer)
|
|
||||||
if !ok {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
err = cause.Cause()
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
147
vendor/github.com/pkg/errors/stack.go
generated
vendored
147
vendor/github.com/pkg/errors/stack.go
generated
vendored
|
@ -1,147 +0,0 @@
|
||||||
package errors
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"path"
|
|
||||||
"runtime"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Frame represents a program counter inside a stack frame.
|
|
||||||
type Frame uintptr
|
|
||||||
|
|
||||||
// pc returns the program counter for this frame;
|
|
||||||
// multiple frames may have the same PC value.
|
|
||||||
func (f Frame) pc() uintptr { return uintptr(f) - 1 }
|
|
||||||
|
|
||||||
// file returns the full path to the file that contains the
|
|
||||||
// function for this Frame's pc.
|
|
||||||
func (f Frame) file() string {
|
|
||||||
fn := runtime.FuncForPC(f.pc())
|
|
||||||
if fn == nil {
|
|
||||||
return "unknown"
|
|
||||||
}
|
|
||||||
file, _ := fn.FileLine(f.pc())
|
|
||||||
return file
|
|
||||||
}
|
|
||||||
|
|
||||||
// line returns the line number of source code of the
|
|
||||||
// function for this Frame's pc.
|
|
||||||
func (f Frame) line() int {
|
|
||||||
fn := runtime.FuncForPC(f.pc())
|
|
||||||
if fn == nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
_, line := fn.FileLine(f.pc())
|
|
||||||
return line
|
|
||||||
}
|
|
||||||
|
|
||||||
// Format formats the frame according to the fmt.Formatter interface.
|
|
||||||
//
|
|
||||||
// %s source file
|
|
||||||
// %d source line
|
|
||||||
// %n function name
|
|
||||||
// %v equivalent to %s:%d
|
|
||||||
//
|
|
||||||
// Format accepts flags that alter the printing of some verbs, as follows:
|
|
||||||
//
|
|
||||||
// %+s function name and path of source file relative to the compile time
|
|
||||||
// GOPATH separated by \n\t (<funcname>\n\t<path>)
|
|
||||||
// %+v equivalent to %+s:%d
|
|
||||||
func (f Frame) Format(s fmt.State, verb rune) {
|
|
||||||
switch verb {
|
|
||||||
case 's':
|
|
||||||
switch {
|
|
||||||
case s.Flag('+'):
|
|
||||||
pc := f.pc()
|
|
||||||
fn := runtime.FuncForPC(pc)
|
|
||||||
if fn == nil {
|
|
||||||
io.WriteString(s, "unknown")
|
|
||||||
} else {
|
|
||||||
file, _ := fn.FileLine(pc)
|
|
||||||
fmt.Fprintf(s, "%s\n\t%s", fn.Name(), file)
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
io.WriteString(s, path.Base(f.file()))
|
|
||||||
}
|
|
||||||
case 'd':
|
|
||||||
fmt.Fprintf(s, "%d", f.line())
|
|
||||||
case 'n':
|
|
||||||
name := runtime.FuncForPC(f.pc()).Name()
|
|
||||||
io.WriteString(s, funcname(name))
|
|
||||||
case 'v':
|
|
||||||
f.Format(s, 's')
|
|
||||||
io.WriteString(s, ":")
|
|
||||||
f.Format(s, 'd')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// StackTrace is stack of Frames from innermost (newest) to outermost (oldest).
|
|
||||||
type StackTrace []Frame
|
|
||||||
|
|
||||||
// Format formats the stack of Frames according to the fmt.Formatter interface.
|
|
||||||
//
|
|
||||||
// %s lists source files for each Frame in the stack
|
|
||||||
// %v lists the source file and line number for each Frame in the stack
|
|
||||||
//
|
|
||||||
// Format accepts flags that alter the printing of some verbs, as follows:
|
|
||||||
//
|
|
||||||
// %+v Prints filename, function, and line number for each Frame in the stack.
|
|
||||||
func (st StackTrace) Format(s fmt.State, verb rune) {
|
|
||||||
switch verb {
|
|
||||||
case 'v':
|
|
||||||
switch {
|
|
||||||
case s.Flag('+'):
|
|
||||||
for _, f := range st {
|
|
||||||
fmt.Fprintf(s, "\n%+v", f)
|
|
||||||
}
|
|
||||||
case s.Flag('#'):
|
|
||||||
fmt.Fprintf(s, "%#v", []Frame(st))
|
|
||||||
default:
|
|
||||||
fmt.Fprintf(s, "%v", []Frame(st))
|
|
||||||
}
|
|
||||||
case 's':
|
|
||||||
fmt.Fprintf(s, "%s", []Frame(st))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// stack represents a stack of program counters.
|
|
||||||
type stack []uintptr
|
|
||||||
|
|
||||||
func (s *stack) Format(st fmt.State, verb rune) {
|
|
||||||
switch verb {
|
|
||||||
case 'v':
|
|
||||||
switch {
|
|
||||||
case st.Flag('+'):
|
|
||||||
for _, pc := range *s {
|
|
||||||
f := Frame(pc)
|
|
||||||
fmt.Fprintf(st, "\n%+v", f)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *stack) StackTrace() StackTrace {
|
|
||||||
f := make([]Frame, len(*s))
|
|
||||||
for i := 0; i < len(f); i++ {
|
|
||||||
f[i] = Frame((*s)[i])
|
|
||||||
}
|
|
||||||
return f
|
|
||||||
}
|
|
||||||
|
|
||||||
func callers() *stack {
|
|
||||||
const depth = 32
|
|
||||||
var pcs [depth]uintptr
|
|
||||||
n := runtime.Callers(3, pcs[:])
|
|
||||||
var st stack = pcs[0:n]
|
|
||||||
return &st
|
|
||||||
}
|
|
||||||
|
|
||||||
// funcname removes the path prefix component of a function's name reported by func.Name().
|
|
||||||
func funcname(name string) string {
|
|
||||||
i := strings.LastIndex(name, "/")
|
|
||||||
name = name[i+1:]
|
|
||||||
i = strings.Index(name, ".")
|
|
||||||
return name[i+1:]
|
|
||||||
}
|
|
174
vendor/github.com/spf13/cobra/LICENSE.txt
generated
vendored
174
vendor/github.com/spf13/cobra/LICENSE.txt
generated
vendored
|
@ -1,174 +0,0 @@
|
||||||
Apache License
|
|
||||||
Version 2.0, January 2004
|
|
||||||
http://www.apache.org/licenses/
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction,
|
|
||||||
and distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by
|
|
||||||
the copyright owner that is granting the License.
|
|
||||||
|
|
||||||
"Legal Entity" shall mean the union of the acting entity and all
|
|
||||||
other entities that control, are controlled by, or are under common
|
|
||||||
control with that entity. For the purposes of this definition,
|
|
||||||
"control" means (i) the power, direct or indirect, to cause the
|
|
||||||
direction or management of such entity, whether by contract or
|
|
||||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity
|
|
||||||
exercising permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications,
|
|
||||||
including but not limited to software source code, documentation
|
|
||||||
source, and configuration files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical
|
|
||||||
transformation or translation of a Source form, including but
|
|
||||||
not limited to compiled object code, generated documentation,
|
|
||||||
and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or
|
|
||||||
Object form, made available under the License, as indicated by a
|
|
||||||
copyright notice that is included in or attached to the work
|
|
||||||
(an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
form, that is based on (or derived from) the Work and for which the
|
|
||||||
editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
of this License, Derivative Works shall not include works that remain
|
|
||||||
separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including
|
|
||||||
the original version of the Work and any modifications or additions
|
|
||||||
to that Work or Derivative Works thereof, that is intentionally
|
|
||||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
||||||
or by an individual or Legal Entity authorized to submit on behalf of
|
|
||||||
the copyright owner. For the purposes of this definition, "submitted"
|
|
||||||
means any form of electronic, verbal, or written communication sent
|
|
||||||
to the Licensor or its representatives, including but not limited to
|
|
||||||
communication on electronic mailing lists, source code control systems,
|
|
||||||
and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
Licensor for the purpose of discussing and improving the Work, but
|
|
||||||
excluding communication that is conspicuously marked or otherwise
|
|
||||||
designated in writing by the copyright owner as "Not a Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
||||||
on behalf of whom a Contribution has been received by Licensor and
|
|
||||||
subsequently incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
publicly display, publicly perform, sublicense, and distribute the
|
|
||||||
Work and such Derivative Works in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor 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, and otherwise transfer the Work,
|
|
||||||
where such license applies only to those patent claims licensable
|
|
||||||
by such Contributor that are necessarily infringed by their
|
|
||||||
Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
with the Work to which such Contribution(s) was submitted. If You
|
|
||||||
institute patent litigation against any entity (including a
|
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
||||||
or a Contribution incorporated within the Work constitutes direct
|
|
||||||
or contributory patent infringement, then any patent licenses
|
|
||||||
granted to You under this License for that Work shall terminate
|
|
||||||
as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution. You may reproduce and distribute copies of the
|
|
||||||
Work or Derivative Works thereof in any medium, with or without
|
|
||||||
modifications, and in Source or Object form, provided that You
|
|
||||||
meet the following conditions:
|
|
||||||
|
|
||||||
(a) You must give any other recipients of the Work or
|
|
||||||
Derivative Works a copy of this License; and
|
|
||||||
|
|
||||||
(b) You must cause any modified files to carry prominent notices
|
|
||||||
stating that You changed the files; and
|
|
||||||
|
|
||||||
(c) You must retain, in the Source form of any Derivative Works
|
|
||||||
that You distribute, all copyright, patent, trademark, and
|
|
||||||
attribution notices from the Source form of the Work,
|
|
||||||
excluding those notices that do not pertain to any part of
|
|
||||||
the Derivative Works; and
|
|
||||||
|
|
||||||
(d) If the Work includes a "NOTICE" text file as part of its
|
|
||||||
distribution, then any Derivative Works that You distribute must
|
|
||||||
include a readable copy of the attribution notices contained
|
|
||||||
within such NOTICE file, excluding those notices that do not
|
|
||||||
pertain to any part of the Derivative Works, in at least one
|
|
||||||
of the following places: within a NOTICE text file distributed
|
|
||||||
as part of the Derivative Works; within the Source form or
|
|
||||||
documentation, if provided along with the Derivative Works; or,
|
|
||||||
within a display generated by the Derivative Works, if and
|
|
||||||
wherever such third-party notices normally appear. The contents
|
|
||||||
of the NOTICE file are for informational purposes only and
|
|
||||||
do not modify the License. You may add Your own attribution
|
|
||||||
notices within Derivative Works that You distribute, alongside
|
|
||||||
or as an addendum to the NOTICE text from the Work, provided
|
|
||||||
that such additional attribution notices cannot be construed
|
|
||||||
as modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and
|
|
||||||
may provide additional or different license terms and conditions
|
|
||||||
for use, reproduction, or distribution of Your modifications, or
|
|
||||||
for any such Derivative Works as a whole, provided Your use,
|
|
||||||
reproduction, and distribution of the Work otherwise complies with
|
|
||||||
the conditions stated in this License.
|
|
||||||
|
|
||||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
||||||
any Contribution intentionally submitted for inclusion in the Work
|
|
||||||
by You to the Licensor shall be under the terms and conditions of
|
|
||||||
this License, without any additional terms or conditions.
|
|
||||||
Notwithstanding the above, nothing herein shall supersede or modify
|
|
||||||
the terms of any separate license agreement you may have executed
|
|
||||||
with Licensor regarding such Contributions.
|
|
||||||
|
|
||||||
6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
except as required for reasonable and customary use in describing the
|
|
||||||
origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
||||||
agreed to in writing, Licensor provides the Work (and each
|
|
||||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
implied, including, without limitation, any warranties or conditions
|
|
||||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
||||||
appropriateness of using or redistributing the Work and assume any
|
|
||||||
risks associated with Your exercise of permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability. In no event and under no legal theory,
|
|
||||||
whether in tort (including negligence), contract, or otherwise,
|
|
||||||
unless required by applicable law (such as deliberate and grossly
|
|
||||||
negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
liable to You for damages, including any direct, indirect, special,
|
|
||||||
incidental, or consequential damages of any character arising as a
|
|
||||||
result of this License or out of the use or inability to use the
|
|
||||||
Work (including but not limited to damages for loss of goodwill,
|
|
||||||
work stoppage, computer failure or malfunction, or any and all
|
|
||||||
other commercial damages or losses), even if such Contributor
|
|
||||||
has been advised of the possibility of such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability. While redistributing
|
|
||||||
the Work or Derivative Works thereof, You may choose to offer,
|
|
||||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
||||||
or other liability obligations and/or rights consistent with this
|
|
||||||
License. However, in accepting such obligations, You may act only
|
|
||||||
on Your own behalf and on Your sole responsibility, not on behalf
|
|
||||||
of any other Contributor, and only if You agree to indemnify,
|
|
||||||
defend, and hold each Contributor harmless for any liability
|
|
||||||
incurred by, or claims asserted against, such Contributor by reason
|
|
||||||
of your accepting any such warranty or additional liability.
|
|
89
vendor/github.com/spf13/cobra/args.go
generated
vendored
89
vendor/github.com/spf13/cobra/args.go
generated
vendored
|
@ -1,89 +0,0 @@
|
||||||
package cobra
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
)
|
|
||||||
|
|
||||||
type PositionalArgs func(cmd *Command, args []string) error
|
|
||||||
|
|
||||||
// Legacy arg validation has the following behaviour:
|
|
||||||
// - root commands with no subcommands can take arbitrary arguments
|
|
||||||
// - root commands with subcommands will do subcommand validity checking
|
|
||||||
// - subcommands will always accept arbitrary arguments
|
|
||||||
func legacyArgs(cmd *Command, args []string) error {
|
|
||||||
// no subcommand, always take args
|
|
||||||
if !cmd.HasSubCommands() {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// root command with subcommands, do subcommand checking.
|
|
||||||
if !cmd.HasParent() && len(args) > 0 {
|
|
||||||
return fmt.Errorf("unknown command %q for %q%s", args[0], cmd.CommandPath(), cmd.findSuggestions(args[0]))
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// NoArgs returns an error if any args are included.
|
|
||||||
func NoArgs(cmd *Command, args []string) error {
|
|
||||||
if len(args) > 0 {
|
|
||||||
return fmt.Errorf("unknown command %q for %q", args[0], cmd.CommandPath())
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// OnlyValidArgs returns an error if any args are not in the list of ValidArgs.
|
|
||||||
func OnlyValidArgs(cmd *Command, args []string) error {
|
|
||||||
if len(cmd.ValidArgs) > 0 {
|
|
||||||
for _, v := range args {
|
|
||||||
if !stringInSlice(v, cmd.ValidArgs) {
|
|
||||||
return fmt.Errorf("invalid argument %q for %q%s", v, cmd.CommandPath(), cmd.findSuggestions(args[0]))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ArbitraryArgs never returns an error.
|
|
||||||
func ArbitraryArgs(cmd *Command, args []string) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// MinimumNArgs returns an error if there is not at least N args.
|
|
||||||
func MinimumNArgs(n int) PositionalArgs {
|
|
||||||
return func(cmd *Command, args []string) error {
|
|
||||||
if len(args) < n {
|
|
||||||
return fmt.Errorf("requires at least %d arg(s), only received %d", n, len(args))
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// MaximumNArgs returns an error if there are more than N args.
|
|
||||||
func MaximumNArgs(n int) PositionalArgs {
|
|
||||||
return func(cmd *Command, args []string) error {
|
|
||||||
if len(args) > n {
|
|
||||||
return fmt.Errorf("accepts at most %d arg(s), received %d", n, len(args))
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ExactArgs returns an error if there are not exactly n args.
|
|
||||||
func ExactArgs(n int) PositionalArgs {
|
|
||||||
return func(cmd *Command, args []string) error {
|
|
||||||
if len(args) != n {
|
|
||||||
return fmt.Errorf("accepts %d arg(s), received %d", n, len(args))
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// RangeArgs returns an error if the number of args is not within the expected range.
|
|
||||||
func RangeArgs(min int, max int) PositionalArgs {
|
|
||||||
return func(cmd *Command, args []string) error {
|
|
||||||
if len(args) < min || len(args) > max {
|
|
||||||
return fmt.Errorf("accepts between %d and %d arg(s), received %d", min, max, len(args))
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
584
vendor/github.com/spf13/cobra/bash_completions.go
generated
vendored
584
vendor/github.com/spf13/cobra/bash_completions.go
generated
vendored
|
@ -1,584 +0,0 @@
|
||||||
package cobra
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"os"
|
|
||||||
"sort"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/spf13/pflag"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Annotations for Bash completion.
|
|
||||||
const (
|
|
||||||
BashCompFilenameExt = "cobra_annotation_bash_completion_filename_extensions"
|
|
||||||
BashCompCustom = "cobra_annotation_bash_completion_custom"
|
|
||||||
BashCompOneRequiredFlag = "cobra_annotation_bash_completion_one_required_flag"
|
|
||||||
BashCompSubdirsInDir = "cobra_annotation_bash_completion_subdirs_in_dir"
|
|
||||||
)
|
|
||||||
|
|
||||||
func writePreamble(buf *bytes.Buffer, name string) {
|
|
||||||
buf.WriteString(fmt.Sprintf("# bash completion for %-36s -*- shell-script -*-\n", name))
|
|
||||||
buf.WriteString(fmt.Sprintf(`
|
|
||||||
__%[1]s_debug()
|
|
||||||
{
|
|
||||||
if [[ -n ${BASH_COMP_DEBUG_FILE} ]]; then
|
|
||||||
echo "$*" >> "${BASH_COMP_DEBUG_FILE}"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Homebrew on Macs have version 1.3 of bash-completion which doesn't include
|
|
||||||
# _init_completion. This is a very minimal version of that function.
|
|
||||||
__%[1]s_init_completion()
|
|
||||||
{
|
|
||||||
COMPREPLY=()
|
|
||||||
_get_comp_words_by_ref "$@" cur prev words cword
|
|
||||||
}
|
|
||||||
|
|
||||||
__%[1]s_index_of_word()
|
|
||||||
{
|
|
||||||
local w word=$1
|
|
||||||
shift
|
|
||||||
index=0
|
|
||||||
for w in "$@"; do
|
|
||||||
[[ $w = "$word" ]] && return
|
|
||||||
index=$((index+1))
|
|
||||||
done
|
|
||||||
index=-1
|
|
||||||
}
|
|
||||||
|
|
||||||
__%[1]s_contains_word()
|
|
||||||
{
|
|
||||||
local w word=$1; shift
|
|
||||||
for w in "$@"; do
|
|
||||||
[[ $w = "$word" ]] && return
|
|
||||||
done
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
__%[1]s_handle_reply()
|
|
||||||
{
|
|
||||||
__%[1]s_debug "${FUNCNAME[0]}"
|
|
||||||
case $cur in
|
|
||||||
-*)
|
|
||||||
if [[ $(type -t compopt) = "builtin" ]]; then
|
|
||||||
compopt -o nospace
|
|
||||||
fi
|
|
||||||
local allflags
|
|
||||||
if [ ${#must_have_one_flag[@]} -ne 0 ]; then
|
|
||||||
allflags=("${must_have_one_flag[@]}")
|
|
||||||
else
|
|
||||||
allflags=("${flags[*]} ${two_word_flags[*]}")
|
|
||||||
fi
|
|
||||||
COMPREPLY=( $(compgen -W "${allflags[*]}" -- "$cur") )
|
|
||||||
if [[ $(type -t compopt) = "builtin" ]]; then
|
|
||||||
[[ "${COMPREPLY[0]}" == *= ]] || compopt +o nospace
|
|
||||||
fi
|
|
||||||
|
|
||||||
# complete after --flag=abc
|
|
||||||
if [[ $cur == *=* ]]; then
|
|
||||||
if [[ $(type -t compopt) = "builtin" ]]; then
|
|
||||||
compopt +o nospace
|
|
||||||
fi
|
|
||||||
|
|
||||||
local index flag
|
|
||||||
flag="${cur%%=*}"
|
|
||||||
__%[1]s_index_of_word "${flag}" "${flags_with_completion[@]}"
|
|
||||||
COMPREPLY=()
|
|
||||||
if [[ ${index} -ge 0 ]]; then
|
|
||||||
PREFIX=""
|
|
||||||
cur="${cur#*=}"
|
|
||||||
${flags_completion[${index}]}
|
|
||||||
if [ -n "${ZSH_VERSION}" ]; then
|
|
||||||
# zsh completion needs --flag= prefix
|
|
||||||
eval "COMPREPLY=( \"\${COMPREPLY[@]/#/${flag}=}\" )"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
return 0;
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# check if we are handling a flag with special work handling
|
|
||||||
local index
|
|
||||||
__%[1]s_index_of_word "${prev}" "${flags_with_completion[@]}"
|
|
||||||
if [[ ${index} -ge 0 ]]; then
|
|
||||||
${flags_completion[${index}]}
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
# we are parsing a flag and don't have a special handler, no completion
|
|
||||||
if [[ ${cur} != "${words[cword]}" ]]; then
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
local completions
|
|
||||||
completions=("${commands[@]}")
|
|
||||||
if [[ ${#must_have_one_noun[@]} -ne 0 ]]; then
|
|
||||||
completions=("${must_have_one_noun[@]}")
|
|
||||||
fi
|
|
||||||
if [[ ${#must_have_one_flag[@]} -ne 0 ]]; then
|
|
||||||
completions+=("${must_have_one_flag[@]}")
|
|
||||||
fi
|
|
||||||
COMPREPLY=( $(compgen -W "${completions[*]}" -- "$cur") )
|
|
||||||
|
|
||||||
if [[ ${#COMPREPLY[@]} -eq 0 && ${#noun_aliases[@]} -gt 0 && ${#must_have_one_noun[@]} -ne 0 ]]; then
|
|
||||||
COMPREPLY=( $(compgen -W "${noun_aliases[*]}" -- "$cur") )
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ ${#COMPREPLY[@]} -eq 0 ]]; then
|
|
||||||
declare -F __custom_func >/dev/null && __custom_func
|
|
||||||
fi
|
|
||||||
|
|
||||||
# available in bash-completion >= 2, not always present on macOS
|
|
||||||
if declare -F __ltrim_colon_completions >/dev/null; then
|
|
||||||
__ltrim_colon_completions "$cur"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# If there is only 1 completion and it is a flag with an = it will be completed
|
|
||||||
# but we don't want a space after the =
|
|
||||||
if [[ "${#COMPREPLY[@]}" -eq "1" ]] && [[ $(type -t compopt) = "builtin" ]] && [[ "${COMPREPLY[0]}" == --*= ]]; then
|
|
||||||
compopt -o nospace
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# The arguments should be in the form "ext1|ext2|extn"
|
|
||||||
__%[1]s_handle_filename_extension_flag()
|
|
||||||
{
|
|
||||||
local ext="$1"
|
|
||||||
_filedir "@(${ext})"
|
|
||||||
}
|
|
||||||
|
|
||||||
__%[1]s_handle_subdirs_in_dir_flag()
|
|
||||||
{
|
|
||||||
local dir="$1"
|
|
||||||
pushd "${dir}" >/dev/null 2>&1 && _filedir -d && popd >/dev/null 2>&1
|
|
||||||
}
|
|
||||||
|
|
||||||
__%[1]s_handle_flag()
|
|
||||||
{
|
|
||||||
__%[1]s_debug "${FUNCNAME[0]}: c is $c words[c] is ${words[c]}"
|
|
||||||
|
|
||||||
# if a command required a flag, and we found it, unset must_have_one_flag()
|
|
||||||
local flagname=${words[c]}
|
|
||||||
local flagvalue
|
|
||||||
# if the word contained an =
|
|
||||||
if [[ ${words[c]} == *"="* ]]; then
|
|
||||||
flagvalue=${flagname#*=} # take in as flagvalue after the =
|
|
||||||
flagname=${flagname%%=*} # strip everything after the =
|
|
||||||
flagname="${flagname}=" # but put the = back
|
|
||||||
fi
|
|
||||||
__%[1]s_debug "${FUNCNAME[0]}: looking for ${flagname}"
|
|
||||||
if __%[1]s_contains_word "${flagname}" "${must_have_one_flag[@]}"; then
|
|
||||||
must_have_one_flag=()
|
|
||||||
fi
|
|
||||||
|
|
||||||
# if you set a flag which only applies to this command, don't show subcommands
|
|
||||||
if __%[1]s_contains_word "${flagname}" "${local_nonpersistent_flags[@]}"; then
|
|
||||||
commands=()
|
|
||||||
fi
|
|
||||||
|
|
||||||
# keep flag value with flagname as flaghash
|
|
||||||
# flaghash variable is an associative array which is only supported in bash > 3.
|
|
||||||
if [[ -z "${BASH_VERSION}" || "${BASH_VERSINFO[0]}" -gt 3 ]]; then
|
|
||||||
if [ -n "${flagvalue}" ] ; then
|
|
||||||
flaghash[${flagname}]=${flagvalue}
|
|
||||||
elif [ -n "${words[ $((c+1)) ]}" ] ; then
|
|
||||||
flaghash[${flagname}]=${words[ $((c+1)) ]}
|
|
||||||
else
|
|
||||||
flaghash[${flagname}]="true" # pad "true" for bool flag
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# skip the argument to a two word flag
|
|
||||||
if __%[1]s_contains_word "${words[c]}" "${two_word_flags[@]}"; then
|
|
||||||
c=$((c+1))
|
|
||||||
# if we are looking for a flags value, don't show commands
|
|
||||||
if [[ $c -eq $cword ]]; then
|
|
||||||
commands=()
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
c=$((c+1))
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
__%[1]s_handle_noun()
|
|
||||||
{
|
|
||||||
__%[1]s_debug "${FUNCNAME[0]}: c is $c words[c] is ${words[c]}"
|
|
||||||
|
|
||||||
if __%[1]s_contains_word "${words[c]}" "${must_have_one_noun[@]}"; then
|
|
||||||
must_have_one_noun=()
|
|
||||||
elif __%[1]s_contains_word "${words[c]}" "${noun_aliases[@]}"; then
|
|
||||||
must_have_one_noun=()
|
|
||||||
fi
|
|
||||||
|
|
||||||
nouns+=("${words[c]}")
|
|
||||||
c=$((c+1))
|
|
||||||
}
|
|
||||||
|
|
||||||
__%[1]s_handle_command()
|
|
||||||
{
|
|
||||||
__%[1]s_debug "${FUNCNAME[0]}: c is $c words[c] is ${words[c]}"
|
|
||||||
|
|
||||||
local next_command
|
|
||||||
if [[ -n ${last_command} ]]; then
|
|
||||||
next_command="_${last_command}_${words[c]//:/__}"
|
|
||||||
else
|
|
||||||
if [[ $c -eq 0 ]]; then
|
|
||||||
next_command="_%[1]s_root_command"
|
|
||||||
else
|
|
||||||
next_command="_${words[c]//:/__}"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
c=$((c+1))
|
|
||||||
__%[1]s_debug "${FUNCNAME[0]}: looking for ${next_command}"
|
|
||||||
declare -F "$next_command" >/dev/null && $next_command
|
|
||||||
}
|
|
||||||
|
|
||||||
__%[1]s_handle_word()
|
|
||||||
{
|
|
||||||
if [[ $c -ge $cword ]]; then
|
|
||||||
__%[1]s_handle_reply
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
__%[1]s_debug "${FUNCNAME[0]}: c is $c words[c] is ${words[c]}"
|
|
||||||
if [[ "${words[c]}" == -* ]]; then
|
|
||||||
__%[1]s_handle_flag
|
|
||||||
elif __%[1]s_contains_word "${words[c]}" "${commands[@]}"; then
|
|
||||||
__%[1]s_handle_command
|
|
||||||
elif [[ $c -eq 0 ]]; then
|
|
||||||
__%[1]s_handle_command
|
|
||||||
elif __%[1]s_contains_word "${words[c]}" "${command_aliases[@]}"; then
|
|
||||||
# aliashash variable is an associative array which is only supported in bash > 3.
|
|
||||||
if [[ -z "${BASH_VERSION}" || "${BASH_VERSINFO[0]}" -gt 3 ]]; then
|
|
||||||
words[c]=${aliashash[${words[c]}]}
|
|
||||||
__%[1]s_handle_command
|
|
||||||
else
|
|
||||||
__%[1]s_handle_noun
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
__%[1]s_handle_noun
|
|
||||||
fi
|
|
||||||
__%[1]s_handle_word
|
|
||||||
}
|
|
||||||
|
|
||||||
`, name))
|
|
||||||
}
|
|
||||||
|
|
||||||
func writePostscript(buf *bytes.Buffer, name string) {
|
|
||||||
name = strings.Replace(name, ":", "__", -1)
|
|
||||||
buf.WriteString(fmt.Sprintf("__start_%s()\n", name))
|
|
||||||
buf.WriteString(fmt.Sprintf(`{
|
|
||||||
local cur prev words cword
|
|
||||||
declare -A flaghash 2>/dev/null || :
|
|
||||||
declare -A aliashash 2>/dev/null || :
|
|
||||||
if declare -F _init_completion >/dev/null 2>&1; then
|
|
||||||
_init_completion -s || return
|
|
||||||
else
|
|
||||||
__%[1]s_init_completion -n "=" || return
|
|
||||||
fi
|
|
||||||
|
|
||||||
local c=0
|
|
||||||
local flags=()
|
|
||||||
local two_word_flags=()
|
|
||||||
local local_nonpersistent_flags=()
|
|
||||||
local flags_with_completion=()
|
|
||||||
local flags_completion=()
|
|
||||||
local commands=("%[1]s")
|
|
||||||
local must_have_one_flag=()
|
|
||||||
local must_have_one_noun=()
|
|
||||||
local last_command
|
|
||||||
local nouns=()
|
|
||||||
|
|
||||||
__%[1]s_handle_word
|
|
||||||
}
|
|
||||||
|
|
||||||
`, name))
|
|
||||||
buf.WriteString(fmt.Sprintf(`if [[ $(type -t compopt) = "builtin" ]]; then
|
|
||||||
complete -o default -F __start_%s %s
|
|
||||||
else
|
|
||||||
complete -o default -o nospace -F __start_%s %s
|
|
||||||
fi
|
|
||||||
|
|
||||||
`, name, name, name, name))
|
|
||||||
buf.WriteString("# ex: ts=4 sw=4 et filetype=sh\n")
|
|
||||||
}
|
|
||||||
|
|
||||||
func writeCommands(buf *bytes.Buffer, cmd *Command) {
|
|
||||||
buf.WriteString(" commands=()\n")
|
|
||||||
for _, c := range cmd.Commands() {
|
|
||||||
if !c.IsAvailableCommand() || c == cmd.helpCommand {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
buf.WriteString(fmt.Sprintf(" commands+=(%q)\n", c.Name()))
|
|
||||||
writeCmdAliases(buf, c)
|
|
||||||
}
|
|
||||||
buf.WriteString("\n")
|
|
||||||
}
|
|
||||||
|
|
||||||
func writeFlagHandler(buf *bytes.Buffer, name string, annotations map[string][]string, cmd *Command) {
|
|
||||||
for key, value := range annotations {
|
|
||||||
switch key {
|
|
||||||
case BashCompFilenameExt:
|
|
||||||
buf.WriteString(fmt.Sprintf(" flags_with_completion+=(%q)\n", name))
|
|
||||||
|
|
||||||
var ext string
|
|
||||||
if len(value) > 0 {
|
|
||||||
ext = fmt.Sprintf("__%s_handle_filename_extension_flag ", cmd.Root().Name()) + strings.Join(value, "|")
|
|
||||||
} else {
|
|
||||||
ext = "_filedir"
|
|
||||||
}
|
|
||||||
buf.WriteString(fmt.Sprintf(" flags_completion+=(%q)\n", ext))
|
|
||||||
case BashCompCustom:
|
|
||||||
buf.WriteString(fmt.Sprintf(" flags_with_completion+=(%q)\n", name))
|
|
||||||
if len(value) > 0 {
|
|
||||||
handlers := strings.Join(value, "; ")
|
|
||||||
buf.WriteString(fmt.Sprintf(" flags_completion+=(%q)\n", handlers))
|
|
||||||
} else {
|
|
||||||
buf.WriteString(" flags_completion+=(:)\n")
|
|
||||||
}
|
|
||||||
case BashCompSubdirsInDir:
|
|
||||||
buf.WriteString(fmt.Sprintf(" flags_with_completion+=(%q)\n", name))
|
|
||||||
|
|
||||||
var ext string
|
|
||||||
if len(value) == 1 {
|
|
||||||
ext = fmt.Sprintf("__%s_handle_subdirs_in_dir_flag ", cmd.Root().Name()) + value[0]
|
|
||||||
} else {
|
|
||||||
ext = "_filedir -d"
|
|
||||||
}
|
|
||||||
buf.WriteString(fmt.Sprintf(" flags_completion+=(%q)\n", ext))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func writeShortFlag(buf *bytes.Buffer, flag *pflag.Flag, cmd *Command) {
|
|
||||||
name := flag.Shorthand
|
|
||||||
format := " "
|
|
||||||
if len(flag.NoOptDefVal) == 0 {
|
|
||||||
format += "two_word_"
|
|
||||||
}
|
|
||||||
format += "flags+=(\"-%s\")\n"
|
|
||||||
buf.WriteString(fmt.Sprintf(format, name))
|
|
||||||
writeFlagHandler(buf, "-"+name, flag.Annotations, cmd)
|
|
||||||
}
|
|
||||||
|
|
||||||
func writeFlag(buf *bytes.Buffer, flag *pflag.Flag, cmd *Command) {
|
|
||||||
name := flag.Name
|
|
||||||
format := " flags+=(\"--%s"
|
|
||||||
if len(flag.NoOptDefVal) == 0 {
|
|
||||||
format += "="
|
|
||||||
}
|
|
||||||
format += "\")\n"
|
|
||||||
buf.WriteString(fmt.Sprintf(format, name))
|
|
||||||
writeFlagHandler(buf, "--"+name, flag.Annotations, cmd)
|
|
||||||
}
|
|
||||||
|
|
||||||
func writeLocalNonPersistentFlag(buf *bytes.Buffer, flag *pflag.Flag) {
|
|
||||||
name := flag.Name
|
|
||||||
format := " local_nonpersistent_flags+=(\"--%s"
|
|
||||||
if len(flag.NoOptDefVal) == 0 {
|
|
||||||
format += "="
|
|
||||||
}
|
|
||||||
format += "\")\n"
|
|
||||||
buf.WriteString(fmt.Sprintf(format, name))
|
|
||||||
}
|
|
||||||
|
|
||||||
func writeFlags(buf *bytes.Buffer, cmd *Command) {
|
|
||||||
buf.WriteString(` flags=()
|
|
||||||
two_word_flags=()
|
|
||||||
local_nonpersistent_flags=()
|
|
||||||
flags_with_completion=()
|
|
||||||
flags_completion=()
|
|
||||||
|
|
||||||
`)
|
|
||||||
localNonPersistentFlags := cmd.LocalNonPersistentFlags()
|
|
||||||
cmd.NonInheritedFlags().VisitAll(func(flag *pflag.Flag) {
|
|
||||||
if nonCompletableFlag(flag) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
writeFlag(buf, flag, cmd)
|
|
||||||
if len(flag.Shorthand) > 0 {
|
|
||||||
writeShortFlag(buf, flag, cmd)
|
|
||||||
}
|
|
||||||
if localNonPersistentFlags.Lookup(flag.Name) != nil {
|
|
||||||
writeLocalNonPersistentFlag(buf, flag)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
cmd.InheritedFlags().VisitAll(func(flag *pflag.Flag) {
|
|
||||||
if nonCompletableFlag(flag) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
writeFlag(buf, flag, cmd)
|
|
||||||
if len(flag.Shorthand) > 0 {
|
|
||||||
writeShortFlag(buf, flag, cmd)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
buf.WriteString("\n")
|
|
||||||
}
|
|
||||||
|
|
||||||
func writeRequiredFlag(buf *bytes.Buffer, cmd *Command) {
|
|
||||||
buf.WriteString(" must_have_one_flag=()\n")
|
|
||||||
flags := cmd.NonInheritedFlags()
|
|
||||||
flags.VisitAll(func(flag *pflag.Flag) {
|
|
||||||
if nonCompletableFlag(flag) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
for key := range flag.Annotations {
|
|
||||||
switch key {
|
|
||||||
case BashCompOneRequiredFlag:
|
|
||||||
format := " must_have_one_flag+=(\"--%s"
|
|
||||||
if flag.Value.Type() != "bool" {
|
|
||||||
format += "="
|
|
||||||
}
|
|
||||||
format += "\")\n"
|
|
||||||
buf.WriteString(fmt.Sprintf(format, flag.Name))
|
|
||||||
|
|
||||||
if len(flag.Shorthand) > 0 {
|
|
||||||
buf.WriteString(fmt.Sprintf(" must_have_one_flag+=(\"-%s\")\n", flag.Shorthand))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func writeRequiredNouns(buf *bytes.Buffer, cmd *Command) {
|
|
||||||
buf.WriteString(" must_have_one_noun=()\n")
|
|
||||||
sort.Sort(sort.StringSlice(cmd.ValidArgs))
|
|
||||||
for _, value := range cmd.ValidArgs {
|
|
||||||
buf.WriteString(fmt.Sprintf(" must_have_one_noun+=(%q)\n", value))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func writeCmdAliases(buf *bytes.Buffer, cmd *Command) {
|
|
||||||
if len(cmd.Aliases) == 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
sort.Sort(sort.StringSlice(cmd.Aliases))
|
|
||||||
|
|
||||||
buf.WriteString(fmt.Sprint(` if [[ -z "${BASH_VERSION}" || "${BASH_VERSINFO[0]}" -gt 3 ]]; then`, "\n"))
|
|
||||||
for _, value := range cmd.Aliases {
|
|
||||||
buf.WriteString(fmt.Sprintf(" command_aliases+=(%q)\n", value))
|
|
||||||
buf.WriteString(fmt.Sprintf(" aliashash[%q]=%q\n", value, cmd.Name()))
|
|
||||||
}
|
|
||||||
buf.WriteString(` fi`)
|
|
||||||
buf.WriteString("\n")
|
|
||||||
}
|
|
||||||
func writeArgAliases(buf *bytes.Buffer, cmd *Command) {
|
|
||||||
buf.WriteString(" noun_aliases=()\n")
|
|
||||||
sort.Sort(sort.StringSlice(cmd.ArgAliases))
|
|
||||||
for _, value := range cmd.ArgAliases {
|
|
||||||
buf.WriteString(fmt.Sprintf(" noun_aliases+=(%q)\n", value))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func gen(buf *bytes.Buffer, cmd *Command) {
|
|
||||||
for _, c := range cmd.Commands() {
|
|
||||||
if !c.IsAvailableCommand() || c == cmd.helpCommand {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
gen(buf, c)
|
|
||||||
}
|
|
||||||
commandName := cmd.CommandPath()
|
|
||||||
commandName = strings.Replace(commandName, " ", "_", -1)
|
|
||||||
commandName = strings.Replace(commandName, ":", "__", -1)
|
|
||||||
|
|
||||||
if cmd.Root() == cmd {
|
|
||||||
buf.WriteString(fmt.Sprintf("_%s_root_command()\n{\n", commandName))
|
|
||||||
} else {
|
|
||||||
buf.WriteString(fmt.Sprintf("_%s()\n{\n", commandName))
|
|
||||||
}
|
|
||||||
|
|
||||||
buf.WriteString(fmt.Sprintf(" last_command=%q\n", commandName))
|
|
||||||
buf.WriteString("\n")
|
|
||||||
buf.WriteString(" command_aliases=()\n")
|
|
||||||
buf.WriteString("\n")
|
|
||||||
|
|
||||||
writeCommands(buf, cmd)
|
|
||||||
writeFlags(buf, cmd)
|
|
||||||
writeRequiredFlag(buf, cmd)
|
|
||||||
writeRequiredNouns(buf, cmd)
|
|
||||||
writeArgAliases(buf, cmd)
|
|
||||||
buf.WriteString("}\n\n")
|
|
||||||
}
|
|
||||||
|
|
||||||
// GenBashCompletion generates bash completion file and writes to the passed writer.
|
|
||||||
func (c *Command) GenBashCompletion(w io.Writer) error {
|
|
||||||
buf := new(bytes.Buffer)
|
|
||||||
writePreamble(buf, c.Name())
|
|
||||||
if len(c.BashCompletionFunction) > 0 {
|
|
||||||
buf.WriteString(c.BashCompletionFunction + "\n")
|
|
||||||
}
|
|
||||||
gen(buf, c)
|
|
||||||
writePostscript(buf, c.Name())
|
|
||||||
|
|
||||||
_, err := buf.WriteTo(w)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func nonCompletableFlag(flag *pflag.Flag) bool {
|
|
||||||
return flag.Hidden || len(flag.Deprecated) > 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// GenBashCompletionFile generates bash completion file.
|
|
||||||
func (c *Command) GenBashCompletionFile(filename string) error {
|
|
||||||
outFile, err := os.Create(filename)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer outFile.Close()
|
|
||||||
|
|
||||||
return c.GenBashCompletion(outFile)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarkFlagRequired adds the BashCompOneRequiredFlag annotation to the named flag if it exists,
|
|
||||||
// and causes your command to report an error if invoked without the flag.
|
|
||||||
func (c *Command) MarkFlagRequired(name string) error {
|
|
||||||
return MarkFlagRequired(c.Flags(), name)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarkPersistentFlagRequired adds the BashCompOneRequiredFlag annotation to the named persistent flag if it exists,
|
|
||||||
// and causes your command to report an error if invoked without the flag.
|
|
||||||
func (c *Command) MarkPersistentFlagRequired(name string) error {
|
|
||||||
return MarkFlagRequired(c.PersistentFlags(), name)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarkFlagRequired adds the BashCompOneRequiredFlag annotation to the named flag if it exists,
|
|
||||||
// and causes your command to report an error if invoked without the flag.
|
|
||||||
func MarkFlagRequired(flags *pflag.FlagSet, name string) error {
|
|
||||||
return flags.SetAnnotation(name, BashCompOneRequiredFlag, []string{"true"})
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarkFlagFilename adds the BashCompFilenameExt annotation to the named flag, if it exists.
|
|
||||||
// Generated bash autocompletion will select filenames for the flag, limiting to named extensions if provided.
|
|
||||||
func (c *Command) MarkFlagFilename(name string, extensions ...string) error {
|
|
||||||
return MarkFlagFilename(c.Flags(), name, extensions...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarkFlagCustom adds the BashCompCustom annotation to the named flag, if it exists.
|
|
||||||
// Generated bash autocompletion will call the bash function f for the flag.
|
|
||||||
func (c *Command) MarkFlagCustom(name string, f string) error {
|
|
||||||
return MarkFlagCustom(c.Flags(), name, f)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarkPersistentFlagFilename adds the BashCompFilenameExt annotation to the named persistent flag, if it exists.
|
|
||||||
// Generated bash autocompletion will select filenames for the flag, limiting to named extensions if provided.
|
|
||||||
func (c *Command) MarkPersistentFlagFilename(name string, extensions ...string) error {
|
|
||||||
return MarkFlagFilename(c.PersistentFlags(), name, extensions...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarkFlagFilename adds the BashCompFilenameExt annotation to the named flag in the flag set, if it exists.
|
|
||||||
// Generated bash autocompletion will select filenames for the flag, limiting to named extensions if provided.
|
|
||||||
func MarkFlagFilename(flags *pflag.FlagSet, name string, extensions ...string) error {
|
|
||||||
return flags.SetAnnotation(name, BashCompFilenameExt, extensions)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarkFlagCustom adds the BashCompCustom annotation to the named flag in the flag set, if it exists.
|
|
||||||
// Generated bash autocompletion will call the bash function f for the flag.
|
|
||||||
func MarkFlagCustom(flags *pflag.FlagSet, name string, f string) error {
|
|
||||||
return flags.SetAnnotation(name, BashCompCustom, []string{f})
|
|
||||||
}
|
|
200
vendor/github.com/spf13/cobra/cobra.go
generated
vendored
200
vendor/github.com/spf13/cobra/cobra.go
generated
vendored
|
@ -1,200 +0,0 @@
|
||||||
// Copyright © 2013 Steve Francia <spf@spf13.com>.
|
|
||||||
//
|
|
||||||
// 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.
|
|
||||||
|
|
||||||
// Commands similar to git, go tools and other modern CLI tools
|
|
||||||
// inspired by go, go-Commander, gh and subcommand
|
|
||||||
|
|
||||||
package cobra
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"reflect"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"text/template"
|
|
||||||
"unicode"
|
|
||||||
)
|
|
||||||
|
|
||||||
var templateFuncs = template.FuncMap{
|
|
||||||
"trim": strings.TrimSpace,
|
|
||||||
"trimRightSpace": trimRightSpace,
|
|
||||||
"trimTrailingWhitespaces": trimRightSpace,
|
|
||||||
"appendIfNotPresent": appendIfNotPresent,
|
|
||||||
"rpad": rpad,
|
|
||||||
"gt": Gt,
|
|
||||||
"eq": Eq,
|
|
||||||
}
|
|
||||||
|
|
||||||
var initializers []func()
|
|
||||||
|
|
||||||
// EnablePrefixMatching allows to set automatic prefix matching. Automatic prefix matching can be a dangerous thing
|
|
||||||
// to automatically enable in CLI tools.
|
|
||||||
// Set this to true to enable it.
|
|
||||||
var EnablePrefixMatching = false
|
|
||||||
|
|
||||||
// EnableCommandSorting controls sorting of the slice of commands, which is turned on by default.
|
|
||||||
// To disable sorting, set it to false.
|
|
||||||
var EnableCommandSorting = true
|
|
||||||
|
|
||||||
// MousetrapHelpText enables an information splash screen on Windows
|
|
||||||
// if the CLI is started from explorer.exe.
|
|
||||||
// To disable the mousetrap, just set this variable to blank string ("").
|
|
||||||
// Works only on Microsoft Windows.
|
|
||||||
var MousetrapHelpText string = `This is a command line tool.
|
|
||||||
|
|
||||||
You need to open cmd.exe and run it from there.
|
|
||||||
`
|
|
||||||
|
|
||||||
// AddTemplateFunc adds a template function that's available to Usage and Help
|
|
||||||
// template generation.
|
|
||||||
func AddTemplateFunc(name string, tmplFunc interface{}) {
|
|
||||||
templateFuncs[name] = tmplFunc
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddTemplateFuncs adds multiple template functions that are available to Usage and
|
|
||||||
// Help template generation.
|
|
||||||
func AddTemplateFuncs(tmplFuncs template.FuncMap) {
|
|
||||||
for k, v := range tmplFuncs {
|
|
||||||
templateFuncs[k] = v
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// OnInitialize sets the passed functions to be run when each command's
|
|
||||||
// Execute method is called.
|
|
||||||
func OnInitialize(y ...func()) {
|
|
||||||
initializers = append(initializers, y...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIXME Gt is unused by cobra and should be removed in a version 2. It exists only for compatibility with users of cobra.
|
|
||||||
|
|
||||||
// Gt takes two types and checks whether the first type is greater than the second. In case of types Arrays, Chans,
|
|
||||||
// Maps and Slices, Gt will compare their lengths. Ints are compared directly while strings are first parsed as
|
|
||||||
// ints and then compared.
|
|
||||||
func Gt(a interface{}, b interface{}) bool {
|
|
||||||
var left, right int64
|
|
||||||
av := reflect.ValueOf(a)
|
|
||||||
|
|
||||||
switch av.Kind() {
|
|
||||||
case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice:
|
|
||||||
left = int64(av.Len())
|
|
||||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
|
||||||
left = av.Int()
|
|
||||||
case reflect.String:
|
|
||||||
left, _ = strconv.ParseInt(av.String(), 10, 64)
|
|
||||||
}
|
|
||||||
|
|
||||||
bv := reflect.ValueOf(b)
|
|
||||||
|
|
||||||
switch bv.Kind() {
|
|
||||||
case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice:
|
|
||||||
right = int64(bv.Len())
|
|
||||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
|
||||||
right = bv.Int()
|
|
||||||
case reflect.String:
|
|
||||||
right, _ = strconv.ParseInt(bv.String(), 10, 64)
|
|
||||||
}
|
|
||||||
|
|
||||||
return left > right
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIXME Eq is unused by cobra and should be removed in a version 2. It exists only for compatibility with users of cobra.
|
|
||||||
|
|
||||||
// Eq takes two types and checks whether they are equal. Supported types are int and string. Unsupported types will panic.
|
|
||||||
func Eq(a interface{}, b interface{}) bool {
|
|
||||||
av := reflect.ValueOf(a)
|
|
||||||
bv := reflect.ValueOf(b)
|
|
||||||
|
|
||||||
switch av.Kind() {
|
|
||||||
case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice:
|
|
||||||
panic("Eq called on unsupported type")
|
|
||||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
|
||||||
return av.Int() == bv.Int()
|
|
||||||
case reflect.String:
|
|
||||||
return av.String() == bv.String()
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func trimRightSpace(s string) string {
|
|
||||||
return strings.TrimRightFunc(s, unicode.IsSpace)
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIXME appendIfNotPresent is unused by cobra and should be removed in a version 2. It exists only for compatibility with users of cobra.
|
|
||||||
|
|
||||||
// appendIfNotPresent will append stringToAppend to the end of s, but only if it's not yet present in s.
|
|
||||||
func appendIfNotPresent(s, stringToAppend string) string {
|
|
||||||
if strings.Contains(s, stringToAppend) {
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
return s + " " + stringToAppend
|
|
||||||
}
|
|
||||||
|
|
||||||
// rpad adds padding to the right of a string.
|
|
||||||
func rpad(s string, padding int) string {
|
|
||||||
template := fmt.Sprintf("%%-%ds", padding)
|
|
||||||
return fmt.Sprintf(template, s)
|
|
||||||
}
|
|
||||||
|
|
||||||
// tmpl executes the given template text on data, writing the result to w.
|
|
||||||
func tmpl(w io.Writer, text string, data interface{}) error {
|
|
||||||
t := template.New("top")
|
|
||||||
t.Funcs(templateFuncs)
|
|
||||||
template.Must(t.Parse(text))
|
|
||||||
return t.Execute(w, data)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ld compares two strings and returns the levenshtein distance between them.
|
|
||||||
func ld(s, t string, ignoreCase bool) int {
|
|
||||||
if ignoreCase {
|
|
||||||
s = strings.ToLower(s)
|
|
||||||
t = strings.ToLower(t)
|
|
||||||
}
|
|
||||||
d := make([][]int, len(s)+1)
|
|
||||||
for i := range d {
|
|
||||||
d[i] = make([]int, len(t)+1)
|
|
||||||
}
|
|
||||||
for i := range d {
|
|
||||||
d[i][0] = i
|
|
||||||
}
|
|
||||||
for j := range d[0] {
|
|
||||||
d[0][j] = j
|
|
||||||
}
|
|
||||||
for j := 1; j <= len(t); j++ {
|
|
||||||
for i := 1; i <= len(s); i++ {
|
|
||||||
if s[i-1] == t[j-1] {
|
|
||||||
d[i][j] = d[i-1][j-1]
|
|
||||||
} else {
|
|
||||||
min := d[i-1][j]
|
|
||||||
if d[i][j-1] < min {
|
|
||||||
min = d[i][j-1]
|
|
||||||
}
|
|
||||||
if d[i-1][j-1] < min {
|
|
||||||
min = d[i-1][j-1]
|
|
||||||
}
|
|
||||||
d[i][j] = min + 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
return d[len(s)][len(t)]
|
|
||||||
}
|
|
||||||
|
|
||||||
func stringInSlice(a string, list []string) bool {
|
|
||||||
for _, b := range list {
|
|
||||||
if b == a {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
202
vendor/github.com/spf13/cobra/cobra/cmd/testdata/LICENSE.golden
generated
vendored
202
vendor/github.com/spf13/cobra/cobra/cmd/testdata/LICENSE.golden
generated
vendored
|
@ -1,202 +0,0 @@
|
||||||
|
|
||||||
Apache License
|
|
||||||
Version 2.0, January 2004
|
|
||||||
http://www.apache.org/licenses/
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction,
|
|
||||||
and distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by
|
|
||||||
the copyright owner that is granting the License.
|
|
||||||
|
|
||||||
"Legal Entity" shall mean the union of the acting entity and all
|
|
||||||
other entities that control, are controlled by, or are under common
|
|
||||||
control with that entity. For the purposes of this definition,
|
|
||||||
"control" means (i) the power, direct or indirect, to cause the
|
|
||||||
direction or management of such entity, whether by contract or
|
|
||||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity
|
|
||||||
exercising permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications,
|
|
||||||
including but not limited to software source code, documentation
|
|
||||||
source, and configuration files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical
|
|
||||||
transformation or translation of a Source form, including but
|
|
||||||
not limited to compiled object code, generated documentation,
|
|
||||||
and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or
|
|
||||||
Object form, made available under the License, as indicated by a
|
|
||||||
copyright notice that is included in or attached to the work
|
|
||||||
(an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
form, that is based on (or derived from) the Work and for which the
|
|
||||||
editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
of this License, Derivative Works shall not include works that remain
|
|
||||||
separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including
|
|
||||||
the original version of the Work and any modifications or additions
|
|
||||||
to that Work or Derivative Works thereof, that is intentionally
|
|
||||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
||||||
or by an individual or Legal Entity authorized to submit on behalf of
|
|
||||||
the copyright owner. For the purposes of this definition, "submitted"
|
|
||||||
means any form of electronic, verbal, or written communication sent
|
|
||||||
to the Licensor or its representatives, including but not limited to
|
|
||||||
communication on electronic mailing lists, source code control systems,
|
|
||||||
and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
Licensor for the purpose of discussing and improving the Work, but
|
|
||||||
excluding communication that is conspicuously marked or otherwise
|
|
||||||
designated in writing by the copyright owner as "Not a Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
||||||
on behalf of whom a Contribution has been received by Licensor and
|
|
||||||
subsequently incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
publicly display, publicly perform, sublicense, and distribute the
|
|
||||||
Work and such Derivative Works in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor 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, and otherwise transfer the Work,
|
|
||||||
where such license applies only to those patent claims licensable
|
|
||||||
by such Contributor that are necessarily infringed by their
|
|
||||||
Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
with the Work to which such Contribution(s) was submitted. If You
|
|
||||||
institute patent litigation against any entity (including a
|
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
||||||
or a Contribution incorporated within the Work constitutes direct
|
|
||||||
or contributory patent infringement, then any patent licenses
|
|
||||||
granted to You under this License for that Work shall terminate
|
|
||||||
as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution. You may reproduce and distribute copies of the
|
|
||||||
Work or Derivative Works thereof in any medium, with or without
|
|
||||||
modifications, and in Source or Object form, provided that You
|
|
||||||
meet the following conditions:
|
|
||||||
|
|
||||||
(a) You must give any other recipients of the Work or
|
|
||||||
Derivative Works a copy of this License; and
|
|
||||||
|
|
||||||
(b) You must cause any modified files to carry prominent notices
|
|
||||||
stating that You changed the files; and
|
|
||||||
|
|
||||||
(c) You must retain, in the Source form of any Derivative Works
|
|
||||||
that You distribute, all copyright, patent, trademark, and
|
|
||||||
attribution notices from the Source form of the Work,
|
|
||||||
excluding those notices that do not pertain to any part of
|
|
||||||
the Derivative Works; and
|
|
||||||
|
|
||||||
(d) If the Work includes a "NOTICE" text file as part of its
|
|
||||||
distribution, then any Derivative Works that You distribute must
|
|
||||||
include a readable copy of the attribution notices contained
|
|
||||||
within such NOTICE file, excluding those notices that do not
|
|
||||||
pertain to any part of the Derivative Works, in at least one
|
|
||||||
of the following places: within a NOTICE text file distributed
|
|
||||||
as part of the Derivative Works; within the Source form or
|
|
||||||
documentation, if provided along with the Derivative Works; or,
|
|
||||||
within a display generated by the Derivative Works, if and
|
|
||||||
wherever such third-party notices normally appear. The contents
|
|
||||||
of the NOTICE file are for informational purposes only and
|
|
||||||
do not modify the License. You may add Your own attribution
|
|
||||||
notices within Derivative Works that You distribute, alongside
|
|
||||||
or as an addendum to the NOTICE text from the Work, provided
|
|
||||||
that such additional attribution notices cannot be construed
|
|
||||||
as modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and
|
|
||||||
may provide additional or different license terms and conditions
|
|
||||||
for use, reproduction, or distribution of Your modifications, or
|
|
||||||
for any such Derivative Works as a whole, provided Your use,
|
|
||||||
reproduction, and distribution of the Work otherwise complies with
|
|
||||||
the conditions stated in this License.
|
|
||||||
|
|
||||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
||||||
any Contribution intentionally submitted for inclusion in the Work
|
|
||||||
by You to the Licensor shall be under the terms and conditions of
|
|
||||||
this License, without any additional terms or conditions.
|
|
||||||
Notwithstanding the above, nothing herein shall supersede or modify
|
|
||||||
the terms of any separate license agreement you may have executed
|
|
||||||
with Licensor regarding such Contributions.
|
|
||||||
|
|
||||||
6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
except as required for reasonable and customary use in describing the
|
|
||||||
origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
||||||
agreed to in writing, Licensor provides the Work (and each
|
|
||||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
implied, including, without limitation, any warranties or conditions
|
|
||||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
||||||
appropriateness of using or redistributing the Work and assume any
|
|
||||||
risks associated with Your exercise of permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability. In no event and under no legal theory,
|
|
||||||
whether in tort (including negligence), contract, or otherwise,
|
|
||||||
unless required by applicable law (such as deliberate and grossly
|
|
||||||
negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
liable to You for damages, including any direct, indirect, special,
|
|
||||||
incidental, or consequential damages of any character arising as a
|
|
||||||
result of this License or out of the use or inability to use the
|
|
||||||
Work (including but not limited to damages for loss of goodwill,
|
|
||||||
work stoppage, computer failure or malfunction, or any and all
|
|
||||||
other commercial damages or losses), even if such Contributor
|
|
||||||
has been advised of the possibility of such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability. While redistributing
|
|
||||||
the Work or Derivative Works thereof, You may choose to offer,
|
|
||||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
||||||
or other liability obligations and/or rights consistent with this
|
|
||||||
License. However, in accepting such obligations, You may act only
|
|
||||||
on Your own behalf and on Your sole responsibility, not on behalf
|
|
||||||
of any other Contributor, and only if You agree to indemnify,
|
|
||||||
defend, and hold each Contributor harmless for any liability
|
|
||||||
incurred by, or claims asserted against, such Contributor by reason
|
|
||||||
of your accepting any such warranty or additional liability.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
APPENDIX: How to apply the Apache License to your work.
|
|
||||||
|
|
||||||
To apply the Apache License to your work, attach the following
|
|
||||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
||||||
replaced with your own identifying information. (Don't include
|
|
||||||
the brackets!) The text should be enclosed in the appropriate
|
|
||||||
comment syntax for the file format. We also recommend that a
|
|
||||||
file or class name and description of purpose be included on the
|
|
||||||
same "printed page" as the copyright notice for easier
|
|
||||||
identification within third-party archives.
|
|
||||||
|
|
||||||
Copyright [yyyy] [name of copyright owner]
|
|
||||||
|
|
||||||
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.
|
|
1517
vendor/github.com/spf13/cobra/command.go
generated
vendored
1517
vendor/github.com/spf13/cobra/command.go
generated
vendored
File diff suppressed because it is too large
Load diff
5
vendor/github.com/spf13/cobra/command_notwin.go
generated
vendored
5
vendor/github.com/spf13/cobra/command_notwin.go
generated
vendored
|
@ -1,5 +0,0 @@
|
||||||
// +build !windows
|
|
||||||
|
|
||||||
package cobra
|
|
||||||
|
|
||||||
var preExecHookFn func(*Command)
|
|
20
vendor/github.com/spf13/cobra/command_win.go
generated
vendored
20
vendor/github.com/spf13/cobra/command_win.go
generated
vendored
|
@ -1,20 +0,0 @@
|
||||||
// +build windows
|
|
||||||
|
|
||||||
package cobra
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/inconshreveable/mousetrap"
|
|
||||||
)
|
|
||||||
|
|
||||||
var preExecHookFn = preExecHook
|
|
||||||
|
|
||||||
func preExecHook(c *Command) {
|
|
||||||
if MousetrapHelpText != "" && mousetrap.StartedByExplorer() {
|
|
||||||
c.Print(MousetrapHelpText)
|
|
||||||
time.Sleep(5 * time.Second)
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
126
vendor/github.com/spf13/cobra/zsh_completions.go
generated
vendored
126
vendor/github.com/spf13/cobra/zsh_completions.go
generated
vendored
|
@ -1,126 +0,0 @@
|
||||||
package cobra
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"os"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// GenZshCompletionFile generates zsh completion file.
|
|
||||||
func (c *Command) GenZshCompletionFile(filename string) error {
|
|
||||||
outFile, err := os.Create(filename)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer outFile.Close()
|
|
||||||
|
|
||||||
return c.GenZshCompletion(outFile)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GenZshCompletion generates a zsh completion file and writes to the passed writer.
|
|
||||||
func (c *Command) GenZshCompletion(w io.Writer) error {
|
|
||||||
buf := new(bytes.Buffer)
|
|
||||||
|
|
||||||
writeHeader(buf, c)
|
|
||||||
maxDepth := maxDepth(c)
|
|
||||||
writeLevelMapping(buf, maxDepth)
|
|
||||||
writeLevelCases(buf, maxDepth, c)
|
|
||||||
|
|
||||||
_, err := buf.WriteTo(w)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func writeHeader(w io.Writer, cmd *Command) {
|
|
||||||
fmt.Fprintf(w, "#compdef %s\n\n", cmd.Name())
|
|
||||||
}
|
|
||||||
|
|
||||||
func maxDepth(c *Command) int {
|
|
||||||
if len(c.Commands()) == 0 {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
maxDepthSub := 0
|
|
||||||
for _, s := range c.Commands() {
|
|
||||||
subDepth := maxDepth(s)
|
|
||||||
if subDepth > maxDepthSub {
|
|
||||||
maxDepthSub = subDepth
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 1 + maxDepthSub
|
|
||||||
}
|
|
||||||
|
|
||||||
func writeLevelMapping(w io.Writer, numLevels int) {
|
|
||||||
fmt.Fprintln(w, `_arguments \`)
|
|
||||||
for i := 1; i <= numLevels; i++ {
|
|
||||||
fmt.Fprintf(w, ` '%d: :->level%d' \`, i, i)
|
|
||||||
fmt.Fprintln(w)
|
|
||||||
}
|
|
||||||
fmt.Fprintf(w, ` '%d: :%s'`, numLevels+1, "_files")
|
|
||||||
fmt.Fprintln(w)
|
|
||||||
}
|
|
||||||
|
|
||||||
func writeLevelCases(w io.Writer, maxDepth int, root *Command) {
|
|
||||||
fmt.Fprintln(w, "case $state in")
|
|
||||||
defer fmt.Fprintln(w, "esac")
|
|
||||||
|
|
||||||
for i := 1; i <= maxDepth; i++ {
|
|
||||||
fmt.Fprintf(w, " level%d)\n", i)
|
|
||||||
writeLevel(w, root, i)
|
|
||||||
fmt.Fprintln(w, " ;;")
|
|
||||||
}
|
|
||||||
fmt.Fprintln(w, " *)")
|
|
||||||
fmt.Fprintln(w, " _arguments '*: :_files'")
|
|
||||||
fmt.Fprintln(w, " ;;")
|
|
||||||
}
|
|
||||||
|
|
||||||
func writeLevel(w io.Writer, root *Command, i int) {
|
|
||||||
fmt.Fprintf(w, " case $words[%d] in\n", i)
|
|
||||||
defer fmt.Fprintln(w, " esac")
|
|
||||||
|
|
||||||
commands := filterByLevel(root, i)
|
|
||||||
byParent := groupByParent(commands)
|
|
||||||
|
|
||||||
for p, c := range byParent {
|
|
||||||
names := names(c)
|
|
||||||
fmt.Fprintf(w, " %s)\n", p)
|
|
||||||
fmt.Fprintf(w, " _arguments '%d: :(%s)'\n", i, strings.Join(names, " "))
|
|
||||||
fmt.Fprintln(w, " ;;")
|
|
||||||
}
|
|
||||||
fmt.Fprintln(w, " *)")
|
|
||||||
fmt.Fprintln(w, " _arguments '*: :_files'")
|
|
||||||
fmt.Fprintln(w, " ;;")
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func filterByLevel(c *Command, l int) []*Command {
|
|
||||||
cs := make([]*Command, 0)
|
|
||||||
if l == 0 {
|
|
||||||
cs = append(cs, c)
|
|
||||||
return cs
|
|
||||||
}
|
|
||||||
for _, s := range c.Commands() {
|
|
||||||
cs = append(cs, filterByLevel(s, l-1)...)
|
|
||||||
}
|
|
||||||
return cs
|
|
||||||
}
|
|
||||||
|
|
||||||
func groupByParent(commands []*Command) map[string][]*Command {
|
|
||||||
m := make(map[string][]*Command)
|
|
||||||
for _, c := range commands {
|
|
||||||
parent := c.Parent()
|
|
||||||
if parent == nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
m[parent.Name()] = append(m[parent.Name()], c)
|
|
||||||
}
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func names(commands []*Command) []string {
|
|
||||||
ns := make([]string, len(commands))
|
|
||||||
for i, c := range commands {
|
|
||||||
ns[i] = c.Name()
|
|
||||||
}
|
|
||||||
return ns
|
|
||||||
}
|
|
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)
|
|
||||||
}
|
|
209
vendor/github.com/spf13/pflag/bytes.go
generated
vendored
209
vendor/github.com/spf13/pflag/bytes.go
generated
vendored
|
@ -1,209 +0,0 @@
|
||||||
package pflag
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/base64"
|
|
||||||
"encoding/hex"
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// BytesHex adapts []byte for use as a flag. Value of flag is HEX encoded
|
|
||||||
type bytesHexValue []byte
|
|
||||||
|
|
||||||
// String implements pflag.Value.String.
|
|
||||||
func (bytesHex bytesHexValue) String() string {
|
|
||||||
return fmt.Sprintf("%X", []byte(bytesHex))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set implements pflag.Value.Set.
|
|
||||||
func (bytesHex *bytesHexValue) Set(value string) error {
|
|
||||||
bin, err := hex.DecodeString(strings.TrimSpace(value))
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
*bytesHex = bin
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Type implements pflag.Value.Type.
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
|
|
||||||
// BytesBase64 adapts []byte for use as a flag. Value of flag is Base64 encoded
|
|
||||||
type bytesBase64Value []byte
|
|
||||||
|
|
||||||
// String implements pflag.Value.String.
|
|
||||||
func (bytesBase64 bytesBase64Value) String() string {
|
|
||||||
return base64.StdEncoding.EncodeToString([]byte(bytesBase64))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set implements pflag.Value.Set.
|
|
||||||
func (bytesBase64 *bytesBase64Value) Set(value string) error {
|
|
||||||
bin, err := base64.StdEncoding.DecodeString(strings.TrimSpace(value))
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
*bytesBase64 = bin
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Type implements pflag.Value.Type.
|
|
||||||
func (*bytesBase64Value) Type() string {
|
|
||||||
return "bytesBase64"
|
|
||||||
}
|
|
||||||
|
|
||||||
func newBytesBase64Value(val []byte, p *[]byte) *bytesBase64Value {
|
|
||||||
*p = val
|
|
||||||
return (*bytesBase64Value)(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
func bytesBase64ValueConv(sval string) (interface{}, error) {
|
|
||||||
|
|
||||||
bin, err := base64.StdEncoding.DecodeString(sval)
|
|
||||||
if err == nil {
|
|
||||||
return bin, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil, fmt.Errorf("invalid string being converted to Bytes: %s %s", sval, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetBytesBase64 return the []byte value of a flag with the given name
|
|
||||||
func (f *FlagSet) GetBytesBase64(name string) ([]byte, error) {
|
|
||||||
val, err := f.getFlagType(name, "bytesBase64", bytesBase64ValueConv)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return []byte{}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return val.([]byte), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// BytesBase64Var 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) BytesBase64Var(p *[]byte, name string, value []byte, usage string) {
|
|
||||||
f.VarP(newBytesBase64Value(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// BytesBase64VarP is like BytesBase64Var, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) BytesBase64VarP(p *[]byte, name, shorthand string, value []byte, usage string) {
|
|
||||||
f.VarP(newBytesBase64Value(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// BytesBase64Var 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 BytesBase64Var(p *[]byte, name string, value []byte, usage string) {
|
|
||||||
CommandLine.VarP(newBytesBase64Value(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// BytesBase64VarP is like BytesBase64Var, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func BytesBase64VarP(p *[]byte, name, shorthand string, value []byte, usage string) {
|
|
||||||
CommandLine.VarP(newBytesBase64Value(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// BytesBase64 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) BytesBase64(name string, value []byte, usage string) *[]byte {
|
|
||||||
p := new([]byte)
|
|
||||||
f.BytesBase64VarP(p, name, "", value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// BytesBase64P is like BytesBase64, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) BytesBase64P(name, shorthand string, value []byte, usage string) *[]byte {
|
|
||||||
p := new([]byte)
|
|
||||||
f.BytesBase64VarP(p, name, shorthand, value, usage)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// BytesBase64 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 BytesBase64(name string, value []byte, usage string) *[]byte {
|
|
||||||
return CommandLine.BytesBase64P(name, "", value, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// BytesBase64P is like BytesBase64, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func BytesBase64P(name, shorthand string, value []byte, usage string) *[]byte {
|
|
||||||
return CommandLine.BytesBase64P(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)
|
|
||||||
}
|
|
1227
vendor/github.com/spf13/pflag/flag.go
generated
vendored
1227
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)
|
|
||||||
}
|
|
149
vendor/github.com/spf13/pflag/string_to_int.go
generated
vendored
149
vendor/github.com/spf13/pflag/string_to_int.go
generated
vendored
|
@ -1,149 +0,0 @@
|
||||||
package pflag
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"fmt"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// -- stringToInt Value
|
|
||||||
type stringToIntValue struct {
|
|
||||||
value *map[string]int
|
|
||||||
changed bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func newStringToIntValue(val map[string]int, p *map[string]int) *stringToIntValue {
|
|
||||||
ssv := new(stringToIntValue)
|
|
||||||
ssv.value = p
|
|
||||||
*ssv.value = val
|
|
||||||
return ssv
|
|
||||||
}
|
|
||||||
|
|
||||||
// Format: a=1,b=2
|
|
||||||
func (s *stringToIntValue) Set(val string) error {
|
|
||||||
ss := strings.Split(val, ",")
|
|
||||||
out := make(map[string]int, len(ss))
|
|
||||||
for _, pair := range ss {
|
|
||||||
kv := strings.SplitN(pair, "=", 2)
|
|
||||||
if len(kv) != 2 {
|
|
||||||
return fmt.Errorf("%s must be formatted as key=value", pair)
|
|
||||||
}
|
|
||||||
var err error
|
|
||||||
out[kv[0]], err = strconv.Atoi(kv[1])
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if !s.changed {
|
|
||||||
*s.value = out
|
|
||||||
} else {
|
|
||||||
for k, v := range out {
|
|
||||||
(*s.value)[k] = v
|
|
||||||
}
|
|
||||||
}
|
|
||||||
s.changed = true
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *stringToIntValue) Type() string {
|
|
||||||
return "stringToInt"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *stringToIntValue) String() string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
i := 0
|
|
||||||
for k, v := range *s.value {
|
|
||||||
if i > 0 {
|
|
||||||
buf.WriteRune(',')
|
|
||||||
}
|
|
||||||
buf.WriteString(k)
|
|
||||||
buf.WriteRune('=')
|
|
||||||
buf.WriteString(strconv.Itoa(v))
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
return "[" + buf.String() + "]"
|
|
||||||
}
|
|
||||||
|
|
||||||
func stringToIntConv(val string) (interface{}, error) {
|
|
||||||
val = strings.Trim(val, "[]")
|
|
||||||
// An empty string would cause an empty map
|
|
||||||
if len(val) == 0 {
|
|
||||||
return map[string]int{}, nil
|
|
||||||
}
|
|
||||||
ss := strings.Split(val, ",")
|
|
||||||
out := make(map[string]int, len(ss))
|
|
||||||
for _, pair := range ss {
|
|
||||||
kv := strings.SplitN(pair, "=", 2)
|
|
||||||
if len(kv) != 2 {
|
|
||||||
return nil, fmt.Errorf("%s must be formatted as key=value", pair)
|
|
||||||
}
|
|
||||||
var err error
|
|
||||||
out[kv[0]], err = strconv.Atoi(kv[1])
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return out, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetStringToInt return the map[string]int value of a flag with the given name
|
|
||||||
func (f *FlagSet) GetStringToInt(name string) (map[string]int, error) {
|
|
||||||
val, err := f.getFlagType(name, "stringToInt", stringToIntConv)
|
|
||||||
if err != nil {
|
|
||||||
return map[string]int{}, err
|
|
||||||
}
|
|
||||||
return val.(map[string]int), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringToIntVar defines a string flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a map[string]int variable in which to store the values of the multiple flags.
|
|
||||||
// The value of each argument will not try to be separated by comma
|
|
||||||
func (f *FlagSet) StringToIntVar(p *map[string]int, name string, value map[string]int, usage string) {
|
|
||||||
f.VarP(newStringToIntValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringToIntVarP is like StringToIntVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) StringToIntVarP(p *map[string]int, name, shorthand string, value map[string]int, usage string) {
|
|
||||||
f.VarP(newStringToIntValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringToIntVar defines a string flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a map[string]int variable in which to store the value of the flag.
|
|
||||||
// The value of each argument will not try to be separated by comma
|
|
||||||
func StringToIntVar(p *map[string]int, name string, value map[string]int, usage string) {
|
|
||||||
CommandLine.VarP(newStringToIntValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringToIntVarP is like StringToIntVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func StringToIntVarP(p *map[string]int, name, shorthand string, value map[string]int, usage string) {
|
|
||||||
CommandLine.VarP(newStringToIntValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringToInt defines a string flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a map[string]int variable that stores the value of the flag.
|
|
||||||
// The value of each argument will not try to be separated by comma
|
|
||||||
func (f *FlagSet) StringToInt(name string, value map[string]int, usage string) *map[string]int {
|
|
||||||
p := map[string]int{}
|
|
||||||
f.StringToIntVarP(&p, name, "", value, usage)
|
|
||||||
return &p
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringToIntP is like StringToInt, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) StringToIntP(name, shorthand string, value map[string]int, usage string) *map[string]int {
|
|
||||||
p := map[string]int{}
|
|
||||||
f.StringToIntVarP(&p, name, shorthand, value, usage)
|
|
||||||
return &p
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringToInt defines a string flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a map[string]int variable that stores the value of the flag.
|
|
||||||
// The value of each argument will not try to be separated by comma
|
|
||||||
func StringToInt(name string, value map[string]int, usage string) *map[string]int {
|
|
||||||
return CommandLine.StringToIntP(name, "", value, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringToIntP is like StringToInt, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func StringToIntP(name, shorthand string, value map[string]int, usage string) *map[string]int {
|
|
||||||
return CommandLine.StringToIntP(name, shorthand, value, usage)
|
|
||||||
}
|
|
160
vendor/github.com/spf13/pflag/string_to_string.go
generated
vendored
160
vendor/github.com/spf13/pflag/string_to_string.go
generated
vendored
|
@ -1,160 +0,0 @@
|
||||||
package pflag
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/csv"
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// -- stringToString Value
|
|
||||||
type stringToStringValue struct {
|
|
||||||
value *map[string]string
|
|
||||||
changed bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func newStringToStringValue(val map[string]string, p *map[string]string) *stringToStringValue {
|
|
||||||
ssv := new(stringToStringValue)
|
|
||||||
ssv.value = p
|
|
||||||
*ssv.value = val
|
|
||||||
return ssv
|
|
||||||
}
|
|
||||||
|
|
||||||
// Format: a=1,b=2
|
|
||||||
func (s *stringToStringValue) Set(val string) error {
|
|
||||||
var ss []string
|
|
||||||
n := strings.Count(val, "=")
|
|
||||||
switch n {
|
|
||||||
case 0:
|
|
||||||
return fmt.Errorf("%s must be formatted as key=value", val)
|
|
||||||
case 1:
|
|
||||||
ss = append(ss, strings.Trim(val, `"`))
|
|
||||||
default:
|
|
||||||
r := csv.NewReader(strings.NewReader(val))
|
|
||||||
var err error
|
|
||||||
ss, err = r.Read()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
out := make(map[string]string, len(ss))
|
|
||||||
for _, pair := range ss {
|
|
||||||
kv := strings.SplitN(pair, "=", 2)
|
|
||||||
if len(kv) != 2 {
|
|
||||||
return fmt.Errorf("%s must be formatted as key=value", pair)
|
|
||||||
}
|
|
||||||
out[kv[0]] = kv[1]
|
|
||||||
}
|
|
||||||
if !s.changed {
|
|
||||||
*s.value = out
|
|
||||||
} else {
|
|
||||||
for k, v := range out {
|
|
||||||
(*s.value)[k] = v
|
|
||||||
}
|
|
||||||
}
|
|
||||||
s.changed = true
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *stringToStringValue) Type() string {
|
|
||||||
return "stringToString"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *stringToStringValue) String() string {
|
|
||||||
records := make([]string, 0, len(*s.value)>>1)
|
|
||||||
for k, v := range *s.value {
|
|
||||||
records = append(records, k+"="+v)
|
|
||||||
}
|
|
||||||
|
|
||||||
var buf bytes.Buffer
|
|
||||||
w := csv.NewWriter(&buf)
|
|
||||||
if err := w.Write(records); err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
w.Flush()
|
|
||||||
return "[" + strings.TrimSpace(buf.String()) + "]"
|
|
||||||
}
|
|
||||||
|
|
||||||
func stringToStringConv(val string) (interface{}, error) {
|
|
||||||
val = strings.Trim(val, "[]")
|
|
||||||
// An empty string would cause an empty map
|
|
||||||
if len(val) == 0 {
|
|
||||||
return map[string]string{}, nil
|
|
||||||
}
|
|
||||||
r := csv.NewReader(strings.NewReader(val))
|
|
||||||
ss, err := r.Read()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
out := make(map[string]string, len(ss))
|
|
||||||
for _, pair := range ss {
|
|
||||||
kv := strings.SplitN(pair, "=", 2)
|
|
||||||
if len(kv) != 2 {
|
|
||||||
return nil, fmt.Errorf("%s must be formatted as key=value", pair)
|
|
||||||
}
|
|
||||||
out[kv[0]] = kv[1]
|
|
||||||
}
|
|
||||||
return out, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetStringToString return the map[string]string value of a flag with the given name
|
|
||||||
func (f *FlagSet) GetStringToString(name string) (map[string]string, error) {
|
|
||||||
val, err := f.getFlagType(name, "stringToString", stringToStringConv)
|
|
||||||
if err != nil {
|
|
||||||
return map[string]string{}, err
|
|
||||||
}
|
|
||||||
return val.(map[string]string), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringToStringVar defines a string flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a map[string]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
|
|
||||||
func (f *FlagSet) StringToStringVar(p *map[string]string, name string, value map[string]string, usage string) {
|
|
||||||
f.VarP(newStringToStringValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringToStringVarP is like StringToStringVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) StringToStringVarP(p *map[string]string, name, shorthand string, value map[string]string, usage string) {
|
|
||||||
f.VarP(newStringToStringValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringToStringVar defines a string flag with specified name, default value, and usage string.
|
|
||||||
// The argument p points to a map[string]string variable in which to store the value of the flag.
|
|
||||||
// The value of each argument will not try to be separated by comma
|
|
||||||
func StringToStringVar(p *map[string]string, name string, value map[string]string, usage string) {
|
|
||||||
CommandLine.VarP(newStringToStringValue(value, p), name, "", usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringToStringVarP is like StringToStringVar, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func StringToStringVarP(p *map[string]string, name, shorthand string, value map[string]string, usage string) {
|
|
||||||
CommandLine.VarP(newStringToStringValue(value, p), name, shorthand, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringToString defines a string flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a map[string]string variable that stores the value of the flag.
|
|
||||||
// The value of each argument will not try to be separated by comma
|
|
||||||
func (f *FlagSet) StringToString(name string, value map[string]string, usage string) *map[string]string {
|
|
||||||
p := map[string]string{}
|
|
||||||
f.StringToStringVarP(&p, name, "", value, usage)
|
|
||||||
return &p
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringToStringP is like StringToString, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func (f *FlagSet) StringToStringP(name, shorthand string, value map[string]string, usage string) *map[string]string {
|
|
||||||
p := map[string]string{}
|
|
||||||
f.StringToStringVarP(&p, name, shorthand, value, usage)
|
|
||||||
return &p
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringToString defines a string flag with specified name, default value, and usage string.
|
|
||||||
// The return value is the address of a map[string]string variable that stores the value of the flag.
|
|
||||||
// The value of each argument will not try to be separated by comma
|
|
||||||
func StringToString(name string, value map[string]string, usage string) *map[string]string {
|
|
||||||
return CommandLine.StringToStringP(name, "", value, usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
// StringToStringP is like StringToString, but accepts a shorthand letter that can be used after a single dash.
|
|
||||||
func StringToStringP(name, shorthand string, value map[string]string, usage string) *map[string]string {
|
|
||||||
return CommandLine.StringToStringP(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)
|
|
||||||
}
|
|
16
vendor/github.com/tredoe/osutil/AUTHORS.md
generated
vendored
16
vendor/github.com/tredoe/osutil/AUTHORS.md
generated
vendored
|
@ -1,16 +0,0 @@
|
||||||
# Authors
|
|
||||||
|
|
||||||
This is the official list of authors for copyright purposes.
|
|
||||||
This file is distinct from the 'CONTRIBUTORS' file. See the latter for an explanation.
|
|
||||||
|
|
||||||
Names should be added to this file as:
|
|
||||||
|
|
||||||
Name or Organization <email address> / (url address)
|
|
||||||
|
|
||||||
(The email address is not required for organizations)
|
|
||||||
|
|
||||||
Please keep the list sorted.
|
|
||||||
|
|
||||||
## Code
|
|
||||||
|
|
||||||
* Jonas mg (https://github.com/tredoe)
|
|
18
vendor/github.com/tredoe/osutil/CONTRIBUTORS.md
generated
vendored
18
vendor/github.com/tredoe/osutil/CONTRIBUTORS.md
generated
vendored
|
@ -1,18 +0,0 @@
|
||||||
# Contributors
|
|
||||||
|
|
||||||
This is the official list of people who can contribute (and typically
|
|
||||||
have contributed) to the repository.
|
|
||||||
|
|
||||||
The 'AUTHORS' file lists the copyright holders; this file lists people. For
|
|
||||||
example, the employees of an organization are listed here but not in 'AUTHORS',
|
|
||||||
because the organization holds the copyright.
|
|
||||||
|
|
||||||
Names should be added to this file as:
|
|
||||||
|
|
||||||
Name <email address> / (url address)
|
|
||||||
|
|
||||||
Please keep the list sorted.
|
|
||||||
|
|
||||||
## Code
|
|
||||||
|
|
||||||
* Jonas mg (https://github.com/tredoe)
|
|
374
vendor/github.com/tredoe/osutil/LICENSE-MPL.txt
generated
vendored
374
vendor/github.com/tredoe/osutil/LICENSE-MPL.txt
generated
vendored
|
@ -1,374 +0,0 @@
|
||||||
Mozilla Public License Version 2.0
|
|
||||||
==================================
|
|
||||||
|
|
||||||
1. Definitions
|
|
||||||
--------------
|
|
||||||
|
|
||||||
1.1. "Contributor"
|
|
||||||
means each individual or legal entity that creates, contributes to
|
|
||||||
the creation of, or owns Covered Software.
|
|
||||||
|
|
||||||
1.2. "Contributor Version"
|
|
||||||
means the combination of the Contributions of others (if any) used
|
|
||||||
by a Contributor and that particular Contributor's Contribution.
|
|
||||||
|
|
||||||
1.3. "Contribution"
|
|
||||||
means Covered Software of a particular Contributor.
|
|
||||||
|
|
||||||
1.4. "Covered Software"
|
|
||||||
means Source Code Form to which the initial Contributor has attached
|
|
||||||
the notice in Exhibit A, the Executable Form of such Source Code
|
|
||||||
Form, and Modifications of such Source Code Form, in each case
|
|
||||||
including portions thereof.
|
|
||||||
|
|
||||||
1.5. "Incompatible With Secondary Licenses"
|
|
||||||
means
|
|
||||||
|
|
||||||
(a) that the initial Contributor has attached the notice described
|
|
||||||
in Exhibit B to the Covered Software; or
|
|
||||||
|
|
||||||
(b) that the Covered Software was made available under the terms of
|
|
||||||
version 1.1 or earlier of the License, but not also under the
|
|
||||||
terms of a Secondary License.
|
|
||||||
|
|
||||||
1.6. "Executable Form"
|
|
||||||
means any form of the work other than Source Code Form.
|
|
||||||
|
|
||||||
1.7. "Larger Work"
|
|
||||||
means a work that combines Covered Software with other material, in
|
|
||||||
a separate file or files, that is not Covered Software.
|
|
||||||
|
|
||||||
1.8. "License"
|
|
||||||
means this document.
|
|
||||||
|
|
||||||
1.9. "Licensable"
|
|
||||||
means having the right to grant, to the maximum extent possible,
|
|
||||||
whether at the time of the initial grant or subsequently, any and
|
|
||||||
all of the rights conveyed by this License.
|
|
||||||
|
|
||||||
1.10. "Modifications"
|
|
||||||
means any of the following:
|
|
||||||
|
|
||||||
(a) any file in Source Code Form that results from an addition to,
|
|
||||||
deletion from, or modification of the contents of Covered
|
|
||||||
Software; or
|
|
||||||
|
|
||||||
(b) any new file in Source Code Form that contains any Covered
|
|
||||||
Software.
|
|
||||||
|
|
||||||
1.11. "Patent Claims" of a Contributor
|
|
||||||
means any patent claim(s), including without limitation, method,
|
|
||||||
process, and apparatus claims, in any patent Licensable by such
|
|
||||||
Contributor that would be infringed, but for the grant of the
|
|
||||||
License, by the making, using, selling, offering for sale, having
|
|
||||||
made, import, or transfer of either its Contributions or its
|
|
||||||
Contributor Version.
|
|
||||||
|
|
||||||
1.12. "Secondary License"
|
|
||||||
means either the GNU General Public License, Version 2.0, the GNU
|
|
||||||
Lesser General Public License, Version 2.1, the GNU Affero General
|
|
||||||
Public License, Version 3.0, or any later versions of those
|
|
||||||
licenses.
|
|
||||||
|
|
||||||
1.13. "Source Code Form"
|
|
||||||
means the form of the work preferred for making modifications.
|
|
||||||
|
|
||||||
1.14. "You" (or "Your")
|
|
||||||
means an individual or a legal entity exercising rights under this
|
|
||||||
License. For legal entities, "You" includes any entity that
|
|
||||||
controls, is controlled by, or is under common control with You. For
|
|
||||||
purposes of this definition, "control" means (a) the power, direct
|
|
||||||
or indirect, to cause the direction or management of such entity,
|
|
||||||
whether by contract or otherwise, or (b) ownership of more than
|
|
||||||
fifty percent (50%) of the outstanding shares or beneficial
|
|
||||||
ownership of such entity.
|
|
||||||
|
|
||||||
2. License Grants and Conditions
|
|
||||||
--------------------------------
|
|
||||||
|
|
||||||
2.1. Grants
|
|
||||||
|
|
||||||
Each Contributor hereby grants You a world-wide, royalty-free,
|
|
||||||
non-exclusive license:
|
|
||||||
|
|
||||||
(a) under intellectual property rights (other than patent or trademark)
|
|
||||||
Licensable by such Contributor to use, reproduce, make available,
|
|
||||||
modify, display, perform, distribute, and otherwise exploit its
|
|
||||||
Contributions, either on an unmodified basis, with Modifications, or
|
|
||||||
as part of a Larger Work; and
|
|
||||||
|
|
||||||
(b) under Patent Claims of such Contributor to make, use, sell, offer
|
|
||||||
for sale, have made, import, and otherwise transfer either its
|
|
||||||
Contributions or its Contributor Version.
|
|
||||||
|
|
||||||
2.2. Effective Date
|
|
||||||
|
|
||||||
The licenses granted in Section 2.1 with respect to any Contribution
|
|
||||||
become effective for each Contribution on the date the Contributor first
|
|
||||||
distributes such Contribution.
|
|
||||||
|
|
||||||
2.3. Limitations on Grant Scope
|
|
||||||
|
|
||||||
The licenses granted in this Section 2 are the only rights granted under
|
|
||||||
this License. No additional rights or licenses will be implied from the
|
|
||||||
distribution or licensing of Covered Software under this License.
|
|
||||||
Notwithstanding Section 2.1(b) above, no patent license is granted by a
|
|
||||||
Contributor:
|
|
||||||
|
|
||||||
(a) for any code that a Contributor has removed from Covered Software;
|
|
||||||
or
|
|
||||||
|
|
||||||
(b) for infringements caused by: (i) Your and any other third party's
|
|
||||||
modifications of Covered Software, or (ii) the combination of its
|
|
||||||
Contributions with other software (except as part of its Contributor
|
|
||||||
Version); or
|
|
||||||
|
|
||||||
(c) under Patent Claims infringed by Covered Software in the absence of
|
|
||||||
its Contributions.
|
|
||||||
|
|
||||||
This License does not grant any rights in the trademarks, service marks,
|
|
||||||
or logos of any Contributor (except as may be necessary to comply with
|
|
||||||
the notice requirements in Section 3.4).
|
|
||||||
|
|
||||||
2.4. Subsequent Licenses
|
|
||||||
|
|
||||||
No Contributor makes additional grants as a result of Your choice to
|
|
||||||
distribute the Covered Software under a subsequent version of this
|
|
||||||
License (see Section 10.2) or under the terms of a Secondary License (if
|
|
||||||
permitted under the terms of Section 3.3).
|
|
||||||
|
|
||||||
2.5. Representation
|
|
||||||
|
|
||||||
Each Contributor represents that the Contributor believes its
|
|
||||||
Contributions are its original creation(s) or it has sufficient rights
|
|
||||||
to grant the rights to its Contributions conveyed by this License.
|
|
||||||
|
|
||||||
2.6. Fair Use
|
|
||||||
|
|
||||||
This License is not intended to limit any rights You have under
|
|
||||||
applicable copyright doctrines of fair use, fair dealing, or other
|
|
||||||
equivalents.
|
|
||||||
|
|
||||||
2.7. Conditions
|
|
||||||
|
|
||||||
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
|
|
||||||
in Section 2.1.
|
|
||||||
|
|
||||||
3. Responsibilities
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
3.1. Distribution of Source Form
|
|
||||||
|
|
||||||
All distribution of Covered Software in Source Code Form, including any
|
|
||||||
Modifications that You create or to which You contribute, must be under
|
|
||||||
the terms of this License. You must inform recipients that the Source
|
|
||||||
Code Form of the Covered Software is governed by the terms of this
|
|
||||||
License, and how they can obtain a copy of this License. You may not
|
|
||||||
attempt to alter or restrict the recipients' rights in the Source Code
|
|
||||||
Form.
|
|
||||||
|
|
||||||
3.2. Distribution of Executable Form
|
|
||||||
|
|
||||||
If You distribute Covered Software in Executable Form then:
|
|
||||||
|
|
||||||
(a) such Covered Software must also be made available in Source Code
|
|
||||||
Form, as described in Section 3.1, and You must inform recipients of
|
|
||||||
the Executable Form how they can obtain a copy of such Source Code
|
|
||||||
Form by reasonable means in a timely manner, at a charge no more
|
|
||||||
than the cost of distribution to the recipient; and
|
|
||||||
|
|
||||||
(b) You may distribute such Executable Form under the terms of this
|
|
||||||
License, or sublicense it under different terms, provided that the
|
|
||||||
license for the Executable Form does not attempt to limit or alter
|
|
||||||
the recipients' rights in the Source Code Form under this License.
|
|
||||||
|
|
||||||
3.3. Distribution of a Larger Work
|
|
||||||
|
|
||||||
You may create and distribute a Larger Work under terms of Your choice,
|
|
||||||
provided that You also comply with the requirements of this License for
|
|
||||||
the Covered Software. If the Larger Work is a combination of Covered
|
|
||||||
Software with a work governed by one or more Secondary Licenses, and the
|
|
||||||
Covered Software is not Incompatible With Secondary Licenses, this
|
|
||||||
License permits You to additionally distribute such Covered Software
|
|
||||||
under the terms of such Secondary License(s), so that the recipient of
|
|
||||||
the Larger Work may, at their option, further distribute the Covered
|
|
||||||
Software under the terms of either this License or such Secondary
|
|
||||||
License(s).
|
|
||||||
|
|
||||||
3.4. Notices
|
|
||||||
|
|
||||||
You may not remove or alter the substance of any license notices
|
|
||||||
(including copyright notices, patent notices, disclaimers of warranty,
|
|
||||||
or limitations of liability) contained within the Source Code Form of
|
|
||||||
the Covered Software, except that You may alter any license notices to
|
|
||||||
the extent required to remedy known factual inaccuracies.
|
|
||||||
|
|
||||||
3.5. Application of Additional Terms
|
|
||||||
|
|
||||||
You may choose to offer, and to charge a fee for, warranty, support,
|
|
||||||
indemnity or liability obligations to one or more recipients of Covered
|
|
||||||
Software. However, You may do so only on Your own behalf, and not on
|
|
||||||
behalf of any Contributor. You must make it absolutely clear that any
|
|
||||||
such warranty, support, indemnity, or liability obligation is offered by
|
|
||||||
You alone, and You hereby agree to indemnify every Contributor for any
|
|
||||||
liability incurred by such Contributor as a result of warranty, support,
|
|
||||||
indemnity or liability terms You offer. You may include additional
|
|
||||||
disclaimers of warranty and limitations of liability specific to any
|
|
||||||
jurisdiction.
|
|
||||||
|
|
||||||
4. Inability to Comply Due to Statute or Regulation
|
|
||||||
---------------------------------------------------
|
|
||||||
|
|
||||||
If it is impossible for You to comply with any of the terms of this
|
|
||||||
License with respect to some or all of the Covered Software due to
|
|
||||||
statute, judicial order, or regulation then You must: (a) comply with
|
|
||||||
the terms of this License to the maximum extent possible; and (b)
|
|
||||||
describe the limitations and the code they affect. Such description must
|
|
||||||
be placed in a text file included with all distributions of the Covered
|
|
||||||
Software under this License. Except to the extent prohibited by statute
|
|
||||||
or regulation, such description must be sufficiently detailed for a
|
|
||||||
recipient of ordinary skill to be able to understand it.
|
|
||||||
|
|
||||||
5. Termination
|
|
||||||
--------------
|
|
||||||
|
|
||||||
5.1. The rights granted under this License will terminate automatically
|
|
||||||
if You fail to comply with any of its terms. However, if You become
|
|
||||||
compliant, then the rights granted under this License from a particular
|
|
||||||
Contributor are reinstated (a) provisionally, unless and until such
|
|
||||||
Contributor explicitly and finally terminates Your grants, and (b) on an
|
|
||||||
ongoing basis, if such Contributor fails to notify You of the
|
|
||||||
non-compliance by some reasonable means prior to 60 days after You have
|
|
||||||
come back into compliance. Moreover, Your grants from a particular
|
|
||||||
Contributor are reinstated on an ongoing basis if such Contributor
|
|
||||||
notifies You of the non-compliance by some reasonable means, this is the
|
|
||||||
first time You have received notice of non-compliance with this License
|
|
||||||
from such Contributor, and You become compliant prior to 30 days after
|
|
||||||
Your receipt of the notice.
|
|
||||||
|
|
||||||
5.2. If You initiate litigation against any entity by asserting a patent
|
|
||||||
infringement claim (excluding declaratory judgment actions,
|
|
||||||
counter-claims, and cross-claims) alleging that a Contributor Version
|
|
||||||
directly or indirectly infringes any patent, then the rights granted to
|
|
||||||
You by any and all Contributors for the Covered Software under Section
|
|
||||||
2.1 of this License shall terminate.
|
|
||||||
|
|
||||||
5.3. In the event of termination under Sections 5.1 or 5.2 above, all
|
|
||||||
end user license agreements (excluding distributors and resellers) which
|
|
||||||
have been validly granted by You or Your distributors under this License
|
|
||||||
prior to termination shall survive termination.
|
|
||||||
|
|
||||||
************************************************************************
|
|
||||||
* *
|
|
||||||
* 6. Disclaimer of Warranty *
|
|
||||||
* ------------------------- *
|
|
||||||
* *
|
|
||||||
* Covered Software is provided under this License on an "as is" *
|
|
||||||
* basis, without warranty of any kind, either expressed, implied, or *
|
|
||||||
* statutory, including, without limitation, warranties that the *
|
|
||||||
* Covered Software is free of defects, merchantable, fit for a *
|
|
||||||
* particular purpose or non-infringing. The entire risk as to the *
|
|
||||||
* quality and performance of the Covered Software is with You. *
|
|
||||||
* Should any Covered Software prove defective in any respect, You *
|
|
||||||
* (not any Contributor) assume the cost of any necessary servicing, *
|
|
||||||
* repair, or correction. This disclaimer of warranty constitutes an *
|
|
||||||
* essential part of this License. No use of any Covered Software is *
|
|
||||||
* authorized under this License except under this disclaimer. *
|
|
||||||
* *
|
|
||||||
************************************************************************
|
|
||||||
|
|
||||||
************************************************************************
|
|
||||||
* *
|
|
||||||
* 7. Limitation of Liability *
|
|
||||||
* -------------------------- *
|
|
||||||
* *
|
|
||||||
* Under no circumstances and under no legal theory, whether tort *
|
|
||||||
* (including negligence), contract, or otherwise, shall any *
|
|
||||||
* Contributor, or anyone who distributes Covered Software as *
|
|
||||||
* permitted above, be liable to You for any direct, indirect, *
|
|
||||||
* special, incidental, or consequential damages of any character *
|
|
||||||
* including, without limitation, damages for lost profits, loss of *
|
|
||||||
* goodwill, work stoppage, computer failure or malfunction, or any *
|
|
||||||
* and all other commercial damages or losses, even if such party *
|
|
||||||
* shall have been informed of the possibility of such damages. This *
|
|
||||||
* limitation of liability shall not apply to liability for death or *
|
|
||||||
* personal injury resulting from such party's negligence to the *
|
|
||||||
* extent applicable law prohibits such limitation. Some *
|
|
||||||
* jurisdictions do not allow the exclusion or limitation of *
|
|
||||||
* incidental or consequential damages, so this exclusion and *
|
|
||||||
* limitation may not apply to You. *
|
|
||||||
* *
|
|
||||||
************************************************************************
|
|
||||||
|
|
||||||
8. Litigation
|
|
||||||
-------------
|
|
||||||
|
|
||||||
Any litigation relating to this License may be brought only in the
|
|
||||||
courts of a jurisdiction where the defendant maintains its principal
|
|
||||||
place of business and such litigation shall be governed by laws of that
|
|
||||||
jurisdiction, without reference to its conflict-of-law provisions.
|
|
||||||
Nothing in this Section shall prevent a party's ability to bring
|
|
||||||
cross-claims or counter-claims.
|
|
||||||
|
|
||||||
9. Miscellaneous
|
|
||||||
----------------
|
|
||||||
|
|
||||||
This License represents the complete agreement concerning the subject
|
|
||||||
matter hereof. If any provision of this License is held to be
|
|
||||||
unenforceable, such provision shall be reformed only to the extent
|
|
||||||
necessary to make it enforceable. Any law or regulation which provides
|
|
||||||
that the language of a contract shall be construed against the drafter
|
|
||||||
shall not be used to construe this License against a Contributor.
|
|
||||||
|
|
||||||
10. Versions of the License
|
|
||||||
---------------------------
|
|
||||||
|
|
||||||
10.1. New Versions
|
|
||||||
|
|
||||||
Mozilla Foundation is the license steward. Except as provided in Section
|
|
||||||
10.3, no one other than the license steward has the right to modify or
|
|
||||||
publish new versions of this License. Each version will be given a
|
|
||||||
distinguishing version number.
|
|
||||||
|
|
||||||
10.2. Effect of New Versions
|
|
||||||
|
|
||||||
You may distribute the Covered Software under the terms of the version
|
|
||||||
of the License under which You originally received the Covered Software,
|
|
||||||
or under the terms of any subsequent version published by the license
|
|
||||||
steward.
|
|
||||||
|
|
||||||
10.3. Modified Versions
|
|
||||||
|
|
||||||
If you create software not governed by this License, and you want to
|
|
||||||
create a new license for such software, you may create and use a
|
|
||||||
modified version of this License if you rename the license and remove
|
|
||||||
any references to the name of the license steward (except to note that
|
|
||||||
such modified license differs from this License).
|
|
||||||
|
|
||||||
10.4. Distributing Source Code Form that is Incompatible With Secondary
|
|
||||||
Licenses
|
|
||||||
|
|
||||||
If You choose to distribute Source Code Form that is Incompatible With
|
|
||||||
Secondary Licenses under the terms of this version of the License, the
|
|
||||||
notice described in Exhibit B of this License must be attached.
|
|
||||||
|
|
||||||
Exhibit A - Source Code Form License Notice
|
|
||||||
-------------------------------------------
|
|
||||||
|
|
||||||
This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
||||||
|
|
||||||
If it is not possible or desirable to put the notice in a particular
|
|
||||||
file, then You may include the notice in a location (such as a LICENSE
|
|
||||||
file in a relevant directory) where a recipient would be likely to look
|
|
||||||
for such a notice.
|
|
||||||
|
|
||||||
You may add additional accurate notices of copyright ownership.
|
|
||||||
|
|
||||||
Exhibit B - "Incompatible With Secondary Licenses" Notice
|
|
||||||
---------------------------------------------------------
|
|
||||||
|
|
||||||
This Source Code Form is "Incompatible With Secondary Licenses", as
|
|
||||||
defined by the Mozilla Public License, v. 2.0.
|
|
||||||
|
|
8
vendor/github.com/tredoe/osutil/user/crypt/AUTHORS.md
generated
vendored
8
vendor/github.com/tredoe/osutil/user/crypt/AUTHORS.md
generated
vendored
|
@ -1,8 +0,0 @@
|
||||||
### Initial author
|
|
||||||
|
|
||||||
[Jeramey Crawford](https://github.com/jeramey)
|
|
||||||
|
|
||||||
### Other authors
|
|
||||||
|
|
||||||
[Jonas mg](https://github.com/tredoe)
|
|
||||||
|
|
27
vendor/github.com/tredoe/osutil/user/crypt/LICENSE
generated
vendored
27
vendor/github.com/tredoe/osutil/user/crypt/LICENSE
generated
vendored
|
@ -1,27 +0,0 @@
|
||||||
Copyright (c) 2012, Jeramey Crawford <jeramey@antihe.ro>
|
|
||||||
Copyright (c) 2013, Jonas mg
|
|
||||||
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.
|
|
||||||
|
|
||||||
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
|
|
||||||
HOLDER 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.
|
|
62
vendor/github.com/tredoe/osutil/user/crypt/apr1_crypt/apr1_crypt.go
generated
vendored
62
vendor/github.com/tredoe/osutil/user/crypt/apr1_crypt/apr1_crypt.go
generated
vendored
|
@ -1,62 +0,0 @@
|
||||||
// Copyright 2012, Jeramey Crawford <jeramey@antihe.ro>
|
|
||||||
// Copyright 2013, Jonas mg
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style license
|
|
||||||
// that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// Package apr1_crypt implements the standard Unix MD5-crypt algorithm created
|
|
||||||
// by Poul-Henning Kamp for FreeBSD, and modified by the Apache project.
|
|
||||||
//
|
|
||||||
// The only change from MD5-crypt is the use of the magic constant "$apr1$"
|
|
||||||
// instead of "$1$". The algorithms are otherwise identical.
|
|
||||||
package apr1_crypt
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/tredoe/osutil/user/crypt"
|
|
||||||
"github.com/tredoe/osutil/user/crypt/common"
|
|
||||||
"github.com/tredoe/osutil/user/crypt/md5_crypt"
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
crypt.RegisterCrypt(crypt.APR1, New, MagicPrefix)
|
|
||||||
}
|
|
||||||
|
|
||||||
const (
|
|
||||||
MagicPrefix = "$apr1$"
|
|
||||||
SaltLenMin = 1
|
|
||||||
SaltLenMax = 8
|
|
||||||
RoundsDefault = 1000
|
|
||||||
)
|
|
||||||
|
|
||||||
var md5Crypt = md5_crypt.New()
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
md5Crypt.SetSalt(GetSalt())
|
|
||||||
}
|
|
||||||
|
|
||||||
type crypter struct{ Salt common.Salt }
|
|
||||||
|
|
||||||
// New returns a new crypt.Crypter computing the variant "apr1" of MD5-crypt
|
|
||||||
func New() crypt.Crypter { return &crypter{common.Salt{}} }
|
|
||||||
|
|
||||||
func (c *crypter) Generate(key, salt []byte) (string, error) {
|
|
||||||
return md5Crypt.Generate(key, salt)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *crypter) Verify(hashedKey string, key []byte) error {
|
|
||||||
return md5Crypt.Verify(hashedKey, key)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *crypter) Cost(hashedKey string) (int, error) { return RoundsDefault, nil }
|
|
||||||
|
|
||||||
func (c *crypter) SetSalt(salt common.Salt) {}
|
|
||||||
|
|
||||||
func GetSalt() common.Salt {
|
|
||||||
return common.Salt{
|
|
||||||
MagicPrefix: []byte(MagicPrefix),
|
|
||||||
SaltLenMin: SaltLenMin,
|
|
||||||
SaltLenMax: SaltLenMax,
|
|
||||||
RoundsDefault: RoundsDefault,
|
|
||||||
}
|
|
||||||
}
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue