bugfixes and updated go.mod
This commit is contained in:
parent
9424084a36
commit
6e317eb08b
300 changed files with 53136 additions and 9719 deletions
25
Makefile
25
Makefile
|
|
@ -4,23 +4,29 @@ VERSION=$(shell cat VERSION)
|
||||||
GCFLAGS=-gcflags '-e'
|
GCFLAGS=-gcflags '-e'
|
||||||
LDFLAGS=-ldflags '-X main.version=$(VERSION) -s -w'
|
LDFLAGS=-ldflags '-X main.version=$(VERSION) -s -w'
|
||||||
PROGRAM=gowiki
|
PROGRAM=gowiki
|
||||||
ENV=CGO_ENABLED=0
|
ENV=CGO_ENABLED=0 GO111MODULE=on
|
||||||
|
|
||||||
all: $(PROGRAM)
|
all: $(PROGRAM)
|
||||||
|
|
||||||
setup:
|
setup:
|
||||||
$(CC) get github.com/client9/misspell
|
$(CC) get -u github.com/client9/misspell
|
||||||
|
|
||||||
vendor: clean codeqa
|
release: clean generate gofmt codeqa
|
||||||
$(ENV) $(CC) $(BUILD) -mod=vendor $(LDFLAGS)
|
$(ENV) $(CC) $(BUILD) $(GCFLAGS) $(LDFLAGS)
|
||||||
|
|
||||||
$(PROGRAM): clean codeqa
|
release-vendor: clean generate gofmt codeqa
|
||||||
$(ENV) $(CC) $(BUILD) $(LDFLAGS)
|
$(ENV) $(CC) $(BUILD) -mod=vendor $(GCFLAGS) $(LDFLAGS)
|
||||||
|
|
||||||
|
vendor: clean generate gofmt
|
||||||
|
$(ENV) $(CC) $(BUILD) -mod=vendor $(GCFLAGS) $(LDFLAGS)
|
||||||
|
|
||||||
|
$(PROGRAM): clean generate gofmt
|
||||||
|
$(ENV) $(CC) $(BUILD) $(GCFLAGS) $(LDFLAGS)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(CC) clean -x
|
$(CC) clean -x
|
||||||
|
|
||||||
codeqa: generate gofmt misspell golint test
|
codeqa: misspell golint test
|
||||||
|
|
||||||
generate:
|
generate:
|
||||||
$(CC) generate
|
$(CC) generate
|
||||||
|
|
@ -32,8 +38,7 @@ golint:
|
||||||
$(GOPATH)/bin/golint .
|
$(GOPATH)/bin/golint .
|
||||||
|
|
||||||
misspell:
|
misspell:
|
||||||
# ignore misspellings from vendor/
|
$(GOPATH)/bin/misspell pkg/* templates/* main.go Makefile README.md sri.sh templates.sh
|
||||||
$(GOPATH)/bin/misspell -i functionallity,avaliable,HALP,halp,agains,becuase,Christiaan,compatiblity,conjuction,frequence,inital,inot,occurance,overriden,pervious,preceeded,preceeds,precendence,PROPOGATE,reamining,represenation,soley,substract,supression,whcih,preceed *
|
|
||||||
|
|
||||||
test:
|
test:
|
||||||
ifeq ($(shell go env GOARCH), $(shell go env GOHOSTARCH))
|
ifeq ($(shell go env GOARCH), $(shell go env GOHOSTARCH))
|
||||||
|
|
@ -46,4 +51,4 @@ else
|
||||||
$(info skipping tests of other platforms)
|
$(info skipping tests of other platforms)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
.PHONY: setup vendor build clean codeqa generate gofmt golint misspell test
|
.PHONY: setup release release-vendor vendor build clean codeqa generate gofmt golint misspell test
|
||||||
|
|
|
||||||
20
README.md
20
README.md
|
|
@ -2,6 +2,10 @@
|
||||||
|
|
||||||
## Building
|
## Building
|
||||||
|
|
||||||
|
**Requirenments:**
|
||||||
|
|
||||||
|
* Go (golang) >= 1.12
|
||||||
|
|
||||||
Linux:
|
Linux:
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
@ -25,3 +29,19 @@ GOOS=openbsd make vendor
|
||||||
## Install
|
## Install
|
||||||
|
|
||||||
See the `scripts/` directory on how to install gowiki on Linux or OpenBSD.
|
See the `scripts/` directory on how to install gowiki on Linux or OpenBSD.
|
||||||
|
|
||||||
|
## Config
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"data_dir": "/var/lib/gowiki", // running directory. data will be stored here
|
||||||
|
"user": "wiki", // drop privileges to user
|
||||||
|
"group": "wiki", // drop privileges to group
|
||||||
|
"listen_addr": "127.0.0.1:8080", // listening <address>:<port>
|
||||||
|
"log_file": "gowiki.log", // log file (use - for stdout, this only works in combination with 'foreground: true')
|
||||||
|
"secret": "", // static hmac secret (at least 64 chars, used for JWT signing)
|
||||||
|
"foreground": false, // do not fork into the background
|
||||||
|
"secure_cookie": false, // enable secure cookie flag
|
||||||
|
"debug": false // enable debugging
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
|
||||||
47
go.mod
47
go.mod
|
|
@ -1,47 +1,36 @@
|
||||||
module git.giftfish.de/ston1th/gowiki
|
module git.giftfish.de/ston1th/gowiki
|
||||||
|
|
||||||
|
go 1.12
|
||||||
|
|
||||||
require (
|
require (
|
||||||
git.giftfish.de/ston1th/godrop/v2 v2.1.0
|
git.giftfish.de/ston1th/godrop/v2 v2.1.0
|
||||||
git.giftfish.de/ston1th/jwt/v3 v3.2.0
|
git.giftfish.de/ston1th/jwt/v3 v3.2.0
|
||||||
github.com/RoaringBitmap/roaring v0.4.16 // indirect
|
github.com/RoaringBitmap/roaring v0.4.17 // indirect
|
||||||
github.com/Smerity/govarint v0.0.0-20150407073650-7265e41f48f1 // indirect
|
github.com/Smerity/govarint v0.0.0-20150407073650-7265e41f48f1 // indirect
|
||||||
github.com/blevesearch/bleve v0.7.0
|
github.com/blevesearch/bleve v0.7.0
|
||||||
github.com/blevesearch/blevex v0.0.0-20180227211930-4b158bb555a3 // indirect
|
github.com/blevesearch/blevex v0.0.0-20180227211930-4b158bb555a3 // indirect
|
||||||
github.com/blevesearch/go-porterstemmer v0.0.0-20141230013033-23a2c8e5cf1f // indirect
|
github.com/blevesearch/go-porterstemmer v1.0.2 // indirect
|
||||||
github.com/blevesearch/segment v0.0.0-20160915185041-762005e7a34f // indirect
|
github.com/blevesearch/segment v0.0.0-20160915185041-762005e7a34f // indirect
|
||||||
github.com/boltdb/bolt v1.3.1
|
github.com/boltdb/bolt v1.3.1
|
||||||
github.com/boombuler/barcode v1.0.0 // indirect
|
github.com/boombuler/barcode v1.0.0 // indirect
|
||||||
github.com/couchbase/vellum v0.0.0-20180910213445-01d5c56e6095 // indirect
|
github.com/couchbase/vellum v0.0.0-20190328134517-462e86d8716b // indirect
|
||||||
github.com/cznic/b v0.0.0-20180115125044-35e9bbe41f07 // indirect
|
github.com/cznic/b v0.0.0-20181122101859-a26611c4d92d // indirect
|
||||||
github.com/cznic/mathutil v0.0.0-20180504122225-ca4c9f2c1369 // indirect
|
github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 // indirect
|
||||||
github.com/cznic/strutil v0.0.0-20171016134553-529a34b1c186 // indirect
|
github.com/cznic/strutil v0.0.0-20181122101858-275e90344537 // indirect
|
||||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712 // indirect
|
github.com/edsrzf/mmap-go v1.0.0 // indirect
|
||||||
github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51 // indirect
|
github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51 // indirect
|
||||||
github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 // indirect
|
github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 // indirect
|
||||||
github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870 // indirect
|
github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870 // indirect
|
||||||
github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd // indirect
|
github.com/golang/protobuf v1.3.1 // indirect
|
||||||
github.com/glycerine/goconvey v0.0.0-20180728074245-46e3a41ad493 // indirect
|
github.com/gorilla/mux v1.7.1
|
||||||
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db // indirect
|
github.com/jmhodges/levigo v1.0.0 // indirect
|
||||||
github.com/gopherjs/gopherjs v0.0.0-20180825215210-0210a2f0f73c // indirect
|
github.com/pquerna/otp v1.1.0
|
||||||
github.com/gorilla/context v0.0.0-20160226214623-1ea25387ff6f // indirect
|
github.com/remyoudompheng/bigfft v0.0.0-20190512091148-babf20351dd7 // indirect
|
||||||
github.com/gorilla/mux v1.6.2
|
|
||||||
github.com/jmhodges/levigo v0.0.0-20161115193449-c42d9e0ca023 // indirect
|
|
||||||
github.com/jtolds/gls v4.2.1+incompatible // indirect
|
|
||||||
github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae // indirect
|
|
||||||
github.com/onsi/gomega v1.4.2 // indirect
|
|
||||||
github.com/philhofer/fwd v1.0.0 // indirect
|
|
||||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
|
||||||
github.com/pquerna/otp v1.0.1-0.20180621002613-b34af480c0a4
|
|
||||||
github.com/russross/blackfriday v1.5.2
|
github.com/russross/blackfriday v1.5.2
|
||||||
github.com/smartystreets/assertions v0.0.0-20180820201707-7c9eb446e3cf // indirect
|
|
||||||
github.com/smartystreets/goconvey v0.0.0-20180222194500-ef6db91d284a // indirect
|
|
||||||
github.com/steveyen/gtreap v0.0.0-20150807155958-0abe01ef9be2 // indirect
|
github.com/steveyen/gtreap v0.0.0-20150807155958-0abe01ef9be2 // indirect
|
||||||
github.com/stretchr/testify v1.2.2 // indirect
|
github.com/syndtr/goleveldb v1.0.0 // indirect
|
||||||
github.com/syndtr/goleveldb v0.0.0-20180815032940-ae2bd5eed72d // indirect
|
github.com/tecbot/gorocksdb v0.0.0-20181010114359-8752a9433481 // indirect
|
||||||
github.com/tecbot/gorocksdb v0.0.0-20180907100951-214b6b7bc0f0 // indirect
|
github.com/urfave/cli v1.20.0
|
||||||
github.com/tinylib/msgp v1.0.2 // indirect
|
golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734
|
||||||
github.com/urfave/cli v1.19.1
|
|
||||||
github.com/willf/bitset v1.1.9 // indirect
|
|
||||||
golang.org/x/crypto v0.0.0-20161031180806-9477e0b78b9a
|
|
||||||
)
|
)
|
||||||
|
|
|
||||||
110
go.sum
110
go.sum
|
|
@ -2,34 +2,35 @@ git.giftfish.de/ston1th/godrop/v2 v2.1.0 h1:vR4aWVeMGJ+tHQH0p44esZrSl5dYJzuCmZqh
|
||||||
git.giftfish.de/ston1th/godrop/v2 v2.1.0/go.mod h1:z8KA3HP/vB04wddLXZfYVKURYDxBGau9hlHtV61x9mM=
|
git.giftfish.de/ston1th/godrop/v2 v2.1.0/go.mod h1:z8KA3HP/vB04wddLXZfYVKURYDxBGau9hlHtV61x9mM=
|
||||||
git.giftfish.de/ston1th/jwt/v3 v3.2.0 h1:V6Lh7OjXn4D3HPd/LoDf7w5N7cyiSXEPAQCIfSVZ05c=
|
git.giftfish.de/ston1th/jwt/v3 v3.2.0 h1:V6Lh7OjXn4D3HPd/LoDf7w5N7cyiSXEPAQCIfSVZ05c=
|
||||||
git.giftfish.de/ston1th/jwt/v3 v3.2.0/go.mod h1:jDALrW7OKeIaqYuMxs3GWyPRnQZmk/R+Lu9p/Em3Ziw=
|
git.giftfish.de/ston1th/jwt/v3 v3.2.0/go.mod h1:jDALrW7OKeIaqYuMxs3GWyPRnQZmk/R+Lu9p/Em3Ziw=
|
||||||
github.com/RoaringBitmap/roaring v0.4.16 h1:NholfewybRLOwACgfqfzn/N5xa6keKNs4fP00t0cwLo=
|
github.com/RoaringBitmap/roaring v0.4.17 h1:oCYFIFEMSQZrLHpywH7919esI1VSrQZ0pJXkZPGIJ78=
|
||||||
github.com/RoaringBitmap/roaring v0.4.16/go.mod h1:8khRDP4HmeXns4xIj9oGrKSz7XTQiJx2zgh7AcNke4w=
|
github.com/RoaringBitmap/roaring v0.4.17/go.mod h1:D3qVegWTmfCaX4Bl5CrBE9hfrSrrXIr8KVNvRsDi1NI=
|
||||||
github.com/Smerity/govarint v0.0.0-20150407073650-7265e41f48f1 h1:G/NOANWMQev0CftoyxQwtRakdyNNNMB3qxkt/tj1HGs=
|
github.com/Smerity/govarint v0.0.0-20150407073650-7265e41f48f1 h1:G/NOANWMQev0CftoyxQwtRakdyNNNMB3qxkt/tj1HGs=
|
||||||
github.com/Smerity/govarint v0.0.0-20150407073650-7265e41f48f1/go.mod h1:o80NPAib/LOl8Eysqppjj7kkGkqz++eqzYGlvROpDcQ=
|
github.com/Smerity/govarint v0.0.0-20150407073650-7265e41f48f1/go.mod h1:o80NPAib/LOl8Eysqppjj7kkGkqz++eqzYGlvROpDcQ=
|
||||||
github.com/blevesearch/bleve v0.7.0 h1:znyZ3zjsh2Scr60vszs7rbF29TU6i1q9bfnZf1vh0Ac=
|
github.com/blevesearch/bleve v0.7.0 h1:znyZ3zjsh2Scr60vszs7rbF29TU6i1q9bfnZf1vh0Ac=
|
||||||
github.com/blevesearch/bleve v0.7.0/go.mod h1:Y2lmIkzV6mcNfAnAdOd+ZxHkHchhBfU/xroGIp61wfw=
|
github.com/blevesearch/bleve v0.7.0/go.mod h1:Y2lmIkzV6mcNfAnAdOd+ZxHkHchhBfU/xroGIp61wfw=
|
||||||
github.com/blevesearch/blevex v0.0.0-20180227211930-4b158bb555a3 h1:U6vnxZrTfItfiUiYx0lf/LgHjRSfaKK5QHSom3lEbnA=
|
github.com/blevesearch/blevex v0.0.0-20180227211930-4b158bb555a3 h1:U6vnxZrTfItfiUiYx0lf/LgHjRSfaKK5QHSom3lEbnA=
|
||||||
github.com/blevesearch/blevex v0.0.0-20180227211930-4b158bb555a3/go.mod h1:WH+MU2F4T0VmSdaPX+Wu5GYoZBrYWdOZWSjzvYcDmqQ=
|
github.com/blevesearch/blevex v0.0.0-20180227211930-4b158bb555a3/go.mod h1:WH+MU2F4T0VmSdaPX+Wu5GYoZBrYWdOZWSjzvYcDmqQ=
|
||||||
github.com/blevesearch/go-porterstemmer v0.0.0-20141230013033-23a2c8e5cf1f h1:J9ZVHbB2X6JNxbKw/f3Y4E9Xq+Ro+zPiivzgmi3RTvg=
|
github.com/blevesearch/go-porterstemmer v1.0.2 h1:qe7n69gBd1OLY5sHKnxQHIbzn0LNJA4hpAf+5XDxV2I=
|
||||||
github.com/blevesearch/go-porterstemmer v0.0.0-20141230013033-23a2c8e5cf1f/go.mod h1:haWQqFT3RdOGz7PJuM3or/pWNJS1pKkoZJWCkWu0DVA=
|
github.com/blevesearch/go-porterstemmer v1.0.2/go.mod h1:haWQqFT3RdOGz7PJuM3or/pWNJS1pKkoZJWCkWu0DVA=
|
||||||
github.com/blevesearch/segment v0.0.0-20160915185041-762005e7a34f h1:kqbi9lqXLLs+zfWlgo1PIiRQ86n33K1JKotjj4rSYOg=
|
github.com/blevesearch/segment v0.0.0-20160915185041-762005e7a34f h1:kqbi9lqXLLs+zfWlgo1PIiRQ86n33K1JKotjj4rSYOg=
|
||||||
github.com/blevesearch/segment v0.0.0-20160915185041-762005e7a34f/go.mod h1:IInt5XRvpiGE09KOk9mmCMLjHhydIhNPKPPFLFBB7L8=
|
github.com/blevesearch/segment v0.0.0-20160915185041-762005e7a34f/go.mod h1:IInt5XRvpiGE09KOk9mmCMLjHhydIhNPKPPFLFBB7L8=
|
||||||
github.com/boltdb/bolt v1.3.1 h1:JQmyP4ZBrce+ZQu0dY660FMfatumYDLun9hBCUVIkF4=
|
github.com/boltdb/bolt v1.3.1 h1:JQmyP4ZBrce+ZQu0dY660FMfatumYDLun9hBCUVIkF4=
|
||||||
github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps=
|
github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps=
|
||||||
github.com/boombuler/barcode v1.0.0 h1:s1TvRnXwL2xJRaccrdcBQMZxq6X7DvsMogtmJeHDdrc=
|
github.com/boombuler/barcode v1.0.0 h1:s1TvRnXwL2xJRaccrdcBQMZxq6X7DvsMogtmJeHDdrc=
|
||||||
github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
|
github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
|
||||||
github.com/couchbase/vellum v0.0.0-20180910213445-01d5c56e6095 h1:dh7mqP7LS9voSd1Wx515giC2lPjPVduBpujISaftHrc=
|
github.com/couchbase/vellum v0.0.0-20190328134517-462e86d8716b h1:WgO2yt0pCXyPgU3K/pnY1qO/8FP8TxBAaYXqa+BQpx0=
|
||||||
github.com/couchbase/vellum v0.0.0-20180910213445-01d5c56e6095/go.mod h1:prYTC8EgTu3gwbqJihkud9zRXISvyulAplQ6exdCo1g=
|
github.com/couchbase/vellum v0.0.0-20190328134517-462e86d8716b/go.mod h1:prYTC8EgTu3gwbqJihkud9zRXISvyulAplQ6exdCo1g=
|
||||||
github.com/cznic/b v0.0.0-20180115125044-35e9bbe41f07 h1:UHFGPvSxX4C4YBApSPvmUfL8tTvWLj2ryqvT9K4Jcuk=
|
github.com/cznic/b v0.0.0-20181122101859-a26611c4d92d h1:SwD98825d6bdB+pEuTxWOXiSjBrHdOl/UVp75eI7JT8=
|
||||||
github.com/cznic/b v0.0.0-20180115125044-35e9bbe41f07/go.mod h1:URriBxXwVq5ijiJ12C7iIZqlA69nTlI+LgI6/pwftG8=
|
github.com/cznic/b v0.0.0-20181122101859-a26611c4d92d/go.mod h1:URriBxXwVq5ijiJ12C7iIZqlA69nTlI+LgI6/pwftG8=
|
||||||
github.com/cznic/mathutil v0.0.0-20180504122225-ca4c9f2c1369 h1:XNT/Zf5l++1Pyg08/HV04ppB0gKxAqtZQBRYiYrUuYk=
|
github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 h1:iwZdTE0PVqJCos1vaoKsclOGD3ADKpshg3SRtYBbwso=
|
||||||
github.com/cznic/mathutil v0.0.0-20180504122225-ca4c9f2c1369/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM=
|
github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM=
|
||||||
github.com/cznic/strutil v0.0.0-20171016134553-529a34b1c186 h1:0rkFMAbn5KBKNpJyHQ6Prb95vIKanmAe62KxsrN+sqA=
|
github.com/cznic/strutil v0.0.0-20181122101858-275e90344537 h1:MZRmHqDBd0vxNwenEbKSQqRVT24d3C05ft8kduSwlqM=
|
||||||
github.com/cznic/strutil v0.0.0-20171016134553-529a34b1c186/go.mod h1:AHHPPPXTw0h6pVabbcbyGRK1DckRn7r/STdZEeIDzZc=
|
github.com/cznic/strutil v0.0.0-20181122101858-275e90344537/go.mod h1:AHHPPPXTw0h6pVabbcbyGRK1DckRn7r/STdZEeIDzZc=
|
||||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712 h1:aaQcKT9WumO6JEJcRyTqFVq4XUZiUcKR2/GI31TOcz8=
|
github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw=
|
||||||
github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
|
github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
|
||||||
github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51 h1:0JZ+dUmQeA8IIVUMzysrX4/AKuQwWhV2dYQuPZdvdSQ=
|
github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51 h1:0JZ+dUmQeA8IIVUMzysrX4/AKuQwWhV2dYQuPZdvdSQ=
|
||||||
github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64=
|
github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64=
|
||||||
github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A=
|
github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A=
|
||||||
|
|
@ -38,68 +39,81 @@ github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870 h1:E2s37DuLxFhQD
|
||||||
github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0=
|
github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0=
|
||||||
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
|
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
|
||||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||||
github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd h1:r04MMPyLHj/QwZuMJ5+7tJcBr1AQjpiAK/rZWRrQT7o=
|
github.com/glycerine/go-unsnap-stream v0.0.0-20181221182339-f9677308dec2 h1:Ujru1hufTHVb++eG6OuNDKMxZnGIvF6o/u8q/8h2+I4=
|
||||||
github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE=
|
github.com/glycerine/go-unsnap-stream v0.0.0-20181221182339-f9677308dec2/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE=
|
||||||
github.com/glycerine/goconvey v0.0.0-20180728074245-46e3a41ad493 h1:OTanQnFt0bi5iLFSdbEVA/idR6Q2WhCm+deb7ir2CcM=
|
github.com/glycerine/goconvey v0.0.0-20180728074245-46e3a41ad493 h1:OTanQnFt0bi5iLFSdbEVA/idR6Q2WhCm+deb7ir2CcM=
|
||||||
github.com/glycerine/goconvey v0.0.0-20180728074245-46e3a41ad493/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24=
|
github.com/glycerine/goconvey v0.0.0-20180728074245-46e3a41ad493/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24=
|
||||||
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
|
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
|
||||||
|
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w=
|
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w=
|
||||||
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
github.com/gopherjs/gopherjs v0.0.0-20180825215210-0210a2f0f73c h1:16eHWuMGvCjSfgRJKqIzapE78onvvTbdi1rMkU00lZw=
|
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
|
||||||
github.com/gopherjs/gopherjs v0.0.0-20180825215210-0210a2f0f73c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
github.com/gorilla/context v0.0.0-20160226214623-1ea25387ff6f h1:9oNbS1z4rVpbnkHBdPZU4jo9bSmrLpII768arSyMFgk=
|
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
|
||||||
github.com/gorilla/context v0.0.0-20160226214623-1ea25387ff6f/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||||
github.com/gorilla/mux v1.6.2 h1:Pgr17XVTNXAk3q/r4CpKzC5xBM/qW1uVLV+IhRZpIIk=
|
github.com/gorilla/mux v1.7.1 h1:Dw4jY2nghMMRsh1ol8dv1axHkDwMQK2DHerMNJsIpJU=
|
||||||
github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
github.com/gorilla/mux v1.7.1/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||||
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
|
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
|
||||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||||
github.com/jmhodges/levigo v0.0.0-20161115193449-c42d9e0ca023 h1:y5P5G9cANJZt3MXlMrgELo5mNLZPXH8aGFFFG7IzPU0=
|
github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U=
|
||||||
github.com/jmhodges/levigo v0.0.0-20161115193449-c42d9e0ca023/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ=
|
github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ=
|
||||||
github.com/jtolds/gls v4.2.1+incompatible h1:fSuqC+Gmlu6l/ZYAoZzx2pyucC8Xza35fpRVWLVmUEE=
|
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
|
||||||
github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||||
github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae h1:VeRdUYdCw49yizlSbMEn2SZ+gT+3IUKx8BqxyQdz+BY=
|
github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae h1:VeRdUYdCw49yizlSbMEn2SZ+gT+3IUKx8BqxyQdz+BY=
|
||||||
github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg=
|
github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg=
|
||||||
github.com/onsi/ginkgo v1.6.0 h1:Ix8l273rp3QzYgXSR+c8d1fTG7UPgYkOSELPhiY/YGw=
|
github.com/onsi/ginkgo v1.6.0 h1:Ix8l273rp3QzYgXSR+c8d1fTG7UPgYkOSELPhiY/YGw=
|
||||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
github.com/onsi/gomega v1.4.2 h1:3mYCb7aPxS/RU7TI1y4rkEn1oKmPRjNJLNEXgw7MH2I=
|
github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs=
|
||||||
github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
|
github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU=
|
||||||
|
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||||
github.com/philhofer/fwd v1.0.0 h1:UbZqGr5Y38ApvM/V/jEljVxwocdweyH+vmYvRPBnbqQ=
|
github.com/philhofer/fwd v1.0.0 h1:UbZqGr5Y38ApvM/V/jEljVxwocdweyH+vmYvRPBnbqQ=
|
||||||
github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
|
github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/pquerna/otp v1.0.1-0.20180621002613-b34af480c0a4 h1:lbSlZWuJMojTqzfawNo4MWd7pO6rts5uB72B8be+l9Q=
|
github.com/pquerna/otp v1.1.0 h1:q2gMsMuMl3JzneUaAX1MRGxLvOG6bzXV51hivBaStf0=
|
||||||
github.com/pquerna/otp v1.0.1-0.20180621002613-b34af480c0a4/go.mod h1:Zad1CMQfSQZI5KLpahDiSUX4tMMREnXw98IvL1nhgMk=
|
github.com/pquerna/otp v1.1.0/go.mod h1:Zad1CMQfSQZI5KLpahDiSUX4tMMREnXw98IvL1nhgMk=
|
||||||
|
github.com/remyoudompheng/bigfft v0.0.0-20190512091148-babf20351dd7 h1:FUL3b97ZY2EPqg2NbXKuMHs5pXJB9hjj1fDHnF2vl28=
|
||||||
|
github.com/remyoudompheng/bigfft v0.0.0-20190512091148-babf20351dd7/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
|
||||||
github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo=
|
github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo=
|
||||||
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
|
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
|
||||||
github.com/smartystreets/assertions v0.0.0-20180820201707-7c9eb446e3cf h1:6V1qxN6Usn4jy8unvggSJz/NC790tefw8Zdy6OZS5co=
|
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
|
||||||
github.com/smartystreets/assertions v0.0.0-20180820201707-7c9eb446e3cf/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||||
github.com/smartystreets/goconvey v0.0.0-20180222194500-ef6db91d284a h1:JSvGDIbmil4Ui/dDdFBExb7/cmkNjyX5F97oglmvCDo=
|
github.com/smartystreets/goconvey v0.0.0-20190306220146-200a235640ff h1:86HlEv0yBCry9syNuylzqznKXDK11p6D0DT596yNMys=
|
||||||
github.com/smartystreets/goconvey v0.0.0-20180222194500-ef6db91d284a/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s=
|
github.com/smartystreets/goconvey v0.0.0-20190306220146-200a235640ff/go.mod h1:KSQcGKpxUMHk3nbYzs/tIBAM2iDooCn0BmttHOJEbLs=
|
||||||
github.com/steveyen/gtreap v0.0.0-20150807155958-0abe01ef9be2 h1:JNEGSiWg6D3lcBCMCBqN3ELniXujt+0QNHLhNnO0w3s=
|
github.com/steveyen/gtreap v0.0.0-20150807155958-0abe01ef9be2 h1:JNEGSiWg6D3lcBCMCBqN3ELniXujt+0QNHLhNnO0w3s=
|
||||||
github.com/steveyen/gtreap v0.0.0-20150807155958-0abe01ef9be2/go.mod h1:mjqs7N0Q6m5HpR7QfXVBZXZWSqTjQLeTujjA/xUp2uw=
|
github.com/steveyen/gtreap v0.0.0-20150807155958-0abe01ef9be2/go.mod h1:mjqs7N0Q6m5HpR7QfXVBZXZWSqTjQLeTujjA/xUp2uw=
|
||||||
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
||||||
github.com/syndtr/goleveldb v0.0.0-20180815032940-ae2bd5eed72d h1:4J9HCZVpvDmj2tiKGSTUnb3Ok/9CEQb9oqu9LHKQQpc=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
github.com/syndtr/goleveldb v0.0.0-20180815032940-ae2bd5eed72d/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
|
github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE=
|
||||||
github.com/tecbot/gorocksdb v0.0.0-20180907100951-214b6b7bc0f0 h1:EEAoIgdGCLu3zSryPb/VFHaIGxDlgku3BflSZAtvJD0=
|
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
|
||||||
github.com/tecbot/gorocksdb v0.0.0-20180907100951-214b6b7bc0f0/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8=
|
github.com/tecbot/gorocksdb v0.0.0-20181010114359-8752a9433481 h1:HOxvxvnntLiPn123Fk+twfUhCQdMDaqmb0cclArW0T0=
|
||||||
github.com/tinylib/msgp v1.0.2 h1:DfdQrzQa7Yh2es9SuLkixqxuXS2SxsdYn0KbdrOGWD8=
|
github.com/tecbot/gorocksdb v0.0.0-20181010114359-8752a9433481/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8=
|
||||||
github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
|
github.com/tinylib/msgp v1.1.0 h1:9fQd+ICuRIu/ue4vxJZu6/LzxN0HwMds2nq/0cFvxHU=
|
||||||
github.com/urfave/cli v1.19.1 h1:0mKm4ZoB74PxYmZVua162y1dGt1qc10MyymYRBf3lb8=
|
github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
|
||||||
github.com/urfave/cli v1.19.1/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw=
|
||||||
github.com/willf/bitset v1.1.9 h1:GBtFynGY9ZWZmEC9sWuu41/7VBXPFCOAbCbqTflOg9c=
|
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
||||||
github.com/willf/bitset v1.1.9/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=
|
github.com/willf/bitset v1.1.10 h1:NotGKqX0KwQ72NUzqrjZq5ipPNDQex9lo3WpaS8L2sc=
|
||||||
golang.org/x/crypto v0.0.0-20161031180806-9477e0b78b9a h1:Esnda2KnXoH6s+xVTf9zaZg3o4p6d9C25WBNxxDHwOU=
|
github.com/willf/bitset v1.1.10/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=
|
||||||
golang.org/x/crypto v0.0.0-20161031180806-9477e0b78b9a/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734 h1:p/H982KKEjUnLJkM3tt/LemDnOc1GiZL5FCVlORJ5zo=
|
||||||
|
golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA=
|
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA=
|
||||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ=
|
||||||
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA=
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e h1:o3PsSEY8E4eXWkXrIP9YJALUkVZqzHJT5DOasTyn8Vs=
|
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e h1:o3PsSEY8E4eXWkXrIP9YJALUkVZqzHJT5DOasTyn8Vs=
|
||||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20181026144532-2772b66316d2 h1:W7CqTdBJ1CmxLKe7LptKDnBYV6PHrVLiGnoyBjaG/JQ=
|
golang.org/x/sys v0.0.0-20181026144532-2772b66316d2 h1:W7CqTdBJ1CmxLKe7LptKDnBYV6PHrVLiGnoyBjaG/JQ=
|
||||||
golang.org/x/sys v0.0.0-20181026144532-2772b66316d2/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20181026144532-2772b66316d2/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI=
|
||||||
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||||
|
|
|
||||||
2
main.go
2
main.go
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
//go:generate ./templates.sh
|
//go:generate ./templates.sh
|
||||||
|
|
||||||
|
// +build go1.12
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import "git.giftfish.de/ston1th/gowiki/pkg/cmd"
|
import "git.giftfish.de/ston1th/gowiki/pkg/cmd"
|
||||||
|
|
|
||||||
|
|
@ -135,6 +135,7 @@ func Run(version string) {
|
||||||
if err = loadConfig(); err != nil {
|
if err = loadConfig(); err != nil {
|
||||||
stdlog.Fatal("dump: ", err)
|
stdlog.Fatal("dump: ", err)
|
||||||
}
|
}
|
||||||
|
log.Stderr()
|
||||||
if dumpFile != "-" {
|
if dumpFile != "-" {
|
||||||
file, err = os.OpenFile(dumpFile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0640)
|
file, err = os.OpenFile(dumpFile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0640)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
|
|
@ -12,4 +12,8 @@ const (
|
||||||
LogoutURI = "/logout"
|
LogoutURI = "/logout"
|
||||||
TotpURI = "/totp"
|
TotpURI = "/totp"
|
||||||
SectionsURI = "/sections"
|
SectionsURI = "/sections"
|
||||||
|
|
||||||
|
BootstrapCSS = "/bootstrap.css"
|
||||||
|
CustomCSS = "/custom.css"
|
||||||
|
Favicon = "/favicon.ico"
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -187,7 +187,7 @@ func (db *DB) UpdatePage(title, section, markdown, username string, p core.Permi
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if !db.WritePerm(title, username, page.Perm) {
|
if !db.WritePerm(section, username, page.Perm) {
|
||||||
return errPermissionDenied
|
return errPermissionDenied
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,11 +7,16 @@ import (
|
||||||
"git.giftfish.de/ston1th/godrop/v2"
|
"git.giftfish.de/ston1th/godrop/v2"
|
||||||
"git.giftfish.de/ston1th/gowiki/pkg/core"
|
"git.giftfish.de/ston1th/gowiki/pkg/core"
|
||||||
"github.com/blevesearch/bleve"
|
"github.com/blevesearch/bleve"
|
||||||
|
"github.com/blevesearch/bleve/mapping"
|
||||||
"html/template"
|
"html/template"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
const maxSearchResult = 101
|
const (
|
||||||
|
maxSearchResult = 101
|
||||||
|
|
||||||
|
docType = "page"
|
||||||
|
)
|
||||||
|
|
||||||
type indexPage struct {
|
type indexPage struct {
|
||||||
Title string `json:"title"`
|
Title string `json:"title"`
|
||||||
|
|
@ -19,6 +24,10 @@ type indexPage struct {
|
||||||
Search string `json:"search"`
|
Search string `json:"search"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (*indexPage) Type() string {
|
||||||
|
return docType
|
||||||
|
}
|
||||||
|
|
||||||
type Index struct {
|
type Index struct {
|
||||||
i bleve.Index
|
i bleve.Index
|
||||||
}
|
}
|
||||||
|
|
@ -30,8 +39,22 @@ func NewIndex(path string) (i *Index, err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if _, err = os.Stat(path); os.IsNotExist(err) {
|
if _, err = os.Stat(path); os.IsNotExist(err) {
|
||||||
mapping := bleve.NewIndexMapping()
|
err = os.Mkdir(path, 0700)
|
||||||
bi, err = bleve.New(path, mapping)
|
if err != nil {
|
||||||
|
err = errors.New("index: " + err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = godrop.Unveil(path, "rwc")
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var m *mapping.IndexMappingImpl
|
||||||
|
m, err = createMapping()
|
||||||
|
if err != nil {
|
||||||
|
err = errors.New("mapping: " + err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
bi, err = bleve.New(path, m)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = errors.New("index: " + err.Error())
|
err = errors.New("index: " + err.Error())
|
||||||
return
|
return
|
||||||
|
|
@ -59,7 +82,7 @@ func (i *Index) Add(title, storeTitle, search string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return i.i.Index(storeTitle, indexPage{title, storeTitle, search})
|
return i.i.Index(storeTitle, &indexPage{title, storeTitle, search})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *Index) Delete(storeTitle string) error {
|
func (i *Index) Delete(storeTitle string) error {
|
||||||
|
|
@ -67,7 +90,7 @@ func (i *Index) Delete(storeTitle string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *Index) Search(search string) (results []core.Result, err error) {
|
func (i *Index) Search(search string) (results []core.Result, err error) {
|
||||||
req := bleve.NewSearchRequest(bleve.NewQueryStringQuery("title:" + search + " search:" + search))
|
req := bleve.NewSearchRequest(bleve.NewQueryStringQuery(search))
|
||||||
req.Highlight = bleve.NewHighlightWithStyle("html")
|
req.Highlight = bleve.NewHighlightWithStyle("html")
|
||||||
req.Size = maxSearchResult
|
req.Size = maxSearchResult
|
||||||
res, err := i.i.Search(req)
|
res, err := i.i.Search(req)
|
||||||
|
|
|
||||||
51
pkg/index/mapping.go
Normal file
51
pkg/index/mapping.go
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
// Copyright (C) 2019 Marius Schellenberger
|
||||||
|
|
||||||
|
package index
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/blevesearch/bleve"
|
||||||
|
"github.com/blevesearch/bleve/analysis/analyzer/custom"
|
||||||
|
"github.com/blevesearch/bleve/analysis/token/edgengram"
|
||||||
|
"github.com/blevesearch/bleve/analysis/token/lowercase"
|
||||||
|
"github.com/blevesearch/bleve/analysis/tokenizer/unicode"
|
||||||
|
"github.com/blevesearch/bleve/mapping"
|
||||||
|
)
|
||||||
|
|
||||||
|
func createMapping() (m *mapping.IndexMappingImpl, err error) {
|
||||||
|
m = bleve.NewIndexMapping()
|
||||||
|
|
||||||
|
err = m.AddCustomTokenFilter("bigram_tokenfilter", map[string]interface{}{
|
||||||
|
"type": edgengram.Name,
|
||||||
|
"side": edgengram.FRONT,
|
||||||
|
"min": 3.0,
|
||||||
|
"max": 25.0,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = m.AddCustomAnalyzer("fulltext_ngram", map[string]interface{}{
|
||||||
|
"type": custom.Name,
|
||||||
|
"tokenizer": unicode.Name,
|
||||||
|
"token_filters": []string{
|
||||||
|
lowercase.Name,
|
||||||
|
"bigram_tokenfilter",
|
||||||
|
},
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
doc := bleve.NewDocumentMapping()
|
||||||
|
ti := bleve.NewTextFieldMapping()
|
||||||
|
ti.Analyzer = "fulltext_ngram"
|
||||||
|
doc.AddFieldMappingsAt("title", ti)
|
||||||
|
st := bleve.NewTextFieldMapping()
|
||||||
|
st.Analyzer = "fulltext_ngram"
|
||||||
|
doc.AddFieldMappingsAt("store_title", st)
|
||||||
|
s := bleve.NewTextFieldMapping()
|
||||||
|
s.Analyzer = "fulltext_ngram"
|
||||||
|
doc.AddFieldMappingsAt("search", s)
|
||||||
|
|
||||||
|
m.AddDocumentMapping(docType, doc)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
@ -15,6 +15,10 @@ var (
|
||||||
debug = false
|
debug = false
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func Stderr() {
|
||||||
|
log = stdlog.New(os.Stderr, "", stdlog.LstdFlags)
|
||||||
|
}
|
||||||
|
|
||||||
func InitLogger(cfg core.Config) {
|
func InitLogger(cfg core.Config) {
|
||||||
debug = cfg.Debug
|
debug = cfg.Debug
|
||||||
if cfg.LogFile == "-" {
|
if cfg.LogFile == "-" {
|
||||||
|
|
|
||||||
|
|
@ -27,53 +27,19 @@ const (
|
||||||
refererClaim = "referer"
|
refererClaim = "referer"
|
||||||
)
|
)
|
||||||
|
|
||||||
func newContext(w http.ResponseWriter, r *http.Request, s *HTTPServer) (ctx *Context) {
|
func newContext(w http.ResponseWriter, r *http.Request, s *HTTPServer) *Context {
|
||||||
h := w.Header()
|
h := w.Header()
|
||||||
h.Set("X-Frame-Options", "DENY")
|
h.Set("X-Frame-Options", "DENY")
|
||||||
h.Set("X-Content-Type-Options", "nosniff")
|
h.Set("X-Content-Type-Options", "nosniff")
|
||||||
h.Set("X-XSS-Protection", "1; mode=block")
|
h.Set("X-XSS-Protection", "1; mode=block")
|
||||||
h.Set("Content-Security-Policy", "default-src 'none';style-src 'self';img-src 'self' https: data:;connect-src 'self';frame-ancestors 'none'")
|
h.Set("Content-Security-Policy", "default-src 'none';style-src 'self';img-src 'self' https: data:;connect-src 'self';frame-ancestors 'none'")
|
||||||
h.Set("Referrer-Policy", "same-origin")
|
h.Set("Referrer-Policy", "same-origin")
|
||||||
ctx = &Context{
|
return &Context{
|
||||||
Request: r,
|
Request: r,
|
||||||
Response: w,
|
Response: w,
|
||||||
Srv: s,
|
Srv: s,
|
||||||
Time: time.Now(),
|
Time: time.Now(),
|
||||||
}
|
}
|
||||||
path := ctx.Path()
|
|
||||||
if path == "/bootstrap.css" || path == "/custom.css" {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if c, err := r.Cookie(cookieName); err == nil {
|
|
||||||
t, err := jwt.DecodeToken(c.Value)
|
|
||||||
if err != nil {
|
|
||||||
ctx.LogSetCookie("DecodeToken:", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if err = s.JWT.Verify(t); err != nil {
|
|
||||||
ctx.LogSetCookie("VerifyToken:", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if t.Claims.GetString(totpClaim) != "" {
|
|
||||||
if path == core.TotpURI || path == core.LoginURI || path == core.LogoutURI {
|
|
||||||
ctx.Token = *t
|
|
||||||
return
|
|
||||||
}
|
|
||||||
ctx.Redirect(core.TotpURI, http.StatusFound)
|
|
||||||
return nil
|
|
||||||
|
|
||||||
}
|
|
||||||
if !s.DB.LockedOut(t.Claims.GetString(userClaim), t.Claims.GetString(userCreatedClaim)) {
|
|
||||||
ctx.Token = *t
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if err = s.JWT.Invalidate(t); err != nil {
|
|
||||||
log.Println("Invalidate:", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ctx.SetCookie(nil, 0)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type Context struct {
|
type Context struct {
|
||||||
|
|
@ -132,7 +98,10 @@ func (c *Context) Exec() {
|
||||||
c.Err = errors.New("template is nil")
|
c.Err = errors.New("template is nil")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
c.Data.Token = newXsrf(c.Token.RawSig()[:keySize])
|
sig := c.Token.RawSig()
|
||||||
|
if len(sig) >= keySize {
|
||||||
|
c.Data.Token = newXsrf(sig[:keySize])
|
||||||
|
}
|
||||||
|
|
||||||
c.Data.Version = c.Srv.Config.Version
|
c.Data.Version = c.Srv.Config.Version
|
||||||
if c.Data.BodyTitle == "" {
|
if c.Data.BodyTitle == "" {
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,43 @@ func (nf *notFoundHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||||
newContext(w, r, nf.s).NotFound()
|
newContext(w, r, nf.s).NotFound()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func jwtHandler(h ctxHandler) ctxHandler {
|
||||||
|
return func(ctx *Context) {
|
||||||
|
if c, err := ctx.Request.Cookie(cookieName); err == nil {
|
||||||
|
t, err := jwt.DecodeToken(c.Value)
|
||||||
|
if err != nil {
|
||||||
|
ctx.LogSetCookie("DecodeToken:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err = ctx.Srv.JWT.Verify(t); err != nil {
|
||||||
|
ctx.LogSetCookie("VerifyToken:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if t.Claims.GetString(totpClaim) != "" {
|
||||||
|
path := ctx.Path()
|
||||||
|
if path == core.TotpURI || path == core.LoginURI || path == core.LogoutURI {
|
||||||
|
ctx.Token = *t
|
||||||
|
h(ctx)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
ctx.Redirect(core.TotpURI, http.StatusFound)
|
||||||
|
return
|
||||||
|
|
||||||
|
}
|
||||||
|
if !ctx.Srv.DB.LockedOut(t.Claims.GetString(userClaim), t.Claims.GetString(userCreatedClaim)) {
|
||||||
|
ctx.Token = *t
|
||||||
|
h(ctx)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err = ctx.Srv.JWT.Invalidate(t); err != nil {
|
||||||
|
log.Println("Invalidate:", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ctx.SetCookie(nil, 0)
|
||||||
|
h(ctx)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func totpAuthHandler(h ctxHandler) ctxHandler {
|
func totpAuthHandler(h ctxHandler) ctxHandler {
|
||||||
return func(ctx *Context) {
|
return func(ctx *Context) {
|
||||||
if ctx.Totp() != "" {
|
if ctx.Totp() != "" {
|
||||||
|
|
@ -69,11 +106,11 @@ func staticHandler(ctx *Context) {
|
||||||
ctx.SetHeader("Content-Type", "text/css; charset=utf-8")
|
ctx.SetHeader("Content-Type", "text/css; charset=utf-8")
|
||||||
ctx.SetHeader("Expires", time.Now().UTC().Add(max).Format(http.TimeFormat))
|
ctx.SetHeader("Expires", time.Now().UTC().Add(max).Format(http.TimeFormat))
|
||||||
switch ctx.Path() {
|
switch ctx.Path() {
|
||||||
case "/bootstrap.css":
|
case core.BootstrapCSS:
|
||||||
err = ctx.Write(ctx.Srv.res["bootstrap.css"])
|
err = ctx.Write(ctx.Srv.res["bootstrap.css"])
|
||||||
case "/custom.css":
|
case core.CustomCSS:
|
||||||
err = ctx.Write(ctx.Srv.res["custom.css"])
|
err = ctx.Write(ctx.Srv.res["custom.css"])
|
||||||
case "/favicon.ico":
|
case core.Favicon:
|
||||||
ctx.SetHeader("Content-Type", "image/x-icon")
|
ctx.SetHeader("Content-Type", "image/x-icon")
|
||||||
err = ctx.Write(ctx.Srv.res["favicon.ico"])
|
err = ctx.Write(ctx.Srv.res["favicon.ico"])
|
||||||
}
|
}
|
||||||
|
|
@ -458,8 +495,8 @@ func pageHandler(ctx *Context) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
ctx.Data.Data = page
|
ctx.Data.Data = page
|
||||||
ctx.Data.Title = page.Title
|
ctx.Data.Title = section + " | " + page.Title
|
||||||
ctx.Data.BodyTitle = page.Title
|
ctx.Data.BodyTitle = section
|
||||||
ctx.Exec()
|
ctx.Exec()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,167 +2,197 @@
|
||||||
|
|
||||||
package server
|
package server
|
||||||
|
|
||||||
|
import "git.giftfish.de/ston1th/gowiki/pkg/core"
|
||||||
|
|
||||||
type route struct {
|
type route struct {
|
||||||
Path string
|
Path string
|
||||||
Handler ctxHandler
|
Handler ctxHandler
|
||||||
Methods []string
|
Methods []string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var static = []route{
|
||||||
|
{
|
||||||
|
core.Favicon,
|
||||||
|
staticHandler,
|
||||||
|
[]string{"GET"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
core.BootstrapCSS,
|
||||||
|
staticHandler,
|
||||||
|
[]string{"GET"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
core.CustomCSS,
|
||||||
|
staticHandler,
|
||||||
|
[]string{"GET"},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
var routes = []route{
|
var routes = []route{
|
||||||
{
|
{
|
||||||
"/",
|
"/",
|
||||||
indexHandler,
|
jwtHandler(
|
||||||
[]string{"GET"},
|
indexHandler),
|
||||||
},
|
|
||||||
{
|
|
||||||
"/favicon.ico",
|
|
||||||
staticHandler,
|
|
||||||
[]string{"GET"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"/bootstrap.css",
|
|
||||||
staticHandler,
|
|
||||||
[]string{"GET"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"/custom.css",
|
|
||||||
staticHandler,
|
|
||||||
[]string{"GET"},
|
[]string{"GET"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"/sections",
|
"/sections",
|
||||||
sectionsHandler,
|
jwtHandler(
|
||||||
|
sectionsHandler),
|
||||||
[]string{"GET"},
|
[]string{"GET"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"/section/new",
|
"/section/new",
|
||||||
adminAuthHandler(
|
jwtHandler(
|
||||||
sectionNewHandler),
|
adminAuthHandler(
|
||||||
|
sectionNewHandler)),
|
||||||
[]string{"GET", "POST"},
|
[]string{"GET", "POST"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"/section/edit/{section:[a-zA-Z0-9]+$}",
|
"/section/edit/{section:[a-zA-Z0-9]+$}",
|
||||||
adminAuthHandler(
|
jwtHandler(
|
||||||
sectionEditHandler),
|
adminAuthHandler(
|
||||||
|
sectionEditHandler)),
|
||||||
[]string{"GET", "POST"},
|
[]string{"GET", "POST"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"/section/del/{section:[a-zA-Z0-9]+$}",
|
"/section/del/{section:[a-zA-Z0-9]+$}",
|
||||||
adminAuthHandler(
|
jwtHandler(
|
||||||
sectionDelHandler),
|
adminAuthHandler(
|
||||||
|
sectionDelHandler)),
|
||||||
[]string{"GET", "POST"},
|
[]string{"GET", "POST"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"/search",
|
"/search",
|
||||||
searchHandler,
|
jwtHandler(
|
||||||
|
searchHandler),
|
||||||
[]string{"GET", "POST"},
|
[]string{"GET", "POST"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"/new",
|
"/new",
|
||||||
authHandler(
|
jwtHandler(
|
||||||
pageNewHandler),
|
authHandler(
|
||||||
|
pageNewHandler)),
|
||||||
[]string{"GET", "POST"},
|
[]string{"GET", "POST"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"/login",
|
"/login",
|
||||||
loginHandler,
|
jwtHandler(
|
||||||
|
loginHandler),
|
||||||
[]string{"GET", "POST"},
|
[]string{"GET", "POST"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"/totp",
|
"/totp",
|
||||||
totpAuthHandler(
|
jwtHandler(
|
||||||
loginTotpHandler),
|
totpAuthHandler(
|
||||||
|
loginTotpHandler)),
|
||||||
[]string{"GET", "POST"},
|
[]string{"GET", "POST"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"/blacklist",
|
"/blacklist",
|
||||||
authHandler(
|
jwtHandler(
|
||||||
pageBlacklistHandler),
|
authHandler(
|
||||||
|
pageBlacklistHandler)),
|
||||||
[]string{"GET", "POST"},
|
[]string{"GET", "POST"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"/users",
|
"/users",
|
||||||
adminAuthHandler(
|
jwtHandler(
|
||||||
usersHandler),
|
adminAuthHandler(
|
||||||
|
usersHandler)),
|
||||||
[]string{"GET"},
|
[]string{"GET"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"/user/new",
|
"/user/new",
|
||||||
adminAuthHandler(
|
jwtHandler(
|
||||||
userNewHandler),
|
adminAuthHandler(
|
||||||
|
userNewHandler)),
|
||||||
[]string{"GET", "POST"},
|
[]string{"GET", "POST"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"/user/edit/{user:[a-zA-Z0-9]+$}",
|
"/user/edit/{user:[a-zA-Z0-9]+$}",
|
||||||
userAuthHandler(
|
jwtHandler(
|
||||||
userEditHandler),
|
userAuthHandler(
|
||||||
|
userEditHandler)),
|
||||||
[]string{"GET", "POST"},
|
[]string{"GET", "POST"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"/user/del/{user:[a-zA-Z0-9]+$}",
|
"/user/del/{user:[a-zA-Z0-9]+$}",
|
||||||
userAuthHandler(
|
jwtHandler(
|
||||||
userDelHandler),
|
userAuthHandler(
|
||||||
|
userDelHandler)),
|
||||||
[]string{"GET", "POST"},
|
[]string{"GET", "POST"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"/user/totp/{user:[a-zA-Z0-9]+$}",
|
"/user/totp/{user:[a-zA-Z0-9]+$}",
|
||||||
userAuthHandler(
|
jwtHandler(
|
||||||
userTotpHandler),
|
userAuthHandler(
|
||||||
|
userTotpHandler)),
|
||||||
[]string{"GET", "POST"},
|
[]string{"GET", "POST"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"/user/unlock/{user:[a-zA-Z0-9]+$}",
|
"/user/unlock/{user:[a-zA-Z0-9]+$}",
|
||||||
adminAuthHandler(
|
jwtHandler(
|
||||||
userUnlockHandler),
|
adminAuthHandler(
|
||||||
|
userUnlockHandler)),
|
||||||
[]string{"POST"},
|
[]string{"POST"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"/logout",
|
"/logout",
|
||||||
logoutHandler,
|
jwtHandler(
|
||||||
|
logoutHandler),
|
||||||
[]string{"GET", "POST"},
|
[]string{"GET", "POST"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"/view/{key}",
|
"/view/{key}",
|
||||||
pageHandler,
|
jwtHandler(
|
||||||
|
pageHandler),
|
||||||
[]string{"GET"},
|
[]string{"GET"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"/view/{key}/md",
|
"/view/{key}/md",
|
||||||
pageMDHandler(
|
jwtHandler(
|
||||||
pageHandler),
|
pageMDHandler(
|
||||||
|
pageHandler)),
|
||||||
[]string{"GET"},
|
[]string{"GET"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"/{section:[a-zA-Z0-9]+}",
|
"/{section:[a-zA-Z0-9]+}",
|
||||||
sectionHandler,
|
jwtHandler(
|
||||||
|
sectionHandler),
|
||||||
[]string{"GET"},
|
[]string{"GET"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"/{section:[a-zA-Z0-9]+}/{title:[a-zA-Z0-9+-]+}",
|
"/{section:[a-zA-Z0-9]+}/{title:[a-zA-Z0-9+-]+}",
|
||||||
pageHandler,
|
jwtHandler(
|
||||||
[]string{"GET"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"/{section:[a-zA-Z0-9]+}/{title:[a-zA-Z0-9+-]+}/md",
|
|
||||||
pageMDHandler(
|
|
||||||
pageHandler),
|
pageHandler),
|
||||||
[]string{"GET"},
|
[]string{"GET"},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"/{section:[a-zA-Z0-9]+}/{title:[a-zA-Z0-9+-]+}/md",
|
||||||
|
jwtHandler(
|
||||||
|
pageMDHandler(
|
||||||
|
pageHandler)),
|
||||||
|
[]string{"GET"},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"/{section:[a-zA-Z0-9]+}/{title:[a-zA-Z0-9+-]+}/share",
|
"/{section:[a-zA-Z0-9]+}/{title:[a-zA-Z0-9+-]+}/share",
|
||||||
pageShareHandler,
|
jwtHandler(
|
||||||
|
pageShareHandler),
|
||||||
[]string{"GET", "POST"},
|
[]string{"GET", "POST"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"/{section:[a-zA-Z0-9]+}/{title:[a-zA-Z0-9+-]+}/edit",
|
"/{section:[a-zA-Z0-9]+}/{title:[a-zA-Z0-9+-]+}/edit",
|
||||||
authHandler(
|
jwtHandler(
|
||||||
pageEditHandler),
|
authHandler(
|
||||||
|
pageEditHandler)),
|
||||||
[]string{"GET", "POST"},
|
[]string{"GET", "POST"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"/{section:[a-zA-Z0-9]+}/{title:[a-zA-Z0-9+-]+}/del",
|
"/{section:[a-zA-Z0-9]+}/{title:[a-zA-Z0-9+-]+}/del",
|
||||||
authHandler(
|
jwtHandler(
|
||||||
pageDelHandler),
|
authHandler(
|
||||||
|
pageDelHandler)),
|
||||||
[]string{"GET", "POST"},
|
[]string{"GET", "POST"},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
cookieName = "gosession"
|
cookieName = "gowiki_session"
|
||||||
)
|
)
|
||||||
|
|
||||||
type HTTPServer struct {
|
type HTTPServer struct {
|
||||||
|
|
@ -81,6 +81,9 @@ func (s *HTTPServer) Stop() error {
|
||||||
func (s *HTTPServer) buildRoutes() http.Handler {
|
func (s *HTTPServer) buildRoutes() http.Handler {
|
||||||
m := mux.NewRouter()
|
m := mux.NewRouter()
|
||||||
m.NotFoundHandler = ¬FoundHandler{s}
|
m.NotFoundHandler = ¬FoundHandler{s}
|
||||||
|
for _, v := range static {
|
||||||
|
m.HandleFunc(v.Path, s.contextWrapper(v.Handler)).Methods(v.Methods...)
|
||||||
|
}
|
||||||
for _, v := range routes {
|
for _, v := range routes {
|
||||||
m.HandleFunc(v.Path, s.contextWrapper(v.Handler)).Methods(v.Methods...)
|
m.HandleFunc(v.Path, s.contextWrapper(v.Handler)).Methods(v.Methods...)
|
||||||
}
|
}
|
||||||
|
|
@ -88,10 +91,6 @@ func (s *HTTPServer) buildRoutes() http.Handler {
|
||||||
}
|
}
|
||||||
func (s *HTTPServer) contextWrapper(h ctxHandler) http.HandlerFunc {
|
func (s *HTTPServer) contextWrapper(h ctxHandler) http.HandlerFunc {
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
ctx := newContext(w, r, s)
|
h(newContext(w, r, s))
|
||||||
if ctx == nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
h(ctx)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -1,55 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
### BEGIN INIT INFO
|
|
||||||
# Provides: gowiki
|
|
||||||
# Required-Start: $syslog $network
|
|
||||||
# Required-Stop: $syslog
|
|
||||||
# Default-Start: 2 3 4 5
|
|
||||||
# Default-Stop: 0 1 6
|
|
||||||
# Short-Description: GoWiki
|
|
||||||
# Description: GoWiki
|
|
||||||
### END INIT INFO
|
|
||||||
|
|
||||||
PATH=/sbin:/usr/sbin:/bin:/usr/bin
|
|
||||||
DESC="wiki engine"
|
|
||||||
NAME=gowiki
|
|
||||||
DAEMON=/usr/bin/${NAME}
|
|
||||||
DAEMON_OPTS="-s"
|
|
||||||
PID=$(ps aux|grep "${DAEMON}"|awk '!/grep/{print $2}')
|
|
||||||
|
|
||||||
. /lib/lsb/init-functions
|
|
||||||
|
|
||||||
do_start() {
|
|
||||||
${DAEMON} ${DAEMON_OPTS}
|
|
||||||
log_end_msg ${?}
|
|
||||||
}
|
|
||||||
|
|
||||||
do_stop() {
|
|
||||||
kill ${PID}
|
|
||||||
return "${?}"
|
|
||||||
}
|
|
||||||
|
|
||||||
case "${1}" in
|
|
||||||
start)
|
|
||||||
log_action_msg "Starting ${DESC}" "${NAME}"
|
|
||||||
do_start
|
|
||||||
;;
|
|
||||||
stop)
|
|
||||||
log_daemon_msg "Stopping ${DESC}" "${NAME}"
|
|
||||||
do_stop
|
|
||||||
;;
|
|
||||||
restart)
|
|
||||||
log_daemon_msg "Restarting ${DESC}" "${NAME}"
|
|
||||||
do_stop
|
|
||||||
if [ ${?} -ne 0 ]; then
|
|
||||||
log_end_msg 1
|
|
||||||
fi
|
|
||||||
do_start
|
|
||||||
;;
|
|
||||||
status)
|
|
||||||
status_of_proc -p ${PID} "${DAEMON}" "${NAME}" && exit 0 || exit ${?}
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "Usage: service ${NAME} {start|stop|restart|status}"
|
|
||||||
exit 3
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
@ -1,4 +1,27 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
useradd wiki
|
groupadd wiki
|
||||||
mkdir /var/{lib,log}/gowiki
|
useradd -g wiki wiki
|
||||||
chown wiki: /var/{lib,log}/gowiki
|
mkdir /var/lib/gowiki
|
||||||
|
chown wiki: /var/lib/gowiki
|
||||||
|
cat <<EOF> /etc/systemd/system/gowiki.service
|
||||||
|
[Unit]
|
||||||
|
Description=GoWiki
|
||||||
|
After=syslog.target
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=forking
|
||||||
|
ExecStart=/usr/local/bin/gowiki server -c /etc/gowiki/gowiki.conf
|
||||||
|
Restart=always
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
cat <<EOF> /etc/gowiki/gowiki.conf
|
||||||
|
{
|
||||||
|
"data_dir": "/var/lib/gowiki",
|
||||||
|
"secret": "$(openssl rand -hex 32)"
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
systemctl enable gowiki
|
||||||
|
systemctl start gowiki
|
||||||
|
|
|
||||||
|
|
@ -14,15 +14,17 @@ chmod 555 /etc/rc.d/gowiki
|
||||||
rcctl enable gowiki
|
rcctl enable gowiki
|
||||||
rcctl set gowiki flags server -c /var/wiki/gowiki.conf
|
rcctl set gowiki flags server -c /var/wiki/gowiki.conf
|
||||||
|
|
||||||
# user
|
# user and group
|
||||||
useradd -m -b /var -s /sbin/nologin wiki
|
mkdir /var/wiki
|
||||||
|
groupadd wiki
|
||||||
|
useradd -d /var/wiki -s /sbin/nologin -g wiki wiki
|
||||||
|
chown wiki:wiki /var/wiki
|
||||||
|
|
||||||
# config
|
# config
|
||||||
cat <<EOF> /var/wiki/gowiki.conf
|
cat <<EOF> /var/wiki/gowiki.conf
|
||||||
{
|
{
|
||||||
"data_dir": "/var/wiki",
|
"data_dir": "/var/wiki",
|
||||||
"secret": "$(openssl rand -hex 32)",
|
"secret": "$(openssl rand -hex 32)"
|
||||||
"secure_cookie": true
|
|
||||||
}
|
}
|
||||||
EOF
|
EOF
|
||||||
chmod 640 /var/wiki/gowiki.conf
|
chmod 640 /var/wiki/gowiki.conf
|
||||||
|
|
|
||||||
12
templates/bootstrap.css
vendored
12
templates/bootstrap.css
vendored
File diff suppressed because one or more lines are too long
|
|
@ -141,9 +141,15 @@ html, body, .container, .content {
|
||||||
.push {
|
.push {
|
||||||
height: 60px;
|
height: 60px;
|
||||||
}
|
}
|
||||||
.footer-wrapper {
|
.full-width {
|
||||||
position: relative;
|
width: 100%;
|
||||||
padding-top: 20px;
|
}
|
||||||
height: 50px;
|
.relative {
|
||||||
color: #888888;
|
position: relative;
|
||||||
|
}
|
||||||
|
.btn-breadcrumb {
|
||||||
|
position: absolute;
|
||||||
|
right: 1rem;
|
||||||
|
top: 38%;
|
||||||
|
transform: translateY(-50%);
|
||||||
}
|
}
|
||||||
|
|
@ -3,8 +3,8 @@
|
||||||
<head>
|
<head>
|
||||||
<title>GoWiki | {{.Title}}</title>
|
<title>GoWiki | {{.Title}}</title>
|
||||||
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" integrity="sha256-bgotk/IPq4Yvt6s8AQGPTM5ZjPjQ6rrBRa2EyxpnFSc="></link>
|
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" integrity="sha256-bgotk/IPq4Yvt6s8AQGPTM5ZjPjQ6rrBRa2EyxpnFSc="></link>
|
||||||
<link rel="stylesheet" type="text/css" href="/bootstrap.css" media="screen" integrity="sha256-NeLmQ7cX66J4MdtgGlG3O/TgvsSyP1b9WbaQtxYZUbQ="></link>
|
<link rel="stylesheet" type="text/css" href="/bootstrap.css" media="screen" integrity="sha256-3YeveuySvBgp2GItUS8eV1R/9T1zcPMyvw22SyVf8qo="></link>
|
||||||
<link rel="stylesheet" type="text/css" href="/custom.css" media="screen" integrity="sha256-5/Vbh+c9BC042HeSbJXZZVIc1dD2b9cy6uH9LFAOSfo="></link>
|
<link rel="stylesheet" type="text/css" href="/custom.css" media="screen" integrity="sha256-D5AfVT38goWX4TtUsELUsg0GIJHPxVnYYnkUJWGrolI="></link>
|
||||||
<meta name="theme-color" content="#375a7f">
|
<meta name="theme-color" content="#375a7f">
|
||||||
<meta name="description" content="{{.Title}}">
|
<meta name="description" content="{{.Title}}">
|
||||||
</head>
|
</head>
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,23 @@
|
||||||
{{define "body"}}
|
{{define "body"}}
|
||||||
<div class="page-header">
|
<div class="row">
|
||||||
<div class="row">
|
<div class="nav-container full-width relative">
|
||||||
<h2>{{.BodyTitle}}</h2>
|
<ol class="breadcrumb full-width">
|
||||||
|
<li class="breadcrumb-item"></li>
|
||||||
|
<li class="breadcrumb-item"><a href="/{{.BodyTitle}}">{{.BodyTitle}}</a></li>
|
||||||
|
<li class="breadcrumb-item active">{{.Data.Title}}</li>
|
||||||
|
</ol>
|
||||||
|
<div class="btn-group btn-breadcrumb">
|
||||||
|
<a href="/{{.Data.StoreTitle}}/md" class="btn btn-sm btn-primary">Markdown</a>
|
||||||
|
{{if .Login}}
|
||||||
|
<a href="/{{.Data.StoreTitle}}/edit" class="btn btn-sm btn-primary">Edit</a>
|
||||||
|
{{if eq .Data.Perm 2}}
|
||||||
|
<a href="/{{.Data.StoreTitle}}/share" class="btn btn-sm btn-primary">Share</a>
|
||||||
|
{{end}}
|
||||||
|
{{if ne .Data.StoreTitle "wiki/Index"}}
|
||||||
|
<a href="/{{.Data.StoreTitle}}/del" class="btn btn-sm btn-danger">Delete</a>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row mt-3">
|
<div class="row mt-3">
|
||||||
|
|
@ -21,23 +37,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row mt-5">
|
<div class="row mt-5">
|
||||||
<div class="col">
|
{{.Data.TOC}}
|
||||||
{{.Data.TOC}}
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<div class="btn-group float-md-right">
|
|
||||||
<a href="/{{.Data.StoreTitle}}/md" class="btn btn-sm btn-primary">Markdown</a>
|
|
||||||
{{if .Login}}
|
|
||||||
<a href="/{{.Data.StoreTitle}}/edit" class="btn btn-sm btn-primary">Edit</a>
|
|
||||||
{{if eq .Data.Perm 3}}
|
|
||||||
<a href="/{{.Data.StoreTitle}}/share" class="btn btn-sm btn-primary">Share</a>
|
|
||||||
{{end}}
|
|
||||||
{{if ne .Data.StoreTitle "wiki/Index"}}
|
|
||||||
<a href="/{{.Data.StoreTitle}}/del" class="btn btn-sm btn-danger">Delete</a>
|
|
||||||
{{end}}
|
|
||||||
{{end}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
{{.Data.HTML}}
|
{{.Data.HTML}}
|
||||||
{{end}}
|
{{end}}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,11 @@
|
||||||
{{define "body"}}
|
{{define "body"}}
|
||||||
<div class="page-header">
|
<div class="row">
|
||||||
<div class="row">
|
<div class="nav-container full-width relative">
|
||||||
<a href="{{if .Key}}/view/{{.Key}}{{else}}/{{.Data.StoreTitle}}{{end}}"><h2>{{.BodyTitle}}</h2></a>
|
<ol class="breadcrumb full-width">
|
||||||
|
<li class="breadcrumb-item"></li>
|
||||||
|
<li class="breadcrumb-item"><a href="/{{.BodyTitle}}">{{.BodyTitle}}</a></li>
|
||||||
|
<li class="breadcrumb-item active"><a href="/{{if .Key}}view/{{.Key}}{{else}}{{.Data.StoreTitle}}{{end}}">{{.Data.Title}}</a></li>
|
||||||
|
</ol>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row mt-3">
|
<div class="row mt-3">
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,14 @@
|
||||||
{{define "body"}}
|
{{define "body"}}
|
||||||
<div class="page-header">
|
<div class="row">
|
||||||
<div class="row">
|
<div class="nav-container full-width relative">
|
||||||
<h2>{{.BodyTitle}}</h2>
|
<ol class="breadcrumb full-width">
|
||||||
|
<li class="breadcrumb-item"></li>
|
||||||
|
<li class="breadcrumb-item"><a href="/{{.BodyTitle}}">{{.BodyTitle}}</a></li>
|
||||||
|
<li class="breadcrumb-item active">{{.Data.Title}}</li>
|
||||||
|
</ol>
|
||||||
|
<div class="btn-group btn-breadcrumb">
|
||||||
|
<a href="/view/{{.Key}}/md" class="btn btn-sm btn-primary">Markdown</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row mt-3">
|
<div class="row mt-3">
|
||||||
|
|
@ -21,14 +28,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row mt-5">
|
<div class="row mt-5">
|
||||||
<div class="col">
|
{{.Data.TOC}}
|
||||||
{{.Data.TOC}}
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<div class="btn-group float-md-right">
|
|
||||||
<a href="/view/{{.Key}}/md" class="btn btn-sm btn-primary">Markdown</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
{{.Data.HTML}}
|
{{.Data.HTML}}
|
||||||
{{end}}
|
{{end}}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
{{define "body"}}
|
{{define "body"}}
|
||||||
<div class="page-header">
|
<!--<div class="page-header">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<h2>{{.BodyTitle}}</h2>
|
<h2>{{.BodyTitle}}</h2>
|
||||||
|
|
@ -12,6 +12,20 @@
|
||||||
</div>
|
</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
</div>
|
</div>
|
||||||
|
</div>-->
|
||||||
|
<div class="row">
|
||||||
|
<div class="nav-container full-width relative">
|
||||||
|
<ol class="breadcrumb full-width">
|
||||||
|
<li class="breadcrumb-item"></li>
|
||||||
|
<li class="breadcrumb-item">{{.BodyTitle}}</li>
|
||||||
|
</ol>
|
||||||
|
{{if .Admin}}
|
||||||
|
<div class="btn-group btn-breadcrumb">
|
||||||
|
<a class="btn btn-sm btn-primary" href="/section/edit/{{.BodyTitle}}">Edit</a>
|
||||||
|
<a class="btn btn-sm btn-danger" href="/section/del/{{.BodyTitle}}">Delete</a>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{if .Data}}
|
{{if .Data}}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
|
|
||||||
|
|
@ -20,9 +20,13 @@
|
||||||
<strong><a href="/{{$item.Section}}">{{$item.Section}}</a></strong>
|
<strong><a href="/{{$item.Section}}">{{$item.Section}}</a></strong>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
|
{{if $item.Pages}}
|
||||||
{{range $page := $item.Pages}}
|
{{range $page := $item.Pages}}
|
||||||
<strong><a href="/{{$page.StoreTitle}}">{{$page.Title}}</a></strong><br>
|
<strong><a href="/{{$page.StoreTitle}}">{{$page.Title}}</a></strong><br>
|
||||||
{{end}}
|
{{end}}
|
||||||
|
{{else}}
|
||||||
|
<strong>Empty section</strong>
|
||||||
|
{{end}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
2
vendor/github.com/RoaringBitmap/roaring/.travis.yml
generated
vendored
2
vendor/github.com/RoaringBitmap/roaring/.travis.yml
generated
vendored
|
|
@ -12,6 +12,8 @@ go:
|
||||||
- "1.8.x"
|
- "1.8.x"
|
||||||
- "1.9.x"
|
- "1.9.x"
|
||||||
- "1.10.x"
|
- "1.10.x"
|
||||||
|
- "1.11.x"
|
||||||
|
- "1.12.x"
|
||||||
- tip
|
- tip
|
||||||
|
|
||||||
# whitelist
|
# whitelist
|
||||||
|
|
|
||||||
3
vendor/github.com/RoaringBitmap/roaring/CONTRIBUTORS
generated
vendored
3
vendor/github.com/RoaringBitmap/roaring/CONTRIBUTORS
generated
vendored
|
|
@ -11,4 +11,5 @@ Jason E. Aten (@glycerine),
|
||||||
Vali Malinoiu (@0x4139),
|
Vali Malinoiu (@0x4139),
|
||||||
Forud Ghafouri (@fzerorubigd),
|
Forud Ghafouri (@fzerorubigd),
|
||||||
Joe Nall (@joenall),
|
Joe Nall (@joenall),
|
||||||
(@fredim)
|
(@fredim),
|
||||||
|
Edd Robinson (@e-dard)
|
||||||
|
|
|
||||||
33
vendor/github.com/RoaringBitmap/roaring/LICENSE
generated
vendored
33
vendor/github.com/RoaringBitmap/roaring/LICENSE
generated
vendored
|
|
@ -200,3 +200,36 @@
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
See the License for the specific language governing permissions and
|
See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
Portions of runcontainer.go are from the Go standard library, which is licensed
|
||||||
|
under:
|
||||||
|
|
||||||
|
Copyright (c) 2009 The Go Authors. All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are
|
||||||
|
met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above
|
||||||
|
copyright notice, this list of conditions and the following disclaimer
|
||||||
|
in the documentation and/or other materials provided with the
|
||||||
|
distribution.
|
||||||
|
* Neither the name of Google Inc. nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived from
|
||||||
|
this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
|
||||||
24
vendor/github.com/RoaringBitmap/roaring/bitmapcontainer.go
generated
vendored
24
vendor/github.com/RoaringBitmap/roaring/bitmapcontainer.go
generated
vendored
|
|
@ -532,11 +532,31 @@ func (bc *bitmapContainer) iorBitmap(value2 *bitmapContainer) container {
|
||||||
func (bc *bitmapContainer) lazyIORArray(value2 *arrayContainer) container {
|
func (bc *bitmapContainer) lazyIORArray(value2 *arrayContainer) container {
|
||||||
answer := bc
|
answer := bc
|
||||||
c := value2.getCardinality()
|
c := value2.getCardinality()
|
||||||
for k := 0; k < c; k++ {
|
for k := 0; k+3 < c; k += 4 {
|
||||||
|
content := (*[4]uint16)(unsafe.Pointer(&value2.content[k]))
|
||||||
|
vc0 := content[0]
|
||||||
|
i0 := uint(vc0) >> 6
|
||||||
|
answer.bitmap[i0] = answer.bitmap[i0] | (uint64(1) << (vc0 % 64))
|
||||||
|
|
||||||
|
vc1 := content[1]
|
||||||
|
i1 := uint(vc1) >> 6
|
||||||
|
answer.bitmap[i1] = answer.bitmap[i1] | (uint64(1) << (vc1 % 64))
|
||||||
|
|
||||||
|
vc2 := content[2]
|
||||||
|
i2 := uint(vc2) >> 6
|
||||||
|
answer.bitmap[i2] = answer.bitmap[i2] | (uint64(1) << (vc2 % 64))
|
||||||
|
|
||||||
|
vc3 := content[3]
|
||||||
|
i3 := uint(vc3) >> 6
|
||||||
|
answer.bitmap[i3] = answer.bitmap[i3] | (uint64(1) << (vc3 % 64))
|
||||||
|
}
|
||||||
|
|
||||||
|
for k := c &^ 3; k < c; k++ {
|
||||||
vc := value2.content[k]
|
vc := value2.content[k]
|
||||||
i := uint(vc) >> 6
|
i := uint(vc) >> 6
|
||||||
answer.bitmap[i] = answer.bitmap[i] | (uint64(1) << (vc % 64))
|
answer.bitmap[i] = answer.bitmap[i] | (uint64(1) << (vc % 64))
|
||||||
}
|
}
|
||||||
|
|
||||||
answer.cardinality = invalidCardinality
|
answer.cardinality = invalidCardinality
|
||||||
return answer
|
return answer
|
||||||
}
|
}
|
||||||
|
|
@ -948,7 +968,7 @@ func (bc *bitmapContainer) PrevSetBit(i int) int {
|
||||||
|
|
||||||
w = w << uint(63-b)
|
w = w << uint(63-b)
|
||||||
if w != 0 {
|
if w != 0 {
|
||||||
return b - countLeadingZeros(w)
|
return i - countLeadingZeros(w)
|
||||||
}
|
}
|
||||||
x--
|
x--
|
||||||
for ; x >= 0; x-- {
|
for ; x >= 0; x-- {
|
||||||
|
|
|
||||||
15
vendor/github.com/RoaringBitmap/roaring/go.mod
generated
vendored
Normal file
15
vendor/github.com/RoaringBitmap/roaring/go.mod
generated
vendored
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
module github.com/RoaringBitmap/roaring
|
||||||
|
|
||||||
|
go 1.12
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/glycerine/go-unsnap-stream v0.0.0-20181221182339-f9677308dec2
|
||||||
|
github.com/glycerine/goconvey v0.0.0-20180728074245-46e3a41ad493 // indirect
|
||||||
|
github.com/golang/snappy v0.0.1 // indirect
|
||||||
|
github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae
|
||||||
|
github.com/philhofer/fwd v1.0.0 // indirect
|
||||||
|
github.com/smartystreets/goconvey v0.0.0-20190306220146-200a235640ff
|
||||||
|
github.com/stretchr/testify v1.3.0
|
||||||
|
github.com/tinylib/msgp v1.1.0
|
||||||
|
github.com/willf/bitset v1.1.10
|
||||||
|
)
|
||||||
29
vendor/github.com/RoaringBitmap/roaring/go.sum
generated
vendored
Normal file
29
vendor/github.com/RoaringBitmap/roaring/go.sum
generated
vendored
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
||||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/glycerine/go-unsnap-stream v0.0.0-20181221182339-f9677308dec2 h1:Ujru1hufTHVb++eG6OuNDKMxZnGIvF6o/u8q/8h2+I4=
|
||||||
|
github.com/glycerine/go-unsnap-stream v0.0.0-20181221182339-f9677308dec2/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE=
|
||||||
|
github.com/glycerine/goconvey v0.0.0-20180728074245-46e3a41ad493 h1:OTanQnFt0bi5iLFSdbEVA/idR6Q2WhCm+deb7ir2CcM=
|
||||||
|
github.com/glycerine/goconvey v0.0.0-20180728074245-46e3a41ad493/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24=
|
||||||
|
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
|
||||||
|
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
|
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
|
||||||
|
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||||
|
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
|
||||||
|
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||||
|
github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae h1:VeRdUYdCw49yizlSbMEn2SZ+gT+3IUKx8BqxyQdz+BY=
|
||||||
|
github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg=
|
||||||
|
github.com/philhofer/fwd v1.0.0 h1:UbZqGr5Y38ApvM/V/jEljVxwocdweyH+vmYvRPBnbqQ=
|
||||||
|
github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
|
||||||
|
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||||
|
github.com/smartystreets/goconvey v0.0.0-20190306220146-200a235640ff h1:86HlEv0yBCry9syNuylzqznKXDK11p6D0DT596yNMys=
|
||||||
|
github.com/smartystreets/goconvey v0.0.0-20190306220146-200a235640ff/go.mod h1:KSQcGKpxUMHk3nbYzs/tIBAM2iDooCn0BmttHOJEbLs=
|
||||||
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
||||||
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
|
github.com/tinylib/msgp v1.1.0 h1:9fQd+ICuRIu/ue4vxJZu6/LzxN0HwMds2nq/0cFvxHU=
|
||||||
|
github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
|
||||||
|
github.com/willf/bitset v1.1.10 h1:NotGKqX0KwQ72NUzqrjZq5ipPNDQex9lo3WpaS8L2sc=
|
||||||
|
github.com/willf/bitset v1.1.10/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=
|
||||||
10
vendor/github.com/RoaringBitmap/roaring/roaring.go
generated
vendored
10
vendor/github.com/RoaringBitmap/roaring/roaring.go
generated
vendored
|
|
@ -364,17 +364,20 @@ func (rb *Bitmap) String() string {
|
||||||
return buffer.String()
|
return buffer.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Iterator creates a new IntIterable to iterate over the integers contained in the bitmap, in sorted order
|
// Iterator creates a new IntIterable to iterate over the integers contained in the bitmap, in sorted order;
|
||||||
|
// the iterator becomes invalid if the bitmap is modified (e.g., with Add or Remove).
|
||||||
func (rb *Bitmap) Iterator() IntIterable {
|
func (rb *Bitmap) Iterator() IntIterable {
|
||||||
return newIntIterator(rb)
|
return newIntIterator(rb)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReverseIterator creates a new IntIterable to iterate over the integers contained in the bitmap, in sorted order
|
// ReverseIterator creates a new IntIterable to iterate over the integers contained in the bitmap, in sorted order;
|
||||||
|
// the iterator becomes invalid if the bitmap is modified (e.g., with Add or Remove).
|
||||||
func (rb *Bitmap) ReverseIterator() IntIterable {
|
func (rb *Bitmap) ReverseIterator() IntIterable {
|
||||||
return newIntReverseIterator(rb)
|
return newIntReverseIterator(rb)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ManyIterator creates a new ManyIntIterable to iterate over the integers contained in the bitmap, in sorted order
|
// ManyIterator creates a new ManyIntIterable to iterate over the integers contained in the bitmap, in sorted order;
|
||||||
|
// the iterator becomes invalid if the bitmap is modified (e.g., with Add or Remove).
|
||||||
func (rb *Bitmap) ManyIterator() ManyIntIterable {
|
func (rb *Bitmap) ManyIterator() ManyIntIterable {
|
||||||
return newManyIntIterator(rb)
|
return newManyIntIterator(rb)
|
||||||
}
|
}
|
||||||
|
|
@ -418,6 +421,7 @@ func (rb *Bitmap) Equals(o interface{}) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AddOffset adds the value 'offset' to each and every value in a bitmap, generating a new bitmap in the process
|
||||||
func AddOffset(x *Bitmap, offset uint32) (answer *Bitmap) {
|
func AddOffset(x *Bitmap, offset uint32) (answer *Bitmap) {
|
||||||
containerOffset := highbits(offset)
|
containerOffset := highbits(offset)
|
||||||
inOffset := lowbits(offset)
|
inOffset := lowbits(offset)
|
||||||
|
|
|
||||||
145
vendor/github.com/blevesearch/bleve/analysis/analyzer/custom/custom.go
generated
vendored
Normal file
145
vendor/github.com/blevesearch/bleve/analysis/analyzer/custom/custom.go
generated
vendored
Normal file
|
|
@ -0,0 +1,145 @@
|
||||||
|
// Copyright (c) 2014 Couchbase, Inc.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package custom
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/blevesearch/bleve/analysis"
|
||||||
|
"github.com/blevesearch/bleve/registry"
|
||||||
|
)
|
||||||
|
|
||||||
|
const Name = "custom"
|
||||||
|
|
||||||
|
func AnalyzerConstructor(config map[string]interface{}, cache *registry.Cache) (*analysis.Analyzer, error) {
|
||||||
|
|
||||||
|
var err error
|
||||||
|
var charFilters []analysis.CharFilter
|
||||||
|
charFiltersValue, ok := config["char_filters"]
|
||||||
|
if ok {
|
||||||
|
switch charFiltersValue := charFiltersValue.(type) {
|
||||||
|
case []string:
|
||||||
|
charFilters, err = getCharFilters(charFiltersValue, cache)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
case []interface{}:
|
||||||
|
charFiltersNames, err := convertInterfaceSliceToStringSlice(charFiltersValue, "char filter")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
charFilters, err = getCharFilters(charFiltersNames, cache)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("unsupported type for char_filters, must be slice")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var tokenizerName string
|
||||||
|
tokenizerValue, ok := config["tokenizer"]
|
||||||
|
if ok {
|
||||||
|
tokenizerName, ok = tokenizerValue.(string)
|
||||||
|
if !ok {
|
||||||
|
return nil, fmt.Errorf("must specify tokenizer as string")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return nil, fmt.Errorf("must specify tokenizer")
|
||||||
|
}
|
||||||
|
|
||||||
|
tokenizer, err := cache.TokenizerNamed(tokenizerName)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var tokenFilters []analysis.TokenFilter
|
||||||
|
tokenFiltersValue, ok := config["token_filters"]
|
||||||
|
if ok {
|
||||||
|
switch tokenFiltersValue := tokenFiltersValue.(type) {
|
||||||
|
case []string:
|
||||||
|
tokenFilters, err = getTokenFilters(tokenFiltersValue, cache)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
case []interface{}:
|
||||||
|
tokenFiltersNames, err := convertInterfaceSliceToStringSlice(tokenFiltersValue, "token filter")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
tokenFilters, err = getTokenFilters(tokenFiltersNames, cache)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("unsupported type for token_filters, must be slice")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rv := analysis.Analyzer{
|
||||||
|
Tokenizer: tokenizer,
|
||||||
|
}
|
||||||
|
if charFilters != nil {
|
||||||
|
rv.CharFilters = charFilters
|
||||||
|
}
|
||||||
|
if tokenFilters != nil {
|
||||||
|
rv.TokenFilters = tokenFilters
|
||||||
|
}
|
||||||
|
return &rv, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
registry.RegisterAnalyzer(Name, AnalyzerConstructor)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getCharFilters(charFilterNames []string, cache *registry.Cache) ([]analysis.CharFilter, error) {
|
||||||
|
charFilters := make([]analysis.CharFilter, len(charFilterNames))
|
||||||
|
for i, charFilterName := range charFilterNames {
|
||||||
|
charFilter, err := cache.CharFilterNamed(charFilterName)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
charFilters[i] = charFilter
|
||||||
|
}
|
||||||
|
|
||||||
|
return charFilters, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getTokenFilters(tokenFilterNames []string, cache *registry.Cache) ([]analysis.TokenFilter, error) {
|
||||||
|
tokenFilters := make([]analysis.TokenFilter, len(tokenFilterNames))
|
||||||
|
for i, tokenFilterName := range tokenFilterNames {
|
||||||
|
tokenFilter, err := cache.TokenFilterNamed(tokenFilterName)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
tokenFilters[i] = tokenFilter
|
||||||
|
}
|
||||||
|
|
||||||
|
return tokenFilters, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func convertInterfaceSliceToStringSlice(interfaceSlice []interface{}, objType string) ([]string, error) {
|
||||||
|
stringSlice := make([]string, len(interfaceSlice))
|
||||||
|
for i, interfaceObj := range interfaceSlice {
|
||||||
|
stringObj, ok := interfaceObj.(string)
|
||||||
|
if ok {
|
||||||
|
stringSlice[i] = stringObj
|
||||||
|
} else {
|
||||||
|
return nil, fmt.Errorf(objType + " name must be a string")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return stringSlice, nil
|
||||||
|
}
|
||||||
115
vendor/github.com/blevesearch/bleve/analysis/token/edgengram/edgengram.go
generated
vendored
Normal file
115
vendor/github.com/blevesearch/bleve/analysis/token/edgengram/edgengram.go
generated
vendored
Normal file
|
|
@ -0,0 +1,115 @@
|
||||||
|
// Copyright (c) 2014 Couchbase, Inc.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package edgengram
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"unicode/utf8"
|
||||||
|
|
||||||
|
"github.com/blevesearch/bleve/analysis"
|
||||||
|
"github.com/blevesearch/bleve/registry"
|
||||||
|
)
|
||||||
|
|
||||||
|
const Name = "edge_ngram"
|
||||||
|
|
||||||
|
type Side bool
|
||||||
|
|
||||||
|
const BACK Side = true
|
||||||
|
const FRONT Side = false
|
||||||
|
|
||||||
|
type EdgeNgramFilter struct {
|
||||||
|
back Side
|
||||||
|
minLength int
|
||||||
|
maxLength int
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewEdgeNgramFilter(side Side, minLength, maxLength int) *EdgeNgramFilter {
|
||||||
|
return &EdgeNgramFilter{
|
||||||
|
back: side,
|
||||||
|
minLength: minLength,
|
||||||
|
maxLength: maxLength,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *EdgeNgramFilter) Filter(input analysis.TokenStream) analysis.TokenStream {
|
||||||
|
rv := make(analysis.TokenStream, 0, len(input))
|
||||||
|
|
||||||
|
for _, token := range input {
|
||||||
|
runeCount := utf8.RuneCount(token.Term)
|
||||||
|
runes := bytes.Runes(token.Term)
|
||||||
|
if s.back {
|
||||||
|
i := runeCount
|
||||||
|
// index of the starting rune for this token
|
||||||
|
for ngramSize := s.minLength; ngramSize <= s.maxLength; ngramSize++ {
|
||||||
|
// build an ngram of this size starting at i
|
||||||
|
if i-ngramSize >= 0 {
|
||||||
|
ngramTerm := analysis.BuildTermFromRunes(runes[i-ngramSize : i])
|
||||||
|
token := analysis.Token{
|
||||||
|
Position: token.Position,
|
||||||
|
Start: token.Start,
|
||||||
|
End: token.End,
|
||||||
|
Type: token.Type,
|
||||||
|
Term: ngramTerm,
|
||||||
|
}
|
||||||
|
rv = append(rv, &token)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
i := 0
|
||||||
|
// index of the starting rune for this token
|
||||||
|
for ngramSize := s.minLength; ngramSize <= s.maxLength; ngramSize++ {
|
||||||
|
// build an ngram of this size starting at i
|
||||||
|
if i+ngramSize <= runeCount {
|
||||||
|
ngramTerm := analysis.BuildTermFromRunes(runes[i : i+ngramSize])
|
||||||
|
token := analysis.Token{
|
||||||
|
Position: token.Position,
|
||||||
|
Start: token.Start,
|
||||||
|
End: token.End,
|
||||||
|
Type: token.Type,
|
||||||
|
Term: ngramTerm,
|
||||||
|
}
|
||||||
|
rv = append(rv, &token)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rv
|
||||||
|
}
|
||||||
|
|
||||||
|
func EdgeNgramFilterConstructor(config map[string]interface{}, cache *registry.Cache) (analysis.TokenFilter, error) {
|
||||||
|
side := FRONT
|
||||||
|
back, ok := config["back"].(bool)
|
||||||
|
if ok && back {
|
||||||
|
side = BACK
|
||||||
|
}
|
||||||
|
minVal, ok := config["min"].(float64)
|
||||||
|
if !ok {
|
||||||
|
return nil, fmt.Errorf("must specify min")
|
||||||
|
}
|
||||||
|
min := int(minVal)
|
||||||
|
maxVal, ok := config["max"].(float64)
|
||||||
|
if !ok {
|
||||||
|
return nil, fmt.Errorf("must specify max")
|
||||||
|
}
|
||||||
|
max := int(maxVal)
|
||||||
|
|
||||||
|
return NewEdgeNgramFilter(side, min, max), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
registry.RegisterTokenFilter(Name, EdgeNgramFilterConstructor)
|
||||||
|
}
|
||||||
6
vendor/github.com/couchbase/vellum/.travis.yml
generated
vendored
6
vendor/github.com/couchbase/vellum/.travis.yml
generated
vendored
|
|
@ -3,11 +3,13 @@ sudo: false
|
||||||
language: go
|
language: go
|
||||||
|
|
||||||
go:
|
go:
|
||||||
- 1.8
|
- "1.9.x"
|
||||||
|
- "1.10.x"
|
||||||
|
- "1.11.x"
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- go get github.com/mattn/goveralls
|
- go get github.com/mattn/goveralls
|
||||||
- go get github.com/kisielk/errcheck
|
- go get -u github.com/kisielk/errcheck
|
||||||
- go test -v $(go list ./... | grep -v vendor/)
|
- go test -v $(go list ./... | grep -v vendor/)
|
||||||
- go test -race
|
- go test -race
|
||||||
- go vet
|
- go vet
|
||||||
|
|
|
||||||
46
vendor/github.com/couchbase/vellum/fst.go
generated
vendored
46
vendor/github.com/couchbase/vellum/fst.go
generated
vendored
|
|
@ -243,6 +243,52 @@ func (f *FST) Reader() (*Reader, error) {
|
||||||
return &Reader{f: f}, nil
|
return &Reader{f: f}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (f *FST) GetMinKey() ([]byte, error) {
|
||||||
|
var rv []byte
|
||||||
|
|
||||||
|
curr := f.decoder.getRoot()
|
||||||
|
state, err := f.decoder.stateAt(curr, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
for !state.Final() {
|
||||||
|
nextTrans := state.TransitionAt(0)
|
||||||
|
_, curr, _ = state.TransitionFor(nextTrans)
|
||||||
|
state, err = f.decoder.stateAt(curr, state)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
rv = append(rv, nextTrans)
|
||||||
|
}
|
||||||
|
|
||||||
|
return rv, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *FST) GetMaxKey() ([]byte, error) {
|
||||||
|
var rv []byte
|
||||||
|
|
||||||
|
curr := f.decoder.getRoot()
|
||||||
|
state, err := f.decoder.stateAt(curr, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
for state.NumTransitions() > 0 {
|
||||||
|
nextTrans := state.TransitionAt(state.NumTransitions() - 1)
|
||||||
|
_, curr, _ = state.TransitionFor(nextTrans)
|
||||||
|
state, err = f.decoder.stateAt(curr, state)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
rv = append(rv, nextTrans)
|
||||||
|
}
|
||||||
|
|
||||||
|
return rv, nil
|
||||||
|
}
|
||||||
|
|
||||||
// A Reader is meant for a single threaded use
|
// A Reader is meant for a single threaded use
|
||||||
type Reader struct {
|
type Reader struct {
|
||||||
f *FST
|
f *FST
|
||||||
|
|
|
||||||
60
vendor/github.com/couchbase/vellum/fst_iterator.go
generated
vendored
60
vendor/github.com/couchbase/vellum/fst_iterator.go
generated
vendored
|
|
@ -186,20 +186,29 @@ func (i *FSTIterator) Next() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *FSTIterator) next(lastOffset int) error {
|
func (i *FSTIterator) next(lastOffset int) error {
|
||||||
// remember where we started
|
// remember where we started with keysStack in this next() call
|
||||||
i.nextStart = append(i.nextStart[:0], i.keysStack...)
|
i.nextStart = append(i.nextStart[:0], i.keysStack...)
|
||||||
|
|
||||||
nextOffset := lastOffset + 1
|
nextOffset := lastOffset + 1
|
||||||
|
allowCompare := false
|
||||||
|
|
||||||
OUTER:
|
OUTER:
|
||||||
for true {
|
for true {
|
||||||
curr := i.statesStack[len(i.statesStack)-1]
|
curr := i.statesStack[len(i.statesStack)-1]
|
||||||
autCurr := i.autStatesStack[len(i.autStatesStack)-1]
|
autCurr := i.autStatesStack[len(i.autStatesStack)-1]
|
||||||
|
|
||||||
if curr.Final() && i.aut.IsMatch(autCurr) &&
|
if curr.Final() && i.aut.IsMatch(autCurr) && allowCompare {
|
||||||
bytes.Compare(i.keysStack, i.nextStart) > 0 {
|
// check to see if new keystack might have gone too far
|
||||||
// in final state greater than start key
|
if i.endKeyExclusive != nil &&
|
||||||
return nil
|
bytes.Compare(i.keysStack, i.endKeyExclusive) >= 0 {
|
||||||
|
return ErrIteratorDone
|
||||||
|
}
|
||||||
|
|
||||||
|
cmp := bytes.Compare(i.keysStack, i.nextStart)
|
||||||
|
if cmp > 0 {
|
||||||
|
// in final state greater than start key
|
||||||
|
return nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
numTrans := curr.NumTransitions()
|
numTrans := curr.NumTransitions()
|
||||||
|
|
@ -207,8 +216,12 @@ OUTER:
|
||||||
INNER:
|
INNER:
|
||||||
for nextOffset < numTrans {
|
for nextOffset < numTrans {
|
||||||
t := curr.TransitionAt(nextOffset)
|
t := curr.TransitionAt(nextOffset)
|
||||||
|
|
||||||
autNext := i.aut.Accept(autCurr, t)
|
autNext := i.aut.Accept(autCurr, t)
|
||||||
if !i.aut.CanMatch(autNext) {
|
if !i.aut.CanMatch(autNext) {
|
||||||
|
// TODO: potential optimization to skip nextOffset
|
||||||
|
// forwards more directly to something that the
|
||||||
|
// automaton likes rather than a linear scan?
|
||||||
nextOffset += 1
|
nextOffset += 1
|
||||||
continue INNER
|
continue INNER
|
||||||
}
|
}
|
||||||
|
|
@ -234,30 +247,41 @@ OUTER:
|
||||||
i.valsStack = append(i.valsStack, v)
|
i.valsStack = append(i.valsStack, v)
|
||||||
i.autStatesStack = append(i.autStatesStack, autNext)
|
i.autStatesStack = append(i.autStatesStack, autNext)
|
||||||
|
|
||||||
// check to see if new keystack might have gone too far
|
|
||||||
if i.endKeyExclusive != nil &&
|
|
||||||
bytes.Compare(i.keysStack, i.endKeyExclusive) >= 0 {
|
|
||||||
return ErrIteratorDone
|
|
||||||
}
|
|
||||||
|
|
||||||
nextOffset = 0
|
nextOffset = 0
|
||||||
|
allowCompare = true
|
||||||
|
|
||||||
continue OUTER
|
continue OUTER
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// no more transitions, so need to backtrack and stack pop
|
||||||
if len(i.statesStack) <= 1 {
|
if len(i.statesStack) <= 1 {
|
||||||
// stack len is 1 (root), can't go back further, we're done
|
// stack len is 1 (root), can't go back further, we're done
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
// no transitions, and still room to pop
|
// if the top of the stack represents a linear chain of states
|
||||||
i.statesStack = i.statesStack[:len(i.statesStack)-1]
|
// (i.e., a suffix of nodes linked by single transitions),
|
||||||
i.keysStack = i.keysStack[:len(i.keysStack)-1]
|
// then optimize by popping the suffix in one shot without
|
||||||
|
// going back all the way to the OUTER loop
|
||||||
|
var popNum int
|
||||||
|
for j := len(i.statesStack) - 1; j > 0; j-- {
|
||||||
|
if i.statesStack[j].NumTransitions() != 1 {
|
||||||
|
popNum = len(i.statesStack) - 1 - j
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if popNum < 1 { // always pop at least 1 entry from the stacks
|
||||||
|
popNum = 1
|
||||||
|
}
|
||||||
|
|
||||||
nextOffset = i.keysPosStack[len(i.keysPosStack)-1] + 1
|
nextOffset = i.keysPosStack[len(i.keysPosStack)-popNum] + 1
|
||||||
|
allowCompare = false
|
||||||
|
|
||||||
i.keysPosStack = i.keysPosStack[:len(i.keysPosStack)-1]
|
i.statesStack = i.statesStack[:len(i.statesStack)-popNum]
|
||||||
i.valsStack = i.valsStack[:len(i.valsStack)-1]
|
i.keysStack = i.keysStack[:len(i.keysStack)-popNum]
|
||||||
i.autStatesStack = i.autStatesStack[:len(i.autStatesStack)-1]
|
i.keysPosStack = i.keysPosStack[:len(i.keysPosStack)-popNum]
|
||||||
|
i.valsStack = i.valsStack[:len(i.valsStack)-popNum]
|
||||||
|
i.autStatesStack = i.autStatesStack[:len(i.autStatesStack)-popNum]
|
||||||
}
|
}
|
||||||
|
|
||||||
return ErrIteratorDone
|
return ErrIteratorDone
|
||||||
|
|
|
||||||
17
vendor/github.com/edsrzf/mmap-go/mmap.go
generated
vendored
17
vendor/github.com/edsrzf/mmap-go/mmap.go
generated
vendored
|
|
@ -81,25 +81,27 @@ func (m *MMap) header() *reflect.SliceHeader {
|
||||||
return (*reflect.SliceHeader)(unsafe.Pointer(m))
|
return (*reflect.SliceHeader)(unsafe.Pointer(m))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *MMap) addrLen() (uintptr, uintptr) {
|
||||||
|
header := m.header()
|
||||||
|
return header.Data, uintptr(header.Len)
|
||||||
|
}
|
||||||
|
|
||||||
// Lock keeps the mapped region in physical memory, ensuring that it will not be
|
// Lock keeps the mapped region in physical memory, ensuring that it will not be
|
||||||
// swapped out.
|
// swapped out.
|
||||||
func (m MMap) Lock() error {
|
func (m MMap) Lock() error {
|
||||||
dh := m.header()
|
return m.lock()
|
||||||
return lock(dh.Data, uintptr(dh.Len))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unlock reverses the effect of Lock, allowing the mapped region to potentially
|
// Unlock reverses the effect of Lock, allowing the mapped region to potentially
|
||||||
// be swapped out.
|
// be swapped out.
|
||||||
// If m is already unlocked, aan error will result.
|
// If m is already unlocked, aan error will result.
|
||||||
func (m MMap) Unlock() error {
|
func (m MMap) Unlock() error {
|
||||||
dh := m.header()
|
return m.unlock()
|
||||||
return unlock(dh.Data, uintptr(dh.Len))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Flush synchronizes the mapping's contents to the file's contents on disk.
|
// Flush synchronizes the mapping's contents to the file's contents on disk.
|
||||||
func (m MMap) Flush() error {
|
func (m MMap) Flush() error {
|
||||||
dh := m.header()
|
return m.flush()
|
||||||
return flush(dh.Data, uintptr(dh.Len))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unmap deletes the memory mapped region, flushes any remaining changes, and sets
|
// Unmap deletes the memory mapped region, flushes any remaining changes, and sets
|
||||||
|
|
@ -109,8 +111,7 @@ func (m MMap) Flush() error {
|
||||||
// Unmap should only be called on the slice value that was originally returned from
|
// Unmap should only be called on the slice value that was originally returned from
|
||||||
// a call to Map. Calling Unmap on a derived slice may cause errors.
|
// a call to Map. Calling Unmap on a derived slice may cause errors.
|
||||||
func (m *MMap) Unmap() error {
|
func (m *MMap) Unmap() error {
|
||||||
dh := m.header()
|
err := m.unmap()
|
||||||
err := unmap(dh.Data, uintptr(dh.Len))
|
|
||||||
*m = nil
|
*m = nil
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
50
vendor/github.com/edsrzf/mmap-go/mmap_unix.go
generated
vendored
50
vendor/github.com/edsrzf/mmap-go/mmap_unix.go
generated
vendored
|
|
@ -7,61 +7,45 @@
|
||||||
package mmap
|
package mmap
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"syscall"
|
"golang.org/x/sys/unix"
|
||||||
)
|
)
|
||||||
|
|
||||||
func mmap(len int, inprot, inflags, fd uintptr, off int64) ([]byte, error) {
|
func mmap(len int, inprot, inflags, fd uintptr, off int64) ([]byte, error) {
|
||||||
flags := syscall.MAP_SHARED
|
flags := unix.MAP_SHARED
|
||||||
prot := syscall.PROT_READ
|
prot := unix.PROT_READ
|
||||||
switch {
|
switch {
|
||||||
case inprot© != 0:
|
case inprot© != 0:
|
||||||
prot |= syscall.PROT_WRITE
|
prot |= unix.PROT_WRITE
|
||||||
flags = syscall.MAP_PRIVATE
|
flags = unix.MAP_PRIVATE
|
||||||
case inprot&RDWR != 0:
|
case inprot&RDWR != 0:
|
||||||
prot |= syscall.PROT_WRITE
|
prot |= unix.PROT_WRITE
|
||||||
}
|
}
|
||||||
if inprot&EXEC != 0 {
|
if inprot&EXEC != 0 {
|
||||||
prot |= syscall.PROT_EXEC
|
prot |= unix.PROT_EXEC
|
||||||
}
|
}
|
||||||
if inflags&ANON != 0 {
|
if inflags&ANON != 0 {
|
||||||
flags |= syscall.MAP_ANON
|
flags |= unix.MAP_ANON
|
||||||
}
|
}
|
||||||
|
|
||||||
b, err := syscall.Mmap(int(fd), off, len, prot, flags)
|
b, err := unix.Mmap(int(fd), off, len, prot, flags)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return b, nil
|
return b, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func flush(addr, len uintptr) error {
|
func (m MMap) flush() error {
|
||||||
_, _, errno := syscall.Syscall(_SYS_MSYNC, addr, len, _MS_SYNC)
|
return unix.Msync([]byte(m), unix.MS_SYNC)
|
||||||
if errno != 0 {
|
|
||||||
return syscall.Errno(errno)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func lock(addr, len uintptr) error {
|
func (m MMap) lock() error {
|
||||||
_, _, errno := syscall.Syscall(syscall.SYS_MLOCK, addr, len, 0)
|
return unix.Mlock([]byte(m))
|
||||||
if errno != 0 {
|
|
||||||
return syscall.Errno(errno)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func unlock(addr, len uintptr) error {
|
func (m MMap) unlock() error {
|
||||||
_, _, errno := syscall.Syscall(syscall.SYS_MUNLOCK, addr, len, 0)
|
return unix.Munlock([]byte(m))
|
||||||
if errno != 0 {
|
|
||||||
return syscall.Errno(errno)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func unmap(addr, len uintptr) error {
|
func (m MMap) unmap() error {
|
||||||
_, _, errno := syscall.Syscall(syscall.SYS_MUNMAP, addr, len, 0)
|
return unix.Munmap([]byte(m))
|
||||||
if errno != 0 {
|
|
||||||
return syscall.Errno(errno)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
64
vendor/github.com/edsrzf/mmap-go/mmap_windows.go
generated
vendored
64
vendor/github.com/edsrzf/mmap-go/mmap_windows.go
generated
vendored
|
|
@ -8,7 +8,8 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"os"
|
"os"
|
||||||
"sync"
|
"sync"
|
||||||
"syscall"
|
|
||||||
|
"golang.org/x/sys/windows"
|
||||||
)
|
)
|
||||||
|
|
||||||
// mmap on Windows is a two-step process.
|
// mmap on Windows is a two-step process.
|
||||||
|
|
@ -19,23 +20,29 @@ import (
|
||||||
// not a struct, so it's convenient to manipulate.
|
// not a struct, so it's convenient to manipulate.
|
||||||
|
|
||||||
// We keep this map so that we can get back the original handle from the memory address.
|
// We keep this map so that we can get back the original handle from the memory address.
|
||||||
|
|
||||||
|
type addrinfo struct {
|
||||||
|
file windows.Handle
|
||||||
|
mapview windows.Handle
|
||||||
|
}
|
||||||
|
|
||||||
var handleLock sync.Mutex
|
var handleLock sync.Mutex
|
||||||
var handleMap = map[uintptr]syscall.Handle{}
|
var handleMap = map[uintptr]*addrinfo{}
|
||||||
|
|
||||||
func mmap(len int, prot, flags, hfile uintptr, off int64) ([]byte, error) {
|
func mmap(len int, prot, flags, hfile uintptr, off int64) ([]byte, error) {
|
||||||
flProtect := uint32(syscall.PAGE_READONLY)
|
flProtect := uint32(windows.PAGE_READONLY)
|
||||||
dwDesiredAccess := uint32(syscall.FILE_MAP_READ)
|
dwDesiredAccess := uint32(windows.FILE_MAP_READ)
|
||||||
switch {
|
switch {
|
||||||
case prot© != 0:
|
case prot© != 0:
|
||||||
flProtect = syscall.PAGE_WRITECOPY
|
flProtect = windows.PAGE_WRITECOPY
|
||||||
dwDesiredAccess = syscall.FILE_MAP_COPY
|
dwDesiredAccess = windows.FILE_MAP_COPY
|
||||||
case prot&RDWR != 0:
|
case prot&RDWR != 0:
|
||||||
flProtect = syscall.PAGE_READWRITE
|
flProtect = windows.PAGE_READWRITE
|
||||||
dwDesiredAccess = syscall.FILE_MAP_WRITE
|
dwDesiredAccess = windows.FILE_MAP_WRITE
|
||||||
}
|
}
|
||||||
if prot&EXEC != 0 {
|
if prot&EXEC != 0 {
|
||||||
flProtect <<= 4
|
flProtect <<= 4
|
||||||
dwDesiredAccess |= syscall.FILE_MAP_EXECUTE
|
dwDesiredAccess |= windows.FILE_MAP_EXECUTE
|
||||||
}
|
}
|
||||||
|
|
||||||
// The maximum size is the area of the file, starting from 0,
|
// The maximum size is the area of the file, starting from 0,
|
||||||
|
|
@ -45,7 +52,7 @@ func mmap(len int, prot, flags, hfile uintptr, off int64) ([]byte, error) {
|
||||||
maxSizeHigh := uint32((off + int64(len)) >> 32)
|
maxSizeHigh := uint32((off + int64(len)) >> 32)
|
||||||
maxSizeLow := uint32((off + int64(len)) & 0xFFFFFFFF)
|
maxSizeLow := uint32((off + int64(len)) & 0xFFFFFFFF)
|
||||||
// TODO: Do we need to set some security attributes? It might help portability.
|
// TODO: Do we need to set some security attributes? It might help portability.
|
||||||
h, errno := syscall.CreateFileMapping(syscall.Handle(hfile), nil, flProtect, maxSizeHigh, maxSizeLow, nil)
|
h, errno := windows.CreateFileMapping(windows.Handle(hfile), nil, flProtect, maxSizeHigh, maxSizeLow, nil)
|
||||||
if h == 0 {
|
if h == 0 {
|
||||||
return nil, os.NewSyscallError("CreateFileMapping", errno)
|
return nil, os.NewSyscallError("CreateFileMapping", errno)
|
||||||
}
|
}
|
||||||
|
|
@ -54,12 +61,15 @@ func mmap(len int, prot, flags, hfile uintptr, off int64) ([]byte, error) {
|
||||||
// is the length the user requested.
|
// is the length the user requested.
|
||||||
fileOffsetHigh := uint32(off >> 32)
|
fileOffsetHigh := uint32(off >> 32)
|
||||||
fileOffsetLow := uint32(off & 0xFFFFFFFF)
|
fileOffsetLow := uint32(off & 0xFFFFFFFF)
|
||||||
addr, errno := syscall.MapViewOfFile(h, dwDesiredAccess, fileOffsetHigh, fileOffsetLow, uintptr(len))
|
addr, errno := windows.MapViewOfFile(h, dwDesiredAccess, fileOffsetHigh, fileOffsetLow, uintptr(len))
|
||||||
if addr == 0 {
|
if addr == 0 {
|
||||||
return nil, os.NewSyscallError("MapViewOfFile", errno)
|
return nil, os.NewSyscallError("MapViewOfFile", errno)
|
||||||
}
|
}
|
||||||
handleLock.Lock()
|
handleLock.Lock()
|
||||||
handleMap[addr] = h
|
handleMap[addr] = &addrinfo{
|
||||||
|
file: windows.Handle(hfile),
|
||||||
|
mapview: h,
|
||||||
|
}
|
||||||
handleLock.Unlock()
|
handleLock.Unlock()
|
||||||
|
|
||||||
m := MMap{}
|
m := MMap{}
|
||||||
|
|
@ -71,8 +81,9 @@ func mmap(len int, prot, flags, hfile uintptr, off int64) ([]byte, error) {
|
||||||
return m, nil
|
return m, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func flush(addr, len uintptr) error {
|
func (m MMap) flush() error {
|
||||||
errno := syscall.FlushViewOfFile(addr, len)
|
addr, len := m.addrLen()
|
||||||
|
errno := windows.FlushViewOfFile(addr, len)
|
||||||
if errno != nil {
|
if errno != nil {
|
||||||
return os.NewSyscallError("FlushViewOfFile", errno)
|
return os.NewSyscallError("FlushViewOfFile", errno)
|
||||||
}
|
}
|
||||||
|
|
@ -85,22 +96,29 @@ func flush(addr, len uintptr) error {
|
||||||
return errors.New("unknown base address")
|
return errors.New("unknown base address")
|
||||||
}
|
}
|
||||||
|
|
||||||
errno = syscall.FlushFileBuffers(handle)
|
errno = windows.FlushFileBuffers(handle.file)
|
||||||
return os.NewSyscallError("FlushFileBuffers", errno)
|
return os.NewSyscallError("FlushFileBuffers", errno)
|
||||||
}
|
}
|
||||||
|
|
||||||
func lock(addr, len uintptr) error {
|
func (m MMap) lock() error {
|
||||||
errno := syscall.VirtualLock(addr, len)
|
addr, len := m.addrLen()
|
||||||
|
errno := windows.VirtualLock(addr, len)
|
||||||
return os.NewSyscallError("VirtualLock", errno)
|
return os.NewSyscallError("VirtualLock", errno)
|
||||||
}
|
}
|
||||||
|
|
||||||
func unlock(addr, len uintptr) error {
|
func (m MMap) unlock() error {
|
||||||
errno := syscall.VirtualUnlock(addr, len)
|
addr, len := m.addrLen()
|
||||||
|
errno := windows.VirtualUnlock(addr, len)
|
||||||
return os.NewSyscallError("VirtualUnlock", errno)
|
return os.NewSyscallError("VirtualUnlock", errno)
|
||||||
}
|
}
|
||||||
|
|
||||||
func unmap(addr, len uintptr) error {
|
func (m MMap) unmap() error {
|
||||||
flush(addr, len)
|
err := m.flush()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
addr := m.header().Data
|
||||||
// Lock the UnmapViewOfFile along with the handleMap deletion.
|
// Lock the UnmapViewOfFile along with the handleMap deletion.
|
||||||
// As soon as we unmap the view, the OS is free to give the
|
// As soon as we unmap the view, the OS is free to give the
|
||||||
// same addr to another new map. We don't want another goroutine
|
// same addr to another new map. We don't want another goroutine
|
||||||
|
|
@ -108,7 +126,7 @@ func unmap(addr, len uintptr) error {
|
||||||
// we're trying to remove our old addr/handle pair.
|
// we're trying to remove our old addr/handle pair.
|
||||||
handleLock.Lock()
|
handleLock.Lock()
|
||||||
defer handleLock.Unlock()
|
defer handleLock.Unlock()
|
||||||
err := syscall.UnmapViewOfFile(addr)
|
err = windows.UnmapViewOfFile(addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -120,6 +138,6 @@ func unmap(addr, len uintptr) error {
|
||||||
}
|
}
|
||||||
delete(handleMap, addr)
|
delete(handleMap, addr)
|
||||||
|
|
||||||
e := syscall.CloseHandle(syscall.Handle(handle))
|
e := windows.CloseHandle(windows.Handle(handle.mapview))
|
||||||
return os.NewSyscallError("CloseHandle", e)
|
return os.NewSyscallError("CloseHandle", e)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
8
vendor/github.com/edsrzf/mmap-go/msync_netbsd.go
generated
vendored
8
vendor/github.com/edsrzf/mmap-go/msync_netbsd.go
generated
vendored
|
|
@ -1,8 +0,0 @@
|
||||||
// Copyright 2011 Evan Shaw. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package mmap
|
|
||||||
|
|
||||||
const _SYS_MSYNC = 277
|
|
||||||
const _MS_SYNC = 0x04
|
|
||||||
14
vendor/github.com/edsrzf/mmap-go/msync_unix.go
generated
vendored
14
vendor/github.com/edsrzf/mmap-go/msync_unix.go
generated
vendored
|
|
@ -1,14 +0,0 @@
|
||||||
// Copyright 2011 Evan Shaw. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build darwin dragonfly freebsd linux openbsd solaris
|
|
||||||
|
|
||||||
package mmap
|
|
||||||
|
|
||||||
import (
|
|
||||||
"syscall"
|
|
||||||
)
|
|
||||||
|
|
||||||
const _SYS_MSYNC = syscall.SYS_MSYNC
|
|
||||||
const _MS_SYNC = syscall.MS_SYNC
|
|
||||||
7
vendor/github.com/glycerine/go-unsnap-stream/LICENSE
generated
vendored
7
vendor/github.com/glycerine/go-unsnap-stream/LICENSE
generated
vendored
|
|
@ -1,3 +1,5 @@
|
||||||
|
The MIT license.
|
||||||
|
|
||||||
Copyright (c) 2014 the go-unsnap-stream authors.
|
Copyright (c) 2014 the go-unsnap-stream authors.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
|
@ -7,6 +9,9 @@ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
subject to the following conditions:
|
subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
|
@ -14,5 +19,3 @@ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
Permission is explicitly granted to relicense this material under new terms of
|
|
||||||
your choice when integrating this library with another library or project.
|
|
||||||
|
|
|
||||||
1
vendor/github.com/golang/protobuf/proto/decode.go
generated
vendored
1
vendor/github.com/golang/protobuf/proto/decode.go
generated
vendored
|
|
@ -186,7 +186,6 @@ func (p *Buffer) DecodeVarint() (x uint64, err error) {
|
||||||
if b&0x80 == 0 {
|
if b&0x80 == 0 {
|
||||||
goto done
|
goto done
|
||||||
}
|
}
|
||||||
// x -= 0x80 << 63 // Always zero.
|
|
||||||
|
|
||||||
return 0, errOverflow
|
return 0, errOverflow
|
||||||
|
|
||||||
|
|
|
||||||
63
vendor/github.com/golang/protobuf/proto/deprecated.go
generated
vendored
Normal file
63
vendor/github.com/golang/protobuf/proto/deprecated.go
generated
vendored
Normal file
|
|
@ -0,0 +1,63 @@
|
||||||
|
// Go support for Protocol Buffers - Google's data interchange format
|
||||||
|
//
|
||||||
|
// Copyright 2018 The Go Authors. All rights reserved.
|
||||||
|
// https://github.com/golang/protobuf
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
package proto
|
||||||
|
|
||||||
|
import "errors"
|
||||||
|
|
||||||
|
// Deprecated: do not use.
|
||||||
|
type Stats struct{ Emalloc, Dmalloc, Encode, Decode, Chit, Cmiss, Size uint64 }
|
||||||
|
|
||||||
|
// Deprecated: do not use.
|
||||||
|
func GetStats() Stats { return Stats{} }
|
||||||
|
|
||||||
|
// Deprecated: do not use.
|
||||||
|
func MarshalMessageSet(interface{}) ([]byte, error) {
|
||||||
|
return nil, errors.New("proto: not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: do not use.
|
||||||
|
func UnmarshalMessageSet([]byte, interface{}) error {
|
||||||
|
return errors.New("proto: not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: do not use.
|
||||||
|
func MarshalMessageSetJSON(interface{}) ([]byte, error) {
|
||||||
|
return nil, errors.New("proto: not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: do not use.
|
||||||
|
func UnmarshalMessageSetJSON([]byte, interface{}) error {
|
||||||
|
return errors.New("proto: not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: do not use.
|
||||||
|
func RegisterMessageSetType(Message, int32, string) {}
|
||||||
3
vendor/github.com/golang/protobuf/proto/equal.go
generated
vendored
3
vendor/github.com/golang/protobuf/proto/equal.go
generated
vendored
|
|
@ -246,7 +246,8 @@ func equalExtMap(base reflect.Type, em1, em2 map[int32]Extension) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
m1, m2 := e1.value, e2.value
|
m1 := extensionAsLegacyType(e1.value)
|
||||||
|
m2 := extensionAsLegacyType(e2.value)
|
||||||
|
|
||||||
if m1 == nil && m2 == nil {
|
if m1 == nil && m2 == nil {
|
||||||
// Both have only encoded form.
|
// Both have only encoded form.
|
||||||
|
|
|
||||||
78
vendor/github.com/golang/protobuf/proto/extensions.go
generated
vendored
78
vendor/github.com/golang/protobuf/proto/extensions.go
generated
vendored
|
|
@ -185,9 +185,25 @@ type Extension struct {
|
||||||
// extension will have only enc set. When such an extension is
|
// extension will have only enc set. When such an extension is
|
||||||
// accessed using GetExtension (or GetExtensions) desc and value
|
// accessed using GetExtension (or GetExtensions) desc and value
|
||||||
// will be set.
|
// will be set.
|
||||||
desc *ExtensionDesc
|
desc *ExtensionDesc
|
||||||
|
|
||||||
|
// value is a concrete value for the extension field. Let the type of
|
||||||
|
// desc.ExtensionType be the "API type" and the type of Extension.value
|
||||||
|
// be the "storage type". The API type and storage type are the same except:
|
||||||
|
// * For scalars (except []byte), the API type uses *T,
|
||||||
|
// while the storage type uses T.
|
||||||
|
// * For repeated fields, the API type uses []T, while the storage type
|
||||||
|
// uses *[]T.
|
||||||
|
//
|
||||||
|
// The reason for the divergence is so that the storage type more naturally
|
||||||
|
// matches what is expected of when retrieving the values through the
|
||||||
|
// protobuf reflection APIs.
|
||||||
|
//
|
||||||
|
// The value may only be populated if desc is also populated.
|
||||||
value interface{}
|
value interface{}
|
||||||
enc []byte
|
|
||||||
|
// enc is the raw bytes for the extension field.
|
||||||
|
enc []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetRawExtension is for testing only.
|
// SetRawExtension is for testing only.
|
||||||
|
|
@ -334,7 +350,7 @@ func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) {
|
||||||
// descriptors with the same field number.
|
// descriptors with the same field number.
|
||||||
return nil, errors.New("proto: descriptor conflict")
|
return nil, errors.New("proto: descriptor conflict")
|
||||||
}
|
}
|
||||||
return e.value, nil
|
return extensionAsLegacyType(e.value), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if extension.ExtensionType == nil {
|
if extension.ExtensionType == nil {
|
||||||
|
|
@ -349,11 +365,11 @@ func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) {
|
||||||
|
|
||||||
// Remember the decoded version and drop the encoded version.
|
// Remember the decoded version and drop the encoded version.
|
||||||
// That way it is safe to mutate what we return.
|
// That way it is safe to mutate what we return.
|
||||||
e.value = v
|
e.value = extensionAsStorageType(v)
|
||||||
e.desc = extension
|
e.desc = extension
|
||||||
e.enc = nil
|
e.enc = nil
|
||||||
emap[extension.Field] = e
|
emap[extension.Field] = e
|
||||||
return e.value, nil
|
return extensionAsLegacyType(e.value), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// defaultExtensionValue returns the default value for extension.
|
// defaultExtensionValue returns the default value for extension.
|
||||||
|
|
@ -488,7 +504,7 @@ func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error
|
||||||
}
|
}
|
||||||
typ := reflect.TypeOf(extension.ExtensionType)
|
typ := reflect.TypeOf(extension.ExtensionType)
|
||||||
if typ != reflect.TypeOf(value) {
|
if typ != reflect.TypeOf(value) {
|
||||||
return errors.New("proto: bad extension value type")
|
return fmt.Errorf("proto: bad extension value type. got: %T, want: %T", value, extension.ExtensionType)
|
||||||
}
|
}
|
||||||
// nil extension values need to be caught early, because the
|
// nil extension values need to be caught early, because the
|
||||||
// encoder can't distinguish an ErrNil due to a nil extension
|
// encoder can't distinguish an ErrNil due to a nil extension
|
||||||
|
|
@ -500,7 +516,7 @@ func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error
|
||||||
}
|
}
|
||||||
|
|
||||||
extmap := epb.extensionsWrite()
|
extmap := epb.extensionsWrite()
|
||||||
extmap[extension.Field] = Extension{desc: extension, value: value}
|
extmap[extension.Field] = Extension{desc: extension, value: extensionAsStorageType(value)}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -541,3 +557,51 @@ func RegisterExtension(desc *ExtensionDesc) {
|
||||||
func RegisteredExtensions(pb Message) map[int32]*ExtensionDesc {
|
func RegisteredExtensions(pb Message) map[int32]*ExtensionDesc {
|
||||||
return extensionMaps[reflect.TypeOf(pb).Elem()]
|
return extensionMaps[reflect.TypeOf(pb).Elem()]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// extensionAsLegacyType converts an value in the storage type as the API type.
|
||||||
|
// See Extension.value.
|
||||||
|
func extensionAsLegacyType(v interface{}) interface{} {
|
||||||
|
switch rv := reflect.ValueOf(v); rv.Kind() {
|
||||||
|
case reflect.Bool, reflect.Int32, reflect.Int64, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64, reflect.String:
|
||||||
|
// Represent primitive types as a pointer to the value.
|
||||||
|
rv2 := reflect.New(rv.Type())
|
||||||
|
rv2.Elem().Set(rv)
|
||||||
|
v = rv2.Interface()
|
||||||
|
case reflect.Ptr:
|
||||||
|
// Represent slice types as the value itself.
|
||||||
|
switch rv.Type().Elem().Kind() {
|
||||||
|
case reflect.Slice:
|
||||||
|
if rv.IsNil() {
|
||||||
|
v = reflect.Zero(rv.Type().Elem()).Interface()
|
||||||
|
} else {
|
||||||
|
v = rv.Elem().Interface()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
|
||||||
|
// extensionAsStorageType converts an value in the API type as the storage type.
|
||||||
|
// See Extension.value.
|
||||||
|
func extensionAsStorageType(v interface{}) interface{} {
|
||||||
|
switch rv := reflect.ValueOf(v); rv.Kind() {
|
||||||
|
case reflect.Ptr:
|
||||||
|
// Represent slice types as the value itself.
|
||||||
|
switch rv.Type().Elem().Kind() {
|
||||||
|
case reflect.Bool, reflect.Int32, reflect.Int64, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64, reflect.String:
|
||||||
|
if rv.IsNil() {
|
||||||
|
v = reflect.Zero(rv.Type().Elem()).Interface()
|
||||||
|
} else {
|
||||||
|
v = rv.Elem().Interface()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case reflect.Slice:
|
||||||
|
// Represent slice types as a pointer to the value.
|
||||||
|
if rv.Type().Elem().Kind() != reflect.Uint8 {
|
||||||
|
rv2 := reflect.New(rv.Type())
|
||||||
|
rv2.Elem().Set(rv)
|
||||||
|
v = rv2.Interface()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
|
|
||||||
38
vendor/github.com/golang/protobuf/proto/lib.go
generated
vendored
38
vendor/github.com/golang/protobuf/proto/lib.go
generated
vendored
|
|
@ -341,26 +341,6 @@ type Message interface {
|
||||||
ProtoMessage()
|
ProtoMessage()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stats records allocation details about the protocol buffer encoders
|
|
||||||
// and decoders. Useful for tuning the library itself.
|
|
||||||
type Stats struct {
|
|
||||||
Emalloc uint64 // mallocs in encode
|
|
||||||
Dmalloc uint64 // mallocs in decode
|
|
||||||
Encode uint64 // number of encodes
|
|
||||||
Decode uint64 // number of decodes
|
|
||||||
Chit uint64 // number of cache hits
|
|
||||||
Cmiss uint64 // number of cache misses
|
|
||||||
Size uint64 // number of sizes
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set to true to enable stats collection.
|
|
||||||
const collectStats = false
|
|
||||||
|
|
||||||
var stats Stats
|
|
||||||
|
|
||||||
// GetStats returns a copy of the global Stats structure.
|
|
||||||
func GetStats() Stats { return stats }
|
|
||||||
|
|
||||||
// A Buffer is a buffer manager for marshaling and unmarshaling
|
// A Buffer is a buffer manager for marshaling and unmarshaling
|
||||||
// protocol buffers. It may be reused between invocations to
|
// protocol buffers. It may be reused between invocations to
|
||||||
// reduce memory usage. It is not necessary to use a Buffer;
|
// reduce memory usage. It is not necessary to use a Buffer;
|
||||||
|
|
@ -960,13 +940,19 @@ func isProto3Zero(v reflect.Value) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// ProtoPackageIsVersion2 is referenced from generated protocol buffer files
|
const (
|
||||||
// to assert that that code is compatible with this version of the proto package.
|
// ProtoPackageIsVersion3 is referenced from generated protocol buffer files
|
||||||
const ProtoPackageIsVersion2 = true
|
// to assert that that code is compatible with this version of the proto package.
|
||||||
|
ProtoPackageIsVersion3 = true
|
||||||
|
|
||||||
// ProtoPackageIsVersion1 is referenced from generated protocol buffer files
|
// ProtoPackageIsVersion2 is referenced from generated protocol buffer files
|
||||||
// to assert that that code is compatible with this version of the proto package.
|
// to assert that that code is compatible with this version of the proto package.
|
||||||
const ProtoPackageIsVersion1 = true
|
ProtoPackageIsVersion2 = true
|
||||||
|
|
||||||
|
// ProtoPackageIsVersion1 is referenced from generated protocol buffer files
|
||||||
|
// to assert that that code is compatible with this version of the proto package.
|
||||||
|
ProtoPackageIsVersion1 = true
|
||||||
|
)
|
||||||
|
|
||||||
// InternalMessageInfo is a type used internally by generated .pb.go files.
|
// InternalMessageInfo is a type used internally by generated .pb.go files.
|
||||||
// This type is not intended to be used by non-generated code.
|
// This type is not intended to be used by non-generated code.
|
||||||
|
|
|
||||||
137
vendor/github.com/golang/protobuf/proto/message_set.go
generated
vendored
137
vendor/github.com/golang/protobuf/proto/message_set.go
generated
vendored
|
|
@ -36,13 +36,7 @@ package proto
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
|
||||||
"reflect"
|
|
||||||
"sort"
|
|
||||||
"sync"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// errNoMessageTypeID occurs when a protocol buffer does not have a message type ID.
|
// errNoMessageTypeID occurs when a protocol buffer does not have a message type ID.
|
||||||
|
|
@ -145,46 +139,9 @@ func skipVarint(buf []byte) []byte {
|
||||||
return buf[i+1:]
|
return buf[i+1:]
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalMessageSet encodes the extension map represented by m in the message set wire format.
|
// unmarshalMessageSet decodes the extension map encoded in buf in the message set wire format.
|
||||||
// It is called by generated Marshal methods on protocol buffer messages with the message_set_wire_format option.
|
|
||||||
func MarshalMessageSet(exts interface{}) ([]byte, error) {
|
|
||||||
return marshalMessageSet(exts, false)
|
|
||||||
}
|
|
||||||
|
|
||||||
// marshaMessageSet implements above function, with the opt to turn on / off deterministic during Marshal.
|
|
||||||
func marshalMessageSet(exts interface{}, deterministic bool) ([]byte, error) {
|
|
||||||
switch exts := exts.(type) {
|
|
||||||
case *XXX_InternalExtensions:
|
|
||||||
var u marshalInfo
|
|
||||||
siz := u.sizeMessageSet(exts)
|
|
||||||
b := make([]byte, 0, siz)
|
|
||||||
return u.appendMessageSet(b, exts, deterministic)
|
|
||||||
|
|
||||||
case map[int32]Extension:
|
|
||||||
// This is an old-style extension map.
|
|
||||||
// Wrap it in a new-style XXX_InternalExtensions.
|
|
||||||
ie := XXX_InternalExtensions{
|
|
||||||
p: &struct {
|
|
||||||
mu sync.Mutex
|
|
||||||
extensionMap map[int32]Extension
|
|
||||||
}{
|
|
||||||
extensionMap: exts,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
var u marshalInfo
|
|
||||||
siz := u.sizeMessageSet(&ie)
|
|
||||||
b := make([]byte, 0, siz)
|
|
||||||
return u.appendMessageSet(b, &ie, deterministic)
|
|
||||||
|
|
||||||
default:
|
|
||||||
return nil, errors.New("proto: not an extension map")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalMessageSet decodes the extension map encoded in buf in the message set wire format.
|
|
||||||
// It is called by Unmarshal methods on protocol buffer messages with the message_set_wire_format option.
|
// It is called by Unmarshal methods on protocol buffer messages with the message_set_wire_format option.
|
||||||
func UnmarshalMessageSet(buf []byte, exts interface{}) error {
|
func unmarshalMessageSet(buf []byte, exts interface{}) error {
|
||||||
var m map[int32]Extension
|
var m map[int32]Extension
|
||||||
switch exts := exts.(type) {
|
switch exts := exts.(type) {
|
||||||
case *XXX_InternalExtensions:
|
case *XXX_InternalExtensions:
|
||||||
|
|
@ -222,93 +179,3 @@ func UnmarshalMessageSet(buf []byte, exts interface{}) error {
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalMessageSetJSON encodes the extension map represented by m in JSON format.
|
|
||||||
// It is called by generated MarshalJSON methods on protocol buffer messages with the message_set_wire_format option.
|
|
||||||
func MarshalMessageSetJSON(exts interface{}) ([]byte, error) {
|
|
||||||
var m map[int32]Extension
|
|
||||||
switch exts := exts.(type) {
|
|
||||||
case *XXX_InternalExtensions:
|
|
||||||
var mu sync.Locker
|
|
||||||
m, mu = exts.extensionsRead()
|
|
||||||
if m != nil {
|
|
||||||
// Keep the extensions map locked until we're done marshaling to prevent
|
|
||||||
// races between marshaling and unmarshaling the lazily-{en,de}coded
|
|
||||||
// values.
|
|
||||||
mu.Lock()
|
|
||||||
defer mu.Unlock()
|
|
||||||
}
|
|
||||||
case map[int32]Extension:
|
|
||||||
m = exts
|
|
||||||
default:
|
|
||||||
return nil, errors.New("proto: not an extension map")
|
|
||||||
}
|
|
||||||
var b bytes.Buffer
|
|
||||||
b.WriteByte('{')
|
|
||||||
|
|
||||||
// Process the map in key order for deterministic output.
|
|
||||||
ids := make([]int32, 0, len(m))
|
|
||||||
for id := range m {
|
|
||||||
ids = append(ids, id)
|
|
||||||
}
|
|
||||||
sort.Sort(int32Slice(ids)) // int32Slice defined in text.go
|
|
||||||
|
|
||||||
for i, id := range ids {
|
|
||||||
ext := m[id]
|
|
||||||
msd, ok := messageSetMap[id]
|
|
||||||
if !ok {
|
|
||||||
// Unknown type; we can't render it, so skip it.
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if i > 0 && b.Len() > 1 {
|
|
||||||
b.WriteByte(',')
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Fprintf(&b, `"[%s]":`, msd.name)
|
|
||||||
|
|
||||||
x := ext.value
|
|
||||||
if x == nil {
|
|
||||||
x = reflect.New(msd.t.Elem()).Interface()
|
|
||||||
if err := Unmarshal(ext.enc, x.(Message)); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
d, err := json.Marshal(x)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
b.Write(d)
|
|
||||||
}
|
|
||||||
b.WriteByte('}')
|
|
||||||
return b.Bytes(), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalMessageSetJSON decodes the extension map encoded in buf in JSON format.
|
|
||||||
// It is called by generated UnmarshalJSON methods on protocol buffer messages with the message_set_wire_format option.
|
|
||||||
func UnmarshalMessageSetJSON(buf []byte, exts interface{}) error {
|
|
||||||
// Common-case fast path.
|
|
||||||
if len(buf) == 0 || bytes.Equal(buf, []byte("{}")) {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// This is fairly tricky, and it's not clear that it is needed.
|
|
||||||
return errors.New("TODO: UnmarshalMessageSetJSON not yet implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
// A global registry of types that can be used in a MessageSet.
|
|
||||||
|
|
||||||
var messageSetMap = make(map[int32]messageSetDesc)
|
|
||||||
|
|
||||||
type messageSetDesc struct {
|
|
||||||
t reflect.Type // pointer to struct
|
|
||||||
name string
|
|
||||||
}
|
|
||||||
|
|
||||||
// RegisterMessageSetType is called from the generated code.
|
|
||||||
func RegisterMessageSetType(m Message, fieldNum int32, name string) {
|
|
||||||
messageSetMap[fieldNum] = messageSetDesc{
|
|
||||||
t: reflect.TypeOf(m),
|
|
||||||
name: name,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
5
vendor/github.com/golang/protobuf/proto/pointer_reflect.go
generated
vendored
5
vendor/github.com/golang/protobuf/proto/pointer_reflect.go
generated
vendored
|
|
@ -79,10 +79,13 @@ func toPointer(i *Message) pointer {
|
||||||
|
|
||||||
// toAddrPointer converts an interface to a pointer that points to
|
// toAddrPointer converts an interface to a pointer that points to
|
||||||
// the interface data.
|
// the interface data.
|
||||||
func toAddrPointer(i *interface{}, isptr bool) pointer {
|
func toAddrPointer(i *interface{}, isptr, deref bool) pointer {
|
||||||
v := reflect.ValueOf(*i)
|
v := reflect.ValueOf(*i)
|
||||||
u := reflect.New(v.Type())
|
u := reflect.New(v.Type())
|
||||||
u.Elem().Set(v)
|
u.Elem().Set(v)
|
||||||
|
if deref {
|
||||||
|
u = u.Elem()
|
||||||
|
}
|
||||||
return pointer{v: u}
|
return pointer{v: u}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
15
vendor/github.com/golang/protobuf/proto/pointer_unsafe.go
generated
vendored
15
vendor/github.com/golang/protobuf/proto/pointer_unsafe.go
generated
vendored
|
|
@ -85,16 +85,21 @@ func toPointer(i *Message) pointer {
|
||||||
|
|
||||||
// toAddrPointer converts an interface to a pointer that points to
|
// toAddrPointer converts an interface to a pointer that points to
|
||||||
// the interface data.
|
// the interface data.
|
||||||
func toAddrPointer(i *interface{}, isptr bool) pointer {
|
func toAddrPointer(i *interface{}, isptr, deref bool) (p pointer) {
|
||||||
// Super-tricky - read or get the address of data word of interface value.
|
// Super-tricky - read or get the address of data word of interface value.
|
||||||
if isptr {
|
if isptr {
|
||||||
// The interface is of pointer type, thus it is a direct interface.
|
// The interface is of pointer type, thus it is a direct interface.
|
||||||
// The data word is the pointer data itself. We take its address.
|
// The data word is the pointer data itself. We take its address.
|
||||||
return pointer{p: unsafe.Pointer(uintptr(unsafe.Pointer(i)) + ptrSize)}
|
p = pointer{p: unsafe.Pointer(uintptr(unsafe.Pointer(i)) + ptrSize)}
|
||||||
|
} else {
|
||||||
|
// The interface is not of pointer type. The data word is the pointer
|
||||||
|
// to the data.
|
||||||
|
p = pointer{p: (*[2]unsafe.Pointer)(unsafe.Pointer(i))[1]}
|
||||||
}
|
}
|
||||||
// The interface is not of pointer type. The data word is the pointer
|
if deref {
|
||||||
// to the data.
|
p.p = *(*unsafe.Pointer)(p.p)
|
||||||
return pointer{p: (*[2]unsafe.Pointer)(unsafe.Pointer(i))[1]}
|
}
|
||||||
|
return p
|
||||||
}
|
}
|
||||||
|
|
||||||
// valToPointer converts v to a pointer. v must be of pointer type.
|
// valToPointer converts v to a pointer. v must be of pointer type.
|
||||||
|
|
|
||||||
31
vendor/github.com/golang/protobuf/proto/properties.go
generated
vendored
31
vendor/github.com/golang/protobuf/proto/properties.go
generated
vendored
|
|
@ -334,9 +334,6 @@ func GetProperties(t reflect.Type) *StructProperties {
|
||||||
sprop, ok := propertiesMap[t]
|
sprop, ok := propertiesMap[t]
|
||||||
propertiesMu.RUnlock()
|
propertiesMu.RUnlock()
|
||||||
if ok {
|
if ok {
|
||||||
if collectStats {
|
|
||||||
stats.Chit++
|
|
||||||
}
|
|
||||||
return sprop
|
return sprop
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -346,17 +343,20 @@ func GetProperties(t reflect.Type) *StructProperties {
|
||||||
return sprop
|
return sprop
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type (
|
||||||
|
oneofFuncsIface interface {
|
||||||
|
XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{})
|
||||||
|
}
|
||||||
|
oneofWrappersIface interface {
|
||||||
|
XXX_OneofWrappers() []interface{}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
// getPropertiesLocked requires that propertiesMu is held.
|
// getPropertiesLocked requires that propertiesMu is held.
|
||||||
func getPropertiesLocked(t reflect.Type) *StructProperties {
|
func getPropertiesLocked(t reflect.Type) *StructProperties {
|
||||||
if prop, ok := propertiesMap[t]; ok {
|
if prop, ok := propertiesMap[t]; ok {
|
||||||
if collectStats {
|
|
||||||
stats.Chit++
|
|
||||||
}
|
|
||||||
return prop
|
return prop
|
||||||
}
|
}
|
||||||
if collectStats {
|
|
||||||
stats.Cmiss++
|
|
||||||
}
|
|
||||||
|
|
||||||
prop := new(StructProperties)
|
prop := new(StructProperties)
|
||||||
// in case of recursive protos, fill this in now.
|
// in case of recursive protos, fill this in now.
|
||||||
|
|
@ -391,13 +391,14 @@ func getPropertiesLocked(t reflect.Type) *StructProperties {
|
||||||
// Re-order prop.order.
|
// Re-order prop.order.
|
||||||
sort.Sort(prop)
|
sort.Sort(prop)
|
||||||
|
|
||||||
type oneofMessage interface {
|
var oots []interface{}
|
||||||
XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{})
|
switch m := reflect.Zero(reflect.PtrTo(t)).Interface().(type) {
|
||||||
|
case oneofFuncsIface:
|
||||||
|
_, _, _, oots = m.XXX_OneofFuncs()
|
||||||
|
case oneofWrappersIface:
|
||||||
|
oots = m.XXX_OneofWrappers()
|
||||||
}
|
}
|
||||||
if om, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(oneofMessage); ok {
|
if len(oots) > 0 {
|
||||||
var oots []interface{}
|
|
||||||
_, _, _, oots = om.XXX_OneofFuncs()
|
|
||||||
|
|
||||||
// Interpret oneof metadata.
|
// Interpret oneof metadata.
|
||||||
prop.OneofTypes = make(map[string]*OneofProperties)
|
prop.OneofTypes = make(map[string]*OneofProperties)
|
||||||
for _, oot := range oots {
|
for _, oot := range oots {
|
||||||
|
|
|
||||||
45
vendor/github.com/golang/protobuf/proto/table_marshal.go
generated
vendored
45
vendor/github.com/golang/protobuf/proto/table_marshal.go
generated
vendored
|
|
@ -87,6 +87,7 @@ type marshalElemInfo struct {
|
||||||
sizer sizer
|
sizer sizer
|
||||||
marshaler marshaler
|
marshaler marshaler
|
||||||
isptr bool // elem is pointer typed, thus interface of this type is a direct interface (extension only)
|
isptr bool // elem is pointer typed, thus interface of this type is a direct interface (extension only)
|
||||||
|
deref bool // dereference the pointer before operating on it; implies isptr
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|
@ -320,8 +321,11 @@ func (u *marshalInfo) computeMarshalInfo() {
|
||||||
|
|
||||||
// get oneof implementers
|
// get oneof implementers
|
||||||
var oneofImplementers []interface{}
|
var oneofImplementers []interface{}
|
||||||
if m, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(oneofMessage); ok {
|
switch m := reflect.Zero(reflect.PtrTo(t)).Interface().(type) {
|
||||||
|
case oneofFuncsIface:
|
||||||
_, _, _, oneofImplementers = m.XXX_OneofFuncs()
|
_, _, _, oneofImplementers = m.XXX_OneofFuncs()
|
||||||
|
case oneofWrappersIface:
|
||||||
|
oneofImplementers = m.XXX_OneofWrappers()
|
||||||
}
|
}
|
||||||
|
|
||||||
n := t.NumField()
|
n := t.NumField()
|
||||||
|
|
@ -407,13 +411,22 @@ func (u *marshalInfo) getExtElemInfo(desc *ExtensionDesc) *marshalElemInfo {
|
||||||
panic("tag is not an integer")
|
panic("tag is not an integer")
|
||||||
}
|
}
|
||||||
wt := wiretype(tags[0])
|
wt := wiretype(tags[0])
|
||||||
|
if t.Kind() == reflect.Ptr && t.Elem().Kind() != reflect.Struct {
|
||||||
|
t = t.Elem()
|
||||||
|
}
|
||||||
sizer, marshaler := typeMarshaler(t, tags, false, false)
|
sizer, marshaler := typeMarshaler(t, tags, false, false)
|
||||||
|
var deref bool
|
||||||
|
if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 {
|
||||||
|
t = reflect.PtrTo(t)
|
||||||
|
deref = true
|
||||||
|
}
|
||||||
e = &marshalElemInfo{
|
e = &marshalElemInfo{
|
||||||
wiretag: uint64(tag)<<3 | wt,
|
wiretag: uint64(tag)<<3 | wt,
|
||||||
tagsize: SizeVarint(uint64(tag) << 3),
|
tagsize: SizeVarint(uint64(tag) << 3),
|
||||||
sizer: sizer,
|
sizer: sizer,
|
||||||
marshaler: marshaler,
|
marshaler: marshaler,
|
||||||
isptr: t.Kind() == reflect.Ptr,
|
isptr: t.Kind() == reflect.Ptr,
|
||||||
|
deref: deref,
|
||||||
}
|
}
|
||||||
|
|
||||||
// update cache
|
// update cache
|
||||||
|
|
@ -448,7 +461,7 @@ func (fi *marshalFieldInfo) computeMarshalFieldInfo(f *reflect.StructField) {
|
||||||
|
|
||||||
func (fi *marshalFieldInfo) computeOneofFieldInfo(f *reflect.StructField, oneofImplementers []interface{}) {
|
func (fi *marshalFieldInfo) computeOneofFieldInfo(f *reflect.StructField, oneofImplementers []interface{}) {
|
||||||
fi.field = toField(f)
|
fi.field = toField(f)
|
||||||
fi.wiretag = 1<<31 - 1 // Use a large tag number, make oneofs sorted at the end. This tag will not appear on the wire.
|
fi.wiretag = math.MaxInt32 // Use a large tag number, make oneofs sorted at the end. This tag will not appear on the wire.
|
||||||
fi.isPointer = true
|
fi.isPointer = true
|
||||||
fi.sizer, fi.marshaler = makeOneOfMarshaler(fi, f)
|
fi.sizer, fi.marshaler = makeOneOfMarshaler(fi, f)
|
||||||
fi.oneofElems = make(map[reflect.Type]*marshalElemInfo)
|
fi.oneofElems = make(map[reflect.Type]*marshalElemInfo)
|
||||||
|
|
@ -476,10 +489,6 @@ func (fi *marshalFieldInfo) computeOneofFieldInfo(f *reflect.StructField, oneofI
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type oneofMessage interface {
|
|
||||||
XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{})
|
|
||||||
}
|
|
||||||
|
|
||||||
// wiretype returns the wire encoding of the type.
|
// wiretype returns the wire encoding of the type.
|
||||||
func wiretype(encoding string) uint64 {
|
func wiretype(encoding string) uint64 {
|
||||||
switch encoding {
|
switch encoding {
|
||||||
|
|
@ -2310,8 +2319,8 @@ func makeMapMarshaler(f *reflect.StructField) (sizer, marshaler) {
|
||||||
for _, k := range m.MapKeys() {
|
for _, k := range m.MapKeys() {
|
||||||
ki := k.Interface()
|
ki := k.Interface()
|
||||||
vi := m.MapIndex(k).Interface()
|
vi := m.MapIndex(k).Interface()
|
||||||
kaddr := toAddrPointer(&ki, false) // pointer to key
|
kaddr := toAddrPointer(&ki, false, false) // pointer to key
|
||||||
vaddr := toAddrPointer(&vi, valIsPtr) // pointer to value
|
vaddr := toAddrPointer(&vi, valIsPtr, false) // pointer to value
|
||||||
siz := keySizer(kaddr, 1) + valSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1)
|
siz := keySizer(kaddr, 1) + valSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1)
|
||||||
n += siz + SizeVarint(uint64(siz)) + tagsize
|
n += siz + SizeVarint(uint64(siz)) + tagsize
|
||||||
}
|
}
|
||||||
|
|
@ -2329,8 +2338,8 @@ func makeMapMarshaler(f *reflect.StructField) (sizer, marshaler) {
|
||||||
for _, k := range keys {
|
for _, k := range keys {
|
||||||
ki := k.Interface()
|
ki := k.Interface()
|
||||||
vi := m.MapIndex(k).Interface()
|
vi := m.MapIndex(k).Interface()
|
||||||
kaddr := toAddrPointer(&ki, false) // pointer to key
|
kaddr := toAddrPointer(&ki, false, false) // pointer to key
|
||||||
vaddr := toAddrPointer(&vi, valIsPtr) // pointer to value
|
vaddr := toAddrPointer(&vi, valIsPtr, false) // pointer to value
|
||||||
b = appendVarint(b, tag)
|
b = appendVarint(b, tag)
|
||||||
siz := keySizer(kaddr, 1) + valCachedSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1)
|
siz := keySizer(kaddr, 1) + valCachedSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1)
|
||||||
b = appendVarint(b, uint64(siz))
|
b = appendVarint(b, uint64(siz))
|
||||||
|
|
@ -2399,7 +2408,7 @@ func (u *marshalInfo) sizeExtensions(ext *XXX_InternalExtensions) int {
|
||||||
// the last time this function was called.
|
// the last time this function was called.
|
||||||
ei := u.getExtElemInfo(e.desc)
|
ei := u.getExtElemInfo(e.desc)
|
||||||
v := e.value
|
v := e.value
|
||||||
p := toAddrPointer(&v, ei.isptr)
|
p := toAddrPointer(&v, ei.isptr, ei.deref)
|
||||||
n += ei.sizer(p, ei.tagsize)
|
n += ei.sizer(p, ei.tagsize)
|
||||||
}
|
}
|
||||||
mu.Unlock()
|
mu.Unlock()
|
||||||
|
|
@ -2434,7 +2443,7 @@ func (u *marshalInfo) appendExtensions(b []byte, ext *XXX_InternalExtensions, de
|
||||||
|
|
||||||
ei := u.getExtElemInfo(e.desc)
|
ei := u.getExtElemInfo(e.desc)
|
||||||
v := e.value
|
v := e.value
|
||||||
p := toAddrPointer(&v, ei.isptr)
|
p := toAddrPointer(&v, ei.isptr, ei.deref)
|
||||||
b, err = ei.marshaler(b, p, ei.wiretag, deterministic)
|
b, err = ei.marshaler(b, p, ei.wiretag, deterministic)
|
||||||
if !nerr.Merge(err) {
|
if !nerr.Merge(err) {
|
||||||
return b, err
|
return b, err
|
||||||
|
|
@ -2465,7 +2474,7 @@ func (u *marshalInfo) appendExtensions(b []byte, ext *XXX_InternalExtensions, de
|
||||||
|
|
||||||
ei := u.getExtElemInfo(e.desc)
|
ei := u.getExtElemInfo(e.desc)
|
||||||
v := e.value
|
v := e.value
|
||||||
p := toAddrPointer(&v, ei.isptr)
|
p := toAddrPointer(&v, ei.isptr, ei.deref)
|
||||||
b, err = ei.marshaler(b, p, ei.wiretag, deterministic)
|
b, err = ei.marshaler(b, p, ei.wiretag, deterministic)
|
||||||
if !nerr.Merge(err) {
|
if !nerr.Merge(err) {
|
||||||
return b, err
|
return b, err
|
||||||
|
|
@ -2510,7 +2519,7 @@ func (u *marshalInfo) sizeMessageSet(ext *XXX_InternalExtensions) int {
|
||||||
|
|
||||||
ei := u.getExtElemInfo(e.desc)
|
ei := u.getExtElemInfo(e.desc)
|
||||||
v := e.value
|
v := e.value
|
||||||
p := toAddrPointer(&v, ei.isptr)
|
p := toAddrPointer(&v, ei.isptr, ei.deref)
|
||||||
n += ei.sizer(p, 1) // message, tag = 3 (size=1)
|
n += ei.sizer(p, 1) // message, tag = 3 (size=1)
|
||||||
}
|
}
|
||||||
mu.Unlock()
|
mu.Unlock()
|
||||||
|
|
@ -2553,7 +2562,7 @@ func (u *marshalInfo) appendMessageSet(b []byte, ext *XXX_InternalExtensions, de
|
||||||
|
|
||||||
ei := u.getExtElemInfo(e.desc)
|
ei := u.getExtElemInfo(e.desc)
|
||||||
v := e.value
|
v := e.value
|
||||||
p := toAddrPointer(&v, ei.isptr)
|
p := toAddrPointer(&v, ei.isptr, ei.deref)
|
||||||
b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic)
|
b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic)
|
||||||
if !nerr.Merge(err) {
|
if !nerr.Merge(err) {
|
||||||
return b, err
|
return b, err
|
||||||
|
|
@ -2591,7 +2600,7 @@ func (u *marshalInfo) appendMessageSet(b []byte, ext *XXX_InternalExtensions, de
|
||||||
|
|
||||||
ei := u.getExtElemInfo(e.desc)
|
ei := u.getExtElemInfo(e.desc)
|
||||||
v := e.value
|
v := e.value
|
||||||
p := toAddrPointer(&v, ei.isptr)
|
p := toAddrPointer(&v, ei.isptr, ei.deref)
|
||||||
b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic)
|
b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic)
|
||||||
b = append(b, 1<<3|WireEndGroup)
|
b = append(b, 1<<3|WireEndGroup)
|
||||||
if !nerr.Merge(err) {
|
if !nerr.Merge(err) {
|
||||||
|
|
@ -2621,7 +2630,7 @@ func (u *marshalInfo) sizeV1Extensions(m map[int32]Extension) int {
|
||||||
|
|
||||||
ei := u.getExtElemInfo(e.desc)
|
ei := u.getExtElemInfo(e.desc)
|
||||||
v := e.value
|
v := e.value
|
||||||
p := toAddrPointer(&v, ei.isptr)
|
p := toAddrPointer(&v, ei.isptr, ei.deref)
|
||||||
n += ei.sizer(p, ei.tagsize)
|
n += ei.sizer(p, ei.tagsize)
|
||||||
}
|
}
|
||||||
return n
|
return n
|
||||||
|
|
@ -2656,7 +2665,7 @@ func (u *marshalInfo) appendV1Extensions(b []byte, m map[int32]Extension, determ
|
||||||
|
|
||||||
ei := u.getExtElemInfo(e.desc)
|
ei := u.getExtElemInfo(e.desc)
|
||||||
v := e.value
|
v := e.value
|
||||||
p := toAddrPointer(&v, ei.isptr)
|
p := toAddrPointer(&v, ei.isptr, ei.deref)
|
||||||
b, err = ei.marshaler(b, p, ei.wiretag, deterministic)
|
b, err = ei.marshaler(b, p, ei.wiretag, deterministic)
|
||||||
if !nerr.Merge(err) {
|
if !nerr.Merge(err) {
|
||||||
return b, err
|
return b, err
|
||||||
|
|
|
||||||
74
vendor/github.com/golang/protobuf/proto/table_unmarshal.go
generated
vendored
74
vendor/github.com/golang/protobuf/proto/table_unmarshal.go
generated
vendored
|
|
@ -136,7 +136,7 @@ func (u *unmarshalInfo) unmarshal(m pointer, b []byte) error {
|
||||||
u.computeUnmarshalInfo()
|
u.computeUnmarshalInfo()
|
||||||
}
|
}
|
||||||
if u.isMessageSet {
|
if u.isMessageSet {
|
||||||
return UnmarshalMessageSet(b, m.offset(u.extensions).toExtensions())
|
return unmarshalMessageSet(b, m.offset(u.extensions).toExtensions())
|
||||||
}
|
}
|
||||||
var reqMask uint64 // bitmask of required fields we've seen.
|
var reqMask uint64 // bitmask of required fields we've seen.
|
||||||
var errLater error
|
var errLater error
|
||||||
|
|
@ -362,46 +362,48 @@ func (u *unmarshalInfo) computeUnmarshalInfo() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find any types associated with oneof fields.
|
// Find any types associated with oneof fields.
|
||||||
// TODO: XXX_OneofFuncs returns more info than we need. Get rid of some of it?
|
var oneofImplementers []interface{}
|
||||||
fn := reflect.Zero(reflect.PtrTo(t)).MethodByName("XXX_OneofFuncs")
|
switch m := reflect.Zero(reflect.PtrTo(t)).Interface().(type) {
|
||||||
if fn.IsValid() {
|
case oneofFuncsIface:
|
||||||
res := fn.Call(nil)[3] // last return value from XXX_OneofFuncs: []interface{}
|
_, _, _, oneofImplementers = m.XXX_OneofFuncs()
|
||||||
for i := res.Len() - 1; i >= 0; i-- {
|
case oneofWrappersIface:
|
||||||
v := res.Index(i) // interface{}
|
oneofImplementers = m.XXX_OneofWrappers()
|
||||||
tptr := reflect.ValueOf(v.Interface()).Type() // *Msg_X
|
}
|
||||||
typ := tptr.Elem() // Msg_X
|
for _, v := range oneofImplementers {
|
||||||
|
tptr := reflect.TypeOf(v) // *Msg_X
|
||||||
|
typ := tptr.Elem() // Msg_X
|
||||||
|
|
||||||
f := typ.Field(0) // oneof implementers have one field
|
f := typ.Field(0) // oneof implementers have one field
|
||||||
baseUnmarshal := fieldUnmarshaler(&f)
|
baseUnmarshal := fieldUnmarshaler(&f)
|
||||||
tags := strings.Split(f.Tag.Get("protobuf"), ",")
|
tags := strings.Split(f.Tag.Get("protobuf"), ",")
|
||||||
fieldNum, err := strconv.Atoi(tags[1])
|
fieldNum, err := strconv.Atoi(tags[1])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic("protobuf tag field not an integer: " + tags[1])
|
panic("protobuf tag field not an integer: " + tags[1])
|
||||||
}
|
}
|
||||||
var name string
|
var name string
|
||||||
for _, tag := range tags {
|
for _, tag := range tags {
|
||||||
if strings.HasPrefix(tag, "name=") {
|
if strings.HasPrefix(tag, "name=") {
|
||||||
name = strings.TrimPrefix(tag, "name=")
|
name = strings.TrimPrefix(tag, "name=")
|
||||||
break
|
break
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find the oneof field that this struct implements.
|
|
||||||
// Might take O(n^2) to process all of the oneofs, but who cares.
|
|
||||||
for _, of := range oneofFields {
|
|
||||||
if tptr.Implements(of.ityp) {
|
|
||||||
// We have found the corresponding interface for this struct.
|
|
||||||
// That lets us know where this struct should be stored
|
|
||||||
// when we encounter it during unmarshaling.
|
|
||||||
unmarshal := makeUnmarshalOneof(typ, of.ityp, baseUnmarshal)
|
|
||||||
u.setTag(fieldNum, of.field, unmarshal, 0, name)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Find the oneof field that this struct implements.
|
||||||
|
// Might take O(n^2) to process all of the oneofs, but who cares.
|
||||||
|
for _, of := range oneofFields {
|
||||||
|
if tptr.Implements(of.ityp) {
|
||||||
|
// We have found the corresponding interface for this struct.
|
||||||
|
// That lets us know where this struct should be stored
|
||||||
|
// when we encounter it during unmarshaling.
|
||||||
|
unmarshal := makeUnmarshalOneof(typ, of.ityp, baseUnmarshal)
|
||||||
|
u.setTag(fieldNum, of.field, unmarshal, 0, name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get extension ranges, if any.
|
// Get extension ranges, if any.
|
||||||
fn = reflect.Zero(reflect.PtrTo(t)).MethodByName("ExtensionRangeArray")
|
fn := reflect.Zero(reflect.PtrTo(t)).MethodByName("ExtensionRangeArray")
|
||||||
if fn.IsValid() {
|
if fn.IsValid() {
|
||||||
if !u.extensions.IsValid() && !u.oldExtensions.IsValid() {
|
if !u.extensions.IsValid() && !u.oldExtensions.IsValid() {
|
||||||
panic("a message with extensions, but no extensions field in " + t.Name())
|
panic("a message with extensions, but no extensions field in " + t.Name())
|
||||||
|
|
@ -1948,7 +1950,7 @@ func encodeVarint(b []byte, x uint64) []byte {
|
||||||
// If there is an error, it returns 0,0.
|
// If there is an error, it returns 0,0.
|
||||||
func decodeVarint(b []byte) (uint64, int) {
|
func decodeVarint(b []byte) (uint64, int) {
|
||||||
var x, y uint64
|
var x, y uint64
|
||||||
if len(b) <= 0 {
|
if len(b) == 0 {
|
||||||
goto bad
|
goto bad
|
||||||
}
|
}
|
||||||
x = uint64(b[0])
|
x = uint64(b[0])
|
||||||
|
|
|
||||||
1
vendor/github.com/golang/snappy/go.mod
generated
vendored
Normal file
1
vendor/github.com/golang/snappy/go.mod
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
module github.com/golang/snappy
|
||||||
19
vendor/github.com/gorilla/context/.travis.yml
generated
vendored
19
vendor/github.com/gorilla/context/.travis.yml
generated
vendored
|
|
@ -1,19 +0,0 @@
|
||||||
language: go
|
|
||||||
sudo: false
|
|
||||||
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- go: 1.3
|
|
||||||
- go: 1.4
|
|
||||||
- go: 1.5
|
|
||||||
- go: 1.6
|
|
||||||
- go: tip
|
|
||||||
|
|
||||||
install:
|
|
||||||
- go get golang.org/x/tools/cmd/vet
|
|
||||||
|
|
||||||
script:
|
|
||||||
- go get -t -v ./...
|
|
||||||
- diff -u <(echo -n) <(gofmt -d .)
|
|
||||||
- go tool vet .
|
|
||||||
- go test -v -race ./...
|
|
||||||
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.
|
|
||||||
7
vendor/github.com/gorilla/context/README.md
generated
vendored
7
vendor/github.com/gorilla/context/README.md
generated
vendored
|
|
@ -1,7 +0,0 @@
|
||||||
context
|
|
||||||
=======
|
|
||||||
[](https://travis-ci.org/gorilla/context)
|
|
||||||
|
|
||||||
gorilla/context is a general purpose registry for global request variables.
|
|
||||||
|
|
||||||
Read the full documentation here: http://www.gorillatoolkit.org/pkg/context
|
|
||||||
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)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
82
vendor/github.com/gorilla/context/doc.go
generated
vendored
82
vendor/github.com/gorilla/context/doc.go
generated
vendored
|
|
@ -1,82 +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.
|
|
||||||
|
|
||||||
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
|
|
||||||
9
vendor/github.com/gorilla/mux/.travis.yml
generated
vendored
9
vendor/github.com/gorilla/mux/.travis.yml
generated
vendored
|
|
@ -1,14 +1,15 @@
|
||||||
language: go
|
language: go
|
||||||
sudo: false
|
|
||||||
|
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- go: 1.5.x
|
|
||||||
- go: 1.6.x
|
|
||||||
- go: 1.7.x
|
- go: 1.7.x
|
||||||
- go: 1.8.x
|
- go: 1.8.x
|
||||||
- go: 1.9.x
|
- go: 1.9.x
|
||||||
- go: 1.10.x
|
- go: 1.10.x
|
||||||
|
- go: 1.11.x
|
||||||
|
- go: 1.x
|
||||||
|
env: LATEST=true
|
||||||
- go: tip
|
- go: tip
|
||||||
allow_failures:
|
allow_failures:
|
||||||
- go: tip
|
- go: tip
|
||||||
|
|
@ -19,5 +20,5 @@ install:
|
||||||
script:
|
script:
|
||||||
- go get -t -v ./...
|
- go get -t -v ./...
|
||||||
- diff -u <(echo -n) <(gofmt -d .)
|
- diff -u <(echo -n) <(gofmt -d .)
|
||||||
- go tool vet .
|
- if [[ "$LATEST" = true ]]; then go vet .; fi
|
||||||
- go test -v -race ./...
|
- go test -v -race ./...
|
||||||
|
|
|
||||||
8
vendor/github.com/gorilla/mux/AUTHORS
generated
vendored
Normal file
8
vendor/github.com/gorilla/mux/AUTHORS
generated
vendored
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
# This is the official list of gorilla/mux authors for copyright purposes.
|
||||||
|
#
|
||||||
|
# Please keep the list sorted.
|
||||||
|
|
||||||
|
Google LLC (https://opensource.google.com/)
|
||||||
|
Kamil Kisielk <kamil@kamilkisiel.net>
|
||||||
|
Matt Silverlock <matt@eatsleeprepeat.net>
|
||||||
|
Rodrigo Moraes (https://github.com/moraes)
|
||||||
2
vendor/github.com/gorilla/mux/LICENSE
generated
vendored
2
vendor/github.com/gorilla/mux/LICENSE
generated
vendored
|
|
@ -1,4 +1,4 @@
|
||||||
Copyright (c) 2012 Rodrigo Moraes. All rights reserved.
|
Copyright (c) 2012-2018 The Gorilla Authors. All rights reserved.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
Redistribution and use in source and binary forms, with or without
|
||||||
modification, are permitted provided that the following conditions are
|
modification, are permitted provided that the following conditions are
|
||||||
|
|
|
||||||
16
vendor/github.com/gorilla/mux/README.md
generated
vendored
16
vendor/github.com/gorilla/mux/README.md
generated
vendored
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
http://www.gorillatoolkit.org/pkg/mux
|
https://www.gorillatoolkit.org/pkg/mux
|
||||||
|
|
||||||
Package `gorilla/mux` implements a request router and dispatcher for matching incoming requests to
|
Package `gorilla/mux` implements a request router and dispatcher for matching incoming requests to
|
||||||
their respective handler.
|
their respective handler.
|
||||||
|
|
@ -88,7 +88,7 @@ r := mux.NewRouter()
|
||||||
// Only matches if domain is "www.example.com".
|
// Only matches if domain is "www.example.com".
|
||||||
r.Host("www.example.com")
|
r.Host("www.example.com")
|
||||||
// Matches a dynamic subdomain.
|
// Matches a dynamic subdomain.
|
||||||
r.Host("{subdomain:[a-z]+}.domain.com")
|
r.Host("{subdomain:[a-z]+}.example.com")
|
||||||
```
|
```
|
||||||
|
|
||||||
There are several other matchers that can be added. To match path prefixes:
|
There are several other matchers that can be added. To match path prefixes:
|
||||||
|
|
@ -238,13 +238,13 @@ This also works for host and query value variables:
|
||||||
|
|
||||||
```go
|
```go
|
||||||
r := mux.NewRouter()
|
r := mux.NewRouter()
|
||||||
r.Host("{subdomain}.domain.com").
|
r.Host("{subdomain}.example.com").
|
||||||
Path("/articles/{category}/{id:[0-9]+}").
|
Path("/articles/{category}/{id:[0-9]+}").
|
||||||
Queries("filter", "{filter}").
|
Queries("filter", "{filter}").
|
||||||
HandlerFunc(ArticleHandler).
|
HandlerFunc(ArticleHandler).
|
||||||
Name("article")
|
Name("article")
|
||||||
|
|
||||||
// url.String() will be "http://news.domain.com/articles/technology/42?filter=gorilla"
|
// url.String() will be "http://news.example.com/articles/technology/42?filter=gorilla"
|
||||||
url, err := r.Get("article").URL("subdomain", "news",
|
url, err := r.Get("article").URL("subdomain", "news",
|
||||||
"category", "technology",
|
"category", "technology",
|
||||||
"id", "42",
|
"id", "42",
|
||||||
|
|
@ -264,7 +264,7 @@ r.HeadersRegexp("Content-Type", "application/(text|json)")
|
||||||
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:
|
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:
|
||||||
|
|
||||||
```go
|
```go
|
||||||
// "http://news.domain.com/"
|
// "http://news.example.com/"
|
||||||
host, err := r.Get("article").URLHost("subdomain", "news")
|
host, err := r.Get("article").URLHost("subdomain", "news")
|
||||||
|
|
||||||
// "/articles/technology/42"
|
// "/articles/technology/42"
|
||||||
|
|
@ -275,12 +275,12 @@ And if you use subrouters, host and path defined separately can be built as well
|
||||||
|
|
||||||
```go
|
```go
|
||||||
r := mux.NewRouter()
|
r := mux.NewRouter()
|
||||||
s := r.Host("{subdomain}.domain.com").Subrouter()
|
s := r.Host("{subdomain}.example.com").Subrouter()
|
||||||
s.Path("/articles/{category}/{id:[0-9]+}").
|
s.Path("/articles/{category}/{id:[0-9]+}").
|
||||||
HandlerFunc(ArticleHandler).
|
HandlerFunc(ArticleHandler).
|
||||||
Name("article")
|
Name("article")
|
||||||
|
|
||||||
// "http://news.domain.com/articles/technology/42"
|
// "http://news.example.com/articles/technology/42"
|
||||||
url, err := r.Get("article").URL("subdomain", "news",
|
url, err := r.Get("article").URL("subdomain", "news",
|
||||||
"category", "technology",
|
"category", "technology",
|
||||||
"id", "42")
|
"id", "42")
|
||||||
|
|
@ -503,8 +503,8 @@ package main
|
||||||
|
|
||||||
func HealthCheckHandler(w http.ResponseWriter, r *http.Request) {
|
func HealthCheckHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
// A very simple health check.
|
// A very simple health check.
|
||||||
w.WriteHeader(http.StatusOK)
|
|
||||||
w.Header().Set("Content-Type", "application/json")
|
w.Header().Set("Content-Type", "application/json")
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
|
||||||
// In the future we could report back on the status of our DB, or our cache
|
// In the future we could report back on the status of our DB, or our cache
|
||||||
// (e.g. Redis) by performing a simple PING, and include them in the response.
|
// (e.g. Redis) by performing a simple PING, and include them in the response.
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,3 @@
|
||||||
// +build go1.7
|
|
||||||
|
|
||||||
package mux
|
package mux
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
@ -18,7 +16,3 @@ func contextSet(r *http.Request, key, val interface{}) *http.Request {
|
||||||
|
|
||||||
return r.WithContext(context.WithValue(r.Context(), key, val))
|
return r.WithContext(context.WithValue(r.Context(), key, val))
|
||||||
}
|
}
|
||||||
|
|
||||||
func contextClear(r *http.Request) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
1
vendor/github.com/gorilla/mux/go.mod
generated
vendored
Normal file
1
vendor/github.com/gorilla/mux/go.mod
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
module github.com/gorilla/mux
|
||||||
129
vendor/github.com/gorilla/mux/mux.go
generated
vendored
129
vendor/github.com/gorilla/mux/mux.go
generated
vendored
|
|
@ -22,7 +22,7 @@ var (
|
||||||
|
|
||||||
// NewRouter returns a new router instance.
|
// NewRouter returns a new router instance.
|
||||||
func NewRouter() *Router {
|
func NewRouter() *Router {
|
||||||
return &Router{namedRoutes: make(map[string]*Route), KeepContext: false}
|
return &Router{namedRoutes: make(map[string]*Route)}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Router registers routes to be matched and dispatches a handler.
|
// Router registers routes to be matched and dispatches a handler.
|
||||||
|
|
@ -50,24 +50,78 @@ type Router struct {
|
||||||
// Configurable Handler to be used when the request method does not match the route.
|
// Configurable Handler to be used when the request method does not match the route.
|
||||||
MethodNotAllowedHandler http.Handler
|
MethodNotAllowedHandler http.Handler
|
||||||
|
|
||||||
// Parent route, if this is a subrouter.
|
|
||||||
parent parentRoute
|
|
||||||
// Routes to be matched, in order.
|
// Routes to be matched, in order.
|
||||||
routes []*Route
|
routes []*Route
|
||||||
|
|
||||||
// Routes by name for URL building.
|
// Routes by name for URL building.
|
||||||
namedRoutes map[string]*Route
|
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.
|
// 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
|
//
|
||||||
|
// Deprecated: No effect when go1.7+ is used, since the context is stored
|
||||||
// on the request itself.
|
// on the request itself.
|
||||||
KeepContext bool
|
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
|
// Slice of middlewares to be called after a match is found
|
||||||
middlewares []middleware
|
middlewares []middleware
|
||||||
|
|
||||||
|
// configuration shared with `Route`
|
||||||
|
routeConf
|
||||||
|
}
|
||||||
|
|
||||||
|
// common route configuration shared between `Router` and `Route`
|
||||||
|
type routeConf struct {
|
||||||
|
// If true, "/path/foo%2Fbar/to" will match the path "/path/{var}/to"
|
||||||
|
useEncodedPath bool
|
||||||
|
|
||||||
|
// 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
|
||||||
|
|
||||||
|
// Manager for the variables from host and path.
|
||||||
|
regexp routeRegexpGroup
|
||||||
|
|
||||||
|
// List of matchers.
|
||||||
|
matchers []matcher
|
||||||
|
|
||||||
|
// The scheme used when building URLs.
|
||||||
|
buildScheme string
|
||||||
|
|
||||||
|
buildVarsFunc BuildVarsFunc
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns an effective deep copy of `routeConf`
|
||||||
|
func copyRouteConf(r routeConf) routeConf {
|
||||||
|
c := r
|
||||||
|
|
||||||
|
if r.regexp.path != nil {
|
||||||
|
c.regexp.path = copyRouteRegexp(r.regexp.path)
|
||||||
|
}
|
||||||
|
|
||||||
|
if r.regexp.host != nil {
|
||||||
|
c.regexp.host = copyRouteRegexp(r.regexp.host)
|
||||||
|
}
|
||||||
|
|
||||||
|
c.regexp.queries = make([]*routeRegexp, 0, len(r.regexp.queries))
|
||||||
|
for _, q := range r.regexp.queries {
|
||||||
|
c.regexp.queries = append(c.regexp.queries, copyRouteRegexp(q))
|
||||||
|
}
|
||||||
|
|
||||||
|
c.matchers = make([]matcher, 0, len(r.matchers))
|
||||||
|
for _, m := range r.matchers {
|
||||||
|
c.matchers = append(c.matchers, m)
|
||||||
|
}
|
||||||
|
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func copyRouteRegexp(r *routeRegexp) *routeRegexp {
|
||||||
|
c := *r
|
||||||
|
return &c
|
||||||
}
|
}
|
||||||
|
|
||||||
// Match attempts to match the given request against the router's registered routes.
|
// Match attempts to match the given request against the router's registered routes.
|
||||||
|
|
@ -155,22 +209,18 @@ func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
||||||
handler = http.NotFoundHandler()
|
handler = http.NotFoundHandler()
|
||||||
}
|
}
|
||||||
|
|
||||||
if !r.KeepContext {
|
|
||||||
defer contextClear(req)
|
|
||||||
}
|
|
||||||
|
|
||||||
handler.ServeHTTP(w, req)
|
handler.ServeHTTP(w, req)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get returns a route registered with the given name.
|
// Get returns a route registered with the given name.
|
||||||
func (r *Router) Get(name string) *Route {
|
func (r *Router) Get(name string) *Route {
|
||||||
return r.getNamedRoutes()[name]
|
return r.namedRoutes[name]
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetRoute returns a route registered with the given name. This method
|
// GetRoute returns a route registered with the given name. This method
|
||||||
// was renamed to Get() and remains here for backwards compatibility.
|
// was renamed to Get() and remains here for backwards compatibility.
|
||||||
func (r *Router) GetRoute(name string) *Route {
|
func (r *Router) GetRoute(name string) *Route {
|
||||||
return r.getNamedRoutes()[name]
|
return r.namedRoutes[name]
|
||||||
}
|
}
|
||||||
|
|
||||||
// StrictSlash defines the trailing slash behavior for new routes. The initial
|
// StrictSlash defines the trailing slash behavior for new routes. The initial
|
||||||
|
|
@ -221,55 +271,24 @@ func (r *Router) UseEncodedPath() *Router {
|
||||||
return r
|
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
|
// Route factories
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
// NewRoute registers an empty route.
|
// NewRoute registers an empty route.
|
||||||
func (r *Router) NewRoute() *Route {
|
func (r *Router) NewRoute() *Route {
|
||||||
route := &Route{parent: r, strictSlash: r.strictSlash, skipClean: r.skipClean, useEncodedPath: r.useEncodedPath}
|
// initialize a route with a copy of the parent router's configuration
|
||||||
|
route := &Route{routeConf: copyRouteConf(r.routeConf), namedRoutes: r.namedRoutes}
|
||||||
r.routes = append(r.routes, route)
|
r.routes = append(r.routes, route)
|
||||||
return route
|
return route
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Name registers a new route with a name.
|
||||||
|
// See Route.Name().
|
||||||
|
func (r *Router) Name(name string) *Route {
|
||||||
|
return r.NewRoute().Name(name)
|
||||||
|
}
|
||||||
|
|
||||||
// Handle registers a new route with a matcher for the URL path.
|
// Handle registers a new route with a matcher for the URL path.
|
||||||
// See Route.Path() and Route.Handler().
|
// See Route.Path() and Route.Handler().
|
||||||
func (r *Router) Handle(path string, handler http.Handler) *Route {
|
func (r *Router) Handle(path string, handler http.Handler) *Route {
|
||||||
|
|
|
||||||
14
vendor/github.com/gorilla/mux/regexp.go
generated
vendored
14
vendor/github.com/gorilla/mux/regexp.go
generated
vendored
|
|
@ -267,7 +267,7 @@ type routeRegexpGroup struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// setMatch extracts the variables from the URL once a route matches.
|
// setMatch extracts the variables from the URL once a route matches.
|
||||||
func (v *routeRegexpGroup) setMatch(req *http.Request, m *RouteMatch, r *Route) {
|
func (v routeRegexpGroup) setMatch(req *http.Request, m *RouteMatch, r *Route) {
|
||||||
// Store host variables.
|
// Store host variables.
|
||||||
if v.host != nil {
|
if v.host != nil {
|
||||||
host := getHost(req)
|
host := getHost(req)
|
||||||
|
|
@ -296,7 +296,7 @@ func (v *routeRegexpGroup) setMatch(req *http.Request, m *RouteMatch, r *Route)
|
||||||
} else {
|
} else {
|
||||||
u.Path += "/"
|
u.Path += "/"
|
||||||
}
|
}
|
||||||
m.Handler = http.RedirectHandler(u.String(), 301)
|
m.Handler = http.RedirectHandler(u.String(), http.StatusMovedPermanently)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -312,17 +312,13 @@ func (v *routeRegexpGroup) setMatch(req *http.Request, m *RouteMatch, r *Route)
|
||||||
}
|
}
|
||||||
|
|
||||||
// getHost tries its best to return the request host.
|
// getHost tries its best to return the request host.
|
||||||
|
// According to section 14.23 of RFC 2616 the Host header
|
||||||
|
// can include the port number if the default value of 80 is not used.
|
||||||
func getHost(r *http.Request) string {
|
func getHost(r *http.Request) string {
|
||||||
if r.URL.IsAbs() {
|
if r.URL.IsAbs() {
|
||||||
return r.URL.Host
|
return r.URL.Host
|
||||||
}
|
}
|
||||||
host := r.Host
|
return 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) {
|
func extractVars(input string, matches []int, names []string, output map[string]string) {
|
||||||
|
|
|
||||||
141
vendor/github.com/gorilla/mux/route.go
generated
vendored
141
vendor/github.com/gorilla/mux/route.go
generated
vendored
|
|
@ -15,24 +15,8 @@ import (
|
||||||
|
|
||||||
// Route stores information to match a request and build URLs.
|
// Route stores information to match a request and build URLs.
|
||||||
type Route struct {
|
type Route struct {
|
||||||
// Parent where the route was registered (a Router).
|
|
||||||
parent parentRoute
|
|
||||||
// Request handler for the route.
|
// Request handler for the route.
|
||||||
handler http.Handler
|
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.
|
// If true, this route never matches: it is only used to build URLs.
|
||||||
buildOnly bool
|
buildOnly bool
|
||||||
// The name used to build URLs.
|
// The name used to build URLs.
|
||||||
|
|
@ -40,7 +24,11 @@ type Route struct {
|
||||||
// Error resulted from building a route.
|
// Error resulted from building a route.
|
||||||
err error
|
err error
|
||||||
|
|
||||||
buildVarsFunc BuildVarsFunc
|
// "global" reference to all named routes
|
||||||
|
namedRoutes map[string]*Route
|
||||||
|
|
||||||
|
// config possibly passed in from `Router`
|
||||||
|
routeConf
|
||||||
}
|
}
|
||||||
|
|
||||||
// SkipClean reports whether path cleaning is enabled for this route via
|
// SkipClean reports whether path cleaning is enabled for this route via
|
||||||
|
|
@ -64,6 +52,18 @@ func (r *Route) Match(req *http.Request, match *RouteMatch) bool {
|
||||||
matchErr = ErrMethodMismatch
|
matchErr = ErrMethodMismatch
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Ignore ErrNotFound errors. These errors arise from match call
|
||||||
|
// to Subrouters.
|
||||||
|
//
|
||||||
|
// This prevents subsequent matching subrouters from failing to
|
||||||
|
// run middleware. If not ignored, the middleware would see a
|
||||||
|
// non-nil MatchErr and be skipped, even when there was a
|
||||||
|
// matching route.
|
||||||
|
if match.MatchErr == ErrNotFound {
|
||||||
|
match.MatchErr = nil
|
||||||
|
}
|
||||||
|
|
||||||
matchErr = nil
|
matchErr = nil
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
@ -93,9 +93,7 @@ func (r *Route) Match(req *http.Request, match *RouteMatch) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set variables.
|
// Set variables.
|
||||||
if r.regexp != nil {
|
r.regexp.setMatch(req, match, r)
|
||||||
r.regexp.setMatch(req, match, r)
|
|
||||||
}
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -137,7 +135,7 @@ func (r *Route) GetHandler() http.Handler {
|
||||||
// Name -----------------------------------------------------------------------
|
// Name -----------------------------------------------------------------------
|
||||||
|
|
||||||
// Name sets the name for the route, used to build URLs.
|
// Name sets the name for the route, used to build URLs.
|
||||||
// If the name was registered already it will be overwritten.
|
// It is an error to call Name more than once on a route.
|
||||||
func (r *Route) Name(name string) *Route {
|
func (r *Route) Name(name string) *Route {
|
||||||
if r.name != "" {
|
if r.name != "" {
|
||||||
r.err = fmt.Errorf("mux: route already has name %q, can't set %q",
|
r.err = fmt.Errorf("mux: route already has name %q, can't set %q",
|
||||||
|
|
@ -145,7 +143,7 @@ func (r *Route) Name(name string) *Route {
|
||||||
}
|
}
|
||||||
if r.err == nil {
|
if r.err == nil {
|
||||||
r.name = name
|
r.name = name
|
||||||
r.getNamedRoutes()[name] = r
|
r.namedRoutes[name] = r
|
||||||
}
|
}
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
|
@ -177,7 +175,6 @@ func (r *Route) addRegexpMatcher(tpl string, typ regexpType) error {
|
||||||
if r.err != nil {
|
if r.err != nil {
|
||||||
return r.err
|
return r.err
|
||||||
}
|
}
|
||||||
r.regexp = r.getRegexpGroup()
|
|
||||||
if typ == regexpTypePath || typ == regexpTypePrefix {
|
if typ == regexpTypePath || typ == regexpTypePrefix {
|
||||||
if len(tpl) > 0 && tpl[0] != '/' {
|
if len(tpl) > 0 && tpl[0] != '/' {
|
||||||
return fmt.Errorf("mux: path must start with a slash, got %q", tpl)
|
return fmt.Errorf("mux: path must start with a slash, got %q", tpl)
|
||||||
|
|
@ -386,7 +383,7 @@ func (r *Route) PathPrefix(tpl string) *Route {
|
||||||
// The above route will only match if the URL contains the defined queries
|
// The above route will only match if the URL contains the defined queries
|
||||||
// values, e.g.: ?foo=bar&id=42.
|
// values, e.g.: ?foo=bar&id=42.
|
||||||
//
|
//
|
||||||
// It the value is an empty string, it will match any value if the key is set.
|
// If 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:
|
// Variables can define an optional regexp pattern to be matched:
|
||||||
//
|
//
|
||||||
|
|
@ -424,7 +421,7 @@ func (r *Route) Schemes(schemes ...string) *Route {
|
||||||
for k, v := range schemes {
|
for k, v := range schemes {
|
||||||
schemes[k] = strings.ToLower(v)
|
schemes[k] = strings.ToLower(v)
|
||||||
}
|
}
|
||||||
if r.buildScheme == "" && len(schemes) > 0 {
|
if len(schemes) > 0 {
|
||||||
r.buildScheme = schemes[0]
|
r.buildScheme = schemes[0]
|
||||||
}
|
}
|
||||||
return r.addMatcher(schemeMatcher(schemes))
|
return r.addMatcher(schemeMatcher(schemes))
|
||||||
|
|
@ -439,7 +436,15 @@ type BuildVarsFunc func(map[string]string) map[string]string
|
||||||
// BuildVarsFunc adds a custom function to be used to modify build variables
|
// BuildVarsFunc adds a custom function to be used to modify build variables
|
||||||
// before a route's URL is built.
|
// before a route's URL is built.
|
||||||
func (r *Route) BuildVarsFunc(f BuildVarsFunc) *Route {
|
func (r *Route) BuildVarsFunc(f BuildVarsFunc) *Route {
|
||||||
r.buildVarsFunc = f
|
if r.buildVarsFunc != nil {
|
||||||
|
// compose the old and new functions
|
||||||
|
old := r.buildVarsFunc
|
||||||
|
r.buildVarsFunc = func(m map[string]string) map[string]string {
|
||||||
|
return f(old(m))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
r.buildVarsFunc = f
|
||||||
|
}
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -458,7 +463,8 @@ func (r *Route) BuildVarsFunc(f BuildVarsFunc) *Route {
|
||||||
// Here, the routes registered in the subrouter won't be tested if the host
|
// Here, the routes registered in the subrouter won't be tested if the host
|
||||||
// doesn't match.
|
// doesn't match.
|
||||||
func (r *Route) Subrouter() *Router {
|
func (r *Route) Subrouter() *Router {
|
||||||
router := &Router{parent: r, strictSlash: r.strictSlash}
|
// initialize a subrouter with a copy of the parent route's configuration
|
||||||
|
router := &Router{routeConf: copyRouteConf(r.routeConf), namedRoutes: r.namedRoutes}
|
||||||
r.addMatcher(router)
|
r.addMatcher(router)
|
||||||
return router
|
return router
|
||||||
}
|
}
|
||||||
|
|
@ -502,9 +508,6 @@ func (r *Route) URL(pairs ...string) (*url.URL, error) {
|
||||||
if r.err != nil {
|
if r.err != nil {
|
||||||
return nil, r.err
|
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...)
|
values, err := r.prepareVars(pairs...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
@ -516,8 +519,8 @@ func (r *Route) URL(pairs ...string) (*url.URL, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
scheme = "http"
|
scheme = "http"
|
||||||
if s := r.getBuildScheme(); s != "" {
|
if r.buildScheme != "" {
|
||||||
scheme = s
|
scheme = r.buildScheme
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if r.regexp.path != nil {
|
if r.regexp.path != nil {
|
||||||
|
|
@ -547,7 +550,7 @@ func (r *Route) URLHost(pairs ...string) (*url.URL, error) {
|
||||||
if r.err != nil {
|
if r.err != nil {
|
||||||
return nil, r.err
|
return nil, r.err
|
||||||
}
|
}
|
||||||
if r.regexp == nil || r.regexp.host == nil {
|
if r.regexp.host == nil {
|
||||||
return nil, errors.New("mux: route doesn't have a host")
|
return nil, errors.New("mux: route doesn't have a host")
|
||||||
}
|
}
|
||||||
values, err := r.prepareVars(pairs...)
|
values, err := r.prepareVars(pairs...)
|
||||||
|
|
@ -562,8 +565,8 @@ func (r *Route) URLHost(pairs ...string) (*url.URL, error) {
|
||||||
Scheme: "http",
|
Scheme: "http",
|
||||||
Host: host,
|
Host: host,
|
||||||
}
|
}
|
||||||
if s := r.getBuildScheme(); s != "" {
|
if r.buildScheme != "" {
|
||||||
u.Scheme = s
|
u.Scheme = r.buildScheme
|
||||||
}
|
}
|
||||||
return u, nil
|
return u, nil
|
||||||
}
|
}
|
||||||
|
|
@ -575,7 +578,7 @@ func (r *Route) URLPath(pairs ...string) (*url.URL, error) {
|
||||||
if r.err != nil {
|
if r.err != nil {
|
||||||
return nil, r.err
|
return nil, r.err
|
||||||
}
|
}
|
||||||
if r.regexp == nil || r.regexp.path == nil {
|
if r.regexp.path == nil {
|
||||||
return nil, errors.New("mux: route doesn't have a path")
|
return nil, errors.New("mux: route doesn't have a path")
|
||||||
}
|
}
|
||||||
values, err := r.prepareVars(pairs...)
|
values, err := r.prepareVars(pairs...)
|
||||||
|
|
@ -600,7 +603,7 @@ func (r *Route) GetPathTemplate() (string, error) {
|
||||||
if r.err != nil {
|
if r.err != nil {
|
||||||
return "", r.err
|
return "", r.err
|
||||||
}
|
}
|
||||||
if r.regexp == nil || r.regexp.path == nil {
|
if r.regexp.path == nil {
|
||||||
return "", errors.New("mux: route doesn't have a path")
|
return "", errors.New("mux: route doesn't have a path")
|
||||||
}
|
}
|
||||||
return r.regexp.path.template, nil
|
return r.regexp.path.template, nil
|
||||||
|
|
@ -614,7 +617,7 @@ func (r *Route) GetPathRegexp() (string, error) {
|
||||||
if r.err != nil {
|
if r.err != nil {
|
||||||
return "", r.err
|
return "", r.err
|
||||||
}
|
}
|
||||||
if r.regexp == nil || r.regexp.path == nil {
|
if r.regexp.path == nil {
|
||||||
return "", errors.New("mux: route does not have a path")
|
return "", errors.New("mux: route does not have a path")
|
||||||
}
|
}
|
||||||
return r.regexp.path.regexp.String(), nil
|
return r.regexp.path.regexp.String(), nil
|
||||||
|
|
@ -629,7 +632,7 @@ func (r *Route) GetQueriesRegexp() ([]string, error) {
|
||||||
if r.err != nil {
|
if r.err != nil {
|
||||||
return nil, r.err
|
return nil, r.err
|
||||||
}
|
}
|
||||||
if r.regexp == nil || r.regexp.queries == nil {
|
if r.regexp.queries == nil {
|
||||||
return nil, errors.New("mux: route doesn't have queries")
|
return nil, errors.New("mux: route doesn't have queries")
|
||||||
}
|
}
|
||||||
var queries []string
|
var queries []string
|
||||||
|
|
@ -648,7 +651,7 @@ func (r *Route) GetQueriesTemplates() ([]string, error) {
|
||||||
if r.err != nil {
|
if r.err != nil {
|
||||||
return nil, r.err
|
return nil, r.err
|
||||||
}
|
}
|
||||||
if r.regexp == nil || r.regexp.queries == nil {
|
if r.regexp.queries == nil {
|
||||||
return nil, errors.New("mux: route doesn't have queries")
|
return nil, errors.New("mux: route doesn't have queries")
|
||||||
}
|
}
|
||||||
var queries []string
|
var queries []string
|
||||||
|
|
@ -683,7 +686,7 @@ func (r *Route) GetHostTemplate() (string, error) {
|
||||||
if r.err != nil {
|
if r.err != nil {
|
||||||
return "", r.err
|
return "", r.err
|
||||||
}
|
}
|
||||||
if r.regexp == nil || r.regexp.host == nil {
|
if r.regexp.host == nil {
|
||||||
return "", errors.New("mux: route doesn't have a host")
|
return "", errors.New("mux: route doesn't have a host")
|
||||||
}
|
}
|
||||||
return r.regexp.host.template, nil
|
return r.regexp.host.template, nil
|
||||||
|
|
@ -700,64 +703,8 @@ func (r *Route) prepareVars(pairs ...string) (map[string]string, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *Route) buildVars(m map[string]string) map[string]string {
|
func (r *Route) buildVars(m map[string]string) map[string]string {
|
||||||
if r.parent != nil {
|
|
||||||
m = r.parent.buildVars(m)
|
|
||||||
}
|
|
||||||
if r.buildVarsFunc != nil {
|
if r.buildVarsFunc != nil {
|
||||||
m = r.buildVarsFunc(m)
|
m = r.buildVarsFunc(m)
|
||||||
}
|
}
|
||||||
return 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
|
|
||||||
}
|
|
||||||
|
|
|
||||||
4
vendor/github.com/pquerna/otp/hotp/hotp.go
generated
vendored
4
vendor/github.com/pquerna/otp/hotp/hotp.go
generated
vendored
|
|
@ -167,6 +167,10 @@ func Generate(opts GenerateOpts) (*otp.Key, error) {
|
||||||
opts.SecretSize = 10
|
opts.SecretSize = 10
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if opts.Digits == 0 {
|
||||||
|
opts.Digits = otp.DigitsSix
|
||||||
|
}
|
||||||
|
|
||||||
// otpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=Example
|
// otpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=Example
|
||||||
|
|
||||||
v := url.Values{}
|
v := url.Values{}
|
||||||
|
|
|
||||||
1
vendor/github.com/tinylib/msgp/msgp/edit.go
generated
vendored
1
vendor/github.com/tinylib/msgp/msgp/edit.go
generated
vendored
|
|
@ -198,6 +198,7 @@ func resizeMap(raw []byte, delta int64) []byte {
|
||||||
if cap(raw)-len(raw) >= 2 {
|
if cap(raw)-len(raw) >= 2 {
|
||||||
raw = raw[0 : len(raw)+2]
|
raw = raw[0 : len(raw)+2]
|
||||||
copy(raw[5:], raw[3:])
|
copy(raw[5:], raw[3:])
|
||||||
|
raw[0] = mmap32
|
||||||
big.PutUint32(raw[1:], uint32(sz+delta))
|
big.PutUint32(raw[1:], uint32(sz+delta))
|
||||||
return raw
|
return raw
|
||||||
}
|
}
|
||||||
|
|
|
||||||
188
vendor/github.com/tinylib/msgp/msgp/errors.go
generated
vendored
188
vendor/github.com/tinylib/msgp/msgp/errors.go
generated
vendored
|
|
@ -5,6 +5,8 @@ import (
|
||||||
"reflect"
|
"reflect"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const resumableDefault = false
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// ErrShortBytes is returned when the
|
// ErrShortBytes is returned when the
|
||||||
// slice being decoded is too short to
|
// slice being decoded is too short to
|
||||||
|
|
@ -26,84 +28,240 @@ type Error interface {
|
||||||
// Resumable returns whether
|
// Resumable returns whether
|
||||||
// or not the error means that
|
// or not the error means that
|
||||||
// the stream of data is malformed
|
// the stream of data is malformed
|
||||||
// and the information is unrecoverable.
|
// and the information is unrecoverable.
|
||||||
Resumable() bool
|
Resumable() bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// contextError allows msgp Error instances to be enhanced with additional
|
||||||
|
// context about their origin.
|
||||||
|
type contextError interface {
|
||||||
|
Error
|
||||||
|
|
||||||
|
// withContext must not modify the error instance - it must clone and
|
||||||
|
// return a new error with the context added.
|
||||||
|
withContext(ctx string) error
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cause returns the underlying cause of an error that has been wrapped
|
||||||
|
// with additional context.
|
||||||
|
func Cause(e error) error {
|
||||||
|
out := e
|
||||||
|
if e, ok := e.(errWrapped); ok && e.cause != nil {
|
||||||
|
out = e.cause
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
// Resumable returns whether or not the error means that the stream of data is
|
||||||
|
// malformed and the information is unrecoverable.
|
||||||
|
func Resumable(e error) bool {
|
||||||
|
if e, ok := e.(Error); ok {
|
||||||
|
return e.Resumable()
|
||||||
|
}
|
||||||
|
return resumableDefault
|
||||||
|
}
|
||||||
|
|
||||||
|
// WrapError wraps an error with additional context that allows the part of the
|
||||||
|
// serialized type that caused the problem to be identified. Underlying errors
|
||||||
|
// can be retrieved using Cause()
|
||||||
|
//
|
||||||
|
// The input error is not modified - a new error should be returned.
|
||||||
|
//
|
||||||
|
// ErrShortBytes is not wrapped with any context due to backward compatibility
|
||||||
|
// issues with the public API.
|
||||||
|
//
|
||||||
|
func WrapError(err error, ctx ...interface{}) error {
|
||||||
|
switch e := err.(type) {
|
||||||
|
case errShort:
|
||||||
|
return e
|
||||||
|
case contextError:
|
||||||
|
return e.withContext(ctxString(ctx))
|
||||||
|
default:
|
||||||
|
return errWrapped{cause: err, ctx: ctxString(ctx)}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ctxString converts the incoming interface{} slice into a single string.
|
||||||
|
func ctxString(ctx []interface{}) string {
|
||||||
|
out := ""
|
||||||
|
for idx, cv := range ctx {
|
||||||
|
if idx > 0 {
|
||||||
|
out += "/"
|
||||||
|
}
|
||||||
|
out += fmt.Sprintf("%v", cv)
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
func addCtx(ctx, add string) string {
|
||||||
|
if ctx != "" {
|
||||||
|
return add + "/" + ctx
|
||||||
|
} else {
|
||||||
|
return add
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// errWrapped allows arbitrary errors passed to WrapError to be enhanced with
|
||||||
|
// context and unwrapped with Cause()
|
||||||
|
type errWrapped struct {
|
||||||
|
cause error
|
||||||
|
ctx string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e errWrapped) Error() string {
|
||||||
|
if e.ctx != "" {
|
||||||
|
return fmt.Sprintf("%s at %s", e.cause, e.ctx)
|
||||||
|
} else {
|
||||||
|
return e.cause.Error()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e errWrapped) Resumable() bool {
|
||||||
|
if e, ok := e.cause.(Error); ok {
|
||||||
|
return e.Resumable()
|
||||||
|
}
|
||||||
|
return resumableDefault
|
||||||
|
}
|
||||||
|
|
||||||
type errShort struct{}
|
type errShort struct{}
|
||||||
|
|
||||||
func (e errShort) Error() string { return "msgp: too few bytes left to read object" }
|
func (e errShort) Error() string { return "msgp: too few bytes left to read object" }
|
||||||
func (e errShort) Resumable() bool { return false }
|
func (e errShort) Resumable() bool { return false }
|
||||||
|
|
||||||
type errFatal struct{}
|
type errFatal struct {
|
||||||
|
ctx string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f errFatal) Error() string {
|
||||||
|
out := "msgp: fatal decoding error (unreachable code)"
|
||||||
|
if f.ctx != "" {
|
||||||
|
out += " at " + f.ctx
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
func (f errFatal) Error() string { return "msgp: fatal decoding error (unreachable code)" }
|
|
||||||
func (f errFatal) Resumable() bool { return false }
|
func (f errFatal) Resumable() bool { return false }
|
||||||
|
|
||||||
|
func (f errFatal) withContext(ctx string) error { f.ctx = addCtx(f.ctx, ctx); return f }
|
||||||
|
|
||||||
// ArrayError is an error returned
|
// ArrayError is an error returned
|
||||||
// when decoding a fix-sized array
|
// when decoding a fix-sized array
|
||||||
// of the wrong size
|
// of the wrong size
|
||||||
type ArrayError struct {
|
type ArrayError struct {
|
||||||
Wanted uint32
|
Wanted uint32
|
||||||
Got uint32
|
Got uint32
|
||||||
|
ctx string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Error implements the error interface
|
// Error implements the error interface
|
||||||
func (a ArrayError) Error() string {
|
func (a ArrayError) Error() string {
|
||||||
return fmt.Sprintf("msgp: wanted array of size %d; got %d", a.Wanted, a.Got)
|
out := fmt.Sprintf("msgp: wanted array of size %d; got %d", a.Wanted, a.Got)
|
||||||
|
if a.ctx != "" {
|
||||||
|
out += " at " + a.ctx
|
||||||
|
}
|
||||||
|
return out
|
||||||
}
|
}
|
||||||
|
|
||||||
// Resumable is always 'true' for ArrayErrors
|
// Resumable is always 'true' for ArrayErrors
|
||||||
func (a ArrayError) Resumable() bool { return true }
|
func (a ArrayError) Resumable() bool { return true }
|
||||||
|
|
||||||
|
func (a ArrayError) withContext(ctx string) error { a.ctx = addCtx(a.ctx, ctx); return a }
|
||||||
|
|
||||||
// IntOverflow is returned when a call
|
// IntOverflow is returned when a call
|
||||||
// would downcast an integer to a type
|
// would downcast an integer to a type
|
||||||
// with too few bits to hold its value.
|
// with too few bits to hold its value.
|
||||||
type IntOverflow struct {
|
type IntOverflow struct {
|
||||||
Value int64 // the value of the integer
|
Value int64 // the value of the integer
|
||||||
FailedBitsize int // the bit size that the int64 could not fit into
|
FailedBitsize int // the bit size that the int64 could not fit into
|
||||||
|
ctx string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Error implements the error interface
|
// Error implements the error interface
|
||||||
func (i IntOverflow) Error() string {
|
func (i IntOverflow) Error() string {
|
||||||
return fmt.Sprintf("msgp: %d overflows int%d", i.Value, i.FailedBitsize)
|
str := fmt.Sprintf("msgp: %d overflows int%d", i.Value, i.FailedBitsize)
|
||||||
|
if i.ctx != "" {
|
||||||
|
str += " at " + i.ctx
|
||||||
|
}
|
||||||
|
return str
|
||||||
}
|
}
|
||||||
|
|
||||||
// Resumable is always 'true' for overflows
|
// Resumable is always 'true' for overflows
|
||||||
func (i IntOverflow) Resumable() bool { return true }
|
func (i IntOverflow) Resumable() bool { return true }
|
||||||
|
|
||||||
|
func (i IntOverflow) withContext(ctx string) error { i.ctx = addCtx(i.ctx, ctx); return i }
|
||||||
|
|
||||||
// UintOverflow is returned when a call
|
// UintOverflow is returned when a call
|
||||||
// would downcast an unsigned integer to a type
|
// would downcast an unsigned integer to a type
|
||||||
// with too few bits to hold its value
|
// with too few bits to hold its value
|
||||||
type UintOverflow struct {
|
type UintOverflow struct {
|
||||||
Value uint64 // value of the uint
|
Value uint64 // value of the uint
|
||||||
FailedBitsize int // the bit size that couldn't fit the value
|
FailedBitsize int // the bit size that couldn't fit the value
|
||||||
|
ctx string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Error implements the error interface
|
// Error implements the error interface
|
||||||
func (u UintOverflow) Error() string {
|
func (u UintOverflow) Error() string {
|
||||||
return fmt.Sprintf("msgp: %d overflows uint%d", u.Value, u.FailedBitsize)
|
str := fmt.Sprintf("msgp: %d overflows uint%d", u.Value, u.FailedBitsize)
|
||||||
|
if u.ctx != "" {
|
||||||
|
str += " at " + u.ctx
|
||||||
|
}
|
||||||
|
return str
|
||||||
}
|
}
|
||||||
|
|
||||||
// Resumable is always 'true' for overflows
|
// Resumable is always 'true' for overflows
|
||||||
func (u UintOverflow) Resumable() bool { return true }
|
func (u UintOverflow) Resumable() bool { return true }
|
||||||
|
|
||||||
|
func (u UintOverflow) withContext(ctx string) error { u.ctx = addCtx(u.ctx, ctx); return u }
|
||||||
|
|
||||||
|
// UintBelowZero is returned when a call
|
||||||
|
// would cast a signed integer below zero
|
||||||
|
// to an unsigned integer.
|
||||||
|
type UintBelowZero struct {
|
||||||
|
Value int64 // value of the incoming int
|
||||||
|
ctx string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error implements the error interface
|
||||||
|
func (u UintBelowZero) Error() string {
|
||||||
|
str := fmt.Sprintf("msgp: attempted to cast int %d to unsigned", u.Value)
|
||||||
|
if u.ctx != "" {
|
||||||
|
str += " at " + u.ctx
|
||||||
|
}
|
||||||
|
return str
|
||||||
|
}
|
||||||
|
|
||||||
|
// Resumable is always 'true' for overflows
|
||||||
|
func (u UintBelowZero) Resumable() bool { return true }
|
||||||
|
|
||||||
|
func (u UintBelowZero) withContext(ctx string) error {
|
||||||
|
u.ctx = ctx
|
||||||
|
return u
|
||||||
|
}
|
||||||
|
|
||||||
// A TypeError is returned when a particular
|
// A TypeError is returned when a particular
|
||||||
// decoding method is unsuitable for decoding
|
// decoding method is unsuitable for decoding
|
||||||
// a particular MessagePack value.
|
// a particular MessagePack value.
|
||||||
type TypeError struct {
|
type TypeError struct {
|
||||||
Method Type // Type expected by method
|
Method Type // Type expected by method
|
||||||
Encoded Type // Type actually encoded
|
Encoded Type // Type actually encoded
|
||||||
|
|
||||||
|
ctx string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Error implements the error interface
|
// Error implements the error interface
|
||||||
func (t TypeError) Error() string {
|
func (t TypeError) Error() string {
|
||||||
return fmt.Sprintf("msgp: attempted to decode type %q with method for %q", t.Encoded, t.Method)
|
out := fmt.Sprintf("msgp: attempted to decode type %q with method for %q", t.Encoded, t.Method)
|
||||||
|
if t.ctx != "" {
|
||||||
|
out += " at " + t.ctx
|
||||||
|
}
|
||||||
|
return out
|
||||||
}
|
}
|
||||||
|
|
||||||
// Resumable returns 'true' for TypeErrors
|
// Resumable returns 'true' for TypeErrors
|
||||||
func (t TypeError) Resumable() bool { return true }
|
func (t TypeError) Resumable() bool { return true }
|
||||||
|
|
||||||
|
func (t TypeError) withContext(ctx string) error { t.ctx = addCtx(t.ctx, ctx); return t }
|
||||||
|
|
||||||
// returns either InvalidPrefixError or
|
// returns either InvalidPrefixError or
|
||||||
// TypeError depending on whether or not
|
// TypeError depending on whether or not
|
||||||
// the prefix is recognized
|
// the prefix is recognized
|
||||||
|
|
@ -133,10 +291,24 @@ func (i InvalidPrefixError) Resumable() bool { return false }
|
||||||
// to a function that takes `interface{}`.
|
// to a function that takes `interface{}`.
|
||||||
type ErrUnsupportedType struct {
|
type ErrUnsupportedType struct {
|
||||||
T reflect.Type
|
T reflect.Type
|
||||||
|
|
||||||
|
ctx string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Error implements error
|
// Error implements error
|
||||||
func (e *ErrUnsupportedType) Error() string { return fmt.Sprintf("msgp: type %q not supported", e.T) }
|
func (e *ErrUnsupportedType) Error() string {
|
||||||
|
out := fmt.Sprintf("msgp: type %q not supported", e.T)
|
||||||
|
if e.ctx != "" {
|
||||||
|
out += " at " + e.ctx
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
// Resumable returns 'true' for ErrUnsupportedType
|
// Resumable returns 'true' for ErrUnsupportedType
|
||||||
func (e *ErrUnsupportedType) Resumable() bool { return true }
|
func (e *ErrUnsupportedType) Resumable() bool { return true }
|
||||||
|
|
||||||
|
func (e *ErrUnsupportedType) withContext(ctx string) error {
|
||||||
|
o := *e
|
||||||
|
o.ctx = addCtx(o.ctx, ctx)
|
||||||
|
return &o
|
||||||
|
}
|
||||||
|
|
|
||||||
39
vendor/github.com/tinylib/msgp/msgp/extension.go
generated
vendored
39
vendor/github.com/tinylib/msgp/msgp/extension.go
generated
vendored
|
|
@ -445,26 +445,27 @@ func AppendExtension(b []byte, e Extension) ([]byte, error) {
|
||||||
o[n] = mfixext16
|
o[n] = mfixext16
|
||||||
o[n+1] = byte(e.ExtensionType())
|
o[n+1] = byte(e.ExtensionType())
|
||||||
n += 2
|
n += 2
|
||||||
}
|
|
||||||
switch {
|
|
||||||
case l < math.MaxUint8:
|
|
||||||
o, n = ensure(b, l+3)
|
|
||||||
o[n] = mext8
|
|
||||||
o[n+1] = byte(uint8(l))
|
|
||||||
o[n+2] = byte(e.ExtensionType())
|
|
||||||
n += 3
|
|
||||||
case l < math.MaxUint16:
|
|
||||||
o, n = ensure(b, l+4)
|
|
||||||
o[n] = mext16
|
|
||||||
big.PutUint16(o[n+1:], uint16(l))
|
|
||||||
o[n+3] = byte(e.ExtensionType())
|
|
||||||
n += 4
|
|
||||||
default:
|
default:
|
||||||
o, n = ensure(b, l+6)
|
switch {
|
||||||
o[n] = mext32
|
case l < math.MaxUint8:
|
||||||
big.PutUint32(o[n+1:], uint32(l))
|
o, n = ensure(b, l+3)
|
||||||
o[n+5] = byte(e.ExtensionType())
|
o[n] = mext8
|
||||||
n += 6
|
o[n+1] = byte(uint8(l))
|
||||||
|
o[n+2] = byte(e.ExtensionType())
|
||||||
|
n += 3
|
||||||
|
case l < math.MaxUint16:
|
||||||
|
o, n = ensure(b, l+4)
|
||||||
|
o[n] = mext16
|
||||||
|
big.PutUint16(o[n+1:], uint16(l))
|
||||||
|
o[n+3] = byte(e.ExtensionType())
|
||||||
|
n += 4
|
||||||
|
default:
|
||||||
|
o, n = ensure(b, l+6)
|
||||||
|
o[n] = mext32
|
||||||
|
big.PutUint32(o[n+1:], uint32(l))
|
||||||
|
o[n+5] = byte(e.ExtensionType())
|
||||||
|
n += 6
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return o, e.MarshalBinaryTo(o[n:])
|
return o, e.MarshalBinaryTo(o[n:])
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
// +build appengine
|
// +build purego appengine
|
||||||
|
|
||||||
package msgp
|
package msgp
|
||||||
|
|
||||||
95
vendor/github.com/tinylib/msgp/msgp/read.go
generated
vendored
95
vendor/github.com/tinylib/msgp/msgp/read.go
generated
vendored
|
|
@ -583,6 +583,14 @@ func (m *Reader) ReadInt64() (i int64, err error) {
|
||||||
i = int64(getMint8(p))
|
i = int64(getMint8(p))
|
||||||
return
|
return
|
||||||
|
|
||||||
|
case muint8:
|
||||||
|
p, err = m.R.Next(2)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i = int64(getMuint8(p))
|
||||||
|
return
|
||||||
|
|
||||||
case mint16:
|
case mint16:
|
||||||
p, err = m.R.Next(3)
|
p, err = m.R.Next(3)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -591,6 +599,14 @@ func (m *Reader) ReadInt64() (i int64, err error) {
|
||||||
i = int64(getMint16(p))
|
i = int64(getMint16(p))
|
||||||
return
|
return
|
||||||
|
|
||||||
|
case muint16:
|
||||||
|
p, err = m.R.Next(3)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i = int64(getMuint16(p))
|
||||||
|
return
|
||||||
|
|
||||||
case mint32:
|
case mint32:
|
||||||
p, err = m.R.Next(5)
|
p, err = m.R.Next(5)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -599,6 +615,14 @@ func (m *Reader) ReadInt64() (i int64, err error) {
|
||||||
i = int64(getMint32(p))
|
i = int64(getMint32(p))
|
||||||
return
|
return
|
||||||
|
|
||||||
|
case muint32:
|
||||||
|
p, err = m.R.Next(5)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i = int64(getMuint32(p))
|
||||||
|
return
|
||||||
|
|
||||||
case mint64:
|
case mint64:
|
||||||
p, err = m.R.Next(9)
|
p, err = m.R.Next(9)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -607,6 +631,19 @@ func (m *Reader) ReadInt64() (i int64, err error) {
|
||||||
i = getMint64(p)
|
i = getMint64(p)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
case muint64:
|
||||||
|
p, err = m.R.Next(9)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
u := getMuint64(p)
|
||||||
|
if u > math.MaxInt64 {
|
||||||
|
err = UintOverflow{Value: u, FailedBitsize: 64}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i = int64(u)
|
||||||
|
return
|
||||||
|
|
||||||
default:
|
default:
|
||||||
err = badPrefix(IntType, lead)
|
err = badPrefix(IntType, lead)
|
||||||
return
|
return
|
||||||
|
|
@ -678,6 +715,19 @@ func (m *Reader) ReadUint64() (u uint64, err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
switch lead {
|
switch lead {
|
||||||
|
case mint8:
|
||||||
|
p, err = m.R.Next(2)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
v := int64(getMint8(p))
|
||||||
|
if v < 0 {
|
||||||
|
err = UintBelowZero{Value: v}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
u = uint64(v)
|
||||||
|
return
|
||||||
|
|
||||||
case muint8:
|
case muint8:
|
||||||
p, err = m.R.Next(2)
|
p, err = m.R.Next(2)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -686,6 +736,19 @@ func (m *Reader) ReadUint64() (u uint64, err error) {
|
||||||
u = uint64(getMuint8(p))
|
u = uint64(getMuint8(p))
|
||||||
return
|
return
|
||||||
|
|
||||||
|
case mint16:
|
||||||
|
p, err = m.R.Next(3)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
v := int64(getMint16(p))
|
||||||
|
if v < 0 {
|
||||||
|
err = UintBelowZero{Value: v}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
u = uint64(v)
|
||||||
|
return
|
||||||
|
|
||||||
case muint16:
|
case muint16:
|
||||||
p, err = m.R.Next(3)
|
p, err = m.R.Next(3)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -694,6 +757,19 @@ func (m *Reader) ReadUint64() (u uint64, err error) {
|
||||||
u = uint64(getMuint16(p))
|
u = uint64(getMuint16(p))
|
||||||
return
|
return
|
||||||
|
|
||||||
|
case mint32:
|
||||||
|
p, err = m.R.Next(5)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
v := int64(getMint32(p))
|
||||||
|
if v < 0 {
|
||||||
|
err = UintBelowZero{Value: v}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
u = uint64(v)
|
||||||
|
return
|
||||||
|
|
||||||
case muint32:
|
case muint32:
|
||||||
p, err = m.R.Next(5)
|
p, err = m.R.Next(5)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -702,6 +778,19 @@ func (m *Reader) ReadUint64() (u uint64, err error) {
|
||||||
u = uint64(getMuint32(p))
|
u = uint64(getMuint32(p))
|
||||||
return
|
return
|
||||||
|
|
||||||
|
case mint64:
|
||||||
|
p, err = m.R.Next(9)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
v := int64(getMint64(p))
|
||||||
|
if v < 0 {
|
||||||
|
err = UintBelowZero{Value: v}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
u = uint64(v)
|
||||||
|
return
|
||||||
|
|
||||||
case muint64:
|
case muint64:
|
||||||
p, err = m.R.Next(9)
|
p, err = m.R.Next(9)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -711,7 +800,11 @@ func (m *Reader) ReadUint64() (u uint64, err error) {
|
||||||
return
|
return
|
||||||
|
|
||||||
default:
|
default:
|
||||||
err = badPrefix(UintType, lead)
|
if isnfixint(lead) {
|
||||||
|
err = UintBelowZero{Value: int64(rnfixint(lead))}
|
||||||
|
} else {
|
||||||
|
err = badPrefix(UintType, lead)
|
||||||
|
}
|
||||||
return
|
return
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
114
vendor/github.com/tinylib/msgp/msgp/read_bytes.go
generated
vendored
114
vendor/github.com/tinylib/msgp/msgp/read_bytes.go
generated
vendored
|
|
@ -79,6 +79,9 @@ func (r *Raw) UnmarshalMsg(b []byte) ([]byte, error) {
|
||||||
return b, err
|
return b, err
|
||||||
}
|
}
|
||||||
rlen := l - len(out)
|
rlen := l - len(out)
|
||||||
|
if IsNil(b[:rlen]) {
|
||||||
|
rlen = 0
|
||||||
|
}
|
||||||
if cap(*r) < rlen {
|
if cap(*r) < rlen {
|
||||||
*r = make(Raw, rlen)
|
*r = make(Raw, rlen)
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -104,7 +107,11 @@ func (r Raw) EncodeMsg(w *Writer) error {
|
||||||
// next object on the wire.
|
// next object on the wire.
|
||||||
func (r *Raw) DecodeMsg(f *Reader) error {
|
func (r *Raw) DecodeMsg(f *Reader) error {
|
||||||
*r = (*r)[:0]
|
*r = (*r)[:0]
|
||||||
return appendNext(f, (*[]byte)(r))
|
err := appendNext(f, (*[]byte)(r))
|
||||||
|
if IsNil(*r) {
|
||||||
|
*r = (*r)[:0]
|
||||||
|
}
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Msgsize implements msgp.Sizer
|
// Msgsize implements msgp.Sizer
|
||||||
|
|
@ -368,6 +375,15 @@ func ReadInt64Bytes(b []byte) (i int64, o []byte, err error) {
|
||||||
o = b[2:]
|
o = b[2:]
|
||||||
return
|
return
|
||||||
|
|
||||||
|
case muint8:
|
||||||
|
if l < 2 {
|
||||||
|
err = ErrShortBytes
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i = int64(getMuint8(b))
|
||||||
|
o = b[2:]
|
||||||
|
return
|
||||||
|
|
||||||
case mint16:
|
case mint16:
|
||||||
if l < 3 {
|
if l < 3 {
|
||||||
err = ErrShortBytes
|
err = ErrShortBytes
|
||||||
|
|
@ -377,6 +393,15 @@ func ReadInt64Bytes(b []byte) (i int64, o []byte, err error) {
|
||||||
o = b[3:]
|
o = b[3:]
|
||||||
return
|
return
|
||||||
|
|
||||||
|
case muint16:
|
||||||
|
if l < 3 {
|
||||||
|
err = ErrShortBytes
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i = int64(getMuint16(b))
|
||||||
|
o = b[3:]
|
||||||
|
return
|
||||||
|
|
||||||
case mint32:
|
case mint32:
|
||||||
if l < 5 {
|
if l < 5 {
|
||||||
err = ErrShortBytes
|
err = ErrShortBytes
|
||||||
|
|
@ -386,12 +411,35 @@ func ReadInt64Bytes(b []byte) (i int64, o []byte, err error) {
|
||||||
o = b[5:]
|
o = b[5:]
|
||||||
return
|
return
|
||||||
|
|
||||||
|
case muint32:
|
||||||
|
if l < 5 {
|
||||||
|
err = ErrShortBytes
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i = int64(getMuint32(b))
|
||||||
|
o = b[5:]
|
||||||
|
return
|
||||||
|
|
||||||
case mint64:
|
case mint64:
|
||||||
if l < 9 {
|
if l < 9 {
|
||||||
err = ErrShortBytes
|
err = ErrShortBytes
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
i = getMint64(b)
|
i = int64(getMint64(b))
|
||||||
|
o = b[9:]
|
||||||
|
return
|
||||||
|
|
||||||
|
case muint64:
|
||||||
|
if l < 9 {
|
||||||
|
err = ErrShortBytes
|
||||||
|
return
|
||||||
|
}
|
||||||
|
u := getMuint64(b)
|
||||||
|
if u > math.MaxInt64 {
|
||||||
|
err = UintOverflow{Value: u, FailedBitsize: 64}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
i = int64(u)
|
||||||
o = b[9:]
|
o = b[9:]
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
@ -477,6 +525,20 @@ func ReadUint64Bytes(b []byte) (u uint64, o []byte, err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
switch lead {
|
switch lead {
|
||||||
|
case mint8:
|
||||||
|
if l < 2 {
|
||||||
|
err = ErrShortBytes
|
||||||
|
return
|
||||||
|
}
|
||||||
|
v := int64(getMint8(b))
|
||||||
|
if v < 0 {
|
||||||
|
err = UintBelowZero{Value: v}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
u = uint64(v)
|
||||||
|
o = b[2:]
|
||||||
|
return
|
||||||
|
|
||||||
case muint8:
|
case muint8:
|
||||||
if l < 2 {
|
if l < 2 {
|
||||||
err = ErrShortBytes
|
err = ErrShortBytes
|
||||||
|
|
@ -486,6 +548,20 @@ func ReadUint64Bytes(b []byte) (u uint64, o []byte, err error) {
|
||||||
o = b[2:]
|
o = b[2:]
|
||||||
return
|
return
|
||||||
|
|
||||||
|
case mint16:
|
||||||
|
if l < 3 {
|
||||||
|
err = ErrShortBytes
|
||||||
|
return
|
||||||
|
}
|
||||||
|
v := int64(getMint16(b))
|
||||||
|
if v < 0 {
|
||||||
|
err = UintBelowZero{Value: v}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
u = uint64(v)
|
||||||
|
o = b[3:]
|
||||||
|
return
|
||||||
|
|
||||||
case muint16:
|
case muint16:
|
||||||
if l < 3 {
|
if l < 3 {
|
||||||
err = ErrShortBytes
|
err = ErrShortBytes
|
||||||
|
|
@ -495,6 +571,20 @@ func ReadUint64Bytes(b []byte) (u uint64, o []byte, err error) {
|
||||||
o = b[3:]
|
o = b[3:]
|
||||||
return
|
return
|
||||||
|
|
||||||
|
case mint32:
|
||||||
|
if l < 5 {
|
||||||
|
err = ErrShortBytes
|
||||||
|
return
|
||||||
|
}
|
||||||
|
v := int64(getMint32(b))
|
||||||
|
if v < 0 {
|
||||||
|
err = UintBelowZero{Value: v}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
u = uint64(v)
|
||||||
|
o = b[5:]
|
||||||
|
return
|
||||||
|
|
||||||
case muint32:
|
case muint32:
|
||||||
if l < 5 {
|
if l < 5 {
|
||||||
err = ErrShortBytes
|
err = ErrShortBytes
|
||||||
|
|
@ -504,6 +594,20 @@ func ReadUint64Bytes(b []byte) (u uint64, o []byte, err error) {
|
||||||
o = b[5:]
|
o = b[5:]
|
||||||
return
|
return
|
||||||
|
|
||||||
|
case mint64:
|
||||||
|
if l < 9 {
|
||||||
|
err = ErrShortBytes
|
||||||
|
return
|
||||||
|
}
|
||||||
|
v := int64(getMint64(b))
|
||||||
|
if v < 0 {
|
||||||
|
err = UintBelowZero{Value: v}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
u = uint64(v)
|
||||||
|
o = b[9:]
|
||||||
|
return
|
||||||
|
|
||||||
case muint64:
|
case muint64:
|
||||||
if l < 9 {
|
if l < 9 {
|
||||||
err = ErrShortBytes
|
err = ErrShortBytes
|
||||||
|
|
@ -514,7 +618,11 @@ func ReadUint64Bytes(b []byte) (u uint64, o []byte, err error) {
|
||||||
return
|
return
|
||||||
|
|
||||||
default:
|
default:
|
||||||
err = badPrefix(UintType, lead)
|
if isnfixint(lead) {
|
||||||
|
err = UintBelowZero{Value: int64(rnfixint(lead))}
|
||||||
|
} else {
|
||||||
|
err = badPrefix(UintType, lead)
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
5
vendor/github.com/tinylib/msgp/msgp/unsafe.go
generated
vendored
5
vendor/github.com/tinylib/msgp/msgp/unsafe.go
generated
vendored
|
|
@ -1,4 +1,4 @@
|
||||||
// +build !appengine
|
// +build !purego,!appengine
|
||||||
|
|
||||||
package msgp
|
package msgp
|
||||||
|
|
||||||
|
|
@ -24,7 +24,8 @@ const (
|
||||||
// THIS IS EVIL CODE.
|
// THIS IS EVIL CODE.
|
||||||
// YOU HAVE BEEN WARNED.
|
// YOU HAVE BEEN WARNED.
|
||||||
func UnsafeString(b []byte) string {
|
func UnsafeString(b []byte) string {
|
||||||
return *(*string)(unsafe.Pointer(&reflect.StringHeader{Data: uintptr(unsafe.Pointer(&b[0])), Len: len(b)}))
|
sh := (*reflect.SliceHeader)(unsafe.Pointer(&b))
|
||||||
|
return *(*string)(unsafe.Pointer(&reflect.StringHeader{Data: sh.Data, Len: sh.Len}))
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnsafeBytes returns the string as a byte slice
|
// UnsafeBytes returns the string as a byte slice
|
||||||
|
|
|
||||||
2
vendor/github.com/tinylib/msgp/msgp/write.go
generated
vendored
2
vendor/github.com/tinylib/msgp/msgp/write.go
generated
vendored
|
|
@ -685,7 +685,7 @@ func (mw *Writer) WriteIntf(v interface{}) error {
|
||||||
case reflect.Map:
|
case reflect.Map:
|
||||||
return mw.writeMap(val)
|
return mw.writeMap(val)
|
||||||
}
|
}
|
||||||
return &ErrUnsupportedType{val.Type()}
|
return &ErrUnsupportedType{T: val.Type()}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mw *Writer) writeMap(v reflect.Value) (err error) {
|
func (mw *Writer) writeMap(v reflect.Value) (err error) {
|
||||||
|
|
|
||||||
2
vendor/github.com/urfave/cli/.flake8
generated
vendored
Normal file
2
vendor/github.com/urfave/cli/.flake8
generated
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
[flake8]
|
||||||
|
max-line-length = 120
|
||||||
28
vendor/github.com/urfave/cli/.travis.yml
generated
vendored
28
vendor/github.com/urfave/cli/.travis.yml
generated
vendored
|
|
@ -1,32 +1,20 @@
|
||||||
language: go
|
language: go
|
||||||
|
|
||||||
sudo: false
|
sudo: false
|
||||||
|
dist: trusty
|
||||||
|
osx_image: xcode8.3
|
||||||
|
go: 1.8.x
|
||||||
|
|
||||||
|
os:
|
||||||
|
- linux
|
||||||
|
- osx
|
||||||
|
|
||||||
cache:
|
cache:
|
||||||
directories:
|
directories:
|
||||||
- node_modules
|
- node_modules
|
||||||
|
|
||||||
go:
|
|
||||||
- 1.2.x
|
|
||||||
- 1.3.x
|
|
||||||
- 1.4.2
|
|
||||||
- 1.5.x
|
|
||||||
- 1.6.x
|
|
||||||
- 1.7.x
|
|
||||||
- master
|
|
||||||
|
|
||||||
matrix:
|
|
||||||
allow_failures:
|
|
||||||
- go: master
|
|
||||||
include:
|
|
||||||
- go: 1.6.x
|
|
||||||
os: osx
|
|
||||||
- go: 1.7.x
|
|
||||||
os: osx
|
|
||||||
|
|
||||||
before_script:
|
before_script:
|
||||||
- go get github.com/urfave/gfmrun/... || true
|
- go get github.com/urfave/gfmrun/... || true
|
||||||
- go get golang.org/x/tools/... || true
|
- go get golang.org/x/tools/cmd/goimports
|
||||||
- if [ ! -f node_modules/.bin/markdown-toc ] ; then
|
- if [ ! -f node_modules/.bin/markdown-toc ] ; then
|
||||||
npm install markdown-toc ;
|
npm install markdown-toc ;
|
||||||
fi
|
fi
|
||||||
|
|
|
||||||
43
vendor/github.com/urfave/cli/CHANGELOG.md
generated
vendored
43
vendor/github.com/urfave/cli/CHANGELOG.md
generated
vendored
|
|
@ -4,6 +4,49 @@
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## 1.20.0 - 2017-08-10
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
* `HandleExitCoder` is now correctly iterates over all errors in
|
||||||
|
a `MultiError`. The exit code is the exit code of the last error or `1` if
|
||||||
|
there are no `ExitCoder`s in the `MultiError`.
|
||||||
|
* Fixed YAML file loading on Windows (previously would fail validate the file path)
|
||||||
|
* Subcommand `Usage`, `Description`, `ArgsUsage`, `OnUsageError` correctly
|
||||||
|
propogated
|
||||||
|
* `ErrWriter` is now passed downwards through command structure to avoid the
|
||||||
|
need to redefine it
|
||||||
|
* Pass `Command` context into `OnUsageError` rather than parent context so that
|
||||||
|
all fields are avaiable
|
||||||
|
* Errors occuring in `Before` funcs are no longer double printed
|
||||||
|
* Use `UsageText` in the help templates for commands and subcommands if
|
||||||
|
defined; otherwise build the usage as before (was previously ignoring this
|
||||||
|
field)
|
||||||
|
* `IsSet` and `GlobalIsSet` now correctly return whether a flag is set if
|
||||||
|
a program calls `Set` or `GlobalSet` directly after flag parsing (would
|
||||||
|
previously only return `true` if the flag was set during parsing)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
* No longer exit the program on command/subcommand error if the error raised is
|
||||||
|
not an `OsExiter`. This exiting behavior was introduced in 1.19.0, but was
|
||||||
|
determined to be a regression in functionality. See [the
|
||||||
|
PR](https://github.com/urfave/cli/pull/595) for discussion.
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
* `CommandsByName` type was added to make it easy to sort `Command`s by name,
|
||||||
|
alphabetically
|
||||||
|
* `altsrc` now handles loading of string and int arrays from TOML
|
||||||
|
* Support for definition of custom help templates for `App` via
|
||||||
|
`CustomAppHelpTemplate`
|
||||||
|
* Support for arbitrary key/value fields on `App` to be used with
|
||||||
|
`CustomAppHelpTemplate` via `ExtraInfo`
|
||||||
|
* `HelpFlag`, `VersionFlag`, and `BashCompletionFlag` changed to explictly be
|
||||||
|
`cli.Flag`s allowing for the use of custom flags satisfying the `cli.Flag`
|
||||||
|
interface to be used.
|
||||||
|
|
||||||
|
|
||||||
## [1.19.1] - 2016-11-21
|
## [1.19.1] - 2016-11-21
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
|
||||||
33
vendor/github.com/urfave/cli/README.md
generated
vendored
33
vendor/github.com/urfave/cli/README.md
generated
vendored
|
|
@ -455,13 +455,13 @@ error.
|
||||||
|
|
||||||
Flags for the application and commands are shown in the order they are defined.
|
Flags for the application and commands are shown in the order they are defined.
|
||||||
However, it's possible to sort them from outside this library by using `FlagsByName`
|
However, it's possible to sort them from outside this library by using `FlagsByName`
|
||||||
with `sort`.
|
or `CommandsByName` with `sort`.
|
||||||
|
|
||||||
For example this:
|
For example this:
|
||||||
|
|
||||||
<!-- {
|
<!-- {
|
||||||
"args": ["--help"],
|
"args": ["--help"],
|
||||||
"output": "Load configuration from FILE\n.*Language for the greeting.*"
|
"output": "add a task to the list\n.*complete a task on the list\n.*\n\n.*\n.*Load configuration from FILE\n.*Language for the greeting.*"
|
||||||
} -->
|
} -->
|
||||||
``` go
|
``` go
|
||||||
package main
|
package main
|
||||||
|
|
@ -488,7 +488,27 @@ func main() {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
app.Commands = []cli.Command{
|
||||||
|
{
|
||||||
|
Name: "complete",
|
||||||
|
Aliases: []string{"c"},
|
||||||
|
Usage: "complete a task on the list",
|
||||||
|
Action: func(c *cli.Context) error {
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "add",
|
||||||
|
Aliases: []string{"a"},
|
||||||
|
Usage: "add a task to the list",
|
||||||
|
Action: func(c *cli.Context) error {
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
sort.Sort(cli.FlagsByName(app.Flags))
|
sort.Sort(cli.FlagsByName(app.Flags))
|
||||||
|
sort.Sort(cli.CommandsByName(app.Commands))
|
||||||
|
|
||||||
app.Run(os.Args)
|
app.Run(os.Args)
|
||||||
}
|
}
|
||||||
|
|
@ -940,16 +960,13 @@ SUPPORT: support@awesometown.example.com
|
||||||
cli.AppHelpTemplate = `NAME:
|
cli.AppHelpTemplate = `NAME:
|
||||||
{{.Name}} - {{.Usage}}
|
{{.Name}} - {{.Usage}}
|
||||||
USAGE:
|
USAGE:
|
||||||
{{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command
|
{{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}
|
||||||
[command options]{{end}} {{if
|
|
||||||
.ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}
|
|
||||||
{{if len .Authors}}
|
{{if len .Authors}}
|
||||||
AUTHOR(S):
|
AUTHOR:
|
||||||
{{range .Authors}}{{ . }}{{end}}
|
{{range .Authors}}{{ . }}{{end}}
|
||||||
{{end}}{{if .Commands}}
|
{{end}}{{if .Commands}}
|
||||||
COMMANDS:
|
COMMANDS:
|
||||||
{{range .Commands}}{{if not .HideHelp}} {{join .Names ", "}}{{ "\t"
|
{{range .Commands}}{{if not .HideHelp}} {{join .Names ", "}}{{ "\t"}}{{.Usage}}{{ "\n" }}{{end}}{{end}}{{end}}{{if .VisibleFlags}}
|
||||||
}}{{.Usage}}{{ "\n" }}{{end}}{{end}}{{end}}{{if .VisibleFlags}}
|
|
||||||
GLOBAL OPTIONS:
|
GLOBAL OPTIONS:
|
||||||
{{range .VisibleFlags}}{{.}}
|
{{range .VisibleFlags}}{{.}}
|
||||||
{{end}}{{end}}{{if .Copyright }}
|
{{end}}{{end}}{{if .Copyright }}
|
||||||
|
|
|
||||||
7
vendor/github.com/urfave/cli/app.go
generated
vendored
7
vendor/github.com/urfave/cli/app.go
generated
vendored
|
|
@ -85,6 +85,12 @@ type App struct {
|
||||||
ErrWriter io.Writer
|
ErrWriter io.Writer
|
||||||
// Other custom info
|
// Other custom info
|
||||||
Metadata map[string]interface{}
|
Metadata map[string]interface{}
|
||||||
|
// Carries a function which returns app specific info.
|
||||||
|
ExtraInfo func() map[string]string
|
||||||
|
// CustomAppHelpTemplate the text template for app help topic.
|
||||||
|
// cli.go uses text/template to render templates. You can
|
||||||
|
// render custom help text by setting this variable.
|
||||||
|
CustomAppHelpTemplate string
|
||||||
|
|
||||||
didSetup bool
|
didSetup bool
|
||||||
}
|
}
|
||||||
|
|
@ -234,7 +240,6 @@ func (a *App) Run(arguments []string) (err error) {
|
||||||
if a.Before != nil {
|
if a.Before != nil {
|
||||||
beforeErr := a.Before(context)
|
beforeErr := a.Before(context)
|
||||||
if beforeErr != nil {
|
if beforeErr != nil {
|
||||||
fmt.Fprintf(a.Writer, "%v\n\n", beforeErr)
|
|
||||||
ShowAppHelp(context)
|
ShowAppHelp(context)
|
||||||
HandleExitCoder(beforeErr)
|
HandleExitCoder(beforeErr)
|
||||||
err = beforeErr
|
err = beforeErr
|
||||||
|
|
|
||||||
10
vendor/github.com/urfave/cli/appveyor.yml
generated
vendored
10
vendor/github.com/urfave/cli/appveyor.yml
generated
vendored
|
|
@ -1,14 +1,16 @@
|
||||||
version: "{build}"
|
version: "{build}"
|
||||||
|
|
||||||
os: Windows Server 2012 R2
|
os: Windows Server 2016
|
||||||
|
|
||||||
|
image: Visual Studio 2017
|
||||||
|
|
||||||
clone_folder: c:\gopath\src\github.com\urfave\cli
|
clone_folder: c:\gopath\src\github.com\urfave\cli
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
GOPATH: C:\gopath
|
GOPATH: C:\gopath
|
||||||
GOVERSION: 1.6
|
GOVERSION: 1.8.x
|
||||||
PYTHON: C:\Python27-x64
|
PYTHON: C:\Python36-x64
|
||||||
PYTHON_VERSION: 2.7.x
|
PYTHON_VERSION: 3.6.x
|
||||||
PYTHON_ARCH: 64
|
PYTHON_ARCH: 64
|
||||||
|
|
||||||
install:
|
install:
|
||||||
|
|
|
||||||
1
vendor/github.com/urfave/cli/cli.go
generated
vendored
1
vendor/github.com/urfave/cli/cli.go
generated
vendored
|
|
@ -12,6 +12,7 @@
|
||||||
// app.Usage = "say a greeting"
|
// app.Usage = "say a greeting"
|
||||||
// app.Action = func(c *cli.Context) error {
|
// app.Action = func(c *cli.Context) error {
|
||||||
// println("Greetings")
|
// println("Greetings")
|
||||||
|
// return nil
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// app.Run(os.Args)
|
// app.Run(os.Args)
|
||||||
|
|
|
||||||
44
vendor/github.com/urfave/cli/command.go
generated
vendored
44
vendor/github.com/urfave/cli/command.go
generated
vendored
|
|
@ -59,6 +59,25 @@ type Command struct {
|
||||||
// Full name of command for help, defaults to full command name, including parent commands.
|
// Full name of command for help, defaults to full command name, including parent commands.
|
||||||
HelpName string
|
HelpName string
|
||||||
commandNamePath []string
|
commandNamePath []string
|
||||||
|
|
||||||
|
// CustomHelpTemplate the text template for the command help topic.
|
||||||
|
// cli.go uses text/template to render templates. You can
|
||||||
|
// render custom help text by setting this variable.
|
||||||
|
CustomHelpTemplate string
|
||||||
|
}
|
||||||
|
|
||||||
|
type CommandsByName []Command
|
||||||
|
|
||||||
|
func (c CommandsByName) Len() int {
|
||||||
|
return len(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c CommandsByName) Less(i, j int) bool {
|
||||||
|
return c[i].Name < c[j].Name
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c CommandsByName) Swap(i, j int) {
|
||||||
|
c[i], c[j] = c[j], c[i]
|
||||||
}
|
}
|
||||||
|
|
||||||
// FullName returns the full name of the command.
|
// FullName returns the full name of the command.
|
||||||
|
|
@ -140,19 +159,20 @@ func (c Command) Run(ctx *Context) (err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
context := NewContext(ctx.App, set, ctx)
|
context := NewContext(ctx.App, set, ctx)
|
||||||
|
context.Command = c
|
||||||
if checkCommandCompletions(context, c.Name) {
|
if checkCommandCompletions(context, c.Name) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if c.OnUsageError != nil {
|
if c.OnUsageError != nil {
|
||||||
err := c.OnUsageError(ctx, err, false)
|
err := c.OnUsageError(context, err, false)
|
||||||
HandleExitCoder(err)
|
HandleExitCoder(err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
fmt.Fprintln(ctx.App.Writer, "Incorrect Usage:", err.Error())
|
fmt.Fprintln(context.App.Writer, "Incorrect Usage:", err.Error())
|
||||||
fmt.Fprintln(ctx.App.Writer)
|
fmt.Fprintln(context.App.Writer)
|
||||||
ShowCommandHelp(ctx, c.Name)
|
ShowCommandHelp(context, c.Name)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -177,9 +197,7 @@ func (c Command) Run(ctx *Context) (err error) {
|
||||||
if c.Before != nil {
|
if c.Before != nil {
|
||||||
err = c.Before(context)
|
err = c.Before(context)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintln(ctx.App.Writer, err)
|
ShowCommandHelp(context, c.Name)
|
||||||
fmt.Fprintln(ctx.App.Writer)
|
|
||||||
ShowCommandHelp(ctx, c.Name)
|
|
||||||
HandleExitCoder(err)
|
HandleExitCoder(err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -189,7 +207,6 @@ func (c Command) Run(ctx *Context) (err error) {
|
||||||
c.Action = helpSubcommand.Action
|
c.Action = helpSubcommand.Action
|
||||||
}
|
}
|
||||||
|
|
||||||
context.Command = c
|
|
||||||
err = HandleAction(c.Action, context)
|
err = HandleAction(c.Action, context)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -230,14 +247,13 @@ func (c Command) startApp(ctx *Context) error {
|
||||||
app.HelpName = app.Name
|
app.HelpName = app.Name
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.Description != "" {
|
app.Usage = c.Usage
|
||||||
app.Usage = c.Description
|
app.Description = c.Description
|
||||||
} else {
|
app.ArgsUsage = c.ArgsUsage
|
||||||
app.Usage = c.Usage
|
|
||||||
}
|
|
||||||
|
|
||||||
// set CommandNotFound
|
// set CommandNotFound
|
||||||
app.CommandNotFound = ctx.App.CommandNotFound
|
app.CommandNotFound = ctx.App.CommandNotFound
|
||||||
|
app.CustomAppHelpTemplate = c.CustomHelpTemplate
|
||||||
|
|
||||||
// set the flags and commands
|
// set the flags and commands
|
||||||
app.Commands = c.Subcommands
|
app.Commands = c.Subcommands
|
||||||
|
|
@ -250,6 +266,7 @@ func (c Command) startApp(ctx *Context) error {
|
||||||
app.Author = ctx.App.Author
|
app.Author = ctx.App.Author
|
||||||
app.Email = ctx.App.Email
|
app.Email = ctx.App.Email
|
||||||
app.Writer = ctx.App.Writer
|
app.Writer = ctx.App.Writer
|
||||||
|
app.ErrWriter = ctx.App.ErrWriter
|
||||||
|
|
||||||
app.categories = CommandCategories{}
|
app.categories = CommandCategories{}
|
||||||
for _, command := range c.Subcommands {
|
for _, command := range c.Subcommands {
|
||||||
|
|
@ -272,6 +289,7 @@ func (c Command) startApp(ctx *Context) error {
|
||||||
} else {
|
} else {
|
||||||
app.Action = helpSubcommand.Action
|
app.Action = helpSubcommand.Action
|
||||||
}
|
}
|
||||||
|
app.OnUsageError = c.OnUsageError
|
||||||
|
|
||||||
for index, cc := range app.Commands {
|
for index, cc := range app.Commands {
|
||||||
app.Commands[index].commandNamePath = []string{c.Name, cc.Name}
|
app.Commands[index].commandNamePath = []string{c.Name, cc.Name}
|
||||||
|
|
|
||||||
2
vendor/github.com/urfave/cli/context.go
generated
vendored
2
vendor/github.com/urfave/cli/context.go
generated
vendored
|
|
@ -39,11 +39,13 @@ func (c *Context) NumFlags() int {
|
||||||
|
|
||||||
// Set sets a context flag to a value.
|
// Set sets a context flag to a value.
|
||||||
func (c *Context) Set(name, value string) error {
|
func (c *Context) Set(name, value string) error {
|
||||||
|
c.setFlags = nil
|
||||||
return c.flagSet.Set(name, value)
|
return c.flagSet.Set(name, value)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GlobalSet sets a context flag to a value on the global flagset
|
// GlobalSet sets a context flag to a value on the global flagset
|
||||||
func (c *Context) GlobalSet(name, value string) error {
|
func (c *Context) GlobalSet(name, value string) error {
|
||||||
|
globalContext(c).setFlags = nil
|
||||||
return globalContext(c).flagSet.Set(name, value)
|
return globalContext(c).flagSet.Set(name, value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
23
vendor/github.com/urfave/cli/errors.go
generated
vendored
23
vendor/github.com/urfave/cli/errors.go
generated
vendored
|
|
@ -74,7 +74,7 @@ func (ee *ExitError) ExitCode() int {
|
||||||
// HandleExitCoder checks if the error fulfills the ExitCoder interface, and if
|
// HandleExitCoder checks if the error fulfills the ExitCoder interface, and if
|
||||||
// so prints the error to stderr (if it is non-empty) and calls OsExiter with the
|
// so prints the error to stderr (if it is non-empty) and calls OsExiter with the
|
||||||
// given exit code. If the given error is a MultiError, then this func is
|
// given exit code. If the given error is a MultiError, then this func is
|
||||||
// called on all members of the Errors slice.
|
// called on all members of the Errors slice and calls OsExiter with the last exit code.
|
||||||
func HandleExitCoder(err error) {
|
func HandleExitCoder(err error) {
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return
|
return
|
||||||
|
|
@ -93,18 +93,23 @@ func HandleExitCoder(err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if multiErr, ok := err.(MultiError); ok {
|
if multiErr, ok := err.(MultiError); ok {
|
||||||
for _, merr := range multiErr.Errors {
|
code := handleMultiError(multiErr)
|
||||||
HandleExitCoder(merr)
|
OsExiter(code)
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if err.Error() != "" {
|
func handleMultiError(multiErr MultiError) int {
|
||||||
if _, ok := err.(ErrorFormatter); ok {
|
code := 1
|
||||||
fmt.Fprintf(ErrWriter, "%+v\n", err)
|
for _, merr := range multiErr.Errors {
|
||||||
|
if multiErr2, ok := merr.(MultiError); ok {
|
||||||
|
code = handleMultiError(multiErr2)
|
||||||
} else {
|
} else {
|
||||||
fmt.Fprintln(ErrWriter, err)
|
fmt.Fprintln(ErrWriter, merr)
|
||||||
|
if exitErr, ok := merr.(ExitCoder); ok {
|
||||||
|
code = exitErr.ExitCode()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
OsExiter(1)
|
return code
|
||||||
}
|
}
|
||||||
|
|
|
||||||
12
vendor/github.com/urfave/cli/flag.go
generated
vendored
12
vendor/github.com/urfave/cli/flag.go
generated
vendored
|
|
@ -14,13 +14,13 @@ import (
|
||||||
const defaultPlaceholder = "value"
|
const defaultPlaceholder = "value"
|
||||||
|
|
||||||
// BashCompletionFlag enables bash-completion for all commands and subcommands
|
// BashCompletionFlag enables bash-completion for all commands and subcommands
|
||||||
var BashCompletionFlag = BoolFlag{
|
var BashCompletionFlag Flag = BoolFlag{
|
||||||
Name: "generate-bash-completion",
|
Name: "generate-bash-completion",
|
||||||
Hidden: true,
|
Hidden: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
// VersionFlag prints the version for the application
|
// VersionFlag prints the version for the application
|
||||||
var VersionFlag = BoolFlag{
|
var VersionFlag Flag = BoolFlag{
|
||||||
Name: "version, v",
|
Name: "version, v",
|
||||||
Usage: "print the version",
|
Usage: "print the version",
|
||||||
}
|
}
|
||||||
|
|
@ -28,7 +28,7 @@ var VersionFlag = BoolFlag{
|
||||||
// HelpFlag prints the help for all commands and subcommands
|
// HelpFlag prints the help for all commands and subcommands
|
||||||
// Set to the zero value (BoolFlag{}) to disable flag -- keeps subcommand
|
// Set to the zero value (BoolFlag{}) to disable flag -- keeps subcommand
|
||||||
// unless HideHelp is set to true)
|
// unless HideHelp is set to true)
|
||||||
var HelpFlag = BoolFlag{
|
var HelpFlag Flag = BoolFlag{
|
||||||
Name: "help, h",
|
Name: "help, h",
|
||||||
Usage: "show help",
|
Usage: "show help",
|
||||||
}
|
}
|
||||||
|
|
@ -630,7 +630,8 @@ func (f Float64Flag) ApplyWithError(set *flag.FlagSet) error {
|
||||||
func visibleFlags(fl []Flag) []Flag {
|
func visibleFlags(fl []Flag) []Flag {
|
||||||
visible := []Flag{}
|
visible := []Flag{}
|
||||||
for _, flag := range fl {
|
for _, flag := range fl {
|
||||||
if !flagValue(flag).FieldByName("Hidden").Bool() {
|
field := flagValue(flag).FieldByName("Hidden")
|
||||||
|
if !field.IsValid() || !field.Bool() {
|
||||||
visible = append(visible, flag)
|
visible = append(visible, flag)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -723,9 +724,8 @@ func stringifyFlag(f Flag) string {
|
||||||
|
|
||||||
needsPlaceholder := false
|
needsPlaceholder := false
|
||||||
defaultValueString := ""
|
defaultValueString := ""
|
||||||
val := fv.FieldByName("Value")
|
|
||||||
|
|
||||||
if val.IsValid() {
|
if val := fv.FieldByName("Value"); val.IsValid() {
|
||||||
needsPlaceholder = true
|
needsPlaceholder = true
|
||||||
defaultValueString = fmt.Sprintf(" (default: %v)", val.Interface())
|
defaultValueString = fmt.Sprintf(" (default: %v)", val.Interface())
|
||||||
|
|
||||||
|
|
|
||||||
68
vendor/github.com/urfave/cli/help.go
generated
vendored
68
vendor/github.com/urfave/cli/help.go
generated
vendored
|
|
@ -47,7 +47,7 @@ var CommandHelpTemplate = `NAME:
|
||||||
{{.HelpName}} - {{.Usage}}
|
{{.HelpName}} - {{.Usage}}
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
{{.HelpName}}{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{if .Category}}
|
{{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}}{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Category}}
|
||||||
|
|
||||||
CATEGORY:
|
CATEGORY:
|
||||||
{{.Category}}{{end}}{{if .Description}}
|
{{.Category}}{{end}}{{if .Description}}
|
||||||
|
|
@ -64,10 +64,10 @@ OPTIONS:
|
||||||
// cli.go uses text/template to render templates. You can
|
// cli.go uses text/template to render templates. You can
|
||||||
// render custom help text by setting this variable.
|
// render custom help text by setting this variable.
|
||||||
var SubcommandHelpTemplate = `NAME:
|
var SubcommandHelpTemplate = `NAME:
|
||||||
{{.HelpName}} - {{.Usage}}
|
{{.HelpName}} - {{if .Description}}{{.Description}}{{else}}{{.Usage}}{{end}}
|
||||||
|
|
||||||
USAGE:
|
USAGE:
|
||||||
{{.HelpName}} command{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}
|
{{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} command{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}
|
||||||
|
|
||||||
COMMANDS:{{range .VisibleCategories}}{{if .Name}}
|
COMMANDS:{{range .VisibleCategories}}{{if .Name}}
|
||||||
{{.Name}}:{{end}}{{range .VisibleCommands}}
|
{{.Name}}:{{end}}{{range .VisibleCommands}}
|
||||||
|
|
@ -112,17 +112,42 @@ var helpSubcommand = Command{
|
||||||
// Prints help for the App or Command
|
// Prints help for the App or Command
|
||||||
type helpPrinter func(w io.Writer, templ string, data interface{})
|
type helpPrinter func(w io.Writer, templ string, data interface{})
|
||||||
|
|
||||||
|
// Prints help for the App or Command with custom template function.
|
||||||
|
type helpPrinterCustom func(w io.Writer, templ string, data interface{}, customFunc map[string]interface{})
|
||||||
|
|
||||||
// HelpPrinter is a function that writes the help output. If not set a default
|
// HelpPrinter is a function that writes the help output. If not set a default
|
||||||
// is used. The function signature is:
|
// is used. The function signature is:
|
||||||
// func(w io.Writer, templ string, data interface{})
|
// func(w io.Writer, templ string, data interface{})
|
||||||
var HelpPrinter helpPrinter = printHelp
|
var HelpPrinter helpPrinter = printHelp
|
||||||
|
|
||||||
|
// HelpPrinterCustom is same as HelpPrinter but
|
||||||
|
// takes a custom function for template function map.
|
||||||
|
var HelpPrinterCustom helpPrinterCustom = printHelpCustom
|
||||||
|
|
||||||
// VersionPrinter prints the version for the App
|
// VersionPrinter prints the version for the App
|
||||||
var VersionPrinter = printVersion
|
var VersionPrinter = printVersion
|
||||||
|
|
||||||
|
// ShowAppHelpAndExit - Prints the list of subcommands for the app and exits with exit code.
|
||||||
|
func ShowAppHelpAndExit(c *Context, exitCode int) {
|
||||||
|
ShowAppHelp(c)
|
||||||
|
os.Exit(exitCode)
|
||||||
|
}
|
||||||
|
|
||||||
// ShowAppHelp is an action that displays the help.
|
// ShowAppHelp is an action that displays the help.
|
||||||
func ShowAppHelp(c *Context) error {
|
func ShowAppHelp(c *Context) (err error) {
|
||||||
HelpPrinter(c.App.Writer, AppHelpTemplate, c.App)
|
if c.App.CustomAppHelpTemplate == "" {
|
||||||
|
HelpPrinter(c.App.Writer, AppHelpTemplate, c.App)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
customAppData := func() map[string]interface{} {
|
||||||
|
if c.App.ExtraInfo == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return map[string]interface{}{
|
||||||
|
"ExtraInfo": c.App.ExtraInfo,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
HelpPrinterCustom(c.App.Writer, c.App.CustomAppHelpTemplate, c.App, customAppData())
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -138,6 +163,12 @@ func DefaultAppComplete(c *Context) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ShowCommandHelpAndExit - exits with code after showing help
|
||||||
|
func ShowCommandHelpAndExit(c *Context, command string, code int) {
|
||||||
|
ShowCommandHelp(c, command)
|
||||||
|
os.Exit(code)
|
||||||
|
}
|
||||||
|
|
||||||
// ShowCommandHelp prints help for the given command
|
// ShowCommandHelp prints help for the given command
|
||||||
func ShowCommandHelp(ctx *Context, command string) error {
|
func ShowCommandHelp(ctx *Context, command string) error {
|
||||||
// show the subcommand help for a command with subcommands
|
// show the subcommand help for a command with subcommands
|
||||||
|
|
@ -148,7 +179,11 @@ func ShowCommandHelp(ctx *Context, command string) error {
|
||||||
|
|
||||||
for _, c := range ctx.App.Commands {
|
for _, c := range ctx.App.Commands {
|
||||||
if c.HasName(command) {
|
if c.HasName(command) {
|
||||||
HelpPrinter(ctx.App.Writer, CommandHelpTemplate, c)
|
if c.CustomHelpTemplate != "" {
|
||||||
|
HelpPrinterCustom(ctx.App.Writer, c.CustomHelpTemplate, c, nil)
|
||||||
|
} else {
|
||||||
|
HelpPrinter(ctx.App.Writer, CommandHelpTemplate, c)
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -191,10 +226,15 @@ func ShowCommandCompletions(ctx *Context, command string) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func printHelp(out io.Writer, templ string, data interface{}) {
|
func printHelpCustom(out io.Writer, templ string, data interface{}, customFunc map[string]interface{}) {
|
||||||
funcMap := template.FuncMap{
|
funcMap := template.FuncMap{
|
||||||
"join": strings.Join,
|
"join": strings.Join,
|
||||||
}
|
}
|
||||||
|
if customFunc != nil {
|
||||||
|
for key, value := range customFunc {
|
||||||
|
funcMap[key] = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
w := tabwriter.NewWriter(out, 1, 8, 2, ' ', 0)
|
w := tabwriter.NewWriter(out, 1, 8, 2, ' ', 0)
|
||||||
t := template.Must(template.New("help").Funcs(funcMap).Parse(templ))
|
t := template.Must(template.New("help").Funcs(funcMap).Parse(templ))
|
||||||
|
|
@ -210,10 +250,14 @@ func printHelp(out io.Writer, templ string, data interface{}) {
|
||||||
w.Flush()
|
w.Flush()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func printHelp(out io.Writer, templ string, data interface{}) {
|
||||||
|
printHelpCustom(out, templ, data, nil)
|
||||||
|
}
|
||||||
|
|
||||||
func checkVersion(c *Context) bool {
|
func checkVersion(c *Context) bool {
|
||||||
found := false
|
found := false
|
||||||
if VersionFlag.Name != "" {
|
if VersionFlag.GetName() != "" {
|
||||||
eachName(VersionFlag.Name, func(name string) {
|
eachName(VersionFlag.GetName(), func(name string) {
|
||||||
if c.GlobalBool(name) || c.Bool(name) {
|
if c.GlobalBool(name) || c.Bool(name) {
|
||||||
found = true
|
found = true
|
||||||
}
|
}
|
||||||
|
|
@ -224,8 +268,8 @@ func checkVersion(c *Context) bool {
|
||||||
|
|
||||||
func checkHelp(c *Context) bool {
|
func checkHelp(c *Context) bool {
|
||||||
found := false
|
found := false
|
||||||
if HelpFlag.Name != "" {
|
if HelpFlag.GetName() != "" {
|
||||||
eachName(HelpFlag.Name, func(name string) {
|
eachName(HelpFlag.GetName(), func(name string) {
|
||||||
if c.GlobalBool(name) || c.Bool(name) {
|
if c.GlobalBool(name) || c.Bool(name) {
|
||||||
found = true
|
found = true
|
||||||
}
|
}
|
||||||
|
|
@ -260,7 +304,7 @@ func checkShellCompleteFlag(a *App, arguments []string) (bool, []string) {
|
||||||
pos := len(arguments) - 1
|
pos := len(arguments) - 1
|
||||||
lastArg := arguments[pos]
|
lastArg := arguments[pos]
|
||||||
|
|
||||||
if lastArg != "--"+BashCompletionFlag.Name {
|
if lastArg != "--"+BashCompletionFlag.GetName() {
|
||||||
return false, arguments
|
return false, arguments
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
5
vendor/github.com/willf/bitset/.travis.yml
generated
vendored
5
vendor/github.com/willf/bitset/.travis.yml
generated
vendored
|
|
@ -12,8 +12,7 @@ branches:
|
||||||
- travis
|
- travis
|
||||||
|
|
||||||
go:
|
go:
|
||||||
- "1.9.x"
|
- "1.11.x"
|
||||||
- "1.10.x"
|
|
||||||
- tip
|
- tip
|
||||||
|
|
||||||
matrix:
|
matrix:
|
||||||
|
|
@ -35,4 +34,4 @@ after_failure:
|
||||||
- cat ./target/test/report.xml
|
- cat ./target/test/report.xml
|
||||||
|
|
||||||
after_success:
|
after_success:
|
||||||
- if [ "$TRAVIS_GO_VERSION" = "1.8" ]; then $HOME/gopath/bin/goveralls -covermode=count -coverprofile=target/report/coverage.out -service=travis-ci; fi;
|
- if [ "$TRAVIS_GO_VERSION" = "1.11.1" ]; then $HOME/gopath/bin/goveralls -covermode=count -coverprofile=target/report/coverage.out -service=travis-ci; fi;
|
||||||
|
|
|
||||||
8
vendor/github.com/willf/bitset/Makefile
generated
vendored
8
vendor/github.com/willf/bitset/Makefile
generated
vendored
|
|
@ -158,7 +158,7 @@ gosimple:
|
||||||
# AST scanner
|
# AST scanner
|
||||||
astscan:
|
astscan:
|
||||||
@mkdir -p target/report
|
@mkdir -p target/report
|
||||||
GOPATH=$(GOPATH) gas .//*.go | tee target/report/astscan.txt ; test $${PIPESTATUS[0]} -eq 0
|
GOPATH=$(GOPATH) gosec . | tee target/report/astscan.txt ; test $${PIPESTATUS[0]} -eq 0 || true
|
||||||
|
|
||||||
# Generate source docs
|
# Generate source docs
|
||||||
docs:
|
docs:
|
||||||
|
|
@ -168,14 +168,14 @@ docs:
|
||||||
@echo '<html><head><meta http-equiv="refresh" content="0;./127.0.0.1:6060/pkg/'${CVSPATH}'/'${PROJECT}'/index.html"/></head><a href="./127.0.0.1:6060/pkg/'${CVSPATH}'/'${PROJECT}'/index.html">'${PKGNAME}' Documentation ...</a></html>' > target/docs/index.html
|
@echo '<html><head><meta http-equiv="refresh" content="0;./127.0.0.1:6060/pkg/'${CVSPATH}'/'${PROJECT}'/index.html"/></head><a href="./127.0.0.1:6060/pkg/'${CVSPATH}'/'${PROJECT}'/index.html">'${PKGNAME}' Documentation ...</a></html>' > target/docs/index.html
|
||||||
|
|
||||||
# Alias to run all quality-assurance checks
|
# Alias to run all quality-assurance checks
|
||||||
qa: fmtcheck test vet lint coverage cyclo ineffassign misspell structcheck varcheck errcheck gosimple
|
qa: fmtcheck test vet lint coverage cyclo ineffassign misspell structcheck varcheck errcheck gosimple astscan
|
||||||
|
|
||||||
# --- INSTALL ---
|
# --- INSTALL ---
|
||||||
|
|
||||||
# Get the dependencies
|
# Get the dependencies
|
||||||
deps:
|
deps:
|
||||||
GOPATH=$(GOPATH) go get ./...
|
GOPATH=$(GOPATH) go get ./...
|
||||||
GOPATH=$(GOPATH) go get github.com/golang/lint/golint
|
GOPATH=$(GOPATH) go get golang.org/x/lint/golint
|
||||||
GOPATH=$(GOPATH) go get github.com/jstemmer/go-junit-report
|
GOPATH=$(GOPATH) go get github.com/jstemmer/go-junit-report
|
||||||
GOPATH=$(GOPATH) go get github.com/axw/gocov/gocov
|
GOPATH=$(GOPATH) go get github.com/axw/gocov/gocov
|
||||||
GOPATH=$(GOPATH) go get github.com/fzipp/gocyclo
|
GOPATH=$(GOPATH) go get github.com/fzipp/gocyclo
|
||||||
|
|
@ -185,7 +185,7 @@ deps:
|
||||||
GOPATH=$(GOPATH) go get github.com/opennota/check/cmd/varcheck
|
GOPATH=$(GOPATH) go get github.com/opennota/check/cmd/varcheck
|
||||||
GOPATH=$(GOPATH) go get github.com/kisielk/errcheck
|
GOPATH=$(GOPATH) go get github.com/kisielk/errcheck
|
||||||
GOPATH=$(GOPATH) go get honnef.co/go/tools/cmd/gosimple
|
GOPATH=$(GOPATH) go get honnef.co/go/tools/cmd/gosimple
|
||||||
GOPATH=$(GOPATH) go get github.com/GoASTScanner/gas
|
GOPATH=$(GOPATH) go get github.com/securego/gosec/cmd/gosec/...
|
||||||
|
|
||||||
# Remove any build artifact
|
# Remove any build artifact
|
||||||
clean:
|
clean:
|
||||||
|
|
|
||||||
1
vendor/github.com/willf/bitset/VERSION
generated
vendored
1
vendor/github.com/willf/bitset/VERSION
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
1.1.3
|
|
||||||
112
vendor/github.com/willf/bitset/bitset.go
generated
vendored
112
vendor/github.com/willf/bitset/bitset.go
generated
vendored
|
|
@ -62,12 +62,12 @@ const allBits uint64 = 0xffffffffffffffff
|
||||||
var binaryOrder binary.ByteOrder = binary.BigEndian
|
var binaryOrder binary.ByteOrder = binary.BigEndian
|
||||||
|
|
||||||
// default json encoding base64.URLEncoding
|
// default json encoding base64.URLEncoding
|
||||||
var base64Encoding *base64.Encoding = base64.URLEncoding
|
var base64Encoding = base64.URLEncoding
|
||||||
|
|
||||||
// Marshal/Unmarshal BitSet with base64.StdEncoding(Default: base64.URLEncoding)
|
// Base64StdEncoding Marshal/Unmarshal BitSet with base64.StdEncoding(Default: base64.URLEncoding)
|
||||||
func Base64StdEncoding() { base64Encoding = base64.StdEncoding }
|
func Base64StdEncoding() { base64Encoding = base64.StdEncoding }
|
||||||
|
|
||||||
// Marshal/Unmarshal Binary as Little Endian(Default: binary.BigEndian)
|
// LittleEndian Marshal/Unmarshal Binary as Little Endian(Default: binary.BigEndian)
|
||||||
func LittleEndian() { binaryOrder = binary.LittleEndian }
|
func LittleEndian() { binaryOrder = binary.LittleEndian }
|
||||||
|
|
||||||
// A BitSet is a set of bits. The zero value of a BitSet is an empty set of length 0.
|
// A BitSet is a set of bits. The zero value of a BitSet is an empty set of length 0.
|
||||||
|
|
@ -192,6 +192,70 @@ func (b *BitSet) Flip(i uint) *BitSet {
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Shrink shrinks BitSet to desired length in bits. It clears all bits > length
|
||||||
|
// and reduces the size and length of the set.
|
||||||
|
//
|
||||||
|
// A new slice is allocated to store the new bits, so you may see an increase in
|
||||||
|
// memory usage until the GC runs. Normally this should not be a problem, but if you
|
||||||
|
// have an extremely large BitSet its important to understand that the old BitSet will
|
||||||
|
// remain in memory until the GC frees it.
|
||||||
|
func (b *BitSet) Shrink(length uint) *BitSet {
|
||||||
|
idx := wordsNeeded(length + 1)
|
||||||
|
if idx > len(b.set) {
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
shrunk := make([]uint64, idx)
|
||||||
|
copy(shrunk, b.set[:idx])
|
||||||
|
b.set = shrunk
|
||||||
|
b.length = length + 1
|
||||||
|
b.set[idx-1] &= (allBits >> (uint64(64) - uint64(length&(wordSize-1)) - 1))
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// InsertAt takes an index which indicates where a bit should be
|
||||||
|
// inserted. Then it shifts all the bits in the set to the left by 1, starting
|
||||||
|
// from the given index position, and sets the index position to 0.
|
||||||
|
//
|
||||||
|
// Depending on the size of your BitSet, and where you are inserting the new entry,
|
||||||
|
// this method could be extremely slow and in some cases might cause the entire BitSet
|
||||||
|
// to be recopied.
|
||||||
|
func (b *BitSet) InsertAt(idx uint) *BitSet {
|
||||||
|
insertAtElement := (idx >> log2WordSize)
|
||||||
|
|
||||||
|
// if length of set is a multiple of wordSize we need to allocate more space first
|
||||||
|
if b.isLenExactMultiple() {
|
||||||
|
b.set = append(b.set, uint64(0))
|
||||||
|
}
|
||||||
|
|
||||||
|
var i uint
|
||||||
|
for i = uint(len(b.set) - 1); i > insertAtElement; i-- {
|
||||||
|
// all elements above the position where we want to insert can simply by shifted
|
||||||
|
b.set[i] <<= 1
|
||||||
|
|
||||||
|
// we take the most significant bit of the previous element and set it as
|
||||||
|
// the least significant bit of the current element
|
||||||
|
b.set[i] |= (b.set[i-1] & 0x8000000000000000) >> 63
|
||||||
|
}
|
||||||
|
|
||||||
|
// generate a mask to extract the data that we need to shift left
|
||||||
|
// within the element where we insert a bit
|
||||||
|
dataMask := ^(uint64(1)<<uint64(idx&(wordSize-1)) - 1)
|
||||||
|
|
||||||
|
// extract that data that we'll shift
|
||||||
|
data := b.set[i] & dataMask
|
||||||
|
|
||||||
|
// set the positions of the data mask to 0 in the element where we insert
|
||||||
|
b.set[i] &= ^dataMask
|
||||||
|
|
||||||
|
// shift data mask to the left and insert its data to the slice element
|
||||||
|
b.set[i] |= data << 1
|
||||||
|
|
||||||
|
// add 1 to length of BitSet
|
||||||
|
b.length++
|
||||||
|
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
// String creates a string representation of the Bitmap
|
// String creates a string representation of the Bitmap
|
||||||
func (b *BitSet) String() string {
|
func (b *BitSet) String() string {
|
||||||
// follows code from https://github.com/RoaringBitmap/roaring
|
// follows code from https://github.com/RoaringBitmap/roaring
|
||||||
|
|
@ -217,6 +281,43 @@ func (b *BitSet) String() string {
|
||||||
return buffer.String()
|
return buffer.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DeleteAt deletes the bit at the given index position from
|
||||||
|
// within the bitset
|
||||||
|
// All the bits residing on the left of the deleted bit get
|
||||||
|
// shifted right by 1
|
||||||
|
// The running time of this operation may potentially be
|
||||||
|
// relatively slow, O(length)
|
||||||
|
func (b *BitSet) DeleteAt(i uint) *BitSet {
|
||||||
|
// the index of the slice element where we'll delete a bit
|
||||||
|
deleteAtElement := i >> log2WordSize
|
||||||
|
|
||||||
|
// generate a mask for the data that needs to be shifted right
|
||||||
|
// within that slice element that gets modified
|
||||||
|
dataMask := ^((uint64(1) << (i & (wordSize - 1))) - 1)
|
||||||
|
|
||||||
|
// extract the data that we'll shift right from the slice element
|
||||||
|
data := b.set[deleteAtElement] & dataMask
|
||||||
|
|
||||||
|
// set the masked area to 0 while leaving the rest as it is
|
||||||
|
b.set[deleteAtElement] &= ^dataMask
|
||||||
|
|
||||||
|
// shift the previously extracted data to the right and then
|
||||||
|
// set it in the previously masked area
|
||||||
|
b.set[deleteAtElement] |= (data >> 1) & dataMask
|
||||||
|
|
||||||
|
// loop over all the consecutive slice elements to copy each
|
||||||
|
// lowest bit into the highest position of the previous element,
|
||||||
|
// then shift the entire content to the right by 1
|
||||||
|
for i := int(deleteAtElement) + 1; i < len(b.set); i++ {
|
||||||
|
b.set[i-1] |= (b.set[i] & 1) << 63
|
||||||
|
b.set[i] >>= 1
|
||||||
|
}
|
||||||
|
|
||||||
|
b.length = b.length - 1
|
||||||
|
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
// NextSet returns the next bit set from the specified index,
|
// NextSet returns the next bit set from the specified index,
|
||||||
// including possibly the current index
|
// including possibly the current index
|
||||||
// along with an error code (true = valid, false = no set bit found)
|
// along with an error code (true = valid, false = no set bit found)
|
||||||
|
|
@ -293,9 +394,8 @@ func (b *BitSet) NextSetMany(i uint, buffer []uint) (uint, []uint) {
|
||||||
End:
|
End:
|
||||||
if size > 0 {
|
if size > 0 {
|
||||||
return myanswer[size-1], myanswer[:size]
|
return myanswer[size-1], myanswer[:size]
|
||||||
} else {
|
|
||||||
return 0, myanswer[:0]
|
|
||||||
}
|
}
|
||||||
|
return 0, myanswer[:0]
|
||||||
}
|
}
|
||||||
|
|
||||||
// NextClear returns the next clear bit from the specified index,
|
// NextClear returns the next clear bit from the specified index,
|
||||||
|
|
@ -672,7 +772,7 @@ func (b *BitSet) DumpAsBits() string {
|
||||||
for ; i >= 0; i-- {
|
for ; i >= 0; i-- {
|
||||||
fmt.Fprintf(buffer, "%064b.", b.set[i])
|
fmt.Fprintf(buffer, "%064b.", b.set[i])
|
||||||
}
|
}
|
||||||
return string(buffer.Bytes())
|
return buffer.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
// BinaryStorageSize returns the binary storage requirements
|
// BinaryStorageSize returns the binary storage requirements
|
||||||
|
|
|
||||||
2
vendor/golang.org/x/crypto/AUTHORS
generated
vendored
2
vendor/golang.org/x/crypto/AUTHORS
generated
vendored
|
|
@ -1,3 +1,3 @@
|
||||||
# This source code refers to The Go Authors for copyright purposes.
|
# This source code refers to The Go Authors for copyright purposes.
|
||||||
# The master list of authors is in the main Go distribution,
|
# The master list of authors is in the main Go distribution,
|
||||||
# visible at http://tip.golang.org/AUTHORS.
|
# visible at https://tip.golang.org/AUTHORS.
|
||||||
|
|
|
||||||
2
vendor/golang.org/x/crypto/CONTRIBUTORS
generated
vendored
2
vendor/golang.org/x/crypto/CONTRIBUTORS
generated
vendored
|
|
@ -1,3 +1,3 @@
|
||||||
# This source code was written by the Go contributors.
|
# This source code was written by the Go contributors.
|
||||||
# The master list of contributors is in the main Go distribution,
|
# The master list of contributors is in the main Go distribution,
|
||||||
# visible at http://tip.golang.org/CONTRIBUTORS.
|
# visible at https://tip.golang.org/CONTRIBUTORS.
|
||||||
|
|
|
||||||
11
vendor/golang.org/x/crypto/bcrypt/bcrypt.go
generated
vendored
11
vendor/golang.org/x/crypto/bcrypt/bcrypt.go
generated
vendored
|
|
@ -12,9 +12,10 @@ import (
|
||||||
"crypto/subtle"
|
"crypto/subtle"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"golang.org/x/crypto/blowfish"
|
|
||||||
"io"
|
"io"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
"golang.org/x/crypto/blowfish"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
@ -205,7 +206,6 @@ func bcrypt(password []byte, cost int, salt []byte) ([]byte, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func expensiveBlowfishSetup(key []byte, cost uint32, salt []byte) (*blowfish.Cipher, error) {
|
func expensiveBlowfishSetup(key []byte, cost uint32, salt []byte) (*blowfish.Cipher, error) {
|
||||||
|
|
||||||
csalt, err := base64Decode(salt)
|
csalt, err := base64Decode(salt)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
@ -213,7 +213,8 @@ func expensiveBlowfishSetup(key []byte, cost uint32, salt []byte) (*blowfish.Cip
|
||||||
|
|
||||||
// Bug compatibility with C bcrypt implementations. They use the trailing
|
// Bug compatibility with C bcrypt implementations. They use the trailing
|
||||||
// NULL in the key string during expansion.
|
// NULL in the key string during expansion.
|
||||||
ckey := append(key, 0)
|
// We copy the key to prevent changing the underlying array.
|
||||||
|
ckey := append(key[:len(key):len(key)], 0)
|
||||||
|
|
||||||
c, err := blowfish.NewSaltedCipher(ckey, csalt)
|
c, err := blowfish.NewSaltedCipher(ckey, csalt)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -240,11 +241,11 @@ func (p *hashed) Hash() []byte {
|
||||||
n = 3
|
n = 3
|
||||||
}
|
}
|
||||||
arr[n] = '$'
|
arr[n] = '$'
|
||||||
n += 1
|
n++
|
||||||
copy(arr[n:], []byte(fmt.Sprintf("%02d", p.cost)))
|
copy(arr[n:], []byte(fmt.Sprintf("%02d", p.cost)))
|
||||||
n += 2
|
n += 2
|
||||||
arr[n] = '$'
|
arr[n] = '$'
|
||||||
n += 1
|
n++
|
||||||
copy(arr[n:], p.salt)
|
copy(arr[n:], p.salt)
|
||||||
n += encodedSaltSize
|
n += encodedSaltSize
|
||||||
copy(arr[n:], p.hash)
|
copy(arr[n:], p.hash)
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue