@@ -6,10 +6,6 @@ platform: | |||
os: linux | |||
arch: arm64 | |||
workspace: | |||
base: /go | |||
path: src/code.gitea.io/gitea | |||
trigger: | |||
event: | |||
- push | |||
@@ -31,7 +27,7 @@ steps: | |||
- name: lint-backend | |||
pull: always | |||
image: golang:1.15 | |||
image: golang:1.16 | |||
commands: | |||
- make lint-backend | |||
environment: | |||
@@ -41,7 +37,7 @@ steps: | |||
- name: lint-backend-windows | |||
pull: always | |||
image: golang:1.15 | |||
image: golang:1.16 | |||
commands: | |||
- make golangci-lint vet | |||
environment: | |||
@@ -53,7 +49,7 @@ steps: | |||
- name: lint-backend-gogit | |||
pull: always | |||
image: golang:1.15 | |||
image: golang:1.16 | |||
commands: | |||
- make lint-backend | |||
environment: | |||
@@ -69,7 +65,7 @@ steps: | |||
- name: checks-backend | |||
pull: always | |||
image: golang:1.15 | |||
image: golang:1.16 | |||
commands: | |||
- make checks-backend | |||
depends_on: [lint-backend] | |||
@@ -91,7 +87,7 @@ steps: | |||
depends_on: [checks-backend] | |||
- name: build-backend-arm64 | |||
image: golang:1.15 | |||
image: golang:1.16 | |||
environment: | |||
GO111MODULE: on | |||
GOPROXY: off | |||
@@ -104,7 +100,7 @@ steps: | |||
depends_on: [checks-backend] | |||
- name: build-backend-windows | |||
image: golang:1.15 | |||
image: golang:1.16 | |||
environment: | |||
GO111MODULE: on | |||
GOPROXY: off | |||
@@ -116,7 +112,7 @@ steps: | |||
depends_on: [checks-backend] | |||
- name: build-backend-386 | |||
image: golang:1.15 | |||
image: golang:1.16 | |||
environment: | |||
GO111MODULE: on | |||
GOPROXY: off | |||
@@ -143,10 +139,6 @@ trigger: | |||
- tag | |||
- pull_request | |||
workspace: | |||
base: /go | |||
path: src/code.gitea.io/gitea | |||
services: | |||
- name: mysql | |||
image: mysql:5.7 | |||
@@ -195,7 +187,7 @@ steps: | |||
- name: build | |||
pull: always | |||
image: golang:1.15 | |||
image: golang:1.16 | |||
commands: | |||
- make backend | |||
environment: | |||
@@ -210,7 +202,7 @@ steps: | |||
- git update-ref refs/heads/tag_test ${DRONE_COMMIT_SHA} | |||
- name: unit-test | |||
image: golang:1.15 | |||
image: golang:1.16 | |||
commands: | |||
- make unit-test-coverage test-check | |||
environment: | |||
@@ -221,7 +213,7 @@ steps: | |||
- name: unit-test-gogit | |||
pull: always | |||
image: golang:1.15 | |||
image: golang:1.16 | |||
commands: | |||
- make unit-test-coverage test-check | |||
environment: | |||
@@ -231,7 +223,7 @@ steps: | |||
from_secret: github_read_token | |||
- name: test-mysql | |||
image: golang:1.15 | |||
image: golang:1.16 | |||
commands: | |||
- "curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash" | |||
- apt-get install -y git-lfs | |||
@@ -246,7 +238,7 @@ steps: | |||
- build | |||
- name: test-mysql8 | |||
image: golang:1.15 | |||
image: golang:1.16 | |||
commands: | |||
- "curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash" | |||
- apt-get install -y git-lfs | |||
@@ -260,7 +252,7 @@ steps: | |||
- build | |||
- name: test-mssql | |||
image: golang:1.15 | |||
image: golang:1.16 | |||
commands: | |||
- "curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash" | |||
- apt-get install -y git-lfs | |||
@@ -274,7 +266,7 @@ steps: | |||
- build | |||
- name: generate-coverage | |||
image: golang:1.15 | |||
image: golang:1.16 | |||
commands: | |||
- make coverage | |||
environment: | |||
@@ -324,10 +316,6 @@ trigger: | |||
- tag | |||
- pull_request | |||
workspace: | |||
base: /go | |||
path: src/code.gitea.io/gitea | |||
services: | |||
- name: pgsql | |||
pull: default | |||
@@ -352,16 +340,16 @@ steps: | |||
- name: build | |||
pull: always | |||
image: golang:1.15 | |||
image: golang:1.16 | |||
commands: | |||
- make backend | |||
environment: | |||
GOPROXY: https://goproxy.cn # proxy.golang.org is blocked in China, this proxy is not | |||
GOSUMDB: sum.golang.org | |||
TAGS: bindata sqlite sqlite_unlock_notify | |||
TAGS: bindata gogit sqlite sqlite_unlock_notify | |||
- name: test-sqlite | |||
image: golang:1.15 | |||
image: golang:1.16 | |||
commands: | |||
- "curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash" | |||
- apt-get install -y git-lfs | |||
@@ -375,7 +363,7 @@ steps: | |||
- build | |||
- name: test-pgsql | |||
image: golang:1.15 | |||
image: golang:1.16 | |||
commands: | |||
- "curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash" | |||
- apt-get install -y git-lfs | |||
@@ -397,10 +385,6 @@ platform: | |||
os: linux | |||
arch: arm64 | |||
workspace: | |||
base: /go | |||
path: src/code.gitea.io/gitea | |||
trigger: | |||
branch: | |||
- master | |||
@@ -459,11 +443,7 @@ name: update_gitignore_and_licenses | |||
platform: | |||
os: linux | |||
arch: amd64 | |||
workspace: | |||
base: /go | |||
path: src/code.gitea.io/gitea | |||
arch: arm64 | |||
trigger: | |||
branch: | |||
@@ -475,7 +455,7 @@ trigger: | |||
steps: | |||
- name: download | |||
image: golang:1.15 | |||
image: golang:1.16 | |||
commands: | |||
- timeout -s ABRT 40m make generate-license generate-gitignore | |||
@@ -500,10 +480,6 @@ platform: | |||
os: linux | |||
arch: amd64 | |||
workspace: | |||
base: /go | |||
path: src/code.gitea.io/gitea | |||
trigger: | |||
branch: | |||
- master | |||
@@ -523,7 +499,7 @@ steps: | |||
- name: static | |||
pull: always | |||
image: techknowlogick/xgo:go-1.15.x | |||
image: techknowlogick/xgo:go-1.16.x | |||
commands: | |||
- curl -sL https://deb.nodesource.com/setup_14.x | bash - && apt -y install nodejs | |||
- export PATH=$PATH:$GOPATH/bin | |||
@@ -598,10 +574,6 @@ platform: | |||
os: linux | |||
arch: amd64 | |||
workspace: | |||
base: /go | |||
path: src/code.gitea.io/gitea | |||
trigger: | |||
event: | |||
- tag | |||
@@ -619,7 +591,7 @@ steps: | |||
- name: static | |||
pull: always | |||
image: techknowlogick/xgo:go-1.15.x | |||
image: techknowlogick/xgo:go-1.16.x | |||
commands: | |||
- curl -sL https://deb.nodesource.com/setup_14.x | bash - && apt -y install nodejs | |||
- export PATH=$PATH:$GOPATH/bin | |||
@@ -719,10 +691,6 @@ platform: | |||
os: linux | |||
arch: amd64 | |||
workspace: | |||
base: /go | |||
path: src/code.gitea.io/gitea | |||
depends_on: | |||
- testing-amd64 | |||
- testing-arm64 | |||
@@ -788,10 +756,6 @@ platform: | |||
os: linux | |||
arch: arm64 | |||
workspace: | |||
base: /go | |||
path: src/code.gitea.io/gitea | |||
depends_on: | |||
- compliance | |||
@@ -824,10 +788,6 @@ platform: | |||
os: linux | |||
arch: arm64 | |||
workspace: | |||
base: /go | |||
path: src/code.gitea.io/gitea | |||
depends_on: | |||
- testing-amd64 | |||
- testing-arm64 |
@@ -1,7 +1,7 @@ | |||
################################### | |||
#Build stage | |||
FROM golang:1.15-alpine3.13 AS build-env | |||
FROM golang:1.16-alpine3.13 AS build-env | |||
ARG GOPROXY | |||
ENV GOPROXY ${GOPROXY:-direct} |
@@ -1,7 +1,7 @@ | |||
################################### | |||
#Build stage | |||
FROM golang:1.15-alpine3.13 AS build-env | |||
FROM golang:1.16-alpine3.13 AS build-env | |||
ARG GOPROXY | |||
ENV GOPROXY ${GOPROXY:-direct} |
@@ -24,7 +24,7 @@ SHASUM ?= shasum -a 256 | |||
HAS_GO = $(shell hash $(GO) > /dev/null 2>&1 && echo "GO" || echo "NOGO" ) | |||
COMMA := , | |||
XGO_VERSION := go-1.15.x | |||
XGO_VERSION := go-1.16.x | |||
MIN_GO_VERSION := 001014000 | |||
MIN_NODE_VERSION := 010013000 | |||
@@ -596,7 +596,7 @@ release-darwin: | $(DIST_DIRS) | |||
@hash xgo > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ | |||
GO111MODULE=off $(GO) get -u src.techknowlogick.com/xgo; \ | |||
fi | |||
CGO_CFLAGS="$(CGO_CFLAGS)" GO111MODULE=off xgo -go $(XGO_VERSION) -dest $(DIST)/binaries -tags 'netgo osusergo $(TAGS)' -ldflags '$(LDFLAGS)' -targets 'darwin/amd64' -out gitea-$(VERSION) . | |||
CGO_CFLAGS="$(CGO_CFLAGS)" GO111MODULE=off xgo -go $(XGO_VERSION) -dest $(DIST)/binaries -tags 'netgo osusergo $(TAGS)' -ldflags '$(LDFLAGS)' -targets 'darwin-10.12/amd64' -out gitea-$(VERSION) . | |||
ifeq ($(CI),drone) | |||
cp /build/* $(DIST)/binaries | |||
endif |
@@ -20,7 +20,7 @@ params: | |||
website: https://docs.gitea.io | |||
version: 1.13.2 | |||
minGoVersion: 1.14 | |||
goVersion: 1.15 | |||
goVersion: 1.16 | |||
minNodeVersion: 10.13 | |||
outputs: |
@@ -3,6 +3,7 @@ module code.gitea.io/gitea | |||
go 1.14 | |||
require ( | |||
cloud.google.com/go v0.78.0 // indirect | |||
code.gitea.io/gitea-vet v0.2.1 | |||
code.gitea.io/sdk/gitea v0.13.2 | |||
gitea.com/go-chi/binding v0.0.0-20210113025129-03f1d313373c | |||
@@ -10,42 +11,52 @@ require ( | |||
gitea.com/go-chi/captcha v0.0.0-20210110083842-e7696c336a1e | |||
gitea.com/go-chi/session v0.0.0-20210108030337-0cb48c5ba8ee | |||
gitea.com/lunny/levelqueue v0.3.0 | |||
github.com/Microsoft/go-winio v0.4.16 // indirect | |||
github.com/NYTimes/gziphandler v1.1.1 | |||
github.com/PuerkitoBio/goquery v1.5.1 | |||
github.com/RoaringBitmap/roaring v0.5.5 // indirect | |||
github.com/alecthomas/chroma v0.8.2 | |||
github.com/andybalholm/brotli v1.0.1 // indirect | |||
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be // indirect | |||
github.com/blevesearch/bleve/v2 v2.0.1 | |||
github.com/blevesearch/bleve/v2 v2.0.2 | |||
github.com/boombuler/barcode v1.0.1 // indirect | |||
github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b // indirect | |||
github.com/caddyserver/certmagic v0.12.0 | |||
github.com/couchbase/go-couchbase v0.0.0-20210224140812-5740cd35f448 // indirect | |||
github.com/couchbase/gomemcached v0.1.2 // indirect | |||
github.com/couchbase/goutils v0.0.0-20210118111533-e33d3ffb5401 // indirect | |||
github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect | |||
github.com/denisenkom/go-mssqldb v0.9.0 | |||
github.com/dgrijalva/jwt-go v3.2.0+incompatible | |||
github.com/dlclark/regexp2 v1.4.0 // indirect | |||
github.com/dustin/go-humanize v1.0.0 | |||
github.com/editorconfig/editorconfig-core-go/v2 v2.3.9 | |||
github.com/editorconfig/editorconfig-core-go/v2 v2.4.1 | |||
github.com/emirpasic/gods v1.12.0 | |||
github.com/ethantkoenig/rupture v1.0.0 | |||
github.com/gliderlabs/ssh v0.3.1 | |||
github.com/glycerine/go-unsnap-stream v0.0.0-20190901134440-81cf024a9e0a // indirect | |||
github.com/go-chi/chi v1.5.1 | |||
github.com/gliderlabs/ssh v0.3.2 | |||
github.com/glycerine/go-unsnap-stream v0.0.0-20210130063903-47dfef350d96 // indirect | |||
github.com/go-asn1-ber/asn1-ber v1.5.3 // indirect | |||
github.com/go-chi/chi v1.5.4 | |||
github.com/go-chi/cors v1.1.1 | |||
github.com/go-enry/go-enry/v2 v2.6.0 | |||
github.com/go-git/go-billy/v5 v5.0.0 | |||
github.com/go-git/go-git/v5 v5.2.0 | |||
github.com/go-ldap/ldap/v3 v3.2.4 | |||
github.com/go-redis/redis/v8 v8.5.0 | |||
github.com/go-openapi/errors v0.20.0 // indirect | |||
github.com/go-openapi/validate v0.20.2 // indirect | |||
github.com/go-redis/redis/v8 v8.6.0 | |||
github.com/go-sql-driver/mysql v1.5.0 | |||
github.com/go-swagger/go-swagger v0.26.0 | |||
github.com/go-testfixtures/testfixtures/v3 v3.4.1 | |||
github.com/go-swagger/go-swagger v0.26.1 | |||
github.com/go-testfixtures/testfixtures/v3 v3.5.0 | |||
github.com/gobwas/glob v0.2.3 | |||
github.com/gogs/chardet v0.0.0-20191104214054-4b6791f73a28 | |||
github.com/gogs/cron v0.0.0-20171120032916-9f6c956d3e14 | |||
github.com/gogs/go-gogs-client v0.0.0-20210131175652-1d7215cd8d85 | |||
github.com/golang/snappy v0.0.3 // indirect | |||
github.com/google/go-github/v32 v32.1.0 | |||
github.com/google/uuid v1.2.0 | |||
github.com/gorilla/context v1.1.1 | |||
github.com/gorilla/mux v1.8.0 // indirect | |||
github.com/gorilla/sessions v1.2.1 // indirect | |||
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect | |||
github.com/hashicorp/go-retryablehttp v0.6.8 // indirect | |||
@@ -56,44 +67,56 @@ require ( | |||
github.com/issue9/identicon v1.0.1 | |||
github.com/jaytaylor/html2text v0.0.0-20200412013138-3577fbdbcff7 | |||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 | |||
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect | |||
github.com/keybase/go-crypto v0.0.0-20200123153347-de78d2cb44f4 | |||
github.com/klauspost/compress v1.11.7 | |||
github.com/klauspost/compress v1.11.8 | |||
github.com/klauspost/pgzip v1.2.5 // indirect | |||
github.com/lafriks/xormstore v1.4.0 | |||
github.com/lib/pq v1.9.0 | |||
github.com/libdns/libdns v0.2.0 // indirect | |||
github.com/lunny/dingtalk_webhook v0.0.0-20171025031554-e3534c89ef96 | |||
github.com/markbates/goth v1.66.1 | |||
github.com/mailru/easyjson v0.7.7 // indirect | |||
github.com/markbates/goth v1.67.1 | |||
github.com/mattn/go-isatty v0.0.12 | |||
github.com/mattn/go-runewidth v0.0.10 // indirect | |||
github.com/mattn/go-sqlite3 v1.14.6 | |||
github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81 | |||
github.com/mgechev/revive v1.0.3 | |||
github.com/mholt/acmez v0.1.3 // indirect | |||
github.com/mholt/archiver/v3 v3.5.0 | |||
github.com/microcosm-cc/bluemonday v1.0.4 | |||
github.com/minio/md5-simd v1.1.1 // indirect | |||
github.com/minio/minio-go/v7 v7.0.9 | |||
github.com/miekg/dns v1.1.40 // indirect | |||
github.com/minio/md5-simd v1.1.2 // indirect | |||
github.com/minio/minio-go/v7 v7.0.10 | |||
github.com/minio/sha256-simd v1.0.0 // indirect | |||
github.com/mitchellh/go-homedir v1.1.0 | |||
github.com/msteinert/pam v0.0.0-20200810204841-913b8f8cdf8b | |||
github.com/mrjones/oauth v0.0.0-20190623134757-126b35219450 // indirect | |||
github.com/msteinert/pam v0.0.0-20201130170657-e61372126161 | |||
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 | |||
github.com/niklasfasching/go-org v1.4.0 | |||
github.com/olekukonko/tablewriter v0.0.5 // indirect | |||
github.com/oliamb/cutter v0.2.2 | |||
github.com/olivere/elastic/v7 v7.0.22 | |||
github.com/pelletier/go-toml v1.8.1 | |||
github.com/pierrec/lz4/v4 v4.1.1 // indirect | |||
github.com/pierrec/lz4/v4 v4.1.3 // indirect | |||
github.com/pkg/errors v0.9.1 | |||
github.com/pquerna/otp v1.3.0 | |||
github.com/prometheus/client_golang v1.9.0 | |||
github.com/prometheus/common v0.18.0 // indirect | |||
github.com/prometheus/procfs v0.6.0 // indirect | |||
github.com/quasoft/websspi v1.0.0 | |||
github.com/rivo/uniseg v0.2.0 // indirect | |||
github.com/russross/blackfriday/v2 v2.1.0 // indirect | |||
github.com/sergi/go-diff v1.1.0 | |||
github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 // indirect | |||
github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546 | |||
github.com/spf13/afero v1.5.1 // indirect | |||
github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect | |||
github.com/stretchr/testify v1.7.0 | |||
github.com/syndtr/goleveldb v1.0.0 | |||
github.com/tinylib/msgp v1.1.5 // indirect | |||
github.com/tstranex/u2f v1.0.0 | |||
github.com/ulikunitz/xz v0.5.8 // indirect | |||
github.com/ulikunitz/xz v0.5.10 // indirect | |||
github.com/unknwon/com v1.0.1 | |||
github.com/unknwon/i18n v0.0.0-20200823051745-09abd91c7f2c | |||
github.com/unknwon/paginater v0.0.0-20200328080006-042474bd0eae | |||
@@ -101,18 +124,21 @@ require ( | |||
github.com/urfave/cli v1.22.5 | |||
github.com/willf/bitset v1.1.11 // indirect | |||
github.com/xanzy/go-gitlab v0.44.0 | |||
github.com/xanzy/ssh-agent v0.3.0 // indirect | |||
github.com/yohcop/openid-go v1.0.0 | |||
github.com/yuin/goldmark v1.3.2 | |||
github.com/yuin/goldmark-highlighting v0.0.0-20200307114337-60d527fdb691 | |||
github.com/yuin/goldmark-meta v1.0.0 | |||
go.jolheiser.com/hcaptcha v0.0.4 | |||
go.jolheiser.com/pwn v0.0.3 | |||
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad | |||
golang.org/x/net v0.0.0-20210119194325-5f4716e94777 | |||
golang.org/x/oauth2 v0.0.0-20210210192628-66670185b0cd | |||
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c | |||
go.uber.org/multierr v1.6.0 // indirect | |||
go.uber.org/zap v1.16.0 // indirect | |||
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 | |||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 | |||
golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93 | |||
golang.org/x/sys v0.0.0-20210228012217-479acdf4ea46 | |||
golang.org/x/text v0.3.5 | |||
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 // indirect | |||
golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba // indirect | |||
golang.org/x/tools v0.1.0 | |||
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect | |||
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df |
@@ -4,7 +4,6 @@ cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSR | |||
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= | |||
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= | |||
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= | |||
cloud.google.com/go v0.46.3 h1:AVXDdKsrtX33oR9fbCMu/+c1o8Ofjq6Ku/MInaLVg5Y= | |||
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= | |||
cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= | |||
cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= | |||
@@ -14,8 +13,11 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV | |||
cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= | |||
cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= | |||
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= | |||
cloud.google.com/go v0.67.0 h1:YIkzmqUfVGiGPpT98L8sVvUIkDno6UlrDxw4NR6z5ak= | |||
cloud.google.com/go v0.67.0/go.mod h1:YNan/mUhNZFrYUor0vqrsQ0Ffl7Xtm/ACOy/vsTS858= | |||
cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= | |||
cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= | |||
cloud.google.com/go v0.78.0 h1:oKpsiyKMfVpwR3zSAkQixGzlVE5ovitBuO0qSmCf0bI= | |||
cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= | |||
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= | |||
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= | |||
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= | |||
@@ -61,6 +63,9 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym | |||
github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= | |||
github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtixis4Tib9if0= | |||
github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= | |||
github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= | |||
github.com/Microsoft/go-winio v0.4.16 h1:FtSW/jqD+l4ba5iPBj9CODVtgfYAD8w2wS923g/cFDk= | |||
github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= | |||
github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= | |||
github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= | |||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= | |||
@@ -71,7 +76,6 @@ github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tN | |||
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= | |||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= | |||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= | |||
github.com/RoaringBitmap/roaring v0.4.23 h1:gpyfd12QohbqhFO4NVDUdoPOCXsyahYRQhINmlHxKeo= | |||
github.com/RoaringBitmap/roaring v0.4.23/go.mod h1:D0gp8kJQgE1A4LQ5wFLggQEyvDi06Mq5mKs52e1TwOo= | |||
github.com/RoaringBitmap/roaring v0.5.5 h1:naNqvO1mNnghk2UvcsqnzHDBn9DRbCIRy94GmDTRVTQ= | |||
github.com/RoaringBitmap/roaring v0.5.5/go.mod h1:puNo5VdzwbaIQxSiDIwfXl4Hnc+fbovcX4IW/dSTtUk= | |||
@@ -107,7 +111,6 @@ github.com/andybalholm/brotli v1.0.1 h1:KqhlKozYbRtJvsPrrEeXcO+N2l6NYT5A2QAFmSUL | |||
github.com/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= | |||
github.com/andybalholm/cascadia v1.1.0 h1:BuuO6sSfQNFRu1LppgbD25Hr2vLYW25JvxHs5zzsLTo= | |||
github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= | |||
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= | |||
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= | |||
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= | |||
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= | |||
@@ -123,7 +126,6 @@ github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6l | |||
github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= | |||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= | |||
github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= | |||
github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0S6Vi7/lbWECcX0j45yZReDZ56BQsrVBOEEY= | |||
github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= | |||
github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef h1:46PFijGLmAjMPwCCCo7Jf0W6f9slllCkkv7vyc1yOSg= | |||
github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= | |||
@@ -141,8 +143,9 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r | |||
github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= | |||
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= | |||
github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= | |||
github.com/blevesearch/bleve/v2 v2.0.1 h1:v1eV5K+/lndsjnykeVcuU9J4cJnjKLUKSwxXFxZsLuY= | |||
github.com/blevesearch/bleve/v2 v2.0.1/go.mod h1:OBP2Pktqik8vEiUlGhuWjYx7KiO4zD542+DHqICwM5w= | |||
github.com/blevesearch/bleve/v2 v2.0.2 h1:D93VfhOiR6wALovgjsK5XNPeDRrZQlUEIq4YWFeaiTw= | |||
github.com/blevesearch/bleve/v2 v2.0.2/go.mod h1:ip+4iafiEq2gCY5rJXe87bT6LkF/OJMCjQEYIfTBfW8= | |||
github.com/blevesearch/bleve_index_api v1.0.0 h1:Ds3XeuTxjXCkG6pgIwWDRyooJKNIuOKemnN0N0IkhTU= | |||
github.com/blevesearch/bleve_index_api v1.0.0/go.mod h1:fiwKS0xLEm+gBRgv5mumf0dhgFr2mDgZah1pqv1c1M4= | |||
github.com/blevesearch/go-porterstemmer v1.0.3 h1:GtmsqID0aZdCSNiY8SkuPJ12pD4jI+DdXTAn4YRcHCo= | |||
@@ -151,28 +154,37 @@ github.com/blevesearch/mmap-go v1.0.2 h1:JtMHb+FgQCTTYIhtMvimw15dJwu1Y5lrZDMOFXV | |||
github.com/blevesearch/mmap-go v1.0.2/go.mod h1:ol2qBqYaOUsGdm7aRMRrYGgPvnwLe6Y+7LMvAB5IbSA= | |||
github.com/blevesearch/scorch_segment_api v1.0.0 h1:BUkCPWDg2gimTEyVDXf85I2buqqt4lh28uaVMiJsIYk= | |||
github.com/blevesearch/scorch_segment_api v1.0.0/go.mod h1:KgRYmlfYC27NeM6cXOHx8LBgq7jn0atpV8mVWoBKBng= | |||
github.com/blevesearch/scorch_segment_api/v2 v2.0.1 h1:fd+hPtZ8GsbqPK1HslGp7Vhoik4arZteA/IsCEgOisw= | |||
github.com/blevesearch/scorch_segment_api/v2 v2.0.1/go.mod h1:lq7yK2jQy1yQjtjTfU931aVqz7pYxEudHaDwOt1tXfU= | |||
github.com/blevesearch/segment v0.9.0 h1:5lG7yBCx98or7gK2cHMKPukPZ/31Kag7nONpoBt22Ac= | |||
github.com/blevesearch/segment v0.9.0/go.mod h1:9PfHYUdQCgHktBgvtUOF4x+pc4/l8rdH0u5spnW85UQ= | |||
github.com/blevesearch/snowballstem v0.9.0 h1:lMQ189YspGP6sXvZQ4WZ+MLawfV8wOmPoD/iWeNXm8s= | |||
github.com/blevesearch/snowballstem v0.9.0/go.mod h1:PivSj3JMc8WuaFkTSRDW2SlrulNWPl4ABg1tC/hlgLs= | |||
github.com/blevesearch/upsidedown_store_api v1.0.1 h1:1SYRwyoFLwG3sj0ed89RLtM15amfX2pXlYbFOnF8zNU= | |||
github.com/blevesearch/upsidedown_store_api v1.0.1/go.mod h1:MQDVGpHZrpe3Uy26zJBf/a8h0FZY6xJbthIMm8myH2Q= | |||
github.com/blevesearch/zapx/v11 v11.1.10 h1:8Eo3rXiHsVSP9Sk+4StrrwLrj9vyulhMVPmxTf8ZuDg= | |||
github.com/blevesearch/vellum v1.0.3 h1:U86G41A7CtXNzzpIJHM8lSTUqz1Mp8U870TkcdCzZc8= | |||
github.com/blevesearch/vellum v1.0.3/go.mod h1:2u5ax02KeDuNWu4/C+hVQMD6uLN4txH1JbtpaDNLJRo= | |||
github.com/blevesearch/zapx/v11 v11.1.10/go.mod h1:DTjbcBqrr/Uo82UBilDC8lEew42gN/OcIyiTNFtSijc= | |||
github.com/blevesearch/zapx/v12 v12.1.10 h1:sqR+/0Z4dSTovApRqLA1HnilMtQer7a4UvPrNmPzlTM= | |||
github.com/blevesearch/zapx/v11 v11.2.0 h1:GBkCJYsyj3eIU4+aiLPxoMz1PYvDbQZl/oXHIBZIP60= | |||
github.com/blevesearch/zapx/v11 v11.2.0/go.mod h1:gN/a0alGw1FZt/YGTo1G6Z6XpDkeOfujX5exY9sCQQM= | |||
github.com/blevesearch/zapx/v12 v12.1.10/go.mod h1:14NmKnPrnKAIyiEJM566k/Jk+FQpuiflT5d3uaaK3MI= | |||
github.com/blevesearch/zapx/v13 v13.1.10 h1:zCneEVRJDXwtDfSwh+33Dxguliv192vCK283zdGH4Sw= | |||
github.com/blevesearch/zapx/v12 v12.2.0 h1:dyRcSoZVO1jktL4UpGkCEF1AYa3xhKPirh4/N+Va+Ww= | |||
github.com/blevesearch/zapx/v12 v12.2.0/go.mod h1:fdjwvCwWWwJW/EYTYGtAp3gBA0geCYGLcVTtJEZnY6A= | |||
github.com/blevesearch/zapx/v13 v13.1.10/go.mod h1:YsVY6YGpTEAlJOMjdL7EsdBLvjWd8kPa2gwJDNpqLJo= | |||
github.com/blevesearch/zapx/v14 v14.1.10 h1:nD0vw2jxKogJFfA5WyoS4wNwZlVby3Aq8aW7CZi6YIw= | |||
github.com/blevesearch/zapx/v13 v13.2.0 h1:mUqbaqQABp8nBE4t4q2qMyHCCq4sykoV8r7aJk4ih3s= | |||
github.com/blevesearch/zapx/v13 v13.2.0/go.mod h1:o5rAy/lRS5JpAbITdrOHBS/TugWYbkcYZTz6VfEinAQ= | |||
github.com/blevesearch/zapx/v14 v14.1.10/go.mod h1:hsULl5eJSxs5NEfBsmeT9qrqdCP+/ecpVZKt60M4V64= | |||
github.com/blevesearch/zapx/v15 v15.1.10 h1:kZR3b9jO9l6s2B5UHI+1N1llLzJ4nYikkXQTMrDl1vQ= | |||
github.com/blevesearch/zapx/v14 v14.2.0 h1:UsfRqvM9RJxKNKrkR1U7aYc1cv9MWx719fsAjbF6joI= | |||
github.com/blevesearch/zapx/v14 v14.2.0/go.mod h1:GNgZusc1p4ot040cBQMRGEZobvwjCquiEKYh1xLFK9g= | |||
github.com/blevesearch/zapx/v15 v15.1.10/go.mod h1:4ypq25bwtSQKzwEF1UERyIhmGTbMT3brY/n4NC5gRnM= | |||
github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc h1:biVzkmvwrH8WK8raXaxBx6fRVTlJILwEwQGL1I/ByEI= | |||
github.com/blevesearch/zapx/v15 v15.2.0 h1:ZpibwcrrOaeslkOw3sJ7npP7KDgRHI/DkACjKTqFwyM= | |||
github.com/blevesearch/zapx/v15 v15.2.0/go.mod h1:MmQceLpWfME4n1WrBFIwplhWmaQbQqLQARpaKUEOs/A= | |||
github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= | |||
github.com/boombuler/barcode v1.0.1 h1:NDBbPmhS+EqABEs5Kg3n/5ZNjy73Pz7SIV+KCeqyXcs= | |||
github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= | |||
github.com/bradfitz/gomemcache v0.0.0-20190329173943-551aad21a668 h1:U/lr3Dgy4WK+hNk4tyD+nuGjpVLPEHuJSFXMw11/HPA= | |||
github.com/bradfitz/gomemcache v0.0.0-20190329173943-551aad21a668/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= | |||
github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b h1:L/QXpzIa3pOvUGt1D1lA5KjYhPBAN/3iWdP7xeFS9F0= | |||
github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= | |||
github.com/caddyserver/certmagic v0.12.0 h1:1f7kxykaJkOVVpXJ8ZrC6RAO5F6+kKm9U7dBFbLNeug= | |||
github.com/caddyserver/certmagic v0.12.0/go.mod h1:tr26xh+9fY5dN0J6IPAlMj07qpog22PJKa7Nw7j835U= | |||
github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= | |||
@@ -190,6 +202,8 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn | |||
github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= | |||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= | |||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= | |||
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= | |||
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= | |||
github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= | |||
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= | |||
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= | |||
@@ -207,14 +221,16 @@ github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7 | |||
github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= | |||
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= | |||
github.com/couchbase/ghistogram v0.1.0/go.mod h1:s1Jhy76zqfEecpNWJfWUiKZookAFaiGOEoyzgHt9i7k= | |||
github.com/couchbase/go-couchbase v0.0.0-20201026062457-7b3be89bbd89 h1:uNLXQ6QO1TocD8BaN/KkRki0Xw0brCM1PKl/ZA5pgfs= | |||
github.com/couchbase/go-couchbase v0.0.0-20201026062457-7b3be89bbd89/go.mod h1:+/bddYDxXsf9qt0xpDUtRR47A2GjaXmGGAqQ/k3GJ8A= | |||
github.com/couchbase/gomemcached v0.1.1 h1:xCS8ZglJDhrlQg3jmK7Rn1V8f7bPjXABLC05CgLQauc= | |||
github.com/couchbase/go-couchbase v0.0.0-20210224140812-5740cd35f448 h1:6fX3IYPArCLhzUcyJS6wezHY8nqSvqUy9NrkMwkXSeg= | |||
github.com/couchbase/go-couchbase v0.0.0-20210224140812-5740cd35f448/go.mod h1:+/bddYDxXsf9qt0xpDUtRR47A2GjaXmGGAqQ/k3GJ8A= | |||
github.com/couchbase/gomemcached v0.1.1/go.mod h1:mxliKQxOv84gQ0bJWbI+w9Wxdpt9HjDvgW9MjCym5Vo= | |||
github.com/couchbase/goutils v0.0.0-20201030094643-5e82bb967e67 h1:NCqJ6fwen6YP0WlV/IyibaT0kPt3JEI1rA62V/UPKT4= | |||
github.com/couchbase/gomemcached v0.1.2 h1:GKLSnC6RyTXkJ9vyd0q44doU8rfe34PpKkQ+c1bsWmA= | |||
github.com/couchbase/gomemcached v0.1.2/go.mod h1:mxliKQxOv84gQ0bJWbI+w9Wxdpt9HjDvgW9MjCym5Vo= | |||
github.com/couchbase/goutils v0.0.0-20201030094643-5e82bb967e67/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs= | |||
github.com/couchbase/goutils v0.0.0-20210118111533-e33d3ffb5401 h1:4KDlx3vjalrHD/EfsjCpV91HNX3JPaIqRtt83zZ7x+Y= | |||
github.com/couchbase/goutils v0.0.0-20210118111533-e33d3ffb5401/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs= | |||
github.com/couchbase/moss v0.1.0/go.mod h1:9MaHIaRuy9pvLPUJxB8sh8OrLfyDczECVL37grCIubs= | |||
github.com/couchbase/vellum v1.0.2 h1:BrbP0NKiyDdndMPec8Jjhy0U47CZ0Lgx3xUC2r9rZqw= | |||
github.com/couchbase/vellum v1.0.2/go.mod h1:FcwrEivFpNi24R3jLOs3n+fs5RnuQnQqCLBJ1uAg1W4= | |||
github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= | |||
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= | |||
@@ -231,7 +247,6 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs | |||
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/denisenkom/go-mssqldb v0.0.0-20191128021309-1d7a30a10f73/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= | |||
github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc h1:VRRKCwnzqk8QCaRC4os14xoKDdbHqqlJtJA0oc1ZAjg= | |||
github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= | |||
github.com/denisenkom/go-mssqldb v0.9.0 h1:RSohk2RsiZqLZ0zCjtfn3S4Gp4exhpBWHyQ7D0yGjAk= | |||
github.com/denisenkom/go-mssqldb v0.9.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= | |||
@@ -255,8 +270,8 @@ github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25Kn | |||
github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= | |||
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= | |||
github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= | |||
github.com/editorconfig/editorconfig-core-go/v2 v2.3.9 h1:4vZN3UCLAUbT408wDutTKGZwOlgGMpV3vhahYufNbV8= | |||
github.com/editorconfig/editorconfig-core-go/v2 v2.3.9/go.mod h1:yoHDFR3nO8O5ssvhITSRsf0owQqIs0c9+nBTtarunPo= | |||
github.com/editorconfig/editorconfig-core-go/v2 v2.4.1 h1:ELDiPZji50x20Wvf9FnP4pb7fE3PV/DNhNd6MRlhgfI= | |||
github.com/editorconfig/editorconfig-core-go/v2 v2.4.1/go.mod h1:UHV4+gECABtht7ALQkPdc5gzP77D+4WDUOZAfx8ifx8= | |||
github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= | |||
github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaIu9ajZQe4kcEY9j0NsnDDBZ3o= | |||
github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= | |||
@@ -266,6 +281,8 @@ github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4s | |||
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= | |||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= | |||
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= | |||
github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= | |||
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= | |||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= | |||
github.com/ethantkoenig/rupture v1.0.0 h1:gPInt1N30UErGNzd8t5js5Qbnpjcd1l6yU2MCrJxIe8= | |||
github.com/ethantkoenig/rupture v1.0.0/go.mod h1:GyE9QabHfxA6ch0NZgwsHopRbOLcYjUr9g4FTJmq0WM= | |||
@@ -286,19 +303,21 @@ github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWo | |||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= | |||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= | |||
github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= | |||
github.com/gliderlabs/ssh v0.3.1 h1:L6VrMUGZaMlNIMN8Hj+CHh4U9yodJE3FAt/rgvfaKvE= | |||
github.com/gliderlabs/ssh v0.3.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= | |||
github.com/gliderlabs/ssh v0.3.2 h1:gcfd1Aj/9RQxvygu4l3sak711f/5+VOwBw9C/7+N4EI= | |||
github.com/gliderlabs/ssh v0.3.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= | |||
github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= | |||
github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= | |||
github.com/glycerine/go-unsnap-stream v0.0.0-20181221182339-f9677308dec2/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= | |||
github.com/glycerine/go-unsnap-stream v0.0.0-20190901134440-81cf024a9e0a h1:FQqoVvjbiUioBBFUL5up+h+GdCa/AnJsL/1bIs/veSI= | |||
github.com/glycerine/go-unsnap-stream v0.0.0-20190901134440-81cf024a9e0a/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= | |||
github.com/glycerine/go-unsnap-stream v0.0.0-20210130063903-47dfef350d96 h1:rCXyLrgJ598XNj7KTqPzAvwTzlyvI+clqasoNfLQStE= | |||
github.com/glycerine/go-unsnap-stream v0.0.0-20210130063903-47dfef350d96/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= | |||
github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31 h1:gclg6gY70GLy3PbkQ1AERPfmLMMagS60DKF78eWwLn8= | |||
github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= | |||
github.com/go-asn1-ber/asn1-ber v1.5.1 h1:pDbRAunXzIUXfx4CB2QJFv5IuPiuoW+sWvr/Us009o8= | |||
github.com/go-asn1-ber/asn1-ber v1.5.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= | |||
github.com/go-chi/chi v1.5.1 h1:kfTK3Cxd/dkMu/rKs5ZceWYp+t5CtiE7vmaTv3LjC6w= | |||
github.com/go-asn1-ber/asn1-ber v1.5.3 h1:u7utq56RUFiynqUzgVMFDymapcOtQ/MZkh3H4QYkxag= | |||
github.com/go-asn1-ber/asn1-ber v1.5.3/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= | |||
github.com/go-chi/chi v1.5.1/go.mod h1:REp24E+25iKvxgeTfHmdUoL5x15kBiDBlnIl5bCwe2k= | |||
github.com/go-chi/chi v1.5.4 h1:QHdzF2szwjqVV4wmByUnTcsbIg7UGaQ0tPF2t5GcAIs= | |||
github.com/go-chi/chi v1.5.4/go.mod h1:uaf8YgoFazUOkPBG7fxPftUylNumIev9awIWOENIuEg= | |||
github.com/go-chi/cors v1.1.1 h1:eHuqxsIw89iXcWnWUN8R72JMibABJTN/4IOYI5WERvw= | |||
github.com/go-chi/cors v1.1.1/go.mod h1:K2Yje0VW/SJzxiyMYu6iPQYa7hMjQX2i/F491VChg1I= | |||
github.com/go-enry/go-enry/v2 v2.6.0 h1:nbGWQBpO+D+cJuRxNgSDFnFY9QWz3QM/CeZxU7VAH20= | |||
@@ -331,8 +350,9 @@ github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9sn | |||
github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= | |||
github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= | |||
github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ= | |||
github.com/go-openapi/analysis v0.19.16 h1:Ub9e++M8sDwtHD+S587TYi+6ANBG1NRYGZDihqk0SaY= | |||
github.com/go-openapi/analysis v0.19.16/go.mod h1:GLInF007N83Ad3m8a/CbQ5TPzdnGT7workfHwuVjNVk= | |||
github.com/go-openapi/analysis v0.20.0 h1:UN09o0kNhleunxW7LR+KnltD0YrJ8FF03pSqvAN3Vro= | |||
github.com/go-openapi/analysis v0.20.0/go.mod h1:BMchjvaHDykmRMsK40iPtvyOfFdMMxlOmQr9FBZk+Og= | |||
github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= | |||
github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= | |||
github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= | |||
@@ -340,8 +360,9 @@ github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA | |||
github.com/go-openapi/errors v0.19.6/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= | |||
github.com/go-openapi/errors v0.19.7/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= | |||
github.com/go-openapi/errors v0.19.8/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= | |||
github.com/go-openapi/errors v0.19.9 h1:9SnKdGhiPZHF3ttwFMiCBEb8jQ4IDdrK+5+a0oTygA4= | |||
github.com/go-openapi/errors v0.19.9/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= | |||
github.com/go-openapi/errors v0.20.0 h1:Sxpo9PjEHDzhs3FbnGNonvDgWcMW2U7wGTcDDSFSceM= | |||
github.com/go-openapi/errors v0.20.0/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= | |||
github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4= | |||
github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4= | |||
github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= | |||
@@ -364,8 +385,10 @@ github.com/go-openapi/loads v0.19.3/go.mod h1:YVfqhUCdahYwR3f3iiwQLhicVRvLlU/WO5 | |||
github.com/go-openapi/loads v0.19.5/go.mod h1:dswLCAdonkRufe/gSUC3gN8nTSaB9uaS2es0x5/IbjY= | |||
github.com/go-openapi/loads v0.19.6/go.mod h1:brCsvE6j8mnbmGBh103PT/QLHfbyDxA4hsKvYBNEGVc= | |||
github.com/go-openapi/loads v0.19.7/go.mod h1:brCsvE6j8mnbmGBh103PT/QLHfbyDxA4hsKvYBNEGVc= | |||
github.com/go-openapi/loads v0.20.0 h1:Pymw1O8zDmWeNv4kVsHd0W3cvgdp8juRa4U/U/8D/Pk= | |||
github.com/go-openapi/loads v0.20.0/go.mod h1:2LhKquiE513rN5xC6Aan6lYOSddlL8Mp20AW9kpviM4= | |||
github.com/go-openapi/loads v0.20.1/go.mod h1:/6LfFL8fDvTSX8ypmYXIq3U9Q7nfniSOStW22m864WM= | |||
github.com/go-openapi/loads v0.20.2 h1:z5p5Xf5wujMxS1y8aP+vxwW5qYT2zdJBbXKmQUG3lcc= | |||
github.com/go-openapi/loads v0.20.2/go.mod h1:hTVUotJ+UonAMMZsvakEgmWKgtulweO9vYP2bQYKA/o= | |||
github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= | |||
github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= | |||
github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= | |||
@@ -382,8 +405,10 @@ github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHK | |||
github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= | |||
github.com/go-openapi/spec v0.19.15/go.mod h1:+81FIL1JwC5P3/Iuuozq3pPE9dXdIEGxFutcFKaVbmU= | |||
github.com/go-openapi/spec v0.20.0/go.mod h1:+81FIL1JwC5P3/Iuuozq3pPE9dXdIEGxFutcFKaVbmU= | |||
github.com/go-openapi/spec v0.20.1 h1:5WNKTzPguDN+79wbJw2UE2q+eX+gUmEFsIKSvnSQJlc= | |||
github.com/go-openapi/spec v0.20.1/go.mod h1:93x7oh+d+FQsmsieroS4cmR3u0p/ywH649a3qwC9OsQ= | |||
github.com/go-openapi/spec v0.20.2/go.mod h1:RW6Xcbs6LOyWLU/mXGdzn2Qc+3aj+ASfI7rvSZh1Vls= | |||
github.com/go-openapi/spec v0.20.3 h1:uH9RQ6vdyPSs2pSy9fL8QPspDF2AMIMPtmK5coSSjtQ= | |||
github.com/go-openapi/spec v0.20.3/go.mod h1:gG4F8wdEDN+YPBMVnzE85Rbhf+Th2DTvA9nFPQ5AYEg= | |||
github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= | |||
github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= | |||
github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= | |||
@@ -401,34 +426,35 @@ github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh | |||
github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= | |||
github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= | |||
github.com/go-openapi/swag v0.19.12/go.mod h1:eFdyEBkTdoAf/9RXBvj4cr1nH7GD8Kzo5HTt47gr72M= | |||
github.com/go-openapi/swag v0.19.13 h1:233UVgMy1DlmCYYfOiFpta6e2urloh+sEs5id6lyzog= | |||
github.com/go-openapi/swag v0.19.13/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= | |||
github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= | |||
github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= | |||
github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= | |||
github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= | |||
github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= | |||
github.com/go-openapi/validate v0.19.10/go.mod h1:RKEZTUWDkxKQxN2jDT7ZnZi2bhZlbNMAuKvKB+IaGx8= | |||
github.com/go-openapi/validate v0.19.12/go.mod h1:Rzou8hA/CBw8donlS6WNEUQupNvUZ0waH08tGe6kAQ4= | |||
github.com/go-openapi/validate v0.19.15/go.mod h1:tbn/fdOwYHgrhPBzidZfJC2MIVvs9GA7monOmWBbeCI= | |||
github.com/go-openapi/validate v0.20.1 h1:QGQ5CvK74E28t3DkegGweKR+auemUi5IdpMc4x3UW6s= | |||
github.com/go-openapi/validate v0.20.1/go.mod h1:b60iJT+xNNLfaQJUqLI7946tYiFEOuE9E4k54HpKcJ0= | |||
github.com/go-openapi/validate v0.20.2 h1:AhqDegYV3J3iQkMPJSXkvzymHKMTw0BST3RK3hTT4ts= | |||
github.com/go-openapi/validate v0.20.2/go.mod h1:e7OJoKNgd0twXZwIn0A43tHbvIcr/rZIVCbJBpTUoY0= | |||
github.com/go-redis/redis v6.15.2+incompatible h1:9SpNVG76gr6InJGxoZ6IuuxaCOQwDAhzyXg+Bs+0Sb4= | |||
github.com/go-redis/redis v6.15.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= | |||
github.com/go-redis/redis/v8 v8.4.0 h1:J5NCReIgh3QgUJu398hUncxDExN4gMOHI11NVbVicGQ= | |||
github.com/go-redis/redis/v8 v8.4.0/go.mod h1:A1tbYoHSa1fXwN+//ljcCYYJeLmVrwL9hbQN45Jdy0M= | |||
github.com/go-redis/redis/v8 v8.5.0 h1:L3r1Q3I5WOUdXZGCP6g44EruKh0u3n6co5Hl5xWkdGA= | |||
github.com/go-redis/redis/v8 v8.5.0/go.mod h1:YmEcgBDttjnkbMzDAhDtQxY9yVA7jMN6PCR5HeMvqFE= | |||
github.com/go-redis/redis/v8 v8.6.0 h1:swqbqOrxaPztsj2Hf1p94M3YAgl7hYEpcw21z299hh8= | |||
github.com/go-redis/redis/v8 v8.6.0/go.mod h1:DQ9q4Rk2HtwkrwVrdgmphoOQDMfpvcd/nHEwRsicg8s= | |||
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= | |||
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= | |||
github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= | |||
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= | |||
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= | |||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= | |||
github.com/go-swagger/go-swagger v0.26.0 h1:LM5XTbeRbDdjHRqdA0jchK5Qs3DB2F0R5QmXs1pd/L0= | |||
github.com/go-swagger/go-swagger v0.26.0/go.mod h1:kSAA+pziAr5x68on6TxcxWoIl9GOo1mLsHmfMV2rrCo= | |||
github.com/go-swagger/go-swagger v0.26.1 h1:1XUWLnH6hKxHzeKjJfA2gHkSqcT1Zgi4q/PZp2hDdN8= | |||
github.com/go-swagger/go-swagger v0.26.1/go.mod h1:zlf/LHplZpdtU2mYXg9Ajd3+9TgHYltv5f/pEM6LjnI= | |||
github.com/go-swagger/scan-repo-boundary v0.0.0-20180623220736-973b3573c013 h1:l9rI6sNaZgNC0LnF3MiE+qTmyBA/tZAg1rtyrGbUMK0= | |||
github.com/go-swagger/scan-repo-boundary v0.0.0-20180623220736-973b3573c013/go.mod h1:b65mBPzqzZWxOZGxSWrqs4GInLIn+u99Q9q7p+GKni0= | |||
github.com/go-testfixtures/testfixtures/v3 v3.4.1 h1:Qz9y0wUOXPHzKhK6C79A/menChtEu/xd0Dn5ngVyMD0= | |||
github.com/go-testfixtures/testfixtures/v3 v3.4.1/go.mod h1:P4L3WxgOsCLbAeUC50qX5rdj1ULZfUMqgCbqah3OH5U= | |||
github.com/go-testfixtures/testfixtures/v3 v3.5.0 h1:fFJGHhFdcwy48oTLHvr0WRQ09rGiZE+as9ElvbRWS+c= | |||
github.com/go-testfixtures/testfixtures/v3 v3.5.0/go.mod h1:P4L3WxgOsCLbAeUC50qX5rdj1ULZfUMqgCbqah3OH5U= | |||
github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= | |||
github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= | |||
github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= | |||
@@ -499,8 +525,9 @@ github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM | |||
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= | |||
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= | |||
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= | |||
github.com/golang/snappy v0.0.2 h1:aeE13tS0IiQgFjYdoL8qN3K1N2bXXtI6Vi51/y7BpMw= | |||
github.com/golang/snappy v0.0.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= | |||
github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= | |||
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= | |||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= | |||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= | |||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= | |||
@@ -521,6 +548,7 @@ github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO | |||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | |||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= | |||
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= | |||
github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= | |||
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= | |||
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= | |||
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= | |||
@@ -529,9 +557,13 @@ github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hf | |||
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= | |||
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= | |||
github.com/google/pprof v0.0.0-20200905233945-acf8798be1f7/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= | |||
github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= | |||
github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= | |||
github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= | |||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= | |||
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | |||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | |||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | |||
github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= | |||
github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | |||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= | |||
@@ -549,14 +581,14 @@ github.com/gorilla/handlers v1.4.1/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/ | |||
github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= | |||
github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= | |||
github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= | |||
github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw= | |||
github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= | |||
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= | |||
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= | |||
github.com/gorilla/pat v0.0.0-20180118222023-199c85a7f6d1 h1:LqbZZ9sNMWVjeXS4NN5oVvhMjDyLhmA1LG86oSo+IqY= | |||
github.com/gorilla/pat v0.0.0-20180118222023-199c85a7f6d1/go.mod h1:YeAe0gNeiNT5hoiZRI4yiOky6jVdNvfO2N6Kav/HmxY= | |||
github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= | |||
github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= | |||
github.com/gorilla/sessions v1.1.1/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w= | |||
github.com/gorilla/sessions v1.2.0 h1:S7P+1Hm5V/AT9cjEcUD5uDaQSX0OE577aCXgoaKpYbQ= | |||
github.com/gorilla/sessions v1.2.0/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= | |||
github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI= | |||
github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= | |||
@@ -572,7 +604,6 @@ github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoP | |||
github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= | |||
github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= | |||
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= | |||
github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= | |||
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= | |||
github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= | |||
github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= | |||
@@ -603,6 +634,7 @@ github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw | |||
github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= | |||
github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= | |||
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= | |||
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= | |||
github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= | |||
github.com/imdario/mergo v0.3.11 h1:3tnifQM4i+fbajXKBHXWEH+KvNHqojZ778UH75j3bGA= | |||
github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= | |||
@@ -664,6 +696,7 @@ github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJS | |||
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= | |||
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= | |||
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= | |||
github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= | |||
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= | |||
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= | |||
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= | |||
@@ -685,8 +718,9 @@ github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaR | |||
github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= | |||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= | |||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= | |||
github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY= | |||
github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= | |||
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 h1:DowS9hvgyYSX4TO5NpyC606/Z4SxnNYbT+WX27or6Ck= | |||
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= | |||
github.com/keybase/go-crypto v0.0.0-20200123153347-de78d2cb44f4 h1:cTxwSmnaqLoo+4tLukHoB9iqHOu3LmLhRmgUxZo6Vp4= | |||
github.com/keybase/go-crypto v0.0.0-20200123153347-de78d2cb44f4/go.mod h1:ghbZscTyKdM07+Fw3KSi0hcJm+AlEUWj8QLlPtijN/M= | |||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= | |||
@@ -695,13 +729,16 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o | |||
github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= | |||
github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= | |||
github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= | |||
github.com/klauspost/compress v1.11.7 h1:0hzRabrMN4tSTvMfnL3SCv1ZGeAP23ynzodBgaHeMeg= | |||
github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= | |||
github.com/klauspost/compress v1.11.8 h1:difgzQsp5mdAz9v8lm3P/I+EpDKMU/6uTMw1y1FObuo= | |||
github.com/klauspost/compress v1.11.8/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= | |||
github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= | |||
github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= | |||
github.com/klauspost/cpuid v1.2.5/go.mod h1:bYW4mA6ZgKPob1/Dlai2LviZJO7KGI3uoWLd42rAQw4= | |||
github.com/klauspost/cpuid v1.3.1 h1:5JNjFYYQrZeKRJ0734q51WCEEn2huer72Dc7K+R/b6s= | |||
github.com/klauspost/cpuid v1.3.1/go.mod h1:bYW4mA6ZgKPob1/Dlai2LviZJO7KGI3uoWLd42rAQw4= | |||
github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= | |||
github.com/klauspost/cpuid/v2 v2.0.4 h1:g0I61F2K2DjRHz1cnxlkNSBIaePVoJIjjnHui8QHbiw= | |||
github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= | |||
github.com/klauspost/pgzip v1.2.4/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= | |||
github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE= | |||
github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= | |||
@@ -730,8 +767,9 @@ github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= | |||
github.com/lib/pq v1.7.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= | |||
github.com/lib/pq v1.9.0 h1:L8nSXQQzAYByakOFMTwpjRoHsMJklur4Gi59b6VivR8= | |||
github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= | |||
github.com/libdns/libdns v0.1.0 h1:0ctCOrVJsVzj53mop1angHp/pE3hmAhP7KiHvR0HD04= | |||
github.com/libdns/libdns v0.1.0/go.mod h1:yQCXzk1lEZmmCPa857bnk4TsOiqYasqpyOEeSObbb40= | |||
github.com/libdns/libdns v0.2.0 h1:ewg3ByWrdUrxrje8ChPVMBNcotg7H9LQYg+u5De2RzI= | |||
github.com/libdns/libdns v0.2.0/go.mod h1:yQCXzk1lEZmmCPa857bnk4TsOiqYasqpyOEeSObbb40= | |||
github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= | |||
github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= | |||
github.com/lunny/bluemonday v1.0.5-0.20201227154428-ca34796141e8 h1:1omo92DLtxQu6VwVPSZAmduHaK5zssed6cvkHyl1XOg= | |||
@@ -750,11 +788,12 @@ github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN | |||
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | |||
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | |||
github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= | |||
github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= | |||
github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= | |||
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= | |||
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= | |||
github.com/markbates/going v1.0.0/go.mod h1:I6mnB4BPnEeqo85ynXIx1ZFLLbtiLHNXVgWeFO9OGOA= | |||
github.com/markbates/goth v1.66.1 h1:8YIkRxRxiUxhYhHdvriKiJ+mk2itt2ezjf/ABR8U+JI= | |||
github.com/markbates/goth v1.66.1/go.mod h1:57wf4mNb/fy/Cizm8xe4komsQRKPuelTMrm/wGcw3v8= | |||
github.com/markbates/goth v1.67.1 h1:gU5B0pzHVyhnJPwGynfFnkfvaQ39C1Sy+ewdl+bhAOw= | |||
github.com/markbates/goth v1.67.1/go.mod h1:EyLFHGU5ySr2GXRDyJH5nu2dA7parbC8QwIYW/rGcWg= | |||
github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= | |||
github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= | |||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= | |||
@@ -773,6 +812,7 @@ github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHX | |||
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= | |||
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= | |||
github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= | |||
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= | |||
github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= | |||
github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= | |||
github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= | |||
@@ -785,20 +825,23 @@ github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81 h1:QASJXOGm2RZ5Ardbc8 | |||
github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= | |||
github.com/mgechev/revive v1.0.3 h1:z3FL6IFFN3JKzHYHD8O1ExH9g/4lAGJ5x1+9rPZgsFg= | |||
github.com/mgechev/revive v1.0.3/go.mod h1:POGGZagSo/0frdr7VeAifzS5Uka0d0GPiM35MsTO8nE= | |||
github.com/mholt/acmez v0.1.1 h1:KQODCqk+hBn3O7qfCRPj6L96uG65T5BSS95FKNEqtdA= | |||
github.com/mholt/acmez v0.1.1/go.mod h1:8qnn8QA/Ewx8E3ZSsmscqsIjhhpxuy9vqdgbX2ceceM= | |||
github.com/mholt/acmez v0.1.3 h1:J7MmNIk4Qf9b8mAGqAh4XkNeowv3f1zW816yf4zt7Qk= | |||
github.com/mholt/acmez v0.1.3/go.mod h1:8qnn8QA/Ewx8E3ZSsmscqsIjhhpxuy9vqdgbX2ceceM= | |||
github.com/mholt/archiver/v3 v3.5.0 h1:nE8gZIrw66cu4osS/U7UW7YDuGMHssxKutU8IfWxwWE= | |||
github.com/mholt/archiver/v3 v3.5.0/go.mod h1:qqTTPUK/HZPFgFQ/TJ3BzvTpF/dPtFVJXdQbCmeMxwc= | |||
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= | |||
github.com/miekg/dns v1.1.30 h1:Qww6FseFn8PRfw07jueqIXqodm0JKiiKuK0DeXSqfyo= | |||
github.com/miekg/dns v1.1.30/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= | |||
github.com/miekg/dns v1.1.40 h1:pyyPFfGMnciYUk/mXpKkVmeMQjfXqt3FAJ2hy7tPiLA= | |||
github.com/miekg/dns v1.1.40/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= | |||
github.com/minio/md5-simd v1.1.0/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw= | |||
github.com/minio/md5-simd v1.1.1 h1:9ojcLbuZ4gXbB2sX53MKn8JUZ0sB/2wfwsEcRw+I08U= | |||
github.com/minio/md5-simd v1.1.1/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw= | |||
github.com/minio/minio-go/v7 v7.0.9 h1:v+RS2/dpRq+XaarlZItHd3MVjjQcN2noRn4HxmVdmg4= | |||
github.com/minio/minio-go/v7 v7.0.9/go.mod h1:td4gW1ldOsj1PbSNS+WYK43j+P1XVhX/8W8awaYlBFo= | |||
github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU= | |||
github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= | |||
github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= | |||
github.com/minio/minio-go/v7 v7.0.10 h1:1oUKe4EOPUEhw2qnPQaPsJ0lmVTYLFu03SiItauXs94= | |||
github.com/minio/minio-go/v7 v7.0.10/go.mod h1:td4gW1ldOsj1PbSNS+WYK43j+P1XVhX/8W8awaYlBFo= | |||
github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= | |||
github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= | |||
github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= | |||
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= | |||
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= | |||
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= | |||
@@ -820,13 +863,14 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN | |||
github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= | |||
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= | |||
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= | |||
github.com/mrjones/oauth v0.0.0-20180629183705-f4e24b6d100c h1:3wkDRdxK92dF+c1ke2dtj7ZzemFWBHB9plnJOtlwdFA= | |||
github.com/mrjones/oauth v0.0.0-20180629183705-f4e24b6d100c/go.mod h1:skjdDftzkFALcuGzYSklqYd8gvat6F1gZJ4YPVbkZpM= | |||
github.com/mrjones/oauth v0.0.0-20190623134757-126b35219450 h1:j2kD3MT1z4PXCiUllUJF9mWUESr9TWKS7iEKsQ/IipM= | |||
github.com/mrjones/oauth v0.0.0-20190623134757-126b35219450/go.mod h1:skjdDftzkFALcuGzYSklqYd8gvat6F1gZJ4YPVbkZpM= | |||
github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= | |||
github.com/mschoch/smat v0.2.0 h1:8imxQsjDm8yFEAVBe7azKmKSgzSkZXDuKkSq9374khM= | |||
github.com/mschoch/smat v0.2.0/go.mod h1:kc9mz7DoBKqDyiRL7VZN8KvXQMWeTaVnttLRXOlotKw= | |||
github.com/msteinert/pam v0.0.0-20200810204841-913b8f8cdf8b h1:UZ7RWBA77dedMow4Zkek/gfJ/DRbti7C+Ny/Pf9D3gM= | |||
github.com/msteinert/pam v0.0.0-20200810204841-913b8f8cdf8b/go.mod h1:np1wUFZ6tyoke22qDJZY40URn9Ae51gX7ljIWXN5TJs= | |||
github.com/msteinert/pam v0.0.0-20201130170657-e61372126161 h1:XQ1+fYPzaWZCVdu1xzjL917Xy9Yb7imLEU0wHelafKA= | |||
github.com/msteinert/pam v0.0.0-20201130170657-e61372126161/go.mod h1:np1wUFZ6tyoke22qDJZY40URn9Ae51gX7ljIWXN5TJs= | |||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= | |||
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= | |||
github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= | |||
@@ -851,8 +895,9 @@ github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtb | |||
github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= | |||
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= | |||
github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= | |||
github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= | |||
github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= | |||
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= | |||
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= | |||
github.com/oliamb/cutter v0.2.2 h1:Lfwkya0HHNU1YLnGv2hTkzHfasrSMkgv4Dn+5rmlk3k= | |||
github.com/oliamb/cutter v0.2.2/go.mod h1:4BenG2/4GuRBDbVm/OPahDVqbrOemzpPiG5mi1iryBU= | |||
github.com/olivere/elastic/v7 v7.0.22 h1:esBA6JJwvYgfms0EVlH7Z+9J4oQ/WUADF2y/nCNDw7s= | |||
@@ -861,7 +906,6 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W | |||
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | |||
github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | |||
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= | |||
github.com/onsi/ginkgo v1.14.2 h1:8mVmC9kjFFmA8H4pKMUhcblgifdkOIXPvbhN1T36q1M= | |||
github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= | |||
github.com/onsi/ginkgo v1.15.0 h1:1V1NfVQR87RtWAgp1lv9JZJ5Jap+XFGKPi00andXGi4= | |||
github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg= | |||
@@ -869,7 +913,6 @@ github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa | |||
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= | |||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= | |||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= | |||
github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= | |||
github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= | |||
github.com/onsi/gomega v1.10.5 h1:7n6FEkpFmfCoo2t+YYqXH0evK+a9ICQz0xcAy9dYcaQ= | |||
github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48= | |||
@@ -899,8 +942,8 @@ github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0 | |||
github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= | |||
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= | |||
github.com/pierrec/lz4/v4 v4.0.3/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= | |||
github.com/pierrec/lz4/v4 v4.1.1 h1:cS6aGkNLJr4u+UwaA21yp+gbWN3WJWtKo1axmPDObMA= | |||
github.com/pierrec/lz4/v4 v4.1.1/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= | |||
github.com/pierrec/lz4/v4 v4.1.3 h1:/dvQpkb0o1pVlSgKNQqfkavlnXaIK+hJ0LXsKRUN9D4= | |||
github.com/pierrec/lz4/v4 v4.1.3/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= | |||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | |||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | |||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= | |||
@@ -934,16 +977,18 @@ github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 | |||
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= | |||
github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= | |||
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= | |||
github.com/prometheus/common v0.15.0 h1:4fgOnadei3EZvgRwxJ7RMpG1k1pOZth5Pc13tyspaKM= | |||
github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= | |||
github.com/prometheus/common v0.18.0 h1:WCVKW7aL6LEe1uryfI9dnEc2ZqNB1Fn0ok930v0iL1Y= | |||
github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= | |||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= | |||
github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= | |||
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= | |||
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= | |||
github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= | |||
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= | |||
github.com/prometheus/procfs v0.2.0 h1:wH4vA7pcjKuZzjF7lM8awk4fnuJO6idemZXoKnULUx4= | |||
github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= | |||
github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= | |||
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= | |||
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= | |||
github.com/quasoft/websspi v1.0.0 h1:5nDgdM5xSur9s+B5w2xQ5kxf5nUGqgFgU4W0aDLZ8Mw= | |||
github.com/quasoft/websspi v1.0.0/go.mod h1:HmVdl939dQ0WIXZhyik+ARdI03M6bQzaSEKcgpFmewk= | |||
@@ -963,8 +1008,9 @@ github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OK | |||
github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= | |||
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/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= | |||
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= | |||
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= | |||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= | |||
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= | |||
github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= | |||
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= | |||
@@ -976,7 +1022,6 @@ github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 h1:pntxY8Ary0t4 | |||
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= | |||
github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 h1:bUGsEnyNbVPw06Bs80sCeARAlK8lhwqGyi6UT8ymuGk= | |||
github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= | |||
github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= | |||
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= | |||
github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546 h1:pXY9qYc/MP5zdvqWEUH6SjNiu7VhSjuVFTFiTcphaLU= | |||
github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= | |||
@@ -1003,8 +1048,9 @@ github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4k | |||
github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= | |||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= | |||
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= | |||
github.com/spf13/afero v1.4.1 h1:asw9sl74539yqavKaglDM5hFpdJVK0Y5Dr/JOgQ89nQ= | |||
github.com/spf13/afero v1.4.1/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= | |||
github.com/spf13/afero v1.5.1 h1:VHu76Lk0LSP1x254maIu2bplkWpfBWI+B+6fdoZprcg= | |||
github.com/spf13/afero v1.5.1/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= | |||
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= | |||
github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= | |||
github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= | |||
@@ -1056,8 +1102,8 @@ github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31/go.mod h1:onvgF043R+l | |||
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= | |||
github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= | |||
github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= | |||
github.com/ulikunitz/xz v0.5.8 h1:ERv8V6GKqVi23rgu5cj9pVfVzJbOqAY2Ntl88O6c2nQ= | |||
github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= | |||
github.com/ulikunitz/xz v0.5.10 h1:t92gobL9l3HE202wg3rlk19F6X+JOxl9BBrCCMYEYd8= | |||
github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= | |||
github.com/unknwon/com v0.0.0-20190804042917-757f69c95f3e/go.mod h1:tOOxU81rwgoCLoOVVPHb6T/wt8HZygqH5id+GNnlCXM= | |||
github.com/unknwon/com v1.0.1 h1:3d1LTxD+Lnf3soQiD4Cp/0BRB+Rsa/+RTvz8GMMzIXs= | |||
github.com/unknwon/com v1.0.1/go.mod h1:tOOxU81rwgoCLoOVVPHb6T/wt8HZygqH5id+GNnlCXM= | |||
@@ -1079,8 +1125,9 @@ github.com/willf/bitset v1.1.11 h1:N7Z7E9UvjW+sGsEl7k/SJrvY2reP1A07MrGuCjIOjRE= | |||
github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= | |||
github.com/xanzy/go-gitlab v0.44.0 h1:cEiGhqu7EpFGuei2a2etAwB+x6403E5CvpLn35y+GPs= | |||
github.com/xanzy/go-gitlab v0.44.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= | |||
github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70= | |||
github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= | |||
github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI= | |||
github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= | |||
github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= | |||
github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= | |||
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo= | |||
@@ -1116,8 +1163,10 @@ go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qL | |||
go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= | |||
go.mongodb.org/mongo-driver v1.3.4/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= | |||
go.mongodb.org/mongo-driver v1.4.3/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= | |||
go.mongodb.org/mongo-driver v1.4.4 h1:bsPHfODES+/yx2PCWzUYMH8xj6PVniPI8DQrsJuSXSs= | |||
go.mongodb.org/mongo-driver v1.4.4/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= | |||
go.mongodb.org/mongo-driver v1.4.5/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= | |||
go.mongodb.org/mongo-driver v1.4.6 h1:rh7GdYmDrb8AQSkF8yteAus8qYOgOASWDOv1BWqBXkU= | |||
go.mongodb.org/mongo-driver v1.4.6/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= | |||
go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= | |||
go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= | |||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= | |||
@@ -1126,26 +1175,33 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= | |||
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= | |||
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= | |||
go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= | |||
go.opentelemetry.io/otel v0.14.0 h1:YFBEfjCk9MTjaytCNSUkp9Q8lF7QJezA06T71FbQxLQ= | |||
go.opentelemetry.io/otel v0.14.0/go.mod h1:vH5xEuwy7Rts0GNtsCW3HYQoZDY+OmBJ6t1bFGGlxgw= | |||
go.opentelemetry.io/otel v0.16.0 h1:uIWEbdeb4vpKPGITLsRVUS44L5oDbDUCZxn8lkxhmgw= | |||
go.opentelemetry.io/otel v0.16.0/go.mod h1:e4GKElweB8W2gWUqbghw0B8t5MCTccc9212eNHnOHwA= | |||
go.opentelemetry.io/otel v0.17.0 h1:6MKOu8WY4hmfpQ4oQn34u6rYhnf2sWf1LXYO/UFm71U= | |||
go.opentelemetry.io/otel v0.17.0/go.mod h1:Oqtdxmf7UtEvL037ohlgnaYa1h7GtMh0NcSd9eqkC9s= | |||
go.opentelemetry.io/otel/metric v0.17.0 h1:t+5EioN8YFXQ2EH+1j6FHCKMUj+57zIDSnSGr/mWuug= | |||
go.opentelemetry.io/otel/metric v0.17.0/go.mod h1:hUz9lH1rNXyEwWAhIWCMFWKhYtpASgSnObJFnU26dJ0= | |||
go.opentelemetry.io/otel/oteltest v0.17.0 h1:TyAihUowTDLqb4+m5ePAsR71xPJaTBJl4KDArIdi9k4= | |||
go.opentelemetry.io/otel/oteltest v0.17.0/go.mod h1:JT/LGFxPwpN+nlsTiinSYjdIx3hZIGqHCpChcIZmdoE= | |||
go.opentelemetry.io/otel/trace v0.17.0 h1:SBOj64/GAOyWzs5F680yW1ITIfJkm6cJWL2YAvuL9xY= | |||
go.opentelemetry.io/otel/trace v0.17.0/go.mod h1:bIujpqg6ZL6xUTubIUgziI1jSaUPthmabA/ygf/6Cfg= | |||
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= | |||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= | |||
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= | |||
go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= | |||
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= | |||
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= | |||
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= | |||
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= | |||
go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= | |||
go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= | |||
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= | |||
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= | |||
go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= | |||
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= | |||
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= | |||
go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= | |||
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= | |||
go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= | |||
go.uber.org/zap v1.15.0 h1:ZZCA22JRF2gQE5FoNmhmrf7jeJJ2uhqDUNRYKm8dvmM= | |||
go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= | |||
go.uber.org/zap v1.16.0 h1:uFRZXykJGK9lLY4HtgSw44DnIcAM+kRBP7x5m+NpAOM= | |||
go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= | |||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | |||
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | |||
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | |||
@@ -1171,8 +1227,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh | |||
golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | |||
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | |||
golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= | |||
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY= | |||
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= | |||
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 h1:/ZScEX8SfEmUGRHs0gxpqteO5nfNW6axyZbBdw9A12g= | |||
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= | |||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | |||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | |||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= | |||
@@ -1194,8 +1250,9 @@ golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHl | |||
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= | |||
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= | |||
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= | |||
golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= | |||
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= | |||
golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 h1:2M3HP5CCK1Si9FQhwnzYhXdG6DXeebvUHFpre8QvbyI= | |||
golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= | |||
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= | |||
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= | |||
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= | |||
@@ -1203,8 +1260,10 @@ golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= | |||
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= | |||
golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= | |||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | |||
golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= | |||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | |||
golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | |||
golang.org/x/mod v0.4.1 h1:Kvvh58BN8Y9/lBi7hTekvtMpm07eUZ0ck5pRHpsMWrY= | |||
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | |||
golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | |||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | |||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | |||
@@ -1252,11 +1311,14 @@ golang.org/x/net v0.0.0-20200927032502-5d4f70055728/go.mod h1:/O7V0waA8r7cgGh81R | |||
golang.org/x/net v0.0.0-20200930145003-4acb6c075d10/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= | |||
golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= | |||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= | |||
golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= | |||
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= | |||
golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= | |||
golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= | |||
golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= | |||
golang.org/x/net v0.0.0-20210119194325-5f4716e94777 h1:003p0dJM77cxMSyCPFphvZf/Y5/NXf5fzg6ufd1/Oew= | |||
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= | |||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw= | |||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= | |||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | |||
golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | |||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | |||
@@ -1265,8 +1327,10 @@ golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4Iltr | |||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | |||
golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= | |||
golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= | |||
golang.org/x/oauth2 v0.0.0-20210210192628-66670185b0cd h1:2arJsLyTCJGek+eeptQ3z49Rqndm0f+zvvpwNIXWNIA= | |||
golang.org/x/oauth2 v0.0.0-20210210192628-66670185b0cd/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= | |||
golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= | |||
golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= | |||
golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93 h1:alLDrZkL34Y2bnGHfvC1CYBRBXCXgx8AC2vY4MRtYX4= | |||
golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= | |||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |||
@@ -1276,8 +1340,9 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ | |||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |||
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |||
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 h1:SQFwaSi55rU7vdNs9Yr0Z324VNlrF+0wMqRXT4St8ck= | |||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |||
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a h1:DcqTD9SDLc+1P/r1EmRBwnVsrOwW+kk2vWf9n+1sGhs= | |||
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |||
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | |||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | |||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | |||
@@ -1309,6 +1374,7 @@ golang.org/x/sys v0.0.0-20190730183949-1393eb018365/go.mod h1:h1NjWce9XRLGQEsW7w | |||
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
@@ -1341,11 +1407,15 @@ golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7w | |||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk= | |||
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/sys v0.0.0-20210228012217-479acdf4ea46 h1:V066+OYJ66oTjnhm4Yrn7SXIwSCiDQJxpBxmvqb1N1c= | |||
golang.org/x/sys v0.0.0-20210228012217-479acdf4ea46/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= | |||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= | |||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= | |||
@@ -1361,8 +1431,8 @@ golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxb | |||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | |||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | |||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | |||
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE= | |||
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | |||
golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE= | |||
golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | |||
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | |||
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | |||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | |||
@@ -1426,8 +1496,12 @@ golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82u | |||
golang.org/x/tools v0.0.0-20200928182047-19e03678916f/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= | |||
golang.org/x/tools v0.0.0-20200929161345-d7fc70abf50f/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= | |||
golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= | |||
golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= | |||
golang.org/x/tools v0.0.0-20201125231158-b5590deeca9b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= | |||
golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= | |||
golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= | |||
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= | |||
golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= | |||
golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY= | |||
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= | |||
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | |||
@@ -1455,6 +1529,9 @@ google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M | |||
google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= | |||
google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= | |||
google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= | |||
google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= | |||
google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= | |||
google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= | |||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= | |||
google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= | |||
google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= | |||
@@ -1497,6 +1574,11 @@ google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6D | |||
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | |||
google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | |||
google.golang.org/genproto v0.0.0-20200929141702-51c3e5b607fe/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | |||
google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | |||
google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | |||
google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | |||
google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | |||
google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | |||
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= | |||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= | |||
google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= | |||
@@ -1516,6 +1598,9 @@ google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM | |||
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= | |||
google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= | |||
google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= | |||
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= | |||
google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= | |||
google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= | |||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= | |||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= | |||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= | |||
@@ -1566,8 +1651,9 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= | |||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= | |||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | |||
gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | |||
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= | |||
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | |||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= | |||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | |||
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | |||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | |||
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | |||
@@ -1586,11 +1672,9 @@ sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= | |||
sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= | |||
strk.kbt.io/projects/go/libravatar v0.0.0-20191008002943-06d1c002b251 h1:mUcz5b3FJbP5Cvdq7Khzn6J9OCUQJaBwgBkCR+MOwSs= | |||
strk.kbt.io/projects/go/libravatar v0.0.0-20191008002943-06d1c002b251/go.mod h1:FJGmPh3vz9jSos1L/F91iAgnC/aejc0wIIrF2ZwJxdY= | |||
xorm.io/builder v0.3.7 h1:2pETdKRK+2QG4mLX4oODHEhn5Z8j1m8sXa7jfu+/SZI= | |||
xorm.io/builder v0.3.7/go.mod h1:aUW0S9eb9VCaPohFCH3j7czOx1PMW3i1HrSzbLYGBSE= | |||
xorm.io/builder v0.3.9 h1:Sd65/LdWyO7LR8+Cbd+e7mm3sK/7U9k0jS3999IDHMc= | |||
xorm.io/builder v0.3.9/go.mod h1:aUW0S9eb9VCaPohFCH3j7czOx1PMW3i1HrSzbLYGBSE= | |||
xorm.io/xorm v1.0.6 h1:7eco1c8QUpGz+3dztpLDj9gU1bTiQdFC/KtmPaLxUJk= | |||
xorm.io/xorm v1.0.6/go.mod h1:uF9EtbhODq5kNWxMbnBEj8hRRZnlcNSz2t2N7HW/+A4= | |||
xorm.io/xorm v1.0.7 h1:26yBTDVI+CfQpVz2Y88fISh+aiJXIPP4eNoTJlwzsC4= | |||
xorm.io/xorm v1.0.7/go.mod h1:uF9EtbhODq5kNWxMbnBEj8hRRZnlcNSz2t2N7HW/+A4= |
@@ -0,0 +1 @@ | |||
*.exe |
@@ -1,6 +1,6 @@ | |||
MIT License | |||
The MIT License (MIT) | |||
Copyright (c) 2015 Dmitri Shuralyov | |||
Copyright (c) 2015 Microsoft | |||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||
of this software and associated documentation files (the "Software"), to deal | |||
@@ -19,3 +19,4 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |||
SOFTWARE. | |||
@@ -0,0 +1,22 @@ | |||
# go-winio | |||
This repository contains utilities for efficiently performing Win32 IO operations in | |||
Go. Currently, this is focused on accessing named pipes and other file handles, and | |||
for using named pipes as a net transport. | |||
This code relies on IO completion ports to avoid blocking IO on system threads, allowing Go | |||
to reuse the thread to schedule another goroutine. This limits support to Windows Vista and | |||
newer operating systems. This is similar to the implementation of network sockets in Go's net | |||
package. | |||
Please see the LICENSE file for licensing information. | |||
This project has adopted the [Microsoft Open Source Code of | |||
Conduct](https://opensource.microsoft.com/codeofconduct/). For more information | |||
see the [Code of Conduct | |||
FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact | |||
[opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional | |||
questions or comments. | |||
Thanks to natefinch for the inspiration for this library. See https://github.com/natefinch/npipe | |||
for another named pipe implementation. |
@@ -0,0 +1,280 @@ | |||
// +build windows | |||
package winio | |||
import ( | |||
"encoding/binary" | |||
"errors" | |||
"fmt" | |||
"io" | |||
"io/ioutil" | |||
"os" | |||
"runtime" | |||
"syscall" | |||
"unicode/utf16" | |||
) | |||
//sys backupRead(h syscall.Handle, b []byte, bytesRead *uint32, abort bool, processSecurity bool, context *uintptr) (err error) = BackupRead | |||
//sys backupWrite(h syscall.Handle, b []byte, bytesWritten *uint32, abort bool, processSecurity bool, context *uintptr) (err error) = BackupWrite | |||
const ( | |||
BackupData = uint32(iota + 1) | |||
BackupEaData | |||
BackupSecurity | |||
BackupAlternateData | |||
BackupLink | |||
BackupPropertyData | |||
BackupObjectId | |||
BackupReparseData | |||
BackupSparseBlock | |||
BackupTxfsData | |||
) | |||
const ( | |||
StreamSparseAttributes = uint32(8) | |||
) | |||
const ( | |||
WRITE_DAC = 0x40000 | |||
WRITE_OWNER = 0x80000 | |||
ACCESS_SYSTEM_SECURITY = 0x1000000 | |||
) | |||
// BackupHeader represents a backup stream of a file. | |||
type BackupHeader struct { | |||
Id uint32 // The backup stream ID | |||
Attributes uint32 // Stream attributes | |||
Size int64 // The size of the stream in bytes | |||
Name string // The name of the stream (for BackupAlternateData only). | |||
Offset int64 // The offset of the stream in the file (for BackupSparseBlock only). | |||
} | |||
type win32StreamId struct { | |||
StreamId uint32 | |||
Attributes uint32 | |||
Size uint64 | |||
NameSize uint32 | |||
} | |||
// BackupStreamReader reads from a stream produced by the BackupRead Win32 API and produces a series | |||
// of BackupHeader values. | |||
type BackupStreamReader struct { | |||
r io.Reader | |||
bytesLeft int64 | |||
} | |||
// NewBackupStreamReader produces a BackupStreamReader from any io.Reader. | |||
func NewBackupStreamReader(r io.Reader) *BackupStreamReader { | |||
return &BackupStreamReader{r, 0} | |||
} | |||
// Next returns the next backup stream and prepares for calls to Read(). It skips the remainder of the current stream if | |||
// it was not completely read. | |||
func (r *BackupStreamReader) Next() (*BackupHeader, error) { | |||
if r.bytesLeft > 0 { | |||
if s, ok := r.r.(io.Seeker); ok { | |||
// Make sure Seek on io.SeekCurrent sometimes succeeds | |||
// before trying the actual seek. | |||
if _, err := s.Seek(0, io.SeekCurrent); err == nil { | |||
if _, err = s.Seek(r.bytesLeft, io.SeekCurrent); err != nil { | |||
return nil, err | |||
} | |||
r.bytesLeft = 0 | |||
} | |||
} | |||
if _, err := io.Copy(ioutil.Discard, r); err != nil { | |||
return nil, err | |||
} | |||
} | |||
var wsi win32StreamId | |||
if err := binary.Read(r.r, binary.LittleEndian, &wsi); err != nil { | |||
return nil, err | |||
} | |||
hdr := &BackupHeader{ | |||
Id: wsi.StreamId, | |||
Attributes: wsi.Attributes, | |||
Size: int64(wsi.Size), | |||
} | |||
if wsi.NameSize != 0 { | |||
name := make([]uint16, int(wsi.NameSize/2)) | |||
if err := binary.Read(r.r, binary.LittleEndian, name); err != nil { | |||
return nil, err | |||
} | |||
hdr.Name = syscall.UTF16ToString(name) | |||
} | |||
if wsi.StreamId == BackupSparseBlock { | |||
if err := binary.Read(r.r, binary.LittleEndian, &hdr.Offset); err != nil { | |||
return nil, err | |||
} | |||
hdr.Size -= 8 | |||
} | |||
r.bytesLeft = hdr.Size | |||
return hdr, nil | |||
} | |||
// Read reads from the current backup stream. | |||
func (r *BackupStreamReader) Read(b []byte) (int, error) { | |||
if r.bytesLeft == 0 { | |||
return 0, io.EOF | |||
} | |||
if int64(len(b)) > r.bytesLeft { | |||
b = b[:r.bytesLeft] | |||
} | |||
n, err := r.r.Read(b) | |||
r.bytesLeft -= int64(n) | |||
if err == io.EOF { | |||
err = io.ErrUnexpectedEOF | |||
} else if r.bytesLeft == 0 && err == nil { | |||
err = io.EOF | |||
} | |||
return n, err | |||
} | |||
// BackupStreamWriter writes a stream compatible with the BackupWrite Win32 API. | |||
type BackupStreamWriter struct { | |||
w io.Writer | |||
bytesLeft int64 | |||
} | |||
// NewBackupStreamWriter produces a BackupStreamWriter on top of an io.Writer. | |||
func NewBackupStreamWriter(w io.Writer) *BackupStreamWriter { | |||
return &BackupStreamWriter{w, 0} | |||
} | |||
// WriteHeader writes the next backup stream header and prepares for calls to Write(). | |||
func (w *BackupStreamWriter) WriteHeader(hdr *BackupHeader) error { | |||
if w.bytesLeft != 0 { | |||
return fmt.Errorf("missing %d bytes", w.bytesLeft) | |||
} | |||
name := utf16.Encode([]rune(hdr.Name)) | |||
wsi := win32StreamId{ | |||
StreamId: hdr.Id, | |||
Attributes: hdr.Attributes, | |||
Size: uint64(hdr.Size), | |||
NameSize: uint32(len(name) * 2), | |||
} | |||
if hdr.Id == BackupSparseBlock { | |||
// Include space for the int64 block offset | |||
wsi.Size += 8 | |||
} | |||
if err := binary.Write(w.w, binary.LittleEndian, &wsi); err != nil { | |||
return err | |||
} | |||
if len(name) != 0 { | |||
if err := binary.Write(w.w, binary.LittleEndian, name); err != nil { | |||
return err | |||
} | |||
} | |||
if hdr.Id == BackupSparseBlock { | |||
if err := binary.Write(w.w, binary.LittleEndian, hdr.Offset); err != nil { | |||
return err | |||
} | |||
} | |||
w.bytesLeft = hdr.Size | |||
return nil | |||
} | |||
// Write writes to the current backup stream. | |||
func (w *BackupStreamWriter) Write(b []byte) (int, error) { | |||
if w.bytesLeft < int64(len(b)) { | |||
return 0, fmt.Errorf("too many bytes by %d", int64(len(b))-w.bytesLeft) | |||
} | |||
n, err := w.w.Write(b) | |||
w.bytesLeft -= int64(n) | |||
return n, err | |||
} | |||
// BackupFileReader provides an io.ReadCloser interface on top of the BackupRead Win32 API. | |||
type BackupFileReader struct { | |||
f *os.File | |||
includeSecurity bool | |||
ctx uintptr | |||
} | |||
// NewBackupFileReader returns a new BackupFileReader from a file handle. If includeSecurity is true, | |||
// Read will attempt to read the security descriptor of the file. | |||
func NewBackupFileReader(f *os.File, includeSecurity bool) *BackupFileReader { | |||
r := &BackupFileReader{f, includeSecurity, 0} | |||
return r | |||
} | |||
// Read reads a backup stream from the file by calling the Win32 API BackupRead(). | |||
func (r *BackupFileReader) Read(b []byte) (int, error) { | |||
var bytesRead uint32 | |||
err := backupRead(syscall.Handle(r.f.Fd()), b, &bytesRead, false, r.includeSecurity, &r.ctx) | |||
if err != nil { | |||
return 0, &os.PathError{"BackupRead", r.f.Name(), err} | |||
} | |||
runtime.KeepAlive(r.f) | |||
if bytesRead == 0 { | |||
return 0, io.EOF | |||
} | |||
return int(bytesRead), nil | |||
} | |||
// Close frees Win32 resources associated with the BackupFileReader. It does not close | |||
// the underlying file. | |||
func (r *BackupFileReader) Close() error { | |||
if r.ctx != 0 { | |||
backupRead(syscall.Handle(r.f.Fd()), nil, nil, true, false, &r.ctx) | |||
runtime.KeepAlive(r.f) | |||
r.ctx = 0 | |||
} | |||
return nil | |||
} | |||
// BackupFileWriter provides an io.WriteCloser interface on top of the BackupWrite Win32 API. | |||
type BackupFileWriter struct { | |||
f *os.File | |||
includeSecurity bool | |||
ctx uintptr | |||
} | |||
// NewBackupFileWriter returns a new BackupFileWriter from a file handle. If includeSecurity is true, | |||
// Write() will attempt to restore the security descriptor from the stream. | |||
func NewBackupFileWriter(f *os.File, includeSecurity bool) *BackupFileWriter { | |||
w := &BackupFileWriter{f, includeSecurity, 0} | |||
return w | |||
} | |||
// Write restores a portion of the file using the provided backup stream. | |||
func (w *BackupFileWriter) Write(b []byte) (int, error) { | |||
var bytesWritten uint32 | |||
err := backupWrite(syscall.Handle(w.f.Fd()), b, &bytesWritten, false, w.includeSecurity, &w.ctx) | |||
if err != nil { | |||
return 0, &os.PathError{"BackupWrite", w.f.Name(), err} | |||
} | |||
runtime.KeepAlive(w.f) | |||
if int(bytesWritten) != len(b) { | |||
return int(bytesWritten), errors.New("not all bytes could be written") | |||
} | |||
return len(b), nil | |||
} | |||
// Close frees Win32 resources associated with the BackupFileWriter. It does not | |||
// close the underlying file. | |||
func (w *BackupFileWriter) Close() error { | |||
if w.ctx != 0 { | |||
backupWrite(syscall.Handle(w.f.Fd()), nil, nil, true, false, &w.ctx) | |||
runtime.KeepAlive(w.f) | |||
w.ctx = 0 | |||
} | |||
return nil | |||
} | |||
// OpenForBackup opens a file or directory, potentially skipping access checks if the backup | |||
// or restore privileges have been acquired. | |||
// | |||
// If the file opened was a directory, it cannot be used with Readdir(). | |||
func OpenForBackup(path string, access uint32, share uint32, createmode uint32) (*os.File, error) { | |||
winPath, err := syscall.UTF16FromString(path) | |||
if err != nil { | |||
return nil, err | |||
} | |||
h, err := syscall.CreateFile(&winPath[0], access, share, nil, createmode, syscall.FILE_FLAG_BACKUP_SEMANTICS|syscall.FILE_FLAG_OPEN_REPARSE_POINT, 0) | |||
if err != nil { | |||
err = &os.PathError{Op: "open", Path: path, Err: err} | |||
return nil, err | |||
} | |||
return os.NewFile(uintptr(h), path), nil | |||
} |
@@ -0,0 +1,137 @@ | |||
package winio | |||
import ( | |||
"bytes" | |||
"encoding/binary" | |||
"errors" | |||
) | |||
type fileFullEaInformation struct { | |||
NextEntryOffset uint32 | |||
Flags uint8 | |||
NameLength uint8 | |||
ValueLength uint16 | |||
} | |||
var ( | |||
fileFullEaInformationSize = binary.Size(&fileFullEaInformation{}) | |||
errInvalidEaBuffer = errors.New("invalid extended attribute buffer") | |||
errEaNameTooLarge = errors.New("extended attribute name too large") | |||
errEaValueTooLarge = errors.New("extended attribute value too large") | |||
) | |||
// ExtendedAttribute represents a single Windows EA. | |||
type ExtendedAttribute struct { | |||
Name string | |||
Value []byte | |||
Flags uint8 | |||
} | |||
func parseEa(b []byte) (ea ExtendedAttribute, nb []byte, err error) { | |||
var info fileFullEaInformation | |||
err = binary.Read(bytes.NewReader(b), binary.LittleEndian, &info) | |||
if err != nil { | |||
err = errInvalidEaBuffer | |||
return | |||
} | |||
nameOffset := fileFullEaInformationSize | |||
nameLen := int(info.NameLength) | |||
valueOffset := nameOffset + int(info.NameLength) + 1 | |||
valueLen := int(info.ValueLength) | |||
nextOffset := int(info.NextEntryOffset) | |||
if valueLen+valueOffset > len(b) || nextOffset < 0 || nextOffset > len(b) { | |||
err = errInvalidEaBuffer | |||
return | |||
} | |||
ea.Name = string(b[nameOffset : nameOffset+nameLen]) | |||
ea.Value = b[valueOffset : valueOffset+valueLen] | |||
ea.Flags = info.Flags | |||
if info.NextEntryOffset != 0 { | |||
nb = b[info.NextEntryOffset:] | |||
} | |||
return | |||
} | |||
// DecodeExtendedAttributes decodes a list of EAs from a FILE_FULL_EA_INFORMATION | |||
// buffer retrieved from BackupRead, ZwQueryEaFile, etc. | |||
func DecodeExtendedAttributes(b []byte) (eas []ExtendedAttribute, err error) { | |||
for len(b) != 0 { | |||
ea, nb, err := parseEa(b) | |||
if err != nil { | |||
return nil, err | |||
} | |||
eas = append(eas, ea) | |||
b = nb | |||
} | |||
return | |||
} | |||
func writeEa(buf *bytes.Buffer, ea *ExtendedAttribute, last bool) error { | |||
if int(uint8(len(ea.Name))) != len(ea.Name) { | |||
return errEaNameTooLarge | |||
} | |||
if int(uint16(len(ea.Value))) != len(ea.Value) { | |||
return errEaValueTooLarge | |||
} | |||
entrySize := uint32(fileFullEaInformationSize + len(ea.Name) + 1 + len(ea.Value)) | |||
withPadding := (entrySize + 3) &^ 3 | |||
nextOffset := uint32(0) | |||
if !last { | |||
nextOffset = withPadding | |||
} | |||
info := fileFullEaInformation{ | |||
NextEntryOffset: nextOffset, | |||
Flags: ea.Flags, | |||
NameLength: uint8(len(ea.Name)), | |||
ValueLength: uint16(len(ea.Value)), | |||
} | |||
err := binary.Write(buf, binary.LittleEndian, &info) | |||
if err != nil { | |||
return err | |||
} | |||
_, err = buf.Write([]byte(ea.Name)) | |||
if err != nil { | |||
return err | |||
} | |||
err = buf.WriteByte(0) | |||
if err != nil { | |||
return err | |||
} | |||
_, err = buf.Write(ea.Value) | |||
if err != nil { | |||
return err | |||
} | |||
_, err = buf.Write([]byte{0, 0, 0}[0 : withPadding-entrySize]) | |||
if err != nil { | |||
return err | |||
} | |||
return nil | |||
} | |||
// EncodeExtendedAttributes encodes a list of EAs into a FILE_FULL_EA_INFORMATION | |||
// buffer for use with BackupWrite, ZwSetEaFile, etc. | |||
func EncodeExtendedAttributes(eas []ExtendedAttribute) ([]byte, error) { | |||
var buf bytes.Buffer | |||
for i := range eas { | |||
last := false | |||
if i == len(eas)-1 { | |||
last = true | |||
} | |||
err := writeEa(&buf, &eas[i], last) | |||
if err != nil { | |||
return nil, err | |||
} | |||
} | |||
return buf.Bytes(), nil | |||
} |
@@ -0,0 +1,323 @@ | |||
// +build windows | |||
package winio | |||
import ( | |||
"errors" | |||
"io" | |||
"runtime" | |||
"sync" | |||
"sync/atomic" | |||
"syscall" | |||
"time" | |||
) | |||
//sys cancelIoEx(file syscall.Handle, o *syscall.Overlapped) (err error) = CancelIoEx | |||
//sys createIoCompletionPort(file syscall.Handle, port syscall.Handle, key uintptr, threadCount uint32) (newport syscall.Handle, err error) = CreateIoCompletionPort | |||
//sys getQueuedCompletionStatus(port syscall.Handle, bytes *uint32, key *uintptr, o **ioOperation, timeout uint32) (err error) = GetQueuedCompletionStatus | |||
//sys setFileCompletionNotificationModes(h syscall.Handle, flags uint8) (err error) = SetFileCompletionNotificationModes | |||
//sys wsaGetOverlappedResult(h syscall.Handle, o *syscall.Overlapped, bytes *uint32, wait bool, flags *uint32) (err error) = ws2_32.WSAGetOverlappedResult | |||
type atomicBool int32 | |||
func (b *atomicBool) isSet() bool { return atomic.LoadInt32((*int32)(b)) != 0 } | |||
func (b *atomicBool) setFalse() { atomic.StoreInt32((*int32)(b), 0) } | |||
func (b *atomicBool) setTrue() { atomic.StoreInt32((*int32)(b), 1) } | |||
func (b *atomicBool) swap(new bool) bool { | |||
var newInt int32 | |||
if new { | |||
newInt = 1 | |||
} | |||
return atomic.SwapInt32((*int32)(b), newInt) == 1 | |||
} | |||
const ( | |||
cFILE_SKIP_COMPLETION_PORT_ON_SUCCESS = 1 | |||
cFILE_SKIP_SET_EVENT_ON_HANDLE = 2 | |||
) | |||
var ( | |||
ErrFileClosed = errors.New("file has already been closed") | |||
ErrTimeout = &timeoutError{} | |||
) | |||
type timeoutError struct{} | |||
func (e *timeoutError) Error() string { return "i/o timeout" } | |||
func (e *timeoutError) Timeout() bool { return true } | |||
func (e *timeoutError) Temporary() bool { return true } | |||
type timeoutChan chan struct{} | |||
var ioInitOnce sync.Once | |||
var ioCompletionPort syscall.Handle | |||
// ioResult contains the result of an asynchronous IO operation | |||
type ioResult struct { | |||
bytes uint32 | |||
err error | |||
} | |||
// ioOperation represents an outstanding asynchronous Win32 IO | |||
type ioOperation struct { | |||
o syscall.Overlapped | |||
ch chan ioResult | |||
} | |||
func initIo() { | |||
h, err := createIoCompletionPort(syscall.InvalidHandle, 0, 0, 0xffffffff) | |||
if err != nil { | |||
panic(err) | |||
} | |||
ioCompletionPort = h | |||
go ioCompletionProcessor(h) | |||
} | |||
// win32File implements Reader, Writer, and Closer on a Win32 handle without blocking in a syscall. | |||
// It takes ownership of this handle and will close it if it is garbage collected. | |||
type win32File struct { | |||
handle syscall.Handle | |||
wg sync.WaitGroup | |||
wgLock sync.RWMutex | |||
closing atomicBool | |||
socket bool | |||
readDeadline deadlineHandler | |||
writeDeadline deadlineHandler | |||
} | |||
type deadlineHandler struct { | |||
setLock sync.Mutex | |||
channel timeoutChan | |||
channelLock sync.RWMutex | |||
timer *time.Timer | |||
timedout atomicBool | |||
} | |||
// makeWin32File makes a new win32File from an existing file handle | |||
func makeWin32File(h syscall.Handle) (*win32File, error) { | |||
f := &win32File{handle: h} | |||
ioInitOnce.Do(initIo) | |||
_, err := createIoCompletionPort(h, ioCompletionPort, 0, 0xffffffff) | |||
if err != nil { | |||
return nil, err | |||
} | |||
err = setFileCompletionNotificationModes(h, cFILE_SKIP_COMPLETION_PORT_ON_SUCCESS|cFILE_SKIP_SET_EVENT_ON_HANDLE) | |||
if err != nil { | |||
return nil, err | |||
} | |||
f.readDeadline.channel = make(timeoutChan) | |||
f.writeDeadline.channel = make(timeoutChan) | |||
return f, nil | |||
} | |||
func MakeOpenFile(h syscall.Handle) (io.ReadWriteCloser, error) { | |||
// If we return the result of makeWin32File directly, it can result in an | |||
// interface-wrapped nil, rather than a nil interface value. | |||
f, err := makeWin32File(h) | |||
if err != nil { | |||
return nil, err | |||
} | |||
return f, nil | |||
} | |||
// closeHandle closes the resources associated with a Win32 handle | |||
func (f *win32File) closeHandle() { | |||
f.wgLock.Lock() | |||
// Atomically set that we are closing, releasing the resources only once. | |||
if !f.closing.swap(true) { | |||
f.wgLock.Unlock() | |||
// cancel all IO and wait for it to complete | |||
cancelIoEx(f.handle, nil) | |||
f.wg.Wait() | |||
// at this point, no new IO can start | |||
syscall.Close(f.handle) | |||
f.handle = 0 | |||
} else { | |||
f.wgLock.Unlock() | |||
} | |||
} | |||
// Close closes a win32File. | |||
func (f *win32File) Close() error { | |||
f.closeHandle() | |||
return nil | |||
} | |||
// prepareIo prepares for a new IO operation. | |||
// The caller must call f.wg.Done() when the IO is finished, prior to Close() returning. | |||
func (f *win32File) prepareIo() (*ioOperation, error) { | |||
f.wgLock.RLock() | |||
if f.closing.isSet() { | |||
f.wgLock.RUnlock() | |||
return nil, ErrFileClosed | |||
} | |||
f.wg.Add(1) | |||
f.wgLock.RUnlock() | |||
c := &ioOperation{} | |||
c.ch = make(chan ioResult) | |||
return c, nil | |||
} | |||
// ioCompletionProcessor processes completed async IOs forever | |||
func ioCompletionProcessor(h syscall.Handle) { | |||
for { | |||
var bytes uint32 | |||
var key uintptr | |||
var op *ioOperation | |||
err := getQueuedCompletionStatus(h, &bytes, &key, &op, syscall.INFINITE) | |||
if op == nil { | |||
panic(err) | |||
} | |||
op.ch <- ioResult{bytes, err} | |||
} | |||
} | |||
// asyncIo processes the return value from ReadFile or WriteFile, blocking until | |||
// the operation has actually completed. | |||
func (f *win32File) asyncIo(c *ioOperation, d *deadlineHandler, bytes uint32, err error) (int, error) { | |||
if err != syscall.ERROR_IO_PENDING { | |||
return int(bytes), err | |||
} | |||
if f.closing.isSet() { | |||
cancelIoEx(f.handle, &c.o) | |||
} | |||
var timeout timeoutChan | |||
if d != nil { | |||
d.channelLock.Lock() | |||
timeout = d.channel | |||
d.channelLock.Unlock() | |||
} | |||
var r ioResult | |||
select { | |||
case r = <-c.ch: | |||
err = r.err | |||
if err == syscall.ERROR_OPERATION_ABORTED { | |||
if f.closing.isSet() { | |||
err = ErrFileClosed | |||
} | |||
} else if err != nil && f.socket { | |||
// err is from Win32. Query the overlapped structure to get the winsock error. | |||
var bytes, flags uint32 | |||
err = wsaGetOverlappedResult(f.handle, &c.o, &bytes, false, &flags) | |||
} | |||
case <-timeout: | |||
cancelIoEx(f.handle, &c.o) | |||
r = <-c.ch | |||
err = r.err | |||
if err == syscall.ERROR_OPERATION_ABORTED { | |||
err = ErrTimeout | |||
} | |||
} | |||
// runtime.KeepAlive is needed, as c is passed via native | |||
// code to ioCompletionProcessor, c must remain alive | |||
// until the channel read is complete. | |||
runtime.KeepAlive(c) | |||
return int(r.bytes), err | |||
} | |||
// Read reads from a file handle. | |||
func (f *win32File) Read(b []byte) (int, error) { | |||
c, err := f.prepareIo() | |||
if err != nil { | |||
return 0, err | |||
} | |||
defer f.wg.Done() | |||
if f.readDeadline.timedout.isSet() { | |||
return 0, ErrTimeout | |||
} | |||
var bytes uint32 | |||
err = syscall.ReadFile(f.handle, b, &bytes, &c.o) | |||
n, err := f.asyncIo(c, &f.readDeadline, bytes, err) | |||
runtime.KeepAlive(b) | |||
// Handle EOF conditions. | |||
if err == nil && n == 0 && len(b) != 0 { | |||
return 0, io.EOF | |||
} else if err == syscall.ERROR_BROKEN_PIPE { | |||
return 0, io.EOF | |||
} else { | |||
return n, err | |||
} | |||
} | |||
// Write writes to a file handle. | |||
func (f *win32File) Write(b []byte) (int, error) { | |||
c, err := f.prepareIo() | |||
if err != nil { | |||
return 0, err | |||
} | |||
defer f.wg.Done() | |||
if f.writeDeadline.timedout.isSet() { | |||
return 0, ErrTimeout | |||
} | |||
var bytes uint32 | |||
err = syscall.WriteFile(f.handle, b, &bytes, &c.o) | |||
n, err := f.asyncIo(c, &f.writeDeadline, bytes, err) | |||
runtime.KeepAlive(b) | |||
return n, err | |||
} | |||
func (f *win32File) SetReadDeadline(deadline time.Time) error { | |||
return f.readDeadline.set(deadline) | |||
} | |||
func (f *win32File) SetWriteDeadline(deadline time.Time) error { | |||
return f.writeDeadline.set(deadline) | |||
} | |||
func (f *win32File) Flush() error { | |||
return syscall.FlushFileBuffers(f.handle) | |||
} | |||
func (f *win32File) Fd() uintptr { | |||
return uintptr(f.handle) | |||
} | |||
func (d *deadlineHandler) set(deadline time.Time) error { | |||
d.setLock.Lock() | |||
defer d.setLock.Unlock() | |||
if d.timer != nil { | |||
if !d.timer.Stop() { | |||
<-d.channel | |||
} | |||
d.timer = nil | |||
} | |||
d.timedout.setFalse() | |||
select { | |||
case <-d.channel: | |||
d.channelLock.Lock() | |||
d.channel = make(chan struct{}) | |||
d.channelLock.Unlock() | |||
default: | |||
} | |||
if deadline.IsZero() { | |||
return nil | |||
} | |||
timeoutIO := func() { | |||
d.timedout.setTrue() | |||
close(d.channel) | |||
} | |||
now := time.Now() | |||
duration := deadline.Sub(now) | |||
if deadline.After(now) { | |||
// Deadline is in the future, set a timer to wait | |||
d.timer = time.AfterFunc(duration, timeoutIO) | |||
} else { | |||
// Deadline is in the past. Cancel all pending IO now. | |||
timeoutIO() | |||
} | |||
return nil | |||
} |
@@ -0,0 +1,61 @@ | |||
// +build windows | |||
package winio | |||
import ( | |||
"os" | |||
"runtime" | |||
"syscall" | |||
"unsafe" | |||
) | |||
//sys getFileInformationByHandleEx(h syscall.Handle, class uint32, buffer *byte, size uint32) (err error) = GetFileInformationByHandleEx | |||
//sys setFileInformationByHandle(h syscall.Handle, class uint32, buffer *byte, size uint32) (err error) = SetFileInformationByHandle | |||
const ( | |||
fileBasicInfo = 0 | |||
fileIDInfo = 0x12 | |||
) | |||
// FileBasicInfo contains file access time and file attributes information. | |||
type FileBasicInfo struct { | |||
CreationTime, LastAccessTime, LastWriteTime, ChangeTime syscall.Filetime | |||
FileAttributes uint32 | |||
pad uint32 // padding | |||
} | |||
// GetFileBasicInfo retrieves times and attributes for a file. | |||
func GetFileBasicInfo(f *os.File) (*FileBasicInfo, error) { | |||
bi := &FileBasicInfo{} | |||
if err := getFileInformationByHandleEx(syscall.Handle(f.Fd()), fileBasicInfo, (*byte)(unsafe.Pointer(bi)), uint32(unsafe.Sizeof(*bi))); err != nil { | |||
return nil, &os.PathError{Op: "GetFileInformationByHandleEx", Path: f.Name(), Err: err} | |||
} | |||
runtime.KeepAlive(f) | |||
return bi, nil | |||
} | |||
// SetFileBasicInfo sets times and attributes for a file. | |||
func SetFileBasicInfo(f *os.File, bi *FileBasicInfo) error { | |||
if err := setFileInformationByHandle(syscall.Handle(f.Fd()), fileBasicInfo, (*byte)(unsafe.Pointer(bi)), uint32(unsafe.Sizeof(*bi))); err != nil { | |||
return &os.PathError{Op: "SetFileInformationByHandle", Path: f.Name(), Err: err} | |||
} | |||
runtime.KeepAlive(f) | |||
return nil | |||
} | |||
// FileIDInfo contains the volume serial number and file ID for a file. This pair should be | |||
// unique on a system. | |||
type FileIDInfo struct { | |||
VolumeSerialNumber uint64 | |||
FileID [16]byte | |||
} | |||
// GetFileID retrieves the unique (volume, file ID) pair for a file. | |||
func GetFileID(f *os.File) (*FileIDInfo, error) { | |||
fileID := &FileIDInfo{} | |||
if err := getFileInformationByHandleEx(syscall.Handle(f.Fd()), fileIDInfo, (*byte)(unsafe.Pointer(fileID)), uint32(unsafe.Sizeof(*fileID))); err != nil { | |||
return nil, &os.PathError{Op: "GetFileInformationByHandleEx", Path: f.Name(), Err: err} | |||
} | |||
runtime.KeepAlive(f) | |||
return fileID, nil | |||
} |
@@ -0,0 +1,9 @@ | |||
module github.com/Microsoft/go-winio | |||
go 1.12 | |||
require ( | |||
github.com/pkg/errors v0.9.1 | |||
github.com/sirupsen/logrus v1.4.1 | |||
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3 | |||
) |
@@ -0,0 +1,16 @@ | |||
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/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= | |||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= | |||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= | |||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | |||
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/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k= | |||
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= | |||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | |||
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= | |||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= | |||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | |||
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3 h1:7TYNF4UdlohbFwpNH04CoPMp1cHUZgO1Ebq5r2hIjfo= | |||
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= |
@@ -0,0 +1,305 @@ | |||
package winio | |||
import ( | |||
"fmt" | |||
"io" | |||
"net" | |||
"os" | |||
"syscall" | |||
"time" | |||
"unsafe" | |||
"github.com/Microsoft/go-winio/pkg/guid" | |||
) | |||
//sys bind(s syscall.Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socketError] = ws2_32.bind | |||
const ( | |||
afHvSock = 34 // AF_HYPERV | |||
socketError = ^uintptr(0) | |||
) | |||
// An HvsockAddr is an address for a AF_HYPERV socket. | |||
type HvsockAddr struct { | |||
VMID guid.GUID | |||
ServiceID guid.GUID | |||
} | |||
type rawHvsockAddr struct { | |||
Family uint16 | |||
_ uint16 | |||
VMID guid.GUID | |||
ServiceID guid.GUID | |||
} | |||
// Network returns the address's network name, "hvsock". | |||
func (addr *HvsockAddr) Network() string { | |||
return "hvsock" | |||
} | |||
func (addr *HvsockAddr) String() string { | |||
return fmt.Sprintf("%s:%s", &addr.VMID, &addr.ServiceID) | |||
} | |||
// VsockServiceID returns an hvsock service ID corresponding to the specified AF_VSOCK port. | |||
func VsockServiceID(port uint32) guid.GUID { | |||
g, _ := guid.FromString("00000000-facb-11e6-bd58-64006a7986d3") | |||
g.Data1 = port | |||
return g | |||
} | |||
func (addr *HvsockAddr) raw() rawHvsockAddr { | |||
return rawHvsockAddr{ | |||
Family: afHvSock, | |||
VMID: addr.VMID, | |||
ServiceID: addr.ServiceID, | |||
} | |||
} | |||
func (addr *HvsockAddr) fromRaw(raw *rawHvsockAddr) { | |||
addr.VMID = raw.VMID | |||
addr.ServiceID = raw.ServiceID | |||
} | |||
// HvsockListener is a socket listener for the AF_HYPERV address family. | |||
type HvsockListener struct { | |||
sock *win32File | |||
addr HvsockAddr | |||
} | |||
// HvsockConn is a connected socket of the AF_HYPERV address family. | |||
type HvsockConn struct { | |||
sock *win32File | |||
local, remote HvsockAddr | |||
} | |||
func newHvSocket() (*win32File, error) { | |||
fd, err := syscall.Socket(afHvSock, syscall.SOCK_STREAM, 1) | |||
if err != nil { | |||
return nil, os.NewSyscallError("socket", err) | |||
} | |||
f, err := makeWin32File(fd) | |||
if err != nil { | |||
syscall.Close(fd) | |||
return nil, err | |||
} | |||
f.socket = true | |||
return f, nil | |||
} | |||
// ListenHvsock listens for connections on the specified hvsock address. | |||
func ListenHvsock(addr *HvsockAddr) (_ *HvsockListener, err error) { | |||
l := &HvsockListener{addr: *addr} | |||
sock, err := newHvSocket() | |||
if err != nil { | |||
return nil, l.opErr("listen", err) | |||
} | |||
sa := addr.raw() | |||
err = bind(sock.handle, unsafe.Pointer(&sa), int32(unsafe.Sizeof(sa))) | |||
if err != nil { | |||
return nil, l.opErr("listen", os.NewSyscallError("socket", err)) | |||
} | |||
err = syscall.Listen(sock.handle, 16) | |||
if err != nil { | |||
return nil, l.opErr("listen", os.NewSyscallError("listen", err)) | |||
} | |||
return &HvsockListener{sock: sock, addr: *addr}, nil | |||
} | |||
func (l *HvsockListener) opErr(op string, err error) error { | |||
return &net.OpError{Op: op, Net: "hvsock", Addr: &l.addr, Err: err} | |||
} | |||
// Addr returns the listener's network address. | |||
func (l *HvsockListener) Addr() net.Addr { | |||
return &l.addr | |||
} | |||
// Accept waits for the next connection and returns it. | |||
func (l *HvsockListener) Accept() (_ net.Conn, err error) { | |||
sock, err := newHvSocket() | |||
if err != nil { | |||
return nil, l.opErr("accept", err) | |||
} | |||
defer func() { | |||
if sock != nil { | |||
sock.Close() | |||
} | |||
}() | |||
c, err := l.sock.prepareIo() | |||
if err != nil { | |||
return nil, l.opErr("accept", err) | |||
} | |||
defer l.sock.wg.Done() | |||
// AcceptEx, per documentation, requires an extra 16 bytes per address. | |||
const addrlen = uint32(16 + unsafe.Sizeof(rawHvsockAddr{})) | |||
var addrbuf [addrlen * 2]byte | |||
var bytes uint32 | |||
err = syscall.AcceptEx(l.sock.handle, sock.handle, &addrbuf[0], 0, addrlen, addrlen, &bytes, &c.o) | |||
_, err = l.sock.asyncIo(c, nil, bytes, err) | |||
if err != nil { | |||
return nil, l.opErr("accept", os.NewSyscallError("acceptex", err)) | |||
} | |||
conn := &HvsockConn{ | |||
sock: sock, | |||
} | |||
conn.local.fromRaw((*rawHvsockAddr)(unsafe.Pointer(&addrbuf[0]))) | |||
conn.remote.fromRaw((*rawHvsockAddr)(unsafe.Pointer(&addrbuf[addrlen]))) | |||
sock = nil | |||
return conn, nil | |||
} | |||
// Close closes the listener, causing any pending Accept calls to fail. | |||
func (l *HvsockListener) Close() error { | |||
return l.sock.Close() | |||
} | |||
/* Need to finish ConnectEx handling | |||
func DialHvsock(ctx context.Context, addr *HvsockAddr) (*HvsockConn, error) { | |||
sock, err := newHvSocket() | |||
if err != nil { | |||
return nil, err | |||
} | |||
defer func() { | |||
if sock != nil { | |||
sock.Close() | |||
} | |||
}() | |||
c, err := sock.prepareIo() | |||
if err != nil { | |||
return nil, err | |||
} | |||
defer sock.wg.Done() | |||
var bytes uint32 | |||
err = windows.ConnectEx(windows.Handle(sock.handle), sa, nil, 0, &bytes, &c.o) | |||
_, err = sock.asyncIo(ctx, c, nil, bytes, err) | |||
if err != nil { | |||
return nil, err | |||
} | |||
conn := &HvsockConn{ | |||
sock: sock, | |||
remote: *addr, | |||
} | |||
sock = nil | |||
return conn, nil | |||
} | |||
*/ | |||
func (conn *HvsockConn) opErr(op string, err error) error { | |||
return &net.OpError{Op: op, Net: "hvsock", Source: &conn.local, Addr: &conn.remote, Err: err} | |||
} | |||
func (conn *HvsockConn) Read(b []byte) (int, error) { | |||
c, err := conn.sock.prepareIo() | |||
if err != nil { | |||
return 0, conn.opErr("read", err) | |||
} | |||
defer conn.sock.wg.Done() | |||
buf := syscall.WSABuf{Buf: &b[0], Len: uint32(len(b))} | |||
var flags, bytes uint32 | |||
err = syscall.WSARecv(conn.sock.handle, &buf, 1, &bytes, &flags, &c.o, nil) | |||
n, err := conn.sock.asyncIo(c, &conn.sock.readDeadline, bytes, err) | |||
if err != nil { | |||
if _, ok := err.(syscall.Errno); ok { | |||
err = os.NewSyscallError("wsarecv", err) | |||
} | |||
return 0, conn.opErr("read", err) | |||
} else if n == 0 { | |||
err = io.EOF | |||
} | |||
return n, err | |||
} | |||
func (conn *HvsockConn) Write(b []byte) (int, error) { | |||
t := 0 | |||
for len(b) != 0 { | |||
n, err := conn.write(b) | |||
if err != nil { | |||
return t + n, err | |||
} | |||
t += n | |||
b = b[n:] | |||
} | |||
return t, nil | |||
} | |||
func (conn *HvsockConn) write(b []byte) (int, error) { | |||
c, err := conn.sock.prepareIo() | |||
if err != nil { | |||
return 0, conn.opErr("write", err) | |||
} | |||
defer conn.sock.wg.Done() | |||
buf := syscall.WSABuf{Buf: &b[0], Len: uint32(len(b))} | |||
var bytes uint32 | |||
err = syscall.WSASend(conn.sock.handle, &buf, 1, &bytes, 0, &c.o, nil) | |||
n, err := conn.sock.asyncIo(c, &conn.sock.writeDeadline, bytes, err) | |||
if err != nil { | |||
if _, ok := err.(syscall.Errno); ok { | |||
err = os.NewSyscallError("wsasend", err) | |||
} | |||
return 0, conn.opErr("write", err) | |||
} | |||
return n, err | |||
} | |||
// Close closes the socket connection, failing any pending read or write calls. | |||
func (conn *HvsockConn) Close() error { | |||
return conn.sock.Close() | |||
} | |||
func (conn *HvsockConn) shutdown(how int) error { | |||
err := syscall.Shutdown(conn.sock.handle, syscall.SHUT_RD) | |||
if err != nil { | |||
return os.NewSyscallError("shutdown", err) | |||
} | |||
return nil | |||
} | |||
// CloseRead shuts down the read end of the socket. | |||
func (conn *HvsockConn) CloseRead() error { | |||
err := conn.shutdown(syscall.SHUT_RD) | |||
if err != nil { | |||
return conn.opErr("close", err) | |||
} | |||
return nil | |||
} | |||
// CloseWrite shuts down the write end of the socket, notifying the other endpoint that | |||
// no more data will be written. | |||
func (conn *HvsockConn) CloseWrite() error { | |||
err := conn.shutdown(syscall.SHUT_WR) | |||
if err != nil { | |||
return conn.opErr("close", err) | |||
} | |||
return nil | |||
} | |||
// LocalAddr returns the local address of the connection. | |||
func (conn *HvsockConn) LocalAddr() net.Addr { | |||
return &conn.local | |||
} | |||
// RemoteAddr returns the remote address of the connection. | |||
func (conn *HvsockConn) RemoteAddr() net.Addr { | |||
return &conn.remote | |||
} | |||
// SetDeadline implements the net.Conn SetDeadline method. | |||
func (conn *HvsockConn) SetDeadline(t time.Time) error { | |||
conn.SetReadDeadline(t) | |||
conn.SetWriteDeadline(t) | |||
return nil | |||
} | |||
// SetReadDeadline implements the net.Conn SetReadDeadline method. | |||
func (conn *HvsockConn) SetReadDeadline(t time.Time) error { | |||
return conn.sock.SetReadDeadline(t) | |||
} | |||
// SetWriteDeadline implements the net.Conn SetWriteDeadline method. | |||
func (conn *HvsockConn) SetWriteDeadline(t time.Time) error { | |||
return conn.sock.SetWriteDeadline(t) | |||
} |
@@ -0,0 +1,517 @@ | |||
// +build windows | |||
package winio | |||
import ( | |||
"context" | |||
"errors" | |||
"fmt" | |||
"io" | |||
"net" | |||
"os" | |||
"runtime" | |||
"syscall" | |||
"time" | |||
"unsafe" | |||
) | |||
//sys connectNamedPipe(pipe syscall.Handle, o *syscall.Overlapped) (err error) = ConnectNamedPipe | |||
//sys createNamedPipe(name string, flags uint32, pipeMode uint32, maxInstances uint32, outSize uint32, inSize uint32, defaultTimeout uint32, sa *syscall.SecurityAttributes) (handle syscall.Handle, err error) [failretval==syscall.InvalidHandle] = CreateNamedPipeW | |||
//sys createFile(name string, access uint32, mode uint32, sa *syscall.SecurityAttributes, createmode uint32, attrs uint32, templatefile syscall.Handle) (handle syscall.Handle, err error) [failretval==syscall.InvalidHandle] = CreateFileW | |||
//sys getNamedPipeInfo(pipe syscall.Handle, flags *uint32, outSize *uint32, inSize *uint32, maxInstances *uint32) (err error) = GetNamedPipeInfo | |||
//sys getNamedPipeHandleState(pipe syscall.Handle, state *uint32, curInstances *uint32, maxCollectionCount *uint32, collectDataTimeout *uint32, userName *uint16, maxUserNameSize uint32) (err error) = GetNamedPipeHandleStateW | |||
//sys localAlloc(uFlags uint32, length uint32) (ptr uintptr) = LocalAlloc | |||
//sys ntCreateNamedPipeFile(pipe *syscall.Handle, access uint32, oa *objectAttributes, iosb *ioStatusBlock, share uint32, disposition uint32, options uint32, typ uint32, readMode uint32, completionMode uint32, maxInstances uint32, inboundQuota uint32, outputQuota uint32, timeout *int64) (status ntstatus) = ntdll.NtCreateNamedPipeFile | |||
//sys rtlNtStatusToDosError(status ntstatus) (winerr error) = ntdll.RtlNtStatusToDosErrorNoTeb | |||
//sys rtlDosPathNameToNtPathName(name *uint16, ntName *unicodeString, filePart uintptr, reserved uintptr) (status ntstatus) = ntdll.RtlDosPathNameToNtPathName_U | |||
//sys rtlDefaultNpAcl(dacl *uintptr) (status ntstatus) = ntdll.RtlDefaultNpAcl | |||
type ioStatusBlock struct { | |||
Status, Information uintptr | |||
} | |||
type objectAttributes struct { | |||
Length uintptr | |||
RootDirectory uintptr | |||
ObjectName *unicodeString | |||
Attributes uintptr | |||
SecurityDescriptor *securityDescriptor | |||
SecurityQoS uintptr | |||
} | |||
type unicodeString struct { | |||
Length uint16 | |||
MaximumLength uint16 | |||
Buffer uintptr | |||
} | |||
type securityDescriptor struct { | |||
Revision byte | |||
Sbz1 byte | |||
Control uint16 | |||
Owner uintptr | |||
Group uintptr | |||
Sacl uintptr | |||
Dacl uintptr | |||
} | |||
type ntstatus int32 | |||
func (status ntstatus) Err() error { | |||
if status >= 0 { | |||
return nil | |||
} | |||
return rtlNtStatusToDosError(status) | |||
} | |||
const ( | |||
cERROR_PIPE_BUSY = syscall.Errno(231) | |||
cERROR_NO_DATA = syscall.Errno(232) | |||
cERROR_PIPE_CONNECTED = syscall.Errno(535) | |||
cERROR_SEM_TIMEOUT = syscall.Errno(121) | |||
cSECURITY_SQOS_PRESENT = 0x100000 | |||
cSECURITY_ANONYMOUS = 0 | |||
cPIPE_TYPE_MESSAGE = 4 | |||
cPIPE_READMODE_MESSAGE = 2 | |||
cFILE_OPEN = 1 | |||
cFILE_CREATE = 2 | |||
cFILE_PIPE_MESSAGE_TYPE = 1 | |||
cFILE_PIPE_REJECT_REMOTE_CLIENTS = 2 | |||
cSE_DACL_PRESENT = 4 | |||
) | |||
var ( | |||
// ErrPipeListenerClosed is returned for pipe operations on listeners that have been closed. | |||
// This error should match net.errClosing since docker takes a dependency on its text. | |||
ErrPipeListenerClosed = errors.New("use of closed network connection") | |||
errPipeWriteClosed = errors.New("pipe has been closed for write") | |||
) | |||
type win32Pipe struct { | |||
*win32File | |||
path string | |||
} | |||
type win32MessageBytePipe struct { | |||
win32Pipe | |||
writeClosed bool | |||
readEOF bool | |||
} | |||
type pipeAddress string | |||
func (f *win32Pipe) LocalAddr() net.Addr { | |||
return pipeAddress(f.path) | |||
} | |||
func (f *win32Pipe) RemoteAddr() net.Addr { | |||
return pipeAddress(f.path) | |||
} | |||
func (f *win32Pipe) SetDeadline(t time.Time) error { | |||
f.SetReadDeadline(t) | |||
f.SetWriteDeadline(t) | |||
return nil | |||
} | |||
// CloseWrite closes the write side of a message pipe in byte mode. | |||
func (f *win32MessageBytePipe) CloseWrite() error { | |||
if f.writeClosed { | |||
return errPipeWriteClosed | |||
} | |||
err := f.win32File.Flush() | |||
if err != nil { | |||
return err | |||
} | |||
_, err = f.win32File.Write(nil) | |||
if err != nil { | |||
return err | |||
} | |||
f.writeClosed = true | |||
return nil | |||
} | |||
// Write writes bytes to a message pipe in byte mode. Zero-byte writes are ignored, since | |||
// they are used to implement CloseWrite(). | |||
func (f *win32MessageBytePipe) Write(b []byte) (int, error) { | |||
if f.writeClosed { | |||
return 0, errPipeWriteClosed | |||
} | |||
if len(b) == 0 { | |||
return 0, nil | |||
} | |||
return f.win32File.Write(b) | |||
} | |||
// Read reads bytes from a message pipe in byte mode. A read of a zero-byte message on a message | |||
// mode pipe will return io.EOF, as will all subsequent reads. | |||
func (f *win32MessageBytePipe) Read(b []byte) (int, error) { | |||
if f.readEOF { | |||
return 0, io.EOF | |||
} | |||
n, err := f.win32File.Read(b) | |||
if err == io.EOF { | |||
// If this was the result of a zero-byte read, then | |||
// it is possible that the read was due to a zero-size | |||
// message. Since we are simulating CloseWrite with a | |||
// zero-byte message, ensure that all future Read() calls | |||
// also return EOF. | |||
f.readEOF = true | |||
} else if err == syscall.ERROR_MORE_DATA { | |||
// ERROR_MORE_DATA indicates that the pipe's read mode is message mode | |||
// and the message still has more bytes. Treat this as a success, since | |||
// this package presents all named pipes as byte streams. | |||
err = nil | |||
} | |||
return n, err | |||
} | |||
func (s pipeAddress) Network() string { | |||
return "pipe" | |||
} | |||
func (s pipeAddress) String() string { | |||
return string(s) | |||
} | |||
// tryDialPipe attempts to dial the pipe at `path` until `ctx` cancellation or timeout. | |||
func tryDialPipe(ctx context.Context, path *string, access uint32) (syscall.Handle, error) { | |||
for { | |||
select { | |||
case <-ctx.Done(): | |||
return syscall.Handle(0), ctx.Err() | |||
default: | |||
h, err := createFile(*path, access, 0, nil, syscall.OPEN_EXISTING, syscall.FILE_FLAG_OVERLAPPED|cSECURITY_SQOS_PRESENT|cSECURITY_ANONYMOUS, 0) | |||
if err == nil { | |||
return h, nil | |||
} | |||
if err != cERROR_PIPE_BUSY { | |||
return h, &os.PathError{Err: err, Op: "open", Path: *path} | |||
} | |||
// Wait 10 msec and try again. This is a rather simplistic | |||
// view, as we always try each 10 milliseconds. | |||
time.Sleep(10 * time.Millisecond) | |||
} | |||
} | |||
} | |||
// DialPipe connects to a named pipe by path, timing out if the connection | |||
// takes longer than the specified duration. If timeout is nil, then we use | |||
// a default timeout of 2 seconds. (We do not use WaitNamedPipe.) | |||
func DialPipe(path string, timeout *time.Duration) (net.Conn, error) { | |||
var absTimeout time.Time | |||
if timeout != nil { | |||
absTimeout = time.Now().Add(*timeout) | |||
} else { | |||
absTimeout = time.Now().Add(2 * time.Second) | |||
} | |||
ctx, _ := context.WithDeadline(context.Background(), absTimeout) | |||
conn, err := DialPipeContext(ctx, path) | |||
if err == context.DeadlineExceeded { | |||
return nil, ErrTimeout | |||
} | |||
return conn, err | |||
} | |||
// DialPipeContext attempts to connect to a named pipe by `path` until `ctx` | |||
// cancellation or timeout. | |||
func DialPipeContext(ctx context.Context, path string) (net.Conn, error) { | |||
return DialPipeAccess(ctx, path, syscall.GENERIC_READ|syscall.GENERIC_WRITE) | |||
} | |||
// DialPipeAccess attempts to connect to a named pipe by `path` with `access` until `ctx` | |||
// cancellation or timeout. | |||
func DialPipeAccess(ctx context.Context, path string, access uint32) (net.Conn, error) { | |||
var err error | |||
var h syscall.Handle | |||
h, err = tryDialPipe(ctx, &path, access) | |||
if err != nil { | |||
return nil, err | |||
} | |||
var flags uint32 | |||
err = getNamedPipeInfo(h, &flags, nil, nil, nil) | |||
if err != nil { | |||
return nil, err | |||
} | |||
f, err := makeWin32File(h) | |||
if err != nil { | |||
syscall.Close(h) | |||
return nil, err | |||
} | |||
// If the pipe is in message mode, return a message byte pipe, which | |||
// supports CloseWrite(). | |||
if flags&cPIPE_TYPE_MESSAGE != 0 { | |||
return &win32MessageBytePipe{ | |||
win32Pipe: win32Pipe{win32File: f, path: path}, | |||
}, nil | |||
} | |||
return &win32Pipe{win32File: f, path: path}, nil | |||
} | |||
type acceptResponse struct { | |||
f *win32File | |||
err error | |||
} | |||
type win32PipeListener struct { | |||
firstHandle syscall.Handle | |||
path string | |||
config PipeConfig | |||
acceptCh chan (chan acceptResponse) | |||
closeCh chan int | |||
doneCh chan int | |||
} | |||
func makeServerPipeHandle(path string, sd []byte, c *PipeConfig, first bool) (syscall.Handle, error) { | |||
path16, err := syscall.UTF16FromString(path) | |||
if err != nil { | |||
return 0, &os.PathError{Op: "open", Path: path, Err: err} | |||
} | |||
var oa objectAttributes | |||
oa.Length = unsafe.Sizeof(oa) | |||
var ntPath unicodeString | |||
if err := rtlDosPathNameToNtPathName(&path16[0], &ntPath, 0, 0).Err(); err != nil { | |||
return 0, &os.PathError{Op: "open", Path: path, Err: err} | |||
} | |||
defer localFree(ntPath.Buffer) | |||
oa.ObjectName = &ntPath | |||
// The security descriptor is only needed for the first pipe. | |||
if first { | |||
if sd != nil { | |||
len := uint32(len(sd)) | |||
sdb := localAlloc(0, len) | |||
defer localFree(sdb) | |||
copy((*[0xffff]byte)(unsafe.Pointer(sdb))[:], sd) | |||
oa.SecurityDescriptor = (*securityDescriptor)(unsafe.Pointer(sdb)) | |||
} else { | |||
// Construct the default named pipe security descriptor. | |||
var dacl uintptr | |||
if err := rtlDefaultNpAcl(&dacl).Err(); err != nil { | |||
return 0, fmt.Errorf("getting default named pipe ACL: %s", err) | |||
} | |||
defer localFree(dacl) | |||
sdb := &securityDescriptor{ | |||
Revision: 1, | |||
Control: cSE_DACL_PRESENT, | |||
Dacl: dacl, | |||
} | |||
oa.SecurityDescriptor = sdb | |||
} | |||
} | |||
typ := uint32(cFILE_PIPE_REJECT_REMOTE_CLIENTS) | |||
if c.MessageMode { | |||
typ |= cFILE_PIPE_MESSAGE_TYPE | |||
} | |||
disposition := uint32(cFILE_OPEN) | |||
access := uint32(syscall.GENERIC_READ | syscall.GENERIC_WRITE | syscall.SYNCHRONIZE) | |||
if first { | |||
disposition = cFILE_CREATE | |||
// By not asking for read or write access, the named pipe file system | |||
// will put this pipe into an initially disconnected state, blocking | |||
// client connections until the next call with first == false. | |||
access = syscall.SYNCHRONIZE | |||
} | |||
timeout := int64(-50 * 10000) // 50ms | |||
var ( | |||
h syscall.Handle | |||
iosb ioStatusBlock | |||
) | |||
err = ntCreateNamedPipeFile(&h, access, &oa, &iosb, syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE, disposition, 0, typ, 0, 0, 0xffffffff, uint32(c.InputBufferSize), uint32(c.OutputBufferSize), &timeout).Err() | |||
if err != nil { | |||
return 0, &os.PathError{Op: "open", Path: path, Err: err} | |||
} | |||
runtime.KeepAlive(ntPath) | |||
return h, nil | |||
} | |||
func (l *win32PipeListener) makeServerPipe() (*win32File, error) { | |||
h, err := makeServerPipeHandle(l.path, nil, &l.config, false) | |||
if err != nil { | |||
return nil, err | |||
} | |||
f, err := makeWin32File(h) | |||
if err != nil { | |||
syscall.Close(h) | |||
return nil, err | |||
} | |||
return f, nil | |||
} | |||
func (l *win32PipeListener) makeConnectedServerPipe() (*win32File, error) { | |||
p, err := l.makeServerPipe() | |||
if err != nil { | |||
return nil, err | |||
} | |||
// Wait for the client to connect. | |||
ch := make(chan error) | |||
go func(p *win32File) { | |||
ch <- connectPipe(p) | |||
}(p) | |||
select { | |||
case err = <-ch: | |||
if err != nil { | |||
p.Close() | |||
p = nil | |||
} | |||
case <-l.closeCh: | |||
// Abort the connect request by closing the handle. | |||
p.Close() | |||
p = nil | |||
err = <-ch | |||
if err == nil || err == ErrFileClosed { | |||
err = ErrPipeListenerClosed | |||
} | |||
} | |||
return p, err | |||
} | |||
func (l *win32PipeListener) listenerRoutine() { | |||
closed := false | |||
for !closed { | |||
select { | |||
case <-l.closeCh: | |||
closed = true | |||
case responseCh := <-l.acceptCh: | |||
var ( | |||
p *win32File | |||
err error | |||
) | |||
for { | |||
p, err = l.makeConnectedServerPipe() | |||
// If the connection was immediately closed by the client, try | |||
// again. | |||
if err != cERROR_NO_DATA { | |||
break | |||
} | |||
} | |||
responseCh <- acceptResponse{p, err} | |||
closed = err == ErrPipeListenerClosed | |||
} | |||
} | |||
syscall.Close(l.firstHandle) | |||
l.firstHandle = 0 | |||
// Notify Close() and Accept() callers that the handle has been closed. | |||
close(l.doneCh) | |||
} | |||
// PipeConfig contain configuration for the pipe listener. | |||
type PipeConfig struct { | |||
// SecurityDescriptor contains a Windows security descriptor in SDDL format. | |||
SecurityDescriptor string | |||
// MessageMode determines whether the pipe is in byte or message mode. In either | |||
// case the pipe is read in byte mode by default. The only practical difference in | |||
// this implementation is that CloseWrite() is only supported for message mode pipes; | |||
// CloseWrite() is implemented as a zero-byte write, but zero-byte writes are only | |||
// transferred to the reader (and returned as io.EOF in this implementation) | |||
// when the pipe is in message mode. | |||
MessageMode bool | |||
// InputBufferSize specifies the size of the input buffer, in bytes. | |||
InputBufferSize int32 | |||
// OutputBufferSize specifies the size of the output buffer, in bytes. | |||
OutputBufferSize int32 | |||
} | |||
// ListenPipe creates a listener on a Windows named pipe path, e.g. \\.\pipe\mypipe. | |||
// The pipe must not already exist. | |||
func ListenPipe(path string, c *PipeConfig) (net.Listener, error) { | |||
var ( | |||
sd []byte | |||
err error | |||
) | |||
if c == nil { | |||
c = &PipeConfig{} | |||
} | |||
if c.SecurityDescriptor != "" { | |||
sd, err = SddlToSecurityDescriptor(c.SecurityDescriptor) | |||
if err != nil { | |||
return nil, err | |||
} | |||
} | |||
h, err := makeServerPipeHandle(path, sd, c, true) | |||
if err != nil { | |||
return nil, err | |||
} | |||
l := &win32PipeListener{ | |||
firstHandle: h, | |||
path: path, | |||
config: *c, | |||
acceptCh: make(chan (chan acceptResponse)), | |||
closeCh: make(chan int), | |||
doneCh: make(chan int), | |||
} | |||
go l.listenerRoutine() | |||
return l, nil | |||
} | |||
func connectPipe(p *win32File) error { | |||
c, err := p.prepareIo() | |||
if err != nil { | |||
return err | |||
} | |||
defer p.wg.Done() | |||
err = connectNamedPipe(p.handle, &c.o) | |||
_, err = p.asyncIo(c, nil, 0, err) | |||
if err != nil && err != cERROR_PIPE_CONNECTED { | |||
return err | |||
} | |||
return nil | |||
} | |||
func (l *win32PipeListener) Accept() (net.Conn, error) { | |||
ch := make(chan acceptResponse) | |||
select { | |||
case l.acceptCh <- ch: | |||
response := <-ch | |||
err := response.err | |||
if err != nil { | |||
return nil, err | |||
} | |||
if l.config.MessageMode { | |||
return &win32MessageBytePipe{ | |||
win32Pipe: win32Pipe{win32File: response.f, path: l.path}, | |||
}, nil | |||
} | |||
return &win32Pipe{win32File: response.f, path: l.path}, nil | |||
case <-l.doneCh: | |||
return nil, ErrPipeListenerClosed | |||
} | |||
} | |||
func (l *win32PipeListener) Close() error { | |||
select { | |||
case l.closeCh <- 1: | |||
<-l.doneCh | |||
case <-l.doneCh: | |||
} | |||
return nil | |||
} | |||
func (l *win32PipeListener) Addr() net.Addr { | |||
return pipeAddress(l.path) | |||
} |
@@ -0,0 +1,235 @@ | |||
// Package guid provides a GUID type. The backing structure for a GUID is | |||
// identical to that used by the golang.org/x/sys/windows GUID type. | |||
// There are two main binary encodings used for a GUID, the big-endian encoding, | |||
// and the Windows (mixed-endian) encoding. See here for details: | |||
// https://en.wikipedia.org/wiki/Universally_unique_identifier#Encoding | |||
package guid | |||
import ( | |||
"crypto/rand" | |||
"crypto/sha1" | |||
"encoding" | |||
"encoding/binary" | |||
"fmt" | |||
"strconv" | |||
"golang.org/x/sys/windows" | |||
) | |||
// Variant specifies which GUID variant (or "type") of the GUID. It determines | |||
// how the entirety of the rest of the GUID is interpreted. | |||
type Variant uint8 | |||
// The variants specified by RFC 4122. | |||
const ( | |||
// VariantUnknown specifies a GUID variant which does not conform to one of | |||
// the variant encodings specified in RFC 4122. | |||
VariantUnknown Variant = iota | |||
VariantNCS | |||
VariantRFC4122 | |||
VariantMicrosoft | |||
VariantFuture | |||
) | |||
// Version specifies how the bits in the GUID were generated. For instance, a | |||
// version 4 GUID is randomly generated, and a version 5 is generated from the | |||
// hash of an input string. | |||
type Version uint8 | |||
var _ = (encoding.TextMarshaler)(GUID{}) | |||
var _ = (encoding.TextUnmarshaler)(&GUID{}) | |||
// GUID represents a GUID/UUID. It has the same structure as | |||
// golang.org/x/sys/windows.GUID so that it can be used with functions expecting | |||
// that type. It is defined as its own type so that stringification and | |||
// marshaling can be supported. The representation matches that used by native | |||
// Windows code. | |||
type GUID windows.GUID | |||
// NewV4 returns a new version 4 (pseudorandom) GUID, as defined by RFC 4122. | |||
func NewV4() (GUID, error) { | |||
var b [16]byte | |||
if _, err := rand.Read(b[:]); err != nil { | |||
return GUID{}, err | |||
} | |||
g := FromArray(b) | |||
g.setVersion(4) // Version 4 means randomly generated. | |||
g.setVariant(VariantRFC4122) | |||
return g, nil | |||
} | |||
// NewV5 returns a new version 5 (generated from a string via SHA-1 hashing) | |||
// GUID, as defined by RFC 4122. The RFC is unclear on the encoding of the name, | |||
// and the sample code treats it as a series of bytes, so we do the same here. | |||
// | |||
// Some implementations, such as those found on Windows, treat the name as a | |||
// big-endian UTF16 stream of bytes. If that is desired, the string can be | |||
// encoded as such before being passed to this function. | |||
func NewV5(namespace GUID, name []byte) (GUID, error) { | |||
b := sha1.New() | |||
namespaceBytes := namespace.ToArray() | |||
b.Write(namespaceBytes[:]) | |||
b.Write(name) | |||
a := [16]byte{} | |||
copy(a[:], b.Sum(nil)) | |||
g := FromArray(a) | |||
g.setVersion(5) // Version 5 means generated from a string. | |||
g.setVariant(VariantRFC4122) | |||
return g, nil | |||
} | |||
func fromArray(b [16]byte, order binary.ByteOrder) GUID { | |||
var g GUID | |||
g.Data1 = order.Uint32(b[0:4]) | |||
g.Data2 = order.Uint16(b[4:6]) | |||
g.Data3 = order.Uint16(b[6:8]) | |||
copy(g.Data4[:], b[8:16]) | |||
return g | |||
} | |||
func (g GUID) toArray(order binary.ByteOrder) [16]byte { | |||
b := [16]byte{} | |||
order.PutUint32(b[0:4], g.Data1) | |||
order.PutUint16(b[4:6], g.Data2) | |||
order.PutUint16(b[6:8], g.Data3) | |||
copy(b[8:16], g.Data4[:]) | |||
return b | |||
} | |||
// FromArray constructs a GUID from a big-endian encoding array of 16 bytes. | |||
func FromArray(b [16]byte) GUID { | |||
return fromArray(b, binary.BigEndian) | |||
} | |||
// ToArray returns an array of 16 bytes representing the GUID in big-endian | |||
// encoding. | |||
func (g GUID) ToArray() [16]byte { | |||
return g.toArray(binary.BigEndian) | |||
} | |||
// FromWindowsArray constructs a GUID from a Windows encoding array of bytes. | |||
func FromWindowsArray(b [16]byte) GUID { | |||
return fromArray(b, binary.LittleEndian) | |||
} | |||
// ToWindowsArray returns an array of 16 bytes representing the GUID in Windows | |||
// encoding. | |||
func (g GUID) ToWindowsArray() [16]byte { | |||
return g.toArray(binary.LittleEndian) | |||
} | |||
func (g GUID) String() string { | |||
return fmt.Sprintf( | |||
"%08x-%04x-%04x-%04x-%012x", | |||
g.Data1, | |||
g.Data2, | |||
g.Data3, | |||
g.Data4[:2], | |||
g.Data4[2:]) | |||
} | |||
// FromString parses a string containing a GUID and returns the GUID. The only | |||
// format currently supported is the `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` | |||
// format. | |||
func FromString(s string) (GUID, error) { | |||
if len(s) != 36 { | |||
return GUID{}, fmt.Errorf("invalid GUID %q", s) | |||
} | |||
if s[8] != '-' || s[13] != '-' || s[18] != '-' || s[23] != '-' { | |||
return GUID{}, fmt.Errorf("invalid GUID %q", s) | |||
} | |||
var g GUID | |||
data1, err := strconv.ParseUint(s[0:8], 16, 32) | |||
if err != nil { | |||
return GUID{}, fmt.Errorf("invalid GUID %q", s) | |||
} | |||
g.Data1 = uint32(data1) | |||
data2, err := strconv.ParseUint(s[9:13], 16, 16) | |||
if err != nil { | |||
return GUID{}, fmt.Errorf("invalid GUID %q", s) | |||
} | |||
g.Data2 = uint16(data2) | |||
data3, err := strconv.ParseUint(s[14:18], 16, 16) | |||
if err != nil { | |||
return GUID{}, fmt.Errorf("invalid GUID %q", s) | |||
} | |||
g.Data3 = uint16(data3) | |||
for i, x := range []int{19, 21, 24, 26, 28, 30, 32, 34} { | |||
v, err := strconv.ParseUint(s[x:x+2], 16, 8) | |||
if err != nil { | |||
return GUID{}, fmt.Errorf("invalid GUID %q", s) | |||
} | |||
g.Data4[i] = uint8(v) | |||
} | |||
return g, nil | |||
} | |||
func (g *GUID) setVariant(v Variant) { | |||
d := g.Data4[0] | |||
switch v { | |||
case VariantNCS: | |||
d = (d & 0x7f) | |||
case VariantRFC4122: | |||
d = (d & 0x3f) | 0x80 | |||
case VariantMicrosoft: | |||
d = (d & 0x1f) | 0xc0 | |||
case VariantFuture: | |||
d = (d & 0x0f) | 0xe0 | |||
case VariantUnknown: | |||
fallthrough | |||
default: | |||
panic(fmt.Sprintf("invalid variant: %d", v)) | |||
} | |||
g.Data4[0] = d | |||
} | |||
// Variant returns the GUID variant, as defined in RFC 4122. | |||
func (g GUID) Variant() Variant { | |||
b := g.Data4[0] | |||
if b&0x80 == 0 { | |||
return VariantNCS | |||
} else if b&0xc0 == 0x80 { | |||
return VariantRFC4122 | |||
} else if b&0xe0 == 0xc0 { | |||
return VariantMicrosoft | |||
} else if b&0xe0 == 0xe0 { | |||
return VariantFuture | |||
} | |||
return VariantUnknown | |||
} | |||
func (g *GUID) setVersion(v Version) { | |||
g.Data3 = (g.Data3 & 0x0fff) | (uint16(v) << 12) | |||
} | |||
// Version returns the GUID version, as defined in RFC 4122. | |||
func (g GUID) Version() Version { | |||
return Version((g.Data3 & 0xF000) >> 12) | |||
} | |||
// MarshalText returns the textual representation of the GUID. | |||
func (g GUID) MarshalText() ([]byte, error) { | |||
return []byte(g.String()), nil | |||
} | |||
// UnmarshalText takes the textual representation of a GUID, and unmarhals it | |||
// into this GUID. | |||
func (g *GUID) UnmarshalText(text []byte) error { | |||
g2, err := FromString(string(text)) | |||
if err != nil { | |||
return err | |||
} | |||
*g = g2 | |||
return nil | |||
} |
@@ -0,0 +1,202 @@ | |||
// +build windows | |||
package winio | |||
import ( | |||
"bytes" | |||
"encoding/binary" | |||
"fmt" | |||
"runtime" | |||
"sync" | |||
"syscall" | |||
"unicode/utf16" | |||
"golang.org/x/sys/windows" | |||
) | |||
//sys adjustTokenPrivileges(token windows.Token, releaseAll bool, input *byte, outputSize uint32, output *byte, requiredSize *uint32) (success bool, err error) [true] = advapi32.AdjustTokenPrivileges | |||
//sys impersonateSelf(level uint32) (err error) = advapi32.ImpersonateSelf | |||
//sys revertToSelf() (err error) = advapi32.RevertToSelf | |||
//sys openThreadToken(thread syscall.Handle, accessMask uint32, openAsSelf bool, token *windows.Token) (err error) = advapi32.OpenThreadToken | |||
//sys getCurrentThread() (h syscall.Handle) = GetCurrentThread | |||
//sys lookupPrivilegeValue(systemName string, name string, luid *uint64) (err error) = advapi32.LookupPrivilegeValueW | |||
//sys lookupPrivilegeName(systemName string, luid *uint64, buffer *uint16, size *uint32) (err error) = advapi32.LookupPrivilegeNameW | |||
//sys lookupPrivilegeDisplayName(systemName string, name *uint16, buffer *uint16, size *uint32, languageId *uint32) (err error) = advapi32.LookupPrivilegeDisplayNameW | |||
const ( | |||
SE_PRIVILEGE_ENABLED = 2 | |||
ERROR_NOT_ALL_ASSIGNED syscall.Errno = 1300 | |||
SeBackupPrivilege = "SeBackupPrivilege" | |||
SeRestorePrivilege = "SeRestorePrivilege" | |||
) | |||
const ( | |||
securityAnonymous = iota | |||
securityIdentification | |||
securityImpersonation | |||
securityDelegation | |||
) | |||
var ( | |||
privNames = make(map[string]uint64) | |||
privNameMutex sync.Mutex | |||
) | |||
// PrivilegeError represents an error enabling privileges. | |||
type PrivilegeError struct { | |||
privileges []uint64 | |||
} | |||
func (e *PrivilegeError) Error() string { | |||
s := "" | |||
if len(e.privileges) > 1 { | |||
s = "Could not enable privileges " | |||
} else { | |||
s = "Could not enable privilege " | |||
} | |||
for i, p := range e.privileges { | |||
if i != 0 { | |||
s += ", " | |||
} | |||
s += `"` | |||
s += getPrivilegeName(p) | |||
s += `"` | |||
} | |||
return s | |||
} | |||
// RunWithPrivilege enables a single privilege for a function call. | |||
func RunWithPrivilege(name string, fn func() error) error { | |||
return RunWithPrivileges([]string{name}, fn) | |||
} | |||
// RunWithPrivileges enables privileges for a function call. | |||
func RunWithPrivileges(names []string, fn func() error) error { | |||
privileges, err := mapPrivileges(names) | |||
if err != nil { | |||
return err | |||
} | |||
runtime.LockOSThread() | |||
defer runtime.UnlockOSThread() | |||
token, err := newThreadToken() | |||
if err != nil { | |||
return err | |||
} | |||
defer releaseThreadToken(token) | |||
err = adjustPrivileges(token, privileges, SE_PRIVILEGE_ENABLED) | |||
if err != nil { | |||
return err | |||
} | |||
return fn() | |||
} | |||
func mapPrivileges(names []string) ([]uint64, error) { | |||
var privileges []uint64 | |||
privNameMutex.Lock() | |||
defer privNameMutex.Unlock() | |||
for _, name := range names { | |||
p, ok := privNames[name] | |||
if !ok { | |||
err := lookupPrivilegeValue("", name, &p) | |||
if err != nil { | |||
return nil, err | |||
} | |||
privNames[name] = p | |||
} | |||
privileges = append(privileges, p) | |||
} | |||
return privileges, nil | |||
} | |||
// EnableProcessPrivileges enables privileges globally for the process. | |||
func EnableProcessPrivileges(names []string) error { | |||
return enableDisableProcessPrivilege(names, SE_PRIVILEGE_ENABLED) | |||
} | |||
// DisableProcessPrivileges disables privileges globally for the process. | |||
func DisableProcessPrivileges(names []string) error { | |||
return enableDisableProcessPrivilege(names, 0) | |||
} | |||
func enableDisableProcessPrivilege(names []string, action uint32) error { | |||
privileges, err := mapPrivileges(names) | |||
if err != nil { | |||
return err | |||
} | |||
p, _ := windows.GetCurrentProcess() | |||
var token windows.Token | |||
err = windows.OpenProcessToken(p, windows.TOKEN_ADJUST_PRIVILEGES|windows.TOKEN_QUERY, &token) | |||
if err != nil { | |||
return err | |||
} | |||
defer token.Close() | |||
return adjustPrivileges(token, privileges, action) | |||
} | |||
func adjustPrivileges(token windows.Token, privileges []uint64, action uint32) error { | |||
var b bytes.Buffer | |||
binary.Write(&b, binary.LittleEndian, uint32(len(privileges))) | |||
for _, p := range privileges { | |||
binary.Write(&b, binary.LittleEndian, p) | |||
binary.Write(&b, binary.LittleEndian, action) | |||
} | |||
prevState := make([]byte, b.Len()) | |||
reqSize := uint32(0) | |||
success, err := adjustTokenPrivileges(token, false, &b.Bytes()[0], uint32(len(prevState)), &prevState[0], &reqSize) | |||
if !success { | |||
return err | |||
} | |||
if err == ERROR_NOT_ALL_ASSIGNED { | |||
return &PrivilegeError{privileges} | |||
} | |||
return nil | |||
} | |||
func getPrivilegeName(luid uint64) string { | |||
var nameBuffer [256]uint16 | |||
bufSize := uint32(len(nameBuffer)) | |||
err := lookupPrivilegeName("", &luid, &nameBuffer[0], &bufSize) | |||
if err != nil { | |||
return fmt.Sprintf("<unknown privilege %d>", luid) | |||
} | |||
var displayNameBuffer [256]uint16 | |||
displayBufSize := uint32(len(displayNameBuffer)) | |||
var langID uint32 | |||
err = lookupPrivilegeDisplayName("", &nameBuffer[0], &displayNameBuffer[0], &displayBufSize, &langID) | |||
if err != nil { | |||
return fmt.Sprintf("<unknown privilege %s>", string(utf16.Decode(nameBuffer[:bufSize]))) | |||
} | |||
return string(utf16.Decode(displayNameBuffer[:displayBufSize])) | |||
} | |||
func newThreadToken() (windows.Token, error) { | |||
err := impersonateSelf(securityImpersonation) | |||
if err != nil { | |||
return 0, err | |||
} | |||
var token windows.Token | |||
err = openThreadToken(getCurrentThread(), syscall.TOKEN_ADJUST_PRIVILEGES|syscall.TOKEN_QUERY, false, &token) | |||
if err != nil { | |||
rerr := revertToSelf() | |||
if rerr != nil { | |||
panic(rerr) | |||
} | |||
return 0, err | |||
} | |||
return token, nil | |||
} | |||
func releaseThreadToken(h windows.Token) { | |||
err := revertToSelf() | |||
if err != nil { | |||
panic(err) | |||
} | |||
h.Close() | |||
} |
@@ -0,0 +1,128 @@ | |||
package winio | |||
import ( | |||
"bytes" | |||
"encoding/binary" | |||
"fmt" | |||
"strings" | |||
"unicode/utf16" | |||
"unsafe" | |||
) | |||
const ( | |||
reparseTagMountPoint = 0xA0000003 | |||
reparseTagSymlink = 0xA000000C | |||
) | |||
type reparseDataBuffer struct { | |||
ReparseTag uint32 | |||
ReparseDataLength uint16 | |||
Reserved uint16 | |||
SubstituteNameOffset uint16 | |||
SubstituteNameLength uint16 | |||
PrintNameOffset uint16 | |||
PrintNameLength uint16 | |||
} | |||
// ReparsePoint describes a Win32 symlink or mount point. | |||
type ReparsePoint struct { | |||
Target string | |||
IsMountPoint bool | |||
} | |||
// UnsupportedReparsePointError is returned when trying to decode a non-symlink or | |||
// mount point reparse point. | |||
type UnsupportedReparsePointError struct { | |||
Tag uint32 | |||
} | |||
func (e *UnsupportedReparsePointError) Error() string { | |||
return fmt.Sprintf("unsupported reparse point %x", e.Tag) | |||
} | |||
// DecodeReparsePoint decodes a Win32 REPARSE_DATA_BUFFER structure containing either a symlink | |||
// or a mount point. | |||
func DecodeReparsePoint(b []byte) (*ReparsePoint, error) { | |||
tag := binary.LittleEndian.Uint32(b[0:4]) | |||
return DecodeReparsePointData(tag, b[8:]) | |||
} | |||
func DecodeReparsePointData(tag uint32, b []byte) (*ReparsePoint, error) { | |||
isMountPoint := false | |||
switch tag { | |||
case reparseTagMountPoint: | |||
isMountPoint = true | |||
case reparseTagSymlink: | |||
default: | |||
return nil, &UnsupportedReparsePointError{tag} | |||
} | |||
nameOffset := 8 + binary.LittleEndian.Uint16(b[4:6]) | |||
if !isMountPoint { | |||
nameOffset += 4 | |||
} | |||
nameLength := binary.LittleEndian.Uint16(b[6:8]) | |||
name := make([]uint16, nameLength/2) | |||
err := binary.Read(bytes.NewReader(b[nameOffset:nameOffset+nameLength]), binary.LittleEndian, &name) | |||
if err != nil { | |||
return nil, err | |||
} | |||
return &ReparsePoint{string(utf16.Decode(name)), isMountPoint}, nil | |||
} | |||
func isDriveLetter(c byte) bool { | |||
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') | |||
} | |||
// EncodeReparsePoint encodes a Win32 REPARSE_DATA_BUFFER structure describing a symlink or | |||
// mount point. | |||
func EncodeReparsePoint(rp *ReparsePoint) []byte { | |||
// Generate an NT path and determine if this is a relative path. | |||
var ntTarget string | |||
relative := false | |||
if strings.HasPrefix(rp.Target, `\\?\`) { | |||
ntTarget = `\??\` + rp.Target[4:] | |||
} else if strings.HasPrefix(rp.Target, `\\`) { | |||
ntTarget = `\??\UNC\` + rp.Target[2:] | |||
} else if len(rp.Target) >= 2 && isDriveLetter(rp.Target[0]) && rp.Target[1] == ':' { | |||
ntTarget = `\??\` + rp.Target | |||
} else { | |||
ntTarget = rp.Target | |||
relative = true | |||
} | |||
// The paths must be NUL-terminated even though they are counted strings. | |||
target16 := utf16.Encode([]rune(rp.Target + "\x00")) | |||
ntTarget16 := utf16.Encode([]rune(ntTarget + "\x00")) | |||
size := int(unsafe.Sizeof(reparseDataBuffer{})) - 8 | |||
size += len(ntTarget16)*2 + len(target16)*2 | |||
tag := uint32(reparseTagMountPoint) | |||
if !rp.IsMountPoint { | |||
tag = reparseTagSymlink | |||
size += 4 // Add room for symlink flags | |||
} | |||
data := reparseDataBuffer{ | |||
ReparseTag: tag, | |||
ReparseDataLength: uint16(size), | |||
SubstituteNameOffset: 0, | |||
SubstituteNameLength: uint16((len(ntTarget16) - 1) * 2), | |||
PrintNameOffset: uint16(len(ntTarget16) * 2), | |||
PrintNameLength: uint16((len(target16) - 1) * 2), | |||
} | |||
var b bytes.Buffer | |||
binary.Write(&b, binary.LittleEndian, &data) | |||
if !rp.IsMountPoint { | |||
flags := uint32(0) | |||
if relative { | |||
flags |= 1 | |||
} | |||
binary.Write(&b, binary.LittleEndian, flags) | |||
} | |||
binary.Write(&b, binary.LittleEndian, ntTarget16) | |||
binary.Write(&b, binary.LittleEndian, target16) | |||
return b.Bytes() | |||
} |
@@ -0,0 +1,98 @@ | |||
// +build windows | |||
package winio | |||
import ( | |||
"syscall" | |||
"unsafe" | |||
) | |||
//sys lookupAccountName(systemName *uint16, accountName string, sid *byte, sidSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) = advapi32.LookupAccountNameW | |||
//sys convertSidToStringSid(sid *byte, str **uint16) (err error) = advapi32.ConvertSidToStringSidW | |||
//sys convertStringSecurityDescriptorToSecurityDescriptor(str string, revision uint32, sd *uintptr, size *uint32) (err error) = advapi32.ConvertStringSecurityDescriptorToSecurityDescriptorW | |||
//sys convertSecurityDescriptorToStringSecurityDescriptor(sd *byte, revision uint32, secInfo uint32, sddl **uint16, sddlSize *uint32) (err error) = advapi32.ConvertSecurityDescriptorToStringSecurityDescriptorW | |||
//sys localFree(mem uintptr) = LocalFree | |||
//sys getSecurityDescriptorLength(sd uintptr) (len uint32) = advapi32.GetSecurityDescriptorLength | |||
const ( | |||
cERROR_NONE_MAPPED = syscall.Errno(1332) | |||
) | |||
type AccountLookupError struct { | |||
Name string | |||
Err error | |||
} | |||
func (e *AccountLookupError) Error() string { | |||
if e.Name == "" { | |||
return "lookup account: empty account name specified" | |||
} | |||
var s string | |||
switch e.Err { | |||
case cERROR_NONE_MAPPED: | |||
s = "not found" | |||
default: | |||
s = e.Err.Error() | |||
} | |||
return "lookup account " + e.Name + ": " + s | |||
} | |||
type SddlConversionError struct { | |||
Sddl string | |||
Err error | |||
} | |||
func (e *SddlConversionError) Error() string { | |||
return "convert " + e.Sddl + ": " + e.Err.Error() | |||
} | |||
// LookupSidByName looks up the SID of an account by name | |||
func LookupSidByName(name string) (sid string, err error) { | |||
if name == "" { | |||
return "", &AccountLookupError{name, cERROR_NONE_MAPPED} | |||
} | |||
var sidSize, sidNameUse, refDomainSize uint32 | |||
err = lookupAccountName(nil, name, nil, &sidSize, nil, &refDomainSize, &sidNameUse) | |||
if err != nil && err != syscall.ERROR_INSUFFICIENT_BUFFER { | |||
return "", &AccountLookupError{name, err} | |||
} | |||
sidBuffer := make([]byte, sidSize) | |||
refDomainBuffer := make([]uint16, refDomainSize) | |||
err = lookupAccountName(nil, name, &sidBuffer[0], &sidSize, &refDomainBuffer[0], &refDomainSize, &sidNameUse) | |||
if err != nil { | |||
return "", &AccountLookupError{name, err} | |||
} | |||
var strBuffer *uint16 | |||
err = convertSidToStringSid(&sidBuffer[0], &strBuffer) | |||
if err != nil { | |||
return "", &AccountLookupError{name, err} | |||
} | |||
sid = syscall.UTF16ToString((*[0xffff]uint16)(unsafe.Pointer(strBuffer))[:]) | |||
localFree(uintptr(unsafe.Pointer(strBuffer))) | |||
return sid, nil | |||
} | |||
func SddlToSecurityDescriptor(sddl string) ([]byte, error) { | |||
var sdBuffer uintptr | |||
err := convertStringSecurityDescriptorToSecurityDescriptor(sddl, 1, &sdBuffer, nil) | |||
if err != nil { | |||
return nil, &SddlConversionError{sddl, err} | |||
} | |||
defer localFree(sdBuffer) | |||
sd := make([]byte, getSecurityDescriptorLength(sdBuffer)) | |||
copy(sd, (*[0xffff]byte)(unsafe.Pointer(sdBuffer))[:len(sd)]) | |||
return sd, nil | |||
} | |||
func SecurityDescriptorToSddl(sd []byte) (string, error) { | |||
var sddl *uint16 | |||
// The returned string length seems to including an aribtrary number of terminating NULs. | |||
// Don't use it. | |||
err := convertSecurityDescriptorToStringSecurityDescriptor(&sd[0], 1, 0xff, &sddl, nil) | |||
if err != nil { | |||
return "", err | |||
} | |||
defer localFree(uintptr(unsafe.Pointer(sddl))) | |||
return syscall.UTF16ToString((*[0xffff]uint16)(unsafe.Pointer(sddl))[:]), nil | |||
} |
@@ -0,0 +1,3 @@ | |||
package winio | |||
//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go file.go pipe.go sd.go fileinfo.go privilege.go backup.go hvsock.go |
@@ -0,0 +1,562 @@ | |||
// Code generated by 'go generate'; DO NOT EDIT. | |||
package winio | |||
import ( | |||
"syscall" | |||
"unsafe" | |||
"golang.org/x/sys/windows" | |||
) | |||
var _ unsafe.Pointer | |||
// Do the interface allocations only once for common | |||
// Errno values. | |||
const ( | |||
errnoERROR_IO_PENDING = 997 | |||
) | |||
var ( | |||
errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) | |||
) | |||
// errnoErr returns common boxed Errno values, to prevent | |||
// allocations at runtime. | |||
func errnoErr(e syscall.Errno) error { | |||
switch e { | |||
case 0: | |||
return nil | |||
case errnoERROR_IO_PENDING: | |||
return errERROR_IO_PENDING | |||
} | |||
// TODO: add more here, after collecting data on the common | |||
// error values see on Windows. (perhaps when running | |||
// all.bat?) | |||
return e | |||
} | |||
var ( | |||
modkernel32 = windows.NewLazySystemDLL("kernel32.dll") | |||
modws2_32 = windows.NewLazySystemDLL("ws2_32.dll") | |||
modntdll = windows.NewLazySystemDLL("ntdll.dll") | |||
modadvapi32 = windows.NewLazySystemDLL("advapi32.dll") | |||
procCancelIoEx = modkernel32.NewProc("CancelIoEx") | |||
procCreateIoCompletionPort = modkernel32.NewProc("CreateIoCompletionPort") | |||
procGetQueuedCompletionStatus = modkernel32.NewProc("GetQueuedCompletionStatus") | |||
procSetFileCompletionNotificationModes = modkernel32.NewProc("SetFileCompletionNotificationModes") | |||
procWSAGetOverlappedResult = modws2_32.NewProc("WSAGetOverlappedResult") | |||
procConnectNamedPipe = modkernel32.NewProc("ConnectNamedPipe") | |||
procCreateNamedPipeW = modkernel32.NewProc("CreateNamedPipeW") | |||
procCreateFileW = modkernel32.NewProc("CreateFileW") | |||
procGetNamedPipeInfo = modkernel32.NewProc("GetNamedPipeInfo") | |||
procGetNamedPipeHandleStateW = modkernel32.NewProc("GetNamedPipeHandleStateW") | |||
procLocalAlloc = modkernel32.NewProc("LocalAlloc") | |||
procNtCreateNamedPipeFile = modntdll.NewProc("NtCreateNamedPipeFile") | |||
procRtlNtStatusToDosErrorNoTeb = modntdll.NewProc("RtlNtStatusToDosErrorNoTeb") | |||
procRtlDosPathNameToNtPathName_U = modntdll.NewProc("RtlDosPathNameToNtPathName_U") | |||
procRtlDefaultNpAcl = modntdll.NewProc("RtlDefaultNpAcl") | |||
procLookupAccountNameW = modadvapi32.NewProc("LookupAccountNameW") | |||
procConvertSidToStringSidW = modadvapi32.NewProc("ConvertSidToStringSidW") | |||
procConvertStringSecurityDescriptorToSecurityDescriptorW = modadvapi32.NewProc("ConvertStringSecurityDescriptorToSecurityDescriptorW") | |||
procConvertSecurityDescriptorToStringSecurityDescriptorW = modadvapi32.NewProc("ConvertSecurityDescriptorToStringSecurityDescriptorW") | |||
procLocalFree = modkernel32.NewProc("LocalFree") | |||
procGetSecurityDescriptorLength = modadvapi32.NewProc("GetSecurityDescriptorLength") | |||
procGetFileInformationByHandleEx = modkernel32.NewProc("GetFileInformationByHandleEx") | |||
procSetFileInformationByHandle = modkernel32.NewProc("SetFileInformationByHandle") | |||
procAdjustTokenPrivileges = modadvapi32.NewProc("AdjustTokenPrivileges") | |||
procImpersonateSelf = modadvapi32.NewProc("ImpersonateSelf") | |||
procRevertToSelf = modadvapi32.NewProc("RevertToSelf") | |||
procOpenThreadToken = modadvapi32.NewProc("OpenThreadToken") | |||
procGetCurrentThread = modkernel32.NewProc("GetCurrentThread") | |||
procLookupPrivilegeValueW = modadvapi32.NewProc("LookupPrivilegeValueW") | |||
procLookupPrivilegeNameW = modadvapi32.NewProc("LookupPrivilegeNameW") | |||
procLookupPrivilegeDisplayNameW = modadvapi32.NewProc("LookupPrivilegeDisplayNameW") | |||
procBackupRead = modkernel32.NewProc("BackupRead") | |||
procBackupWrite = modkernel32.NewProc("BackupWrite") | |||
procbind = modws2_32.NewProc("bind") | |||
) | |||
func cancelIoEx(file syscall.Handle, o *syscall.Overlapped) (err error) { | |||
r1, _, e1 := syscall.Syscall(procCancelIoEx.Addr(), 2, uintptr(file), uintptr(unsafe.Pointer(o)), 0) | |||
if r1 == 0 { | |||
if e1 != 0 { | |||
err = errnoErr(e1) | |||
} else { | |||
err = syscall.EINVAL | |||
} | |||
} | |||
return | |||
} | |||
func createIoCompletionPort(file syscall.Handle, port syscall.Handle, key uintptr, threadCount uint32) (newport syscall.Handle, err error) { | |||
r0, _, e1 := syscall.Syscall6(procCreateIoCompletionPort.Addr(), 4, uintptr(file), uintptr(port), uintptr(key), uintptr(threadCount), 0, 0) | |||
newport = syscall.Handle(r0) | |||
if newport == 0 { | |||
if e1 != 0 { | |||
err = errnoErr(e1) | |||
} else { | |||
err = syscall.EINVAL | |||
} | |||
} | |||
return | |||
} | |||
func getQueuedCompletionStatus(port syscall.Handle, bytes *uint32, key *uintptr, o **ioOperation, timeout uint32) (err error) { | |||
r1, _, e1 := syscall.Syscall6(procGetQueuedCompletionStatus.Addr(), 5, uintptr(port), uintptr(unsafe.Pointer(bytes)), uintptr(unsafe.Pointer(key)), uintptr(unsafe.Pointer(o)), uintptr(timeout), 0) | |||
if r1 == 0 { | |||
if e1 != 0 { | |||
err = errnoErr(e1) | |||
} else { | |||
err = syscall.EINVAL | |||
} | |||
} | |||
return | |||
} | |||
func setFileCompletionNotificationModes(h syscall.Handle, flags uint8) (err error) { | |||
r1, _, e1 := syscall.Syscall(procSetFileCompletionNotificationModes.Addr(), 2, uintptr(h), uintptr(flags), 0) | |||
if r1 == 0 { | |||
if e1 != 0 { | |||
err = errnoErr(e1) | |||
} else { | |||
err = syscall.EINVAL | |||
} | |||
} | |||
return | |||
} | |||
func wsaGetOverlappedResult(h syscall.Handle, o *syscall.Overlapped, bytes *uint32, wait bool, flags *uint32) (err error) { | |||
var _p0 uint32 | |||
if wait { | |||
_p0 = 1 | |||
} else { | |||
_p0 = 0 | |||
} | |||
r1, _, e1 := syscall.Syscall6(procWSAGetOverlappedResult.Addr(), 5, uintptr(h), uintptr(unsafe.Pointer(o)), uintptr(unsafe.Pointer(bytes)), uintptr(_p0), uintptr(unsafe.Pointer(flags)), 0) | |||
if r1 == 0 { | |||
if e1 != 0 { | |||
err = errnoErr(e1) | |||
} else { | |||
err = syscall.EINVAL | |||
} | |||
} | |||
return | |||
} | |||
func connectNamedPipe(pipe syscall.Handle, o *syscall.Overlapped) (err error) { | |||
r1, _, e1 := syscall.Syscall(procConnectNamedPipe.Addr(), 2, uintptr(pipe), uintptr(unsafe.Pointer(o)), 0) | |||
if r1 == 0 { | |||
if e1 != 0 { | |||
err = errnoErr(e1) | |||
} else { | |||
err = syscall.EINVAL | |||
} | |||
} | |||
return | |||
} | |||
func createNamedPipe(name string, flags uint32, pipeMode uint32, maxInstances uint32, outSize uint32, inSize uint32, defaultTimeout uint32, sa *syscall.SecurityAttributes) (handle syscall.Handle, err error) { | |||
var _p0 *uint16 | |||
_p0, err = syscall.UTF16PtrFromString(name) | |||
if err != nil { | |||
return | |||
} | |||
return _createNamedPipe(_p0, flags, pipeMode, maxInstances, outSize, inSize, defaultTimeout, sa) | |||
} | |||
func _createNamedPipe(name *uint16, flags uint32, pipeMode uint32, maxInstances uint32, outSize uint32, inSize uint32, defaultTimeout uint32, sa *syscall.SecurityAttributes) (handle syscall.Handle, err error) { | |||
r0, _, e1 := syscall.Syscall9(procCreateNamedPipeW.Addr(), 8, uintptr(unsafe.Pointer(name)), uintptr(flags), uintptr(pipeMode), uintptr(maxInstances), uintptr(outSize), uintptr(inSize), uintptr(defaultTimeout), uintptr(unsafe.Pointer(sa)), 0) | |||
handle = syscall.Handle(r0) | |||
if handle == syscall.InvalidHandle { | |||
if e1 != 0 { | |||
err = errnoErr(e1) | |||
} else { | |||
err = syscall.EINVAL | |||
} | |||
} | |||
return | |||
} | |||
func createFile(name string, access uint32, mode uint32, sa *syscall.SecurityAttributes, createmode uint32, attrs uint32, templatefile syscall.Handle) (handle syscall.Handle, err error) { | |||
var _p0 *uint16 | |||
_p0, err = syscall.UTF16PtrFromString(name) | |||
if err != nil { | |||
return | |||
} | |||
return _createFile(_p0, access, mode, sa, createmode, attrs, templatefile) | |||
} | |||
func _createFile(name *uint16, access uint32, mode uint32, sa *syscall.SecurityAttributes, createmode uint32, attrs uint32, templatefile syscall.Handle) (handle syscall.Handle, err error) { | |||
r0, _, e1 := syscall.Syscall9(procCreateFileW.Addr(), 7, uintptr(unsafe.Pointer(name)), uintptr(access), uintptr(mode), uintptr(unsafe.Pointer(sa)), uintptr(createmode), uintptr(attrs), uintptr(templatefile), 0, 0) | |||
handle = syscall.Handle(r0) | |||
if handle == syscall.InvalidHandle { | |||
if e1 != 0 { | |||
err = errnoErr(e1) | |||
} else { | |||
err = syscall.EINVAL | |||
} | |||
} | |||
return | |||
} | |||
func getNamedPipeInfo(pipe syscall.Handle, flags *uint32, outSize *uint32, inSize *uint32, maxInstances *uint32) (err error) { | |||
r1, _, e1 := syscall.Syscall6(procGetNamedPipeInfo.Addr(), 5, uintptr(pipe), uintptr(unsafe.Pointer(flags)), uintptr(unsafe.Pointer(outSize)), uintptr(unsafe.Pointer(inSize)), uintptr(unsafe.Pointer(maxInstances)), 0) | |||
if r1 == 0 { | |||
if e1 != 0 { | |||
err = errnoErr(e1) | |||
} else { | |||
err = syscall.EINVAL | |||
} | |||
} | |||
return | |||
} | |||
func getNamedPipeHandleState(pipe syscall.Handle, state *uint32, curInstances *uint32, maxCollectionCount *uint32, collectDataTimeout *uint32, userName *uint16, maxUserNameSize uint32) (err error) { | |||
r1, _, e1 := syscall.Syscall9(procGetNamedPipeHandleStateW.Addr(), 7, uintptr(pipe), uintptr(unsafe.Pointer(state)), uintptr(unsafe.Pointer(curInstances)), uintptr(unsafe.Pointer(maxCollectionCount)), uintptr(unsafe.Pointer(collectDataTimeout)), uintptr(unsafe.Pointer(userName)), uintptr(maxUserNameSize), 0, 0) | |||
if r1 == 0 { | |||
if e1 != 0 { | |||
err = errnoErr(e1) | |||
} else { | |||
err = syscall.EINVAL | |||
} | |||
} | |||
return | |||
} | |||
func localAlloc(uFlags uint32, length uint32) (ptr uintptr) { | |||
r0, _, _ := syscall.Syscall(procLocalAlloc.Addr(), 2, uintptr(uFlags), uintptr(length), 0) | |||
ptr = uintptr(r0) | |||
return | |||
} | |||
func ntCreateNamedPipeFile(pipe *syscall.Handle, access uint32, oa *objectAttributes, iosb *ioStatusBlock, share uint32, disposition uint32, options uint32, typ uint32, readMode uint32, completionMode uint32, maxInstances uint32, inboundQuota uint32, outputQuota uint32, timeout *int64) (status ntstatus) { | |||
r0, _, _ := syscall.Syscall15(procNtCreateNamedPipeFile.Addr(), 14, uintptr(unsafe.Pointer(pipe)), uintptr(access), uintptr(unsafe.Pointer(oa)), uintptr(unsafe.Pointer(iosb)), uintptr(share), uintptr(disposition), uintptr(options), uintptr(typ), uintptr(readMode), uintptr(completionMode), uintptr(maxInstances), uintptr(inboundQuota), uintptr(outputQuota), uintptr(unsafe.Pointer(timeout)), 0) | |||
status = ntstatus(r0) | |||
return | |||
} | |||
func rtlNtStatusToDosError(status ntstatus) (winerr error) { | |||
r0, _, _ := syscall.Syscall(procRtlNtStatusToDosErrorNoTeb.Addr(), 1, uintptr(status), 0, 0) | |||
if r0 != 0 { | |||
winerr = syscall.Errno(r0) | |||
} | |||
return | |||
} | |||
func rtlDosPathNameToNtPathName(name *uint16, ntName *unicodeString, filePart uintptr, reserved uintptr) (status ntstatus) { | |||
r0, _, _ := syscall.Syscall6(procRtlDosPathNameToNtPathName_U.Addr(), 4, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(ntName)), uintptr(filePart), uintptr(reserved), 0, 0) | |||
status = ntstatus(r0) | |||
return | |||
} | |||
func rtlDefaultNpAcl(dacl *uintptr) (status ntstatus) { | |||
r0, _, _ := syscall.Syscall(procRtlDefaultNpAcl.Addr(), 1, uintptr(unsafe.Pointer(dacl)), 0, 0) | |||
status = ntstatus(r0) | |||
return | |||
} | |||
func lookupAccountName(systemName *uint16, accountName string, sid *byte, sidSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) { | |||
var _p0 *uint16 | |||
_p0, err = syscall.UTF16PtrFromString(accountName) | |||
if err != nil { | |||
return | |||
} | |||
return _lookupAccountName(systemName, _p0, sid, sidSize, refDomain, refDomainSize, sidNameUse) | |||
} | |||
func _lookupAccountName(systemName *uint16, accountName *uint16, sid *byte, sidSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) { | |||
r1, _, e1 := syscall.Syscall9(procLookupAccountNameW.Addr(), 7, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(accountName)), uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(sidSize)), uintptr(unsafe.Pointer(refDomain)), uintptr(unsafe.Pointer(refDomainSize)), uintptr(unsafe.Pointer(sidNameUse)), 0, 0) | |||
if r1 == 0 { | |||
if e1 != 0 { | |||
err = errnoErr(e1) | |||
} else { | |||
err = syscall.EINVAL | |||
} | |||
} | |||
return | |||
} | |||
func convertSidToStringSid(sid *byte, str **uint16) (err error) { | |||
r1, _, e1 := syscall.Syscall(procConvertSidToStringSidW.Addr(), 2, uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(str)), 0) | |||
if r1 == 0 { | |||
if e1 != 0 { | |||
err = errnoErr(e1) | |||
} else { | |||
err = syscall.EINVAL | |||
} | |||
} | |||
return | |||
} | |||
func convertStringSecurityDescriptorToSecurityDescriptor(str string, revision uint32, sd *uintptr, size *uint32) (err error) { | |||
var _p0 *uint16 | |||
_p0, err = syscall.UTF16PtrFromString(str) | |||
if err != nil { | |||
return | |||
} | |||
return _convertStringSecurityDescriptorToSecurityDescriptor(_p0, revision, sd, size) | |||
} | |||
func _convertStringSecurityDescriptorToSecurityDescriptor(str *uint16, revision uint32, sd *uintptr, size *uint32) (err error) { | |||
r1, _, e1 := syscall.Syscall6(procConvertStringSecurityDescriptorToSecurityDescriptorW.Addr(), 4, uintptr(unsafe.Pointer(str)), uintptr(revision), uintptr(unsafe.Pointer(sd)), uintptr(unsafe.Pointer(size)), 0, 0) | |||
if r1 == 0 { | |||
if e1 != 0 { | |||
err = errnoErr(e1) | |||
} else { | |||
err = syscall.EINVAL | |||
} | |||
} | |||
return | |||
} | |||
func convertSecurityDescriptorToStringSecurityDescriptor(sd *byte, revision uint32, secInfo uint32, sddl **uint16, sddlSize *uint32) (err error) { | |||
r1, _, e1 := syscall.Syscall6(procConvertSecurityDescriptorToStringSecurityDescriptorW.Addr(), 5, uintptr(unsafe.Pointer(sd)), uintptr(revision), uintptr(secInfo), uintptr(unsafe.Pointer(sddl)), uintptr(unsafe.Pointer(sddlSize)), 0) | |||
if r1 == 0 { | |||
if e1 != 0 { | |||
err = errnoErr(e1) | |||
} else { | |||
err = syscall.EINVAL | |||
} | |||
} | |||
return | |||
} | |||
func localFree(mem uintptr) { | |||
syscall.Syscall(procLocalFree.Addr(), 1, uintptr(mem), 0, 0) | |||
return | |||
} | |||
func getSecurityDescriptorLength(sd uintptr) (len uint32) { | |||
r0, _, _ := syscall.Syscall(procGetSecurityDescriptorLength.Addr(), 1, uintptr(sd), 0, 0) | |||
len = uint32(r0) | |||
return | |||
} | |||
func getFileInformationByHandleEx(h syscall.Handle, class uint32, buffer *byte, size uint32) (err error) { | |||
r1, _, e1 := syscall.Syscall6(procGetFileInformationByHandleEx.Addr(), 4, uintptr(h), uintptr(class), uintptr(unsafe.Pointer(buffer)), uintptr(size), 0, 0) | |||
if r1 == 0 { | |||
if e1 != 0 { | |||
err = errnoErr(e1) | |||
} else { | |||
err = syscall.EINVAL | |||
} | |||
} | |||
return | |||
} | |||
func setFileInformationByHandle(h syscall.Handle, class uint32, buffer *byte, size uint32) (err error) { | |||
r1, _, e1 := syscall.Syscall6(procSetFileInformationByHandle.Addr(), 4, uintptr(h), uintptr(class), uintptr(unsafe.Pointer(buffer)), uintptr(size), 0, 0) | |||
if r1 == 0 { | |||
if e1 != 0 { | |||
err = errnoErr(e1) | |||
} else { | |||
err = syscall.EINVAL | |||
} | |||
} | |||
return | |||
} | |||
func adjustTokenPrivileges(token windows.Token, releaseAll bool, input *byte, outputSize uint32, output *byte, requiredSize *uint32) (success bool, err error) { | |||
var _p0 uint32 | |||
if releaseAll { | |||
_p0 = 1 | |||
} else { | |||
_p0 = 0 | |||
} | |||
r0, _, e1 := syscall.Syscall6(procAdjustTokenPrivileges.Addr(), 6, uintptr(token), uintptr(_p0), uintptr(unsafe.Pointer(input)), uintptr(outputSize), uintptr(unsafe.Pointer(output)), uintptr(unsafe.Pointer(requiredSize))) | |||
success = r0 != 0 | |||
if true { | |||
if e1 != 0 { | |||
err = errnoErr(e1) | |||
} else { | |||
err = syscall.EINVAL | |||
} | |||
} | |||
return | |||
} | |||
func impersonateSelf(level uint32) (err error) { | |||
r1, _, e1 := syscall.Syscall(procImpersonateSelf.Addr(), 1, uintptr(level), 0, 0) | |||
if r1 == 0 { | |||
if e1 != 0 { | |||
err = errnoErr(e1) | |||
} else { | |||
err = syscall.EINVAL | |||
} | |||
} | |||
return | |||
} | |||
func revertToSelf() (err error) { | |||
r1, _, e1 := syscall.Syscall(procRevertToSelf.Addr(), 0, 0, 0, 0) | |||
if r1 == 0 { | |||
if e1 != 0 { | |||
err = errnoErr(e1) | |||
} else { | |||
err = syscall.EINVAL | |||
} | |||
} | |||
return | |||
} | |||
func openThreadToken(thread syscall.Handle, accessMask uint32, openAsSelf bool, token *windows.Token) (err error) { | |||
var _p0 uint32 | |||
if openAsSelf { | |||
_p0 = 1 | |||
} else { | |||
_p0 = 0 | |||
} | |||
r1, _, e1 := syscall.Syscall6(procOpenThreadToken.Addr(), 4, uintptr(thread), uintptr(accessMask), uintptr(_p0), uintptr(unsafe.Pointer(token)), 0, 0) | |||
if r1 == 0 { | |||
if e1 != 0 { | |||
err = errnoErr(e1) | |||
} else { | |||
err = syscall.EINVAL | |||
} | |||
} | |||
return | |||
} | |||
func getCurrentThread() (h syscall.Handle) { | |||
r0, _, _ := syscall.Syscall(procGetCurrentThread.Addr(), 0, 0, 0, 0) | |||
h = syscall.Handle(r0) | |||
return | |||
} | |||
func lookupPrivilegeValue(systemName string, name string, luid *uint64) (err error) { | |||
var _p0 *uint16 | |||
_p0, err = syscall.UTF16PtrFromString(systemName) | |||
if err != nil { | |||
return | |||
} | |||
var _p1 *uint16 | |||
_p1, err = syscall.UTF16PtrFromString(name) | |||
if err != nil { | |||
return | |||
} | |||
return _lookupPrivilegeValue(_p0, _p1, luid) | |||
} | |||
func _lookupPrivilegeValue(systemName *uint16, name *uint16, luid *uint64) (err error) { | |||
r1, _, e1 := syscall.Syscall(procLookupPrivilegeValueW.Addr(), 3, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(luid))) | |||
if r1 == 0 { | |||
if e1 != 0 { | |||
err = errnoErr(e1) | |||
} else { | |||
err = syscall.EINVAL | |||
} | |||
} | |||
return | |||
} | |||
func lookupPrivilegeName(systemName string, luid *uint64, buffer *uint16, size *uint32) (err error) { | |||
var _p0 *uint16 | |||
_p0, err = syscall.UTF16PtrFromString(systemName) | |||
if err != nil { | |||
return | |||
} | |||
return _lookupPrivilegeName(_p0, luid, buffer, size) | |||
} | |||
func _lookupPrivilegeName(systemName *uint16, luid *uint64, buffer *uint16, size *uint32) (err error) { | |||
r1, _, e1 := syscall.Syscall6(procLookupPrivilegeNameW.Addr(), 4, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(luid)), uintptr(unsafe.Pointer(buffer)), uintptr(unsafe.Pointer(size)), 0, 0) | |||
if r1 == 0 { | |||
if e1 != 0 { | |||
err = errnoErr(e1) | |||
} else { | |||
err = syscall.EINVAL | |||
} | |||
} | |||
return | |||
} | |||
func lookupPrivilegeDisplayName(systemName string, name *uint16, buffer *uint16, size *uint32, languageId *uint32) (err error) { | |||
var _p0 *uint16 | |||
_p0, err = syscall.UTF16PtrFromString(systemName) | |||
if err != nil { | |||
return | |||
} | |||
return _lookupPrivilegeDisplayName(_p0, name, buffer, size, languageId) | |||
} | |||
func _lookupPrivilegeDisplayName(systemName *uint16, name *uint16, buffer *uint16, size *uint32, languageId *uint32) (err error) { | |||
r1, _, e1 := syscall.Syscall6(procLookupPrivilegeDisplayNameW.Addr(), 5, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(buffer)), uintptr(unsafe.Pointer(size)), uintptr(unsafe.Pointer(languageId)), 0) | |||
if r1 == 0 { | |||
if e1 != 0 { | |||
err = errnoErr(e1) | |||
} else { | |||
err = syscall.EINVAL | |||
} | |||
} | |||
return | |||
} | |||
func backupRead(h syscall.Handle, b []byte, bytesRead *uint32, abort bool, processSecurity bool, context *uintptr) (err error) { | |||
var _p0 *byte | |||
if len(b) > 0 { | |||
_p0 = &b[0] | |||
} | |||
var _p1 uint32 | |||
if abort { | |||
_p1 = 1 | |||
} else { | |||
_p1 = 0 | |||
} | |||
var _p2 uint32 | |||
if processSecurity { | |||
_p2 = 1 | |||
} else { | |||
_p2 = 0 | |||
} | |||
r1, _, e1 := syscall.Syscall9(procBackupRead.Addr(), 7, uintptr(h), uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(unsafe.Pointer(bytesRead)), uintptr(_p1), uintptr(_p2), uintptr(unsafe.Pointer(context)), 0, 0) | |||
if r1 == 0 { | |||
if e1 != 0 { | |||
err = errnoErr(e1) | |||
} else { | |||
err = syscall.EINVAL | |||
} | |||
} | |||
return | |||
} | |||
func backupWrite(h syscall.Handle, b []byte, bytesWritten *uint32, abort bool, processSecurity bool, context *uintptr) (err error) { | |||
var _p0 *byte | |||
if len(b) > 0 { | |||
_p0 = &b[0] | |||
} | |||
var _p1 uint32 | |||
if abort { | |||
_p1 = 1 | |||
} else { | |||
_p1 = 0 | |||
} | |||
var _p2 uint32 | |||
if processSecurity { | |||
_p2 = 1 | |||
} else { | |||
_p2 = 0 | |||
} | |||
r1, _, e1 := syscall.Syscall9(procBackupWrite.Addr(), 7, uintptr(h), uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(unsafe.Pointer(bytesWritten)), uintptr(_p1), uintptr(_p2), uintptr(unsafe.Pointer(context)), 0, 0) | |||
if r1 == 0 { | |||
if e1 != 0 { | |||
err = errnoErr(e1) | |||
} else { | |||
err = syscall.EINVAL | |||
} | |||
} | |||
return | |||
} | |||
func bind(s syscall.Handle, name unsafe.Pointer, namelen int32) (err error) { | |||
r1, _, e1 := syscall.Syscall(procbind.Addr(), 3, uintptr(s), uintptr(name), uintptr(namelen)) | |||
if r1 == socketError { | |||
if e1 != 0 { | |||
err = errnoErr(e1) | |||
} else { | |||
err = syscall.EINVAL | |||
} | |||
} | |||
return | |||
} |
@@ -6,17 +6,17 @@ require ( | |||
github.com/RoaringBitmap/roaring v0.4.23 | |||
github.com/blevesearch/bleve_index_api v1.0.0 | |||
github.com/blevesearch/go-porterstemmer v1.0.3 | |||
github.com/blevesearch/scorch_segment_api v1.0.0 | |||
github.com/blevesearch/scorch_segment_api/v2 v2.0.1 | |||
github.com/blevesearch/segment v0.9.0 | |||
github.com/blevesearch/snowballstem v0.9.0 | |||
github.com/blevesearch/upsidedown_store_api v1.0.1 | |||
github.com/blevesearch/zapx/v11 v11.1.10 | |||
github.com/blevesearch/zapx/v12 v12.1.10 | |||
github.com/blevesearch/zapx/v13 v13.1.10 | |||
github.com/blevesearch/zapx/v14 v14.1.10 | |||
github.com/blevesearch/zapx/v15 v15.1.10 | |||
github.com/blevesearch/vellum v1.0.3 | |||
github.com/blevesearch/zapx/v11 v11.2.0 | |||
github.com/blevesearch/zapx/v12 v12.2.0 | |||
github.com/blevesearch/zapx/v13 v13.2.0 | |||
github.com/blevesearch/zapx/v14 v14.2.0 | |||
github.com/blevesearch/zapx/v15 v15.2.0 | |||
github.com/couchbase/moss v0.1.0 | |||
github.com/couchbase/vellum v1.0.2 | |||
github.com/golang/protobuf v1.3.2 | |||
github.com/kljensen/snowball v0.6.0 | |||
github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563 |
@@ -8,24 +8,26 @@ github.com/blevesearch/go-porterstemmer v1.0.3 h1:GtmsqID0aZdCSNiY8SkuPJ12pD4jI+ | |||
github.com/blevesearch/go-porterstemmer v1.0.3/go.mod h1:angGc5Ht+k2xhJdZi511LtmxuEf0OVpvUUNrwmM1P7M= | |||
github.com/blevesearch/mmap-go v1.0.2 h1:JtMHb+FgQCTTYIhtMvimw15dJwu1Y5lrZDMOFXVWPk0= | |||
github.com/blevesearch/mmap-go v1.0.2/go.mod h1:ol2qBqYaOUsGdm7aRMRrYGgPvnwLe6Y+7LMvAB5IbSA= | |||
github.com/blevesearch/scorch_segment_api v1.0.0 h1:BUkCPWDg2gimTEyVDXf85I2buqqt4lh28uaVMiJsIYk= | |||
github.com/blevesearch/scorch_segment_api v1.0.0/go.mod h1:KgRYmlfYC27NeM6cXOHx8LBgq7jn0atpV8mVWoBKBng= | |||
github.com/blevesearch/scorch_segment_api/v2 v2.0.1 h1:fd+hPtZ8GsbqPK1HslGp7Vhoik4arZteA/IsCEgOisw= | |||
github.com/blevesearch/scorch_segment_api/v2 v2.0.1/go.mod h1:lq7yK2jQy1yQjtjTfU931aVqz7pYxEudHaDwOt1tXfU= | |||
github.com/blevesearch/segment v0.9.0 h1:5lG7yBCx98or7gK2cHMKPukPZ/31Kag7nONpoBt22Ac= | |||
github.com/blevesearch/segment v0.9.0/go.mod h1:9PfHYUdQCgHktBgvtUOF4x+pc4/l8rdH0u5spnW85UQ= | |||
github.com/blevesearch/snowballstem v0.9.0 h1:lMQ189YspGP6sXvZQ4WZ+MLawfV8wOmPoD/iWeNXm8s= | |||
github.com/blevesearch/snowballstem v0.9.0/go.mod h1:PivSj3JMc8WuaFkTSRDW2SlrulNWPl4ABg1tC/hlgLs= | |||
github.com/blevesearch/upsidedown_store_api v1.0.1 h1:1SYRwyoFLwG3sj0ed89RLtM15amfX2pXlYbFOnF8zNU= | |||
github.com/blevesearch/upsidedown_store_api v1.0.1/go.mod h1:MQDVGpHZrpe3Uy26zJBf/a8h0FZY6xJbthIMm8myH2Q= | |||
github.com/blevesearch/zapx/v11 v11.1.10 h1:8Eo3rXiHsVSP9Sk+4StrrwLrj9vyulhMVPmxTf8ZuDg= | |||
github.com/blevesearch/zapx/v11 v11.1.10/go.mod h1:DTjbcBqrr/Uo82UBilDC8lEew42gN/OcIyiTNFtSijc= | |||
github.com/blevesearch/zapx/v12 v12.1.10 h1:sqR+/0Z4dSTovApRqLA1HnilMtQer7a4UvPrNmPzlTM= | |||
github.com/blevesearch/zapx/v12 v12.1.10/go.mod h1:14NmKnPrnKAIyiEJM566k/Jk+FQpuiflT5d3uaaK3MI= | |||
github.com/blevesearch/zapx/v13 v13.1.10 h1:zCneEVRJDXwtDfSwh+33Dxguliv192vCK283zdGH4Sw= | |||
github.com/blevesearch/zapx/v13 v13.1.10/go.mod h1:YsVY6YGpTEAlJOMjdL7EsdBLvjWd8kPa2gwJDNpqLJo= | |||
github.com/blevesearch/zapx/v14 v14.1.10 h1:nD0vw2jxKogJFfA5WyoS4wNwZlVby3Aq8aW7CZi6YIw= | |||
github.com/blevesearch/zapx/v14 v14.1.10/go.mod h1:hsULl5eJSxs5NEfBsmeT9qrqdCP+/ecpVZKt60M4V64= | |||
github.com/blevesearch/zapx/v15 v15.1.10 h1:kZR3b9jO9l6s2B5UHI+1N1llLzJ4nYikkXQTMrDl1vQ= | |||
github.com/blevesearch/zapx/v15 v15.1.10/go.mod h1:4ypq25bwtSQKzwEF1UERyIhmGTbMT3brY/n4NC5gRnM= | |||
github.com/blevesearch/vellum v1.0.3 h1:U86G41A7CtXNzzpIJHM8lSTUqz1Mp8U870TkcdCzZc8= | |||
github.com/blevesearch/vellum v1.0.3/go.mod h1:2u5ax02KeDuNWu4/C+hVQMD6uLN4txH1JbtpaDNLJRo= | |||
github.com/blevesearch/zapx/v11 v11.2.0 h1:GBkCJYsyj3eIU4+aiLPxoMz1PYvDbQZl/oXHIBZIP60= | |||
github.com/blevesearch/zapx/v11 v11.2.0/go.mod h1:gN/a0alGw1FZt/YGTo1G6Z6XpDkeOfujX5exY9sCQQM= | |||
github.com/blevesearch/zapx/v12 v12.2.0 h1:dyRcSoZVO1jktL4UpGkCEF1AYa3xhKPirh4/N+Va+Ww= | |||
github.com/blevesearch/zapx/v12 v12.2.0/go.mod h1:fdjwvCwWWwJW/EYTYGtAp3gBA0geCYGLcVTtJEZnY6A= | |||
github.com/blevesearch/zapx/v13 v13.2.0 h1:mUqbaqQABp8nBE4t4q2qMyHCCq4sykoV8r7aJk4ih3s= | |||
github.com/blevesearch/zapx/v13 v13.2.0/go.mod h1:o5rAy/lRS5JpAbITdrOHBS/TugWYbkcYZTz6VfEinAQ= | |||
github.com/blevesearch/zapx/v14 v14.2.0 h1:UsfRqvM9RJxKNKrkR1U7aYc1cv9MWx719fsAjbF6joI= | |||
github.com/blevesearch/zapx/v14 v14.2.0/go.mod h1:GNgZusc1p4ot040cBQMRGEZobvwjCquiEKYh1xLFK9g= | |||
github.com/blevesearch/zapx/v15 v15.2.0 h1:ZpibwcrrOaeslkOw3sJ7npP7KDgRHI/DkACjKTqFwyM= | |||
github.com/blevesearch/zapx/v15 v15.2.0/go.mod h1:MmQceLpWfME4n1WrBFIwplhWmaQbQqLQARpaKUEOs/A= | |||
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= | |||
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= | |||
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= | |||
@@ -33,8 +35,6 @@ github.com/couchbase/ghistogram v0.1.0 h1:b95QcQTCzjTUocDXp/uMgSNQi8oj1tGwnJ4bOD | |||
github.com/couchbase/ghistogram v0.1.0/go.mod h1:s1Jhy76zqfEecpNWJfWUiKZookAFaiGOEoyzgHt9i7k= | |||
github.com/couchbase/moss v0.1.0 h1:HCL+xxHUwmOaL44kMM/gU08OW6QGCui1WVFO58bjhNI= | |||
github.com/couchbase/moss v0.1.0/go.mod h1:9MaHIaRuy9pvLPUJxB8sh8OrLfyDczECVL37grCIubs= | |||
github.com/couchbase/vellum v1.0.2 h1:BrbP0NKiyDdndMPec8Jjhy0U47CZ0Lgx3xUC2r9rZqw= | |||
github.com/couchbase/vellum v1.0.2/go.mod h1:FcwrEivFpNi24R3jLOs3n+fs5RnuQnQqCLBJ1uAg1W4= | |||
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= | |||
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= |
@@ -22,7 +22,7 @@ import ( | |||
"github.com/RoaringBitmap/roaring" | |||
index "github.com/blevesearch/bleve_index_api" | |||
segment "github.com/blevesearch/scorch_segment_api" | |||
segment "github.com/blevesearch/scorch_segment_api/v2" | |||
bolt "go.etcd.io/bbolt" | |||
) | |||
@@ -14,7 +14,7 @@ | |||
package scorch | |||
import segment "github.com/blevesearch/scorch_segment_api" | |||
import segment "github.com/blevesearch/scorch_segment_api/v2" | |||
type emptyPostingsIterator struct{} | |||
@@ -20,7 +20,7 @@ import ( | |||
"github.com/RoaringBitmap/roaring" | |||
index "github.com/blevesearch/bleve_index_api" | |||
segment "github.com/blevesearch/scorch_segment_api" | |||
segment "github.com/blevesearch/scorch_segment_api/v2" | |||
) | |||
type segmentIntroduction struct { |
@@ -25,7 +25,7 @@ import ( | |||
"github.com/RoaringBitmap/roaring" | |||
"github.com/blevesearch/bleve/v2/index/scorch/mergeplan" | |||
segment "github.com/blevesearch/scorch_segment_api" | |||
segment "github.com/blevesearch/scorch_segment_api/v2" | |||
) | |||
func (s *Scorch) mergerLoop() { |
@@ -18,7 +18,7 @@ import ( | |||
"fmt" | |||
"github.com/RoaringBitmap/roaring" | |||
index "github.com/blevesearch/bleve_index_api" | |||
segment "github.com/blevesearch/scorch_segment_api" | |||
segment "github.com/blevesearch/scorch_segment_api/v2" | |||
"sync/atomic" | |||
) | |||
@@ -31,7 +31,7 @@ import ( | |||
"github.com/RoaringBitmap/roaring" | |||
index "github.com/blevesearch/bleve_index_api" | |||
segment "github.com/blevesearch/scorch_segment_api" | |||
segment "github.com/blevesearch/scorch_segment_api/v2" | |||
bolt "go.etcd.io/bbolt" | |||
) | |||
@@ -17,7 +17,7 @@ package scorch | |||
import ( | |||
"regexp/syntax" | |||
"github.com/couchbase/vellum/regexp" | |||
"github.com/blevesearch/vellum/regexp" | |||
) | |||
func parseRegexp(pattern string) (a *regexp.Regexp, prefixBeg, prefixEnd []byte, err error) { |
@@ -26,7 +26,7 @@ import ( | |||
"github.com/RoaringBitmap/roaring" | |||
"github.com/blevesearch/bleve/v2/registry" | |||
index "github.com/blevesearch/bleve_index_api" | |||
segment "github.com/blevesearch/scorch_segment_api" | |||
segment "github.com/blevesearch/scorch_segment_api/v2" | |||
bolt "go.etcd.io/bbolt" | |||
) | |||
@@ -199,11 +199,9 @@ func (s *Scorch) openBolt() error { | |||
s.unsafeBatch = true | |||
} | |||
var rootBoltOpt *bolt.Options | |||
var rootBoltOpt = *bolt.DefaultOptions | |||
if s.readOnly { | |||
rootBoltOpt = &bolt.Options{ | |||
ReadOnly: true, | |||
} | |||
rootBoltOpt.ReadOnly = true | |||
} else { | |||
if s.path != "" { | |||
err := os.MkdirAll(s.path, 0700) | |||
@@ -213,10 +211,19 @@ func (s *Scorch) openBolt() error { | |||
} | |||
} | |||
if boltTimeoutStr, ok := s.config["bolt_timeout"].(string); ok { | |||
var err error | |||
boltTimeout, err := time.ParseDuration(boltTimeoutStr) | |||
if err != nil { | |||
return fmt.Errorf("invalid duration specified for bolt_timeout: %v", err) | |||
} | |||
rootBoltOpt.Timeout = boltTimeout | |||
} | |||
rootBoltPath := s.path + string(os.PathSeparator) + "root.bolt" | |||
var err error | |||
if s.path != "" { | |||
s.rootBolt, err = bolt.Open(rootBoltPath, 0600, rootBoltOpt) | |||
s.rootBolt, err = bolt.Open(rootBoltPath, 0600, &rootBoltOpt) | |||
if err != nil { | |||
return err | |||
} |
@@ -19,7 +19,7 @@ import ( | |||
"github.com/RoaringBitmap/roaring" | |||
index "github.com/blevesearch/bleve_index_api" | |||
segment "github.com/blevesearch/scorch_segment_api" | |||
segment "github.com/blevesearch/scorch_segment_api/v2" | |||
zapv11 "github.com/blevesearch/zapx/v11" | |||
zapv12 "github.com/blevesearch/zapx/v12" |
@@ -26,9 +26,9 @@ import ( | |||
"github.com/RoaringBitmap/roaring" | |||
"github.com/blevesearch/bleve/v2/document" | |||
index "github.com/blevesearch/bleve_index_api" | |||
segment "github.com/blevesearch/scorch_segment_api" | |||
"github.com/couchbase/vellum" | |||
lev "github.com/couchbase/vellum/levenshtein" | |||
segment "github.com/blevesearch/scorch_segment_api/v2" | |||
"github.com/blevesearch/vellum" | |||
lev "github.com/blevesearch/vellum/levenshtein" | |||
) | |||
// re usable, threadsafe levenshtein builders |
@@ -18,7 +18,7 @@ import ( | |||
"container/heap" | |||
index "github.com/blevesearch/bleve_index_api" | |||
segment "github.com/blevesearch/scorch_segment_api" | |||
segment "github.com/blevesearch/scorch_segment_api/v2" | |||
) | |||
type segmentDictCursor struct { |
@@ -22,7 +22,7 @@ import ( | |||
"github.com/blevesearch/bleve/v2/size" | |||
index "github.com/blevesearch/bleve_index_api" | |||
segment "github.com/blevesearch/scorch_segment_api" | |||
segment "github.com/blevesearch/scorch_segment_api/v2" | |||
) | |||
var reflectStaticSizeIndexSnapshotTermFieldReader int |
@@ -22,7 +22,7 @@ import ( | |||
"github.com/RoaringBitmap/roaring" | |||
"github.com/blevesearch/bleve/v2/size" | |||
index "github.com/blevesearch/bleve_index_api" | |||
segment "github.com/blevesearch/scorch_segment_api" | |||
segment "github.com/blevesearch/scorch_segment_api/v2" | |||
) | |||
var TermSeparator byte = 0xff |
@@ -16,7 +16,7 @@ package scorch | |||
import ( | |||
"github.com/RoaringBitmap/roaring" | |||
segment "github.com/blevesearch/scorch_segment_api" | |||
segment "github.com/blevesearch/scorch_segment_api/v2" | |||
"math" | |||
"reflect" | |||
) |
@@ -600,12 +600,14 @@ func MemoryNeededForSearchResult(req *SearchRequest) uint64 { | |||
estimate += len(req.Facets) * fr.Size() | |||
} | |||
// highlighting, store | |||
// overhead from fields, highlighting | |||
var d document.Document | |||
if len(req.Fields) > 0 || req.Highlight != nil { | |||
for i := 0; i < (req.Size + req.From); i++ { | |||
estimate += (req.Size + req.From) * d.Size() | |||
numDocsApplicable := req.Size | |||
if numDocsApplicable > collector.PreAllocSizeSkipCap { | |||
numDocsApplicable = collector.PreAllocSizeSkipCap | |||
} | |||
estimate += numDocsApplicable * d.Size() | |||
} | |||
return uint64(estimate) |
@@ -0,0 +1,36 @@ | |||
// Copyright (c) 2021 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 segment | |||
// Automaton represents the general contract of a byte-based finite automaton | |||
type Automaton interface { | |||
// Start returns the start state | |||
Start() int | |||
// IsMatch returns true if and only if the state is a match | |||
IsMatch(int) bool | |||
// CanMatch returns true if and only if it is possible to reach a match | |||
// in zero or more steps | |||
CanMatch(int) bool | |||
// WillAlwaysMatch returns true if and only if the current state matches | |||
// and will always match no matter what steps are taken | |||
WillAlwaysMatch(int) bool | |||
// Accept returns the next state given the input to the specified state | |||
Accept(int, byte) int | |||
} |
@@ -1,10 +1,10 @@ | |||
module github.com/blevesearch/scorch_segment_api | |||
module github.com/blevesearch/scorch_segment_api/v2 | |||
go 1.13 | |||
require ( | |||
github.com/RoaringBitmap/roaring v0.4.23 | |||
github.com/blevesearch/bleve_index_api v1.0.0 | |||
github.com/couchbase/vellum v1.0.2 | |||
github.com/davecgh/go-spew v1.1.1 // indirect | |||
github.com/mschoch/smat v0.2.0 // indirect | |||
) |
@@ -1,21 +1,10 @@ | |||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= | |||
github.com/RoaringBitmap/roaring v0.4.23 h1:gpyfd12QohbqhFO4NVDUdoPOCXsyahYRQhINmlHxKeo= | |||
github.com/RoaringBitmap/roaring v0.4.23/go.mod h1:D0gp8kJQgE1A4LQ5wFLggQEyvDi06Mq5mKs52e1TwOo= | |||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= | |||
github.com/blevesearch/bleve_index_api v1.0.0 h1:Ds3XeuTxjXCkG6pgIwWDRyooJKNIuOKemnN0N0IkhTU= | |||
github.com/blevesearch/bleve_index_api v1.0.0/go.mod h1:fiwKS0xLEm+gBRgv5mumf0dhgFr2mDgZah1pqv1c1M4= | |||
github.com/blevesearch/mmap-go v1.0.2 h1:JtMHb+FgQCTTYIhtMvimw15dJwu1Y5lrZDMOFXVWPk0= | |||
github.com/blevesearch/mmap-go v1.0.2/go.mod h1:ol2qBqYaOUsGdm7aRMRrYGgPvnwLe6Y+7LMvAB5IbSA= | |||
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= | |||
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= | |||
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= | |||
github.com/couchbase/vellum v1.0.2 h1:BrbP0NKiyDdndMPec8Jjhy0U47CZ0Lgx3xUC2r9rZqw= | |||
github.com/couchbase/vellum v1.0.2/go.mod h1:FcwrEivFpNi24R3jLOs3n+fs5RnuQnQqCLBJ1uAg1W4= | |||
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= | |||
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/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | |||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= | |||
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-20190410193231-58a59202ab31 h1:gclg6gY70GLy3PbkQ1AERPfmLMMagS60DKF78eWwLn8= | |||
@@ -24,44 +13,22 @@ 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-20190910122728-9d188e94fb99 h1:twflg0XRTjwKpxb/jFExr4HGq6on2dEOmnL6FV+fgPw= | |||
github.com/gopherjs/gopherjs v0.0.0-20190910122728-9d188e94fb99/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= | |||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= | |||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= | |||
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/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= | |||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= | |||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= | |||
github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= | |||
github.com/mschoch/smat v0.2.0 h1:8imxQsjDm8yFEAVBe7azKmKSgzSkZXDuKkSq9374khM= | |||
github.com/mschoch/smat v0.2.0/go.mod h1:kc9mz7DoBKqDyiRL7VZN8KvXQMWeTaVnttLRXOlotKw= | |||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= | |||
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/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= | |||
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= | |||
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= | |||
github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= | |||
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= | |||
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= | |||
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= | |||
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.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= | |||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= | |||
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/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= | |||
github.com/willf/bitset v1.1.10 h1:NotGKqX0KwQ72NUzqrjZq5ipPNDQex9lo3WpaS8L2sc= | |||
github.com/willf/bitset v1.1.10/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= | |||
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= | |||
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | |||
golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | |||
golang.org/x/sys v0.0.0-20181221143128-b4a75ba826a6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | |||
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a h1:aYOabOQFp6Vj6W1F80affTUvO9UxmJRx8K0gsfABByQ= | |||
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
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/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | |||
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= |
@@ -19,7 +19,6 @@ import ( | |||
"github.com/RoaringBitmap/roaring" | |||
index "github.com/blevesearch/bleve_index_api" | |||
"github.com/couchbase/vellum" | |||
) | |||
var ErrClosed = fmt.Errorf("index closed") | |||
@@ -63,7 +62,7 @@ type PersistedSegment interface { | |||
type TermDictionary interface { | |||
PostingsList(term []byte, except *roaring.Bitmap, prealloc PostingsList) (PostingsList, error) | |||
AutomatonIterator(a vellum.Automaton, | |||
AutomatonIterator(a Automaton, | |||
startKeyInclusive, endKeyExclusive []byte) DictionaryIterator | |||
Contains(key []byte) (bool, error) |
@@ -1,4 +1,4 @@ | |||
module github.com/couchbase/vellum | |||
module github.com/blevesearch/vellum | |||
go 1.12 | |||
@@ -20,7 +20,7 @@ import ( | |||
unicode_utf8 "unicode/utf8" | |||
"github.com/couchbase/vellum/utf8" | |||
"github.com/blevesearch/vellum/utf8" | |||
) | |||
type compiler struct { |
@@ -19,7 +19,7 @@ import ( | |||
"math" | |||
"os" | |||
"github.com/couchbase/vellum" | |||
"github.com/blevesearch/vellum" | |||
) | |||
const Version uint32 = 11 |
@@ -18,7 +18,7 @@ import ( | |||
"hash/crc32" | |||
"io" | |||
segment "github.com/blevesearch/scorch_segment_api" | |||
segment "github.com/blevesearch/scorch_segment_api/v2" | |||
) | |||
// CountHashWriter is a wrapper around a Writer which counts the number of |
@@ -19,8 +19,8 @@ import ( | |||
"github.com/RoaringBitmap/roaring" | |||
index "github.com/blevesearch/bleve_index_api" | |||
segment "github.com/blevesearch/scorch_segment_api" | |||
"github.com/couchbase/vellum" | |||
segment "github.com/blevesearch/scorch_segment_api/v2" | |||
"github.com/blevesearch/vellum" | |||
) | |||
// Dictionary is the zap representation of the term dictionary | |||
@@ -106,7 +106,7 @@ func (d *Dictionary) Contains(key []byte) (bool, error) { | |||
// AutomatonIterator returns an iterator which only visits terms | |||
// having the the vellum automaton and start/end key range | |||
func (d *Dictionary) AutomatonIterator(a vellum.Automaton, | |||
func (d *Dictionary) AutomatonIterator(a segment.Automaton, | |||
startKeyInclusive, endKeyExclusive []byte) segment.DictionaryIterator { | |||
if d.fst != nil { | |||
rv := &DictionaryIterator{ |
@@ -23,7 +23,7 @@ import ( | |||
"sort" | |||
index "github.com/blevesearch/bleve_index_api" | |||
segment "github.com/blevesearch/scorch_segment_api" | |||
segment "github.com/blevesearch/scorch_segment_api/v2" | |||
"github.com/golang/snappy" | |||
) | |||
@@ -17,7 +17,7 @@ package zap | |||
import ( | |||
"bytes" | |||
"github.com/couchbase/vellum" | |||
"github.com/blevesearch/vellum" | |||
) | |||
// enumerator provides an ordered traversal of multiple vellum |
@@ -6,8 +6,8 @@ require ( | |||
github.com/RoaringBitmap/roaring v0.4.23 | |||
github.com/blevesearch/bleve_index_api v1.0.0 | |||
github.com/blevesearch/mmap-go v1.0.2 | |||
github.com/blevesearch/scorch_segment_api v1.0.0 | |||
github.com/couchbase/vellum v1.0.2 | |||
github.com/blevesearch/scorch_segment_api/v2 v2.0.1 | |||
github.com/blevesearch/vellum v1.0.3 | |||
github.com/golang/snappy v0.0.1 | |||
github.com/spf13/cobra v0.0.5 | |||
) |
@@ -6,13 +6,13 @@ github.com/blevesearch/bleve_index_api v1.0.0 h1:Ds3XeuTxjXCkG6pgIwWDRyooJKNIuOK | |||
github.com/blevesearch/bleve_index_api v1.0.0/go.mod h1:fiwKS0xLEm+gBRgv5mumf0dhgFr2mDgZah1pqv1c1M4= | |||
github.com/blevesearch/mmap-go v1.0.2 h1:JtMHb+FgQCTTYIhtMvimw15dJwu1Y5lrZDMOFXVWPk0= | |||
github.com/blevesearch/mmap-go v1.0.2/go.mod h1:ol2qBqYaOUsGdm7aRMRrYGgPvnwLe6Y+7LMvAB5IbSA= | |||
github.com/blevesearch/scorch_segment_api v1.0.0 h1:BUkCPWDg2gimTEyVDXf85I2buqqt4lh28uaVMiJsIYk= | |||
github.com/blevesearch/scorch_segment_api v1.0.0/go.mod h1:KgRYmlfYC27NeM6cXOHx8LBgq7jn0atpV8mVWoBKBng= | |||
github.com/blevesearch/scorch_segment_api/v2 v2.0.1 h1:fd+hPtZ8GsbqPK1HslGp7Vhoik4arZteA/IsCEgOisw= | |||
github.com/blevesearch/scorch_segment_api/v2 v2.0.1/go.mod h1:lq7yK2jQy1yQjtjTfU931aVqz7pYxEudHaDwOt1tXfU= | |||
github.com/blevesearch/vellum v1.0.3 h1:U86G41A7CtXNzzpIJHM8lSTUqz1Mp8U870TkcdCzZc8= | |||
github.com/blevesearch/vellum v1.0.3/go.mod h1:2u5ax02KeDuNWu4/C+hVQMD6uLN4txH1JbtpaDNLJRo= | |||
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= | |||
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= | |||
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= | |||
github.com/couchbase/vellum v1.0.2 h1:BrbP0NKiyDdndMPec8Jjhy0U47CZ0Lgx3xUC2r9rZqw= | |||
github.com/couchbase/vellum v1.0.2/go.mod h1:FcwrEivFpNi24R3jLOs3n+fs5RnuQnQqCLBJ1uAg1W4= | |||
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= | |||
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= |
@@ -24,8 +24,8 @@ import ( | |||
"sort" | |||
"github.com/RoaringBitmap/roaring" | |||
seg "github.com/blevesearch/scorch_segment_api" | |||
"github.com/couchbase/vellum" | |||
seg "github.com/blevesearch/scorch_segment_api/v2" | |||
"github.com/blevesearch/vellum" | |||
"github.com/golang/snappy" | |||
) | |||
@@ -23,8 +23,8 @@ import ( | |||
"github.com/RoaringBitmap/roaring" | |||
index "github.com/blevesearch/bleve_index_api" | |||
segment "github.com/blevesearch/scorch_segment_api" | |||
"github.com/couchbase/vellum" | |||
segment "github.com/blevesearch/scorch_segment_api/v2" | |||
"github.com/blevesearch/vellum" | |||
"github.com/golang/snappy" | |||
) | |||
@@ -21,7 +21,7 @@ import ( | |||
"reflect" | |||
"github.com/RoaringBitmap/roaring" | |||
segment "github.com/blevesearch/scorch_segment_api" | |||
segment "github.com/blevesearch/scorch_segment_api/v2" | |||
) | |||
var reflectStaticSizePostingsList int |
@@ -25,8 +25,8 @@ import ( | |||
"github.com/RoaringBitmap/roaring" | |||
mmap "github.com/blevesearch/mmap-go" | |||
segment "github.com/blevesearch/scorch_segment_api" | |||
"github.com/couchbase/vellum" | |||
segment "github.com/blevesearch/scorch_segment_api/v2" | |||
"github.com/blevesearch/vellum" | |||
"github.com/golang/snappy" | |||
) | |||
@@ -19,7 +19,7 @@ import ( | |||
"math" | |||
"os" | |||
"github.com/couchbase/vellum" | |||
"github.com/blevesearch/vellum" | |||
) | |||
const Version uint32 = 12 |
@@ -18,7 +18,7 @@ import ( | |||
"hash/crc32" | |||
"io" | |||
segment "github.com/blevesearch/scorch_segment_api" | |||
segment "github.com/blevesearch/scorch_segment_api/v2" | |||
) | |||
// CountHashWriter is a wrapper around a Writer which counts the number of |
@@ -19,8 +19,8 @@ import ( | |||
"github.com/RoaringBitmap/roaring" | |||
index "github.com/blevesearch/bleve_index_api" | |||
segment "github.com/blevesearch/scorch_segment_api" | |||
"github.com/couchbase/vellum" | |||
segment "github.com/blevesearch/scorch_segment_api/v2" | |||
"github.com/blevesearch/vellum" | |||
) | |||
// Dictionary is the zap representation of the term dictionary | |||
@@ -106,7 +106,7 @@ func (d *Dictionary) Contains(key []byte) (bool, error) { | |||
// AutomatonIterator returns an iterator which only visits terms | |||
// having the the vellum automaton and start/end key range | |||
func (d *Dictionary) AutomatonIterator(a vellum.Automaton, | |||
func (d *Dictionary) AutomatonIterator(a segment.Automaton, | |||
startKeyInclusive, endKeyExclusive []byte) segment.DictionaryIterator { | |||
if d.fst != nil { | |||
rv := &DictionaryIterator{ |
@@ -23,7 +23,7 @@ import ( | |||
"sort" | |||
index "github.com/blevesearch/bleve_index_api" | |||
segment "github.com/blevesearch/scorch_segment_api" | |||
segment "github.com/blevesearch/scorch_segment_api/v2" | |||
"github.com/golang/snappy" | |||
) | |||
@@ -17,7 +17,7 @@ package zap | |||
import ( | |||
"bytes" | |||
"github.com/couchbase/vellum" | |||
"github.com/blevesearch/vellum" | |||
) | |||
// enumerator provides an ordered traversal of multiple vellum |
@@ -6,8 +6,8 @@ require ( | |||
github.com/RoaringBitmap/roaring v0.4.23 | |||
github.com/blevesearch/bleve_index_api v1.0.0 | |||
github.com/blevesearch/mmap-go v1.0.2 | |||
github.com/blevesearch/scorch_segment_api v1.0.0 | |||
github.com/couchbase/vellum v1.0.2 | |||
github.com/blevesearch/scorch_segment_api/v2 v2.0.1 | |||
github.com/blevesearch/vellum v1.0.3 | |||
github.com/golang/snappy v0.0.1 | |||
github.com/spf13/cobra v0.0.5 | |||
) |